プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2022/04/25

Ubuntu のファイルシステムを overlayroot で読み込み専用にする

update2022/09/16 event_note2022/04/25 6:13

電源ブチ切り対策の一環として、overlayroot で Ubuntu の rootfs を read only にしてみました。

やり方はいろいろググってみましたが、以下のサイトがとても参考になりました。

環境

  • Ubuntu 20.04 (デスクトップ版)

現在の状態を確認

mount コマンドで確認してみます。

$ mount

抜粋ですが、以下の状態が確認できます。

/dev/sda2 on / type ext4 (rw,relatime,errors=remount-ro)

overlayroot のインストール

サーバー版には最初からインストールされているそうですが、デスクトップ版にはインストールされていないので、apt でインストールします。

$ sudo apt install overlayroot

overlayroot の有効化

overlayroot を有効化するには、以下のいずれかの対応が必要だそうです。

  • カーネルパラメーターに overlayroot=XXX を指定する
  • /etc/overlayroot.local.confoverlayroot="XXX" を指定する
  • /etc/overlayroot.confoverlayroot="XXX" を指定する

設定内容は上位のほうが優先されるそうです。
今回は /etc/overlayroot.local.conf に設定を追加します。
まずはエディタで開きます。

$ sudo gedit /etc/overlayroot.local.conf

以下を追記します。

overlayroot="tmpfs"

コマンド一発でやるなら以下です。

$ echo 'overlayroot="tmpfs"' | sudo tee -a /etc/overlayroot.local.conf

tmpfs はメモリ上に作成ファイルシステムで、一時的にデータを格納するために使われます。

Linux ではマウントするファイルシステムの情報が /etc/fstab に書かれていますが、ここが overlayroot における下位レイヤーとなり、読み込み専用レイヤーとなります。
そして、先ほど追記した tempfs が上位レイヤーとなり、書き込み可能レイヤーとなります。
ここらへんは後述するように mount コマンドで確認可能です。

ただし、tmpfs はメモリ上に作成されたファイルシステムなので、再起動時にはデータは消えます。

ルートファイルシステムのみを読み取り専用にする

パーティションを分けている場合などで、ルートファイルシステムのみを読み取り専用にするためには、/etc/overlayroot.local.conftmpfs:recurse=0 を指定するらしいです。
コマンド一発でやる場合は以下。

echo 'overlayroot="tmpfs:recurse=0"' | sudo tee -a /etc/overlayroot.local.conf

これで再起動すれば、ルートファイルシステムのみが読み取り専用となり、他のパーティションは読み書き可能な状態となります。

確認

先ほどと同じように mount コマンドで確認してみます。

$ mount

抜粋ですが、以下の状態が確認できました。

/dev/sda2 on /media/root-ro type ext4 (ro,relatime)
tmpfs-root on /media/root-rw type tmpfs (rw,relatime,inode64)
overlayroot on / type overlay (rw,relatime,lowerdir=/media/root-ro,upperdir=/media/root-rw/overlay,workdir=/media/root-rw/overlay-workdir/_)

ルートファイルシステムが /media/root-ro に読み込み専用(ro)の下位レイヤー(lowerdir) として設定され、tmpfs が /media/root-rw/overlay に書き込み可能(rw)な上位レイヤー(upperdir) して設定されているのが確認できます。

ファイルが消えることを確認

ついでに、ホームディレクトリに適当にファイルを作成し、再起動時にファイルが消えていることを確認します。

overlayroot の無効化

/etc/overlayroot.local.conf を削除するか、/etc/overlayroot.local.conf を編集して中身を overlayroot="" に変更すれば、overlayroot の無効化されます。

しかし、現在は overlayroot が有効化になっている状況なので、このまま変更しても再起動後にはまた元に戻ってしまいます。
そのため、この変更は一時的に書き込みを許可した状態で行う必要があります。
一時的に書き込み可能な状態にするには以下のコマンドを実行します。

$ sudo overlayroot-chroot

そして、/etc/overlayroot.local.conf を削除するか、/etc/overlayroot.local.conf を編集して中身を overlayroot="" に変更します。

# rm /etc/overlayroot.local.conf

exit でシェルから抜ければ書き込み可能状態は終了します。

# exit

再起動後、overlayroot が無効状態になっています。

GRUB メニューで時間がかかることの対策

overlayroot を有効にした状態で再起動すると、GRUB メニューが表示され、30秒ほど待たされるようになります。
詳細は以下をご参照ください。

起動が30秒も遅くなるのは困るので、以下を参考にして GRUB の設定を変更しました。

※以下は overlayroot を無効にした状態で行う必要があります!

/etc/default/grub をエディタで開きます。

$ sudo nano /etc/default/grub

以下を追記します。

GRUB_RECORDFAIL_TIMEOUT=$GRUB_TIMEOUT

設定を反映するために以下のコマンドを実行します。

$ sudo grub-mkconfig -o /boot/grub/grub.cfg

これで overlayroot を有効にしても起動時間は変わらなくなりました。