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 をかぶせ使う(unionfs)することにした。
次のようにフォルダを作って、unionfs で使うようにした
最初に、tmpfs をつくって、そのなかにプロファイル格納用の揮発性マウントを作成。
unionfs はワーク領域が必要なので、最初に作ったtmpfs内部に作業エリアを設置。
揮発性マウントの下側に、baseとなるプロファイルをマウント。
揮発性マウントの中に、キャッシュを格納するマウントを追加。
まぁunionfs をためてしてみたかったというのがある。
これでメモリに書き込むfirefoxの設定とした。
ただ、とってもめんどくさいのでfstabに記載することを諦め、起動時に、自動的にマウントを作るようにした。
履歴を保存するときは、手作業でmerged の内容を base へcopy する。umount イベントで実行しようかと思ったけど、後回し。
/etc/systemd/scripts/firefox.mount.sh
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 はこの方法だとうまくいかないかもしれない。