Budowanie bootowalnego ISO na debiana (jak sie robi śmieszne pliczki)
Opracowane przez: 'BiExi'
2005-06-07 24:55
Wiele osób chciało by sobie stworzyc mini dystrybucję do własnych celów, a wiec napiszę tu kilka słów o tym jak się to robi. A więc do dziela. Najpierw sobie przygotujemy wszelkie katalogi :]

mkdir /root/mydist
mkdir /root/mydist/cd
mkdir /root/mydist/cd/src
mkdir /root/mydist/cd/src/isolinux
mkdir /root/mydist/cd/src/isolinux/kernel
mkdir /mnt/iso

teraz robimy sobie śmieszny pliczek

dd if=/dev/zero of=pliczek bs=1M count=12

gdzie count= określa jaki rozmiar ma mieć nasz wirtualny dysk - w naszym przypadku 12 MB :] następnie tworzymy system plików na naszym pliczku

mkfs.ext2 -m 0 -i 2000 pliczek

teraz mozemy go zamontować :]

mount /mydist/pliczek /mnt/iso/ -o loop

kopiujemy katalog /dev na nasz pliczek

cp -dpR /dev /mnt/iso

teraz zajmiemy się nastepnymi katalogami w naszym pliczku, a wiec trzeba co nieco potworzyć

mkdir /mnt/iso/bin
mkdir /mnt/iso/etc
mkdir /mnt/iso/etc/init.d
mkdir /mnt/iso/etc/security
mkdir /mnt/iso/etc/pam.d
mkdir /mnt/iso/home
mkdir /mnt/iso/proc
mkdir /mnt/iso/sbin
mkdir /mnt/iso/tmp
mkdir /mnt/iso/usr
mkdir /mnt/iso/var

ok mamy katalogi, teraz kilka słów o ich zawartosci - np katalog /mnt/iso/etc mamy takie pliczki

fstab
group
host.conf
hostname
hosts
inittab
ld.so.conf
mtab
pam.conf
passwd
shadow
shells
termcap

a teraz zawartość, nie bede sie rozpisywała na temat konstrukcji poszczególnych plików ponieważ dużo materiałów jest w necie na ten temat fstab

/dev/fd2        /               minix   defaults   1   1

inittab

id:2:initdefault:
si::sysinit:/etc/init.d/init
1:2345:respawn:/sbin/getty 9600 tty1
2:23:respawn:/sbin/getty 9600 tty2
l6:6:wait:/etc/init.d/halt 6

shells

/bin/bash

i pozostałe

