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.
Linuxové jádro s podporou sjednocení souborového systému
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.
Bohužel, problém aufs 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. Do hlavní vývojové větve nebyl aufs, stejně jako unionfs přijat, jelikož 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. Proto nakonec upřednostnili overlayfs, který provádí sjednocení adresářů pouze na úrovni VFS. Ten se se stal součástí hlavní vývojové větve od jádra verze 3.18-rc2. Jenže overlayfs, tak jak bylo nakonec do jádra implementováno nelze - na rozdíl od jeho původní vývojové verze - používat nad systémovým diskem nasdíleným přes NFS.
aufs
Ke kompilaci jádra lze použít
- 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
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
Zpočátku se zdálo, že začleněním overlayfs se situace změní k lepšímu, protože nebude nutné 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ž od jader řady 3.18
Název modulu byl z původního overlayfs změněn na overlay, ovšem mnohem závažnější je, že byly provedeny změny, které znemožňují použít jako podkladový souborový systém sdílený přes NFS.
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 na NFS tak není v současné době jiné cesty než patchovat jádro, aby obsahovalo modul aufs. |
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.
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 |