Ohnuté FreeBSD na flash disku

27. 5. 2013
Doba čtení: 7 minut

Sdílet

Bootování oblíbeného systému z miniaturního flash disku má několik výhod – můžeme fungovat bez instalace na různých strojích a svůj oblíbený systém si nosit vždy s sebou. Upravený systém na flash disku také může sloužit jako základ pro vytvoření vlastního nástroje třeba pro záchranu poškozených oddílů.

Linuxových distribucí na flash disku je dnes poměrně dost. Na webu jsou návody, jak si udělat něco takového sám. Ukážeme si stejnou věc se systémem FreeBSD. Půjde nám o to vytvořit modifikovaný systém a ne jen přenést instalační CD na USB. Nechci zde vysvětlovat do detailu, jak vypadá a funguje FreeBSD, berte článek jako jednoduché howto.

Způsobů přenosu systému na USB je více, záleží třeba na tom, zda preferujeme kompilaci všeho nebo si vystačíme s binárními balíky. Návod ukazuje, jak si vše zkompilovat a v systému si osahat trochu víc než jen pustit připravený instalátor. Na Root.cz už jeden návod před pár lety vyšel, ale půjdeme na to trochu jinak.

Základem je nainstalovaný systém FreeBSD na běžném PC nebo notebooku. Jakou použijete verzi, je jen na vás. Já jsem vybral aktuální verzi 9.1. Postup se neliší ani pro různé architektury, tedy alespoň i386 a amd64 (pro linuxáře x86_64). Při použití 32bitové verze získáte možnost spuštění i na starších počítačích.

Vše budeme samozřejmě dělat jako uživatel root. Protože budou instalovány i aplikace, je nutné nainstalovat aktuální seznam portů, z kterých se aplikace instalují. Opět je několik způsobů. Potřebujeme samozřejmě přístup k internetu. Pro práci s porty jsem vybral utility portsnap, která je v základu systému. Stačí spustit

# porstnap fetch extract

Ještě pracovat s aktuálními zdrojovými kódy samotného systému. Takže si ze zaktulizovaných portů nainstalujeme aplikaci svnup. Ta je vhodná pro snadnou stažení zdrojových kódů OS

# cd /usr/ports/net/svnup
# make install clean

Pokud používáte shell tcsh, je nutné zadat ještě přikaz rehash, aby si systém načetl nově přidané binárky dle path. Pak už zaktualizujeme zdrojové kódy systému.

# svnup -h svn0.us-west.freebsd.org -b base/releng/9.1 -l /usr/src

Tím jsme získali aktuální systém i ports tree pro instalaci aplikací. Dále je vhodné upravit konfiguraci kernelu, výchozí obsahuje mnoho nepotřebných věcí jako je podpora zvukových karet, PCMCIA apod. Proto si zkopírujeme výchozí konfigurační soubor kernelu do souboru MYKERNEL a ten upravíme. Pokud instalujeme 64bitovou verzi, bude cesta  /usr/src/sys/amd64/conf.

# cd /usr/src/sys/i386/conf
# cp GENERIC MYKERNEL

Upravíme soubor MYKERNEL a jdeme na kompilaci kernelu

# cd /usr/src
# make buildkernel KERNCONF=MYKERNEL

Podobným postupem si připravíme i celý systém. Co a jak bude přeloženo, můžeme ovlivnit souborem make.conf. V čerstvě nainstalovaném systému není, a tak si zkopírujeme výchozí a upravíme. Nápovědu najdeme v manuálu ( man make.conf).

# cp /usr/share/examples/etc/make.conf /etc

Kompilaci systému provedeme jednoduchým příkazem

# make buildworld

Tím máme připravený upravený systém a kernel. A kam s nimi? Připravíme si soubor, kde všechno spojíme. Velikost souboru závisí na vašem flash disku, samotný systém se určitě vejde na 1GB flash disk, při instalaci více aplikací už by ale mohl vzniknout problém. Bylo by možné už teď pracovat přímo na flash disku, ale řešení se souborem mi přijde lepší, například si lehce udělám zálohu prostým zkopírováním souboru.

