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
| Poziom | Nazwa | Działanie | Odporność na awarię dysku |
|---|---|---|---|
| RAID 0 | stripowanie | dane dzielone na paski między dyski – suma pojemności, brak nadmiarowości | ❌ utrata danych przy awarii jednego dysku |
| RAID 1 | mirroring | peł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:
| Flaga | Znaczenie |
|---|---|
-C | create – utworzenie nowej macierzy |
-v | tryb szczegółowy (verbose) |
/dev/md0 | nazwa urządzenia macierzy |
--level=1 | poziom RAID (tu: RAID1 – mirroring) |
-n 2 | liczba dysków wchodzących w skład macierzy |
/dev/loop0 /dev/loop1 | urzą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 danychof=/mnt/raid/plik– plik docelowy w zamontowanej macierzybs=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
aib→ zamontuj w/mnt/raid1 - RAID0 z
cid→ 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
- Instalacja
mdadm(sudo apt install mdadm), sprawdzenie/proc/mdstat. - Przygotowanie "dysków" – pliki obrazów +
losetup -fP(lub prawdziwe partycje z typem Linux RAID autodetect). mdadm -C -v /dev/md0 --level=<0|1> -n <liczba> <urządzenia>– utworzenie macierzy.mkfs.ext4 /dev/md0– system plików.mount /dev/md0 /mnt/raid– montowanie.dd if=/dev/urandom of=/mnt/raid/plik ...– test zapisu i obserwacja aktywności (iostat -x 1).df -h,cat /proc/mdstat,mdadm --detail– weryfikacja stanu i zajętości.mdadm /dev/mdX -a <urządzenie>– dodawanie dysku (spare/rozbudowa) do macierzy.mdadm /dev/mdX --fail <urządzenie>+--remove– symulacja awarii dysku i obserwacja trybu degraded oraz automatycznej odbudowy ze spare.mdadm --stop/mdadm -A --force– ręczne zatrzymanie i wymuszone złożenie macierzy./etc/mdadm/mdadm.conf+update-initramfs -u+ wpis w/etc/fstab– trwałe składanie macierzy po restarcie (na prawdziwych dyskach).