Linux Soft RAID

Z HKfree wiki
Skočit na navigaci Skočit na vyhledávání

Vytvoření soft RAIDu

Na Linuxu je nejběžněji pro operace s RAID polem používána aplikace mdadm, tento návod na vytvoření a provoz RAID pole je tudíž s použitím mdadm. Celý návod je psán pro Linux distribuci Debian.

Při instalaci systému

Vytvoření RAID pole při instalaci systému je celkem samovysvětlující, postup je popsán zde: Installing Debian Etch with Raid1 and LVM

Na běžícím systému

Pro příklad bereme situaci, že máme již nainstalovaný systém a další dva prázdné disky na kterých chceme vytvořit RAID pole typu 1 (RAID1) neboli zrcadlení.

Instalace mdadm

Pokud už ji v systému nemáme musíme si nainstalovat aplikaci mdadm:

apt-get update
apt-get install mdadm

Instalátor se nás zeptá co chceme v systému použít za pole, můžeme nechat základoní položku "all" ze začátku nejsou definovaná žádná pole, takže se nic nestane.

Příprava oddílů

Díle si na discích, zamýšlených pro vytvoření pole, připravíme oddíly tak jak je chceme, na to se dá použít aplikace fdisk, se kterou se dají nastavit oddíly velice přesně, s diskovým prostorem si lze hrát až na úroveň jednotlivých sektorů, ale není příliš uživatelsky přívětivá, je jednodušší použít cfdisk.

                                  cfdisk (util-linux-ng 2.17.2)
                                      Disk Drive: /dev/sda
                               Size: 251059544064 bytes, 251.0 GB
                      Heads: 255   Sectors per Track: 63   Cylinders: 30522
   Name           Flags         Part Type     FS Type             [Label]            Size (MB)
-------------------------------------------------------------------------------------------------
                                 Pri/Log      Free Space                                  1.05   *
   sda1                          Primary      Linux raid autodetect                    9999.23   *
   sda2                          Primary      Linux raid autodetect                   59999.52   *
   sda3                          Primary      Linux raid autodetect                  180002.03   *
                                 Pri/Log      Free Space                               1050.19   *
     [   Help   ]  [   New    ]  [  Print   ]  [   Quit   ]  [  Units   ]  [  Write   ]

Velikosti oddílů si vytvoříme podle úvážení, důležité je každému oddílu změnit typ na "Linux raid autodetect", v menu položka "Type", kde hodnota se použije "fd" což právě odpovídá zmíněnému Linux raid autodetect, nakonec uložíme změny položkou menu "Write" a potvrdíme, že opravdu chceme změny na disk uložit, data na disku budou samozřejmně ztracena.

Toto provedeme s oběma disky, oddíly vytváříme tak, aby na obou discích měly stejnou velikost, není to bezpodmínečně nutné, pole by využilo velikost nejmenšího z oddílů, ale proč mít oddíly různě velké, není k tomu důvod. Za druhé nevytváříme oddíly přes celý disk, ale necháme si na konci disku volné místo "pro únik", disky různých výrobců nebo různých řad disků u jednoho výrobce totiž nejsou na bajty stejně velké i když jsou označené stejnou velikostí např. 1TB, vždy si nechte ke konci disku alespoň pár desítek MB místa pro případnou výměnu za jiný disk, který by mohl být o nějaký ten bajt menší.

Příklad: výcuc z fdisk:

Disk /dev/sda: 251.0 GB, 251000193024 bytes
Disk /dev/sdb: 251.1 GB, 251059544064 bytes

v obou případech by se mělo jednat o 250GB disk, ale velikost je rozdílná, jde i o stejného výrobce, pouze o jinou verzi disku: WD RE3 vs. WD RE4

Vytvoření pole

Berme v úvahu, že oddíly připravené pro pole jsou /dev/sda1 a /dev/sdb1, chceme vytvořit RAID1 ze dvou aktivních disků, žádný jako náhradní (spare) a pole se má jmenovat md0, provedeme to následovně:

mdadm -v --create /dev/md0 --level=raid1 --raid-devices=2 /dev/sda1 /dev/sdb1

Pole se ihned začne vytvářet a my se můžeme podívat co se děje: http://wiki.hkfree.org/Linux_Soft_RAID#soubor_.2Fproc.2Fmdadm

Než synchronizace disku skončí upravíme konfigurační soubor /etc/mdadm/mdadm.conf, obohatíme ho o nově vytvořené pole a to to tak že info o RAID svazku přidáme do konfiguračního souboru:

mdadm --examine --scan --config=mdadm.conf >> /etc/mdadm/mdadm.conf

Vytvoření FS nad polem

Nyní potřebujeme vytvořit na poli souborový systém, použijeme standardní a ověřený ext3:

mkfs -t ext3 /dev/md0

pozn.: Toto u velkých oddílů (např. 1TB a více) může trvat i někoik desítek minut RAID svazek je fyzicky přítomný v /dev/md/číslo svazku (simlink) nebo v /dev/mdxxx (hardlink)

Nyní provedeme reboot.

Připojení pole k adresáři

Poslední krok je upravit soubor /etc/fstab tak, aby se nám po restartu pole připojovalo do nějakého adresáře ve filesystému, bude na to potřeba několik kroků:

Podle nových pravidel, best practises v debianu, se disky připojujují přes jedinečný identifikátor zvaný UUID, je to z toho důvodu, že pojmenování, které vytváří udev se může měnit v závislosti na výměně HW, např. když je v systému jenom jeden disk (systémový) je tento disk označený jako /dev/sda, když do systému přidáme další dva disky, které budou HW "dříve" než disk systémový stane se to, že udev dva nové disky pojmenuje sda a sdb a dříve sytémový sda se bude jmenovat sdc atd.

