Překrytí systémového disku - overlay filesystem
Koncept transparentního překrytí systémového disku virtuálním diskem vytvořeným v lokální paměti, využíváme u bezdiskového linuxu od r. 2006.
Původně jsme k tomu využívali unionfs, jehož vývoj započal r. 2004. Byla to vůbec první linuxová implementace této technologie, která se začala reálně používat. S přechodem na jádro řady 2.6 však začal vývoj unionfs zaostávat, proto jsme dali přednost progresivnějšímu aufs, které podporovalo novější jádra řady 3.x a mělo stejně jako kernel zdrojový kód udržovaný v git repozitáři a verzovaný vůči aktuálním verzím jádra.
Bohužel, klíčový problém aufs byl (a je), že není součástí hlavní vývojové větve linuxového jádra. I když se o to řadu let jeho vývojář Junjiro R. Okajima snažil, nebyl jeho kód přijat. Především se na něm vývojářům kernelu nelíbilo, že sjednocení adresářů neprovádí v rámci VFS (virtuálního souborového systému), ale mimo něj - stejně jako původní unionfs. Proto nakonec upřednostnili overlay, který provádí sjednocení adresářů na úrovni VFS. [1]
- aufs
- Modul aufs sice nebyl součástí hlavní vývojové větve jádra, ale byl do jádra verze 3.16 standardní součástí distribučního jádra Debianu[2].
- overlay
- Původně vyvíjený jaderný modul s názvem overlayfs, se stal nakonec součástí hlavní vývojové větve jádra od verze 3.18-rc2 pod názvem overlay[3]. Jenže tak jak byl nakonec do jádra modul implementován, jej není (zatím) možné - na rozdíl od původní vývojové verze - použít bezprostředně nad systémovým adresářem nasdíleným přes NFS!
- unionfs-fuse
- Východiskem z této situace je union-fuse, který provádí sjednocení přes FUSE. Soubory se sice honí v uživatelském prostoru, ovšem z hlediska výkonu se jedná max. o 20% ztráty výkonu procesoru. Což je pro účely disklessu akceptovatelné.
Linuxový systém nad NFS
Princip je následující:
- Nejprve se spustí linuxové jádro, které si do paměti rozbalí ramdisk
- V ramdisku musí být k dispozici modul aufs a utility pro připojení adresáře sdíleného přes NFS
- V paměti se vytvoří další tmpfs prostor, připojený na přípojný bod, kterým se pak překryje namountovaný adresář se systémem, sdíleným přes NFS
- Další zavádění již probíhá jako obvykle. S tím, že veškeré změny se zapisují do onoho vyhrazeného prostoru v paměti
Součástí ramdisku tak musí být skripty, které tyto operace zrealizují ještě před spuštěním init procesu.
Dynamický ramdisk
Skript pro překrytí systémového disku
O překrytí systémového disku se stará univerzální skript root_overlay, který musí být - stejně jako modul pro sjednocení souborového systému - součástí ramdisku. Skript tento modul zavede a připojí virtuální disk, umístěný v paměti, který překryje systémový disk připojený přes NFS.
Protože se může spustit až poté, co je systémový disk sdílený přes NFS připojen, je uložen v podadresáři /scripts/nfs-bottom
.
Aby se skripty skutečně spustily, musí být v ramdisku nastaveny jako spustitelné! Pokud tomu tak není, tak se disk nepřekryje a systém najede jako zapisovatelný! |
root_overlay
Nejjednodušším způsobem jak dostat tento skript do ramdisku je:
- Nainstalovat balíček
initramfs-tools
, - Nakopírovat tento skript do adresáře
/etc/initramfs-tools/scripts/nfs-bottom
- A následně aktualizovat ramdisk - viz odstavec Práce v prostředí ramdisku#Korektní sestavení ramdisku u Debianu v předchozí kapitole
V případě že je systém zaváděný z ramdisku který je mimo virtuální stroj, je třeba nově sestaveným ramdiskem nahradit ten ramdisk který se při zavádění skutečně používá. |
Pokud bude všechno v pořádku a linuxovému jádru nebude předána volba overlay=off
najede stroj s překrytým souborovým systémem.
Zda-li overlay je či není aplikovaný lze zjistit kupř. z výpisu příkazu mount. Pokud systémový disk není překrytý, tak ho normálně vidíme namountovaný na kořen / souborového systému. V opačném případě se v tomto výpisu neobjeví.
Kam je připojený ale můžeme vidět, když si necháme vypsat obsah souboru /proc/mounts
. Z něm by se měl objevit systémový disk připojený na /root.
A v adresáři /overlay/unirw
by také měly být vidět veškeré nově vytvořené a změněné soubory.
Chceme-li překrytí vypnout, tak buď můžeme rovnou předat volbu overlay=off
vmlinuz ... overlay=off ...
Druhou variantou je operativní vypnutí překrytí, máme-li zaváděcí proces přerušený parametrem break
. V takovém případě stačí v kořeni ramdisku vytvořit soubor s názvem off
a příkazem exit pak pokračovat v zavádění.
vmlinuz ... break ... ... (initramfs) touch off (initramfs) exit ...
Pokud přepínáme mezi překrytím a RW přístupem, je třeba aby byl pro RW přístup vyexportován také adresář virtuálního stroje na vzdáleném NFS serveru! |
Skript po nastavení hostname
Tento skript je určen především pro naše bezdiskové stroje v laboratořích.
Na základě přidělené IPv4 adresy nastavuje aktuální hostname bezdiskového stroje a generuje soubor /etc/hosts
, ve kterém ukazuje záznam nfsroot
na aktuální NFS server.
nfsrootsetup
Spouštěcí skripty a operace v systému bezdiskového stroje
Připojení lokálního swapovacího oddílu
Pokud je systémový adresář připojený přes NFS překrytý virtuálním diskem vytvořeným v paměti, je žádoucí aby klientská pracovní stanice (nebo virtuál) měla na lokálním blokovém zařízení k dispozici swapovací oddíl, který umožní - v případě že začne místo v paměti docházet - odsypat data z fyzické paměti na fyzický disk.
Není-li swapovací oddíl k dispozici, tak to sice nevede ke zhroucení systému, ale ten se pak začne chovat stejně jako když dojde místo na disku - podivně. Init skript findswap se při svém spuštění pokusí tento swapovací oddíl vyhledat a připojit.
Od jádra ... nabízí NFS server také možnost swapování přes NFS |
findswap
Init skript pro spouštění dalších operací
Protože v našem prostředí bezdiskového linuxu využíváme i software, který není součástí distribuce a vyžaduje určitá specifická nastavení, je v adresáři /etc/init.d
umístěn skript,k335linux, který v okamžiku kdy je namountováno NFS spustí obsah skriptu v /etc/default/k335linux
.
Obsah následujícího skriptu je specifický pro naši konfiguraci. Pokud jej hodláte využít, musíte jeho obsah upravit. |
k335linux
Připojení uživatelských adresářů
Záznam v souboru /etc/fstab
, který využívá pro připojení vzdálených adresářů souboru /etc/hosts
, vygenerovaného skriptem v ramdisku
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no nfshomecreator@nfsserver testuser 1234 100 /nfs/diskless-home
Autorizace uživatelů
Toto téma řeší samostatný manuál - Autorizace uživatelů v linuxu
Použití
V rámci linuxového bezdiskového stroje nad NFS lze provádět veškeré operace jako kdyby šlo o stroj s normálním blokový, zařízení. Překrytí systémového disku však má z hlediska použití v laboratořích a učebnách jednu obrovskou výhodu - veškeré změny jsou uloženy pouze v rámci virtuálního disku, kterým je překrytý výchozí systém a po restartu se zahodí - s výjimkou souborů uložených v uživatelských adresářích.
Pokud je při zavádění přemountován přípojný bod /overlay/unirw
z prostředí ramdisku do systému, je jeho obsah dostupný v rámci sjednoceného souborového systému. Z něj pak lze vytáhnout změny a soubory vytvořené v rámci disklessového systému.
Využití překrytí systémového disku při přípravě binárních distribučních balíků
Chceme-li využívat překrytí při testovacích instalacích a tvorbě binárních balíčků, nemusíme patchovat a kompilovat vlastní linuxový kernel, ale můžeme použít rovnou modul overlay který je dnes již standardní součástí distribučního jádra.
mount -t overlay overlay -o lowerdir=/nejnizsi_vrstva,upperdir=/vrstva_kam_se_zapisuje,workdir=/work /sloucene_vrstvy
- lowerdir
- Adresář, který se má překrýt transparentní vrstvou.
- upperdir
- Adresář, do kterého se zapisuje obsah transparentní vrstvy která je zcela nahoře. Proto musí být do něj možné zapisovat.
- workdir
- Prázdný adresář, který se však musí vyskytovat v rámci stejného souborového systému, jako upperdir
Posledním parametrem příkazu je přípojný bod do kterého se sloučené vrstvy připojí.
- Součástí podkladové vrstvy lowerdir může být i několik transparentních vrstev nad sebou. Adresáře jsou od sebe odděleny dvojtečkou a postupně se na sebe vrství zleva doprava. Tj. adresář první v pořadí je nejníž položený.
- Adresáře upperdir a workdir lze vynechat, ovšem v takovém případě se sloučené vrstvy připojí na přípojný bod pouze v režimu pro čtení
Praktický příklad použití
Dejme tomu, že chcete vyzkoušet jaké změny v systému nastanou, pokud budete chtít nainstalovat aplikaci kompilovanou ze zdrojových kódů.
Příprava a kompilace
Kompilace si může vynutit instalaci nových balíčků, které ovšem jinak vůbec nepotřebujete. Proto si nejprve připravíte adresář /root/pivot
pro chroot, ve kterém budete moci provést konfiguraci a instalaci dalších potřebných balíčků, aniž by tím došlo k nabourání stávajícího systému.
Posledním příkazem chroot jste se přepnuli do systému, kde lze provádět konfiguraci zdrojového kódu a instalaci potřebných balíčků. Ve stejném prostředí můžete (ale nemusíte) zdrojové kódy také zkompilovat.
Jelikož nevíte co se kam bude instalovat, je lepší před vlastní instalaci vyskočit ven z chrootu (příkazem exit) a sestavit overlay znovu. Ovšem tentokrát již s využitím obsahu adresáře /root/prepare
, ve kterém se nalézá vše co bylo nainstalováno v předchozím kroku.
root@stroj:~# exit
root@stroj:~# umount /root/pivot/sys
root@stroj:~# umount /root/pivot/dev
root@stroj:~# umount /root/pivot/proc
root@stroj:~# umount /root/pivot
|
Instalace
Do parametru lowerdir přidáme nad systémový adresář (/) jako transparentní vrstvu adresář /root/prepare
do kterého se ukládaly změny v průběhu přechozího kroku. A pro uložení změn při instalaci vyžijeme nový prázdný adresář /root/binary
:
A můžeme bez obav spustit instalaci. Z obsahu adresáře /root/binary
můžeme sestavit binární .deb balíček, a obsah adresáře /root/prepare
nám zase pro změnu pomůže při detekci závislostí.
Jak sestavit binární .deb balíček je popsáno v manuálu k Pacemakeru |
- ↑ Podrobnější informace o problematice sjednocujících souborových systémů nabízí minisérie přeložených článků na http://www.abclinuxu.cz
- ↑ Od chvíle, kdy se stal overlayfs součástí hlavní vývojové větve jádra, přestali správci distribučního jádra Debianu aufs integrovat. U bezdiskového linuxu postaveného nad aufs, který běží nad NFS tak nezbývá než patchovat jádro, aby obsahovalo modul aufs.
- ↑ Dlouho se zdálo, že se po začlenění overlayfs situace změní k lepšímu, protože nebude nutné pro jiné distribuce, než Debian patchovat jádro. Jenže začlenění se neustále odsouvalo. Původně bylo ohlášeno již pro jádra řady 3.10, ale nakonec k tomu došlo až u jader řady 3.18 Po začlenění byl název jaderného modulu byl z původního overlayfs změněn na overlay, ovšem mnohem závažnější problém nastal v tom, že změny v jeho kódu znemožnily použít jako podkladový souborový systém adresář sdílený přes NFS.