Linux lemezkezelés 5. rész – RAID konfigurálása Linux-on

Bevezetés

Linux alatt az mdadm segédprogram áll rendelkezésünkre RAID kötetek létrehozására és menedzselésére. A Linux MD RAID megvalósítása nem tekinthető szabványos RAID megvalósításnak. Szerencsére nem azért, mert túl keveset tudna, hanem éppen ellenkezőleg, több és rugalmasabb megvalósítást nyújt, mint a szabványos megoldások. Ilyenek például a nested RAID-ok (pl. RAID 10) létrehozása, az adatvesztés nélküli online átméretezés, vagy éppen a dinamikus konfiguráció, ami lehetővé teszi a RAID tömb konfigurációjának módosítását a tömb létrehozása után.

A RAID konfigurálásához több háttértároló eszközzel kell rendelkeznünk. A legkönnyebben akkor járunk el, ha az alábbi példákat virtuális környezetben próbáljuk ki. Az alap Ubuntu rendszerünk a /dev/sda eszközre van telepítve, RAID tömbbe pedig az sdb, sdc, sdd és sde eszközöket fogjuk kapcsolni.


RAID tömbök létrehozása

RAID 0 tömb létrehozása, felcsatolása

Ahhoz, hogy RAID 0 tömböt hozzunk létre, legalább 2 lemezzel kell rendelkeznünk. Ehhez most a /dev/sdb és a /dev/sdc eszközöket használjuk. Még nem hoztunk rajtuk létre fájlrendszert.

root@server:~# lsblk /dev/sd[b-c]
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdb      8:16   0  20G  0 disk
sdc      8:32   0  20G  0 disk

Hozzuk létre a RAID 0 tömböt belőlük. A parancs könnyen értelmezhető: A –create írja elő a tömb létrehozását, a –verbose miatt részletes információkat ír ki a képernyőre, míg a –level után adjuk meg a RAID szintjét. A –raid-devices írja elő, hogy 2 eszközt használunk fel, utána adjuk meg az eszközöket. A RAID tömbünk pedig a /dev/md0 eszközön keresztül érhető el:

root@server:~# mdadm --create --verbose /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc
mdadm: chunk size defaults to 512K
mdadm: partition table exists on /dev/sdb
mdadm: partition table exists on /dev/sdb but will be lost or
       meaningless after creating array
mdadm: partition table exists on /dev/sdc
mdadm: partition table exists on /dev/sdc but will be lost or
       meaningless after creating array
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

Először tájékoztatás kapunk a csík egység méretéről (ez a chunk size), figyelmeztet az adatvesztésre, és megerősítés után létrehozza a tömböt, mely a /dev/md0 eszközön keresztül érhető el. Nézzük meg ismét az lsblk parancs kimenetét. Már láthatjuk az md0 RAID tömbünket:

root@server:~# lsblk /dev/sd[b-c]
NAME  MAJ:MIN RM SIZE RO TYPE  MOUNTPOINTS
sdb     8:16   0  20G  0 disk
└─md0   9:0    0  40G  0 raid0 /mnt/adatok1
sdc     8:32   0  20G  0 disk
└─md0   9:0    0  40G  0 raid0 /mnt/adatok1

Ezután már csak létre kell hozni az eszközön a fájlrendszert, majd be kell csatolnunk a kötetet:

root@server:~# mkfs.ext4 /dev/md0

Az lsblk parancsot a -fs kapcsolókkal futtatva láthatjuk, hogy a tömb mely lemezekből áll, milyen típusú fájlrendszer van létrehozva rajta, mekkora a kapacitása, ebből mennyi van elhasználva, valamint hová van felcsatolva. Vegyük észre, hogy a két lemez azonosítója (UUID) ugyanaz, mivel ugyanahhoz a RAID tömbhöz tartoznak.

