Chci lépe porozumět procesu inicializace Linuxu, abych mohl spouštět systém ze sítě přes ceph spíše než nfs.
V tomto procesu jsem narazil na dvě formy přepínání root. Jeden s názvem switch_root a druhý s názvem pivot_root. Tyto skripty se spouštějí ze souborového systému v paměti (initramfs) získaného přes tftp pomocí zaváděcího procesu pxe.
Kdy byste použili jedno přes druhé? Viděl jsem oba použité v některých init skriptech umístěných v kořenovém adresáři.
Přijatá odpověď:
Našel jsem zde úžasné vysvětlení. Pokusím se však ve zkrácené podobě uvést to, co jsem v odpovědi pochopil.
Kratší verze
- Když se systém spouští, potřebuje časný uživatelský prostor. Toho lze
dosáhnout pomocí initramfs nebo initrd. - initrd je načten na ramdisk, který je skutečný SYSTÉM SOUBORŮ .
- initramfs není systém souborů .
- Pro initrd
pivot_root
se používá a pro initramfsswitch_root
se používá.
Delší verze
Nyní k podrobnému vysvětlení toho, co jsem uvedl výše.
Zatímco initramfs i initrd slouží stejnému účelu,
jsou zde 2 rozdíly. Nejviditelnější rozdíl je v tom, že initrd se
nahraje na ramdisk. Skládá se ze skutečného souborového systému (typicky
ext2), který je připojen na ramdisku. Na druhou stranu initramfs
není souborový systém. Je to jednoduše (komprimovaný) archiv cpio (typu
newc), který je rozbalen do souboru tmpfs. To má vedlejší efekt v tom, že jsou
initramfs o něco optimalizovanější a schopné načítání o něco
dříve v procesu zavádění jádra než initrd. Také velikost
initramfs v paměti je menší, protože jádro dokáže přizpůsobit
velikost tmpfs tomu, co je skutečně načteno, místo aby se spoléhalo na
předdefinované velikosti ramdisku. může také vyčistit ram, který byl
použitý, zatímco ramdisky mají tendenci zůstat v provozu (kvůli detailům implementace
pivot_root).Existuje také další rozdíl ve vedlejších účincích:jak se zachází s kořenovým zařízením (a
přepínáním na něj). Protože initrd je skutečný souborový systém
rozbalený do paměti ram, kořenovým zařízením musí být ve skutečnosti ramdisk. Pro
initramfs existuje jádro „rootfs“, které se stane tmpfs, do kterých se
initramfs rozbalí (pokud jádro načte initramfs; pokud
ne, pak je rootfs jednoduše souborový systém určený pomocí zaváděcího parametru jádra root=
), ale tento dočasný rootfs by neměl být
specifikován jako zaváděcí parametr root=(a neexistuje způsob, jak to
udělat, protože k němu není připojeno žádné zařízení). To znamená, že
stále můžete předat své skutečné kořenové zařízení jádru při použití
initramfs. S initrd musíte sami zpracovat, jaké je skutečné root
zařízení. Vzhledem k tomu, že „skutečným“ kořenovým zařízením s initrd
je ramdisk, jádro musí skutečně přepnout kořenová zařízení z jednoho
skutečného zařízení (ramdisk) na druhé (váš skutečný root). V případě
initramfs není prostor initramfs (tmpfs) skutečným zařízením,
takže jádro nepřepíná skutečná zařízení. Zatímco příkaz
pivot_root se používá s initrd, pro initramfs je třeba použít jiný příkaz
. Busybox poskytuje switch_root, aby toho dosáhl,
zatímco klibc nabízí new_root.