Ubuntu 12.04 preciseをaufs rootにした

表題のようにaufsをroot filesystemとしてマウントしてみたので、手順をメモする。

経緯

最近 DNA940 という面白い機器を手に入れた。なんでも本来は産業用機器のベースとして使用することを想定した機体で、中身はx86ベースの基板にGbE×4やらコンソールポートやらいろいろついている。 Debianが動いたという話も耳にする。

これにソフトウェアルーターを組み合わせて自宅ネットワークのルーターを好きなように組む、という野望を抱いたのがそもそもの動機である。

ところで、DNA940は2.5in HDDを組み込めるのでそれをメインディスクにしても良いのだけど、可動部品は可能な限りなくしたいのでCFのほうが嬉しい。しかしながら、普通にDebianUbuntuのシステムをCFで動かすとすぐに書き込み上限に引っかかるのは目に見えている。 そこでaufsでext4の上にtmpfsをオーバーレイしたものをroot fsにしたい、というのが今回の話だ。

いきなり実機は怖いので、まずはVMWare Fusion上の仮想マシンでやってみる。

手順

同じような需要は各所に有ると見えて、手順は Ubuntuのヘルプサイト にまとまっている。意外と簡単だった。

  1. 仮想マシンを作成する。メモリを1GB、ディスクを2GB割り振って、 ディスクは丸ごとext4のルートファイルシステムとした。Swap領域は作成しない。

  2. Ubuntu Precise (x86-64 Server Edition)をインストールする。 前述のヘルプページではLive CDからインストールするように書いてあるが、 これだとデスクトップ版がインストールされるような気がした。 そこで、普通にサーバー版のインストールディスクを用いた。

  3. 以下はヘルプページの手順に従った。

    • % 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で両者を重ねる。

  4. 再起動する。 さっきのスクリプトカーネルの引数にaufs=tmpfsを渡したときのみ発動するように書かれているので、起動時に引数を手入力した。

  5. 起動後 mount が期待通りであることを確認する。

    なお、ヘルプページにも書かれているように、rootaufsだとdhclient3がapparmorに引っかかって動かないようだ。おまけにDHCPを何度か再試行する間、起動を待たされる。私の用途ではDHCPは必要ないのでIPはstaticに割り振ることにした。 ログを見る限り、この問題って起動タイミングの関係上rootfsの移動によってdhclient3のリンクされるライブラリのパスがapparmorが思ってるやつとずれてしまうのが原因みたいね。dhclient3をprelinkとかすれば解決するんだろうか。まー今回は関係ない。

  6. 次は、常にaufs=tmpが渡るようにGrubを設定する。

    ヘルプページに書いてあるのはたぶんGrub1の設定だ。今回の環境の場合はGrub2なので少し手順が異なる。 といっても、やることは簡単で /boot/grub/menu.lst の代わりに /etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT に"aufs-tmpfs"を設定するだけだ。 設定した後は sudo update-grub/boot/grub/grub.cfg を再生成する。

    以上により、起動時に自動的にaufs-tmpfsが引数に渡るように /boot/grub/grub.cfg が設定され、かつカーネルを入れ替えたりして grub.cfg が再生成されても設定が保たれるようになった。