Vytvoříme soubor pro image systému třeba o velikosti 2 GB a z něho si vytvoříme paměťový disk:

# dd if=/dev/zero of=memstick.img bs=1m count=2000
# mdconfig -a -t vnode -f memstick.img -u 0

Vznikne nám zařízení /dev/md0. Potřebujeme na něm vytvořit tabulku oddílů, oddíl, souborový systém a zapsat bootloader.

# fdisk -iI /dev/md0
# bsdlabel -wB /dev/md0s1
# newfs -L FreeBSD /dev/md0s1a

Použití labelu v posledním příkazu není nutné, ale usnadní nám připojování disku ve fstabu. Je možné jej vytvořit i dodatečně příkazem.

# tunefs -L /dev/md0s1a

Připravený oddíl si připojíme do souborového systému. FreeBSD používá jiné značení disků a oddílů než Linux, s1a v tomto případě znamená první partition (a) ve slice 1. To co je v běžných systémech partition je ve FreeBSD slice a teprve dále je dělení na partition.

# mount /dev/md0s1a /mnt

Do tohoto oddílu přeneseme zkompilovaný kernel a celý systém. Na to slouží parametr DESTDIR. Předtím jsme si tedy zkompilovali kernel a systém a výsledek je zatím uložen kdesi v /usr. Nebyl důvod, aby kompilace probíhala na flash disku. Také je možné si DESTDIR nastavit jako proměnnou a výsledek by byl stejný.

# cd /usr/src
# make installkernel KERNCONF=MYKERNEL DESTDIR=/mnt
# make installworld DESTDIR=/mnt

Tím máme nainstalovaný systém, ale ještě chybí konfigurace. Nejjednodušší cestou asi je zkopírovat konfiguraci funkčního systému a tu jen upravit. Kdo si chce hrát a minimalizovat, může zkoušet, co je nutné pro funkční systém. Ale otázkou je, jestli to za pár ušetřených kilobajtů stojí. Pokud něco bude chybět, nepůjdou ani instalovat aplikace. Takže jistější je zkopírovat vše. Pokud image děláte z nějakého serveru v běžném provozu, raději si důkladněji projděte, co kopírujete. Dávat veřejně třeba ssh klíče nebude nejlepší nápad.

# cp /etc/* /mnt/etc

Ještě provedeme několik úprav. Největší změnou je vytvoření oddílu /tmp a /var pouze v paměti. Omezí se tak časté zápisy na disk. Dále je dobré nastavit hostname, spouštěné služby a parametry. Vše je v konfiguračním souboru  /mnt/etc/rc.conf.

hostname="usbBSD"
sshd_enable="YES"
ntpd_enable="YES"
ntpdate_enable="YES"

# vytvoreni /tmp a /var v pameti
tmpmfs="YES"
tmpsize="20m"
varmfs="YES"
varsize="128m"

V souboru /mnt/etc/fstab zajistíme připojení root oddílu. Zde se nám hodí právě dříve vytvořený label.

Pak už můžeme do /mnt/etc/fstab přidat řádek pro připojení kořene. O /var  a /tmp se starat nemusíme, budou vytvořeny a připojeny automaticky.

/dev/ufs/FreeBSD        /       ufs     rw      0       0

I instalace aplikací je možná několika způsoby. Často je zmíněna metoda využívající opět proměnné DESTDIR. Té se ale raději vyhněte, v aktuálních verzích FreeBSD nefunguje nebo jen velmi omezeně. Takže na to půjdeme jinak. Pro instalaci aplikací potřebujeme Ports tree ( /usr/ports) a připojený adresář /dev. Je možné si porty nakopírovat na flash disk, ale zbytečně si tím zabíráme místo. Je lepší si je přimountovat pomocí null_fs. To je linuxová obdoba  mount --bind.

