Firefox-Profile in Ramdisk auslagern: Unterschied zwischen den Versionen

Aus wiki.archlinux.de
K Wrapperscript (vgl. Forendiskussion)
Schubi (Diskussion | Beiträge)
K dirk -> user
 
(27 dazwischenliegende Versionen von 10 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{veraltet}}
{{hinweis|Dieser Artikel richtet sich an erfahrenere Linux-Nutzer}}
{{hinweis|Dieser Artikel richtet sich an erfahrenere Linux-Nutzer}}
{{righttoc}}
{{righttoc}}
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.
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.
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 ==
== 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.
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=/media/ramdisk/file bs=10MB count=100
{{hc|dd if=/dev/zero of=/media/ramdisk/file bs=10M count=100|100+0 Datensätze ein
100+0 Datensätze ein
100+0 Datensätze aus
100+0 Datensätze aus
1048576000 Bytes (1,0 GB) kopiert, 1,1095 s, 945 MB/s}}
1000000000 Bytes (1,0 GB) kopiert, 1,60411 s, 623 MB/s


$ dd if=/dev/zero of=/home/user/file bs=10MB count=100
{{hc|dd if=/dev/zero of=/home/user/file bs=10MB count=100|100+0 Datensätze ein
100+0 Datensätze ein
100+0 Datensätze aus
100+0 Datensätze aus
1000000000 Bytes (1,0 GB) kopiert, 12,0017 s, 83,3 MB/s}}
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 [[dd|Wiki-Artikel über dd]]. Das Ergebnis zeigt deutlich, eine Ramdisk ist mit 623 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.
Der Test wurde mit relativ kleinen Blockgrößen gemacht (zur genauen Syntax siehe [[dd|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.
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.
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 ==
== Vorbereitungen ==
Zeile 30: Zeile 30:
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.
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.
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.
Zuerst prüft man, wie groß das Firefox-Profilverzeichnis ist.


$ du -hs /home/user/.mozilla/firefox/
{{hc|du -hs /home/user/.mozilla/firefox/|122M    /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.
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.
Zeile 43: Zeile 42:
  […]
  […]


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 <code>/media/ramdisk</code> muss natürlich angelegt werden. Dann wird die Ramdisk mittels <code>mount /media/ramdisk</code> gemountet.
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 {{ic|/media/ramdisk}} muss natürlich angelegt werden. Dann wird die Ramdisk mittels {{ic|mount /media/ramdisk}} gemountet.


=== rsync ===
=== rsync ===
rsync ist im „[[Pacman#Repositorien_und_Spiegel-Server|extra]]“-Repository verfügbar, und kann aus diesem Heraus [[Pacman|installiert]] werden.
rsync ist im „[[Pacman#Repositorien_und_Spiegel-Server|extra]]“-Repository verfügbar, und kann aus diesem heraus [[Pacman|installiert]] werden.


  pacman -Sy rsync
  pacman -S rsync


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


=== Profilverzeichnis ===
=== Profilverzeichnis ===
{{achtung|Man sollte den Wiki-Artikel entweder als PDF abspeichern, in einem anderen Browser als Firefox, oder an einem anderen Rechner geöffnet lassen, während man diese Schritte durchführt, da Firefox während dieser Zeit nicht laufen sollte. Wann immer man mit Dateien arbeitet, die wichtig sind, sollte man von diesen Dateien ein Backup anfertigen, auch wenn eigentlich nichts passieren sollte!}}
{{Achtung|Man sollte den Wiki-Artikel entweder als PDF abspeichern, in einem anderen Browser als Firefox, oder an einem anderen Rechner geöffnet lassen, während man diese Schritte durchführt, da Firefox während dieser Zeit nicht laufen sollte. Wann immer man mit Dateien arbeitet, die wichtig sind, sollte man von diesen Dateien ein Backup anfertigen, auch wenn eigentlich nichts passieren sollte!}}
Da das Script, das nachfolgend in diesem Artikel erstellt wird, mit [[ln|Symlinks]] arbeitet, muss das Firefox-Profilverzeichnis verschoben werden, da das eigentliche Verzeichnis später durch einen Symlink ersetzt werden wird.
Da das Script, das nachfolgend in diesem Artikel erstellt wird, mit [[ln|Symlinks]] arbeitet, muss das Firefox-Profilverzeichnis verschoben werden, da das eigentliche Verzeichnis später durch einen Symlink ersetzt werden wird.


Zeile 66: Zeile 65:
  mount | grep /media/ramdisk
  mount | grep /media/ramdisk
   
   
  # Firefox-Profilverzeichnis ertmalig auf die Ramdisk kopieren,
  # Firefox-Profilverzeichnis erstmalig auf die Ramdisk kopieren,
  # und dabei alle Dateirechte und -Zeiten erhalten
  # und dabei alle Dateirechte und -Zeiten erhalten
  cp -a /home/user/.mozilla/firefox-profiles /media/ramdisk/
  cp -a /home/user/.mozilla/firefox-profiles /media/ramdisk/
   
   
  # Prüfen, ob verzeichnis kopiert
  # Prüfen, ob Verzeichnis kopiert
  ls -ld /media/ramdisk/firefox-profiles
  ls -ld /media/ramdisk/firefox-profiles
   
   
Zeile 81: Zeile 80:
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.
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/
{{hc|rsync -av --delete /media/ramdisk/firefox-profiles/ /home/user/.mozilla/firefox-profiles/|sending incremental file list
sending incremental file list
[verschiedene Dateien]
[verschiedene Dateien]


sent 6732789 bytes  received 436 bytes  13466450.00 bytes/sec
sent 6732789 bytes  received 436 bytes  13466450.00 bytes/sec
total size is 117512183  speedup is 17.45
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 wurden also einige Dateien aus der Ramdisk in das Firefox-Profilverzeichnis auf der Festplatte kopiert. Testweise 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.
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.
Zeile 95: Zeile 93:
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.
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.
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
  #!/bin/bash
Zeile 132: Zeile 130:
         LOCATION=$(cat "${INFOFILE}")
         LOCATION=$(cat "${INFOFILE}")
         if [ "${LOCATION}" = "ramdisk" ]; then
         if [ "${LOCATION}" = "ramdisk" ]; then
                 rsync -aq --delete "${RAMDISKMP}/${PROFILEDIR}" "${MOZILLADIR}"
                 /usr/bin/rsync -aq --delete "${RAMDISKMP}/${PROFILEDIR}" "${MOZILLADIR}"
         fi
         fi
  fi
  fi
Zeile 140: Zeile 138:
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.
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.
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.
Das Synchronisieren wird mittels des Parameters „sync“ eingeleitet. Hier liest das Script die Informationsdatei ein, und synchronisiert mittels rsync das Festplattenverzeichnis mit dem Ramdiskverzeichnis.
Zeile 146: Zeile 144:
=== Verwendung ===
=== 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.
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.
=== Anwendung ===
Das Script als fxramdisk.sh unter /home/user/.scripts/ speichern und mit
# chmod -x /home/user/.scripts/fxramdisk.sh
ausführbar machen (Gegebenenfalls user durch Benutzernamen ändern).


==== Erstmalig ====
==== 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.
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
  . .scripts/fxramdisk.sh copy
  [Aufruf des Fenstermanagers]
  [Aufruf des Fenstermanagers]


In diesem Fall wurde das Script im home-Verzeichnis des Users unter „.scripts/fxramdisk“ abgelegt.
In diesem Fall wurde das Script im home-Verzeichnis des Users unter „.scripts/fxramdisk.sh“ 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.
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 ====
====Script über Systemd ausführen====
Die Synchronisation kann man zum Beispiel einmalig beim Runterfahren des Rechners vornehmen lassen. Dazu erstellt oder bearbeitet man die Datei <code>/et/rc.local.shutdown</code> und schreibt folgendes hinein:


. /etc/rc.conf
Unter /etc/systemd/system eine Datei namens “fxramdisk.service” mit folgendem Inhalt erstellen:
  . /etc/rc.d/functions
(user=durch Benutzername ersetzen)
 
  [Unit]
  Description=Firefox Ramdisk
  ConditionPathExists=/home/user/.scripts/fxramdisk.sh
   
  [Service]
  Type=oneshot
  RemainAfterExit=yes
  ExecStart=/home/user/.scripts/fxramdisk.sh copy
  ExecStop=/home/user/.scripts/fxramdisk.sh sync
   
   
stat_busy "Synching Firefox ramdisk to HDD"
  [Install]
su user -l -c "/home/dirk/.scripts/fxramdisk sync &>/dev/null"
  WantedBy=multi-user.target
stat_done
 
Nun einfach mit:
 
  # systemctl enable fxramdisk.service
 
den Dienst starten Fertig.
 
Nun wird automatisch beim starten von Archlinux das Firefox-Profil auf die RAM-Disk ausgelagert und beim herunter fahren mit dem Profil auf der HDD synchronisiert.


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


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.
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 [[Cron]]job einrichten, der zum Beispiel alle 5 Minuten eine Synchronisation vornimmt.


  */5 * * * *  bash /home/user/.scripts/fxramdisk sync
  */5 * * * *  bash /home/user/.scripts/fxramdisk.sh 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.
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 ===
==== Wrapper====
Wenn man bei jedem Beenden von Firefox möchte, dass die Version auf der Fesplatte mit den Inhalten der Ramdisk synchronisiert werden, kann man sich auch ein Wrapper-Script bauen. Dieses Script ruft man dann statt Firefox auf.
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
  #!/bin/bash
Zeile 182: Zeile 203:
   
   
  FIREFOXPATH="$(which firefox)"
  FIREFOXPATH="$(which firefox)"
  SCRIPTPATH="/home/user/.scripts/fxramdisk"
  SCRIPTPATH="/home/user/.scripts/fxramdisk.sh"
   
   
  "${FIREFOXPATH}" $@
  "${FIREFOXPATH}" $@
  "${SCRIPTPATH}" sync
   
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 <code>/home/user/.script/fxwrapper</code> speichert, und in der [[bashrc]] einen Alias erstellt.
Dieses Script kann man nun statt Firefox ausführen, indem man es zum Beispiel unter {{ic|/home/user/.scripts/fxwrapper}} speichert, und in der [[bashrc]] einen Alias erstellt.


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


Nachdem man sich neu eingeloggt, hat, wird nun bei Aufruf von <code>firefox</code> 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 automatisch das Synchronisationsscript ausgeführt.
Nachdem man sich neu eingeloggt, hat, wird nun bei Aufruf von {{ic|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 ==
== Siehe auch ==
* [[Firefox]]
* [[Firefox]]
* [[Ramdisk]]
* [[rsync]]
* [[rsync]]


Zeile 203: Zeile 228:
[[Kategorie:Browser]]
[[Kategorie:Browser]]
[[Kategorie:Scripte]]
[[Kategorie:Scripte]]
[[en:Firefox Ramdisk]]

Aktuelle Version vom 21. Mai 2019, 07:28 Uhr

Dieser Artikel wurde als veraltet markiert, und sollte kontrolliert, und gegebenfalls korrigiert bzw. aktualisiert werden.


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=/media/ramdisk/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 -S rsync

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

Profilverzeichnis

Achtung: Man sollte den Wiki-Artikel entweder als PDF abspeichern, in einem anderen Browser als Firefox, oder an einem anderen Rechner geöffnet lassen, während man diese Schritte durchführt, da Firefox während dieser Zeit nicht laufen sollte. Wann immer man mit Dateien arbeitet, die wichtig sind, sollte man von diesen Dateien ein Backup anfertigen, auch wenn eigentlich nichts passieren sollte!

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 erstmalig 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/user/.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. Testweise 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
                /usr/bin/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.

Anwendung

Das Script als fxramdisk.sh unter /home/user/.scripts/ speichern und mit

# chmod -x /home/user/.scripts/fxramdisk.sh

ausführbar machen (Gegebenenfalls user durch Benutzernamen ändern).

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.sh copy
[Aufruf des Fenstermanagers]

In diesem Fall wurde das Script im home-Verzeichnis des Users unter „.scripts/fxramdisk.sh“ 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.

Script über Systemd ausführen

Unter /etc/systemd/system eine Datei namens “fxramdisk.service” mit folgendem Inhalt erstellen: (user=durch Benutzername ersetzen)

 [Unit]
 Description=Firefox Ramdisk
 ConditionPathExists=/home/user/.scripts/fxramdisk.sh

 [Service]
 Type=oneshot
 RemainAfterExit=yes
 ExecStart=/home/user/.scripts/fxramdisk.sh copy
 ExecStop=/home/user/.scripts/fxramdisk.sh sync

 [Install]
 WantedBy=multi-user.target

Nun einfach mit:

 # systemctl enable fxramdisk.service

den Dienst starten Fertig.

Nun wird automatisch beim starten von Archlinux das Firefox-Profil auf die RAM-Disk ausgelagert und beim herunter fahren mit dem Profil auf der HDD synchronisiert.

Cronjob

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.sh 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.sh"

"${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