Przejdź do głównej zawartości

Software RAID

Ćwiczenia poniżej są napisane pod współczesnego Ubuntu (22.04/24.04 LTS) i nie wymagają konkretnego hipervisora ani GUI (np. YaST). Jako "dyski" wykorzystujemy pliki obrazów podpięte przez losetup — dzięki temu można przećwiczyć RAID na dowolnej maszynie (fizycznej, VM, w chmurze, WSL2 z uprawnieniami roota) bez dokładania prawdziwych dysków. Awarie dysków symulujemy poleceniami mdadm --fail / mdadm --remove zamiast fizycznego usuwania plików dysków wirtualnych — to bezpieczniejsze i identycznie zachowuje się niezależnie od środowiska.


Poziomy RAID

PoziomNazwaDziałanieOdporność na awarię dysku
RAID 0stripowaniedane dzielone na paski między dyski – suma pojemności, brak nadmiarowości❌ utrata danych przy awarii jednego dysku
RAID 1mirroringpełna kopia danych na każdym dysku✔️ przeżywa awarię dysku (odzyskanie z drugiej kopii)

Ćwiczenie 0 – przygotowanie środowiska

Instalacja mdadm

sudo apt update
sudo apt install mdadm

Podczas instalacji mdadm może zapytać o konfigurację macierzy potrzebnych do bootowania — przy ćwiczeniach laboratoryjnych możesz zostawić wartość domyślną.

Sprawdzenie wsparcia RAID w jądrze

mdadm --version
cat /proc/mdstat # obsługa RAID w jądrze jest wbudowana (moduły raid0/raid1...)

Przygotowanie dysków testowych (pliki obrazów + losetup)

mkdir -p ~/raid-lab && cd ~/raid-lab
truncate -s 1G disk1.img
truncate -s 1G disk2.img
sudo losetup -fP disk1.img
sudo losetup -fP disk2.img
losetup -a # sprawdzamy przydzielone /dev/loopX
lsblk

Od teraz /dev/loop0 i /dev/loop1 (lub jakie faktycznie przydzielił losetup) traktujemy tak, jak w klasycznym ćwiczeniu traktowano /dev/sdb1//dev/sdc1. Jeśli ćwiczysz na prawdziwych partycjach VM, ustaw im typ Linux RAID autodetect (fd w fdisk/MBR, lub odpowiedni typ GPT w gdisk/parted) — na loop devices ten krok jest pomijalny, mdadm działa bezpośrednio na całym urządzeniu.

Czas wykonania: 5 min.


Ćwiczenie 1 – tworzenie macierzy RAID1 z linii poleceń

Tworzenie macierzy

sudo mdadm -C -v /dev/md0 --level=1 -n 2 /dev/loop0 /dev/loop1

Znaczenie przełączników:

FlagaZnaczenie
-Ccreate – utworzenie nowej macierzy
-vtryb szczegółowy (verbose)
/dev/md0nazwa urządzenia macierzy
--level=1poziom RAID (tu: RAID1 – mirroring)
-n 2liczba dysków wchodzących w skład macierzy
/dev/loop0 /dev/loop1urządzenia tworzące macierz

Zakładanie systemu plików

sudo mkfs.ext4 /dev/md0

Montowanie macierzy

sudo mkdir -p /mnt/raid
sudo mount /dev/md0 /mnt/raid

Test zapisu i obserwacja aktywności dysków

sudo dd if=/dev/urandom of=/mnt/raid/plik bs=1M count=500
  • if=/dev/urandom – źródło losowych danych
  • of=/mnt/raid/plik – plik docelowy w zamontowanej macierzy
  • bs=1M count=500 – łącznie ok. 500 MB

W osobnym terminalu obserwuj aktywność urządzeń podczas kopiowania:

iostat -x 1 # z pakietu sysstat: sudo apt install sysstat

Weryfikacja

df -h /mnt/raid
cat /proc/mdstat # stan macierzy, np. [UU] – oba dyski aktywne
sudo mdadm --detail /dev/md0

