Firefox-Profile in Ramdisk auslagern

Aus wiki.archlinux.de

Hinweis: Dieser Artikel richtet sich an erfahrenere Linux-Nutzer

Der Startvorgang von Firefox gehört nach landläufiger Meinung nicht zu den schnellsten Startvorgängen auf einem Linux-System. Dies ist einerseits natürlich Firefox’ Funktionsweise geschuldet, andererseits aber auch dem verwendeten Firefox-Profil, das mitunter mehrere hundert Megabyte groß werden kann.

Gegen die Probleme des langsamen Startens, begründet in der Funktionsweise, kann man nicht viel tun. Wohl aber kann man die Performance verbessern, indem man sich des Firefox-Profils annimmt. Man kann das Profil nicht nur versuchen schlank zu halten, sondern es auch in eine Ramdisk auslagern, womit sich dieser Artikel beschäftigt.

Vorüberlegungen

Wenn man einen einfachen Test macht, sieht man sofort, wie viel schneller der Arbeitsspeicher gegenüber der Festplatte ist. Hierfür kann man z.B. dd verwenden und damit eine ein Gigabyte große Datei in eine Ramdisk schreiben, und danach den Test noch mal mit einer Festplatte wiederholen.

$ dd if=/dev/zero of=/home/dirk/blubb/file bs=10M count=100
100+0 Datensätze ein
100+0 Datensätze aus
1048576000 Bytes (1,0 GB) kopiert, 1,1095 s, 945 MB/s

$ dd if=/dev/zero of=/home/user/file bs=10MB count=100
100+0 Datensätze ein
100+0 Datensätze aus
1000000000 Bytes (1,0 GB) kopiert, 12,0017 s, 83,3 MB/s

