Hlavní navigace

FAI - Full Automatic Installer (4)

12. 5. 2004
Doba čtení: 8 minut

Sdílet

V dnešním dílu, popisujícím instalaci Debiana prostřednictvím FAI, se zaměříme na konfiguraci toho, co a jak se má naistalovat. Zaměříme se na třídy, které jsou protkány celým /usr/local/share/fai.

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/sha­re/fai (viz druhý díl). Tyto soubory jsou referovány bez absolutní cesty, tedy například adresář class značí adresář alfa:/usr/local/sha­re/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_CLA­SESS.

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/fa­i/sbin/setup_har­ddisks, který se při fai-setup kopíruje do alfa:/usr/lib/fa­i/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/vim­rc (${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/cfen­gine.

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/DEFAUL­T/S01 řádky

comupterworld - webcast prosinec

# 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_hos­t_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_hos­t_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.

Byl pro vás článek přínosný?