Czas wykonania ćwiczenia: ok. 10 min.


Trwałość konfiguracji po restarcie (na prawdziwych dyskach)

Loop devices nie przeżywają restartu, więc poniższe ma sens na realnych dyskach/partycjach. Żeby macierz składała się automatycznie przy starcie systemu, zapisz jej definicję w /etc/mdadm/mdadm.conf i przebuduj initramfs:

sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u

Dodaj też wpis montowania w /etc/fstab (najlepiej po UUID):

sudo blkid /dev/md0
echo '/dev/md0 /mnt/raid ext4 defaults 0 2' | sudo tee -a /etc/fstab
sudo mount -a

Ćwiczenie 2 – scenariusz rozszerzony: RAID1, RAID0, awarie i odbudowa

Przygotowanie dysków

Tworzymy cztery kolejne obrazy po 1 GB:

cd ~/raid-lab
for i in a b c d; do truncate -s 1G disk_$i.img; sudo losetup -fP disk_$i.img; done
losetup -a

Zanotuj przydzielone /dev/loopN — poniżej zakładamy loop2..loop5 odpowiadające a,b,c,d (sprawdź realne numery poleceniem losetup -a).

Tworzenie dwóch macierzy

  • RAID1 z a i b → zamontuj w /mnt/raid1
  • RAID0 z c i d → zamontuj w /mnt/raid2
sudo mdadm -C -v /dev/md1 --level=1 -n 2 /dev/loop2 /dev/loop3
sudo mkfs.ext4 /dev/md1
sudo mkdir -p /mnt/raid1
sudo mount /dev/md1 /mnt/raid1

sudo mdadm -C -v /dev/md2 --level=0 -n 2 /dev/loop4 /dev/loop5
sudo mkfs.ext4 /dev/md2
sudo mkdir -p /mnt/raid2
sudo mount /dev/md2 /mnt/raid2

Test danych między macierzami

sudo dd if=/dev/urandom of=/mnt/raid1/plik bs=1M count=300
sudo cp /mnt/raid1/plik /mnt/raid2/
df -h /mnt/raid1 /mnt/raid2

Weryfikacja stanu macierzy

cat /proc/mdstat
sudo mdadm --detail /dev/md1
sudo mdadm --detail /dev/md2

Rozszerzanie macierzy RAID1 o kolejny dysk (spare / rezerwa)

Dodajemy piąty obraz jako dysk zapasowy (spare) dla md1:

truncate -s 1G ~/raid-lab/disk_e.img
sudo losetup -fP ~/raid-lab/disk_e.img
sudo mdadm /dev/md1 -a /dev/loop6 # -a (--add) dodaje dysk jako spare
cat /proc/mdstat
sudo mdadm --detail /dev/md1

-a (add) – dodanie nowego urządzenia do istniejącej macierzy jako dysku zapasowego (spare); zostanie automatycznie wciągnięty do macierzy, jeśli jeden z aktywnych dysków ulegnie awarii.

Symulacja awarii dysku

Zamiast fizycznie usuwać plik obrazu, symulujemy awarię poleceniami mdadm, co działa identycznie na loop devices i na prawdziwych dyskach:

sudo mdadm /dev/md1 --fail /dev/loop2 # oznaczamy dysk jako uszkodzony
cat /proc/mdstat # macierz w trybie degraded, spare wciąga się automatycznie
sudo mdadm --detail /dev/md1

Sprawdź, że dane wciąż są dostępne mimo awarii jednego dysku (RAID1 przeżywa utratę jednego z dwóch):

md5sum /mnt/raid1/plik

Usuwamy uszkodzone urządzenie z macierzy:

sudo mdadm /dev/md1 --remove /dev/loop2
cat /proc/mdstat

Przywracanie sprawności macierzy

Dodajemy nowy/naprawiony dysk i obserwujemy proces odbudowy (rebuild):

