Jak vytvořit bezdiskový stroj s operačním systémem GNU/Linux
Operační systémy virtuálních strojů mají většinou své soubory uloženy podobně jako fyzické stroje v rámci souborového systému na lokálním blokovém zařízení.
Za tímto lokálním blokovým zařízením se může ovšem může ve skutečnosti skrývat cokoliv:
Lokální blokové zařízení
- běžné fyzické blokové zařízení ve stroji
- logický LV disk
- soubor uložený na lokálním souborovém systému, připojený připojený přes loop
Síťové blokové zařízení
- iSCSI disk
- RBD disk (Ceph)
- NBD zařízení
Blokové zařízení typu RAID
- DRBD raid
- sw RAID složený ze síťových blokových zařízení
O komunikaci mezi virtuálním blokovým zařízením a místem kde jsou data ve skutečnosti uložená se stará použitý virtualizační nástroj.
Bezdiskové stroje s operačním systémem GNU/Linux využívají toho, že jádro, které běží v paměti může použít i jiné speciální souborové systémy - mezi nimi i síťový souborový systém NFS.
NFS (Network File System) je distribuovaný souborový systém, který umožňuje sdílet obsah lokálního počítače (serveru) z více míst současně prostřednictvím internetové sítě. Na rozdíl od clusterových souborových systémů, které pracují s distribuovaným blokovým zařízením, neřeší konkurenční přístup k souborům vzdálený klient na stanicích (tj. nody), ale NFS server který data publikuje.
Výhody síťového souborového systému NFS
- Umožňuje přístup do jednoho adresáře z více přípojných bodů, což usnadňuje průběžné zálohování
- Nasdílení jednotlivých souborů sebou nese nižší nároky na síťovou režii - Největší nápor na I/O operace totiž bývá při startu operačního systému, kdy se načítají do paměti systémové soubory. Dál se již načítají soubory pouze v případě potřeby a ukládají změny. 95% nainstalovaných souborů většinou systém nikdy nepoužije. Je-li používán jeden adresář z více míst, nemusí server data opakovaně načítat z disku, ale může použít vyrovnávací paměť, což vede ke snížení průběžné režie I/O operací na blokových zařízeních serveru.
Nevýhody síťového souborového systému NFS
- Jeden centrální přístupový bod - když se rozpadne síťové připojení může dojít ke zhroucení stroje, není-li spojení obnoveno včas.
- Je třeba dbát na zajištění bezpečnosti přístupu - Multiuživatelský přístup dovoluje měnit soubory pod rukou.
- Nižší hrubý výkon při rozsáhlých I/O operacích. NFS není vhodné pro uložení velkých souborů, u kterých dochází v celém rozsahu ke změnám uložených dat - typicky databáze či obrazu disků virtuálních strojů
I když síťové souborové systémy obecně nejsou vhodné pro práci s takovými soubory lze při dobrém HW vybavení a optimalizované konfiguraci síťových prvků[1] NFS použít. |
- ↑ Výkon síťových přenosů lze zvýšit kupř. použitím tzv. jumbo frames, které ovšem musí podporovat rovněž síťové prvky mezi serverem a klientem.
Vytvoření výchozí instalace bezdiskového stroje
Použití bezdiskových strojů předpokládá, že máte k dispozici:
- datové úložiště
- na kterém běží NFS server[1]
- stroj
- který může být buď fyzický nebo virtuální. Musí všakale mít funkční síťové připojení ke stroji s adresářem sdíleným přes NFS
Instalace do NFS adresáře s použitím utility debootstrap
Anglické slovo bootstrap původně označovalo jenom poutko na botě, za které si ji přidržujeme, když se do ní snažíme narvat nohu. Během 20. století se přeneslo do oblasti počítačů. Procesu, při které se cpe jádro operačního systému do RAM, podobně jako noha do boty, se začalo říkat boot (angl. bota) a tohle slovo přešlo na proceduru, při níž se připravuje kromě jádra také základní sada knihoven a nástrojů, neboli operační systém, jak se obvykle tomuto „slepenci” říká. A linuxová distribuce Debian má k dispozici dokonce hned dva nástroje, přes které lze tuhle proceduru realizovat:
- cdebootstrap
- Podle manuálu jde o zjednodušenou obdobu následující utility, určenou k instalaci hotové sady, na základě zvoleného setu a kódového názvu distribuce (např. jessie, stretch, sid atp.). Sety neboli flavours (angl. příchutě) se od sebe liší tím, kolik toho nainstalují:
- minimal (cca 172 MB pro trixie) – Nainstaluje pouze základ operačního systému + apt – nástroj přes který lze stáhnout a doinstalovat další binární balíky, ve kterých jsou zabalené hotové, již sestavené aplikace.
- build (cca 454 MB pro trixie) – Kromě základních utilit operačního systému a nástroje apt doinstaluje také základní sadu software, nezbytnou pro sestavení binárních balíků ze stažených zdrojových balíků, ve kterých nejsou zkompilované aplikace, ale jejich zdrojový kód. Tuhle variantu lze použít pokud si chce někdo sestavit operační systém optimalizovaný pro svůj HW.
- standard (cca 259MB pro trixie) – Je výchozí sada, která nainstaluje veškeré balíky, které lze považovat z hlediska operačního systému za důležité.
Vyžaduje doinstalování balíků libdebian-installer-extra4 libdebian-installer4 |
- debootstrap
- Na první pohled se od předchozí aplikace neliší a má dokonce podobnou syntaxi. Ale neodstraňuje po instalaci balíky a navíc instaluje utility pro souborové systémy ext, balík tzdata. A balíky mount, passwd, logsave, které dnes nahrazuje z hlediska funkcionality systemd. A naopak neobsahuje by default fakeroot.
- Má rovněž k dispozici řadu parametrů, jimiž lze ovlivnit, jak bude vypadat nainstalovaný systém. V zásadě je tedy úplně fuk, který z těchto nástrojů použijeme. I tahle utilita umožňuje instalovat předchystané sety, označované jako variants:
- minbase (cca 213 MB po odstranění balíků 180 MB pro trixie) – tenhle ekvivalent setu minimal se liší jen v detailech. Také obsahuje pouze požadované (required) balíky + APT.
- buildd (cca 622 MB po odstranění balíků 514 MB pro trixie) – ekvivalent setu build obsahuje oproti minbase navíc nástroje nezbytné ke kompilaci sofware ze zdrojového kódu.
- fakechroot – vyžaduje doinstalovaný fakechroot a spuštěné prostředí fakechroot.
- Pokud není uvedena žádná varianta, instaluje téměř stejný set jako cdebootstrap v případě variace 'standard'.
Vyžaduje pouze doinstalování balíku arch-test, pokud nehodláte využít fakechroot. |
- 1. Nejprve si vytvořím adresář
/path_to_blank
, který poslouží jako přípojný bod pro NFS - 2. Po jeho vytvoření připojím adresář
/volumes/diskless_root_dir
nasdílený datovým úložištěm s IP adresou 147.32.87.10 - 3. Příkazem mount zkontroluji, zda-li je adresář opravdu připojen v režimu rw
- 4. Pokud je připojení v pořádku, vytvořím v připojeném adresáři podadresář
/path_to_blank/blank_wheezy
do kterého provedu minimalistickou instalaci debootstrap - 5. Po jeho vytvoření do něj příkazem cd skočím..
- 6. ..a spustím přes debootstrap instalaci Debianu wheezy pro 64 bitovou architekturu procesoru (amd64)
- Parametrem --keyring se předá cesta ke klíči, kterým se bude kontrolovat důvěryhodnost stažených balíků
- Parametr --include zajistí během bootstrapu instalaci balíků, které nejsou součástí základní instalace
Pokud deboostrap doběhne v pořádku, odstraní sám svůj dočasný adresář. Přesto je ovšem třeba ještě provést menší čistku a úpravu konfigurace.
Vyčištění a úprava konfigurace bezdiskového stroje
Pro větší kontrolu jednotlivých konfiguračních kroků je vhodné v jeho konfiguraci odkomentovat konfigurační volby v souboru /etc/etckeeper
, které zamezí tomu, aby etckeeper ukládal změny do git repozitáře automaticky:
AVOID_DAILY_AUTOCOMMITS=1 AVOID_COMMIT_BEFORE_INSTALL=1Pozn.: K editaci konfiguračního souboru lze použít minimalistické vi, nebo nano, které jsou součástí výchozí instalace přes debootstrap.
Nastavení /etc/hostname
Při instalaci přes deboostrap je obvykle zkopírován
soubor hostname
stroje na kterém byl příkaz spuštěn.
Pokud budeme tuto instalaci používat jako výchozí polotovar, je dobré nastavit obsah tohoto souboru tak aby to bylo zřejmé. Kupř. blank_wheezy
Pokud má být tato instalace spuštěna jako konkrétní stroj, tak samozřejmě musí obsah /etc/hostname
odpovídat jeho jménu
Debian a chroot
Po přepnutí do systémového adresáře přes utilitu chroot lze se systémem pracovat stejně, jako by byl spuštěn jako na reálném či virtuálním stroji. Tzn. že lze rovněž spouštět a restartovat nejrůznější démony, které by se však mohly dostat do kolize s démony hostitelského stroje.
Pokoušejí se o to i některé instalačí balíčky Debianu. Proto u něj existuje možnost vytvořit spustitelný bezpečnostní skript /usr/sbin/policy-rc.d
.
Pokud tento skript vrátí jinou hodnotu než 0
, je spouštění démonů při instalaci a rekonfiguraci přes APT potlačeno.
/usr/sbin/policy-rc.d
Jednou z možností, jak odlišit systém hostitele od systému, který běží přes chroot je test aktuálního hostname. Pokud systém běží autonomně, vrací obsah souboru /etc/hostname
. Je-li spuštěn přes chroot, vrací hostname hostitele.
stroj (DATASERVER) :~# chroot /path_to_blank/blank-wheezy
root@stroj:/# cat /etc/hostname
wheezy-diskless
root@stroj:/# cat /usr/sbin/policy-rc.d
#!/bin/sh
[ "wheezy-diskless" = "$(hostname)" ] && exit 0
exit 101
root@snoopy:/# /usr/sbin/policy-rc.d
root@snoopy:/# echo $?
101
root@snoopy:/# dpkg-reconfigure cron
invoke-rc.d: policy-rc.d denied execution of stop.
invoke-rc.d: policy-rc.d denied execution of start.
|
Výše uvedený příklad demonstruje, jak dopadne v chrootovaném prostředí pokus o rekonfiguraci debianího balíku cron, pokud příkaz hostname nevrací wheezy-diskless
.
Občas se vyskytne situace, kdy potřebujeme, aby příkaz hostname v chrootovaném prostředí vracel jméno, které je nastaveno v něm. Ač je řešení triviální, není obecně známé
root@stroj:/# cat /etc/hostname
stroj-v-chroot
root@stroj:/# hostname
stroj
root@stroj:/# hostname $(cat /etc/hostname)
root@stroj:/# hostname
stroj-v-chroot
|
Unifikace UID a GID
Po zkopírování souborů /etc/group
a /etc/passwd
je třeba provést reinstalaci stávajících balíčků. Tím se zajistí, že se UID a GID adresářů, se kterými software nainstalovaný v támci těchto balíčků nastaví podle aktuální konfigurace
stroj (chroot) :~# for i in $(dpkg -l | awk '{print $2}'); do apt-get --reinstall install $i; done
Při aktualizaci balíku base-files
na vás APT zařve, že chce tyto soubory přepsat:
May I update your system? [Y/n]
V žádném případě mu to nesmíte dovolit!
U některých instalačních balíků se může vyskytnout postinstalační skript, který bude za každou cenu chtít uživatele a jeho skupinu vytvořit. Typicky ntp. V takovém případě zhavaruje instalační proces na konfiguraci balíku.
Řešení je jednoduché. Řádky, které vytváří uživatele a skupinu v příslušném postinstalačním skriptu zakomentovat. Pro 'ntp se jedná o soubor Pak už konfigurace balíku proběhne v pořádku. |
Nastavení obsahu /etc/hosts
Obsah souboru /etc/hosts
se nekopíruje a ve výchozím nastavení obsahuje pouze lokální adresy. Tudíž u polotovaru nedoplňujeme nic. U stroje který má být spuštěn nastavíme před lokální adresy jeho síťovou adresu a doménu.
Nastavení obsahu /etc/resolv.conf
Soubor /etc/resolv.conf
opět deboostrap kopíruje ze stroje na kterém byl spuštěn. Jeho obsah se obvykle nijak nemění. Pouze má-li být stroj spouštěn v jiné síti, než kde byl instalován, je nutná úprava
Instalace dalších balíčků
Jádro a nástroje pro úpravu ramdisku je třeba instalovat pouze v případě, že chceme ramdisk, který se pak použije při spouštění bezdiskového stroje sestavovat v prostředí bezdiskového stroje. Přo běžný provoz to není zapotřebí, pokud se do něj zavedou všechny potřebné moduly během zavádění z ramdisku,
Instalaci lze v prostředí chroot provést příkazem
apt-get install linux-image-3.2.0-4-amd64 initramfs-tools
APT kromě distribučního balíčku jádra, který obsahuje všechny potřebné moduly, stáhne a nainstaluje vše potřebné pro úpravu ramdisku.
Při kompilaci vlastního jádra z vanilla kódu je třeba mít na paměti, že kód pro aufs, který umožňuje překrytí systémového disku - overlay filesystem není - na rozdíl od distribučního balíku se zdrojovým kódem co je v Debianu, jeho součástí. |
Mohou se přidat i další balíčky, které sice nejsou součástí minimalistického systému instalovaného přes bootstrap, ale určitě by neměly chybět..
- locales
A balíčky které zvyšují komfort při administraci
- less - utilita pro prohlížení obsahu souborů
- screen
- ntp - démon pro nastavení systémového času
- mc - správce souborů
- openssh-server - pro vzdálený terminálový přístup do diskless systému
- openssh-client - pro vzdálený terminálový přístup z diskless systému
- puppet - klient systému pro řízenou správu konfigurace počítače Puppet
- ...
Pro rychlé získání seznamu nainstalovaných balíčků z jiné/dřívější instalace Debianu lze použít následující příkaz
aptitude search '?installed?not(?automatic)' \ | sed -n -e 's/^i[ \t]\+\([^ \t]*\)[ \t].*$/\1/p' >packages
Podmínka hledání zajistí, že se v seznamu neobjeví balíčky nainstalované v důsledku automatických závislostí. Tyto není dobré explicitně instalovat, protože v mnoha případech se závislosti koncových balíků mění (používají již jinou verzi/variantu nebo daný balík již nepotřebují) a je tedy správné, aby se závislosti vyhledaly nově.
Instalace upraveného seznamu je pak možná příkazem
aptitude install `cat packages`
Nastavení locales
dpkg-reconfigure locales
Pro češtinu UTF-8
Nastavení fontu zobrazovaného na konzoli
Pokud se mají na kozoli správně zobrazovat znaky v UTF-8 je třeba provést rekonfiguraci konzole následujícím příkazem:
dpkg-reconfigure console-setup
Pro zobrazování češtiny je třeba zvolit znakovou sadu Latin2 a nakonfigurovat font konzole.
Nastavení rozložení klávesnice
dpkg-reconfigure console-data
Pro nastavení české klávesnice s psaním angl. kláves přes pravý ALT - qwerty
Nastavení časové zóny
dpkg-reconfigure tzdata
Nastavení výchozího uživatele
Jsme-li v chrootu, je to vhodná příležitost k nastavení výchozího uživatele a jeho hesla. Tímto uživatelem nemusí být nutně uživatel root, pokud si doinstalujete aplikaci sudo a nově vytvořeného uživatele přidáte do stejnojmenné skupiny.
Pokud nechcete sudo používat, tak je třeba nastavit uživateli root heslo příkazem passwd, neboť pak byste nemohli v prostředí virtuálního použít příkaz su, ani provést případné opravy v single režimu.
Přidání již existujícího hesla
Heslo, resp. jeho "hash" nemusíte příkazem passwd nutně generovat znovu, ale má-li se při autorizaci používat soubor /etc/passwd
, je možné ho překopírovat jeho "hash" do tohoto souboru odjinud.
Obecně je však doporučeno používat hesla umístěná v souboru /etc/shadow
. To však vyžaduje úpravu i souborů /etc/passwd
a /etc/groups
, kdy první znak *
(hvězdička) na každém řádku musí být nahrazen znakem x
(malé x). Tuto operaci však lze jednoduše realizovat pomocí editoru sed
cd /etc cp group group- sed 's/:*:/:x:/' ./group- > group cp passwd passwd- sed 's/:*:/:x:/' ./passwd- > passwd cp shadows shadows- sed 's/:*:/:x:/g' ./shadows- > group
Do souboru shadow
se pak uživateli root místo znaku 'x' vloží hash pro heslo
root:x:15550:0:99999:7::: root:$6$rdGp6JD2$2EWFVk36DTP0oUCmyv.O9fiD3vY1W1dG8togiu37501MI9.pQr2pJ0YSe/NPEU7q7BQgAD5GUxWjzT49iH9UU.:15550:0:99999:7:::
Odstranění nepotřebných souborů
Adresář /dev
Výchozí obsah adresáře /dev
lze s klidnou duší vymazat, protože moderní linuxový kernel detekuje a vytváří potřebná zařízení sám při startu na základě rozpoznaného hardware.
Adresář /tmp
Do adresáře /tmp
se ukládají věci, které nejsou trvalého charakteru, ale které by se - pokud není použitý(!) overlay filesystem - rovněž průběžně ukládaly na straně NFS serveru, přesto že to není třeba.
Tomu lze zamezit tím, že se adresář /tmp
namountováním přes tmpfs, namapuje do paměti počítače na straně klienta.
Automatický mount zajistí následující řádek přidaný do souboru /etc/fstab
:
none /tmp tmpfs defaults 0 0
Stávající obsah adresáře /tmp
lze s klidem vymazat
Adresář /run
Je adresářem, do kterého si ukládají svoje soubory spuštěné démony. Podobně jako u adresáře /tmp
má jeho obsah význam pouze pokud je virtuální stroj spuštěný, proto ja adresář /run
, namapován přes tmpfs pouze do paměti počítače.
Je dobré vědět, že při práci přes chroot se v něm mohou objevit nějaké soubory. V případě systému, který pak bude spuštěn jako bezdiskový se mohou s klidem odstranit.
Původně byl tento adresář součástí adresáře /var a některé aplikace se snaží zapisovat tam. Ovšem dnes je soubor /var/run pouze symlink na adresář /run .
|
Adresář /var/cache/apt/archives
Stejně tak můžeme vymazat veškerý obsah adresáře /var/cache/apt/archives
, do kterého se stáhly během instalace a aktualizace instalační balíky, které už nejsou zapotřebí.
apt-get clean
Příprava ramdisku
Nezbytné moduly - nfs, ipv6, overlayfs, loop, nbd
Skript pro overlay
Jak zabalit. Atp.