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