Technomorous

RAID v NetBSD

Sdílet: Twitter | Facebook | Google+

Dnes to bude tak trochu dlouhá pohádka na dobrou noc, ostatně já sám jsem tím také několik nocí strávil, takže je jen logické, že se chci podělit. Tak tedy: Jak jsem v NetBSD tvořil softwarové RAID pole. A pak znovu. A ještě jednou - a dokonce dvě.

Do svého pseudofileserveru jsem nacpal disků, co se jen vešlo. Jsou to všechno odpadní komponenty, které mi tu zbyly po několika nefunkčních počítačích: na data 2x 500 GB a 2x 250 GB SATA, k tomu 40 GB notebookový PATA disk na systém (pro NetBSD dobrý).

Mým původním plánem bylo vytvořit RAID přes první čtyři jmenované. K tomu mi ovšem chybělo několik drobností: vědět, co to je RAID, vědět, jak funguje RAIDframe v NetBSD a vědět, jak tyto znalosti použít dohromady. Zkusil jsem to co nejvíce offline, přeci jen unix-like systémy jsou proslulé funkční integrovanou nápovědou, takže jsem naťukal do ksh man raid a následně man raidctl a snad poprvé v životě přečetl nějakou manpage od začátku do konce. Co přesně který režim RAID znamená jsem si přečetl na Wikipedii a vybaven těmito pochybnými, rychle nabytými znalostmi jsem se do toho pustil.

První pokus proběhl úplně skvěle, jen jsem po zhruba deseti hodinách konfigurace a výpočtu parity zjistil, že výsledný RAID5 nemá dle mých předpokladů 1 TB, ale jen 750 GB. Znovu jsem si přečetl Wikipedii a pochopil - budu muset vytvořit RAID0 přes oba menší disky a následně RAID5 přes tři půlterové (2x fyzický, 1x RAID0). Nová konfigurace mi zabrala jen chvilku, následyý výpočet parity se ale zastavil na 16 % a dál nešel ani když venku byla bezmračná úplňková noc a já obětoval mrkev.

Intermezzo. Z úplně jiného soudku: Vždy, když jsem za posledních dvacet let měl problém s diskem, byla na tom disku písmena WD. V tomto počítači byly čtyři disky z pěti od Seagate a ten pátý se rozhodl umřít zrovna, když jsem přes něj dělal pole. Jaká dvě písmena na něm byla napsána, asi nedá moc práce uhodnout. Vyhodil jsem disk otevřeným oknem na déšť a mráz a nahradil jej 250GB PATA, který tu roky mám jako těžítko. Šlape bez potíží, je od Maxtoru.

Napotřetí se povedlo. Disky jsou sice připojeny různými řadiči a různými protokoly,ale funguje to. A teď tedy, jak na to?

V mé konfiguraci mají disky wd0 a wd1 kapacitu 500 GB (to jsou ale amatérské dekadické gigabajty, těch normálních, binárních je tam asi tak 465), wd2 a wd3 pak poloviční tedy 250 GB. Pokud to někoho zajímá, tak bootuju z wd4 - ano, až z toho úplně posledního disku, který počítač detekuje - takový jsem frajer. Disky byly z různých počítačů, které měly různé způsoby tabulek oddílů, nejlepší bylo tedy tabulky na nich úplně vymazat a vytvořit nové (X je v intervalu 0-3):

 dd if=/dev/zero of=/dev/rwdXd bs=8k count=128k
 fdisk -0ua /dev/rwdXd
 disklabel -r -e -I wdX

Konfigurace pole se pro RAIDframe zapisuje konfiguračního souboru ve formátu:

 START array
 # organizace pole 1x2 disky, 0 paritních
 1 2 0
 
 START disks
 # které diskové oddíly budou pro pole použity
 /dev/wd2e
 /dev/wd3e
 
 START layout
 # první hodnota: počet sektorů na stripe
 # poslední hodnota: režim RAID, zde RAID0
 64 1 1 0
 
 START queue
 # nastavení režimu a délky odbavovací fronty požadavků
 fifo 100

Tento konfigurační soubor se předhodí utilitě raidctl, která s jeho pomocí vytvoří zařízení raid0, tomu se následně musí přiřadit libovolné sériové číslo pole a vypočítat parita (zde žádná není příkaz také reálně nic nedělá):

 raidctl -C raid0.conf raid0
 raidctl -I 065536 raid0
 raidctl -iv raid0

Pole RAID0 je hotové a funkční, jak lze snadno ověřit:

 raidctl -p raid0
 /dev/rraid0d: Parity status: clean
 
 raidctl -s raid0
 Components:
            /dev/wd2e: optimal
            /dev/wd3e: optimal
 No spares.
 Component label for /dev/wd2e:
    Row: 0, Column: 0, Num Rows: 1, Num Columns: 2
    Version: 2, Serial Number: 65536, Mod Counter: 19
    Clean: No, Status: 0
    sectPerSU: 64, SUsPerPU: 1, SUsPerRU: 1
    Queue size: 100, blocksize: 512, numBlocks: 488395008
    RAID Level: 0
    Autoconfig: No
    Root partition: No
    Last configured as: raid0
 Component label for /dev/wd3e:
    Row: 0, Column: 1, Num Rows: 1, Num Columns: 2
    Version: 2, Serial Number: 65536, Mod Counter: 19
    Clean: No, Status: 0
    sectPerSU: 64, SUsPerPU: 1, SUsPerRU: 1
    Queue size: 100, blocksize: 512, numBlocks: 488395008
    RAID Level: 0
    Autoconfig: No
    Root partition: No
    Last configured as: raid0
 Parity status: clean
 Reconstruction is 100% complete.
 Parity Re-write is 100% complete.
 Copyback is 100% complete.

A teď ještě jednou to celé pro RAID5. Nejdříve tvorba oddílu na RAID0:

 fdisk -0ua /dev/rraid0d
 disklabel -r -e -I raid0

Pak konfigurace nového pole:

 START array
 1 3 0
 
 START disks
 /dev/raid0e
 /dev/wd0e
 /dev/wd1e
 
 START layout
 128 1 1 5
 
 START queue
 fifo 100

A nakonec inicializace:

 raidctl -C raid1.conf raid1
 raidctl -I 131072 raid1
 raidctl -iv raid1

Tady už je té parity docela dost a navíc je rozházená po všech diskách, takže to chvilku trvalo:

 08:41PM
          0% |                                 | ETA: 09:21:56 /
 08:52PM
          1%                                   | ETA: 10:44:54 -
 10:01PM
          9% |***                              | ETA: 11:59:56 |
 08:49AM
         85% |****************************     | ETA: 01:13:24 \
 11:02AM
         99% |*********************************| ETA: 00:00:01 -

Výsledkem je ale krásné úložiště, na které konečně můžu přesunout data ze všech svých starých SSD, flashdisků, dropboxů a PowerMacu G5 a udělat v nich pořádek:

 raidctl -p raid1
 /dev/rraid1d: Parity status: clean
 
 raidctl -s raid1
 Components:
          /dev/raid0e: optimal
            /dev/wd0e: optimal
            /dev/wd1e: optimal
 No spares.
 Component label for /dev/raid0e:
    Row: 0, Column: 0, Num Rows: 1, Num Columns: 3
    Version: 2, Serial Number: 131072, Mod Counter: 28
    Clean: No, Status: 0
    sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
    Queue size: 100, blocksize: 512, numBlocks: 976770944
    RAID Level: 5
    Autoconfig: No
    Root partition: No
    Last configured as: raid1
 Component label for /dev/wd0e:
    Row: 0, Column: 1, Num Rows: 1, Num Columns: 3
    Version: 2, Serial Number: 131072, Mod Counter: 28
    Clean: No, Status: 0
    sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
    Queue size: 100, blocksize: 512, numBlocks: 976770944
    RAID Level: 5
    Autoconfig: No
    Root partition: No
    Last configured as: raid1
 Component label for /dev/wd1e:
    Row: 0, Column: 2, Num Rows: 1, Num Columns: 3
    Version: 2, Serial Number: 131072, Mod Counter: 28
    Clean: No, Status: 0
    sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
    Queue size: 100, blocksize: 512, numBlocks: 976770944
    RAID Level: 5
    Autoconfig: No
    Root partition: No
    Last configured as: raid1
 Parity status: clean
 Reconstruction is 100% complete.
 Parity Re-write is 100% complete.
 Copyback is 100% complete.

A já jsem zase o něco chytřejší a NetBSD je mi zase o trochu sympatičtější. Když si poradí s takovýmhle bastlem, tak si poradí se vším.


Jméno
Web
E-Mail
Jsem člověk
Text komentáře

1. Tritol (4. února 2018, 6:02)
Zrovna raid zvládne cokoliv *nixového :-). Osobně jsem jednou použil bratra LVM na spojení několika malých starých disků do jednoho velkého. Problém je, ze čím více disků, tím je větší šance že nějaký umře. Pravda, v raidu se s tím obvykle dá ještě něco dělat, ale všespásné to taky není. U LVM to byla konečná (ale až po několika letech služby a nad nedůležitými daty).

2. Macek333 (6. února 2018, 8:41)
Nejsem v tomhle kovaný, ale docela by mě zajímalo, jak postupovat, až (nedejbože) lehne ten jeden 250G disk. To jako je třeba nejprve ten nový 250 dát zpět do RAID0 a pak teprve udělat scrubbing? Nebo to prostě (až to dožije), jen odkopíruješ a pojedeš v jiné skladbě?

3. Tritol (6. února 2018, 21:27)
[2] Nejspíš tak (přidat do RAID0 a pak scrubbing RAID5)

4. Logout (7. února 2018, 7:23)
[2][3] Beru to tak, že kdyby mi umřel jeden z disků RAID0 pole tak je to jako by umřel jeden z těch dvou větších. Takže bych podle okolností buď vyměnil tu 250 GB nebo pořídil rovnou 500 GB disk, symlinkul ho dočasně jako /dev/raid0 a uviděl, co to dělá.


TOPlist