mdadm - RAID alapok
Az mdadm (multiple devices) a Linux eszköze a tömbök (RAID) létrehozására, kezelésére, monitorozására.
Ezen eszközzel sotfware-es RAID alakítható ki, hardware-es RAID vezérlővel rendelkező rendszeren az alábbi leírás nem alkalmazható.
Ebben a fejezetben tárgyalt parancsokat virtuális környezetben teszteltem, éles adatokat és rendszer lemezt/partíciót mellőzve.
A dokumentum tartalma
Linkek
Gyakorláshoz szükséges feltételek
Az mdadm 7 üzemmódja
Lemezek előkészítése
RAID tömbök létrehozása
Linear - JBOD
RAID0 - Stripe
RAID1 - Mirror
RAID5 - Stripe set with parity
RAID10 - Striped mirrors
RAID config mentés, tömbök formázása, fs beállítása, mount point
Növelés (Grow), csökkentés, leállítás, törlés, vizsgálat, Pending
Monitorozás, email küldés
RAID1 meghibásodás szimulálása hot-spare lemezzel
RAID10 tesztelés 2 hibás lemezzel
Linkek:
RAID szintek - Wikipedia
mdadm - unixlinux.tmit.bme.hu
mdadm - Wikipedia - eng
Gyakorláshoz szükséges feltételek
Fenti RAID szintek link tartalmának ismerete
Linux-ot futtató PC, 1db rendszer és minimum 2db RAID gyakorláskoz használható lemezzel.
VAGY
Virtuális környezetben futtatott Linux VM, 1 + min.2db virtuális lemezzel. pl: Windows-on VMware Player free
Türelem, Pizza, koffeines ital (copyright by raid.wiki.kernel.org)
Az mdadm 7 üzemmódja
Assemble : Egy korábban létrehozott tömböt alakít át aktívvá (láthatóvá)
Build : Szuperblokkmentes tömb összeállítása. Ilyenkor az első létrehozás és a későbbi újbóli
elindítás ugyanaz a művelet
Create : Új (szuperblokkos) tömb létrehozása
Follow/Monitor : A megadott tömbök állapotát figyeli, reagál a változásokra . Csak redundánds
tömbökre van értelme , pl RAID1, RAID5
Grow : Újracsíkozás. pl növelés, csökkentés, diszk szám növelés, chunk méret változtatás,
áttérés RAID1->RAID5
Manage : Kezelés. pl eszköz hozzáadása tömbhöz, kiszedése, hibásnak jelölése, spare hozzáadása...
Misc : Egyéb. pl RAID szuperblokk törlése, információkérés. Adott tömbböl egy lemez végleges
eltávolításához szükséges a szuperblokkot törölni.
Lemezek előkészítése
Ahhoz, hogy a lemezek RAID tömbbe helyezhetőek legyenek, szükséges előkészíteni az eszközök partíciós tábláit.
Ez többek között az alábbi két módszerrel valósítható meg:
fdisk /dev/sdb
# /dev/sdb eszköz 1.partíciójának felkészítése
# A gombok lenyomásának sorrendje a következő
m : manual
t : partíció rendszer id változtatása
1 : első partíció
L : listázás
fd : Linux Raid Autodetect filerendszer (ezt be kell gépelni!)
w : kiírás.
# Fenti parancsot az aktuális rendszerhez kell igazítani, és minden érintett eszközön le kell futtatni.
# Lemez elnevezések és partíció számok sdb1 !
VAGY
cfdisk /dev/sdb
# formázatlan HDD esetén:
Label type : dos
New : méretezés igény szerint
Primary/Ext. : Elsődleges vagy Kiterjesztett. Logikai partíció csak kiterjesztett alá készíthető.
Type : fd - Raid autodetect
Write : változások kiírása.
# Fenti folyamatot szintén minden érintett lemezen szükséges elvégezni.
RAID tömbök létrehozása
Linear vagy JBOD (just a bunch of disks/drives)
-Több különböző (vagy akár azonos) lemez (vagy partíció) 1db nagy dinamikus lemezzé konvertálása
-Sebességben nincs különbség egy szimpla lemezhez képest.
-Elérhető maximális méret: a résztvevő hdd-k vagy partíciók összege
-Hibatűrés nincs! Bármely lemez kiesése esetén szétesik a tömb
mdadm --create --verbose /dev/md0 --level=linear --raid-devices=2 /dev/sdb3 /dev/sdc4
# create :létrehozás
# verbose :bőveszédű
# /dev/md0 :/dev/md0 lesz a tömb device
# --level= :RAID típusa linear
# --raid-devices= :tömbbe kerülő eszközök száma
# /dev/sdb3, sdc4 :a résztvevő lemezek partíciói
RAID0 - Stripe
-Stripe, vagyis csíkozás. A résztvevők között az adat annyi egyenlő részre lesz szétosztva,
ahány résztvevő van, így minden lemezre az adat egy darabja kerül.
-Sebesség: Az írás/olvasás párhuzamosan történik -> Gyors
-Elérhető maximális méret: a résztvevő legkisebb hdd vagy partíció mérete.
erősen ajánlott azonos típusú lemezeket használni.
-Hibatűrés nincs! Bármely lemez kiesése esetén szétesik a tömb.
mdadm --create --verbose /dev/md0 --level=stripe --raid-devices=2 /dev/sdb1 /dev/sdc1
# 2 eszközöből álló RAID0 tömb létrehozása
RAID1 - Mirror
-Tükrözés 2 vagy több lemez között.
a résztvevő hdd-kre vagy partíciókra az adat 1-1 példányban kerül írásra. Pazarló helykihasználtság!
-Sebesség: Olvasás ideálsi esetben kétszerese egy szimpla HDD-nek. Írásban minimális a növekedés.
-Elérhető maximális méret: a résztvevő legkisebb hdd vagy partíció mérete.
ajánlott azonos típusú lemezeket használni.
-Hibatűrés van! 1db lemez kiesése esetén a tömb ép marad, adat írható/olvasható.
mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=2 /dev/sdb1 missing
# /dev/sdb1 lemezzel Degraded (féllábú) tömb létrehozása. A hiányzó eszköz helyére missing kell.
mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=2 /dev/sdb1 /dev/sdc1
# /dev/sdb1 és sdc1 résztvevőkkel RAID1 létrehozása
mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=2 /dev/sdb1 /dev/sdc1 --spare-devices=1 /dev/sdd1
# md0 RAID1 tömb létrehozása 1db Spare disk-el (melegtartalék)
# Amennyiben bármely lemez kiesik, úgy a rendszer a spare disk-et automatikusan sync-eli és átveszi
# a hibás lemez helyét. Redundancia növekedés!
RAID5 - Stripe set with parity
-Minimum 3db, lehetőleg azonos méretű lemez szükséges RAID5 kialakításhoz. Egy adatblokk 3db lemez esetén két részre osztva
egy-egy lemezre íródik, (disk1-data1, disk2-data2) ezen adatok paritás értéke pedig (disk3-dataP) a harmadik lemezre kerül.
a paritás egy ellenőrző összeg, melyből a CPU (vagy vezérlő) data1 VAGY data2 elvesztése esetén pótolni tudja a kiesést.
a RAID5 körbeforgó paritási (rotating parity) eljárást alkalmaz, nincs kitüntetett paritás lemez (pl RAID4 melyben szűk
keresztmetszete lenne a rendszernek) a paritást az összes meghajtón elosztva tárolja.
-Sebesség: párhuzamos olvasásnak köszönhetően gyors olvasás, az írás sw RAID esetén fokozottan CPU igényes!
kiszámítása (N-1)*S ahol N:résztvevő darabszám, S:leglassabb résztvevő sebessége
-Elérhető maximális méret kiszámítása: (N-1)*S ahol N:résztvevő darabszám, S:legkisebb résztvevő mérete,
tehát 3db 500GB-os lemeznél 1TByte.
-Hibatűrés van! 1db lemez kiesése esetén a tömb ép marad, adat írható/olvasható.
mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
# md0 RAID5 tömb létrehozása 3 lemez 1.partíciójából.
mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1 --spare-devices=1 /dev/sde1
# md0 RAID5 tömb létrehozása, 1db spare disk-el.
--assume=clean
# új RAID1,5,10 stb tömbök létrehozásakor nincs sync. Érdemes előtte a partíciókat és az MBR-t törölni, valamint felület
# tesztet futtatni a diszkeken. (nullákkal történő feltöltést lépi át az mdadm, ahol amúgy kijönne a bad sector hiba.)
RAID10 - Striped mirrors
-Minimum 4db, lehetőleg azonos méretű lemez szükséges RAID10 (1+0)kialakításhoz. 2db (2 lemezből álló) előre létrehozott
RAID1 tömb kerül összefűzésre RAID0-ba. A RAID10 technológia ötvözi a RAID0 gyorsaságát a RAID1 megbízhatóságával.
-Sebesség: párhuzamos olvasásnak és írásnak köszönhetően szimpla HDD-hez képest legalább kétszer gyorsabb.
-Elérhető maximális méret kiszámítása: (N*S)/2 ahol N:résztvevő darabszám, S:legkisebb résztvevő mérete,
tehát 4db 500GB-os lemeznél 1TByte.
-Hibatűrés van! Amennyiben a RAID1 tömbökből esik ki 1-1 lemez, úgy a rendszer továbbra is üzemképes marad.
mdadm --create --verbose /dev/md0 --level=10 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
# md0 RAID10 tömb létrehozása 4db lemez 1.partíciójából.
# Tesztelés lentebb.
RAID config mentés, tömbök formázása, fs beállítása, mount point
Amennyiben a fentiek alapján sikeresen létre lett hozva a tömb, úgy szükséges az alábbi lépéseket
elvégezni a config véglegesítéséhez illetve a tömb használatba vételéhez.
Példa RAID1 esetén
cat /proc/mdstat
# az összeállított RAID tömb állapotának lekérése
# Alábbi kimenet RAID1 config sdb1 és sdc1-el.
Personalities : [raid1]
md0 : active raid1 sdb1[0] sdc1[1]
7810036 blocks super 1.2 [2/2] [UU]
cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf-orig
# aktuális mdadm.conf mentése mdadm.conf-orig néven
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
# a kialakított állapot, azaz a config mentése
mkfs.ext3 /dev/md0
# /dev/md0 tömb ext3 típusú fájlrendszerre formázása
mkdir /mnt/md0
# csatolási pont - mount point létrehozása ahol el lehet majd érni a tömböt
# helye szabadon választott.
mount /dev/md0 /mnt/md0
# a tömb /mnt/md0 csatolási pontra mount-olás
mount
# az előbbi mount tesztelése. Valami hasonló lesz a kimenet:
..
/dev/md0 on /mnt/md0 type ext3 (rw,errors=remount-ro)
cp /etc/fstab /etc/fstab-orig
# /etc/fstab mentése.
blkid /mnt/md0
# Ahhoz, hogy minden újraindítás után fel legyen csatolva a tömb, bele kell írni az fstab-ba UUID alapján.
# Az adott tömb UUID értékének kiíratása. Az fstab-ba ezen értéket szükséges felvenni, valahogy így:
..
UUID=ede160d0-9504-4a21-8460-add12df04b77 /mnt/md0 ext3 errors=remount-ro 0 1
mdadm --detail /dev/md0
# md0 tömb tulajdonságok.
# RAID1, 1db spare disk-el valahogy így néz ki:
/dev/md0:
Version : 1.2
Creation Time : Thu Apr 19 14:37:01 2016
Raid Level : raid1
Array Size : 103296 (100.89 MiB 105.78 MB)
Used Dev Size : 103296 (100.89 MiB 105.78 MB)
Raid Devices : 2
Total Devices : 3
Persistence : Superblock is persistent
Update Time : Thu Apr 19 19:04:01 2016
State : clean
Active Devices : 2
Working Devices : 3
Failed Devices : 0
.....
Ha minden sikerült, kész a felcsatolt RAID1 tömb.
Növelés (Grow), csökkentés, leállítás, törlés, vizsgálat, Pending
Rövidítések
-a : --add
-c : --create
-l1 : --level=mirror (raid1)
-n3 : --raid-devices=3
-x1 : --spare-devices=1
mdadm --grow --raid-devices=3 /dev/md0
mdadm --add /dev/md0 /dev/sde1
# Adott /dev/md0 tömbben a diszkek számának növelése 3-ra, majd /dev/sde1 hozzáadása.
mdadm --fail /dev/md0 /dev/sdc1
mdadm --remove /dev/md0 /dev/sdc1
mdadm --grow --raid-devices=2 /dev/md0
# /dev/md0 tömbben az sdc1 résztvevő hibásnak beállítása és eltávolítása
# ezt követően md0 tömb lemezek számának csökkentése 2-re.
mdadm --stop /dev/md0
# md0 tömb leállítása
mdadm --stop --scan
# az mdadm.conf -ban az összes felsorolt tömb leállítása
mdadm --remove /dev/md0
# md0 végleges törlése, stop-ot követően
mdadm --zero-superblock /dev/sdb1
# superblock ürítés aktuális eszközön.
# akkor lehet szükséges, ha sdb1 korábban már RAID tömb tagja volt, de most egy új tömbbe kell felvenni.
mdadm --examine /dev/sda1
# /dev/sda1 eszközön md superblock keresése/vizsgálata - examine
# sda1 része vagy része volt-e aktív RAID tömbnek?
Ha nem:
mdadm : No md superblock detected on /dev/sda1
Ha igen:
/dev/sdb1:
Magic : a92b4efc
Version : 1.2
Feature Map : 0x0
Array UUID : 29473177:dcda05f4:7b158228:7c7326f1
Name : debian830:0 (local to host debian830)
Creation Time : Wed Apr 26 14:58:06 2016
Raid Level : raid10
Raid Devices : 4
.....
mdadm --readwrite /dev/mdX
# Amennyiben /dev/mdX állapota valamilyen okból kifolyólag Pending: resync=PENDING
# úgy a fenti paranccsal indítható ismét a sync.
Monitorozás, email küldés
Az mdadm rávehető folyamatos monitorozásra is, ami egy daemont futtat a háttérben és hiba esetén riasztást küld,
illetve ha beállításra kerül, be is tud avatkozni.
Levélküldéshez használható kliens például ssmtp. A configjában a mailhub-hoz fel kell venni az SMTP címet
/etc/mdadm/mdadm.conf
# -ba fel kell venni a címzettet, ellenkező esetben a helyi root kapja az értesítést.
MAILADDR
mdadm --monitor --scan --test -1
# test mail kiküldése mdadm-on keresztül.
mdadm --monitor --daemonise --mail= --delay=30 /dev/md0
# daemon módban futó scan 30másodpercenként, címzettet megadva.
# delay default értéke 1800sec, én csak a teszt erejéig húztam le 30s-re
mdadm --fail /dev/md0 /dev/sdd1
# teszt jelleggel sdd1 kivétele md0-ból:
mdadm: set /dev/sdd1 faulty in /dev/md0
# Alábbi levél érkezett másodpercekkel később:
# a resync DELAYED nem releváns, mire megnéztem az mdstat-ot, addigra már kész is volt a (spare) sync, automatikusan! :)
This is an automatically generated mail message from mdadm running on debian830
A Fail event had been detected on md device /dev/md0.
It could be related to component device /dev/sdd1.
Faithfully yours, etc.
P.S. The /proc/mdstat file currently contains the following:
Personalities : [raid1]
md0 : active raid1 sdc1[3] sdb1[4] sdd1[2](F)
103296 blocks super 1.2 [2/1] [U_]
resync=DELAYED
unused devices:
RAID1 meghibásodás szimulálása hot-spare lemezzel
Alábbi tesztben egy működő RAID1 tömb egyik aktív lemeze hibásodik meg úgy, hogy a tömb részét
képezi 1db hot-spare lemez is (melegtartalék).
Ilyen esetben az mdadm a hibásnak ítélt lemez eltávolítását követően automatikusan becsatolja a spare lemezt,
és el is kezdi rászinkronizálni az adatokat.
cat /proc/mdstat
# aktuális helyzet felmérése (látható, hogy sdc1 a spare!)
Personalities : [raid1]
md0 : active raid1 sdc1[3](S) sdb1[0] sdd1[2]
103296 blocks super 1.2 [2/2] [UU] unused devices:
mdadm --fail /dev/md0 /dev/sdb1
# sdc1 hibásnak ítélése
mdadm: set /dev/sdb1 faulty in dev/md0
cat /proc/mdstat
# látható, hogy sdb1 Faulty, és sdc1 spare átvette a helyét.
Personalities : [raid1]
md0 : active raid1 sdc1[3] sdb1[0](F) sdd1[2]
103296 blocks super 1.2 [2/2] [UU] unused devices:
mdadm --remove /dev/md0 /dev/sdb1
# sdb1 kivétele a tömbből
mdadm: hot removed /dev/sdb1 from /dev/md0
cat /proc/mdstat
# sdb1 el is tűnt.
Personalities : [raid1]
md0 : active raid1 sdc1[0] sdd1[2]
103296 blocks super 1.2 [2/2] [UU] unused devices:
mdadm --add /dev/md0 /sdb1
# sdb1 visszahelyezése a tömbbe. Ekkor a frissen behelyezett eszköz lesz a spare.
Personalities : [raid1]
md0 : active raid1 sdc1[3] sdb1[4](S) sdd1[2]
103296 blocks super 1.2 [2/2] [UU] unused devices:
RAID10 tesztelés 2 hibás lemezzel
Alábbi tesztben egy működő RAID10 tömbből 2db lemez esik ki, RAID1 tömbönként 1-1, melyet elméleti
síkon még túl kellene élnie.
cat /proc/mdstat
# Jelenlegi helyzet így néz ki.: RAID10, sdb,sdc,sdd,sde lemezek első partícióiból
Personalities : [raid10]
md0 : active raid10 sde1[3] sdd1[2] sdc1[1] sdb1[0]
204800 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
mdadm --detail /dev/md0
# detail információk ide vágó része:
# Látható set-A set-B infók alapján, hogy sdb1 és sdd1 képezi az egyik RAID1-et, sdc1 sde1 a másikat.
# A két RAID1 tömbre pedig szét van osztva egy adatblokk (A+B) -> RAID0
Number Major Minor RaidDevice State
0 8 17 0 active sync set-A /dev/sdb1
1 8 33 1 active sync set-B /dev/sdc1
2 8 49 2 active sync set-A /dev/sdd1
3 8 65 3 active sync set-B /dev/sde1
ls -la /mnt/md0
# md0 tömb becsatolva /mnt/md0-ba, teszt adattal feltöltve:
total 124528
drwxr-xr-x 4 root root 1024 Jan 17 16:04 .
drwxr-xr-x 3 root root 4096 Jan 15 01:48 ..
-rw-r--r-- 1 root root 126998528 Jan 17 16:05 123
drwx------ 2 root root 12288 Jan 17 16:04 lost+found
drwxr-xr-x 2 root root 1024 Jan 17 16:04 test-data
mdadm --fail /dev/md0 /dev/sdb1
mdadm --fail /dev/md0 /dev/sde1
mdadm --remove /dev/md0 /dev/sdb1
mdadm --remove /dev/md0 /dev/sde1
# sdb1 és sde1 résztvevők hibásnak ítélése és eltávolítása a tömbből.
cat /proc/mdstat
# Jelenlegi helyzet:
Personalities : [raid10]
md0 : active raid10 sdd1[2] sdc1[1]
204800 blocks super 1.2 512K chunks 2 near-copies [4/2] [_UU_]
mdadm --detail /dev/md0
# detail információk ide vágó része:
Number Major Minor RaidDevice State
0 0 0 0 removed
1 8 33 1 active sync set-B /dev/sdc1
2 8 49 2 active sync set-A /dev/sdd1
6 0 0 6 removed
ls -la /mnt/md0
# Volia! /mnt/md0-ba felcsatolt degraded tömb még mindig él, 2 hibás lemezzel.
total 124528
drwxr-xr-x 4 root root 1024 Jan 17 16:04 .
drwxr-xr-x 3 root root 4096 Jan 15 01:48 ..
-rw-r--r-- 1 root root 126998528 Jan 17 16:05 123
drwx------ 2 root root 12288 Jan 17 16:04 lost+found
drwxr-xr-x 2 root root 1024 Jan 17 16:04 test-data
A fenti RAID10 tömb képes túlélni két lemez kiesést abban az esetben, ha set-A és set-B lemezekből
legalább 1-1 darab épen marad. Amit nem képes elviselni, ha 2db set-A vagy 2db set-B esik ki. Egész jó nem?
Ha a tömb részét képezte volna 2db hot spare lemez, úgy a fail & remove művelet után azonnal munkába is
álltak volna, beavatkozás nélkül.