それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

firefox のプロファイルをunionfs(+tmpfs)にして揮発性にして寿命を延ばし高速化する。

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 はこの方法だとうまくいかないかもしれない。