overlay

Z DCEwiki
Skočit na navigaci Skočit na vyhledávání

Opravdový Full-Diskless, který se obejde bez lokální instalace, máme v reálném nasazení až od roku 2011[1], ale klíčovou technologii, na které je založen použil poprvé Pavel Píša již roku 2005. Jeho nápad – překrýt připojený adresář připojený přes NFS pomocí unionfs vrstvou v tmpfs (RAM) – vyřešil nejproblematičtější bod disklessové infrastruktury.

Každý operační systém potřebuje datový prostor, kam může za běhu zapisovat změny – logy, databáze, konfigurační změny, atp. To není u Disklessu problém. Rozdíl je pouze v tom, že se nezdržuje čekáním na to, až se zapíšou na lokální disk, rovnou je odesílá po síti na server, ať si je někam uloží.

Je to velice výhodný přístup! Až do nástupu SSD a NVME disků, byly IO operace úzkým hrdlem každého počítačového systému. Aby mohl zapsat datový blok z rychlé RAM na pomalý rotační disk, musel vyčkat se zápisem až se roztočí, teprve poté co mu driver oznámil, že jsou data zapsaná mohl čekající proces pokračovat dál.

Diskless nic takového nezdržuje. Pošle data po síti, server mu odpoví, že data přijal a proces pokračuje dál. Nestará se, kdy, kam a jak server data skutečně uloží. A server, který obsluhuje více takových strojů má vžyky lepší ekonomiku provozu než pracovní stanice.

  • Je vybaven větším množstním RAM než pracovní stanice, takže se nezdržuje se neustálým roztáčením disků. Ponechá si data v RAM, dokud jich není tolik aby mu stálo za to disky roztočit a pomalu je uložit.
  • Větší množství disků také umožňuje rychlejší zápis. Nemusí čekat až se jeden disk se zápisem vypořádá. Rozdělí data na víc částí a každou z nich zapíše ve stejnou chvíli na jiný disk. Totéž platí i pro čtení.
  • Navíc má sdílenou RAM, takže se nezdržuje pokud chce více strojů najednou jeden a ten samý blok dat, co už jednou načetl. Rovnou jim ho pošle.

Ale jeho datový prostor na serveru je drahý. Hodně disků, hodně RAM, hodně počítání, a k tomu velká spotřeba elektrické energie.

Diskless, který neukládá změny přes overlay do RAM, musí na něm mít svůj vyhrazený datový prostor, přístupný v režimu read-write, kam si může svoje změny zapisovat. A čím víc strojů server obsluhuje, tím víc prostoru to zabere.

Ovšem u laboratorních strojů není potřeba systémové změny ukládat na server. Zapisují se do lokální RAM a nevadí když se při restartu zahodí. Naopak. Je výhodné, když se po restartu ocitne vše ve výchozím stavu. Nezůstanou žádné soubory, ve kterých by číhal na svou oběť vir, či nějaký ransomware.

Tím pádem stačí na serveru pouze jeden adresář, který může být klidně exportován read-only, takže nehrozí, že by jeho obsah v nestřeženou chvíli někdo zakryptoval.

A protože je systém všude stejný, je bonusem i to, že data, která si uživatel zapisuje přes NFS do svého adresáře připojeného v režimu read-write, jsou vzápětí použitelná i jinde.

ramdisk tmpfs.svg

Verze

MD5SUM Velikost kB Datum vytvoření
e14b162421e25a93dbd9025e56cd1ed1 1373 2013-01-28 root_overlay – původní verze skriptu s podporou aufs a unionfs.
b3b8fc923fceefeec607161b6883e18b 2334 2013-03-19 root_overlay rozšířený o podporu overlayfs
75367479f388b68e15b28859f346c66d 2531 2016-02-09 první verze skriptu po přejmenování na overlay, ještě s podporu skriptu unionfs
11082396ef01f915f060258cc7795d4a 10086 2016-09-22 verze publikovaná na SourceForge.net
51ea3d314d6083d8ff5900330869d68f 10536 2016-09-30 první verze s podporou pro findswap používaná na DCE až do XXX
d9a9896c718dbd3b801966d9f4c1066f 14133 2019-09-04 první vývojová verze s podporou pro mcachefs (pro turtleboty)
10c3c08b5b91dab1672a3ed51e600c08 15531 2019-09-18 druhá vývojová verze pro DC s podporou pro mcachefs (pro turtleboty)
ea6eeac8dcd1397c760fd912a0d67c29 18100 2020-03-19 třetí vývojová verze pro DC s podporou pro mcachefs (pro turtleboty) používaná do XXX