Der Test wurde mit relativ kleinen Blockgrößen gemacht (zur genauen Syntax siehe Wiki-Artikel über dd. Das Ergebnis zeigt deutlich, eine Ramdisk ist mit 945 Megabyte pro Sekunde deutlich schneller als die Festplatte mit 83,3 Megabyte pro Sekunde. Man könnte nun also das Firefox-Profil in eine Ramdisk schreiben und von deren enormem Geschwindigkeitsvorteil profitieren.

Zwei Nachteile hat diese Vorgehensweise allerdings: Zum Einen benötigt eine Ramdisk, wie der Name schon verrät, RAM. Von diesem sollte also ausreichend zur Verfügung stehen. Bei einem System mit nur einem Gigabyte Arbeitsspeicher lohnt sich eine Ramdisk wahrlich nicht. Zwei Gigabyte Arbeitsspeicher sollten bei der in diesem Artikel vorgestellten Technik mindestens vorhanden sein, besser mehr.

Zum Anderen sind die Inhalte einer Ramdisk nur so lange verfügbar, wie der RAM mit Strom versorgt wird, und die Ramdisk gemountet ist. Wenn das System unerwartet ausfällt, oder man den Rechner herunter fährt, wird der RAM entladen, und die Ramdisk somit geleert. Man muss also dafür sorgen, dass die Inhalte der Ramdisk in regelmäßigen Abständen, mindestens aber beim Starten und beenden mit einem Verzeichnis auf der Festplatte – zum Beispiel mit rsync – synchronisiert werden.

Vorbereitungen

Um die in den Vorüberlegungen beschriebene Technik anzuwenden, bedarf es dreierlei Dingen. Zum Einen muss eine Ramdisk angelegt werden, zum Anderen muss rsync installiert werden und zu guter Letzt muss das Firefox-Profilverzeichnis verschoben werden.

Ramdisk

Es wird eine Ramdisk benötigt. Die Ramdisk belegt standardmäßig maximal die Hälfte des gesamten zur Verfügung stehenden Arbeitsspeichers abzüglich Swap. Ramdisks können mittels mount erstellt werden.

Man sollte die größe der Ramdisk an das Firefox-Profil anpassen. Zwar belegt eine Ramdisk nur so viel Platz, wie sie tatsächlich benötigt, aber man sollte immer klare Grenzen stecken, innerhalb derer sich das System bewegen darf.

Zuerst prüft man, wie groß das Firefox-Profilverzeichnis ist.

$ du -hs /home/user/.mozilla/firefox/
122M    /home/user/.mozilla/firefox/

Anhand dieser Angabe kann man nun die Größe der Ramdisk bestimmen. Man könnte hier zum Beispiel großzügig auf 200 Megabyte aufrunden, und noch zur Sicherheit 100 Megabyte auf diesen Wert draufschlagen. Somit hätte die zu erstellende Ramdisk eine Größe von 300 Megabyte. Mit dieser Angabe kann nun die Ramdisk in der fstab definiert werden.

[…]
none   /media/ramdisk   tmpfs   defaults,size=300m   0 0
[…]

Standardmäßig haben alle User Schreib- und Leserechte für die Ramdisk. Wenn man dies nicht will, kann man die Optionsangaben um „mode“, „uid“ und „gid“ erweitern, denen man die entsprechenden, gewünschten Werte zuweist. Der Mountpoint /media/ramdisk muss natürlich angelegt werden. Dann wird die Ramdisk mittels mount /media/ramdisk gemountet.

rsync

rsync ist im „extra“-Repository verfügbar, und kann aus diesem Heraus installiert werden.

pacman -Sy rsync

Es sind keine weiteren Einstellungen nötig, da nachfolgend alles Nötige über die Befehlszeile, sowie ein Script geregelt wird.

Profilverzeichnis

Vorlage:Warnung Da das Script, das nachfolgend in diesem Artikel erstellt wird, mit Symlinks arbeitet, muss das Firefox-Profilverzeichnis verschoben werden, da das eigentliche Verzeichnis später durch einen Symlink ersetzt werden wird.

mv /home/user/.mozilla/firefox /home/user/.mozilla/firefox-profiles

Hier wird das Profil-Verzeichnis einfach in „firefox-profiles“ umbenannt. Der Name wird später im Script einmalig angegeben und mittels einer Variablen verwendet.

Testlauf

Nun, da alles soweit vorbereitet ist, kann man das Ganze mal testweise durchspielen, was später durch ein Script automatisiert werden wird.

# Prüfen, ob die Ramdisk gemountet ist
mount | grep /media/ramdisk

# Firefox-Profilverzeichnis ertmalig auf die Ramdisk kopieren,
# und dabei alle Dateirechte und -Zeiten erhalten
cp -a /home/user/.mozilla/firefox-profiles /media/ramdisk/

# Prüfen, ob verzeichnis kopiert
ls -ld /media/ramdisk/firefox-profiles

# Symlink anlegen, um das Profilverzeichnis wieder über seinen
# Standard-Namen verfügbar zu machen
ln -s /media/ramdisk/firefox-profiles/ /home/user/.mozilla/firefox

Nun kann man Firefox bereits wieder starten. Man sollte nun einen gewissen Geschwindigkeitsgewinn feststellen. Gerade die History, sowie als auch die Awesomebar und die Bookmarks (gerade bei großen Bookmarksammlungen sollte es sich sehr bemerkbar machen) sollten nun um einiges Flotter reagieren.

Testweise sollte man nun auch das Synchronisieren mittels rsync vornehmen. Dabei sollte man den Verbose-Mode von rsync benutzen, um zu sehen, was gemacht wurde.

$ rsync -av --delete /media/ramdisk/firefox-profiles/ /home/dirk/.mozilla/firefox-profiles/
sending incremental file list
[verschiedene Dateien]

sent 6732789 bytes  received 436 bytes  13466450.00 bytes/sec
total size is 117512183  speedup is 17.45

Es wurden also einige Dateien aus der Ramdisk in das Firefox-Profilverzeichnis auf der Festplatte kopiert. Tastweise kann man einfach mal ein Bookmark anlegen, Firefox schließen, den rsync-Befehl ausführen, und den Symlink ändern.

Es sollte beim manuellen Synchronisieren mittels rsync eine Datei „places.sqlite“ synchronisiert werden, wenn dies der Fall war, wird der Bookmark auch beim Starten aus dem Verzeichnis auf der Festplatte vorhanden sein. Das System funktioniert also.

Script

Das Script hat die Aufgabe, beim Starten von X zu prüfen, ob die Ramdisk vorhanden ist, und wenn ja, das Firefox-Profilverzeichnis in die Ramdisk zu kopieren, und den Symlink zu erstellen. Das Script tut genau das, was beim Testlauf manuell gemacht wurde.

Im Kopfbereich des Scripts müssen die Daten an die eigene Umgebung angepasst werden. Dabei sind allerdings schon sinnvolle vorgaben gemacht, die sich mit den Vorbereitungen aus diesem Wiki-Artikel decken.

#!/bin/bash
# Put Firefox to ramdisk if available, and create symlink at default
# location to the version in ramdisk. If ramdisk not available, just link
# to profiles dir on harddisk.

MOZILLADIR="/home/user/.mozilla"
PROFILEDIR="firefox-profiles"
FIREFOXDIR="firefox"
RAMDISKMP="/media/ramdisk"
INFOFILE="${MOZILLADIR}/ramdiskdata"

ACTION="${1}"

if [ "${ACTION}" = "copy" ]; then
        if [ "$(mount | grep ${RAMDISKMP} 2> /dev/null)" ]; then
                rm -f "${MOZILLADIR}/${FIREFOXDIR}"
                cp -fa "${MOZILLADIR}/${PROFILEDIR}" "${RAMDISKMP}/"
        fi

        if [ "$(ls -ld ${RAMDISKMP}/${PROFILEDIR} 2> /dev/null)" ]; then
                rm -f "${MOZILLADIR}/${FIREFOXDIR}"
                ln -s "${RAMDISKMP}/${PROFILEDIR}/" \
                        "${MOZILLADIR}/${FIREFOXDIR}"
                echo "ramdisk" > "$INFOFILE"
        else
                rm -f "${MOZILLADIR}/${FIREFOXDIR}"
                ln -s "${MOZILLADIR}/${PROFILEDIR}/" \
                        "${MOZILLADIR}/${FIREFOXDIR}"
                echo "harddisk" > "$INFOFILE"
        fi
fi

if [ "${ACTION}" = "sync" ]; then
        LOCATION=$(cat "${INFOFILE}")
        if [ "${LOCATION}" = "ramdisk" ]; then
                rsync -aq --delete "${RAMDISKMP}/${PROFILEDIR}" "${MOZILLADIR}"
        fi
fi

Mittels eines Parameters wird die entsprechende Aktion ausgeführt. Wenn das Script mit dem Parameter „copy“ aufgerufen wird, prüft es, ob die Ramdisk gemountet ist, und kopiert dann das Profilverzeichnis in eben diese Ramdisk.

Im zweiten Schritt wird dann geprüft, ob das Verzeichnis auf der Ramdisk vorhanden ist. Wenn ja, wird der Symlink dorthin gesetzt, wenn nein, wird der Symlink auf das Profilverzeichnis auf der Festplatte gesetzt.

In beiden Fällen wird eine entsprechende Information in eine Informationsdatei geschrieben, die vor dem synchronisieren überprüft wird.

Das Synchronisieren wird mittels des Parameters „sync“ eingeleitet. Hier liest das Script die Informationsdatei ein, und synchronisiert mittels rsync das Festplattenverzeichnis mit dem Ramdiskverzeichnis.

Verwendung

Die Verwendung des Scripts gliedert sich in zwei Abschnitte. Zum Einen wird es beim Starten der X-Session verwendet, um das Firefox-Profilverzeichnis in die Ramdisk zu schreiben, zum Anderen wird über das Script auch die Synchronisierung – entweder einmalig beim Runterfahren, oder regelmäßig via Cronjob – vorgenommen.

Erstmalig

Da das Profilverzeichnis von Firefox nur einmalig in die Ramdisk geschrieben werden muss, reicht es, das Script mit dem entsprechenden Parameter einmalig beim starten von X auszuführen. Man kann den Aufruf zum Beispiel in die „.xinitrc“-Datei schreiben. Wenn man den Eintrag vor den Aufruf des Fenstermanagers setzt, kann man sich sicher sein, dass das Script abgearbeitet wurde, wenn der Fenstermanager geladen ist.

. .scripts/fxramdisk copy
[Aufruf des Fenstermanagers]

In diesem Fall wurde das Script im home-Verzeichnis des Users unter „.scripts/fxramdisk“ abgelegt.

Will man die Ramdisk nicht mehr verwenden, so unmountet man sie, und führt das Script einfach erneut mit dem copy-Parameter aus. Da die Ramdisk nun nicht mehr existiert, werden wird die Infodatei und der Symlink angepasst. Man sollte dies unter gar keinen Umständen machen, während Firefox noch geöffnet ist.

Synchronisierung

Die Synchronisation kann man zum Beispiel einmalig beim Runterfahren des Rechners vornehmen lassen. Dazu erstellt oder bearbeitet man die Datei /et/rc.local.shutdown und schreibt folgendes hinein:

. /etc/rc.conf
. /etc/rc.d/functions

stat_busy "Synching Firefox ramdisk to HDD"
su user -l -c "/home/dirk/.scripts/fxramdisk sync &>/dev/null"
stat_done

Dadurch wird beim Herunterfahren eine Meldung über das Synchronisieren der Verzeichnisse im selben Stil angezeigt, wie auch die anderen Meldungen beim herunterfahren angezeigt werden.

Wem das zu unsicher ist, oder wer seinen Rechner nur selten herunterfährt, aber trotzdem die Daten aus der Ramdisk auf die Festplatte sichern möchte, kann sich auch einen Cronjob einrichten, der zum Beispiel alle 5 Minuten eine Synchronisation vornimmt.

*/5 * * * *   bash /home/user/.scripts/fxramdisk sync

Das Script berücksichtigt dabei, ob die Ramdisk gemountet ist, oder nicht, wenn nach dem Mounten das Script mit dem „copy“-Parameter ausgeführt wurde. Wenn die Ramdisk nicht gemountet ist, oder die Informationsdatei falsch ist, macht der aufruf nichts.

Wrapper

Wenn man bei jedem Beenden der letzten Instanz von Firefox möchte, dass die Version auf der Fesplatte mit den Inhalten der Ramdisk abgeglichen wird, kann man sich auch ein Wrapper-Script bauen. Dieses Script ruft man dann statt Firefox auf.

#!/bin/bash
# Wrapper-Script for ramdisk/HDD sync using the ramdisk profiles script

FIREFOXPATH="$(which firefox)"
SCRIPTPATH="/home/user/.scripts/fxramdisk"

"${FIREFOXPATH}" $@

if [ -z "$(ps -U $USER | grep ' firefox$')" ] ; then
        "${SCRIPTPATH}" sync
fi

Dieses Script kann man nun statt Firefox ausführen, indem man es zum Beispiel unter /home/user/.scripts/fxwrapper speichert, und in der bashrc einen Alias erstellt.

alias firefox="/home/user/.scripts/fxwrapper"

Nachdem man sich neu eingeloggt, hat, wird nun bei Aufruf von firefox das Wrapperscript aufgerufen. Die Abarbeitung des Scripts pausiert, so lange Firefox läuft, und wird fortgesetzt, wenn die entsprechende Firefox-Instanz wieder beendet wird, dann wird überprüft, ob noch eine Firefox-Instanz läuft, wenn dies nicht der Fall ist, wird das Synchronisationsscript ausgeführt.

Siehe auch

Weblinks