01.02.2009 (6 Kommentare)

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.

boot16s

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

Vielleicht auch noch lesenswert:

Kommentar schreiben

XHTML: Zur Formatierung können folgende Tags benutzt werden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

  1. raz0rblade
    Am 01.02.2009, 23:13
    Echtor hat dazu auch mal nen Artikel verfasst. Er kommt dabei auf 11 sek. http://echtor2oo3.de/index.php
  2. cywhale
    Am 02.02.2009, 07:22
    Hmja, den Artikel kannte ich noch nicht, danke. Er gibt zumindest was das Thema Geschwindigkeitsgewinn/Kernel-compilieren angeht einen kleinen Hinweis (‘1sec’).Ich weiss nicht ob sich der Aufwand wirklich lohnt. Anderes, schnelleres Dateisystem wäre aber durchaus eine Möglichkeit noch etwas herauszuholen, Ext3 mit noatime und data=writeback wird derzeit verwendet – evtl hilft Ext4 ja etwas weiter…
  3. Antu
    Am 18.02.2009, 21:34
    Interessanter Artikel. Ich hab auch mal versucht die Bootzeit meines Gentoo-Systems zu verbessern und hab es damals mit InitNG von 25 auf 16 Sekunden geschafft. Ich hab damals auch eine Anleitung dazu geschrieben:
    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.)
  4. cywhale
    Am 31.05.2009, 22:17
    Um das Endergebnis ohne Kernel- und mkinitcpio-Manipulation zu aktualisieren: 13 Sekunden waren hier das Minimum, GDM wurde durch Slim ersetzt oder ganz weggelassen. Nicht schlecht für einen Uralt-Celeron wie ich finde…