トップ > Live CD化 >
マウント方式とOverlayFSの併用によるLive CD化

透過ファイルシステムを使ってファイルシステムを書き込み可能にする

前の記事では、作成した新システムをCDから起動できるように修正を加えました。 ただし、ルートファイルシステムに書き込めないため、正常には起動できませんでした

ここでは、透過ファイルシステムを使うことでルートファイルシステムを書き込み可能な状態にし、新システムが正常に起動できるようにします。

ページの先頭へ
 

透過ファイルシステムとは

透過ファイルシステムは、2つのファイルシステムを重ね、まるで1つのファイルシステムであるかのように見せる仕組みです。 重ねられる2つのファイルシステムは平等な関係ではなく、上層ファイルシステムと下層ファイルシステムに区別されます。

透過ファイルシステムの動作

透過ファイルシステムに読み込みアクセスがあると、カーネルは、まずは上層ファイルシステムからそのファイルを探します。 上層ファイルシステムにファイルがあればそれを読み出し、なければ下層ファイルシステムのファイルを読み出します。 下層ファイルシステムにもファイルが存在しない場合は、Not Foundとなります。

透過ファイルシステムに書き込みアクセスがあると、カーネルは上層ファイルシステムに対して書き込みを行います。 その後、そのファイルへの読み込みアクセスがあると、当然、上層ファイルシステムから読み出されます。

つまり、上層ファイルシステムが優先された多層のファイルシステムというわけです。

透過ファイルシステムの用途

透過ファイルシステムの用途は主に2つあります。 1つめはLinuxのLive CDのような読み込み専用のメディアから起動できるLinuxシステムを作ることです。 2つめはファイルシステムの『ある時点』からの差分、つまり、スナップショットを取ることです

本書の目的は1CD Linuxを作ることですので、ここでは1つめのLive CD向けの利用方法についてのみもう少し解説します

Live CD向けの利用方法

Live CD向けに利用する場合には、下層ファイルシステムにはCD-ROMのようなリードオンリーのファイルシステムを配置します。 そのファイルシステムには、Linuxシステムを格納しておきます

上層ファイルシステムには、書き込み可能なファイルシステムを配置します。 通常は、メモリをファイルシステムとして利用できるよう tmpfs を使いますが、USBフラッシュメモリを使う場合もあります。

これらのファイルシステムを重ねて透過ファイルシステムを作成する処理は、初期RAMディスクの /init に記述します。 透過ファイルシステムが作成できたら、/init は、その透過ファイルシステムにスイッチルートします。

スイッチルート後は、まるでCDが書き込み可能となったかのようにシステムが動作します。 読み込みはCDから行われ、書き込みはメモリやUSBフラッシュメモリ上のファイルシステムに行われるためです。 もちろん、書き込みエラーなどは発生しません

利用する透過ファイルシステム

透過ファイルシステムには、UnionFS、aufs、OverlayFSなどがありますが、本ウェブサイトではOverlayFSを使用します。

  
OverlayFSは、カーネルのソースファイルに最初から含まれており、パッチを当てる必要はありません。

なお、新システムでOverlayFSの機能が使えるのは、カーネルコンフィグレーションで以下のように設定したためです。

項目 設定内容

File systems --->
↓
Overlay filesystem support

ビルトイン<*>
ページの先頭へ
 

初期RAMディスクの修正

初期RAMディスクを修正します。 透過ファイルシステムを作成し、それをルートファイルシステムとして利用するよう修正します。

なお、引き続き、Fedora上でチェンジルートはせずに作業してください

  
作成した新システムから起動するのではなく、Fedoraを起動し、チェンジルートせずに作業を行ってください。

初期RAMディスクの展開

初期RAMディスクを展開します。


rm -vfr $MYLINUX/tmp/initrd
mkdir -vp $MYLINUX/tmp/initrd
pushd $MYLINUX/tmp/initrd
zcat $MYLINUX/boot/initrd.img-4.0.4 | cpio -i --make-directories
popd

  
$MYLINUX/tmp/initrd は存在しないはずですが、念のために最初に削除しています。

ディレクトリの作成

ディレクトリを新たに作成します。


mkdir -vp $MYLINUX/tmp/initrd/cdrom
mkdir -vp $MYLINUX/tmp/initrd/overlay

/cdrom は、起動用CDをマウントするために使います。 /overlay は、tmpfs をマウントするために使います。

  
tmpfs はメモリを使った一時的なファイルシステムです。 いわゆる、RAMディスクのようなものです。

実行ファイルのコピー

新たに必要になる実行ファイルをコピーします。


cp -va $MYLINUX/bin/mkdir $MYLINUX/tmp/initrd/bin/

上記のように、mkdirのみをコピーします。

初期RAMディスク用のinitの置き換え

初期RAMディスク用のinitを作り直します。


cat > $MYLINUX/tmp/initrd/init << "EOF"
#!/bin/bash
export PATH="/sbin:/bin"

echo
echo "My Linux initrd"
echo

mount -t proc     proc /proc
mount -t sysfs    none /sys
mount -t devtmpfs none /dev

CDROM=`grep -i "drive name" /proc/sys/dev/cdrom/info | sed -e 's/drive name.*[ \t]//'`

mount -o ro /dev/$CDROM /cdrom

mount -t tmpfs tmpfs /overlay

mkdir /overlay/upper
mkdir /overlay/work

mount -t overlay overlay -o lowerdir=/cdrom,upperdir=/overlay/upper,workdir=/overlay/work /newroot

mkdir /newroot/overlay

mount --move /overlay /newroot/overlay

umount /sys
umount /proc

exec /sbin/switch_root /newroot /sbin/init
EOF
chmod 0755 $MYLINUX/tmp/initrd/init

上記ファイルの変更点について詳しく見てみましょう。

まず、


mount -o ro /dev/$CDROM /cdrom

は、光学ドライブのメディアを /cdrom にマウントしています。 当然ですが、/cdrom はリードオンリーであり、書き込みはできません。 なお、このファイルシステムは、下層ファイルシステムとして利用します

次の、


mount -t tmpfs tmpfs /overlay

は、/overlay にtempfs のファイルシステムをマウントしています。 なお、tempfs はメモリを使用した一時的なファイルシステムです。

つまり、書き込み可能なファイルシステムが作成されたことになります

続く、


mkdir /overlay/upper
mkdir /overlay/work

は、/overlay に2つのディレクトリを作成しています。 なお、upper は上層ファイルシステムとして利用するためのもので、work はカーネルが透過ファイルシステムの作業用に利用します。

もちろん、どちらのディレクトリも、/overlay の下にあるため書き込みが可能です

次の、


mount -t overlay overlay -o lowerdir=/cdrom,upperdir=/overlay/upper,workdir=/overlay/work /newroot

の部分が、肝心の透過ファイルシステムの作成部分です。 上記のコマンドにより、/cdrom と /overlay/upper が重ねられた新たな透過ファイルシステムが作成され /newroot にマウントされます。 なお、/cdrom が下層ファイルシステムであり、/overlay/upper が上層ファイルシステムです。

つまり、/newroot 以下を参照すると /cdrom の中身である光学ドライブのメディアの内容に、/overlay/upper の内容が重ねられたものが見えます。 また、/newroot 以下に何かを書き込むと、実際の書き込みは /overlay/upper に対して行われます。

その次の、


mkdir /newroot/overlay

は、透過ファイルシステムの中に overlay というディレクトリを作成しています。

さらにその次の、


mount --move /overlay /newroot/overlay

は、とても重要です。 これは、ファイルシステムのマウントポイントを移動する処理です。

なぜ、/overlay を /newroot 以下に移動させたのか。 それは、スイッチルート後にも 上層ファイルシステムである /overlay/upper が見えるようにするためです

この後の処理で、スイッチルートによりルートファイルシステムが /newroot に切り替わります。 そうすると、/overlay は見えなくなるのです。 上層ファイルシステムである /overlay/upper にはルートファイルシステムへ書き込まれた内容が保持されています。

大切なデータである /overlay/upper が見えなくなると困りますので、スイッチルート後にも参照できる /newroot/overlay に移動させています。

アーカイブ

初期RAMディスク作成用のファイルツリーを、初期RAMディスクに戻します。


pushd $MYLINUX/tmp/initrd
find . | cpio -R 0:0 -o -H newc | gzip > $MYLINUX/boot/initrd.img-4.0.4
popd

  
初期RAMディスクは、$MYLINUX/boot/initrd.img-4.0.4 として作成されています。

マウント方式向けの配布用ファイルツリーへのコピー

初期RAMディスクをマウント方式向けの配布用ファイルツリーにもコピーします。


rm -vf $MYLINUX/isolinux/rootforcdrommount/boot/initrd.img-4.0.4
cp -va $MYLINUX/boot/initrd.img-4.0.4 $MYLINUX/isolinux/rootforcdrommount/boot/

後始末

不要になった初期RAMディスク作成用のファイルツリーを削除します。


rm -vfr $MYLINUX/tmp/initrd

ページの先頭へ
 

CDへの書き込み

新システムをCDに書き込みます。 書き込む対象は、ルートファイルシステム、カーネル、初期RAMディスク、CD起動用ブートローダです。

ISOイメージの作成

では、ISOイメージを作成します。


mkisofs \
  -o $MYLINUX/isolinux/mylinux.iso \
  -b isolinux.bin \
  -c boot.cat \
  -L \
  -J \
  -R \
  -no-emul-boot \
  -boot-load-size 4 \
  -boot-info-table \
  $MYLINUX/isolinux/rootforcdrommount

前の記事の時と同じオプションで実行しています。

CD-Rへの書き込み

前の記事の時と同じ手順でISOイメージファイルをCD-Rへ書き込んでください。

ページの先頭へ
 

起動テスト

では、起動テストを行います。 作成した起動用CDを光学ドライブにセットし、電源を投入してください

今度は正常に起動し、ログインプロンプトの表示まで問題なく進んだはずです

rootでログインし、最小システムの構築 > 新システムの起動と動作テスト - 新システムの動作テスト -と同じ手順でテストを実施してください。

透過ファイルシステムの上層ファイルシステムについて

動作テストが完了したら、透過ファイルシステムの上層ファイルシステムである /overlay/upper を見てみましょう。


find /overlay/upper

以下のようにファイルが作成されていることがわかります。

...(省略)...
/overlay/upper/run/klogd.pid
/overlay/upper/run/syslogd.pid
/overlay/upper/run/mount
/overlay/upper/run/mount.utab
/overlay/upper/run/utmp
/overlay/upper/overlay

これらのファイルは、ルートファイルシステムに対して書き込みが行われたことで作成された起動用CDとの差分、つまり、スナップショットです。

ページの先頭へ