Princip

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
...
Upozornění 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!

Verze z 2016-02-09

overlay

Poznámka
#!/bin/sh

PREREQ="unionfs"
prereqs()
{
     echo "$PREREQ"
}

case $1 in
prereqs)
     prereqs
     exit 0
     ;;
esac

overlay=${overlay-off}

# Zapnutí překrytí předáním hodnoty [on|unionfs|overlay] prostřednictvím parametru overlay, případně nastavením parametru root na hodnotu [overlay]
# Dodatečně lze zapnout překrytí vytvořením souboru v kořeni ramdisku
# on - aktivuje unionfs i overlay, stejně jako parametr overlay
# uninfs - aktivuje pouze unionfs
if [ -e /on ] || [ -e /overlay ] || [ "${overlay}" = "on" ] || [ "${overlay}" = "overlay" ] ; then \
    if [ "${BOOT}" = "nfs" ] ; then
        if [ -d /tmp/unionfs ] ; then
            echo "Make overlay ${rootmnt}"
        else
            echo "I am sorry, but overlay over nfs is disfuncted, for it must be overlayed unionfs root, which has any problem"
            exit 0
        fi
    fi
else
    exit 0
fi

modprobe overlay
[ "$?" != "0" ] && echo "Module for overlay is not integrated into ramdisk" && exit 0


# Potřebuje zavést modul fuse..

# Kód, který připraví přípojné body a namountuje přes unionfs, kterým je překryto NFS systémový overlay
echo "Move ${rootmnt} into /tmp/overlay"
mkdir /tmp/overlay
mount -n -o move ${rootmnt} /tmp/overlay

echo "Mount ramdisk by size ${ramsize}"
mkdir /tmp/unirw
mount -n -t tmpfs none /tmp/unirw
mkdir /tmp/unirw/overlaydiff
mkdir /tmp/unirw/overlaywork

echo "Ramdisk overlayed unionfs ..."
mount -n -t overlay overlay -o lowerdir=/tmp/overlay,upperdir=/tmp/unirw/overlaydiff,workdir=/tmp/unirw/overlaywork ${rootmnt}

if [ "$?" == "0" ] ; then
        echo "Unionfs is overlayed"
        # Vytvoření chybějících adresářů, na které se namountují 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
        # 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
        mount -n -o move /tmp/unirw ${rootmnt}/overlay
        if [ "$?" == "0" ] ; then
                chmod 755 ${rootmnt} # Disable rw access for non-root users
        else
                echo "I am sorry, but overlaydiff directory don't move into overlayed system environment"
        fi
        echo "OK. ${rootmnt} is overlayed"
else
        echo "Overlay failed. Sorry"
fi

unionfs

Poznámka
#!/bin/sh

PREREQ=""
prereqs()
{
     echo "$PREREQ"
}

case $1 in
prereqs)
     prereqs
     exit 0
     ;;
esac

overlay=${overlay-off}
pause=${pause-1}
union=${union-hide_meta_files}

# Zapnutí překrytí předáním hodnoty [on|unionfs|overlay] prostřednictvím parametru overlay, případně nastavením parametru root na hodnotu [overlay]
# Dodatečně lze zapnout překrytí vytvořením souboru v kořeni ramdisku
# on - aktivuje unionfs i overlay, stejně jako parametr overlay
# uninfs - aktivuje pouze unionfs
if [ -e /unionfs ] ; then
    if [ -e /bin/unionfs ] ; then
        echo "Make temporary union ${rootmnt}"
    else
        echo "Unionfs-fuse is not installed into initrd!"
        echo "You must installed it, and doit: update-initramfs -u"
        sleep ${pause}
        exit 0
    fi
else
    if [ "${overlay}" = "off" ] || [ -e /off ] ; then
        exit 0
    elif [ "${overlay}" = "unionfs" ] ; then
        if [ -e /bin/unionfs ] ; then
            echo "Make union ${rootmnt}"
        else
            echo "Unionfs-fuse is not installed into initrd!"
            echo "You must installed it, and doit: update-initramfs -u"
            sleep ${pause}
            exit 0
        fi
    else
        exit 0
    fi
