Linux lemezkezelése 6. rész – RAID tömbök menedzselése

A RAID tömb leállítása és újraindítása

Az előző részben említettük, hogy amennyiben elhelyezzük az mdadm.conf fájlban a RAID tömbök leírását, akkor az mdadm programot egyes műveletekre rövidített formában is használhatjuk. Nézzünk meg az ilyen rövidített parancsok használatát a tömbök leállításának és újraindításának példáján.

Egy RAID tömb leállítására olyan esetekben van szükség, amikor módosítani akarjuk a konfigurációját, karbantartást végzünk az egyes lemezeken, vagy éppen a meghibásodott lemezeket cserélni szeretnénk, vagy más hibaelhárítási feladatot végzünk el.

A leállításhoz először le kell csatolnunk a tömböt, majd a –stop parancsot kell használnunk:

root@server:~# umount /dev/md0
root@server:~# mdadm --stop /dev/md0
mdadm: stopped /dev/md0

Ha most újra akarjuk indítani a tömböt, a –assemble parancsot kell használnunk:

root@server:~# mdadm --assemble /dev/md0
mdadm: /dev/md0 has been started with 2 drives.

Ha nem lenne elhelyezve a megfelelő ARRAY sor a konfigurációs fájlban, akkor ez a rövidített parancs nem működne, és nekünk kellene manuálisan újraépíteni a leállított tömböt az egyes lemezek megadásával:

root@server:~# mdadm --assemble /dev/md0 /dev/sdb /dev/sdc

RAID tömb törlése

Első lépésben határozzuk meg a törlendő RAID eszközünket, és azt, hogy mely lemezekből épül fel:

root@server:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid0 sdc[1] sdb[0]
      41908224 blocks super 1.2 512k chunks

Csatoljuk le a tömböt:

root@server:~# umount /dev/md0

Állítsuk le a tömböt:

root@server:~# mdadm --stop /dev/md0

Távolítsuk el a RAID tömbből az egyes lemezeket:

root@server:~# mdadm --remove /dev/md0

Ez a parancs csupán lecsatolja a tömbről a lemezeket, de nem törli az adatokat róluk. Ha véletlenül adjuk ki, akkor innen még visszaépíthető a tömb.

Majd töröljük a RAID információit tartalmazó szuperblokkot a RAID-ot alkotó lemezekről:

mdadm --zero-superblock /dev/sdb
mdadm --zero-superblock /dev/sdc

Mivel ilyenkor eltávolításra kerülnek a lemezről a meta-adatok, a RAID tömb helyreállítása már csak akkor lehetséges, ha manuálisan visszaállítjuk azokat. Az adatok még mindig nem kerültek törlésre, csak nem elérhetőek többet. Fontos, hogy a tömb eltávolítása után az összes rá vonatkozó hivatkozást is távolítsuk el. (Ilyen lehet például az fstab-ban található sor.)


A RAID tömb bővítése tartalék lemezzel

Először is tisztázzuk, hogy amikor menedzselünk egy RAID tömböt, akkor le kell csatolnunk vagy nem, a fájlrendszerből. A válasz az, hogy ugyan nem kötelező, de érdemes. A RAID tömb menedzselése mindig egy előre megtervezett feladat, vagyis érdemes a felhasználókat előre tájékoztatni, hogy mikorra tervezzük, és akkor a RAID-et használó szolgáltatások nem elérhetőek. Ilyenkor érdemes az adatokról biztonsági mentéseket is végezni. De ez nem minden esetben valósítható meg, ugyanis vannak olyan szolgáltatások, amelyeket nem állíthatunk le. (Gondoljunk csak egy webáruház, vagy egy bank online szolgáltatásaira.) Ilyenkor vállalni kell azt, hogy a működő RAID tömbön végezzük el a feladatokat.

A következőkben nem fogjuk lecsatolni a tömböt a fájlrendszerből, annak érdekében, hogy csak az egyes feladatokra fókuszáljunk, de ne feledjük el, hogy éles rendszereken nem biztos, hogy ez a legmegbízhatóbb út.

Kérdezzük le a RAID 1-es tömb eszközeit. Láthatjuk, 2 aktív eszköz alkotja, hibás lemez nincs a rendszerben, és tartalék lemezzel sem rendelkezik.

