Wie wird dieses gebaut und wie jenes; in diesem Kapitel werden einige
Arbeits-Vorgänge und -Abläufe vorgestellt, die helfen sollen, die
Aufgaben zu meistern.
Die Beschreibungen sind so strukturiert, daß sie nicht nur speziell
für dieses HOWTO Anwendung finden, sondern auch allgemein genutzt
werden können, um das jeweilige Ziel zu erreichen.
Gliederung:
Eine Beispiel-Konfigurations-Datei eines Linux-Kernels (linux/.config) ist im Anhang zu finden: sample kernel config file.
Die Kernel-Quellen aktueller (2002) Releases sind gepackt zwischen 20 und 30 MegaByte groß.
[radtke@server:~ ]$ wget -c http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.18.tar.gz
--17:23:52--
http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.18.tar.gz
=> `linux-2.4.18.tar.gz'
Connecting to www.kernel.org:80... connected!
HTTP request sent, awaiting response... 200 OK
Length: 29,652,798 [application/x-gzip]
0K .......... .......... .......... .......... .......... 0% @ 64.60 KB/s
o
o
o
28900K .......... .......... .......... .......... .......... 99% @ 287.36 KB/s
28950K ....... 100% @ 650.88 KB/s
17:25:26 (310.22 KB/s) - `linux-2.4.18.tar.gz' saved [29652798/29652798]
Der Linux-Kernel kann auf verschiedene Arten konfiguriert werden; entweder Kommandozeilen-basiert:
[radtke@server:~/linux ]$ make config
oder ncurses-menu-gesteuert:
[radtke@server:~/linux ]$ make menuconfig
oder unter X:
[radtke@server:~/linux ]$ make xconfig
Wenn eine die Konfigurations-Datei linux/.config eines
älteren Kernels schon existieren sollte, dann kann - wenn erwünscht -
diese benutzt werden, um darauf aufbauend eine Konfigurations-Datei für
den aktuellen Kernel zu erstellen:
[radtke@server:~/linux ]$ make oldconfig
Dieser Befehl konfiguriert den neuen Kernel halb-automagisch: wenn im aktuellen Kernel neue Eigenschaften hinzugekommen sind, wird vom Benutzer erfragt, wie verfahren werden soll, wobei die Standard-Einstellung "N", d.h. "No", ist; die neue Option ist per default deaktiviert.
[radtke@server:~ ]$ tar xvzf linux-2.4.18.tar.gz
linux/
linux/Makefile
o
o
o
linux/Documentation/README.nsp_cs.eng
linux/REPORTING-BUGS
[radtke@server:~ ]$
linux/
Verzeichnis wechseln:
[radtke@server:~ ]$ cd linux/
make menuconfig müssen folgende Optionen ausgewählt
werden:
[radtke@server:~/linux ]$ make menuconfig
Linux Kernel v2.4.18 Configuration
_____________________________________________________________________________
________________________________ Main Menu ________________________________
| Arrow keys navigate the menu. <Enter> selects submenus --->. |
| Highlighted letters are hotkeys. Pressing <Y> includes, <N> excludes, |
| <M> modularizes features. Press <Esc><Esc> to exit, <?> for Help. |
| Legend: [*] built-in [ ] excluded <M> module < > module capable |
-------------------------------------------------------------------------
| | Code maturity level options ---> | |
| | Loadable module support ---> | |
| | Processor type and features ---> | |
| | General setup ---> | |
| | Memory Technology Devices (MTD) ---> | |
| | Parallel port support ---> | |
| | Plug and Play configuration ---> | |
| | Block devices ---> | |
| | Multi-device support (RAID and LVM) ---> | |
| | Networking options ---> | |
------------v(+)-------------------------------------------------------
| |
--------------------------------------------------------------------------
| <Select> < Exit > < Help > |
-----------------------------------------------------------------------------
linux/.config:
#
# Networking options
#
.
.
.
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
CONFIG_IP_PNP_BOOTP=y
.
.
.
Nicht zu vergessen sind außerdem: die NIC-Treiber (als Module
oder direkt in den Kernel mit einkompiliert).linux/.config ist für
den Einsatz gemäß dieses HOWTOs vorbereitet:
Kernel-2.4.18-Konfiguration.
Weitere Informationen über die Konfiguration und Herstellung eines eigenen
Kernels sind in linux/Documentation/kbuild/ und im Anhang unter
Build kernel from source verfügbar.
[radtke@server:~/linux ]$ make dep clean bzImage modules
gcc -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -o scripts/mkdep
scripts/mkdep.c
o
o
o
dann heißt es meist erst einmal: warten.. :-)
o
o
o
objcopy -O binary -R .note -R .comment -S compressed/bvmlinux compressed/bvmlinux.out
tools/build -b bbootsect bsetup compressed/bvmlinux.out CURRENT > bzImage
Root device is (3, 5)
Boot sector 512 bytes.
Setup is 4768 bytes.
System is 966 kB
warning: kernel is too big for standalone boot from floppy
[radtke@server:~/linux ]$
Wenn hardware zur Boot-Zeit angesprochen werden soll, die
entsprechenden Treiber aber als Module kompiliert wurden, dann
wird weiterhin noch eine
initiale Ramdisk (initrd) benötigt.
Die Warnung bezüglich eines zu großen Kernels kann hier getrost ignoriert werden, da sie sich nur darauf bezieht, daß der Kernel für die Installation auf einer 1.44 MB großen Diskette zu umfangreich ist ("System is 966 kB").
arch/i386/boot/ zur Abholung bereit. Der name des neuen
Kernels ist bzImage, da der Befehl make bzimage
ein bz-komprimiertes Kernel-image erstellt.
[radtke@server:~/linux ]$ su -
Password:
[root@server:~ ]# cd /home/radtke/linux
[root@server:/home/radtke/linux ]# make modules_install
[root@server:/home/radtke/linux ]# cp -vi arch/i386/boot/bzImage /boot/vmlinux-2.4.18
[root@server:/home/radtke/linux ]# cp -vi System.map /boot/System.map-2.4.18
[root@server:/home/radtke/linux ]# cd /boot
[root@server:/home/radtke/linux ]# ln -sf System.map-2.4.18 System.map
[root@server:/home/radtke/linux ]# ln -sf vmlinux-2.4.18 vmlinux
Und als letztes nur nicht vergessen, die Datei
/etc/lilo.config anzupassen und den Befehl lilo
auszuführen: (vorab der Test und wenn erfolgreich, dann
tatsächlich ausführen)
[root@server:/home/radtke/linux ]# vi /etc/lilo.conf
[root@server:/home/radtke/linux ]# /sbin/lilo -t -v
Added linux (alias 1) *
Added pxe (alias 3)
The boot sector and the map file have *NOT* been altered.
[root@server:/home/radtke/linux ]# /sbin/lilo -v
Added linux (alias 1) *
Added pxe (alias 3)
[root@server:/home/radtke/linux ]#
Damit ist die Kompilation und Installation eines neuen, den
persönlichen Bedürfnissen angepaßten Linux-Kernels
beendet.
Die Unterstützung für das
loopback-device muss im Kernel vorhanden sein,
um Dateien mit Filesystemen mounten bzw. unmounten zu können.
Vor allen Operationen, die eventuell den Verlust von Informationen nach sich ziehen können, sollte ein Backup der entsprechenden Daten durchgeführt werden.
[radtke@server:~ ]$ mv -i initrd ramdisk.gz && gunzip ramdisk.gz
[root@server:~ ]# mount -o loop=/dev/loop0 ramdisk /mnt/ramdisk/
[root@server:~ ]# umount /mnt/ramdisk/
[radtke@server:~ ]$ gzip ramdisk && mv -i ramdisk.gz initrd
Die gzipte Ramdisk liegt nun als initrd(gzipt) vor.
[root@server:~ ]# find /mnt/ramdisk/{bin,sbin,lib} -type f -print0 | \
xargs -0 strip --strip-debug
Die eigenen Ramdisks koennen entweder aus einer
bereits existierenden Ramdisk durch
Erweiterung oder von
Grund auf neu hergestellt werden. Hier
soll nur auf die erste Möglichkeit näher eingegangen werden. Zur
Erstellung einer komplett neuen Ramdisk sind hier nur grundlegende Schritte
erwähnt und auf weitere
Dokumentation zu Ramdisks wird verwiesen.
[radtke@server:~ ]$ dd if=/dev/zero of=./niegel_nagel_neue_rd bs=1M count=32
[radtke@server:~ ]$ mke{2|3}fs -vm0 [-j] ./niegel_nagel_neue_rd
[root@server:~ ]# mount -o loop=/dev/loop1 ./niegel_nagel_neue_rd \
/mnt/ramdisk/
du -skH ./ramdisk/ ` < 32MB).
[root@server:~ ]# chown user.user -R /mnt/ramdisk/
[radtke@server:~ ]$ cp -Rvi /lib/modules/2.4.18/ /mnt/ramdisk/lib/modules
[radtke@server:~ ]$ cp -vi /boot/System.map /mnt/ramdisk/boot/
/mnt/ramdisk/etc/services muss
mindestens die folgenden Einträge besitzen:
bootps 67/udp ### BOOTP/DHCP Server
bootpc 68/udp ### BOOTP/DHCP Client
Siehe auch
Ärger-Schiessen des inetd.
[radtke@server:~ ]$ cp -vi /usr/sbin/gpm /mnt/ramdisk/[usr/]bin/
SuSEspezifische Einstellungen in
/mnt/ramdisk/etc/rc.config:
GPM_START="yes"
GPM_PARAM="-m /dev/psaux -t ps2"
[radtke@server:~ ]$ find rc* -name "S*network*" -o -name "*nscd*" \
-o -name "*route*" -exec rm {} \;
[radtke@server:~ ]$ cd /mnt/ramdisk/etc/init.d/rc3.d/
Die Links für die Server- und Client-Ramdisk unterscheiden sich:
[radtke@server:~ ]$ ln -s ../INSTALL/NIC/NIC.sh S88NIC.sh
[radtke@server:~ ]$ ln -s ../INSTALL/InstallConf.sh S90InstallConf.sh
[radtke@server:~ ]$ ln -s ../INSTALL/Helper/Prep.sh S89Prep.sh
[radtke@server:~ ]$ ln -s ../INSTALL/NIC/NIC.sh S91NIC.sh
[radtke@server:~ ]$ ln -s ../INSTALL/Client_script/do_client_config.sh \
S93do_client_config.sh
[radtke@server:~ ]$ ln -s ../INSTALL/ClientInstall/Install.sh S96Install.sh
[radtke@server:~ ]$ cp -vi /usr/share/kbd/consolefonts/default8x9.psfu.gz \
/mnt/ramdisk/etc/init.d/
[radtke@server:~ ]$ cp -vi /usr/bin/setfont /mnt/ramdisk/usr/bin/
[radtke@server:~ ]$ cp -Rvi /usr/share/kbd/keymaps/{include,i386}/ \
/mnt/ramdisk/usr/share/kbd/keymaps/
[radtke@server:~ ]$ cp -vi /bin/loadkeys /mnt/ramdisk/bin/
Die Aktivierung dieser Änderungen findet in den eigenen
Skripten und nicht in den boot-Skripten statt.
[radtke@server:~ ]$ cp -vi /usr/share/zoneinfo/Europe/Berlin \
/mnt/ramdisk/etc/zoneinfo_Europe_Berlin
[radtke@server:~ ]$ cd /mnt/ramdisk/etc/
[radtke@server:~ ]$ ln -s zoneinfo_Europe_Berlin localtime
[radtke@server:~ ]$ cp -vi /bin/mktemp /usr/bin/sipcalc \
/usr/bin/ftp /usr/bin/atftp /mnt/ramdisk/bin/
[radtke@server:~ ]$ cp -vi /sbin/{reiserfsck,debugreiserfs,unpack,\
resize_reiserfs,mkreiserfs,reiserfstune} \
/mnt/ramdisk/sbin/
/mnt/ramdisk/etc/{motd|issue|issue.net|hosts|resolv.conf}./mnt/ramdisk/etc/hosts:
[radtke@server:~ ]$ cat /mnt/ramdisk/etc/hosts
10.10.10.10 server
10.10.10.11 client
Die IP-Adressen werden on-the-fly während der
Konfigurations-Phase geschrieben.
[root@server:~ ]# chown 0.0 -R /mnt/ramdisk/
[root@server:~ ]# chmod g-w,o-w -R /mnt/ramdisk/
Wenn die Ramdisk um einen neuen Befehl erweitert werden soll, dann unbedingt prüfen, ob auch die erforderlichen libraries in der Ramdisk vorhanden sind und gegebenenfalls diese auch mitkopieren. Achtung, möglicherweise ist kein Platz mehr in der Ramdisk. Dann eventuell unnötige Dateien löschen (Vorsicht!) oder die Ramdisk vergrößern (siehe Erstellen einer Ramdisk).
[radtkens@server:~ ]$ ldd /sbin/sfdisk
libc.so.6 => /lib/libc.so.6 (0x4002b000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
[radtke@server:~ ]$ mkisofs -hide-joliet-trans-tbl -J -R \
-hide-rr-moved -no-emul-boot \
-boot-load-size 4 \
-b CD_ROOT/isolinux/isolinux.bin \
-c CD_ROOT/boot.cat -boot-info-table CD_ROOT \
-o mein_neues_CD_image.iso
Das etherboot-ROM ist ein angepaßtes ROM der NIC. Das nb-Image
kann in /etc/lilo.config wie ein "normales" Kernel-Image
eingetragen werden (den Aufruf "/sbin/lilo" nicht vergessen!).
Wird am "LILO: "-Prompt das etherboot-nb-Image ausgewählt,
dann lädt das NIC-ROM
das vom DHCP-Server spezifizierte
tagged image.
CFLAGS32+= -DMAX_BOOTP_RETRIES=3 -DTRY_ALL_DEVICES
[radtke@server:~/etherboot-5.06/src ]$ make bin32/<Name-des-NIC-Treibers>.lilo
Etherboot-ROMs können eine Kombination von Kernel und Ramdisk
nur dann ausführen, wenn sie in einem speziellen
("tagged-image") Format vorliegen. Eine (ausführbare)
Datei dieses "speziellen" Formats - ein Net-Boot-Image -
enthält den Linux-Kernel und die Ramdisk zusätzlich aber
noch einen Binär-Header, der diese Image-Datei in ein für
das etherboot-ROM ausführbares Format wandelt.
Der Vorgang, mit dem dieses spezielle Ausführungsformat erzeugt
wird, heißt "taggen".
Mknbi wird hier mit drei Parametern aufgerufen:
Mknbi (= "Make a Network-Bootable Image") erstellt die spezielle Image-Datei ("tagged image") aus dem Kernel und der Ramdisk:
[radtke@server:~ ]$ mknbi client_kernel client_ramdisk --ip=rom > \
tagged_kernel_with_ramdisk
Das Brennen des CD-ISO-Images mit cdrecord erfordert zwei Parameter:
[root@server:~ ]# cdrecord speed=4 dev=0,1,0 mein_neues_CD_image.iso
Während der Erarbeitung des in der endgültigen Form vorliegenden Projektes und HOWTO's sind einige Skripte (wie immer aus laziness ;-) entstanden, die sich als sehr hilfreich erwiesen haben:
mkimg.sh