Překrytí systémového disku - overlay filesystem
Koncept transparentního překrytí systémového disku nasdíleného přes NFS 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 jeho vývoj zaostávat, proto jsme dali přednost progresivnějšímu aufs, které podporuje i nejnovější jádra řady 3.x a má zdrojový kód udržován (stejně jako kernel) v gitu.
Linuxové jádro s podporou sjednocení souborového systému
I když je modul aufs součástí distribučního jádra Debianu, není jeho zdrojový kód součástí hlavní vývojové větve jádra. Jak přidat kód pro aufs do vanilla kódu je uvedeno níže.
Do hlavní vývojové větve nebyl aufs, stejně jako unionfs přijat proto, že se vývojářům kernelu nelíbilo, že se sjednocení adresářů neprovádí v rámci VFS (virtuálního souborového systému), ale mimo něj.
Jiná použitelná alternativa nebyla dlouho k dispozici, proto vývojáři distribucí používají ke kompilaci jádra
- buď upravený zdrojový kód z repozitáře git://aufs.git.sourceforge.net/gitroot/aufs/aufs3-linux.git
- nebo kód pro sestavení externího modulu z repozitáře git://aufs.git.sourceforge.net/gitroot/aufs/aufs3-standalone.git
aufs
Modul aufs je součástí distribučního jádra Debianu. Následující postup je tedy zapotřebí pouze pokud máte v úmyslu přidat kód pro sestavení aufs do vanilla jádra. |
Stažení a patchování zdrojového kódu
root@nfsserver :~/git# git clone git://aufs.git.sourceforge.net/gitroot/aufs/aufs3-standalone.git
root@nfsserver :~/git# cd aufs3-standalone.git
root@nfsserver :~/git# git checkout origin/aufs3.0
|
Zdrojáky z http://www.kernel.org
root@nfsserver :~/git# cd /usr/src
root@nfsserver :/usr/src# wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.8.1.tar.bz2
...
root@nfsserver :/usr/src# tar -xjf linux-3.8.1.tar.bz2
|
- aufs3-kbuild.patch
- aufs3-base.patch
- aufs3-proc_map.patch
- aufs3-standalone.patch
Sestavení jádra
Sestavení jádra lze provést standardním způsobem přímo v prostředí bezdiskového stroje.
root@diskless :/usr/src# ln -s linux-3.8.1 linux
root@diskless :/usr/src# cd linux
root@diskless :/usr/src/linux# gunzip -c /proc/config.gz > .config
root@diskless :/usr/src/linux# make oldconfig
...
|
Během této operace se u nových modulů konfigurační skript zeptá, jestli mají být součástí jádra, nebo ne. Pokud se již nějaké nastavení modulu ve stávající konfiguraci vyskytuje, tak se automaticky použije tak jak je.
Pokud chcete provést v konfiguraci jádra nějakou změnu dodatečně, tak lze přímo editovat soubor .config
a následně znovu spustit výše uvedený příkaz.
Pro rozsáhlejší změny je lepší použít následující příkaz, kterým se vygeneruje ze zdrojáků jádra konfigurační menu, jehož prostřednictvím lze konfiguraci měnit.
Sestavení tohoto konfiguračního menu vyžaduje aby byl do systému doinstalován balík ...
root@diskless :/usr/src/linux# make menuconfig
|
Nakonfigurované jádro lze po sestavení rovnou zabalit do instalačního balíku
root@diskless :/usr/src/linux# make
...
root@diskless :/usr/src/linux# make deb-pkg
...
|
overlayfs
Jak se zdá, v brzké době se však situace změní k lepšímu a od jádra řady 3.10 by se konečně mohl stát součástí hlavní vývojové větve jádra overlayfs, který realizuje sloučení obsahu dvou adresářů do jednoho na úrovni VFS. Tedy z pohledu vývojářů správně.
V současné době má overlayfs (pokud vím) implementováno ve svém distribučním jádře Ubuntu a OpenWrt.
Skripty v ramdisku
Součástí ramdisku jsou skripty, které realizují operace, co musí proběhnout ještě před spuštěním init procesu bezdiskového systému.
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
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
Využití překrytí systémového disku při přípravě binárních distribučních balíků
Jak už bylo demonstrováno v příkladu pro sestavení jádra, v rámci bezdiskového stroje lze provádět veškeré operace jako kdyby šlo o normální blokové zařízení. Překrytí systémového disku však má z hlediska administrátora 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.
Pokud byl při zavádění přemountován z prostředí ramdisku na přípojný bod /overlay/unirw
je jeho obsah dostupný v rámci sjednoceného souborového systému. Z něj lze získat vše potřebné k vytvoření a sestavení binárního balíčku pro jakýkoliv software. Ukázkovým příkladem může být kupř. sestavení instalačního balíčku pro VMware player.