Pro zjištění UUID našeho pole použijeme utilitu blkid:

blkid /dev/md0
/dev/md0: UUID="413186ec-5d99-403e-a6af-xxxxxxxxxxxxx" TYPE="ext3"

Řetězec UUID si zkopírujeme a jdeme na úpravu /etc/fstab, vytvoříme si adresář kam dané pole chceme připojit a zapíšeme to do fstab:

mkdir /mnt/raid1svazek

Do /etc/fstab přidáme:

UUID=413186ec-5d99-403e-a6af-xxxxxxxxxxxxx /mnt/raid1svazek ext3 defaults 0 2

Hodnoty defaults, 0 a 2 jsou klasické pro běžný datový svazek. Po každém rebootu měl být raid svazek připojen do adresáře /mnt/raid1svazek/

Nyní počkáme až se synchronizace disku dokončí a máme hotovo.

Úprava MBR

Aby nám systém naběhl i ze sekundárního disku je potřeba zkopírovat zavaděč a prvotní stage grubu i na druhý disk, zavaděč totiž není umístěn na zrcadleném oddílu a veškeré úpravy nebo změny v MBR nebo grubu se ukládají jenom na jeden disk, na primární, v našem modelovém případě na sda, je tedy ještě potřeba provést zkopírování obsahu začátku disku z primárního disku na sekundární:

dd if=/dev/sda of=/dev/sdb bs=512 count=2048

if= odkud má číst

of= kam má zapisovat

bs= kolik toho má zapsat [B]

count= kolikrát to má zapsat

kolik toho je potřeba zkopírovat poznáme podle toho kde začíná první sektor prvního oddílu, v fdisk se přepneme do modu zobrazovat sektory (command 'u') a necháme si vypsat oddíly (command 'p')

fdisk /dev/sda
Command (m for help): u
Changing display/entry units to sectors
Command (m for help): p
Disk /dev/sda: 251.1 GB, 251059544064 bytes
255 heads, 63 sectors/track, 30522 cylinders, total 490350672 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000498f2
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048    19531775     9764864   fd  Linux raid autodetect
/dev/sda2        19531776   136718335    58593280   fd  Linux raid autodetect
/dev/sda3       136718336   488284795   175783230   fd  Linux raid autodetect

Zde je vidět, že první oddíl začíná na 2048. sektoru, takže zkopírujeme 512B x 2048 ze začátku diskového prostoru, úplně stejně by fungovalo 512x2048=1048576, tedy bs=1048576 count=1.

Pozor, nikdy nezadávat dd bez parametru count protože tím neřekneme kdy má skončit a ve výsledku by příkaz přepsal celý disk!

Kopírování rozložení disku

Pokud chceme přidat do pole nový disk je nutné, aby měl stejné rozložení jako ostatní disky v poli. Rozložení můžeme buď udělat ručně nebo jednoduše zkopírovat rozložení z jiného už aktivního disku v poli:

sfdisk -d /dev/sdb | sfdisk /dev/sdc

Příkaz provede dump partition table z disku sdb a předá ho jako standardní vstup příkazu, který rozložení zapíše na disk sdc. Disk sdc poté můžeme přidat do existujícího pole.

Sledování stavu pole

Zde máme prakticky dvě základní možnosti, buď pozorovat co se děje se všemi poli najednou, pokud jich máme více nebo máme k dispozici detailní informace o konkrétním poli.

soubor /proc/mdadm

Soubor /proc/mdadm obsahuje informace o tom co právě proces mdadm dělá vypsat si ho můžeme jednoduše přes concatenate (cat) nebo nechat vypisovat v pravidelném intervalu, to nám dá dobrý přehled o tom co se děje např. při synchronizaci pole:

watch -n 1 "cat /proc/mdadm"

toto nám bude vypisovat obsah souboru jednou za sekundu

mdadm detail

Detaily o konkrétním poli můžeme zístal jednou z funkcí aplikace mdadm a to:

mdadm --detail /dev/md0

Tímto dostaneme kompletní informaci o RAID svazku, jako je datum vytvoření, jeho level, velikost, stav a jaké fyzické oddíly obsahuje.

Pokročilé operace s RAID polem

Odebrání disku z pole

Pokud nastane situace, že potřebujeme z pole odebrat disk např. protože je disk vadný nebo jeden disk chceme vyměnit za jiný je dobré poli odebrání disku dát vědět předem, tzn. udělat "softcore" odebrání místo "hardcore" odebráním a to fyzickým odpojením disku z pole - samozřejmě i v takové případě by to pole mělo přežít bez újmy (to platí pro RAID levely pro které není odebrání disku likvidační jako RAID 1, 5, 6, 1+0, 0+1 apod.)

Odebrání disku z pole

Odebrat konkrétní disk lze takto:

mdadm --remove failed /dev/sda1

Parametr remove můžeme doplnit příznaky failed a detached, parametr failed způsobí okamžité odebrání disku z pole, parametr detached způsobí odebrání disku z pole pouze v případě pokud je disk jako spare nebo již byl dříve označen jako vadný (fail)

Označení disku jako vadného:

Odebrat z pole jde pouze disk označený jako spare nebo jako failed, pokud máme zatím funkční a aktivní disk, který chceme z pole odebrat, musíme ho nejdříve označit jako failed

mdadm ---fail /dev/sda1


Odstarnit lze pouze

Logy, chyby a upozornění

Postřehy

  • V Debian Wheeze (debian7) nastal problém s rozpadem pole po rebootu, opraveno: v souboru /etc/mdadm/mdadm.conf zachovat řádek DEVICE partitions ve Wheezym byl zakomentovaný