BTRFS RAID 1 csatolási probléma (láma)

Fórumok

Most ismerkedem a BTRFS fájlrendszerrel. Létrehoztam belőle egy kétlemezes RAID 1-et. Szerencsére az egyik lemez fizikailag sérült volt, így ki kellett vennem. Legalább találkozom ilyen helyzettel is.

A RAID 1 a cserére várva is elindult, működött, de mivel még csak tanulom, érdemi feladata nem volt, lekapcsoltam.

Most azonban, hogy megjött az új lemez, már csak RO módban tudom felcsatolni a fájlrendszert, de így sem az add, sem a replace művelet nem hajtódik végre. Pedig a csatoláci opciók között ott van a degraded.

A /dev/sda lemezt szeretném visszahelyezni. A 

btrfs replace start 1 /dev/sda /storage

parancs hiba nélkül lefut, de nem történik semmi. A dmesg kimenete:

[ 2168.491798] BTRFS info (device sdb): first mount of filesystem 7c471fa3-1f8e-4ac8-9f36-2104ec8274b8
[ 2168.491837] BTRFS info (device sdb): using crc32c (crc32c-intel) checksum algorithm
[ 2168.491852] BTRFS info (device sdb): allowing degraded mounts
[ 2168.491860] BTRFS info (device sdb): enabling all of the rescue options
[ 2168.491862] BTRFS info (device sdb): ignoring data csums
[ 2168.491864] BTRFS info (device sdb): ignoring bad roots
[ 2168.491867] BTRFS info (device sdb): disabling log replay at mount time
[ 2168.491873] BTRFS warning (device sdb): 'nologreplay' is deprecated, use 'rescue=nologreplay' instead
[ 2168.491877] BTRFS error (device sdb): nologreplay must be used with ro mount option
[ 2168.491927] BTRFS error (device sdb): open_ctree failed: -22
[ 2537.132936] BTRFS info (device sdb): first mount of filesystem 7c471fa3-1f8e-4ac8-9f36-2104ec8274b8
[ 2537.132971] BTRFS info (device sdb): using crc32c (crc32c-intel) checksum algorithm
[ 2537.132985] BTRFS info (device sdb): use zstd compression, level 3
[ 2537.132991] BTRFS info (device sdb): allowing degraded mounts
[ 2537.132994] BTRFS info (device sdb): using free space tree
[ 2537.134688] BTRFS warning (device sdb): devid 1 uuid 550c778e-933c-4a97-9485-ff2c2b092f6f is missing
[ 2537.135575] BTRFS info (device sdb): bdev /dev/sdb errs: wr 0, rd 0, flush 0, corrupt 3, gen 4
[ 2537.136754] BTRFS warning (device sdb): chunk 6640631808 missing 1 devices, max tolerance is 0 for writable mount
[ 2537.136761] BTRFS warning (device sdb): writable mount is not allowed due to too many missing devices
[ 2537.137195] BTRFS error (device sdb): open_ctree failed: -22
[ 2936.561455] BTRFS info (device sdb): first mount of filesystem 7c471fa3-1f8e-4ac8-9f36-2104ec8274b8
[ 2936.561487] BTRFS info (device sdb): using crc32c (crc32c-intel) checksum algorithm
[ 2936.561501] BTRFS info (device sdb): use zstd compression, level 3
[ 2936.561506] BTRFS info (device sdb): allowing degraded mounts
[ 2936.561509] BTRFS info (device sdb): using free space tree
[ 2936.562840] BTRFS warning (device sdb): devid 1 uuid 550c778e-933c-4a97-9485-ff2c2b092f6f is missing
[ 2936.563670] BTRFS info (device sdb): bdev /dev/sdb errs: wr 0, rd 0, flush 0, corrupt 3, gen 4

Eddig a műokosra támaszkodtam, de már ott tart, hogy mentsek le mindent és hozzam létre újra a RAID 1-et, ami azért vicces megoldás.

Meg tudja valaki mondani, hogy ilyen helyzetben hogyan lehet életrekelteni egy RAID 1-et? Igaziból azt hiszem az a kérdés, hogy RW módban hogyan tudom felcsatolni, hisz ha ez egy éles üzemben történik, és még nincs cserelemez, a rendszernek akkor is mennie kellene.

