表題のようにaufsをroot filesystemとしてマウントしてみたので、手順をメモする。
経緯
最近 DNA940 という面白い機器を手に入れた。なんでも本来は産業用機器のベースとして使用することを想定した機体で、中身はx86ベースの基板にGbE×4やらコンソールポートやらいろいろついている。 Debianが動いたという話も耳にする。
これにソフトウェアルーターを組み合わせて自宅ネットワークのルーターを好きなように組む、という野望を抱いたのがそもそもの動機である。
ところで、DNA940は2.5in HDDを組み込めるのでそれをメインディスクにしても良いのだけど、可動部品は可能な限りなくしたいのでCFのほうが嬉しい。しかしながら、普通にDebianやUbuntuのシステムをCFで動かすとすぐに書き込み上限に引っかかるのは目に見えている。 そこでaufsでext4の上にtmpfsをオーバーレイしたものをroot fsにしたい、というのが今回の話だ。
いきなり実機は怖いので、まずはVMWare Fusion上の仮想マシンでやってみる。
手順
同じような需要は各所に有ると見えて、手順は Ubuntuのヘルプサイト にまとまっている。意外と簡単だった。
仮想マシンを作成する。メモリを1GB、ディスクを2GB割り振って、 ディスクは丸ごとext4のルートファイルシステムとした。Swap領域は作成しない。
Ubuntu Precise (x86-64 Server Edition)をインストールする。 前述のヘルプページではLive CDからインストールするように書いてあるが、 これだとデスクトップ版がインストールされるような気がした。 そこで、普通にサーバー版のインストールディスクを用いた。
以下はヘルプページの手順に従った。
% sudo aptitude install aufs-tools
% sudo bash -c "echo aufs >> /etc/initramfs-tools/modules"
ここでヘルプページに書いてあるrootaufs Scriptを /etc/initramfs-tools/scripts/init-bottom/__rootaufs に保存した上で、
% sudo chown root:root /etc/initramfs-tools/scripts/init-bottom/__rootaufs
% sudo chmod 0755 /etc/initramfs-tools/scripts/init-bottom/__rootaufs
% sudo update-grub
% sudo-initramfs -u
とする。
initrdまわりはあまり詳しくなかったのだけど、要はこの scripts ディレクトリ以下にあるスクリプト群はinitrd.imgの中にコピーされて、起動時にinitrdで動いている段階で実行されるということらしい。 スクリプトを見る感じ、実行時の ${rootmnt} 変数とかが見慣れないものの大体やってることは予想通りだ。tmpfsをマウントして、元のrootを他のマウントポイントにどかしてreadonlyでremountして、それからaufsで両者を重ねる。
再起動する。 さっきのスクリプトはカーネルの引数にaufs=tmpfsを渡したときのみ発動するように書かれているので、起動時に引数を手入力した。
起動後 mount が期待通りであることを確認する。
なお、ヘルプページにも書かれているように、rootaufsだとdhclient3がapparmorに引っかかって動かないようだ。おまけにDHCPを何度か再試行する間、起動を待たされる。私の用途ではDHCPは必要ないのでIPはstaticに割り振ることにした。 ログを見る限り、この問題って起動タイミングの関係上rootfsの移動によってdhclient3のリンクされるライブラリのパスがapparmorが思ってるやつとずれてしまうのが原因みたいね。dhclient3をprelinkとかすれば解決するんだろうか。まー今回は関係ない。
次は、常にaufs=tmpが渡るようにGrubを設定する。
ヘルプページに書いてあるのはたぶんGrub1の設定だ。今回の環境の場合はGrub2なので少し手順が異なる。 といっても、やることは簡単で /boot/grub/menu.lst の代わりに /etc/default/grub の
GRUB_CMDLINE_LINUX_DEFAULT
に"aufs-tmpfs"を設定するだけだ。 設定した後は sudo update-grub で /boot/grub/grub.cfg を再生成する。以上により、起動時に自動的にaufs-tmpfsが引数に渡るように /boot/grub/grub.cfg が設定され、かつカーネルを入れ替えたりして grub.cfg が再生成されても設定が保たれるようになった。