Arch Linux optimieren: Booten in 16 Sekunden
Originalzustand: Der 1Ghz ULV Celeron (Travelmate C110 TabletPC) bootet Arch Linux bis zum Login laut bootchart in 33 Sekunden. Nicht wirklich langsam, liest man aber das findige Entwickler ein System in z.B. 5 Sekunden booten können fordert das den Ehrgeiz eines Gewohnheits-System-Kaputt-Bastlers doch heraus.
Zudem auch in Arch Linux Forum seit einiger Zeit ein entsprechender Thread läuft. Das Ergebnis: Arch Linux bootet nun ohne Kernel- und mkinitcpio-Manipulationen in 16 Sekunden (Edit 05/2009: 13 Sekunden sind ohne GDM machbar) – knapp die Hälfte der ursprünglichen Bootzeit.
Ein weiterer Zeitgewinn war ohne tiefer eingreifende Massnahmen nicht möglich – über Mkinitcpio und eventuelle Kernel-Neucompilierung muss ich mir erstmal Gedanken machen – lohnt sich das wirklich? Hat jemand Erfahrungen/Tips bzgl. Vorgehen und effektivem Zeitgewinn?
Mit der halbierten Bootzeit scheint Arch hier stabil zu laufen, einzig ALSA macht manchmal Probleme – je nach Reboot wird der interne Intel-Sound erkannt (99%) oder auch nicht – was im Moment scheinbar durch manuelles Entladen von pcspkr und
snd_pcsp behoben werden konnte – mal sehen…
Eines noch vorweg: Diese Optimierungen sollte man nur ausprobieren wenn man a) (zumindest grob) weiss was man tut, b) Backups entsprechender Dateien hat und c) im Zweifelsfall auch nichts gegen eine Neuinstallation des Systems hat – durch das Eingreifen in den Bootvorgang kann das System durchaus unbrauchbar gemacht werden (Live-CD/USB-Stick sind manchmal lebensrettend). Aber die Erfahrung war es mir wert :)
/etc/inittab
In der Datei /etc/inittab können die dort enthaltenen wait-Statements durch once ersetzt werden:
rc::sysinit:/etc/rc.sysinit rs:S1:once:/etc/rc.single rm:2345:once:/etc/rc.multi rh:06:once:/etc/rc.shutdown su:S:once:/sbin/sulogin -p
Virtuelle Konsolen abschalten
Ebenfalls in der /etc/inittab können einige der virtuellen Konsolen (erreichbar über STRG-ALT-F1-6) durch einfaches auskommentieren deaktiviert werden:
# -8 options fixes umlauts problem on login c1:2345:respawn:/sbin/agetty -8 38400 vc/1 linux c2:2345:respawn:/sbin/agetty -8 38400 vc/2 linux #c3:2345:respawn:/sbin/agetty -8 38400 vc/3 linux #c4:2345:respawn:/sbin/agetty -8 38400 vc/4 linux #c5:2345:respawn:/sbin/agetty -8 38400 vc/5 linux #c6:2345:respawn:/sbin/agetty -8 38400 vc/6 linux
Daemon-Blacklisting
In der Datei /etc/rc.conf werden im der DAEMONS-Zeile alle startenden Dienste aufgelistet. Damit diese Dienste nicht nacheinander sondern parallel und damit gleichzeitig gestartet werden können müssen sie jeweils mit einem vorangestellten @-Zeichen versehen werden. Meine DAEMONS-Zeile sieht im Moment so aus:
DAEMONS=(syslog-ng !network @netfs @crond @acpid @cpufreq @stbd hal dhcdbd @networkmanager @httpd @mysqld @laptop-mode @alsa)
Modprobe statt load-modules.sh
Zum Laden einzelner Module verwendet Arch Linux das Script /lib/udev/load-modules.sh welches recht zeitaufwändig auch das Management
der mit einem ‘!’ gekennzeichneten, geblacklisteten Module übernimmt. Um hier Zeit zu gewinnen kann der Inhalt des Scripts durch ein einfaches
/sbin/modprobe $1 & ersetzt werden:
#!/bin/bash # Implement blacklisting for udev-loaded modules /sbin/modprobe $1 &
Die eingesparte Zeit wird allerdings duch die nun fehlende Möglichkeit des Blacklistings von Modulen in der /etc/rc.conf erkauft. Man kann versuchen Module nun über die Datei /etc/modprobe.conf zu blacklisten wenn nötig oder (wie hier für die PC-Speaker-Module nötig) über die Datei /etc/rc.local unerwünschte Module wieder zu entladen.
/etc/rc.sysinit
In dieser Datei wird ein Grossteil des Bootprozesses durchlaufen. Zeitersparnis erreicht man z.B. durch Entfernen oder Auskommentieren unnötiger Scriptteile wie z.B. das Abhandeln von LVM oder Dateisystemverschlüsselung (wobei das nicht wirklich messbar Zeit einspart da die entsprechenden Scripts sowiso durch eine IF-Abfrage ausgeschlossen werden wenn unnötig).
Deutlich mehr Zeit erspart man sich durch Backgrounding (‘&’) von Modprobe…
/sbin/modprobe $mod &
und diverser weiterer Anweisungen (hier nur eine unvollständige Zusammenfassung geänderter Zeilen):
/sbin/hwclock $HWCLOCK_PARAMS & /bin/cat /var/run/random-seed >/dev/urandom & status "Updating Module Dependencies" /sbin/depmod -A & [ -n "$KEYMAP" ] && status "Loading Keyboard Map: $KEYMAP" /bin/loadkeys -q -u $KEYMAP & /bin/cat /dev/.udev/tmp-rules--70-persistent-cd.rules >> /etc/udev/rules.d/70-persistent-cd.rules & /bin/cat /dev/.udev/tmp-rules--70-persistent-net.rules >> /etc/udev/rules.d/70-persistent-net.rules & /bin/dmesg > /var/log/dmesg.log &
Etwas wervolle Zeit lässt sich auch gewinnen wenn der “run udev-events”-Block etwas früher gestartet und
/sbin/udevadm trigger im Hintergrund (‘&’) ausgeführt wird:
if [ -x /sbin/udevadm -a -d /sys/block ]; then # We have udev and /sys appears to be mounted, use UDev #status "Starting UDev Daemon" /etc/start_udev init stat_busy "Starting UDev Daemon" /sbin/udevd --daemon stat_done else # Static /dev, our last resort status "Using static /dev filesystem" true fi # run udev uevents if /bin/pidof -o %PPID /sbin/udevd >/dev/null; then #status "Loading UDev uevents" /etc/start_udev uevents stat_busy "Loading UDev uevents" udevstart="$(/bin/date +%s%0N)" /sbin/udevadm trigger & /sbin/udevadm settle stat_done udevend="$(/bin/date +%s%0N)" printhl " UDev uevent processing time: $((($udevend-$udevstart)/1000000))ms" fi
Modprobe statt load-modules.sh in rules.d
Wie auch im Arch Linux Wiki beschrieben kann das schon erwähnte Script load-modules.sh auch in den UDEV-Regel-Dateien durch ein schnelleres
/sbin/modprobe ersetzt werden:
sudo sed -i "s#/lib/udev/load-modules.sh#/sbin/modprobe#g" /etc/udev/rules.d/*.rules
GDM früher starten
Startet man GDM früher im Bootprozess kann etwas Zeit überbrückt werden, die Idee stammt aus diesem Blogbeitrag:
stat_busy "Preloading Graphical User Interface" /usr/sbin/gdm-binary &
Falls vorhanden muss GDM aus der DAEMONS-Liste in /etc/rc.conf entfernt werden, die obigen Zeilen wurden direkt und ohne Bootparameter-Abfrage wie im verlinkten Blogbeitrag beschrieben nach der Zeile ‘# Mount local filesystems’ in der /etc/rc.sysinit eingefügt. Noch mehr Zeit liesse sich natürlich durch den Verzicht auf einen Loginmanager gewinnen.
Weiterführende Links/Quellen
Speed up Arch Wiki:Tweaking for a faster boot time Speedup Arch boot process Fast boot without recompiling the kernel Thread im Arch Linux Forum Wiki: Mkinitcpio Speedup UDEV
Am 01.02.2009, 23:13
Am 02.02.2009, 07:22
Am 18.02.2009, 21:34
http://www.computerhartware.de/thread-InitNG-Installation-Konfiguration-und-Benutzung
Vielleicht kannst du den Bootvorgang damit ja noch weiter optimieren (auch wenn InitNG anscheinend mittlerweile nicht mehr weiterentwickelt wird.)
Am 31.05.2009, 22:17