Hozzászólások

Szerintem az újnak más az uuid-je, ezért nem találja, először távolítsd el a hiányzót, majd add hozzá az újat.

Ezt próbáld ki:

  1. btrfs device remove missing /storage
  2. btrfs device add /dev/sda /storage
  3. btrfs balance start /storage

mount -o degraded,rw /dev/sdb /storage:

mount: /storage: wrong fs type, bad option, bad superblock on /dev/sdb, missing codepage or helper program, or other error.
       dmesg(1) may have more information after failed mount system call.

A "btrfs check --readonly /dev/sda" parancsot nem is értem, hisz az sda meghajto fizikailag tönkrement, most egy teljesen új van helyette, arról ugye sokat nem fog tudni mondani:

Opening filesystem to check...
No valid Btrfs found on /dev/sda
ERROR: cannot open file system

A "btrfs filesystem show /storage" parancsot pedig csak RO mount után tudtam futtatni:

Label: 'STORAGE'  uuid: 7c471fa3-1f8e-4ac8-9f36-2104ec8274b8
        Total devices 2 FS bytes used 1.49GiB
        devid    1 size 0 used 0 path  MISSING
        devid    2 size 10.91TiB used 3.03GiB path /dev/sdb

Amit igazán az ok mögé sejtett a műokos, hogy a "btrfs filesystem df /storage/" kimenetében van "single" és "RAID1" is, és hiába 0B a single, ha van.

Data, RAID1: total=2.00GiB, used=1.44GiB
System, single: total=32.00MiB, used=0.00B
System, RAID1: total=32.00MiB, used=16.00KiB
Metadata, RAID1: total=1.00GiB, used=56.73MiB
GlobalReserve, single: total=5.50MiB, used=0.00B
WARNING: Multiple block group profiles detected, see 'man btrfs(5)'
WARNING:    System: single, raid1

mount: /storage: wrong fs type, bad option, bad superblock on /dev/sdb, missing codepage or helper program, or other error.       
dmesg(1) may have more information after failed mount system call.

Ahogy írja is, jó volna ezután a dmesg kimenete. Valami baja lett a fájlrendszernek.

Egyébként már a replace logban is látszik, hogy hibás az sdb is:
bdev /dev/sdb errs: ... corrupt 3, gen 4

Amit igazán az ok mögé sejtett a műokos, hogy a "btrfs filesystem df /storage/" kimenetében van "single" és "RAID1" is.

Az enyém ezt írja:

Miért lehet "single, raid1" egyszerre?

Ez tipikusan akkor történik, ha:

  • régen single-ként indult a FS
  • később lett RAID1-re konvertálva
  • disk csere / replace / degraded állapot volt
  • balance nem futott le teljesen

A System blokkok nem mindig konvertálódnak automatikusan.

Vélhetően a single a meghibásodott lemezen volt, ami így elveszett:

Ezt próbálhatod még meg:

mount -o degraded,rw,rescue=all,clear_cache /dev/sdb /storage

Ui.: Az, hogy mind a két diszk hibás lett, az gyakran RAM vagy controller hiba következménye.

Ezek szerint, ha Te kiveszed az egyik lemezt, a másikat többször is fel tudod RW-re mountolni, és minden esetben tudsz is rá írni?

Akkor lehet, hogy az volt a különbség, hogy nálam az sda lemezt azért kellett kivenni, mert döglődött, és emiatt kreülhetett fel rá SINGLE is a RAID mellé?

Összességében ez azért nem megnyugtató.

Ezek szerint, ha Te kiveszed az egyik lemezt, a másikat többször is fel tudod RW-re mountolni, és minden esetben tudsz is rá írni?

Most teszt kedvéért csak image fájlban vannak a "lemezek", de igen, bármennyiszer "kivehetem", rw módban írhatok rá, törölhetek és nem lesz single rajta.

Akkor lehet, hogy az volt a különbség, hogy nálam az sda lemezt azért kellett kivenni, mert döglődött, és emiatt kreülhetett fel rá SINGLE is a RAID mellé?