NAME  FSTYPE            FSVER LABEL    UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
md0   ext4              1.0            5dba3123-3e6d-4b3a-aa08-ff7e68bd9a23     37G     0% /mnt/adatok1
├─sdb linux_raid_member 1.2   server:0 fbdcaf31-aa54-531c-b73f-529576cf8eab
└─sdc linux_raid_member 1.2   server:0 fbdcaf31-aa54-531c-b73f-529576cf8eab
root@server:~# mount /dev/md0 /mnt/adatok1

Ellenőrizzük le, hogy mekkora szabad hely áll rendelkezésünkre a RAID eszközünkön. Mivel RAID 0-t használunk, a két lemez kapacitása összeadódik.

root@server:~# df -h /dev/md0
Filesystem      Size  Used Avail Use% Mounted on
/dev/md0         40G   24K   38G   1% /mnt/adatok1

A RAID kötet felcsatolásával van egy kis gond. A Linux dinamikus névrendszert (Dynamic Kernel Device Management) alkalmaz, amikor meghatározza egy eszköz sorszámát. Ha új lemezt építünk a rendszerbem vagy eltávolítunk egyet, ez a sorszám megváltozhat. RAID esetén ehhez elég akár egy rendszer újraindítás is. (Például hiába adtunk meg md0 eszköznevet, a következő újraindításnál szinte biztos, hogy másikkal találkozunk.) Ez manuális csatolásnál még nem okoz nagy gondot, de ha automatikus csatolást szeretnénk az fstab fájlon keresztül, akkor valamilyen állandóbb azonosítót kellene keresnünk, ez pedig az UUID (Universally Unique Identifier, Egyetemesen Egyedi Azonosító) lesz, hiszen ennek éppen az a szerepe, hogy az eszköz teljes élettartama alatt ugyanazzal az azonosítóval érjük el. Kérdezzük le a RAID tömbünk azonosítóját:

root@server:~# lsblk -o name,uuid | grep md
└─md0                   a5a50972-8e85-4458-b4ac-69eae58bea4a
└─md0                   a5a50972-8e85-4458-b4ac-69eae58bea4a

Majd ezzel csatoljuk fel a tömböt. (Persze le kell csatolni előtte.)

root@server:~# mount UUID=a5a50972-8e85-4458-b4ac-69eae58bea4a /mnt/adatok1

Ha automatikus felcsatolást szeretnénk, az fstab-ba helyezzük ezt a sort, majd indítsuk újra a rendszert:

/dev/disk/by-uuid/a5a50972-8e85-4458-b4ac-69eae58bea4a /mnt/adatok1 ext4 defaults 0 0

RAID 1 tömb létrehozása

Készítsünk most egy RAID 1-es tömböt. A RAID 1 tömb létrehozása hasonlóan történik a RAID 0-hoz, csak most 1-es szintet adunk meg. Mivel a RAID 1 tükrözést használ, a tömb teljes kapacitása megegyezik az egyik lemez kapacitásával.

root@server:~# mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
mdadm: size set to 20954112K
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

Nézzük meg a tömb adatait nem sokkal a létrehozása után:

root@server:~# cat /proc/mdstat
Personalities : [raid0] [linear] [multipath] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdc[1] sdb[0]
      20954112 blocks super 1.2 [2/2] [UU]
      [========>............]  resync = 42.9% (9003776/20954112) finish=0.9min speed=200053K/sec

Nézzük meg újra:

root@server:~# cat /proc/mdstat
Personalities : [raid0] [linear] [multipath] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdc[1] sdb[0]
      20954112 blocks super 1.2 [2/2] [UU]
      [==============>......]  resync = 74.4% (15604608/20954112) finish=0.4min speed=205921K/sec

Látható, hogy a lemezek adatszinkronizálása éppen folyamatban van. Az első lekérdezésnél 42.9%-nál, míg a másodiknál 74.4%-nál tartott. A parancs kimenetéből a szinkronizálás hátralévő ideje (finish=0.9min) és sebessége (speed=200053K/sec) is leolvasható. (Itt virtuális környezetben dolgozunk, valós hardveren persze lényegesen tovább tarthat a folyamat.) Ha befejeződik a szinkronizálás, a már korábban megszokott eredményt kapjuk:

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

Nagyon fontos, hogy bármilyen további művelet esetén mindig várjuk meg, amíg a szinkronizáció befejeződik, mivel azelőtt hibás adatokkal dolgoznánk tovább.

A szokásos módon hozzuk létre a fájlrendszert a tömbön, majd csatoljuk is fel:

root@server:~# mkfs.ext4 /dev/md0
root@server:~# mount /dev/md0 /mnt/adatok1

RAID 5 tömb létrehozása

Ahhoz, hogy létrehozzunk egy RAID 5 tömböt, legalább 3 lemezzel kell rendelkeznünk. Legyen ez az sdb, sdc és sdd. A parancsot a már megszokott módon kell kiadnunk:

root@server:~# mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd

A tömb létrehozása itt is időbe telik az adatszinkronizálás miatt:

root@server:~# cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md0 : active raid5 sdd[3] sdc[1] sdb[0]
      41908224 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]
      [========>............]  recovery = 41.2% (8651100/20954112) finish=1.0min speed=191067K/sec

RAID 6 tömb létrehozása

RAID 6 tömbhöz már legalább 4 lemezre van szükségünk. A tömböt létrehozó parancsban nincsen semmi meglepő:

root@server:~# mdadm --create --verbose /dev/md0 --level=6 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde
root@server:~# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10]
md0 : active raid6 sde[3] sdd[2] sdc[1] sdb[0]
      41908224 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/4] [UUUU]
      [==>..................]  resync = 13.2% (2766428/20954112) finish=1.4min speed=212802K/sec

Itt is meg kell várnunk, míg a szinkronizáció befejeződik, utána már létrehozhatjuk rajta a fájlrendszert, majd felcsatolhatjuk.


RAID 10 tömb létrehozása

Hozzunk létre 4 lemezből egy RAID 10-es tömböt.

root@server:~# mdadm --create --verbose /dev/md0 --level=10 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde

Természetesen itt is meg kell várnunk a szinkronizációt:

root@server:~# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10]
md0 : active raid10 sde[3] sdd[2] sdc[1] sdb[0]
      41908224 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
      [=>...................]  resync =  6.2% (2600704/41908224) finish=3.0min speed=216725K/sec

A Linux MD megengedi, hogy RAID 10 esetén befolyásoljuk az egyes csík-egységek egymáshoz viszonyított helyzetét a lemezeken. 3 féle elrendezés közül választhatunk: near (közeli), far (távoli) és offset. A „távoli, far” elrendezés ott mutat jobb teljesítményt, ahol az olvasás gyakrabban történik, mint az írás. Ezeket az elrendezéseket azonban forgó lemezek (vagyis hagyományos HDD-kre) dolgozták ki, a ma használatos SSD-k esetén nem érdemes eltérni az alapértelmezett elrendezéstől, még csökkent teljesítményt is eredményezhetnek. Ha mégis át akarjuk állítani, nézzünk utána a –layout opciónak.


RAID tömb ellenőrzése

Hozzunk létre egy RAID 0 tömböt az előzőek szerint, és vizsgáljuk meg. Erre számos lehetőségünk van. A /proc/mdstat fájl tartalmának megjelenítésével például a Linux által kezelt RAID tömbökről kérhetünk le adatokat:

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

unused devices: <none>

A parancs kimenetéről a következő információk olvashatók ki: A támogatott RAID szintek (linear, multipath, raid0, raid1, raid6, raid5, raid4 és raid10), a Linux által kezelt RAID tömb eszköze (md0), és azok az eszközök, amelyekből ez felépül (sdc és sdb), a blokkok száma (4190822), és a csík mérete (512k).

Egy adott tömbről részletesebb információt az mdadm paranccsal is lekérdezhetünk:

root@server:~# mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Fri Jul 28 13:10:03 2023
        Raid Level : raid0
        Array Size : 41908224 (39.97 GiB 42.91 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Fri Jul 28 13:10:03 2023
             State : clean
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

            Layout : -unknown-
        Chunk Size : 512K

Consistency Policy : none

              Name : server:0  (local to host server)
              UUID : b72f674c:e27866a1:05e361a5:ed8d60ad
            Events : 0

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc

A parancs kimenetéből számos más információ mellett kiolvasható, hogy hány eszköz aktív és működőképes a tömbön belül, és hányan hibásak vagy tartalék állapotban vannak. Az egyik legfontosabb információ a tömb állapota (State), ami itt most Clean, ami a hibamentes működést jelzi. A RAID tömb sokféle állapotot vehet föl, nézzünk meg közülük párat: A clean állapotnak megfelelő normál működést jelez az active (aktív) állapot is. Az inactive (inaktív) állapot esetén a tömb nem érhető el, nem fut. Degraded (lecsökkent) állapotú, amikor valamelyik meghajtója meghibásodik, a Recovering (helyreállítás), amikor egy hibás meghajtót kicserélünk, és újjáépíti az adatokat, míg a Syncing (szinkronizált), amikor új meghajtót adunk a tömbhöz, és a rendszer éppen szinkronizálja az adatokat az új meghajtóval. A Reshape (átformál) állapotban a tömb méretének vagy más konfigurációs paraméterének a megváltoztatását hajtja végre.

Amennyiben csak a létrehozott RAID tömbök listájára vagyunk kíváncsiak, így futtassuk a parancsot. Ennek a parancsnak a kimenete a későbbiekben még fontos lesz!

root@server:~# mdadm --detail --scan
ARRAY /dev/md0 metadata=1.2 name=server:0 UUID=b72f674c:e27866a1:05e361a5:ed8d60ad

Ha egy adott lemez RAID tömbben elfoglalt szerepéről szeretnénk információkat lekérdezni, az –examine kapcsolót használjuk. (Ez az adott lemez meta-adatait listázza ki, melyekből a tömb újraépíthető. A későbbikben majd látjuk, hogyan.)

root@server:~# mdadm --examine /dev/sdb
/dev/sdb:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : b72f674c:e27866a1:05e361a5:ed8d60ad
           Name : server:0  (local to host server)
  Creation Time : Fri Jul 28 13:10:03 2023
     Raid Level : raid0
   Raid Devices : 2

 Avail Dev Size : 41908224 sectors (19.98 GiB 21.46 GB)
    Data Offset : 34816 sectors
   Super Offset : 8 sectors
   Unused Space : before=34736 sectors, after=0 sectors
          State : clean
    Device UUID : 472a63b7:a47ef0ff:734b1c5f:f7f7ed07

    Update Time : Fri Jul 28 13:10:03 2023
  Bad Block Log : 512 entries available at offset 8 sectors
       Checksum : 7ad6ada4 - correct
         Events : 0

     Chunk Size : 512K

   Device Role : Active device 0
   Array State : AA ('A' == active, '.' == missing, 'R' == replacing)

A parancs kimenetéből kiolvasható például, hogy RAID 0 tömb része (Raid Level: raid0), 2 eszköz alkotja a RAID tömböt (Raid Devices: 2), és mindkét eszköz aktívan részt vesz a tömbben (Array Satet: AA). A mágikus számból (Magic: a92b4efc) az operációs rendszer anélkül, hogy elemezné a RAID struktúrát, megállapíthatja, hogy egy RAID 0 tömbbel áll szemben. (Ha RAID 1 lenne, akkor ez a mágikus szám a 6b90b1a8 értéket venné fel.) A tömbben az adott lemez hibamentesen működik (State: Clean).

Lehetőség van egy RAID tömb működését folyamatosan nyomon kísérni. A parancs hatására egy a háttérben futó folyamat a RAID tömb egyes eseményeiről küld üzenetet konfigurációjától függően akár a naplóba, akár a képernyőre, akár egy megadott email címre.

root@server:~# mdadm --monitor --daemonize --scan
1205

Az mdadm konfigurációs fájl

Az mdadm program konfigurációs fájlja a /etc/mdadm/mdadm.conf, mely többek között tartalmazza a RAID tömbök konfigurációját. A fájl célja, hogy egyrészt meghatározza, milyen RAID tömböket tartalmaz a rendszerünk, az mdadm működéséhez is tartalmaz beállításokat. Noha az mdadm programmal létrehozott RAID tömbök a rendszer újraindításakor megmaradnak és használhatóak, célszerű ebbe a konfigurációs fájlba is felvenni a tömbök adatit. Ez a következő előnyökkel jár:

  • Rendszerindításkor a konfigurációs fájlból vett adatok alapján az mdadm képes a RAID tömböket újraépíteni.
  • A fájl olyan tartalék információkat tartalmaz, mint például az eszközök sorrendje és típusa, amelyek alapján az eszköznevek megváltozása esetén is képes az mdadm a RAID tömb helyreállítására.
  • A fájlban található RAID konfigurációs adatok alapján a rendszergazdák egyszerűbben képesek a tömböket kezelni, mivel a parancsok rövidített formáit használhatják. (A hiányzó konfigurációkat a konfigurációs fájlból veszi a program.) Ezáltal a hibalehetőségek is lényegesen csökkennek.

A korábban létrehozott RAID 0 tömbünket például ez a sor írja le a fájlban:

ARRAY /dev/md0 metadata=1.2 name=server:0 level=raid0 num-devices=2 UUID=5dba3123-3e6d-4b3a-aa08-ff7e68bd9a23

Az itt található adatokat (eszköz neve, meta-data verzió, stb.) a korábban már megismert mdadm –detail /dev/md0 parancs kimenetéből olvashatjuk ki, illetve emlékezzünk vissza az mdadm –detail –scan parancs kimenetére, az ennek egy rövidített formáját adja vissza. Ha átirányítjuk a tee parancsba, akkor automatikusan beírhatjuk a konfigurációs fájl végére:

root@server:~# mdadm --detail --scan | tee -a /etc/mdadm/mdadm.conf

Ha jobban megnézzük a RAID tömböt leíró sort, azt vehetjük észre, hogy az nem tartalmazza, mely lemezekből épül fel a tömb. Ez azért van, mert az mdadm, azt hogy mely lemezek milyen RAID tömbben szerepelnek, az egyes lemezek meta-adataiból nyeri ki, amelyeket korábban az mdadm –examine paranccsal kérdezhettünk le. A konfigurációs fájlban ugyan elhelyezhető egy DEVICE sor, amelyben azokat a lemezeket sorolhatjuk fel, amelyek között kereshet. (Vigyázzunk arra, hogy az egyes eszközök neve változhat a rendszerben például akkor, ha új eszközt adunk hozzá.) Az alábbi sor például azt jelenti, hogy az mdadm eszköztár a RAID tömbök keresésekor az összes /dev/sd kezdetű eszköznevet figyelembe veszi, amelyeket a b, c, d, …, m, n, o, p karakterekkel kezdesz, és utána bármilyen más karakter következik. Az ilyen mintára illeszkedő eszköznevek között szerepelhet például /dev/sdb, /dev/sdc, /dev/sdd és így tovább.

DEVICE /dev/sd[bcdefghijklmnop]*

Ha például azt szeretnénk, hogy csak az sdb, sdc és sdd lemezek között keressen így írjuk be a DEVICE sort:

DEVICE /dev/sdb /dev/sdc /dev/sdd

Nagyon fontos, hogy csak akkor generáljuk le az mdadm.conf állományba egy RAID tömböt leíró sort, ha a tömb szinkronizációja már befejeződött.

A cikkben szereplő példákban közvetlenül root felhasználóként bejelentkezve adjuk ki a parancsokat azért, hogy az állandó sudo használata ne vonja el a figyelmet magáról a parancsok használatáról. Felhívjuk a figyelmet viszont arra, hogy éles rendszerekben biztonsági szempontokból a sudo használata erősen ajánlott!

This will close in 20 seconds