Poniższy artykuł ma na celu pokazanie w jaki sposób można stworzyć przydatne narzędzie,
własną minidystrybucję systemu FreeBSD, która bez problemu zmieści się na pendrive'ie o
pojemności 32MB. Będzie to w pełni funkcjonalny system, który może służyć jak dysk ratunkowy
w przypadku awarii lub po zainstalowaniu dodatkowych pakietów jako router czy serwer http
na urządzeniach typu embedded korzystających z pamięci typu flash. Do wykonania całości
będzie potrzebny zainstalowany system na dysku. W naszym przykładzie posłużymy się wersją
6.4-Beta. Dla osób, które nie mają zbyt wielkiego doświadczenia z systemem polecam zapoznanie
się z manualem gcc i make.conf oraz przejrzenie pliku /usr/share/examples/etc/make.conf.
Przygotowanie źródeł i edycja pliku /etc/make.conf
Niezbędne są źródla systemu - można je skopiować z płyty instalacyjnej
lub ściągnąć za pomocą csup'a (man csup). Zanim zaczniemy kompilację trzeba ustawić
odpowiednie flagi kompilacji w pliku /etc/make.conf. My użyjemy tych, które
zminimalizują wielkość wynikowego kodu:
CPUTYPE= i686
CFLAGS= -Os -pipe -s
CXXFLAGS= -Os -pipe -s
COPTFLAGS= -Os -pipe -s
Flaga CPUTYPE odpowiada za typ procesora jaki posiadamy, ja polecam jednak pozostanie przy i686, aby nie było problemów jeśli zdecydujemy się używać systemu na architekturach z
procesorami AMD. Znaczenie pozostałych flag znajdziemy w manualu gcc.
Konfiguracja i budowa własnego kernela
Proces tworzenia własnego kernela jest doskonale opisany w podręczniku. Jeśli zamierzamy
wykorzystywać stworzone minidistro tylko na jednej maszynie warto zrobić plik konfiguracyjny kernela typowo pod używany przez nas sprzęt. Zaowocuje to nieco szybszym startem systemu oraz oszczędnością miejsca - w tym wypadku całość zajełaby mniej niż 16MB. Należy pamiętać, aby w pliku konfiguracyjnym znalazły się następujące wpisy:
options md
options geom_label
Jeśli powyższych modułów nie dodamy do jądra na stałe lub zdecydujemy się użyć standardowego
jądra GENERIC będziemy mogli je załadować edytująć plik /boot/loader.conf. Aby włączyć obsługę
SMP do pliku konfiguracyjnego jądra nalezy dopisać:
options SMP
Po stworzeniu pliku konfiguracyjnego przystępujemy do budowy kernela:
# cd /usr/src
# make buildkernel KERNCONF=nazwa_pliku_kernela
Jeśli pominiemy parametr KERNCONF zostanie zbudowane standardowe jądro generic
Budowa "świata"
System FreeBSD jest z założenia systemem kompletnym, tzn. od razu po domyślnej
instalacji mamy narzędzia do stworzenia serwera DNS czy poczty itd.. W naszym przypadku
są to rzeczy zupełnie zbędne dlatego pozbędziemy się nich kompilujących świat
z opcjami NO_* :
# cd /usr/src/
# make buildworld \
NO_CVS=true \
NO_BIND=true \
NO_FORTRAN=true \
NO_I4B=true \
NO_SENDMAIL=true \
NO_MAILWRAPPER=true \
NO_OBJC=true \
NO_GAMES=true \
NO_INFO=true \
NO_UUCP=true \
NO_TOOLCHAIN=true \
NO_CXX=true \
NO_RESCUE=true \
NO_SHAREDOCS=true \
NO_PROFILE=true \
NO_LPR=true \
NO_MAN=true \
NO_NLS_CATALOGS=true \
NO_BLUETOOTH=true \
Pełen opis powyższych opcji znajdziemy w manualu make.conf.
Instalacja systemu w katalogu tymczasowym
Tworzymy pusty katalog, w którym zainstalujemy przygotowany przez nas system:
# mkdir -p /home/penbsd
i instalujemy "świat":
# cd /usr/src
# make installworld \
NO_CVS=true \
NO_BIND=true \
NO_FORTRAN=true \
NO_I4B=true \
NO_SENDMAIL=true \
NO_MAILWRAPPER=true \
NO_OBJC=true \
NO_GAMES=true \
NO_INFO=true \
NO_UUCP=true \
NO_TOOLCHAIN=true \
NO_CXX=true \
NO_RESCUE=true \
NO_SHAREDOCS=true \
NO_PROFILE=true \
NO_LPR=true \
NO_MAN=true \
NO_NLS_CATALOGS=true \
NO_BLUETOOTH=true \
DESTDIR=/home/penbsd
jądro systemu:
# cp /boot/device.hints /root/pen/boot/device.hints
# cd /usr/src
# make installkernel \
NO_BLUETOOTH=true \
KERNCONF=nazwa_pliku_kernela \
DESTDIR=/home/penbsd
i pliki konfiguracyjne:
# cd /usr/src/etc
# make distribution \
NO_CVS=true \
NO_BIND=true \
NO_FORTRAN=true \
NO_I4B=true \
NO_SENDMAIL=true \
NO_MAILWRAPPER=true \
NO_OBJC=true \
NO_GAMES=true \
NO_INFO=true \
NO_UUCP=true \
NO_TOOLCHAIN=true \
NO_CXX=true \
NO_RESCUE=true \
NO_SHAREDOCS=true \
NO_PROFILE=true \
NO_LPR=true \
NO_MAN=true \
NO_NLS_CATALOGS=true \
NO_BLUETOOTH=true \
DESTDIR=/home/penbsd
usuwamy niepotrzebne pliki, stripujemy binarki itd.:
# rm -rf /home/penbsd/usr/share/man
# rm -rf /home/penbsd/usr/share/doc
# rm -rf /home/penbsd/usr/share/dict
# rm -rf /home/penbsd/usr/include
# rm -rf /home/penbsd/usr/share/openssl/man
# rm -rf /home/penbsd/usr/share/examples
# rm /home/penbsd/usr/lib/*.a
# strip -R .note -R .comment /home/penbsd/bin/*
# strip -R .note -R .comment /home/penbsd/sbin/*
# strip -R .note -R .comment /home/penbsd/lib/*
# strip -R .note -R .comment /home/penbsd/usr/lib/*
# strip -R .note -R .comment /home/penbsd/usr/bin/*
# strip -R .note -R .comment /home/penbsd/usr/sbin/*
kompresujemy jądro systemu:
# cd /home/penbsd/boot/kernel
# gzip -9 kernel
Konfiguracja systemu
Edytujemy plik /home/penbsd/etc/rc.conf, dodajemy wpisy (więcej w man rc.conf):
hostname="PenBSD.techit.pl"
ifconfig_DEFAULT="DHCP"
background_fsck="NO"
moused_enable="YES"
keyrate="fast"
virecover_enable="NO"
sendmail_enable="NONE"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
portmap_enable="NO"
syslogd_enable="NO"
cron_enable="NO"
syslogd_enable="NO"
update_motd="NO"
Do pliku /home/penbsd/boot/loader.conf dodajemy:
mfsroot_load="YES"
mfsroot_type="mfs_root"
mfsroot_name="/boot/mfsroot"
vfs.root.mountfrom="ufs:md0"
md_load="YES"
do /home/penbsd/fstab:
/dev/md0 / ufs rw 0 0
/dev/ufs/PenBSD /pen ufs ro 1 1
proc /proc procfs rw 0 0
/dev/acd0 /cdrom cd9660 ro,noauto 0 0
Instalacja programów
Używamy chroot aby zalogować się do zbudowanej dystrybucji i instalujemy wybrane przez nas
pakiety. Warto przygotować wcześniej własne paczki, kompilowane pod względem wielkości, z
jak najmniejszą listą zależności:
# chroot /home/penbsd /bin/csh
# pkg_add bash, mc, ...
Tworzymy mfsroot
# cd /home/
# dd if=/dev/zero of=mfsroot bs=1k count=44264
# mdconfig -a -t vnode -f mfsroot
md0
# disklabel -rw md0 auto
# newfs -b 8192 -f 1024 -o space -m 0 /dev/md0
# mount /dev/md0 /mnt
# cp -R /home/penbsd /mnt
# rm -rf /mnt/boot
# mkdir -p /mnt/pen
# cd /mnt
# ln -sf pen/boot boot
# cd /home/
# umount /mnt/
# mdconfig -d -u 0
# gzip -9 mfsroot
Instalowanie całości na pendrive'ie
Tworzymy partycję i nadajemy jej odpowienią etykietę, taką jakiej użyliśmy w fstab'ie:
# dd if=/dev/zero of=/dev/da0 bs=4k count=1
# bsdlabel -w da0
# bsdlabel -e da0 (poprawiamy typ partycji na 4.2BSD)
# bsdlabel -B da0
# newfs -m 0 -i 65536 -b 16384 -f 2048 -U /dev/da0a
# tunefs -L PenBSD /dev/da0a
Montujemy pendrive'a i kopiujemy pliki:
# mount /dev/da0a /mnt
# cp -R /home/penbsd/boot /mnt
# cp /home/mfsroot.gz /mnt/boot
# umount /mnt
Restartujemy komputer i uruchamiamy system z pendrive'a. :)