Nem az volt, hogy single fájlendszerrel indítottál és azt alakítottad át raid1 -gyé?

Így hoztad létre a fájlrendszeredet?

mkfs.btrfs -d raid1 -m raid1 /dev/sda /dev/sdb

Kipróbáltam az új mount parancsot. A hibaüzenet ugyanaz, amint eddig. A dmesg tartalma:

[   25.450048] BTRFS info (device sdb): first mount of filesystem 7c471fa3-1f8e-4ac8-9f36-2104ec8274b8
[   25.450077] BTRFS info (device sdb): using crc32c (crc32c-intel) checksum algorithm
[   25.450088] BTRFS info (device sdb): allowing degraded mounts
[   25.450094] BTRFS info (device sdb): enabling all of the rescue options
[   25.450096] BTRFS info (device sdb): ignoring data csums
[   25.450098] BTRFS info (device sdb): ignoring bad roots
[   25.450100] BTRFS info (device sdb): disabling log replay at mount time
[   25.450103] BTRFS info (device sdb): force clearing of disk cache
[   25.450105] BTRFS error (device sdb): nologreplay must be used with ro mount option
[   25.450168] BTRFS error (device sdb): open_ctree failed: -22

Érdekes módon, ha újra kiadom a mount parancsot, egy sorral több szerepel a dmesg elején:

[  204.615477] BTRFS: device label STORAGE devid 2 transid 383 /dev/sdb scanned by mount (870)
[  204.615959] BTRFS info (device sdb): first mount of filesystem 7c471fa3-1f8e-4ac8-9f36-2104ec8274b8
[  204.615998] BTRFS info (device sdb): using crc32c (crc32c-intel) checksum algorithm
[  204.616016] BTRFS info (device sdb): allowing degraded mounts
[  204.616025] BTRFS info (device sdb): enabling all of the rescue options
[  204.616029] BTRFS info (device sdb): ignoring data csums
[  204.616033] BTRFS info (device sdb): ignoring bad roots
[  204.616036] BTRFS info (device sdb): disabling log replay at mount time
[  204.616041] BTRFS info (device sdb): force clearing of disk cache
[  204.616045] BTRFS error (device sdb): nologreplay must be used with ro mount option
[  204.616111] BTRFS error (device sdb): open_ctree failed: -22

Amúgy a két lemez azért ment tönkre, mert a csomagszállító ledobta vagy valami hasonló brutálisat művelt vele. Az egyiken még a horpadás is látszott. Az új két lemez egyelőre nem úgy tűnik, mintha menne tönkre, így remélem, mégsem vezérlő vagy RAM.

Egyetlen technikailag értelmes próbálkozás van még:

Csak nologreplay, nem rescue=all

mount -o degraded,rw,rescue=nologreplay /dev/sdb /mnt

Ha ez sem megy, akkor:

Próbáld explicit ro nélkül, de rescue nélkül

mount -o degraded,rw,clear_cache /dev/sdb /mnt

Ha ezek sem mennek, akkor nem marad más, mint az ro mount, mentés és visszaállítás.

Ez egy teszt környezet. Rögtön RAID-nek hoztam létre az

mkfs.btrfs -f -d raid1 -m raid1 /dev/sda /dev/sdb

paranccsal. A fenti két mount egyike sem segített.

El van téve pár régebbi kimenete a 

btrfs filesystem usage /storage

parancsnak.

A RAID létrehozása után még nincs single.

Majd kivettem az egyik meghajtót, és úgy írtam a RAID-re. Akkor a kimenetben megjelent a 

System,single: Size:32.00MiB, Used:16.00KiB (0.05%)
   /dev/sda<--->  32.00MiB

tartalom.

Aztán lefutott egy replace, akkor lett:

Metadata,single: Size:1.00GiB, Used:0.00B (0.00%)
   /dev/sdb<--->   1.00GiB

Majd utána egy balance, ami végére újra eltűnt a single blokk.

A másik lemez hibájánál csak annyiban tértem el ettől, hogy az új lemez behelyezése után a RAID-et RW-be felcsatolva nem indítottam el azonnal a replace parancsot, hanem leállítottam.

