Kořenový adresář
Pro kompletní funkci je potřeba připravit souborový systém, na kterém
se nacházejí další podpůrné aplikace. K sestavení všech aplikací jsem
použil systém portage z Gentoo. Jako základ systému jsem zvolil aplikaci
busybox, která zahrnuje mnoho užitečných utilit.
Balíčkovací systém distribucí
Většina linuxových distribucí obsahuje balíčkovací systém, který
slouží pro jednoduchou instalaci aplikací. Distribuce Gentoo obsahuje
balíčkovací systém portage, který je vhodný i pro křížovou
kompilaci pro jinou architekturu. Využil jsem proto tento systém pro snadnou
kompilaci a instalaci základních programů potřebných pro běh systému.
Program pro kompilaci balíčků se jmenuje emerge. Vytvořil jsem
jednoduchý skript emerge_arm, který nastaví proměnné
prostředí tak, aby proběhla kompilace a instalace do správného adresáře.
Následné vytvoření aplikace, která je součástí balíčkovacího systému
Gentoo, lze elegantně zprostředkovat pomocí zavolání příkazu
emerge.
~ # emerge busybox
Konkrétně tento příkaz sám stáhne zdrojové soubory balíku
busybox, provede konfiguraci, kompilaci a instalaci výsledného
binárního programu do předem určeného adresáře.
Příprava obrazu souborového systému
Základem celého systému je aplikace busybox, která obsahuje
všechny důležité utility. Jedná se o jediný binární soubor, ke kterému
je vytvořeno mnoho symbolických odkazů s názvy programů. Balík
busybox obsahuje veškeré základní nástroje pro práci se
soubory (mv, cp, rm, …), dále obsahuje
například nástroje pro práci v síti (udhcp,
httpd, telnet, wget).
Na připravovaném souborovém systému je dále pomocí balíku
static-dev vytvořen adresář /dev se základními
soubory zařízení. Ostatní aplikace a knihovny jsou získány stejným
způsobem.
Systém je nutné nakonfigurovat pomocí souborů v adresáři
/etc. V souboru fstab jsou nadefinovány připojené
diskové oddíly a připojené virtuální souborové systémy
sysfs, procfs, ramfs apod. V souborech
group a passwd jsou nadefinovány uživatelské účty
a skupiny uživatelů. V souboru inittab je nastaveno chování po
startu systému a chování při ukončení běhu systému. Je zde nadefinován
první inicializační skript, který bude spuštěn procesem
init.
První spuštěný skript se jmenuje /etc/init.d/rcS a spouští
další služby, jejichž inicializační skripty jsou umístěny v adresáři
/etc/init.d. Inicializační skripty se skládají ze dvou
částí, jedné, která je spuštěna při startu služby a druhé, která je
spuštěna při žádosti o její ukončení. Základní inicializační skript
má jednoduchou strukturu. Obsahuje hlavičku, spouštěcí a zastavovací
funkci.
#!/sbin/runscript start () { ebegin "Start sluzby" start-stop-daemon --start --exec sluzba eend $? } stop () { ebegin "Ukonceni sluzby" start-stop-daemon --stop --exec sluzba eend $? }
Spouštěcí program /sbin/runscript vychází z programu,
který je používán v distribuci Gentoo. Je použita podobná myšlenka, ale
program jsem napsal jako jednoduchý skript pro program sh. Tento
program netestuje závislosti služeb, pouze zjednodušuje práci při psaní
inicializačních skriptů. Napsal jsem dále inicializační skripty pro
síťovou kartu přes USB, telnet, http, obsluhu GSM modulu a pro započetí
vzdáleného sdílení adresáře.
Program /sbin/runscript
#!/bin/sh CMD=$2 SERVICE=$1 GREEN="\033[01;32m" NONE="\033[00m" BLUE="\033[01;34m" YELLOW="\033[01;33m" RED="\033[01;31m" OKPOS=60 LINE_END="\033[1000C" LINE_BACK="\033[6D" LINE_UP="\033[1A" source $SERVICE ebegin() { TEXT=$1 # L=${#TEXT} echo -en "${GREEN}*${NONE} " echo "$1" # for i in $(seq $L $OKPOS); do echo -n " "; done } eend() { RESULT=$1 echo -en "${LINE_UP}${LINE_END}${LINE_BACK}" if [ $RESULT -eq 0 ]; then echo -e "${BLUE}[ ${GREEN}ok${BLUE} ]${NONE}" else echo -e "${BLUE}[ ${RED}!!${BLUE} ]${NONE}" fi } if [ "$CMD" == "start" ]; then start elif [ "$CMD" == "stop" ]; then stop elif [ "$CMD" == "restart" ]; then stop start else echo "Usage $1 start | stop | restart" fi
Soubor /etc/rcS
#!/bin/sh # pripojuji filesystemy /bin/mount -a # zaregistruju hotplug echo /bin/mdev > /proc/sys/kernel/hotplug # Out Of Memory zpusobi paniku echo 1 > /proc/sys/vm/panic_on_oom # panika zpusobi restart po 5s echo 5 > /proc/sys/kernel/panic #/etc/init.d/msd start /etc/init.d/net.lo start /etc/init.d/net.usb0 start #/etc/init.d/dhcpd start /etc/init.d/telnetd start /etc/init.d/httpd start # pripojeni nfs #/etc/init.d/portmap start #/etc/init.d/nfsmount start

