Hlavní navigace

Ohnuté FreeBSD na flash disku

Petr Macek 27. 5. 2013

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.

# 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. 

Našli jste v článku chybu?

2. 7. 2013 15:51

>> Dalej by sa dal spravit tutorial, ako na takom usb-cku rozbehate zfs na roote, to by som si celkom precital ...

osobne bych toto nedoporucoval. USB Flash ma omezeny pocet zapisu a ZFS jako souborovy system ktery loguje veskere transakce je vuci disku (tim spise takoveho disku ktery ma omezeny pocet zapisu) dost bezohledny. USB je navic vhodne mit read only a tim se ze ZFS stava jen zbytecna koule u nohy, ktera ma obrovskou vykonovou spotrebu, ale v nasem pripade zadne vyhody.

to mi …

2. 7. 2013 15:37

jeste pred kopirovanim image na usb doporucuji ho od systemu odpojit:
`mdconfig -d -u0`
option -u ocekava ID virtualniho disku v uvedenem prikladu je to '0'



Vitalia.cz: Vláknina: Rozpustná, nebo nerozpustná?

Vláknina: Rozpustná, nebo nerozpustná?

Podnikatel.cz: Přivýdělek u Airbnb nebo Uberu? Čekejte kontrolu

Přivýdělek u Airbnb nebo Uberu? Čekejte kontrolu

Vitalia.cz: Jak koupit Mikuláše a nenaletět

Jak koupit Mikuláše a nenaletět

Vitalia.cz: Žloutenka v Brně: Nakaženo bylo 400 lidí

Žloutenka v Brně: Nakaženo bylo 400 lidí

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Lupa.cz: Avast po spojení s AVG propustí 700 lidí

Avast po spojení s AVG propustí 700 lidí

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Podnikatel.cz: Víme první výsledky doby odezvy #EET

Víme první výsledky doby odezvy #EET

DigiZone.cz: Další dva kanály nabídnou HbbTV

Další dva kanály nabídnou HbbTV

Podnikatel.cz: 1. den EET? Problémy s pokladnami

1. den EET? Problémy s pokladnami

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře

Podnikatel.cz: EET zvládneme, budou horší zákony

EET zvládneme, budou horší zákony

Lupa.cz: UX přestává pro firmy být magie

UX přestává pro firmy být magie

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život

Vitalia.cz: „Připluly“ z Německa a možná obsahují jed

„Připluly“ z Německa a možná obsahují jed