Számomra ez úgy tűnik, hogy tényleg az RW mountolások száma van korlátozva sérülés után, mint ahogy ezt fentebb írták is.

A kérdés szerintem az, létre lehet-e úgy hozni RAID1-et az új sda lemezen, hogy csak egy lemez van benne, de kezelje féllábú RAID 1-ként. Ha igen, és ezt RW-ben fel lehet csatolni, a másikat meg csak RO-ban, akkor végülis át lehet mindent másolni, majd a másikat betenni az új RAID 1 másik lábának.

Számomra ez úgy tűnik, hogy tényleg az RW mountolások száma van korlátozva sérülés után, mint ahogy ezt fentebb írták is.

Ez lehetséges, sérülés nélkül tetszőleges sokszor tudtam rw-be mountolni.

A kérdés szerintem az, létre lehet-e úgy hozni RAID1-et az új sda lemezen, hogy csak egy lemez van benne, de kezelje féllábú RAID 1-ként.

Szerintem nem lehet, de sima btrfs rendszernek igen, majd azt át lehet konvertálni raid1-gyé.

 Ha igen, és ezt RW-ben fel lehet csatolni, a másikat meg csak RO-ban, akkor végülis át lehet mindent másolni, majd a másikat betenni az új RAID 1 másik lábának.

A sima, üres btrfs-t fel tudod csatolni rw-be, oda átmásolod az ro-s részt, majd a sima btrfs mellé beteszel egy új, jó második lemez-t és hozzáadod a simához.

btrfs device add /dev/sdb /storage

Majd először a metadatát konvertálod át:

 btrfs balance start -mconvert=raid1 /storage

Majd az adatokat is:

btrfs balance start -dconvert=raid1 /storage

Elvileg ennyi.

Mivel semmit sem értek a btrfs-hez, azt mondanám, hogy teljes törlés után nulláról kellene kezdeni, de valami kevésbé fejlett (értsd: kiforrott) technológiával.

Szerintem eléggé fejlett (kiforrott) technológia.

A fenti story-ból az látszik, hogy vélhetően ez történhetett:

  • nem raid1 -ként lett eleve létrehozva, hanem egy sima btrfs fájlrendszerként (ezért van ott a single),
  • majd ez lett átalakítva raid1-gyé, egy másik lemez hozzáadásával,
  • a konverzió pedig nem ment le jól, mert közben lemez hiba történt, így megmaradt a single chunk,
  • ezzel pedig nem lehet utólag mit csinálni, ha kivételre került a hibás lemez, amin a single chunk van,

Átalakítás után meg kell nézni, hogy tényleg sikerült-e a konverzió (nincs single), 

btrfs filesystem df

ha nem, akkor ezt futtatni:

btrfs balance start -dconvert=raid1 -mconvert=raid1 -sconvert=raid1

Tehát ez az a fele a tükörnek, ami a szinkron izélés előtti,vagy az az utáni? Ha az az előtti (eredeti) fele, akkor a single rendben van, de tudnia kéne, hogy a tükör másik fele nem készült el rendben, tehát nem is kellene keresnie. Ha meg ez a fele az, amire nem készült el rendesen a szinkron, akkor mit keres rajta az az infó, hogy "de eredetileg nem tükör volt"? 
 

Ez az átállás közbeni probléma. Nem futott le rendesen, mivel hibás volt az a lemez, amelyiken a single is volt (mint kiderült a másik is).

Még akkor esetleg helyre lehetett volna kézzel hozni, ha balance-ot futtatnak, amivel a system single konvertálást elvégzik (befejezik, ami félbe maradt).

Ehelyett el lett távolítva, így nem is tudja most már helyrehozni.

Nem mondom, hogy ez teljesen rendben van így, biztosan meg lehetne oldani jobban is. Azt viszont nehéz elvárni, hogy két hibás lemezen jól működjön, miközben félig raid1 félig még single és az egyik fele (amelyiken a single is van) már el is lett távolítva.