root@server:~# mdadm --detail /dev/md0 | grep Devices
      Raid Devices : 2
     Total Devices : 2
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Adjunk a rendszerhez egy tartalék lemezt a –manage és a –add parancs használatával. Fontos megjegyezni, hogy csak redundáns RAID tömbökhöz lehet tartalék lemezt adni.

root@server:~# mdadm --manage /dev/md0 --add /dev/sdd
mdadm: added /dev/sdd

Álljunk meg egy pillanatra. A tömböt módosító parancsoknál nem kellene feltétlenül használni a –manage opciót, hanem elegendő lenne csupán a –add-ot használni, vagyis a parancs ebben a formában is működik: mdadm –add /dev/md0 /dev/sdd. Én ezt mégsem ajánlom. A RAID tömbjeinkkel dolgozni nem veszélytelen feladat, a parancs hosszabb formája jobban fejezi ki, mit szeretnénk csinálni: Menedzselni (–manage) szeretnénk az md0 tömböt úgy, hogy hozzáadjuk (–add) az sdd lemezt. Ugyan így fogunk eljárni, ha majd a későbbiekben akár hibásnak jelölünk egy lemezt, vagy eltávolítjuk a tömbből.

Nézzük meg, hogyan változott a tömbben a lemezek száma. Jól látható, hogy a tartalék lemez (Spare Device) megjelent a rendszerben.

root@server:~# mdadm --detail /dev/md0 | grep Devices
      Raid Devices : 2
     Total Devices : 3
    Active Devices : 2
   Working Devices : 3
    Failed Devices : 0
     Spare Devices : 1

Az lsblk parancs kimenetén is a RAID 1 tömbhöz látjuk hozzárendelve:

root@server:~# lsblk -fs /dev/md0
NAME  FSTYPE            FSVER LABEL    UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
md0   ext4              1.0            6efe8a2e-f874-41b1-9016-071d305fb2a6   18.5G     0% /mnt/adatok1
├─sdb linux_raid_member 1.2   server:0 b06d00a1-1da1-a7dd-0348-8dc91b6b51a8
├─sdc linux_raid_member 1.2   server:0 b06d00a1-1da1-a7dd-0348-8dc91b6b51a8
└─sdd linux_raid_member 1.2   server:0 b06d00a1-1da1-a7dd-0348-8dc91b6b51a8

A RAID tömb hibás lemezének cseréje

A tartalék lemez egészen addig tartalék állapotban marad a tömbben, amíg valamelyik aktív lemez állapota le nem romlik annyira, hogy a rendszer a tartalékot aktív állapotba helyezi, és rászinkronizálja az adatokat. Ezt a hibás állapotot viszont mi magunk is beállíthatjuk, ahogyan az alábbiakban láthatjuk.

Idézzük elő a hibás állapotot tehát úgy, hogy az sdc-t manuálisan hibásnak jelöljük meg.

root@server:~# mdadm --manage /dev/md0 --fail /dev/sdc
mdadm: set /dev/sdc faulty in /dev/md0

Kérdezzük le a tömb állapotát. Láthatjuk, hogy sdd-re automatikusan elkezdődött az adatokat szinkronizálása:

root@server:~# cat /proc/mdstat
Personalities : [raid0] [linear] [multipath] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdd[2] sdb[0] sdc[1](F)
      20954112 blocks super 1.2 [2/1] [U_]
      [=>...................]  recovery =  9.5% (2001664/20954112) finish=1.4min speed=222407K/sec

A szinkronizálás befejeztével az sdb-t és sdd-t aktívnak, az sdc-t hibásnak jelöli, míg értelemszerűen nem lesz már tartalék a tömbben:

root@server:~# mdadm --detail /dev/md0 | grep Devices
      Raid Devices : 2
     Total Devices : 3
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 1
     Spare Devices : 0

Ezután a hibás lemezt el tudjuk távolítani a RAID tömbből:

root@server:~# mdadm --manage /dev/md0 --remove /dev/sdc
mdadm: hot removed /dev/sdc from /dev/md0

Ennek megfelelően alakul a lemezek számai is a tömbben:

