Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
it:jednodeskove-pocitace:raspberry-pi-5-domaci-server [2025/02/15 12:05] – Petr Nosek | it:jednodeskove-pocitace:raspberry-pi-5-domaci-server [2025/02/16 00:07] (aktuální) – [Přidání disku do RAID] Petr Nosek | ||
---|---|---|---|
Řádek 716: | Řádek 716: | ||
**Poznámka: | **Poznámka: | ||
+ | |||
+ | |||
+ | ===== Konfigurace softwarového RAIDu – zrcadlení ===== | ||
+ | |||
+ | Při konfiguraci jsem vycházel z těchto návodů, přičemž ani jeden není dokonalý pro moji situaci a musel jsem si návody přízpůsobit. Uvádím je pro úplnost jako zdroj: | ||
+ | |||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | |||
+ | ==== Adresace disků ==== | ||
+ | |||
+ | Používám **Suptronics X1005 2280 M.2 NVMe Dual Shield** pro **Raspberry Pi 5**, který umožňuje připojení dvou disků. | ||
+ | |||
+ | Na desce jsou viditelně označeny dva sloty: | ||
+ | * **SSD1** | ||
+ | * **SSD2** | ||
+ | |||
+ | Při připojení jednoho disku do **SSD1**, systém jej rozpozná jako **nvme0n1**: | ||
+ | |||
+ | <code bash> | ||
+ | lsblk | ||
+ | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS | ||
+ | nvme0n1 | ||
+ | ├─nvme0n1p1 259:1 0 512M 0 part / | ||
+ | └─nvme0n1p2 259:2 0 1,8T 0 part / | ||
+ | </ | ||
+ | |||
+ | Po připojení druhého disku do **SSD2** došlo k nečekanému přeskupení číslování disků. Systém nyní rozpoznává: | ||
+ | |||
+ | * Disk připojený v **SSD2** jako **nvme0n1** | ||
+ | * Disk připojený v **SSD1** jako **nvme1n1** | ||
+ | |||
+ | Výstup příkazu `lsblk` po připojení druhého disku: | ||
+ | |||
+ | <code bash> | ||
+ | lsblk | ||
+ | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS | ||
+ | nvme0n1 | ||
+ | nvme1n1 | ||
+ | ├─nvme1n1p1 259:2 0 512M 0 part / | ||
+ | └─nvme1n1p2 259:3 0 1,8T 0 part / | ||
+ | </ | ||
+ | |||
+ | Toto chování jsem nečekal, ale beru ho jako fakt a budu s ním dále pracovat obezřetně. | ||
+ | |||
+ | |||
+ | Abych si ušetřil problémy a následné zmatky, tak jsem raději disky prohodil. Tedy disk s operačním systémem jsem dal do slotu SSD2 a nový disk do slotu SSD1. Po změně zapojení vypadá výpis takto: | ||
+ | |||
+ | <code bash> | ||
+ | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS | ||
+ | nvme0n1 | ||
+ | ├─nvme0n1p1 259:1 0 512M 0 part / | ||
+ | └─nvme0n1p2 259:2 0 1,8T 0 part / | ||
+ | nvme1n1 | ||
+ | </ | ||
+ | |||
+ | ==== Vytvoření partition na novém disku před RAIDem ==== | ||
+ | |||
+ | Před vytvořením softwarového RAIDu je doporučeno **ručně vytvořit odpovídající partitiony na novém disku** (**nvme0n1**), | ||
+ | RAID se obvykle vytváří nad existujícími partitionami, | ||
+ | |||
+ | === Jak vytvořit partitiony přesně podle původního disku? === | ||
+ | |||
+ | K tomu použijeme příkaz **sfdisk**, který umožňuje zkopírovat tabulku oddílů ze **nvme1n1** na **nvme0n1**. | ||
+ | |||
+ | === Krok 1: Záloha stávající partition tabulky === | ||
+ | |||
+ | Než cokoliv změníme, je vhodné **uložit stávající partition tabulku**, pokud by bylo potřeba ji obnovit: | ||
+ | |||
+ | <code bash> | ||
+ | sudo sfdisk -d / | ||
+ | </ | ||
+ | |||
+ | Tím se uloží rozložení oddílů do souboru **partition_backup.txt**, | ||
+ | |||
+ | === Krok 2: Zkopírování partition schématu na nový disk === | ||
+ | |||
+ | Zkopíruj stejnou partition tabulku ze **nvme1n1** na **nvme0n1**: | ||
+ | |||
+ | <code bash> | ||
+ | sudo sfdisk / | ||
+ | </ | ||
+ | |||
+ | Tento příkaz vytvoří na **nvme1n1** stejnou strukturu jako na **nvme0n1**. | ||
+ | |||
+ | === Krok 3: Ověření správnosti nového rozdělení disku === | ||
+ | |||
+ | Po provedení předchozího příkazu je vhodné **ověřit, zda jsou partitiony nyní identické**: | ||
+ | |||
+ | <code bash> | ||
+ | lsblk | ||
+ | fdisk -l / | ||
+ | </ | ||
+ | |||
+ | Pokud se vše shoduje, můžeme pokračovat v nastavování RAIDu. | ||
+ | |||
+ | |||
+ | |||
+ | ==== Konfigurace RAID 1 pomocí mdadm ==== | ||
+ | |||
+ | Pro konfiguraci softwarového RAIDu pro zrcadlení (RAID 1) použijeme **mdadm**. | ||
+ | |||
+ | Nejprve nainstalujeme potřebný balíček: | ||
+ | |||
+ | <code bash> | ||
+ | sudo apt install mdadm | ||
+ | </ | ||
+ | |||
+ | Vzhledem k tomu, že RAID nastavujeme na běžícím systému, vytvoříme RAID **v degradovaném režimu**, tedy pouze s jedním diskem. Druhý disk přidáme později. | ||
+ | |||
+ | === Vytvoření RAID 1 v degradovaném režimu === | ||
+ | |||
+ | Místo dvou disků v RAIDu vytvoříme pole pouze s novým diskem (**nvme1n1p1** a **nvme1n1p2**). | ||
+ | Druhý disk zatím nebude připojen (`missing`), | ||
+ | |||
+ | <code bash> | ||
+ | sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 / | ||
+ | sudo mdadm --create --verbose /dev/md1 --level=1 --raid-devices=2 / | ||
+ | </ | ||
+ | |||
+ | ✅ **Vysvětlení: | ||
+ | * `missing` znamená, že druhý disk zatím není připojen, RAID poběží pouze s jedním diskem. | ||
+ | * `--metadata=0.90` je doporučeno pro zaváděcí oddíly. | ||
+ | |||
+ | Následujícím krokem je vytvoření souborového systému na nově vytvořeném RAIDu. | ||
+ | |||
+ | === Vytvoření souborových systémů === | ||
+ | |||
+ | Na nových RAID oddílech vytvoříme souborový systém: | ||
+ | |||
+ | <code bash> | ||
+ | sudo mkfs.vfat /dev/md0 | ||
+ | sudo mkfs.ext4 /dev/md1 | ||
+ | </ | ||
+ | |||
+ | Nyní připojíme RAID a přeneseme systémové soubory. | ||
+ | |||
+ | === Přenos systémových souborů na RAID === | ||
+ | |||
+ | Nejprve připojíme bootovací oddíl RAID: | ||
+ | |||
+ | <code bash> | ||
+ | mkdir / | ||
+ | mount /dev/md0 / | ||
+ | rsync -axv / | ||
+ | </ | ||
+ | |||
+ | Poté připojíme hlavní oddíl a přeneseme systém: | ||
+ | |||
+ | <code bash> | ||
+ | mkdir / | ||
+ | mount /dev/md1 / | ||
+ | rsync -axv / / | ||
+ | </ | ||
+ | |||
+ | === Úprava fstab pro použití RAIDu === | ||
+ | |||
+ | Otevřeme soubor **fstab** na novém RAIDu: | ||
+ | |||
+ | <code bash> | ||
+ | nano / | ||
+ | </ | ||
+ | |||
+ | Najdeme řádky obsahující `/ | ||
+ | |||
+ | < | ||
+ | / | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | Tím zajistíme, že systém při bootu použije RAID. | ||
+ | |||
+ | === Aktualizace konfigurace mdadm === | ||
+ | |||
+ | Zjistíme UUID RAID polí: | ||
+ | |||
+ | <code bash> | ||
+ | mdadm --detail --scan | ||
+ | </ | ||
+ | |||
+ | Výstup bude podobný tomuto: | ||
+ | |||
+ | < | ||
+ | ARRAY /dev/md0 metadata=0.90 UUID=e11e72e6: | ||
+ | ARRAY /dev/md1 metadata=1.2 name=server: | ||
+ | </ | ||
+ | |||
+ | Tento výstup zapíšeme na konec souboru: | ||
+ | |||
+ | <code bash> | ||
+ | nano / | ||
+ | </ | ||
+ | |||
+ | === Úprava cmdline.txt pro bootování z RAIDu === | ||
+ | |||
+ | Otevřeme soubor bootovací konfigurace: | ||
+ | |||
+ | <code bash> | ||
+ | nano / | ||
+ | </ | ||
+ | |||
+ | Najdeme řádek obsahující: | ||
+ | |||
+ | < | ||
+ | root=PARTUUID=aa235387-02 | ||
+ | </ | ||
+ | |||
+ | A nahradíme jej: | ||
+ | |||
+ | < | ||
+ | root=/ | ||
+ | </ | ||
+ | |||
+ | ✅ **Vysvětlení: | ||
+ | * `root=/ | ||
+ | * `rootwait rootdelay=10` – umožňuje systému počkat na sestavení RAIDu. | ||
+ | * `fsck.repair=yes` – umožní automatickou opravu souborového systému při bootu. | ||
+ | |||
+ | === Přidání RAID modulů do initramfs === | ||
+ | |||
+ | Aby jádro vědělo, že používáme RAID již při bootu, přidáme moduly do **initramfs**: | ||
+ | |||
+ | <code bash> | ||
+ | nano / | ||
+ | </ | ||
+ | |||
+ | Přidáme tyto řádky: | ||
+ | |||
+ | < | ||
+ | raid1 | ||
+ | md_mod | ||
+ | ext4 | ||
+ | </ | ||
+ | |||
+ | Aktualizujeme initramfs: | ||
+ | |||
+ | <code bash> | ||
+ | umount / | ||
+ | mount /dev/md0 / | ||
+ | |||
+ | mkdir -p / | ||
+ | |||
+ | mount --bind /dev / | ||
+ | mount --bind /proc / | ||
+ | mount --bind /sys / | ||
+ | mount --bind /run / | ||
+ | |||
+ | chroot / | ||
+ | update-initramfs -u | ||
+ | </ | ||
+ | |||
+ | Tím jsme zajistili, že RAID bude dostupný již při startu systému. | ||
+ | |||
+ | **Nyní jsem mohl Raspberry restartovat. Důležitá věc, musel jsem primární disk - tedy disk s RAID přesunout do slotu SSD2 na desce. Dokud jsem to neudělal, boot se nepodařil, systém byl zmatený. Tento krok je klíčový - prohodit disky ve slotech.** | ||
+ | |||
+ | |||
+ | ==== Přidání disku do RAID ==== | ||
+ | |||
+ | Po prohození disků ve slotech (disk s nastaveným RAIDem musí být ve slotu **SSD2**) a nabootování systému je možné přidat druhý disk zpět do RAID pole. | ||
+ | Stejný postup se použije i v případě, že se nějaký disk odpojí a pole je **degradované**, | ||
+ | |||
+ | ✅ **Klíčové pravidlo: | ||
+ | **Primární disk musí být ve slotu SSD2, aby systém správně nabootoval.** | ||
+ | |||
+ | === Stav RAID pole po nabootování === | ||
+ | |||
+ | Z výpisu je vidět, že v RAID poli je zatím pouze jeden disk: | ||
+ | |||
+ | <code bash> | ||
+ | cat / | ||
+ | </ | ||
+ | |||
+ | **Výstup: | ||
+ | < | ||
+ | Personalities : [raid1] [linear] [raid0] [raid6] [raid5] [raid4] [raid10] | ||
+ | md0 : active raid1 nvme0n1p1[0] | ||
+ | 524224 blocks [2/1] [U_] | ||
+ | | ||
+ | md1 : active raid1 nvme0n1p2[0] | ||
+ | 1952854080 blocks super 1.2 [2/1] [U_] | ||
+ | bitmap: 4/4 pages [64KB], 65536KB chunk | ||
+ | </ | ||
+ | |||
+ | Nově připojený disk **nvme1n1** zatím není součástí RAID pole. | ||
+ | |||
+ | === Výpis připojených disků === | ||
+ | |||
+ | Podíváme se na aktuální stav připojených disků: | ||
+ | |||
+ | <code bash> | ||
+ | lsblk | ||
+ | </ | ||
+ | |||
+ | **Výstup: | ||
+ | < | ||
+ | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS | ||
+ | nvme0n1 | ||
+ | ├─nvme0n1p1 259:1 0 | ||
+ | │ └─md0 | ||
+ | └─nvme0n1p2 259:2 0 | ||
+ | └─md1 | ||
+ | nvme1n1 | ||
+ | ├─nvme1n1p1 259:4 0 | ||
+ | └─nvme1n1p2 259:5 0 | ||
+ | </ | ||
+ | |||
+ | === Detaily RAID pole === | ||
+ | |||
+ | Zkontrolujeme aktuální stav RAID pole: | ||
+ | |||
+ | <code bash> | ||
+ | mdadm --detail /dev/md0 | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | /dev/md0: | ||
+ | | ||
+ | | ||
+ | Raid Level : raid1 | ||
+ | Array Size : 524224 (511.94 MiB 536.81 MB) | ||
+ | Used Dev Size : 524224 (511.94 MiB 536.81 MB) | ||
+ | Raid Devices : 2 | ||
+ | Total Devices : 1 | ||
+ | | ||
+ | |||
+ | | ||
+ | State : clean, degraded | ||
+ | Active Devices : 1 | ||
+ | | ||
+ | Failed Devices : 0 | ||
+ | Spare Devices : 0 | ||
+ | |||
+ | Consistency Policy : resync | ||
+ | |||
+ | Number | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | Stejným způsobem můžeme zkontrolovat i hlavní RAID oddíl: | ||
+ | |||
+ | <code bash> | ||
+ | mdadm --detail /dev/md1 | ||
+ | </ | ||
+ | |||
+ | **Výstup ukazuje, že RAID pole je degradované – chybí druhý disk.** | ||
+ | |||
+ | === Přidání nového disku do RAID pole === | ||
+ | |||
+ | Nyní přidáme nový disk **nvme1n1** do RAID pole: | ||
+ | |||
+ | <code bash> | ||
+ | mdadm --add /dev/md0 / | ||
+ | mdadm --add /dev/md1 / | ||
+ | </ | ||
+ | |||
+ | Po přidání zkontrolujeme stav RAIDu: | ||
+ | |||
+ | <code bash> | ||
+ | cat / | ||
+ | </ | ||
+ | |||
+ | **Výstup ukazuje, že RAID začíná synchronizaci: | ||
+ | < | ||
+ | Personalities : [raid1] [linear] [raid0] [raid6] [raid5] [raid4] [raid10] | ||
+ | md0 : active raid1 nvme1n1p1[1] nvme0n1p1[0] | ||
+ | 524224 blocks [2/2] [UU] | ||
+ | | ||
+ | md1 : active raid1 nvme1n1p2[2] nvme0n1p2[0] | ||
+ | 1952854080 blocks super 1.2 [2/1] [U_] | ||
+ | [=> | ||
+ | bitmap: 4/4 pages [64KB], 65536KB chunk | ||
+ | </ | ||
+ | |||
+ | === Sledování průběhu synchronizace === | ||
+ | |||
+ | Pro sledování průběhu synchronizace RAID pole můžeme použít: | ||
+ | |||
+ | <code bash> | ||
+ | watch -n 1 cat / | ||
+ | </ | ||
+ | |||
+ | ✅ **RAID nyní probíhá synchronizace a disk bude plně zrcadlen po dokončení procesu.** | ||
+ | |||
+ | |||
+ | === Priorita disků po odpojení a opětovném připojení === | ||
+ | |||
+ | Pokud dojde k **odpojení jednoho disku** a následně jej znovu připojíme, | ||
+ | |||
+ | Nezáleží na tom, **že je disk ve slotu SSD2**, protože po připojení obou disků systém automaticky **vybere ten, který běžel jako poslední aktivní po rozpojení RAIDu**. | ||
+ | |||
+ | === Jak systém určuje, který disk bude upřednostněn? | ||
+ | |||
+ | Systém rozhoduje na základě **poslední aktualizace metadat RAIDu**. Každý disk v RAIDu obsahuje **metadata (superblock)**, | ||
+ | **Klíčový parametr je tzv. Event Count**, což je čítač změn. | ||
+ | |||
+ | ✅ **RAID vybere disk s nejvyšším Event Count jako platný.** | ||
+ | Pokud má jeden disk vyšší Event Count než druhý, systém považuje tento disk za aktuální a použije jej jako primární. | ||
+ | |||
+ | === Jak zjistit, který disk má vyšší Event Count? === | ||
+ | |||
+ | Můžeš si ověřit, který disk má aktuálnější metadata pomocí příkazu: | ||
+ | |||
+ | <code bash> | ||
+ | mdadm --examine / | ||
+ | </ | ||
+ | |||
+ | **Výstup bude obsahovat řádky podobné tomuto:** | ||
+ | |||
+ | < | ||
+ | / | ||
+ | | ||
+ | |||
+ | / | ||
+ | | ||
+ | </ | ||
+ | |||
+ | ✅ **Disk s vyšším číslem „Events“ je považován za aktuální.** | ||
+ | Pokud se **Event Count neshoduje**, | ||
+ | |||
+ | === Co se stane při neaktuálním disku? === | ||
+ | |||
+ | Pokud má jeden z disků nižší Event Count, systém jej při dalším spuštění považuje za **zastaralý** a označí jej jako neaktivní. | ||
+ | RAID pak při připojení tohoto disku provede **resynchronizaci** dat. | ||
+ | |||
+ | Proto je důležité po výpadku disku **zkontrolovat stav RAID | ||