# mount -t devfs devfs /mnt/dev
# mkdir /mnt/usr/ports
# mount_nullfs /usr/ports /mnt/usr/ports

Potom už je možné instalovat aplikace. Samozřejmě to musíme dělat v našem nainstalovaném systému, a tak je nutné použít chroot a přesunout se od naší nové instalace.

# chroot /mnt /bin/sh
# cd /usr/ports/shell/bash
# make install

Po instalaci aplikací a konfiguraci systému musíme ukončit chroot příkazem exit.

Následující operace je možné dělat v chrootu nebo už bez něho, pouze se bude lišit cesta ( /boot  – v chrootu, /mnt/boot  – bez chrootu).

Ač jsem se s problémem nefunkčního bootování z USB nesetkal, doporučuje se trochu ovlivnit proces bootování. Pokud neexistuje, založte soubor /mnt/boot/loader.conf a vložte následující řádky.

geom_label_load="YES"
kern.cam.boot_delay=10000

Ještě si můžeme trochu pohrát se vzhledem, např. si upravíme logo zobrazené na konzoli při přihlášení. Proč ale kreslit ručně, když máme jednoduchou aplikaci.

# cd /usr/ports/misc/figlet
# make install clean
# rehash
# figlet mojeUSB > /mnt/etc/motd
# echo "Vitejte v systemu mojeUSB"  >> /mnt/etc/motd

Úprava loga v boot menu je složitější. Pokud si jen chceme vybrat jiné, stačí přidat opět do /mnt/boot/loader.conf další řádek a zvolit jednu z možností – fbsdbw, beastiebw, beastie a none.

loader_logo="fbsdbw"

Když chcete změnit umístění loga a menu nebo logo překreslit. Vše potřebné naleznete (včetně popisu) v souboru  /mnt/boot/beastie.4th.

Systém už dostává nějakou podobu, jen po naběhnutí se nám objeví klasický login. Velice pěkné rozhraní nabídne např. FreeNAS. Místo loginu se zobrazí menu, kde je možné si nastavit síťové karty, link agregaci apod. Proč něco takového taky neudělat? Nejprve si určíme v souboru /mnt/etc/ttys, na kterých terminálech se spustí naše aplikace nebo shell skript. Pokud stačí jen na prvním, upravíme záznam ttyv0 a změníme parametr, s kterým se getty spustí.

ttyv0   "/usr/libexec/getty mujlogin" cons25 on secure

Dále musíme upravit /mnt/etc/gettytab a přidat naše spouštěcí menu. Bude se jednat o skript a spuštěn bude jako uživatel root.

MujLogin|mujlogin|MujLogin Menu:\
:ht:np:sp#15200:lo=/etc/menu.sh:al=root:

Na první konzoli tedy bude spuštěn skript /etc/menu.sh. Zde můžete využít svůj tvůrčí potenciál naplno a nabídnout uživateli nějaké přívětivé menu nebo spustit aplikaci. V případě pádu nebo ukončení se proces init postará o jeho opětovné spuštění.

Tím máme hotovo a už zbývá pouze připravený systém odpojit a přenést na flash disk.

ict ve školství 24

# umount /mnt/dev
# umount /mnt/usr/ports
# umount /mnt
# dd if=memstick.img of=/dev/da0 bs=1m

Tím jsme získali upravené FreeBSD spustitelné z flashdisku. Co s ním dál, už je na vás, můžete si nainstalovat a nakonfigurovat libovolné služby a spustit si po startu klidně nějakou svou aplikaci. Doporučuji si zazálohovat memstick.img, ať se v případě problémů máte k čemu vrátit.

Za komentáře a rady děkuji Miroslavu Prýmkovi. 

Autor článku

Petr Macek studoval aplikovanou informatiku na Jihočeské univerzitě, pracuje jako síťový specialista ve firmě Kostax, s. r. o. Baví ho především FreeBSD, sítě a monitoring Cacti.