root@server:~# mdadm --detail /dev/md0 | grep Devices
      Raid Devices : 2
     Total Devices : 2
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Így már a hibás lemez eltávolítható a gépből is. (Ilyenkor örülhetünk, ha hotswap-es lemezzel van dolgunk, hiszen akkor nem kell leállítanunk a szervert.)

Érdemes megjegyezni, hogy a tartalék lemez beemelése szükség esetén teljesen automatikusan is történhet a háttérben. Tehát ha például sdc állapota folyamatosan romlik, vagy valamilyen hiba miatt hirtelen eltűnik a konfigurációból, a rendszer automatikusan végrehajtja az előzőekben manuálisan bemutatott folyamatot. Persze érdemes a lemezek állapotának monitorozásával ezt a saját kezünkben tartani.


RAID tömb bővítése aktív lemezzel

Tegyük fel, hogy a korábban meghibásodott sdc lemezt kicseréltük, és szeretnénk visszaépíteni úgy a RAID tömbbe, hogy ne csupán tartalék legyen, hanem a biztonság növelése érdekében a rendszer immár 3 lemezen tükrözze az adatokat. Ilyenkor először hozzáadjuk sdc-t a tömbhöz tartalékként:

root@server:~# mdadm --manage /dev/md0 --add /dev/sdc
mdadm: added /dev/sdc

Ezután a –grow paranccsal bővítjük a tömb aktív lemezeinek számát 3-ra. A +1 lemezt a tartalékból emeli ki a rendszer:

root@server:~# mdadm --grow --raid-devices=3 /dev/md0
raid_disks for /dev/md0 set to 3

Érdemes megjegyezni, hogy ha nincsen tartalék lemez a tömbben, akkor is meg lehet emelni a lemezek számát, igaz ehhez a –force kapcsolót is használni kell. (Ez azonban a későbbiekben meglepetést okozhat. Erre még később visszatérünk)

Ha lekérdezzük a tömb állapotát, láthatjuk, hogy megkezdődött az adatok szinkronizálása az új lemezre:

root@server:~# cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdc[3] sdb[0] sdd[2]
      20954112 blocks super 1.2 [3/2] [UU_]
      [=>...................]  recovery =  7.6% (1600768/20954112) finish=1.6min speed=200096K/sec

A szinkronizálás befejeztével már 3 aktív lemez dolgozik a tömbben:

root@server:~# mdadm --detail /dev/md0 | grep Devices
      Raid Devices : 3
     Total Devices : 3
    Active Devices : 3
   Working Devices : 3
    Failed Devices : 0
     Spare Devices : 0

Nagyon fontos, hogy ilyenkor ugyan a RAID tömb mérete megnőtt, de a rajta található fájlrendszer még nem. Emlékezzünk vissza (már aki olvasta az LVM-es cikket), hogy ilyenkor a fájlrendszer átméretezését is végre kell hajtanunk:

root@server:~# resize2fs /dev/md0

Egy RAID tömb változtatása során mindig be kell biztosítani magunkat, hogy egy esetleges váratlan hiba bekövetkeztekor se veszítsük el az adatainkat. Minden adat annyit ér, amennyibe kerül a helyreállítása. És ez nem csak anyagi, hanem erkölcsi veszteség is lehet. Érdemes biztonsági mentéseket készíteni, szünetmentes vagy redundáns tápegységet használni. Az előző –grow parancsot pedig kiegészíthetjük azzal, hogy készítsen a folyamatban érintett lemezek meta-adatairól biztonsági másolatot. Erre szolgál a –backup-file opció. Ezt a biztonsági mentés tehát nem a lemezeken tárolt adatokat, hanem csupán a metadatokat tartalmazza, amelyből az mdadm helyre tudja állítani a RAID tömböt. Miután megtörtént a módosítás, ez a fájl törlésre is kerül.

mdadm --grow --raid-devices=3 --backup-file=/root/md0_grow.bak /dev/md0

Aktív lemez eltávolítása RAID tömbből

Folytassuk az előző példát. Adott az md0 RAID 1 tömbünk, melyben 3 aktív lemez működik. Szeretnénk eltávolítani az egyik aktív lemezt. Próbáljuk ezt megtenni a korábban megismert –remove paranccsal.

root@server:~# mdadm --manage /dev/md0 --remove /dev/sdc
mdadm: hot remove failed for /dev/sdc: Device or resource busy

