firefoxのプロファイルを揮発性(ramdisk)にする
USBメモリにUbuntuをインストールし、LiveUSBのように使っているのですが、Firefoxを起動すると遅い。ファイルのキャッシュを作成するときに時間掛かっている模様。これはUSBの寿命にも良くない。
そこで、firefoxのキャッシュフォルダをtmpfs にした
tmpfs /home/takuya/.cache/mozilla tmpfs uid=1000,defaults,nodiratime,noatime,mode=0700 0 0
それでも、まだ遅い。書き込みを見ていると、プロファイルも大量に更新が入ってる。そうかクッキーやヒストリがプロファイル・フォルダに書き込まれるのか。
それなら、プロファイルもramdisk にしたいところ。
プロファイルのramdisk 化
プロファイルをramdisk 化すると、毎回初回案内が出てきてうざったいし、設定が残らないのも困るので、最低限設定しておいいて、初期設定済みのプロファイルにramdisk をかぶせ使う(unionfs)することにした。
次のようにフォルダを作って、unionfs で使うようにした
役割 | 変数名 | パス |
---|---|---|
tmpfs | volatile | /home/$name/.mozilla/volatile |
unionfs | upper | /home/$name/.mozilla/volatile/upper |
unionfs | work | /home/$name/.mozilla/volatile/work |
元プロファイル | base | /home/$name/.mozilla/firefox.base |
unionfs | merged | /home/$name/.mozilla/firefox |
最初に、tmpfs をつくって、そのなかにプロファイル格納用の揮発性マウントを作成。
unionfs はワーク領域が必要なので、最初に作ったtmpfs内部に作業エリアを設置。
揮発性マウントの下側に、baseとなるプロファイルをマウント。
揮発性マウントの中に、キャッシュを格納するマウントを追加。
まぁunionfs をためてしてみたかったというのがある。
これでメモリに書き込むfirefoxの設定とした。
ただ、とってもめんどくさいのでfstabに記載することを諦め、起動時に、自動的にマウントを作るようにした。
履歴を保存するときは、手作業でmerged の内容を base へcopy する。umount イベントで実行しようかと思ったけど、後回し。
/etc/systemd/scripts/firefox.mount.sh
#!/usr/bin/env bash function mount_cache(){ mount -t tmpfs tmpfs -o uid=$id,defaults,nodiratime,noatime,mode=0700 $cache_mozilla } function umount_cache(){ grep -qs $cache_mozilla /proc/mounts && umount $cache_mozilla } function load_env(){ name=$1 id=$( id -u $name ) cache_mozilla=/home/takuya/.cache/mozilla volatile=/home/$name/.mozilla/volatile upper=/home/$name/.mozilla/volatile/upper work=/home/$name/.mozilla/volatile/work base=/home/$name/.mozilla/firefox.base merged=/home/$name/.mozilla/firefox ibus=/home/$name/.cache/ibus } function mount_ibus(){ mount -t tmpfs tmpfs -o uid=$id,defaults,mode=0700 $ibus } function umount_ibus(){ grep -qs $ibus /proc/mounts && umount $ibus } function mount_overlay_profile(){ [ ! -e $volatile ]; mkdir -p $volatile mount -t tmpfs tmpfs -o uid=$id,defaults,nodiratime,noatime,mode=0700 $volatile [ ! -e $upper ]; mkdir -p $upper [ ! -e $work ]; mkdir -p $work mount -t overlay overlay -o lowerdir=$base,upperdir=$upper,workdir=$work $merged } function umount_overlay_profile(){ grep -qs $merged /proc/mounts && umount $merged grep -qs $volatile /proc/mounts && umount $volatile } function main(){ name=$2 [ -z $name ] && name=takuya load_env $name case $1 in mount) mount_cache mount_overlay_profile mount_ibus ;; umount) umount_cache umount_overlay_profile umount_ibus ;; *) echo "$0 [mount|umount]"; esac } main $@
マウントを試してみる。
sudo /etc/systemd/scripts/firefox.mount.sh mount findmnt sudo /etc/systemd/scripts/firefox.mount.sh umount findmnt
サービスを作って有効化
つくったスクリプトを呼び出すためにサービスとしてログイン時や起動時に実行することにした。
/etc/systemd/system/firefox-tmpfs@.service
[Unit] Description=Mount %s firefox After=local-fs.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/etc/systemd/scripts/firefox.mount.sh mount %s ExecStop=/etc/systemd/scripts/firefox.mount.sh umount %s [Install] WantedBy=multi-user.target
有効化
sudo systemctl daemon-reload sudo systemctl enable firefox-tmpfs@takuya.service
履歴の保存
明示的に保存するときは lower にコピーすればいい
rsync -av ~/.mozilla/firefox/ ~/.mozilla/firefox.base/
メリット
爆速。本当に速い。キャッシュ作成がブラウザの遅延の原因だとよく分かる。
長寿命。USBメモリやMicroSDカードだと書き込みが本当に減るので寿命が長くなる。
懸念点
終了時に保存する方法に、いい方法があればいいんだけど・・・・
unionfs は実装が古いので、aufs やfsprotecで書ければよかったけど詳しくないので。
今回は、apt の firefoxを使っている。ubuntuのsnapstore 版のmozilla はこの方法だとうまくいかないかもしれない。