電源ブチ切り対策の一環として、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.conf
にoverlayroot="XXX"
を指定する/etc/overlayroot.conf
にoverlayroot="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.conf
に tmpfs: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 の設定を変更しました。
- https://askubuntu.com/questions/754974/grub-defaulting-to-30-second-timeout
- https://plaza.rakuten.co.jp/ftechworks/diary/202005130001/
- https://www.hiroom2.com/2018/04/30/ubuntu-1804-serial-console-ja/
※以下は overlayroot を無効にした状態で行う必要があります!
/etc/default/grub
をエディタで開きます。
$ sudo nano /etc/default/grub
以下を追記します。
GRUB_RECORDFAIL_TIMEOUT=$GRUB_TIMEOUT
設定を反映するために以下のコマンドを実行します。
$ sudo grub-mkconfig -o /boot/grub/grub.cfg
これで overlayroot を有効にしても起動時間は変わらなくなりました。