Tak teď jsem narazil na roky starý bug v instalaci FreeBSD, který myslím stále není opraven.
...
Jde o to, že pokud instaluji na raid1 (klidně na ZFS), tak se mi UEFI boot loader nainstaluje jen na jeden disk ze dvou.
Pokud by tak odešel disk, na kterém je nainstalovalný bootloader, já kvůli tomu nenabootuji.
...
Boot z RAIDu a řešení chcíplého disku je obecně bohužel nedořešená potíž i na drtivé většině systémů. Proto jsem už tu už párkrát také zmiňoval, že na kritické systémy mám pořád rád na systém nějaký základní HW RAID řadič nebo VROC od Intelu (bohužel na to je potřeba minimálně server s Xeon Silver a vyššími). Není to jen o správné synchronizaci oddílů, ale i o tom, jak se systém a EFI firmware chová s vadným nebo částečně uhnilým zařízením, než se zavede systém. Pokud to má být blbuvzdorné a třeba ve vzdálené lokaci, tak je řadič pořád výhoda. Při výskytu kritické chyby na disku ho řadič vykopne, používá jen ten párový a špatný kousek už nemá šanci zastavit následný reboot.
Nicméně k tomu vašemu poznatku, ano ty synchronizace je to potřeba řešit manuálně a to i na většině Linuxových systémů.
Já to na FreeBSD NASech a serverech dělal tak, že jsem si udělal skript, co se pouští po updatu sytému.
Jestliže je to standardně nainstalovaný systém přes bsdinstall, kde zvolíte mirror, tak se udělají EFI oddíly s GPT labelem efiboot0 a efiboot1 (dá se případně měnit přes příkaz glabel). U systému s legacy BIOSem je to pak gptboot0 a gptboot1 a samozřejmě pokud máte těch disků v mirrou víc tak i další sekvenčně číslované labely.
Ty jsou pak standardně dostupné v /dev/gpt/efiboot0 atp.
Žádný s těch EFI oddílů nemusí být připojený pro normální fungování systému. Je to nutné připojit pouze pro freebsd-update.
Tzn. pokud chcete, aby se to nezastavilo, když je oddíl nedostupný (odejde první disk), přidejte do fstabu volbu "failok" (to je podobné jako nofail na Linuxu). Teoreticky by se dalo dát i noauto a připojovat ručně před upgradem (ale muselo by se ověřit, jestli nějaký upgrade skript neočekává po prvním bootu nového kernelu, já myslím, že ne a je to potřeba jen před rebootem pro instalaci nového bootloaderu).
A k té synchronizaci.. v podstatě stačí zkontrolovat, že je pro sichr odpojený /boot/efi, kdyžtak ho odpojit. Následně pak porovnat oddíly a případně překopírovat celý EFI oddíl přes dd.. např.
if [ ! cmp -s /dev/gpt/efiboot0 /dev/gpt/efiboot1 ]; then
dd if=/dev/gpt/efiboot0 of=/dev/gpt/efiboot1 bs=1M conv=fsync
fi
Je určitě víc způsobů, jak to udělat - porovnávat md5 hashe, mit následnou kontrolu atp.
Jak si to zapracujete do systému nějakých updatů je pak samozřejmě individuální.
Já mám v periodic (man periodic) obvykle nastavené, že systém denně kontrolují dostupné aktualizace systému a posílá e-mail, když jsou k dispozici. Následně je to stejně manuální spuštění freebsd-update.. v nějakém vhodném čase. Takže skript (který tedy u mě typicky řeší i další věci) není problém. Samozřejmě kdybych těch serverů měl třeba 65, tak to nějak automatizuji.
Další věc pro ty EFI systémy, je otestování, že to opravdu bude nabíhat i s chybějícím prvním diskem.
Záleží pak na konkrétní desce, serveru. Buď má explicitně vytvořené záznamy s odkazem na disk a EFI zavaděč v EFI bootovací tabulce s nějakou prioritou (instalátor bsd vytvoří takový záznam pro první disk), nebo jsou tam typicky také implicitně všechny přístupné disky s ESP oddílem, kde to sáhne po souboru /efi/boot/bootx64.efi (v tomhle případě kopie /efi/freebsd/loader.efi).
Ale na ty implicitní položky a jejich prioritu se nedá někdy úplně spoléhat (některé EFI firmwary to dokonce můžou mít zakázané volbou).
Doporučuji prohlédnout to přes: efibootmgr -v včetně bootovacího pořadí.
To se pak dá případně změnit (volba -o) a případně vytvořit nový explicitní záznam pod tím primárním.