Jak vytvořit bezdiskový stroj s operačním systémem GNU/Linux

From DCEwiki
Jump to: navigation, search

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ů
Upozornění 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.
  1. 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.
direction a suivre 3 yve 01.svgČíst dále..

Vytvoření výchozí instalace bezdiskového stroje[edit]

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
Poznámka Pokud se chystáme instalovat distribuci Debian, je nejrychlejším řešením použít jiný - již existující - stroj, s nainstalovaným balíkem deboostrap. Máme-li však k dispozici zapakovanou nějakou čistou výchozí instalaci, lze použít libovolný linuxový systém s jádrem, které podporuje připojení adresáře přes NFS.

Instalace do NFS adresáře s použitím utility debootstrap[edit]

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
Poznámka
root@stroj~# mkdir -p /path_to_blank
root@stroj~# mount -t nfs4 147.32.87.10:/volumes/diskless_root_dir/ /path_to_blank -o defaults,noatime,rw
root@stroj~# mount
 ...
147.32.87.10:/volumes/diskless_root_dir/ on /path_to_blank type nfs4 (rw,noatime,vers=4,rsize=1048576,
wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=147.32.87.200,
minorversion=0,local_lock=none,addr=147.32.87.10)
root@stroj~#
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)
Poznámka
root@stroj~# mkdir -p /path_to_blank/blank_wheezy
root@stroj~# cd /path_to_blank/blank_wheezy
root@stroj:/path_to_blank/blank_wheezy# debootstrap --verbose \
	--keyring=/usr/share/keyrings/debian-archive-keyring.gpg \
	--include=debian-keyring,etckeeper \
	--arch=amd64 \
	wheezy \
	./ \
	http://ftp.cz.debian.org/debian
 ...
root@stroj:/path_to_blank/blank_wheezy#
  • 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
Upozornění Při instalaci Debian wheezy jsem narazil na problém u balíku dash. Jeho konfigurace troskotala na symlinku /usr/share/man/man1/sh.1.gz, který odkazoval na soubor dash.1.gz. Aby však mohl být balík dash zkonfigurován musí tento symlink odkazovat na bash.1.gz.

Pro úspěšné dokončení bootstrapu tedy bylo nutné tento symlink opravit a spustit debootstrap znovu:

Poznámka
root@stroj:/path_to_blank/blank_wheezy# pushd usr/share/man/man1/
 /path_to_blank/blank_wheezy/usr/share/man/man1/ /path_to_blank/blank_wheezy ~
root@stroj:/path_to_blank/blank_wheezy/usr/share/man/man1/# rmdir sh.1.gz
root@stroj:/path_to_blank/blank_wheezy/usr/share/man/man1/# ln -s bash.1.gz sh.1.gz
root@stroj:/path_to_blank/blank_wheezy/usr/share/man/man1/# popd
 /path_to_blank/blank_wheezy ~
root@stroj:/path_to_blank/blank_wheezy# debootstrap --verbose --arch=amd64 wheezy ./ http://ftp.cz.debian.org/debian
 ...

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[edit]

Součástí argumentů pro debootstrap byla instalace aplikace etckeeper, což je v podstatě wrapper pro git. Jeho použití ve vhodné všude tam, kde chceme mít podchycené veškeré úpravy konfigurace.

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=1
Pozn.: 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[edit]

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.

Poznámka
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.

Poznámka 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[edit]

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!

Upozornění 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 /var/lib/dpkg/info/ntp.postinstall.

Pak už konfigurace balíku proběhne v pořádku.

Nastavení obsahu /etc/hosts[edit]

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[edit]

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ů[edit]

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.

Upozornění 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[edit]

dpkg-reconfigure locales

Pro češtinu UTF-8

Nastavení fontu zobrazovaného na konzoli[edit]

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[edit]

dpkg-reconfigure console-data

Pro nastavení české klávesnice s psaním angl. kláves přes pravý ALT - qwerty

Nastavení časové zóny[edit]

dpkg-reconfigure tzdata

Nastavení výchozího uživatele[edit]

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[edit]

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ů[edit]

Adresář /dev[edit]

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[edit]

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[edit]

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.

Poznámka 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[edit]

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[edit]

Nezbytné moduly - nfs, ipv6, overlayfs, loop, nbd

Skript pro overlay

Jak zabalit. Atp.

Spuštění bezdiskového stroje[edit]

Konfigurace DHCP a zavádění přes PXELINUX[edit]

Nejprve stroj přes PXE získá konfiguraci z DHCP a cestu k zaváděcímu souboru na TFTP serveru Zaváděcí soubor mu předá cestu k zaváděcím souborům a parametry jádra

V případě virtuálních strojů není nutné DHCP, ale parametry pro zavedení jádra lze předat přes příkazovou řádku, či prostřednictvím konfiguračního souboru virtuálního stroje.

Důležité je zajistit aby měl stroj v okamžiku připojení NFS funkční síťovou konfiguraci a připojení. Dále je nutné odstavit služby, které by se při startu případně pokoušely o rekonfiguraci síťového připojení. V takovém případě by se totiž mohlo stát, že stroj zůstane viset, protože mu přestane fungovat připojení na NFS server.

KVM[edit]

Více síťových rozhraní[edit]

XEN[edit]

  1. Instalace a konfigurace NFS serveru není obsahem tohoto manuálu, ale manuálu k NFS