Azaz user error is, hiszen a tükör nem lett kész, illetve a tükör sikeres elkészültét nem ellenőrizte... De a tükör "új" felén mit keres a "single" metaadat? Az mikor és miért kerül(t) oda? Ha a tényleges fájlrendszer "átment", szinkron izélődött volna, akkor a "single" ingó fölösleges, mi több, káros, ha meg nem ment át, akkor meg miért is kell ott ez az infó? Ez a diszk ugyanis sohasem volt szingli, már úgy "született" hogy volt neki párja... Ha meg az eredeti diszk hibás volt amúgy is, akkor a raid létrehozásának kellett volna ezerrel vilmáznia, (Wilmaaa! engedj be (Frédi)) hogy gond van a forrás oldalon... Tanulság: sz@r diszkről backup-ot csinálunk, nem raid tükröt - raid megoldástól (hw, dm, lvm, *fs, stb.) függetlenül. 

Nem egészen, mert nem ez az első btrfs-es topik itt a hupon. Az ilyesféle topikokból összeintegrálva alakult ki egy ilyen érzésem.

Megjegyzés: már az is rosszt érzést kelt bennem, ha egy terméknek rajongói vannak; vagy ha a termék nem csak termék, hanem egy mozgalom; vagy ha a termékben pont az a jó, hogy megkönnyítésképpen számos funkciót egyesít magában, neked mindössze szóról szóra meg kell tanulnod egy vastag kézikönyvet; vagy ha azt nevezik meg a termék előnyének, hogy jól használható lesz, mihelyt hozzáigazítottad a rendszeredet a termékhez. (Szerk: na bakker, most szépen leírtam, hogy mit gondolok a git-ről. Vagy a systemd-ről. Vagy rengeteg más csodatermékről.)

Az hogy a kotetkezelest es a filerendszert osszegyurtak az pont egy eloremutato racionalis fejlesztes, mert ket osszetartozo funkcio es igy sokkal hatekonyabb a (re)szinkronizacio. Azt sem lehet mondani erre, hogy egy ujkeletu otlet lenne, mert az AdvFs tobb mint 30eve tudja betonstabilan. Ha a compaq es hp nem tolja fullba a kretent, akkor lehet nem kene most bohockodni zfs/btrfssel. Szoval szerintem a systemd nem igazan jo pelda, mert abba olyan funkciokat gyurtak bele, amiknek alapvetoen az initrendszerhez semmi koze, es kezzelfoghato elony sem szarmazik abbol hogy nem maradt, tobb fuggetlen komponenskent meg a funkcionalitas.

Az lvm az teljesen jó megoldás - illendően minden komponens azt és csak azt csinálja, ami a feladata ... A fütyürüfs-be integrált raid meg médialejátszó, meg kisf.om az szerintem fölösleges bonyolítása a dolgoknak... Jó hogy nem raknak az fs-be mondjuk komplett SQL motort, hogy sql query-vel lehessen fájlokat és azok tartalmát kezelni... Oh, wait... 

A RAID fájlrendszerbe építése – mint a Btrfs esetében – több szempontból is előnyös a hagyományos, alatta lévő (pl. mdadm-es) RAID-hez képest. Pl.:

Tud a fájlrendszer a redundanciáról (end-to-end integritás)

A klasszikus felállás esetén a fájlrendszer nem tudja, hogy melyik blokk melyik lemezen van, és nem ellenőrzi, hogy a RAID valóban jó adatot ad vissza.

A Btrfs viszont:

  • minden blokkhoz checksumot tárol
  • olvasáskor ellenőrzi az adat épségét
  • ha hiba van, automatikusan a jó példányból javítja

Ez valódi end-to-end adatvédelem – nem csak lemezhibák ellen, hanem csendes bitflip (silent corruption) ellen is.

Finomabb RAID-kezelés (nem csak "mindent tükrözünk")

A Btrfs külön kezeli:

  • adat blokkok
  • metaadat blokkok

Például:

  • adat: RAID1
  • metaadat: RAID1c3 (három példány)

Ez nagyobb rugalmasság, mint a klasszikus RAID-szintek.

Online bővítés és átalakítás

A Btrfs egyik nagy előnye:

btrfs device add /dev/sdc /mnt btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt

Lehet:

  • új lemezt hozzáadni
  • RAID szintet menet közben változtatni
  • adatot újraosztani

Nem kell teljes újraépítés, mint sok hardveres vagy mdadm RAID-nél.