Láthatjuk, hogy nem sikerült, mivel az sdc még aktív szerepet tölt be a tömbben. Először hibásnak kell megjelölni, és csak utána tudjuk eltávolítani:

root@server:~# mdadm --manage /dev/md0 --fail /dev/sdc
mdadm: set /dev/sdc faulty in /dev/md0
root@server:~# mdadm --manage /dev/md0 --remove /dev/sdc
mdadm: hot removed /dev/sdc from /dev/md0

Látszólag minden rendben van, a RAID tömb két lemezzel működik tovább. Kérdezzük le a tömb lemezeinek számát:

root@server:~# mdadm --detail /dev/md0 | grep Devices
      Raid Devices : 3
     Total Devices : 2
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Átfuthat a tekintetünk az első soron, ahol a Raid Devices értéke 3. Ez a korábbi mdadm –grow –raid-devices=3 /dev/md0 parancs eredménye, ahol is megnöveltük a RAID-ot alkotó lemezek számát 3-ra. Ebből most 2 van kihasználva. Ha most tartalékként vissza szeretnénk tenni a tömbbe az sdc-t, akkor azt tapasztalnánk, hogy az egy adatszinronizálás után azonnal aktív lemezzé válik. Persze, a korábban beállított 3-as érték éppen azt jelenti, hogy ha lehet, 3 aktív lemezzel működjön a tömb. Ahhoz, hogy ez ne történjék meg, a RAID-ot alkotó lemezek számát vissza kell állítani 2-re:

root@server:~# mdadm --grow --raid-devices=2 /dev/md0
raid_disks for /dev/md0 set to 2

Most már rendben van a lemezek száma:

root@server:~# mdadm --detail /dev/md0 | grep Devices
      Raid Devices : 2
     Total Devices : 2
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Ezután ha az ismert módon lemezt adunk a tömbhöz, az tartalékként fog működni. A tanulság az legyen, hogy ne felejtsük el a tömböt alkotó lemezek számát is beállítani, ne csak a lemez eltávolításával foglalkozzunk.

RAID tömb átméretezése

Amennyiben egy éles rendszer használata során, a kezdetekben kialakított RAID tömb mérete már nem lenne megfelelő, akkor többféle lehetőségünk is van az átméretezésére.

RAID tömb átméretezése új lemez hozzáadásával

Sokszor előfordul, hogy a RAID tömbünkben a rendelkezésre álló hely elfogy, és bővítenünk kell a tömb kapacitását. RAID nélküli rendszerekben ez nem bonyolult, amennyiben a lemezeinken van még szabad (nem particionált vagy particionált ugyan, de fel nem használt), akkor ezt használhatjuk fel, kialakítjuk rajta a fájlrendszert, becsatoljuk, és folytatódhat a munka. ha nincsen ilyen, akkor beépítünk egy vagy több új lemezt, és ezekkel bővítjük a kapacitást. Természetesen ha LVM-et használunk, akkor sokkal rugalmasabban tudjuk ezt megtenni.

De mi van RAID tömb használata esetén? Ha teljes lemezekből alakítottuk ki a tömböt, akkor nem ússzuk meg új lemezek beépítését. Ez viszont nem jár automatikusan tárolókapacitás növekedéssel. Gondoljunk csak arra, ha egy RAID 1-es (vagyis tükrözött) tömbbe építünk akárhány új lemezt, csak az adatbiztonságot növeljük, hiszen egyre több másolatunk lesz az adatainkról, de a hasznos tárolókapacitás semmivel nem változik. Ezzel szemben egy RAID 0-s rendszerben minden új lemez teljes kapacitása a felhasználható tárolóterülethez adódik, igaz, semmiféle redundanciát nem kapunk cserébe.

Az Interneten több olyan oldal is van, melyek segítenek különböző szintű RAID tömbök kapacitásának kiszámításában. Ezek közül az egyik felhasználóbarát: https://www.synology.com/en-us/support/RAID_calculator

