overlayroot で tmpfs をかぶせて、readonly root な環境構築

Ubuntu 22.04 で overlayroot で / に tmpfs をかぶせて、/ が readonly な環境を構築します。

準備

# apt install overlayroot

設定

tmpfs を被せる際に recurse=0 を指定しないと、fstab に書かれた / 以外の partition にも overlayroot が効いてしまうため、これを追加します。

Filename: /etc/overlayroot.conf

overlayroot="tmpfs:recurse=0"

設定を有効にするために再起動します。

# reboot

確認

mount point が /media/root-ro のようになっていたら、成功です。

# df
Filesystem              1K-blocks       Used  Available Use% Mounted on
/dev/nvme0n1p4           46130004   15809432   27944892  37% /media/root-ro
tmpfs-root               30784228     219212   30565016   1% /media/root-rw
overlayroot              30784228     219212   30565016   1% /

tmpfs を overlay した後のファイル修正方法

overlayroot-chroot で /media/root-ro が rw で remount され、そこに chroot で入った状態になります。この chroot 環境でファイルを修正すれば、変更が適用されるようになります。

# overlayroot-chroot

overlayroot を解除する場合は、/etc/overlayroot.conf の設定を戻します。

Filename: /etc/overlayroot.conf

overlayroot=""
overlayroot-chroot についての補足

overlayroot-chroot は、/media/root-ro を rw で remount して、そこに chroot するという動作をしています。
コンソールを抜けるときに、ro で remount しますが、タイミングが悪いとまだファイルが使用中で ro の remount が失敗して、rw のままの状態になることがよくあります。(書き込まなければ、大きな問題は起きませんが・・)

また、/media/root-ro を起動中に修正することは、overlayfs の lower 部分を変更することになり、不整合が起きて、おかしな動作になる可能性があります。
apt によるパッケージのインストールなどは行わず、/etc/overlayroot.conf を修正して、overlayroot の解除だけに留めるのが懸命です。

chroot 無しで、rw にするだけであれば、mount コマンドで remount する方法もあります。

# mount /media/root-ro -o remount,rw

補足1: overlayfs 使用時に docker が使えなくなる問題の対処

overlayfs が適用されているパーティションに /var/lib/docker があると、docker が正しく動作しないという問題が Ubuntu 22.04 で起きました。
恐らく、docker 自身が overlayfs を使用するためと思われます。

この場合は、docker のデータが起動ごとに消えなくはなりますが、/var/lib/docker に別パーティションが mount されるように fstab を記述すれば、大丈夫です。

補足2: Ubuntu 22.04 向けの修正

Ubuntu 22.04 の cloud-initramfs-tools (0.47) には、fstab の nofail mount option が正しく扱われない不具合があるため、バージョンが古い場合は、これを修正します。

overlayroot: nofail is not applied, an unplugged removable disk makes it stuck on boot
https://bugs.launchpad.net/ubuntu/+source/cloud-initramfs-tools/+bug/2049271

修正箇所

Filename: /usr/share/initramfs-tools/scripts/init-bottom/overlayroot

--- initramfs-tools/scripts/init-bottom/overlayroot
+++ initramfs-tools.1/scripts/init-bottom/overlayroot
@@ -393,7 +393,7 @@
        else
            ospec="${root_ro}${file}"
            copy_opts=""
- for copy_opt in nobootwait noauto; do
+ for copy_opt in nobootwait noauto nofail; do
                case ",$opts," in
                    *,${copy_opt},*)
                        copy_opts="${copy_opts},${copy_opt}";;
修正方法

initramfs-tools の script を修正

# vi /usr/share/initramfs-tools/scripts/init-bottom/overlayroot

initramfs の更新

# update-initramfs -u

更新されたスクリプトが入っていることを確認

# lsinitramfs -l /boot/initrd.img | grep overlay