Skript postupně namountuje adresáře vrstev nasdílených přes NFS na přípojné body v ramdiskovém adresáři /tmp
,
pak zavede jaderný modul overlay
a sestaví sendvič, který obsah vrstev připojených přes NFS překryje virtuálním tmpfs
diskem vytvořeným v rámci dostupné RAM.
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.
Skript v ramdisku najdete v podadresáři /scripts/nfs-bottom/
.
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!
|
|
#!/bin/sh
PREREQ=""
prereqs()
{
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
# Kód pro vypnutí překrytí předáním volby overlay=off jádru
[ "${overlay}" == "off" ] && exit 0 || [ -e /off ] && exit 0
# Kód, co se stará o zavedení modulu, který umožní překrytí souborového systému...
insmodule()
{
if ! grep -q $1 /proc/filesystems ; then
modprobe $1 >/dev/null 2>/dev/null
if ! grep -q $1 /proc/filesystems ; then
if [ -d "${rootmnt}/lib/modules/$(uname -r)/extra/$1" ] ; then
if [ ! "$(insmod ${rootmnt}/lib/modules/$(uname -r)/extra/$1/$1.ko)" ] ; then
echo $1
fi
fi
else
echo $1
fi
else
echo $1
fi
}
for i in overlayfs aufs unionfs
do
OVERLAY=$(insmodule $i)
[ "$OVERLAY" == "$i" ] && break
done
# Kód, který připraví přípojný bod a namountuje virtuální disk, kterým se překryje systémový disk
# namountovaný přes NFS...
mkdir /tmp/unirw
mount -n -t tmpfs none /tmp/unirw
case "$OVERLAY" in
overlayfs) echo "Remounting root as overlayfs ..."
mount -n -t overlayfs -o upperdir=/tmp/unirw,lowerdir=${rootmnt} overlayfs ${rootmnt}
;;
aufs) echo "Remounting root as aufs ..."
mount -n -t aufs -o dirs=/tmp/unirw=rw:${rootmnt}=nfsro unionfs ${rootmnt}
;;
unionfs) echo "Remounting root as unionfs ..."
mount -n -t unionfs -o dirs=/tmp/unirw=rw:${rootmnt}=ro unionfs ${rootmnt}
;;
*) panic "Actual initrd.img has not a module for overlay filesystem"
;;
esac
# Mají-li být data co se ukládají na virtuální disk - kterým je systémový disk překrytý - dostupná,
# pak je třeba provést přesun namountovaného virtuálního disku do adresářové struktury sjednoceného
# souborového systému. V opačném případě lze tento kód vynechat.
mkdir -p ${rootmnt}/overlay/unirw
mount -n -o move /tmp/unirw ${rootmnt}/overlay/unirw
chmod 755 ${rootmnt} # Disable rw access for non-root users
# Vytvoření adresářů, na které se mountují další virtuální souborové systémy.
mkdir -p ${rootmnt}/dev
mkdir -p ${rootmnt}/proc
mkdir -p ${rootmnt}/sys
mkdir -p ${rootmnt}/tmp
mkdir -p ${rootmnt}/run
mkdir -p ${rootmnt}/var/lock
|