Wiedza - Artykuły
Image
TYPY PUBLIKACJI

FreeBSD - minidystrybucja na pendrive'ie

10.10.2008 16:11, Autor: Artur Bednarek (que_pasa), Komentarze (6)

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. :)

r    e    k    l    a    m    a

Komentarze

matiit_
(niezalogowany)
13.10.2008 12:03

matiit_ (niezalogowany)
 

Przydatne i...zaskakujace...wielkość (a raczej małość tego) :)
Ciekawe jaka byłaby dolna granica wielkości

 
que_pasa
13.10.2008 12:26

que_pasa (brak avatara)
 

Dolna granica w przypadku FreeBSD (przy założeniu skompilowania jajka pod sprzęt) to około 12 MB. Jeśli to dla kogoś zbyt wiele to można kombinować ze starszymi wersjami lub z NetBSD

 
Yampress
(niezalogowany)
23.02.2009 19:47

Yampress (niezalogowany)
 

Bardzo fajna sprawa. Opiś jak stworzyc swoje własne live FreeBSD na cd by sie tez przydał.

 
Albercik
(niezalogowany)
27.06.2009 15:09

Albercik (niezalogowany)
 

Ciekawe, czy w ten sam zostało stworzone to livecd: http://freebsd-live.org ??

Wnioskuje, iż autor artykułu jest jednocześnie autorem tego live'a?

 
que_pasa
29.06.2009 19:29

que_pasa (brak avatara)
 

@Albercik

LiveCD do którego podałeś link zostało pośrednio stworzone na potrzeby tego artykułu.

 
pal
(niezalogowany)
23.09.2009 16:01

pal (niezalogowany)
 

A czy w podobny sposób można łatwo przygotować DesktopBSD, żeby startował z Pendriva?

 

Dodaj komentarz

Autor: