Třídy – k čemu jsou dobré
Pokud máte nějakou zkušenost s OOP, na pojem třída raději zapomeňte. Ve FAI „třída“ zajišťuje pouze zapouzdřenost. O dědičnosti a virtualizaci si můžete jenom nechat zdát.
Třídy ve FAI jsou dobré pro určování toho, co chcete naistalovat. Příklad z praxe, který možná napoví více: chcete nainstalovat KDE. K tomu potřebujete nainstalovat nějaké deby (debianovské balíky), potřebujete zkopírovat něco konfiguráků, které máte pevně dané, a potřebujete něco konfiguráků nastavit.
TřÍdy se ve FAI píší většinou velkými písmeny. Rozhodně jsou case-sensitive, takže podobné rozdělení má význam.
Úmluva: v dalším textu budeme referovat pouze o souborech umístněných ve FAI_CONFIGDIR, neboli, pokud jste si nechali defaultní instalaci, pod adresářem alfa:/usr/local/share/fai (viz druhý díl). Tyto soubory jsou referovány bez absolutní cesty, tedy například adresář class značí adresář alfa:/usr/local/share/fai.
K tomuto článku je přiložen tgz s obsahem vzorového (=mnou používaného, určitě by se dal vymyslet lepší) . adresáře. V textu se na soubory v něm uvedené občas odkazuji, takže je-li vám něco nejasné, podívejte se nejdříve do tgz.
Defaultní třídy
Fai definuje několik defaultních tříd. Jednak třídu s názvem stanice, na které je fai instalováno (a,b,c..), jednak DEFAULT, LAST a určitě ještě další. Jejich výpis určitě při instalaci naleznete v /tmp/fai/FAI_CLASESS.
Určení tříd
Třídy určujete pomocí souborů obsažených v adresáři class. Naleznete zde tyto soubory:
- class/*.var slouží pro definování obsahu proměnných. Jsou FAI při instalaci sourcovány, aby se proměnné dostaly do prostředí FAI.
- class/[0–9][0–9]*.source jsou FAI při instalaci sourcovány, nové třídy se definují tak, že se přidají do proměnné newclasses.
- class/[0–9][0–9]* jsou FAI při instalaci spuštěny (mají-li x flag), nové třídy se definují tak, že se vypíší na stdout, odkud si je FAI přečte.
Soubory class/[0–9][0–9]* jsou volány vzestupně podle čísla (tedy tak, jak je vidí ls), class/*.var jsou volány pouze v případě, že * je shodná s názvem již definované třídy, a to v pořadí, v jakém byly třídy definovány.
Je nutné si uvědomit, že config dir je při instalaci přes NFS moutěn do adresáře /fai na instalované stanici (a, b,..), a tudíž skripty skutečně běží na lokální stanici, ne na serveru. Máte tedy k dispozici pouze ty prostředky, které si nainstalujete do nfsrootu.
V ostatních souborech jsou většinou názvy tříd. Typický soubor vypadá následovně:
... # typická konfigurace NETWORK NETTOOLS DHCPC XFREE OPENOFFICE VIM IRAF ...
Tímto zápisem říkám, že chci všechny tyto třídy použít. V souboru class/[0–9][0–9]* je použitelný následovně:
... # use a list of classes for a demo machine case $HOSTNAME in demohost) catnc demo ;; *) catnc inws ;; esac ...
Tedy, jinak řečeno, v případě, že se $HOSTNAME rovná demohostu, jsou použity třídy ze souboru demo, jinak jsou použity třídy ze souboru inws. catnc dělá to samé jako cat, pouze vygrepuje ven komentáře – od # po konec řádky.
V souborech class/[0–9][0–9]*.sources se definují nové například následovně:
# detect ide-cdrom - fear
if cat /proc/ide/drivers | grep cdrom > /dev/null; then
newclasses="$newclasses CDRECORD"
fi
Tedy mám-li v /proc/ide/drivers cdrom, přidám si třídu CDRECORD.
V souborech class/*.var musím dodefinovat několik důležitých proměnných. Jednak, obvykle v DEFAULT.var, lokální rootovské heslo (zakryptěné) a další, druhak, obvykle v LAST.var, akci, která se má na stanici vykonat (proměnnou FAI_ACTION). Pro popis viz příklad, jenom je nutné zmínit, že bez FAI_ACTION definované pomocí case switche v LAST.var se vám spustí sysinfo, což v prostředí, kde nemáte kontrolu nad instalovanými stanicemi a nechcete k nim povolit rootovský přístup, může být docela problém.
Určení konfigurace disku
Konfigurace disku se provádí v souborech disk_config/[název_třídy]. Netuším, co se děje, pokud je podobných souborů vícero, čekal bych, že FAI prochází seznam tříd a první, na kterou najde disk config, použije. Disk config vypadá poměrně přívětivě, například takto:
disk_config hda primary / 70-100 rw ; -c xfs primary /fai-boot 7 rw ; -j ext2 logical swap 50-500 rw logical /var 50-1000 rw ; xfs logical /tmp 50-4000 rw ; xfs logical /usr 300-3000 rw ; xfs logical /scratch preserve9 ; xfs
Tímto říkám, že na disku hda budu mít primární partitionu (hda1) o velikosti 70–100 MB, která bude moutěna rw a bude vytvořena jako xfs s tím, že budou čekovány bad-blocky. Partitiona bude moutěna pod /.
Dále bude 7 MB boot disk (pro defaultní kernel image) moutěný pod /fai-boot. Disk bude ext3 (kombinace -j a ext2).
Další záznamy jsou už asi pochopitelné, jenom by mohl nastat problém u posledního, u preserve9 atributu. Ten říká, že se disk nemá formátovat, že se má připojit /dev/hda9. /scratch je pak přístupný jednak lokálně, druhak přes nfs ostatním stanicím pro ukládání všeho možného. Paritionu je ale třeba nejdříve vytvořit, čehož dosáhneme například změnou poslední řádky na:
logical /scratch 0- rw,nosuid ;xfs
Tuto změnu je jednak možno v disk_config/.. provádět kdykoliv při instalaci. Druhým a asi lepším řešením je definovat si pro první instalaci jinou třídu na určení konfigurace disku. Zatím používám první řešení, na druhé si brousím zuby. Co je míněno určením velikosti 0-, je asi zřejmé.
Zpracování tohoto souboru je řešeno v alfa:/usr/lib/fai/sbin/setup_harddisks, který se při fai-setup kopíruje do alfa:/usr/lib/fai/nfsroot/sbin, a tudíž je přístupný přes nfs mount instalovaným stanicím. Laskavý čtenář zajisté v tomto bash-skriptu dohledá, k čemu jsou všemožné optiony. Mám pocit, že pro reinstalaci xfs stanic se tam muselo do mkxfs_options přidat -f, aby to reformátovalo už naformátovaný disk.
Ještě podotýkám, že pro xfs potřebujete mkfs.xfs, který naleznete v pakáži xfsprogs. Tímto by se měl vysvětlit jeden include ve fai.conf (viz druhý díl).
Určení balíků, které se mají nainstalovat
Děje se v adresáři package_config. Soubory zde odpovídají třídám a jsou zpracovávány podle pořadí, v jakém byly třídy definovány. Obsah souborů je zřejmý z následujícího příkladu:
PACKAGES install kdm konqueror PACKAGES install CZECH kde-i18n-cs
Ten říká, že pro tuto třídu (upravený KDE3 soubor, tedy pro instalaci KDE) vezmu určitě kdm a konqueror, a v případě, že mám definovanou třídu CZECH, beru navíc kde-i18n-cs, tedy českou lokalizaci KDE. Podobná finta je použitá u OPENOFFICE.
Jak již bylo uvedeno minule, apt-get je nástroj sice mocný, ale ne všemocný. Takže pokud zapomenete na nějaké důležité balíky, skončíte po instalaci většinou s nefunkčním systémem. Pak je potřeba projít software.log a z něho vydedukovat, kde nastal při instalaci problém.
Skripty, které se zavolají
Jsou v adresáři scripts. Pokud se jedná o soubor, volá se, nalezne-li se v seznamu definovaných tříd, přímo tento soubor. Jedná-li se o adresář, volají se z něho všechny S[0–9][0–9] soubory – toto je použitelné v okamžiku, kdy chcete pro jednu třídu instalovat více balíků.
Skripty se volají po dokončení instalace, před rebootem. Mají za úkol dokonfigurovat balík dle vašich potřeb. Jedná se většinou o shell a cfengine skripty.
Shell skripty jsou poměrně vydatné a hojně se v nich používá divný příkaz fcopy. K čemu je fcopy dobré, viz man fcopy, případně další kapitolu.
cfengine skripty jsou ještě vydatnější. Ale jsou přehlednější. Ostatně, posuďte sami:
#! /usr/bin/cfegine control: actionsequence = ( editfiles ) editfilesize = ( 20000 ) editfiles: any:: { ${target}/etc/vim/vimrc BeginGroupIfNoLineMatching "^syntax on" LocateLineMatching '" syntax on' ReplaceLineWith "syntax on" EndGroup }
V tomto skriptu po troše nudných definic na začátku říkám, že v souboru ${target}/etc/vim/vimrc (${target} je při instalaci /tmp/target, po dokončení instalace se z tohoto místa stane /) je třeba změnit řádku s ‚" syntax on‘ (tedy zakomentovanou řádku pro zapnutí syntax higlitingu ve vimu) na „syntax on“, tedy odstranit komentář. Uvedené by asi šlo provést lépe, ale jako příklad, co lze provádět s cfengine, je tento soubor (scripts/VIM) dostačující. Dokumentaci cfengine lze nalézt v /usr/share/doc/cfengine.
Poznámka na okraj: cfengine je dost nepříjemná složitými názvy příkazů, které musíte psát. Problém popisovaný výše by zajisté skvěle vyřešil awk, ed, perl či cokoliv podobného (vi:)). cfengine je pěkná v tom, že je lépe čitelná než podobné regulárně expresní zrůdy.
Soubory, které se zkopírují
Byl zmíněn příkaz fcopy. Tomu se jako hlavní parametry předává seznam souborů. Tyto soubory se vyhledají v adresáři files/ a podle tříd se zkopírují na instalované stanice. Pěkný příklad je u ssh – pro instalované stanice bych zajisté chtěl, aby se jejich klíče (jak soukromé, tak veřejné) neměnily. Proto jsou ve skripts/DEFAULT/S01 řádky
# copy ssh keys
fcopy -m root,root,0600 /etc/ssh/ssh_host_dsa_key /etc/ssh/ssh_host_rsa_key
fcopy -m root,root,0644 /etc/ssh/ssh_host_dsa_key.pub /etc/ssh/ssh_host_rsa_key.pub
a ve files/etc/ssh/ssh_host_dsa_key/a by měl být (není, jelikož jsem líný generovat soukromý klíč) klíč pro stanici (hostname stanice je jednou z defaultních vždy definovaných tříd), který se přes fcopy zkopíruje při instalaci do ${target}/etc/ssh/ssh_host_dsa_key. Tento klíč je samosebou nejlepší získat po prvním nainstalování stanice z jejího lokálního disku.
Do dalšího dílu, případně dalších dílů, si nechávám adresář hooks, popis postupu instalace (které skripty se volají kdy a proč), snad dojde i na podrobnější a ne tolik matoucí příklad cfengine skriptů. A snad se dostane i na instalaci BEOWOLF clusteru přes FAI.