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/08/21 21:34] – [Bootování z NVMe disku] Petr Nosek | it:jednodeskove-pocitace:raspberry-pi-5-domaci-server [2025/08/23 19:33] (aktuální) – Petr Nosek | ||
|---|---|---|---|
| Řádek 87: | Řádek 87: | ||
| Uložte změny a restartujte Raspberry Pi. | Uložte změny a restartujte Raspberry Pi. | ||
| + | |||
| + | |||
| + | ===== Raspberry Pi 5 s 4TB disk: převod MBR na GPT a oprava PARTUUID ===== | ||
| + | |||
| + | Raspberry Pi 5 je konečně dost výkonné na to, aby zvládlo velký disk a dělalo serverové úlohy. Ale pokud připojíte 4TB disk, narazíte na starý známý problém – **MBR tabulka oddílů**. Ta má strop **2 TiB**. Zbytek disku jako by neexistoval. Řešením je **GPT**. Jenže když jsem převedl disk z MBR na GPT, Raspberry Pi po restartu nenabootovalo. V tomhle článku popíšu krok za krokem, jak jsem to vyřešil. | ||
| + | |||
| + | Důležitá poznámka: samotný disk jsem měl připojený k jinému počítači přes USB redukci, abych mohl bezpečně provádět změny. Teprve po úpravách jsem ho vrátil zpět k Raspberry Pi. | ||
| + | |||
| + | ==== Co je MBR a GPT ==== | ||
| + | |||
| + | **MBR (Master Boot Record)** je historický způsob zápisu tabulky oddílů, používaný od počátků PC. Využívá 32bit adresy sektorů, a proto dokáže adresovat maximálně 2 TiB na disku se sektory 512 B. Je kompatibilní téměř se vším, ale omezený kapacitou. | ||
| + | |||
| + | **GPT (GUID Partition Table)** je modernější standard, součást specifikace UEFI. Umožňuje prakticky neomezenou velikost disků (v řádu zettabajtů), | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ==== Problém: MBR limit ==== | ||
| + | |||
| + | MBR (msdos) tabulka oddílů používá 32bit adresy sektorů. Při velikosti sektoru 512 B umí oslovit maximálně **2 TiB** disku. Na mém 4TB disku jsem proto viděl jen polovinu kapacity. GPT (GUID Partition Table) žádný takový limit nemá. | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ==== Krok 1: převod na GPT pomocí gdisk ==== | ||
| + | |||
| + | Nechtěl jsem přijít o systém, takže jsem sáhl po nástroji **gdisk**, který umí převést MBR → GPT bez mazání dat. | ||
| + | |||
| + | <code bash> | ||
| + | sudo apt install gdisk | ||
| + | sudo gdisk /dev/sda | ||
| + | </ | ||
| + | |||
| + | Po spuštění `gdisk` hlásil, že našel MBR tabulku, a nabídl převod na GPT. Stačilo zkontrolovat oddíly příkazem `p` a uložit změny příkazem `w`. | ||
| + | |||
| + | Při potvrzení mě `gdisk` vystrašil hláškou: | ||
| + | |||
| + | < | ||
| + | Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!! | ||
| + | </ | ||
| + | |||
| + | Na první pohled to vypadá, že smaže všechno. Ve skutečnosti to znamená jen tolik, že se přepíše **tabulka oddílů** – data na samotných oddílech zůstanou. Přesto doporučuju mít zálohu. | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ==== Krok 2: první boot a chyba ==== | ||
| + | |||
| + | Po restartu Raspberry Pi 5 kernel nastartoval, | ||
| + | |||
| + | < | ||
| + | ALERT! PARTUUID=xxxx-02 does not exist. | ||
| + | </ | ||
| + | |||
| + | Co se stalo? Raspberry Pi OS používá k identifikaci oddílů **PARTUUID**. Jenže převodem na GPT se PARTUUID všech oddílů změnily. Konfigurační soubory pořád ukazovaly na staré hodnoty. | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ==== Krok 3: oprava cmdline.txt ==== | ||
| + | |||
| + | V adresáři `/ | ||
| + | Pomocí příkazu: | ||
| + | |||
| + | <code bash> | ||
| + | lsblk -o NAME, | ||
| + | </ | ||
| + | |||
| + | jsem zjistil nové PARTUUID oddílů. Ukázkový výpis: | ||
| + | |||
| + | < | ||
| + | NAME | ||
| + | sda | ||
| + | ├─sda1 vfat | ||
| + | └─sda2 ext4 | ||
| + | </ | ||
| + | |||
| + | * `/dev/sda1` je boot (FAT32 → / | ||
| + | * `/dev/sda2` je root (ext4 → /) | ||
| + | |||
| + | Do `cmdline.txt` jsem zapsal správnou hodnotu: | ||
| + | |||
| + | < | ||
| + | console=serial0, | ||
| + | </ | ||
| + | |||
| + | To posunulo boot dál – kernel už root oddíl našel. | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ==== Krok 4: oprava /etc/fstab ==== | ||
| + | |||
| + | Jenže boot stále padal do emergency módu. Důvod? `/ | ||
| + | |||
| + | Správně to má vypadat takto: | ||
| + | |||
| + | < | ||
| + | proc /proc | ||
| + | PARTUUID=1c9f7d17-01 | ||
| + | PARTUUID=1c9f7d17-02 | ||
| + | </ | ||
| + | |||
| + | Po úpravě `/ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ==== Výsledek ==== | ||
| + | |||
| + | Po opravě PARTUUID Raspberry Pi 5 nabootovalo z mého 4TB disku s tabulkou GPT. Celá kapacita disku je k dispozici a systém funguje, jako by se nic nestalo. | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ==== Shrnutí ==== | ||
| + | |||
| + | - Raspberry Pi OS standardně instaluje disk s **MBR**, takže na 4TB disku vidíte jen 2TB. | ||
| + | - Pomocí `gdisk` lze převést tabulku na **GPT** bez ztráty dat. | ||
| + | - Po převodu je nutné **opravit PARTUUID v `cmdline.txt` i `/ | ||
| + | - Pak Pi 5 bez problémů bootuje z GPT disku a využije celou kapacitu. | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ✅ Pokud tedy narazíte na 2TB strop na Raspberry Pi, řešením je převést disk na GPT a opravit konfiguraci.\\ | ||
| + | 📌 Doporučení: | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ==== Jak číst výpis lsblk ==== | ||
| + | |||
| + | Ukázkový výpis: | ||
| + | |||
| + | < | ||
| + | NAME | ||
| + | sda | ||
| + | ├─sda1 vfat | ||
| + | └─sda2 ext4 | ||
| + | </ | ||
| + | |||
| + | Vysvětlení sloupců: | ||
| + | |||
| + | * **NAME** – název zařízení nebo oddílu (např. `sda1`) | ||
| + | * **FSTYPE** – typ souborového systému (např. `vfat`, `ext4`) | ||
| + | * **LABEL** – název oddílu, pokud je nastaven | ||
| + | * **UUID** – unikátní identifikátor souborového systému | ||
| + | * **PARTUUID** – unikátní identifikátor oddílu v tabulce oddílů (právě ten se změnil při převodu MBR → GPT) | ||
| Řádek 436: | Řádek 576: | ||
| [Service] | [Service] | ||
| Type=simple | Type=simple | ||
| - | ExecStart=/ | + | ExecStart=/ |
| Restart=always | Restart=always | ||
| User=root | User=root | ||
| - | StandardOutput=append:/ | + | #StandardOutput=append:/ |
| + | StandardOutput=null | ||
| StandardError=append:/ | StandardError=append:/ | ||