Booten eines Linux-PCs Dr.-Ing. Matthias Sand Lehrstuhl für Informatik 3 (Rechnerarchitektur) Friedrich-Alexander-Universität Erlangen-Nürnberg SS 2009 Booten eines Linux-PCs 1/27 2009-04-30
Inhalt BIOS Bootloader Kernel initrd und initramfs init Booten eines Linux-PCs 2/27 2009-04-30
BIOS Aufgaben Zu DOS-Zeiten: BIOS bietet Interface zur HW-Ansteuerung, hat mit der Entwicklung der Prozessoren und Geräte nicht schrittgehalten, Hauptaufgabe heute: Infrastruktur und Mechanismen zum Nachladen eines Betriebssystems von einem Medium. Booten eines Linux-PCs 3/27 2009-04-30
BIOS (2) Booten über BIOS BIOS initialisiert Hardware, BIOS sucht nach Boot-Sektor, z.b. auf Diskette (A:), Festplatte (C:), CD/DVD-ROM, (Reihenfolge evtl. einstellbar), Kennung: 0x55, 0xaa in den letzten beiden Bytes, Boot-Sektor wird nach 0x0000:0x7c00 (bzw. 0x07c0:0x0000) geladen, Boot-Sektor wird angesprungen. Booten eines Linux-PCs 4/27 2009-04-30
BIOS (3) Alternativen OpenFirmware Standard (IEEE-1275); vor allem auf diversen UNIX-Workstation-Plattformen, coreboot (vormals LinuxBIOS), minimalistischer Initialisierungscode, lädt eine Payload nach, z.b. FILO, OpenFirmware, GRUB2, Linux (meist zu groß), (U)EFI (Unified) Extensible Firmware Interface, vor allem auf 64-Bit-Nachfolgern von x86 (IA64 und AMD64). Booten eines Linux-PCs 5/27 2009-04-30
Bootloader Aufgaben Muss mittels... BIOS-Interrupts, (Aufrufen von Firmware-Funktionen,...) direktem HW-Zugriff den Kernel laden und starten. Früher meist: lilo (LInux LOader), heute: GRUB (GRand Unified Bootloader). Booten eines Linux-PCs 6/27 2009-04-30
Bootloader lilo Eigenschaften Steht im Boot-Sektor und im freien Platz dahinter, größter Nachteil: kennt kein Dateisystem, Blocklisten bezeichnen die Positionen von Kernel (und initrd), bei Änderungen am Kernel muss lilo erneut installiert werden. Booten eines Linux-PCs 7/27 2009-04-30
Bootloader GRUB stage1 Steht im Boot-Sektor, 446 Byte Maschinencode, einzige Aufgabe: lädt stage1_5 nach und führt sie aus. Booten eines Linux-PCs 8/27 2009-04-30
Bootloader GRUB (2) stage1_5 Steht zwischen Boot-Sektor und Beginn der ersten Partition, enthält typischerweise einfachen Treiber eines Dateisystems, weiß bereits von Dateinamen und Pfaden, muss nicht bei jeder Änderung an stage2, Kernel, etc. aktualisiert werden, lädt /boot/grub/stage2 vom Root-Dateisystem und führt sie aus. Booten eines Linux-PCs 9/27 2009-04-30
Bootloader GRUB (3) stage2 enthält ggf. weitere Treiber, bietet rudimentäre Shell-Funktionalität, liest ggf. Menüinformationen aus /boot/grub/menu.lst, durch Menü-Skript oder Benutzerinteraktion wird dann der Linux-Systemkern geladen, ggf. die RAM-Disk geladen, Kernelparameter gesetzt, der Systemkern gestartet. Booten eines Linux-PCs 10/27 2009-04-30
Bootloader GRUB (4) Beispiel: menu.lst # Erster Eintrag ist Standard default 0 # bootet nach 30 Sekunden timeout 30 # Booteintrag fuer Linux title Linux root (hd0,1) kernel /boot/vmlinuz-2.6.26 root=/dev/sda2 ro initrd /boot/initrd-2.6.26.gz # noch ein Eintrag... title Windoof root (hd0,0) makeactive chainloader +1 Booten eines Linux-PCs 11/27 2009-04-30
Bootloader GRUB (5) Partitionsnamen (fdn) Diskettenlaufwerk N, Zählung beginnt bei 0, (hdn,m) Festplatte N, Partition (oder Slice) M, jeweils ab 0 gezählt, Erweiterte Partitionen beginnen immer bei 4, (hdn,m,p) Festplatte N, Slice M, Partition P, N und M wie bisher, P ist ein Zeichen beginnend bei a. Beispiele: (fd0) Laufwerk A:, (hd0,1) zweite Partition der ersten Festplatte, (hd1,0,a) Partition a des ersten Slice der zweiten Festplatte. Booten eines Linux-PCs 12/27 2009-04-30
Kernel Kernel ohne initales RAM-Laufwerk 1 mountet normale Root-Partition, 2 versucht, initialen Prozess zu starten aus: 1 dem init=-parameter, 2 /sbin/init, 3 /etc/init, 4 /bin/init, 5 /bin/sh. Booten eines Linux-PCs 13/27 2009-04-30
initrd und initramfs Aufgaben (Vor allem früher:) Platz sparen wegen begrenzter Kernelgröße auf Boot-Medien und im (Real-Mode-)Speicher: modularer Kernel, nur das Allernötigste fest einkompiliert, RAM-Disk enthält alles weitere, um root-dateisystem zu mounten und init(8) zu starten. Heute: Trennen konfligierender Treiber, ggf. Nachladen von Firmware. Bei kleinen (eingebetteten oder Rettungs-) Systemen: RAM-Disk enthält gesamtes System. Booten eines Linux-PCs 14/27 2009-04-30
initrd und initramfs (2) initrd Abbild eines Dateisystems (z.b. ext2), enthält für den Startvorgang nötig Dateien, Kernel muss mindestens einen Dateisystemtreiber enthalten, gilt als veraltet. Booten mit initrd 1 Systemkern mountet RAM-Disk als Rootverzeichnis, 2 wenn vorhanden wird /linuxrc ausgeführt, das i.w. Module lädt und Geräte initialisiert, 3 weitere Aufgaben erledigt dann wieder der Kernel: Root-Partition mounten, ggf. RAM-Disk unmounten, init von der Root-Partition starten (Suchreihenfolge wie oben). Booten eines Linux-PCs 15/27 2009-04-30
initrd und initramfs (3) initramfs Komprimiertes (gzip(1)) Archiv (cpio), enthält für den Startvorgang nötig Dateien, Kernel braucht keinen Dateisystemtreiber zu enthalten. Booten mit initramfs 1 Systemkern entpackt Inhalt der initramfs in die RAM-Disk, 2 mountet RAM-Disk als Rootverzeichnis, 3 wenn vorhanden, wird /init ausgeführt, das alles weitere macht: Module laden, Root-Partition mounten, ggf. RAM-Disk entfernen, System-init suchen und ausführen. Booten eines Linux-PCs 16/27 2009-04-30
initrd und initramfs (4) Beispiel: Inhalt einer initrd /linuxrc /bin/sh, /bin/mount, /bin/umount, /bin/cp, /bin/tar,... /dev/null, /dev/zero, /dev/console, /dev/tty[0-7] /dev/hd*, /dev/sd* /dev/scd* /etc/ld.so.conf, /etc/ld.so.cache /etc/mtab /lib/ld-linux.*, /lib/libc.so.* /lib/modules/* /mnt /proc Booten eines Linux-PCs 17/27 2009-04-30
Boot-Medium Beispiel: Inhalt eines Boot-Mediums /boot/initrd.img.gz, /boot/vmlinuz,... /boot/grub/stage2, /boot/grub/menu.lst,... /dev/fd0, /dev/null, /dev/ram,... Booten eines Linux-PCs 18/27 2009-04-30
init Eigenschaften Der Init-Prozess ist der erste (und einzige) normale Prozess nach dem Systemstart. Er startet ggf. ein linuxrc auf der initrd, liest /etc/inittab. Gemäß /etc/inittab initialisiert er das System, startet Daemons, startet getty/login- sowie ggf. [gkx]dm-prozesse. Booten eines Linux-PCs 19/27 2009-04-30
init (2) Runlevel Zustand des Systems, in dem nur eine bestimmte Gruppe von Prozessen existieren darf, Runlevels sind unterschiedlich definiert; z.b.: S Systemstart, 0 Halt, 1 Single-User, 2 Single-User mit Netzwerk, 3 Multi-User, 5 Multi-User mit X11, 6 Reboot, reservierte Runlevels (fest Bedeutung): S, 0, 1, 6, Wechsel des Runlevels mit init(8), telinit(8), shutdown(8), halt(8), reboot(8), Abfrage des Runlevels mit runlevel(8). Booten eines Linux-PCs 20/27 2009-04-30
init (3) /etc/inittab Enthält Zeilen der Form: id:runlevels:action:process id Identifier (bis zu max. 4 Zeichen); für getty- Programme die Nummer des TTYs (z.b. 2 für Terminal /dev/tty2), runlevels Liste der Runlevel, in denen die entsprechende Aktion ausgeführt werden soll,...... Booten eines Linux-PCs 21/27 2009-04-30
init (4) /etc/inittab (fortges.) action...... respawn Prozess wird immer wieder neu gestartet, wait Prozess wird einmal gestartet; init wartet auf Terminierung, once Prozess wird einmal gestartet; init wartet nicht auf Terminierung, boot Prozess wird beim Booten ausgeführt (runlevel werden ignoriert), bootwait Prozess wird beim Booten ausgeführt; init wartet, off Eintrag deaktiviert, initdefault Definition des Standard-Runlevels, sysinit Prozess wird vor boot bzw. bootwait beim Booten ausgeführt, Booten eines Linux-PCs 22/27 2009-04-30
init (5) /etc/inittab (fortges.) process auszuführendes Programm (gegebenenfalls mit Parametern). Booten eines Linux-PCs 23/27 2009-04-30
Einschub: getty, login und sh Typischer Eintrag der inittab: 1:2345:respawn:/sbin/getty 38400 tty1 init startet getty in den Runlevels 2 bis 5, getty öffnet /dev/tty1 und zeigt darauf ein Login-Prompt an, nach Eingabe eines Benutzernamens wird login(1) ausgeführt (per execve(2)), login führt Authentifikation durch und forkt Shell mit den Rechten des Benutzers, beendet sich die Shell, beendet sich auch der Login-Prozess ursprünglich als getty gestarteter Prozess wird beendet init startet getty erneut. Booten eines Linux-PCs 24/27 2009-04-30
init (6) /etc/init.d Je nach Runlevel sollen Daemons, Netzwerk, X11 usw. gestartet bzw. gestoppt werden, zum Starten und Stoppen existieren in /etc/init.d Shell-Skripte. Beispiele: /etc/init.d/autofs start /etc/init.d/httpd stop # Startet automounter # Stoppt www-daemon Booten eines Linux-PCs 25/27 2009-04-30
init (7) /etc/init.d/rc init ruft bei jedem Runlevel-Wechsel ein Skript (z.b. /etc/init.d/rc) auf. Typische inittab-einträge: l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 Booten eines Linux-PCs 26/27 2009-04-30
init (8) /etc/rc?.d /etc/init.d/rc ruft je nach gewünschtem Runlevel die Start-Stop-Skripte auf. Dazu müssen in /etc/rc?.d nach folgendem Muster symbolische Links auf die Skripte angelegt sein: Start in Runlevel X Symlink in Verzeichnis /etc/rcx.d der Form SNMname; S bedeutet starten, NM ist eine zweistellige Zahl, die die Startreihenfolge festlegt, name ist nach Konvention der Name des Skripts, Stop in Runlevel X analog Symlinks der Form KNMname, K bedeutet kill. Booten eines Linux-PCs 27/27 2009-04-30