00 Linux yazılım RAID — md driver mimarisi
Linux Multi-Device (md) driver, yazılım RAID'i kernel seviyesinde uygular. Donanım RAID kontrolörü gerektirmez; modern CPU'larda performans farkı ihmal edilebilir düzeydedir.
Uygulamalar (dosya sistemi: ext4, xfs, btrfs)
│
▼
/dev/md0, /dev/md1 ... (md sanal blok cihazları)
│
▼ md driver (kernel)
┌──────────────────────────────────────────────┐
│ RAID Level: 0/1/4/5/6/10 │
│ Stripe size, chunk size, write-intent bitmap │
│ Sync thread, reshape, integrity check │
└──────────────────────────────────────────────┘
│
▼
/dev/sda /dev/sdb /dev/nvme0n1 ... (üye diskler)
01 RAID1 — ayna kurulumu (mdadm)
RAID1, kritik veri depolama için en güvenli seçenektir. Gömülü sistemlerde sistem diskinin ayna kopyası olarak yaygın kullanılır.
## Diskler: /dev/sda ve /dev/sdb
## 1. GPT bölüm oluştur (her disk için)
for disk in /dev/sda /dev/sdb; do
parted -s "$disk" mklabel gpt
parted -s "$disk" mkpart primary 1MiB 100%
parted -s "$disk" set 1 raid on
done
## 2. RAID1 dizisi oluştur
mdadm --create /dev/md0 \
--level=1 \
--raid-devices=2 \
/dev/sda1 /dev/sdb1
## Oluşturma onayı
# mdadm: Defaulting to version 1.2 metadata
# mdadm: array /dev/md0 started.
## 3. Dosya sistemi oluştur
mkfs.ext4 -F /dev/md0
mkdir -p /mnt/raid1
mount /dev/md0 /mnt/raid1
## 4. mdadm.conf güncelle (sistem yeniden başlatmada gerekli)
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
update-initramfs -u # Ubuntu/Debian
## 5. fstab kaydı
UUID=$(blkid -s UUID -o value /dev/md0)
echo "UUID=$UUID /mnt/raid1 ext4 defaults,nofail 0 2" >> /etc/fstab
RAID1 durumu kontrol
## Detaylı durum
mdadm --detail /dev/md0
# /dev/md0:
# Version : 1.2
# Creation Time : Mon Jan 1 10:00:00 2026
# Raid Level : raid1
# Array Size : 976768000 (931.49 GiB)
# Used Dev Size : 976768000 (931.49 GiB)
# Raid Devices : 2
# Total Devices : 2
# Persistence : Superblock is persistent
# State : clean
# Active Devices : 2
# Working Devices : 2
# Failed Devices : 0
# Spare Devices : 0
## Kısa özet
cat /proc/mdstat
# Personalities : [raid1]
# md0 : active raid1 sdb1[1] sda1[0]
# 976768000 blocks super 1.2 [2/2] [UU]
02 RAID5 — eşlik tabanlı şerit kurulumu
RAID5, yedeklilik ile kapasite verimliliğini dengeler. En az 3 disk gerektirir; N diskle (N-1) disk kapasitesi kazanılır. Gömülü NAS ve arşiv depolama için uygundur.
## Diskler: /dev/sdb, /dev/sdc, /dev/sdd
for disk in /dev/sdb /dev/sdc /dev/sdd; do
parted -s "$disk" mklabel gpt
parted -s "$disk" mkpart primary 1MiB 100%
parted -s "$disk" set 1 raid on
done
## RAID5 oluştur — chunk size 512 KB
mdadm --create /dev/md1 \
--level=5 \
--raid-devices=3 \
--chunk=512 \
/dev/sdb1 /dev/sdc1 /dev/sdd1
## Senkronizasyon ilerlemesini izle
watch -n2 cat /proc/mdstat
# md1 : active raid5 sdd1[2] sdc1[1] sdb1[0]
# 1953536000 blocks super 1.2 level 5, 512k chunk
# [3/3] [UUU]
# [=====>...............] resync = 25.5% finish=7.2min
## RAID5 stripe cache ve read-ahead
echo 4096 > /sys/block/md1/md/stripe_cache_size # 4096 şerit cache
blockdev --setra 65536 /dev/md1 # 32 MB read-ahead
## XFS dosya sistemi (RAID5 ile performanslı)
mkfs.xfs -f -d su=512k,sw=2 /dev/md1
# su = stripe unit (chunk size), sw = stripe width (N-1)
RAID5 write hole sorunu
## Yazma niyeti bitmap'i ekle (UPS olmayan sistemlerde kritik)
mdadm --grow /dev/md1 --bitmap=internal
# veya oluştururken:
# mdadm --create ... --bitmap=internal
## Bitmap durumu
mdadm --detail /dev/md1 | grep -i bitmap
# Bitmap : Internal
03 RAID10 — yüksek performanslı yedekli yapı
RAID10, RAID1'in yedekliliğini ve RAID0'ın performansını birleştirir. Veritabanı ve yüksek I/O gerektiren iş yükleri için idealdir.
## Near-2 layout: her şerit iki farklı diske yazılır
mdadm --create /dev/md2 \
--level=10 \
--raid-devices=4 \
--layout=n2 \
--chunk=256 \
/dev/sde1 /dev/sdf1 /dev/sdg1 /dev/sdh1
## far-2 ve offset-2 layout alternatifleri:
## far-2: her kopya farklı disk bölgesinde → daha iyi sekansiyel okuma
## offset-2: offset şeritler → iyi her iki mod
## RAID10 özellikleri
mdadm --detail /dev/md2 | grep -E "Level|Layout|Chunk"
# Raid Level : raid10
# Layout : near=2
# Chunk Size : 256K
04 NVMe multi-namespace (NS) yönetimi
NVMe multi-namespace, tek bir NVMe SSD'yi birden fazla bağımsız blok cihazına bölmeyi sağlar. Her namespace bağımsız kapasite, erişim kontrolü ve QoS ayarlarına sahip olabilir.
## nvme-cli kurulum
sudo apt install nvme-cli
## Mevcut namespace'leri listele
nvme list-ns /dev/nvme0
# [ 0]:0x1
# Namespace: 1, NSID: 1, Size: 1.00TB
## Controller'ı keşfet
nvme id-ctrl /dev/nvme0 | grep -E "mn|sn|tnvmcap|unvmcap"
# mn : Samsung SSD 990 Pro 2TB
# tnvmcap: 2000398934016 (toplam NVM kapasitesi)
# unvmcap: 1000199467008 (atanmamış kapasite, 2. NS oluşturmak için)
## Yeni namespace oluştur (500 GB, 4096 LBA formatı)
nvme create-ns /dev/nvme0 \
--nsze=122070312 \ # LBA sayısı (500GB / 4096)
--ncap=122070312 \
--flbas=0 # LBA formatı indeksi (0=512B, 1=4096B)
# Namespace ID al
nvme list-ns /dev/nvme0
# [ 0]:0x1
# [ 1]:0x2 ← yeni NS
## Namespace'i controller'a ekle
nvme attach-ns /dev/nvme0 --namespace-id=2 --controllers=0x7
## Kernel'e bildir
nvme reset /dev/nvme0
## Blok cihazı görünümü
ls /dev/nvme0n*
# /dev/nvme0n1 (NS 1)
# /dev/nvme0n2 (NS 2)
NVMe namespace ile RAID
## İki farklı NVMe SSD'nin namespace'leri ile RAID1
mdadm --create /dev/md_nvme \
--level=1 \
--raid-devices=2 \
/dev/nvme0n1 /dev/nvme1n1
mkfs.xfs /dev/md_nvme
mount /dev/md_nvme /mnt/nvme_raid
NVMe Namespace I/O Policy
## NVM Set ile namespace gruplaması (NVMe 1.4+)
nvme set-feature /dev/nvme0 --feature-id=0x19 \
--value=0x1 # NVM Set ID
## I/O determinism (Intel Optane / özel SSD)
nvme id-ns /dev/nvme0 --namespace-id=1 | grep -i "nsfeat"
05 Gömülü NAS topolojisi — PCIe + SATA genişletici
ARM tabanlı gömülü NAS (Synology, QNAP benzeri) mimarisinde PCIe SATA genişletici kartlar yaygındır. Her diskin güç yönetimi ve hata tespiti bağımsız olmalıdır.
ARM Cortex-A55 SoC (örn. Marvell ARMADA 3720)
├── PCIe Gen 3 x4
│ └── ASM1166 SATA 6G × 6 port genişletici
│ ├── /dev/sda (3.5" HDD 4TB — RAID5 üye)
│ ├── /dev/sdb (3.5" HDD 4TB — RAID5 üye)
│ ├── /dev/sdc (3.5" HDD 4TB — RAID5 üye)
│ ├── /dev/sdd (3.5" HDD 4TB — hot spare)
│ └── /dev/sde (2.5" SSD — cache tier)
├── eMMC 32GB → sistem (/) ve /boot
├── USB 3.0 → yedekleme
└── GigE → ağ erişimi
SAS/SATA genişletici ile HDD yönetimi
sudo apt install sdparm smartmontools hddtemp
## HDD bilgisi
smartctl -i /dev/sda | grep -E "Device Model|Firmware|Capacity"
## SMART sağlık durumu
smartctl -H /dev/sda
# SMART overall-health self-assessment: PASSED
## Sıcaklık
smartctl -A /dev/sda | grep Temperature_Celsius
## Tüm diskler için döngü
for d in /dev/sd{a..d}; do
echo -n "$d: "
smartctl -H "$d" | grep -o "PASSED\|FAILED"
done
06 Disk arızası — tespit ve hot-spare
RAID dizisinde disk arızası gerçek zamanlı tespit edilmeli ve hot-spare varsa yeniden oluşturma otomatik başlamalıdır. mdadm bildirimleri ve kernel syslog entegrasyonu kritiktir.
Disk arızası simülasyonu ve hot-spare
## Disk arızasını simüle et (TEST amaçlı)
mdadm --fail /dev/md1 /dev/sdb1
## Durum kontrol — disk F (failed) işaretlendi
cat /proc/mdstat
# md1 : active raid5 sdd1[3] sdc1[1] sdb1[0](F)
# 1953536000 blocks level 5 [3/2] [_UU]
## Başarısız diski kaldır
mdadm --remove /dev/md1 /dev/sdb1
## Hot-spare ekle (mevcut hot-spare yoksa)
mdadm --add /dev/md1 /dev/sdd1
# mdadm: added /dev/sdd1 — rebuild başlar otomatik
## Yeniden oluşturma ilerlemesi
cat /proc/mdstat
# [===>.................] recovery = 15.8%
# finish=47.2min speed=148K/sec
mdadm bildirimleri — e-posta ve systemd
MAILADDR root@localhost
MAILFROM mdadm@nas.local
PROGRAM /usr/local/bin/raid_alert.sh
#!/bin/bash
# mdadm tarafından olay bildiriminde çalıştırılır
# $1 = event türü, $2 = md cihazı, $3 = disk (opsiyonel)
EVENT="$1"
DEVICE="$2"
COMPONENT="$3"
SUBJECT="RAID Olayı: $EVENT on $DEVICE"
BODY="Olay: $EVENT\nCihaz: $DEVICE\nBileşen: $COMPONENT\nZaman: $(date)\n\n$(mdadm --detail $DEVICE)"
echo -e "$BODY" | mail -s "$SUBJECT" root@localhost
logger -t raid-alert "Event=$EVENT Device=$DEVICE Component=$COMPONENT"
07 RAID yeniden oluşturma (rebuild) izleme
Büyük disk dizilerinde yeniden oluşturma saatler sürebilir. Süreç izleme, kalan süre tahmini ve I/O önceliklendirme kritik yönetim görevleridir.
Yeniden oluşturma hızı optimizasyonu
## Mevcut sync hızı
cat /proc/sys/dev/raid/speed_limit_min
cat /proc/sys/dev/raid/speed_limit_max
## Rebuild süresini kısaltmak için hız artır (üretim I/O'sundan çal)
echo 100000 > /proc/sys/dev/raid/speed_limit_min # 100 MB/s minimum
echo 200000 > /proc/sys/dev/raid/speed_limit_max # 200 MB/s maximum
## Sadece geceleri hızlı rebuild (cron ile)
# Gece: hızlı
echo "0 22 * * * root echo 200000 > /proc/sys/dev/raid/speed_limit_min" \
>> /etc/cron.d/raid_speed
# Gündüz: yavaş (üretim öncelikli)
echo "0 8 * * * root echo 10000 > /proc/sys/dev/raid/speed_limit_min" \
>> /etc/cron.d/raid_speed
Python ile rebuild izleme script'i
import re, time
def parse_mdstat():
arrays = {}
with open("/proc/mdstat") as f:
content = f.read()
blocks = re.split(r'\n(?=md)', content)
for block in blocks:
m = re.search(r'^(md\d+)', block, re.M)
if not m:
continue
name = m.group(1)
state_m = re.search(r'\[([U_]+)\]', block)
state = state_m.group(1) if state_m else "?"
sync_m = re.search(r'(\w+)\s*=\s*([\d.]+)%\s*'
r'finish=([\d.]+)(min|hour)', block)
if sync_m:
arrays[name] = {
"state": state,
"op": sync_m.group(1),
"pct": float(sync_m.group(2)),
"finish": f"{sync_m.group(3)}{sync_m.group(4)}",
}
else:
arrays[name] = {"state": state, "op": "idle", "pct": 100.0}
return arrays
while True:
for name, info in parse_mdstat().items():
print(f"{name}: {info['state']} {info['op']} "
f"{info['pct']:.1f}% finish={info.get('finish','—')}")
time.sleep(30)
08 Performans kıyaslama ve ayarlama
RAID dizisi performansı, stripe size, read-ahead, I/O scheduler ve dosya sistemi seçimine göre önemli ölçüde değişir.
fio ile kıyaslama
## Sıralı okuma/yazma (RAID5, 3 disk)
fio --filename=/dev/md1 \
--direct=1 \
--rw=read \
--bs=1M \
--ioengine=libaio \
--iodepth=32 \
--numjobs=1 \
--size=10G \
--name=seq_read \
--output-format=terse
## Rastgele okuma (IOPS testi)
fio --filename=/mnt/raid5/test \
--direct=1 \
--rw=randread \
--bs=4K \
--ioengine=libaio \
--iodepth=64 \
--numjobs=4 \
--size=1G \
--name=rand_read
Tipik kıyaslama sonuçları
İş yükü Seq Read Seq Write RandR(4K) RandW(4K)
──────────────────────────────────────────────────────────────
RAID5 (HDD) 380 MB/s 220 MB/s 2.1K IOPS 1.2K IOPS
RAID10 (HDD) 380 MB/s 300 MB/s 3.8K IOPS 2.8K IOPS
RAID5 (SSD) 1.8 GB/s 900 MB/s 320K IOPS 180K IOPS
RAID10 (SSD) 2.4 GB/s 1.5 GB/s 480K IOPS 380K IOPS
I/O scheduler ayarlama
## HDD için mq-deadline önerilir
echo mq-deadline > /sys/block/sda/queue/scheduler
echo mq-deadline > /sys/block/sdb/queue/scheduler
## SSD için none (NVMe) veya mq-deadline
echo none > /sys/block/nvme0n1/queue/scheduler
## read-ahead artır (sıralı yük için)
blockdev --setra 65536 /dev/md1 # 32 MB
## stripe cache (RAID5/6)
echo 8192 > /sys/block/md1/md/stripe_cache_size
09 Prometheus ile RAID sağlık izleme
Prometheus node_exporter, mdstat bilgilerini otomatik toplar. Özel metrikleri textfile collector ile eklenerek Grafana dashboard ve AlertManager entegrasyonu yapılır.
node_exporter kurulum ve mdstat
## node_exporter — mdstat collector varsayılan aktif
./node_exporter --collector.mdadm
## Prometheus metrik örnekleri
# node_md_state{device="md0"} 1 (1=aktif, 0=inaktif)
# node_md_disks{device="md0",state="active"} 2
# node_md_disks{device="md0",state="failed"} 0
# node_md_disks{device="md0",state="spare"} 1
# node_md_sync_completed{device="md0"} 1 (1=tamamlandı)
# node_md_sync_speed_bytes_per_second{device="md0"} 0
Özel SMART metrik collector
#!/bin/bash
OUTPUT="/var/lib/node_exporter/textfile_collector/smart.prom"
TMP=$(mktemp)
echo "# HELP disk_smart_health Disk SMART health (1=OK, 0=FAIL)" > "$TMP"
echo "# TYPE disk_smart_health gauge" >> "$TMP"
echo "# HELP disk_temperature_celsius Disk temperature" >> "$TMP"
echo "# TYPE disk_temperature_celsius gauge" >> "$TMP"
for dev in /dev/sd{a..h}; do
[ -b "$dev" ] || continue
model=$(smartctl -i "$dev" 2>/dev/null | \
awk '/Device Model/{print $3,$4}')
health=$(smartctl -H "$dev" 2>/dev/null | \
grep -c PASSED)
temp=$(smartctl -A "$dev" 2>/dev/null | \
awk '/Temperature_Celsius/{print $10}')
label="device=\"$dev\",model=\"$model\""
echo "disk_smart_health{$label} ${health:-0}" >> "$TMP"
echo "disk_temperature_celsius{$label} ${temp:-0}" >> "$TMP"
done
mv "$TMP" "$OUTPUT"
AlertManager kuralları
groups:
- name: raid
rules:
- alert: RAIDDegradedArray
expr: node_md_disks{state="failed"} > 0
for: 1m
labels:
severity: critical
annotations:
summary: "RAID dizisi bozuldu: {{ $labels.device }}"
description: "{{ $value }} disk arızalı"
- alert: RAIDRebuildInProgress
expr: node_md_sync_completed{} == 0
for: 0m
labels:
severity: warning
annotations:
summary: "RAID yeniden oluşturma devam ediyor"
- alert: DiskHighTemperature
expr: disk_temperature_celsius > 55
for: 5m
labels:
severity: warning
annotations:
summary: "Disk sıcaklığı yüksek: {{ $labels.device }}"