Az alábbi gyakorlati példában egy RAID 5-ös 3 lemezből álló tömböt fogunk egy lemezzel bővíteni. Tegyük fel, hogy a tömbünk kész, és a /dev/md0 eszközön keresztül érhető el, valamint a ext4-es fájlrendszert hoztunk rajta létre. Bővítsük a tárterületét 1 új lemezzel a már korábban látott módon. Mindegyik lemez 20GB-os, vagyis egy 40GB-os RAID5-öt fogunk 60GB-ra bővíteni.

root@server:~# mdadm --manage /dev/md0 --add /dev/sdd
root@server:~# mdadm --grow --raid-devices=3 /dev/md0

Korábban már láthattuk, hogy ez a műveletek a RAID tömb újraépítésével jár. Mikor ez befejeződött, már csak annyi a dolgunk, hogy magát a fájlrendszert is átméretezzük. (Ha olvastuk az LVM-et, akkor ott is találkoztunk már ezzel.)

root@server:~# resize2fs /dev/md0

RAID tömb átméretezése a lemezek cseréjével

Most nézzük meg azt, hogy hogyan növeljük meg a RAID5-ös tömb méretét úgy, hogy az egyes lemezeket kicseréljük benne nagyobbakra.

Adott egy RAID 5-ös tömbünk, mely 3 db. 20GB-os lemezből áll (sdb, sdc, sdd). A hasznos kapacitása 40GB. A rendszert bővítettük 3 db. 40GB-os lemezzel (**sdf, sdg, sdh). A bővítést a következőképpen hajtjuk végre: A 40GB-os lemezeket egymás után hozzáadjuk a tömbhöz tartalék lemezként, a 20GB-os lemezeket pedig hibásnak jelöljük, mire helyükre lépnek az előbb berakott 40GB-os tartalék lemezek. (A cserét páronként hajtjuk végre.) Fontos, hogy minden lemezcserénél várjuk meg a szinkronizáció befejeződését. Ezután kiterjesztjük a tömb kapacitását a maximális méretre a –grow paranccsal, majd megnöveljük a fájlrendszer méretét is. (Természetesen előtte a fájlrendszert a biztonság kedvéért lecsatolhatjuk, sőt ha megtehetjük, biztonsági mentést is végezzünk a rendszeren.)

A lépéseket végrehajtó parancsok:

root@server:~# mdadm --manage /dev/md0 --add /dev/sdf
root@server:~# mdadm --manage /dev/md0 --fail /dev/sdb

root@server:~# mdadm --manage /dev/md0 --add /dev/sdg
root@server:~# mdadm --manage /dev/md0 --fail /dev/sdc

root@server:~# mdadm --manage /dev/md0 --add /dev/sdh
root@server:~# mdadm --manage /dev/md0 --fail /dev/sdd

root@server:~# mdadm --grow /dev/md0 --size=max
root@server:~# resize2fs /dev/md0

root@server:~# mdadm --manage /dev/md0 --remove /dev/sdb
root@server:~# mdadm --manage /dev/md0 --remove /dev/sdc
root@server:~# mdadm --manage /dev/md0 --remove /dev/sdd

RAID tömb átméretezése a partíciók kiterjesztésével

Most nézzük meg, hogyan tudunk egy partíciókból létrehozott RAID5-ös tömböt úgy átméretezni, hogy a partíciók méretét növeljük meg. Tegyük fel, hogy van 3 db. 40GB-os lemezünk (sdb, sdc, sdd), melyeken létrehoztunk 1-1 db. 20Gb-os partíciót (sdb1, sdc1, sdd1), majd ezekből építettük fel a RAID 5-ös tömböt:

root@server:~# mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1

Miután elfogyott a helyünk, szeretnénk a partíciók méretét úgy növelni, hogy lefedjék a teljes lemezt, aztán ezekkel építjük újra a tömböt. Első lépésként a partíciókat növeljük meg 20GB-ról 40GB-ra mindegyik lemezen külön-külön:

root@server:~# parted /dev/sdb
               resizepart 1 40GB
               quit
root@server:~# parted /dev/sdc
               resizepart 1 40GB
               quit
root@server:~# parted /dev/sdd
               resizepart 1 40GB
               quit

Ezután a szokásos módon kiterjesztjük a tömböt a maximális méretre, majd átméretezzük a fájlrendszert:

root@server:~# mdadm --grow /dev/md0 --size=max
root@server:~# resize2fs /dev/md0