Ubuntu Weekly Recipe

第568回 overlayrootでUbuntuを一時的に読み込み専用にする

この記事を読むのに必要な時間:およそ 3 分

overlayrootの無効化

overlayrootを無効化するには,/etc/overlayroot.local.confの内容をもとに戻します。具体的にはファイルを削除するか,⁠overlayroot=""」のように空にしてしまいます。

ところでoverlayrootを有効化していると,ルートファイルシステムの変更は再起動後にリセットされます。つまりoverlayrootを有効化した状態だと/etc/overlayroot.local.confを変更できないのです。これは困りました。

当然のことながら,このような状態でも対応できるように作られています。取れる方針は次の2つです。

  • より優先度の高いカーネルパラメーターで無効化する
  • 一時的に低層のファイルシステムに書き込みできるようにする

たとえばGRUB起動時にメニューエントリーを表示し,起動オプションに「overlayroot=disabled」を追加すれば,その起動時はoverlayrootが無効化されます。一時的に無効化して起動したい場合に便利でしょう。

後者の方法はoverlayroot-chrootコマンドを使います。

$ sudo overlayroot-chroot

これだけで低層のルートファイルシステムが書き込み可能な状態で再マウントされます。/etc/overlayroot.local.confを恒久的に変更したいならこの方法を使うと良いでしょう。

書き込み可能な状態を終了するには,⁠exit」コマンドでそのシェルを抜けてください。

GRUBのメニューで時間がかかるようになる

overlayrootを有効化して再起動すると,GRUBメニューが表示され,さらに起動開始するまで30秒ほど待つようになります。これはGRUBの起動完了テスト機能による弊害です。

GRUBにはメニューエントリーに「recordfail」と記載していると,起動時にGRUBの環境変数領域(/boot/grub/grubenv)「recordfail = 1」などを記録します。この環境変数は,grub-initrd-fallback.serviceが起動したら,削除されます。つまりカーネルが起動しinitramfsが期待通り動作し,ルートファイルシステムがマウントされて,systemdが動くようになったら,GRUBの環境変数領域は空になるのです。

GRUBは次回起動時,recordfailなどの環境変数が残っていたら「前回の起動は失敗した(カーネルかinitramfsか他の何かに問題がある)⁠と判断し,30秒ほどメニューを表示し,次のメニューエントリーを代わりに起動します。

さて,今回のようにoverlayrootを有効化した場合,/boot/grubも読み込み専用としてマウントされます。つまり起動が成功したとしてもrecordfailを消せないのです。このため,次の起動時は「前回の起動は失敗した」と判断されてしまうわけです。

もしoverlayrootを常用する場合は,GRUBのメニューエントリーからrecordfailを削除してもいいかもしれません。

より高度な利用方法

overlayroot変数にはtmpfs以外にもさまざまなパラメーターを付与できます。詳細は「/etc/overlayroot.conf」を参照してください。

  • swapパーティションを使用したい場合※4)⁠overlayroot="tmpfs:swap=1"
  • ルートファイルシステム以外のパーティションは書き込み可能にしたい場合※4)⁠overlayroot="tmpfs:recurse=0"
  • デバッグ出力を有効化したい場合:overlayroot="tmpfs:debug=1"
  • 上位レイヤーのディレクトリ名(/overlay)を変更したい場合:overlayroot="tmpfs:dir=other"
※4
最近のUbuntuで標準的に使われているswapファイルはサポートしていません。共用できるのはswapパーティションのみです。

既存のストレージデバイスを上位レイヤーとして使用したい場合は,tmpfsの代わりに次のように設定します。

overlayroot="device:dev=/dev/sdb"
overlayroot="device:dev=LABEL=flashdrive,timeout=180"
overlayroot="device:dev=/dev/sdb1,mkfs=0,fstype=ext4"

1つ目の例は特定のパーティションを指定しており,2つ目の例はディスクラベルで指定しています。さらに2つ目の例ではマッチするデバイスが存在しない場合は,最大180秒間待ちます。

1つ目,2つ目ともに,デバイスにext4のパーティションを作成します。もし既存のパーティションを流用したいなら,3つ目の例のように「mkfs=0,fstype=ext4」を指定してください。

overlayrootとは別にoverlayroot_cfgdiskという変数も存在します。これはoverlayroot.confが存在するストレージを指定するための変数です。

overlayroot_cfgdisk="LABEL=OROOTCFG"

標準では「disabled」が設定されているため,ローカルのルートファイルシステムが使用されます。たとえば外部ストレージにoverlay.confを保存しておき,そのストレージを接続している状態なら起動できるようにしたい場合に便利でしょう。

他にもパスワードロックやdm-cryptを用いた暗号化ストレージにも対応しています。overlayroot_cfgdiskと合わせると,特定のキーを利用した場合に起動できるような端末も作成できるでしょう。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。