fi

modprobe fuse
[ "$?" != "0" ] && echo "Module for FUSE is not integrated into ramdisk" && exit 0

mkdir /tmp/uniondiff
mkdir /tmp/unionfs

[ -d /tmp/uniondiff ] && echo "Directory for unionfs diff is created"
[ -d /tmp/unionfs ] && echo "Directory for unionfs root is created"


echo "Compute size of tmpfs"
MEMFREE=$(grep MemFree /proc/meminfo | cut -d ' ' -f 10)
size=${size-1/2}
RAMSIZE=$((${MEMFREE}*${size}))
echo "Size of tmpfs is set on ${RAMSIZE} kb"
sleep ${pause}

mount -n -o size=${RAMSIZE}k -t tmpfs none /tmp/uniondiff
mount -n -o move ${rootmnt} /tmp/unionfs


echo "Mounting root as unionfs with option: ${union}"
sleep ${pause}

unionfs -o cow,allow_other,use_ino,suid,dev,nonempty,${union} /tmp/uniondiff=rw:/tmp/unionfs=ro ${rootmnt}
if [ "$?" != "0" ] ; then
    echo "FAIL: NFS is NOT overlayed"
    sleep ${pause}
    exit 0
fi

mkdir -p ${rootmnt}/dev
mkdir -p ${rootmnt}/proc
mkdir -p ${rootmnt}/sys
mkdir -p ${rootmnt}/tmp
mkdir -p ${rootmnt}/run
rm -rf ${rootmnt}/var/lock
mkdir -p ${rootmnt}/var/lock

echo "Bind uniondiff into unionfs root.."
mkdir ${rootmnt}/overlay
mount -n -o bind /tmp/uniondiff ${rootmnt}/overlay
sleep ${pause}
  1. Aleš Kapica (*1969) Jak jsem se dostal k vývoji disklessové infrastruktury – pokračování:
    V době mého nástupu na DCE (2008) fungovaly laboratorní stroje pouze jako Half-Diskless a já nevěděl o Disklessu nic. Byl jsem přijat coby expert na virtualizaci linuxových strojů, abych zajišťoval za katederního IT nezbytnou spolupráci při realizaci projektu Eusophos, v jehož rámci byl Ondrou Fialou vyvíjen LabLink – virtuální laboratorní systém, který využíval vrstvení virtualizovaných MS Windows pro zajištění software nezbytného k práci s laboratorními modely – ta koncepce se mi líbila a možná, že právě to mne přivedlo později na myšlenku využít sendviče i pro linuxový laboratorní diskless.
    První rok zabrala většinu mé pracovní doby dokumentace toho, co kde bylo v provozu. IT oddělení DCE tehdy ještě neexistovalo. Pracovní stanice řešil Petr Haba. MS Windows server s katederním webem Michal Komrska a František Vaněk měl pod palcem síť a Novell. Vše ostatní jsem měl řešit já, ale co, to nikdo nevěděl. Lukáš Moc, můj předchůdce mi předal štůsek papírů a zmizel, aniž by mi sdělil alespoň přístupové heslo. Bylo to jak v pohádce o kohoutkovi a slepičce. Abych měl kam sbírat informace, rozjel jsem tuhle wiki, ale nejdřív jsem si do ní musel udělat vlastní rozšíření, abych mohl na jednom místě soustředit veřejné i neveřejné infromace.
    A tak až po roce jsem se dostal k tomu, abych začal intenzivně spolupracovat s Pavlem Píšou(*1970) na vývoji laboratorního Full-Disklessu na bázi linuxové distribuce. Bohužel moduly linuxového jádra, které jsme potřebovali použít, tehdy ještě nebyly součástí hlavní vývojové větve. Také zavaděč Grub který jsme využívali byl problematický. Původní verze se již nevyvíjela a vývoj nové probíhal pomaleji než bychom si přáli. Takže za rok dosažení cíle lze považovat teprve rok 2011, kdy Pavel Píša odprezentoval náš Full-Diskless systém počítačové laboratoře, zhruba po roce ostrého nasazení, v rámci akce InstallFest (červen 2011).