Ubuntu Weekly Recipe

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

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

Ubuntuのoverlayrootパッケージを使うと,Ubuntuシステムを一時的または恒久的に「読み込み専用」として起動できます。今回はこのoverlayrootパッケージの使用方法を紹介しましょう。

overlayrootとは

LinuxのOverlayFSは,複数のディレクトリツリーをレイヤーのように重ねることで,一つのディレクトリツリーに見せかける仕組みです。

一般的な使い方としては,より下位の層を読み込み専用としてマウントしたディレクトリツリーとして用意し,上位の層を読み書き可能なディレクトリツリーとして用意し,そのふたつを重ねる方法です。これにより作成されたディレクトリツリーに対する変更は,すべて上位の層にのみ反映され,下位の層は変更されません。

身近な例だと,Dockerがストレージ・ドライバーのひとつとしてOverlayFSを採用しています。インスタンス作成時,ベースコンテナは下位の層として利用され,インスタンス用のレイヤーが上位の層として使われます。これによりインスタンスに対する変更はすべて上位の層に反映され,ベースコンテナは他のインスタンスでも流用できるのです※1⁠。

※1
OverlayFSについては,LXCで学ぶコンテナ入門の第18回 Linuxカーネルのコンテナ機能 [7] ─ overlayfs」が大変参考になります。

overlayrootはこのOverlayFSを既存のUbuntu環境でも利用するためのツールです。具体的にはすでにインストール済みの環境を下位の層として利用し,上位の層をRAMや別のストレージデバイスとして指定することで,既存の環境を変更することなくUbuntuを起動できます。

overlayrootのインストール

overlayrootを利用するためにはoverlayrootパッケージをインストールしなくてはなりません。

実はサーバー版の場合は最初からoverlayrootパッケージがインストールされています。デスクトップ版のみ明示的にインストールが必要です。

$ sudo apt install overlayroot

インストールされるのは主に次の4つです。

  • 設定ファイルであるoverlayroot.conf
  • initramfs用の各種スクリプト
  • 下層レイヤーメンテナンス用のoverlayroot-chrootコマンド
  • overlayroot有効化時のためのMOTDファイル

サーバー版には最初からインストールされていることからもわかるように,overlayrootパッケージをインストールしただけでは,overlayrootは有効化されません。有効化するには次のいずれかの対応が必要です。

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

設定内容は上位のほうが優先されます。つまりカーネルパラメーターとoverlayroot.confの両方に設定を行っている場合は,カーネルパラメーターのほうが優先されます。

overlayrootの有効化

さっそくoverlayrootを有効化してみましょう。前述のとおり方法はいくつかありますが,今回は/etc/overlayroot.local.confを編集することにします。後ほどもとに戻す方法も説明しますので,安心して次のコマンドを実行してください。

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

上記設定を行うと次回起動時から,/etc/fstab上のルートファイルシステムを下位の層として,さらにRAMを上位の層としてマウントします。つまり上位の層への変更はすべて,揮発性のRAM上に書き込まれるため再起動時に削除されます。

具体的にはinitramfsの中の初期化スクリプトがoverlayfsとしてマウントし,/etc/fstabを書き換え,最終的に「/usr/lib/klibc/bin/run-init」を実行します※2⁠。

※2
Ubuntuのinitramfsの動作については,第384回を参照してください。

たとえば次のようなfstabがあったとします。

UUID=1868998f-7acf-4dd4-8aee-fc44bee0033a /               ext4    errors=remount-ro 0       1

上記のようにoverlayroot.local.confを編集した場合,次のように変更されるのです。

#UUID=1868998f-7acf-4dd4-8aee-fc44bee0033a /media/root-ro/ ext4 ro,errors=remount-ro,noauto 0 1
/media/root-ro/ / overlay lowerdir=/media/root-ro/,upperdir=/media/root-rw/overlay/,workdir=/media/root-rw/overlay-workdir/_ 0 1
#overlayroot:swap=0#/swapfile none swap sw 0 0

UUIDで指定されたデバイス(本来のルートファイルシステム)は,/media/root-roにマウントされ,読み込み専用の下位のレイヤー(lowerdir)として設定されます。読み書き可能な上位のレイヤー(upperdir)は,今回tmpfsを指定しているためtmpfsとしてマウントされています。

実際に起動したあとの,/proc/mountsの中を見てみましょう。

$ egrep "overlayroot|/media/root-ro|/media/root-rw" /proc/mounts 2>/dev/null | sort -r
tmpfs-root /media/root-rw tmpfs rw,relatime 0 0
overlayroot / overlay rw,relatime,lowerdir=/media/root-ro,upperdir=/media/root-rw/overlay,workdir=/media/root-rw/overlay-workdir/_ 0 0
/dev/sda1 /media/root-ro ext4 ro,relatime 0 0

/dev/sda1が/media/root-roに,tmpfsが/media/root-rwにマウントされていることがわかりますね※3⁠。

※3
workdirはuppderdirへの書き込みの際にアトミックな操作を行うために必要な,upperdirと同じファイルシステム上の空のディレクトリです。

この状態でルートファイルシステムにいろいろと書いてみましょう。手っ取り早いのはホームディレクトリに何かファイルを作ることです。ソフトウェアも大抵のものは起動できますが,あまりディスクに大量のものを書くような処理は難しいかもしれません。

特にデスクトップ版の場合は,緊急時の対応用ぐらいに思ったほうが良さそうです。

いくつかルートファイルシステムに書き込んだ上で,再起動してみてください。試しにルートファイルシステムに書いた変更が,すべてなかったことになっているはずです。こんな感じで連休中に費やした無駄な時間もなかったことにできたらいいのに。

著者プロフィール

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

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