sudo mdadm /dev/md1 -a /dev/loop2
watch cat /proc/mdstat # obserwujemy pasek postępu resync/recovery

Test macierzy RAID0 bez nadmiarowości

Dla porównania spróbuj tej samej operacji na md2 (RAID0):

sudo mdadm /dev/md2 --fail /dev/loop4
cat /proc/mdstat # macierz od razu przestaje działać - brak nadmiarowości

Po tym teście macierz md2 jest bezpowrotnie uszkodzona (tak działa RAID0) — odtwórz ją od zera, jeśli chcesz kontynuować ćwiczenia:

sudo umount /mnt/raid2
sudo mdadm --stop /dev/md2
sudo mdadm -C -v /dev/md2 --level=0 -n 2 /dev/loop4 /dev/loop5
sudo mkfs.ext4 /dev/md2
sudo mount /dev/md2 /mnt/raid2

Czas wykonania ćwiczenia: 20 min.


Ręczne zatrzymanie i wymuszone złożenie macierzy

Jeśli macierz nie składa się automatycznie po awarii (np. brakuje zbyt wielu dysków lub metadane są niespójne), można ją zatrzymać i wymusić złożenie z dostępnych, poprawnych urządzeń:

sudo mdadm --stop /dev/md1
sudo mdadm -A --force /dev/md1 /dev/loop2 /dev/loop3
  • mdadm --stop /dev/mdX – zatrzymuje (dezaktywuje) macierz.
  • mdadm -A --force /dev/mdX <urządzenia>assemble z opcją --force, wymusza złożenie macierzy z podanych urządzeń mimo niespójności (np. po niepełnym zamknięciu lub braku jednego z dysków).

Sprzątanie

sudo umount /mnt/raid /mnt/raid1 /mnt/raid2

sudo mdadm --stop /dev/md0
sudo mdadm --stop /dev/md1
sudo mdadm --stop /dev/md2

# zerujemy superblok mdadm na każdym urządzeniu, żeby nie było wykrywane ponownie
for dev in /dev/loop0 /dev/loop1 /dev/loop2 /dev/loop3 /dev/loop4 /dev/loop5 /dev/loop6; do
sudo mdadm --zero-superblock "$dev"
done

sudo losetup -d /dev/loop0 /dev/loop1 /dev/loop2 /dev/loop3 /dev/loop4 /dev/loop5 /dev/loop6
rm -f ~/raid-lab/*.img

Jeśli podczas Ćwiczenia 1 dopisywałeś wpis do /etc/mdadm/mdadm.conf i /etc/fstab, usuń go i uruchom ponownie sudo update-initramfs -u.


Podsumowanie – kolejność czynności

  1. Instalacja mdadm (sudo apt install mdadm), sprawdzenie /proc/mdstat.
  2. Przygotowanie "dysków" – pliki obrazów + losetup -fP (lub prawdziwe partycje z typem Linux RAID autodetect).
  3. mdadm -C -v /dev/md0 --level=<0|1> -n <liczba> <urządzenia> – utworzenie macierzy.
  4. mkfs.ext4 /dev/md0 – system plików.
  5. mount /dev/md0 /mnt/raid – montowanie.
  6. dd if=/dev/urandom of=/mnt/raid/plik ... – test zapisu i obserwacja aktywności (iostat -x 1).
  7. df -h, cat /proc/mdstat, mdadm --detail – weryfikacja stanu i zajętości.
  8. mdadm /dev/mdX -a <urządzenie> – dodawanie dysku (spare/rozbudowa) do macierzy.
  9. mdadm /dev/mdX --fail <urządzenie> + --remove – symulacja awarii dysku i obserwacja trybu degraded oraz automatycznej odbudowy ze spare.
  10. mdadm --stop / mdadm -A --force – ręczne zatrzymanie i wymuszone złożenie macierzy.
  11. /etc/mdadm/mdadm.conf + update-initramfs -u + wpis w /etc/fstab – trwałe składanie macierzy po restarcie (na prawdziwych dyskach).