Hallo Leute,
auf dem letzen
Augsburger Linux-Infotag war ich auf einen Vortrag über
e4rat. Ich war begeistert und wollte es gleich auf mein Gentoo anwenden.
Ergebnis: Boot-Zeit um die Hälfte verkürzt (1-Minute -> 30 Sec.). Die manipulierten Anwendungen starten spührbar schneller.
Die Grafiken auf der Homepage sprechen für sich. Also dachte ich, ich mache mal ein Howto, wie man den schnellsten Pinguin noch schneller machen kann.
Im Prinzip geht es um zwei Dinge:
- Anordung der Dateien auf der Festplatte in der Reihenfolge, wie sie gelesen werden. Dies funktioniert nur mit ext4, da die Online-Defragmentierungsfunktionalität dieses Dateisystems genutzt wird. Hier geschieht also kein düsterer Hack, sondern es werden Kernel Funktionalitäten verwendet.
- Preloader, der die Daten in den RAM holt, bevor sie benötigt werden. Dieser funktioniert auch mit anderen Dateisystemen.
Installation:
|
Quellcode
|
1
|
emerge e4rat
|
Aktuell ist das Paket noch testing. Also vorher demaskieren.
Portage sagt Dir was noch zu tun ist. Also ggf. notwendige Kernel-Optionen und für ein Paar Pakete USE=static-libs setzen.
Bootvorgang optimieren (manuell)
Die Optimierung passiert in 3 Schritten
1. Dateien und Reihenfolge feststellen
2. Dateien auf der Festplatte sortieren (nur für ext4)
3. Preloader aktivieren (optional)
1. Dateien und Reihenfolge feststellen
Editiere die Grub Konfigurationsdatei. Kopiere den Standard Eintrag und füge bei der Kopie ein "init=/sbin/e4rat-collect" hinzu.
Die Genkernel-User entsprechend "real_init=/sbin/e4rat-collect"
Ich empfehle eine Kopie, da die Prozedur ab und zu wiederholt werden sollte. Durch System-Updates reduziert sich die Optimierung, da neue Versionen ja wo anders auf der HDD geschrieben werden.
Mein Eintrag sieht so aus:
|
Quellcode
|
1
2
3
4
|
title Gentoo Linux 2.6.36 (e4rat-collect)
root (hd0,0)
kernel /boot/kernel-genkernel-x86_64-2.6.36-gentoo-r8 real_root=/dev/mapper/vg-root4 dolvm quiet real_init=/sbin/e4rat-collect
initrd /boot/initramfs-genkernel-x86_64-2.6.36-gentoo-r8
|
Wenn der Eintrag fertig ist, ein Reboot machen und davon booten. Jetzt wird der Bootvorgang von diesem Collector beobachtet und in die
/var/lib/e4rat/startup.log mitgeschrieben.
Die Aufnahme beendet sich automatisch nach zwei Minuten. Also, wenn das System komplett hochgefahren ist, einfach noch etwas warten. Schaue anschließend ruhig in die Datei, ob es so hinkommt.
2. Dateien auf der Festplatte sortieren
Da ausgeführte Binaries nicht defragmentiert werden können, müssen alle Prozesse (soweit es geht) beendet werden.
Also als root ein
|
Quellcode
|
1
|
init S
|
eingeben. Jetzt wirst Du gefragt, ob Du mit STRG+D booten willst. An dieser Stelle einfach das Root Passwort eingeben und schon bist Du in einer minimalistischen Umgebung.
Schaue mit
|
Quellcode
|
1
|
ps faxu
|
nach, ob noch Prozesse aktiv sind, und kille sie alle (mit der Ausnahme der aktiven Bash
)
Mounte lokale Dateisysteme, wie zB. /home, falls diese auf einer extra Partition sind.
Jetzt kommt Magic:
|
Quellcode
|
1
|
e4rat-realloc /var/lib/e4rat/startup.log
|
In der Ausgabe siehst Du die Ergebnisse der Defragmentierung. Führe den Befehl mehrfach aus, bis ein Optimum erreicht ist.
3. Preloader aktivieren
Hinweis: Auf älteren Systemen wurde beobachtet, dass das System ohne den Preloader schneller hochfährt als mit. Die Umsortierung alleine bringt auch schon einiges. Es lohnt sich also mit und ohne auszuprobieren und zu vergleichen.
Editiere wieder die grub Konfiguration. Füge zu dem Standard-Eintrag ein "init=/sbin/e4rat-preload" btw. "real_init=/sbin/e4rat-preload" hinzu.
|
Quellcode
|
1
2
3
4
|
title Gentoo Linux 2.6.36 (e4rat-turbo!)
root (hd0,0)
kernel /boot/kernel-genkernel-x86_64-2.6.36-gentoo-r8 real_root=/dev/mapper/vg-root4 dolvm quiet clocksource=acpi_pm real_init=/sbin/e4rat-preload
initrd /boot/initramfs-genkernel-x86_64-2.6.36-gentoo-r8
|
Fertig!, jetzt rebooten und die Stoppuhr bereit halten
Anwendungen optimieren
1. Im Laufenden Betrieb als Root
|
Quellcode
|
1
|
e4rat-collect
|
starten.
2. Anwendung starten
|
Quellcode
|
1
|
oowriter
|
und beenden.
3. e4rat-collect mit STRG-C beenden. Er erstellt Dir eine e4rat-collect.log im aktuellen Verzeichnis.
4. Als nächstes die Files auf der Festplatte sortieren, also
|
Quellcode
|
1
|
e4rat-realloc e4rat-collect.log
|
Achtung, offene Binaries werden nicht sortiert. Die Anwendung muss also geschlossen sein.
Und schon wird diese Anwendung auch nach Reboot schneller starten.
Viel Spaß und einen großen Dank an den Entwickler Andreas Rid.
Bootvorgang optimieren (alternativ) - Automatische Optimierung des Boot-Vorganges
Da manuell die Schritte durchzuführen nicht wirklich spaß macht, habe ich mir was einfallen lassen. Ein Skript was am Anfang des Boot-Vorganges entscheidet was zu tun ist. Folgende Logik:
Immer, wenn der automatische fsck auf der root-Partition ausgeführt wird, wird die Optimierung in Gang gesetzt. Wir wollen ja auf einer sauberen Partition arbeiten
Neustart 1 nach dem fsck führt e4rat-collect aus.
Neustart 2 führt e4rat-realloc aus. Hierfür wird die / Partition kurzfristig rw gemoutntet.
Weitere Neustarts: genieße den beschleunigten Boot-Vorgang mit e4rat-preload
Das Skript optimiert nur die root-Partition.
So habe ich es eingerichtet:
Skript, der die Arbeit übernimmt (liegt bei mir unter /usr/local/bin/e4rat-auto.sh):
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LOGFILE=/var/lib/e4rat/startup.log
if [ $$ != 1 ]; then
echo "Run this script as init process."
exit
fi
if [ $UID != 0 ]; then
echo "Run this script as root."
exit
fi
echo "Welcome to e4rat-auto. Sit back, relax and enjoy!"
function do_collect {
echo "Call e4rat-collect"
exec e4rat-collect -o $LOGFILE
}
function do_preload {
echo "Call e4rat-preload"
exec e4rat-preload $LOGFILE
}
function do_realloc {
echo "Call e4rat-realloc"
mount -o remount,rw /
e4rat-realloc "$LOGFILE"
e4rat-realloc "$LOGFILE"
e4rat-realloc "$LOGFILE"
e4rat-realloc "$LOGFILE"
e4rat-realloc "$LOGFILE"
mount -o remount,ro /
}
ROOTMOUNT="$(cat /proc/cmdline | sed 's:\(.*root=\)\([-=/a-zA-Z0-9._]*\)\(.*\):\2:g')"
if [ -n "$ROOTMOUNT" ]; then
echo "e4rat-mgr: root is $ROOTMOUNT"
else
echo "ERROR: Root device not detected"
exit
fi
if [ ! -e $LOGFILE ]; then
echo "$LOGFILE does not exists"
do_collect
fi
CURRENTCOUNT="$(/sbin/tune2fs -l "$ROOTMOUNT" | grep "Mount count" | sed 's:\(.* \)\([0-9]*\):\2:g' )"
if [ -n "$CURRENTCOUNT" ]; then
echo "Current mount count: $CURRENTCOUNT"
else
echo "ERROR: Mount count could not be read"
exit
fi
if [ `stat -c %X $LOGFILE` == `stat -c %Z $LOGFILE` -o "$CURRENTCOUNT" == 2 ]; then
do_realloc
do_preload
elif [ $CURRENTCOUNT == 1 ]; then
do_collect
else
do_preload
fi
|
nicht vergessen das Skript ausführbar zu machen:
|
Quellcode
|
1
|
chmod a+x /usr/local/bin/er4at-auto.sh
|
Dieses Skript muss dann als init in die Grub.conf eingetragen werden. Also als "init=/usr/local/sbin/e4rat-auto.sh" btw. "real_init=/usr/local/sbin/e4rat-auto.sh".
Eine Sache fehlt noch: Der e4rat-collect müsste gestoppt werden, wenn das System vollständig hoch gefahren ist. Das mache ich mit:
|
Quellcode
|
1
2
3
4
5
|
~ cat /usr/sbin/e4rat-collect-stop.sh
#!/bin/sh
sleep 5
sudo killall e4rat-collect
|
Natürlich "chmod a+x" und in den Autostart des Desktops legen. Damit wird der collecter beendet sobald das System hochgefahren ist.
Damit es funktioniert, wird noch ein "visudo" Eintrag benötigt.
|
Quellcode
|
1
|
%users ALL=(ALL) NOPASSWD: /usr/bin/killall e4rat-collect
|
Das wars eigentlich. Viel Spaß damit, falls es jemand nutzen möchte.