cp /etc/group /mnt/iso/etc/group
cp /etc/host.conf /mnt/iso/etc/host.conf
cp /etc/hostname /mnt/iso/etc/hostname 
cp /etc/hosts /mnt/iso/etc/hosts
cp /etc/ld.so.conf /mnt/iso/etc/ld.so.conf
cp /etc/mtab /mnt/iso/etc/mtab
cp /etc/pam.conf /mnt/iso/etc/pam.conf
cp /etc/passwd /mnt/iso/etc/passwd
cp /etc/shadow /mnt/iso/etc/shadow
cp /etc/termcap /mnt/iso/etc/termcap
cp /etc/etc/pam.d/* /mnt/iso/etc/pam.d/
cp /etc/security/* mnt/iso/etc/security/

teraz nasz pliczek inicjujący - tworzymy go:

touch /mnt/iso/etc/init.d/init

i przykładowa zawartość

/bin/mount proc -t proc /proc >/dev/null 2>&1
/bin/mount -av -t nonfs  >/dev/null 2>&1
echo "/bin/true" >/proc/sys/kernel/modprobe  >/dev/null 2>&1
/sbin/depmod -a >/dev/null 2>&1
  if ! /usr/bin/tty | grep -q ttyS ; then
  if [ -f /proc/fb ]; then
/bin/hostname mojkomp
/sbin/ifconfig lo 127.0.0.1
/sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo

zmieniamy artrybuty

chmod +x /mnt/etc/init.d/init

no to katalog /etc mamy gotowy - no w miarę
struktury w/w plików nie bedę opisywała pnieważ nie ma to sensu, bo na ich temat google mową wystarczająco dużo :]

teraz coś na temat systemu podstawowego: mamy 2 wyjscia

1. korzystamy z busbox'a (również instalator debiana woody jest na nim oparty) mianowicie sprawa ma sie tak, że ściągamy sobie go ze strony

http://www.busybox.net/

i kompilujemy zgodnie z opisem w pliku readme, następnie wrzucamy gotowy plik busybox do /mnt/iso/bin i robimy linki symboliczne do poszczególnych poleceń które wkompilowalismy w busybox'a. Rozwiazanie to ma taką zaletę że oszczędzamy miejsce na naszym obrazie :]

2. korzystamy z bibliotek z systemu - po prostu kopiujemy np pliki:

cp /bin/bash /mnt/iso/bin/bash
cp /bin/echo /mnt/iso/bin/echo
cp /bin/ls /mnt/iso/ls
cp /bin/stty /mnt/iso/bin/stty
cp /bin/login /mnt/iso/bin/login
cp /bin/ps /mnt/iso/bin/ps
cp /bin/grep /mnt/iso/bin/grep
cp /bin/mount /mnt/iso/bin/mount
cp /bin/umount /mnt/iso/bin/umount

no katalog /mnt/iso/sbin

cp /sbin/init /mnt/iso/sbin/init
cp /sbin/ifconfig /mnt/iso/sbin/ifconfig
cp /sbin/ldconfig /mnt/iso/sbin/ldconfig
cp /sbin/modprobe /mnt/iso/sbin/modprobe
cp /sbin/route /mnt/iso/sbin/route
cp /sbin/insmod /mnt/iso/sbin/insmod
cp /sbin/getty /mnt/iso/sbin/getty

teraz zabieramy się za kompilację kernela, musimy pamiętać by wkompilować nastepujące opcje:

 Block devices  ---> 
  <*> RAM disk support 
  (20000)   Default RAM disk size
  [*]   Initial RAM disk (initrd) support 

kompilujemy kernela dowolną metodą i instalujemy go w naszym systemie będzie działał prawidłowo :] teraz podstawowe biblioteki systemowe i moduły jądra czyli /lib

cp /lib /mnt/iso/lib -R

teraz testy naszego distro

chroot /mnt/iso
/sbin/ldconfig

polecenie ldconf buduje index bibliotek systemowych, po wgraniu jakichkolwiek bibliotek musimy wydać to polecenie znowu

sprawdzamy czy działają nam podstawoe polecenia np:

ls

z chrootowanego środwiska wychodzimy ctrl + d jeśli nie działają i zostanie zasygnalizowany brak jakiejś biblioteki to w poszukiwaniu bibliotek wpisujemy polecenie

whereis nazwa_biblioteki.so

i kopiujemy ją na analogiczne miejsce w naszym obrazie

poleceniem

ldd /bin/bash

srawdzamy jakich bibliotek wymaga dany program w tym przypadku bash po wszelkich zmianach i kopiowaniu bibliotek musimy sie chrootnac do naszego katalogu i odbudowac index bibliotek

chroot /mnt/iso
/sbin/ldconfig

no odmontowywujemy nasze iso

umount /mnt/iso

ok powiedzmy że mamy zgrubsza przygotowany obraz naszego distro, teraz trzeba się wziąć ta część bootowalną :]

apt-get install bootcd syslinux mkisofs

następnie kopiujemy

cp /usr/lib/syslinux/isolinux.bin /root/mydist/cd/src/isolinux/isolinux.bin

tworzymy pliczek

touch /root/mydist/cd/src/isolinux/isolinux.cfg

z zawartością

default mydist
prompt 1
timeout 100

F1 ns_F1

label mydist
  kernel kernel/vmlinuz
  append initrd=initrd.gz load_ramdisk=1 prompt_ramdisk=0 \
      ramdisk_size=26384 rw root=/dev/ram0 LABEL=mydist

tworzymy pliczek

touch /root/mydist/cd/src/isolinux/iso.sort

z zawartością

isolinux 100
isolinux/isolinux.bin 200
kernel 50

tworzymy plik

touch /root/mydist/cd/src/isolinux/na_F1

do którego wpisujemy jakiś monit powitalny do katalogu root/mydist/cd/src/isolinux/kenrnel kopiujemy plik jadra wcześniej skompilowany - vmlinuz teraz skrypty które bedą tworzyły nasz obraz

touch /root/mydist/cd/mkiso

z zawartością

#!/bin/sh
mkisofs -o /root/mydist/mydist.iso -r -J -V "mydist" -v -no-emul-boot \
        -boot-load-size 32 -boot-info-table -b isolinux/isolinux.bin \
        -sort src/isolinux/iso.sort -A "mydist" src

i nadajemy prawa uruchamialne

chmod +x /root/mydist/cd/mkiso

oraz drugi skrypt

touch /root/mydist/go

zawierąjacy

#!/bin/bash
cp pliczek cd/src/isolinux/pliczek
cd cd/src/isolinux/
rm  initrd.gz
gzip -v9 pliczek
mv pliczek.gz initrd.gz
cd ../..
echo -n "Robie iso..."
./mkiso

i nadajemy prawa uruchamialne

chmod +x /root/mydist/go

no teraz się można piwa napić bo najbardziej syfska robota zrobiona. Teraz mamy gotowca i możemy trenować :] aby wygenerować iso uruchamiamy plik

go

aby nagrać iso wydajemy polecenie

cdrecord -dev 0,0,0 -speed 4 /root/mydist/mkiso.iso

paramert dev uzyskujemy za pomoca

cdrecord --scanbus

Co do testów to ręczne nagrywanie płytek i marnowanie czasu mija się z celem a więc najlepiej jest użyć vmware i na nim testować stworzone dostro

pozdrawiam
BiExi