回答:
aufsのようなユニオンファイルシステムレイヤーを使用することは可能です。
デモ:
# dd if=/dev/zero of=/tmp/image bs=1024 count=1024
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 0.0028428 s, 369 MB/s
# mke2fs /tmp/image
...
# mkdir /tmp/imgmnt
# mount -o loop /tmp/image /tmp/imgmnt
# echo hello > /tmp/imgmnt/hello.txt
# umount /tmp/imgmnt
# mount -o loop,ro /tmp/image /tmp/imgmnt
# echo blah > /tmp/imgmnt/hello.txt
-su: /tmp/imgmnt/hello.txt: Read-only file system
# mkdir /tmp/rammnt
# mount -t tmpfs -o size=1M none /tmp/rammnt
# mkdir /tmp/combined
# mount -t aufs -o br:/tmp/rammnt:/tmp/imgmnt=ro none /tmp/combined
(読み取り専用)の上にbr
積み重ねる/tmp/rammnt
(読み取り/書き込み)ことにより、新しい「ブランチ」()を作成するマウントオプション/tmp/imgmnt
。この「ブランチ」は、上の(読み取り/書き込み)ファイルシステムとして表示されます/tmp/combined
。
(詳細については、aufs(5)のマニュアルページを参照してください。)
これですべてが完了しました。次のとおりです。
# ls /tmp/combined
hello.txt lost+found
# cat /tmp/combined/hello.txt
hello
# echo bye > /tmp/combined/hello.txt
# cat /tmp/combined/hello.txt
bye
# cat imgmnt/hello.txt
hello
# cat rammnt/hello.txt
bye
そのため、tmpfs
ファイルシステムに「停止」する書き込みは、ループマウントされたイメージファイルへの伝播を試みません。
/dev/shm
専用のディレクトリを作成する代わりに、プレーンディレクトリ(読み取り/書き込みファイルシステム上)を使用することもできますtmpfs
。
この手法(またはそのバリエーション)は、いくつかのディストリビューションLiveCDで使用されています。ウィキペディアのaufsエントリにはいくつかがリストされています。
/
は、initrdの方が良いと思います(それが、私が信じているlivecdの方法です)。あなたはinitスクリプトからそれを行うことができるかもしれませんが、それは難しいように聞こえます。
Ubuntuでこれを行うには、少なくとも2つの簡単な方法があるようです(少なくとも以降のバージョン):
sudo apt-get install overlayroot
に設定overlayroot="tmpfs:swap=1,recurse=0"
し/etc/overlayroot.local.conf
ます。
システムを起動可能にする手順は簡単です。私が使用し、このガイドと組み合わせて、このガイドにはバグなしで、正常に動作し取得する方法を見つけ出すために、ウェブ検索の束を。
概要:
実行:
sudo apt-get install fsprotect apparmor-utils
これをに保存します/etc/initramfs-tools/scripts/init-bottom/__rootaufs
。名前は実際には重要ではないと思いますが、先頭__
は順序付けの目的で使用される可能性があるため、名前を変更する場合は、アンダースコアを保持することをお勧めします。(これはこのファイルのコピーです。)
#!/bin/sh -e
case $1 in
prereqs)
exit 0
;;
esac
for x in $(cat /proc/cmdline); do
case $x in
root=*)
ROOTNAME=${x#root=}
;;
aufs=*)
UNION=${x#aufs=}
case $UNION in
LABEL=*)
UNION="/dev/disk/by-label/${UNION#LABEL=}"
;;
UUID=*)
UNION="/dev/disk/by-uuid/${UNION#UUID=}"
;;
esac
;;
esac
done
if [ -z "$UNION" ]; then
exit 0
fi
# make the mount points on the init root file system
mkdir /aufs /ro /rw
# mount read-write file system
if [ "$UNION" = "tmpfs" ]; then
mount -t tmpfs rw /rw -o noatime,mode=0755
else
mount $UNION /rw -o noatime
fi
# move real root out of the way
mount --move ${rootmnt} /ro
mount -t aufs aufs /aufs -o noatime,dirs=/rw:/ro=ro
# test for mount points on union file system
[ -d /aufs/ro ] || mkdir /aufs/ro
[ -d /aufs/rw ] || mkdir /aufs/rw
mount --move /ro /aufs/ro
mount --move /rw /aufs/rw
# strip fstab off of root partition
grep -v $ROOTNAME /aufs/ro/etc/fstab > /aufs/etc/fstab
mount --move /aufs /root
exit 0
/etc/default/grub
で始まる行を見つけ、その後にGRUB_CMDLINE_LINUX_DEFAULT
続く引用符内にパラメータを追加しますaufs=tmpfs
。
ボーナス:一時的にリダイレクトをオフにする必要がある場合は、カーネルパラメーターリストからこの引数を削除してください。システムの起動時にShiftキーを押したままにしてGRUBメニューを表示すると、おそらくこれを行うことができます。次にeを押してパラメーターを編集aufs=...
し、リストからパラメーターを消去します。
これらの行をに追加し/etc/sysctl.conf
ます。(警告:潜在的なセキュリティリスク。)
kernel.yama.protected_nonaccess_hardlinks = 0
kernel.yama.protected_sticky_symlinks = 0
次の行を実行します。
sudo aa-complain dhclient3
sudo chmod 0755 /etc/initramfs-tools/scripts/init-bottom/__rootaufs
sudo update-initramfs -k all -u
sudo update-grub
すべてがうまくいった場合は、リブートすると、一時ファイルシステムになります。RAM部分は/rw
にあり、ディスクイメージはにあります/ro
が、もちろん読み取り専用です。
それでも、一時システムを起動したが、永続的な変更を加える必要がある場合は、次のようにして/ro
ファイルシステムを再マウントできます。
sudo mount -o remount,rw /ro
書き込み可能にすると、そのディレクトリに必要な変更を加えることができます。
はい、unionfsにより、unionfs.filesystems.orgを参照してください。最初に読み取り専用ファイルシステムをマウントし、次にunionfsを介して2番目の読み取り/書き込みRAMファイルシステムをマウントします。
Ubuntuでは、unionfs-fuseパッケージを見つけることができます。これは、同じことの別の実装ですが、カーネルモジュールとしてではなく、ユーザー空間にあります。
aufsのようなunionfsなしで、デバイスレベルでこれを行うこともできます。デバイスマッパーを参照snapshot-origin
。
fstab
マウント・ポイントであるように、/
?(つまり、かなりの廃棄イメージからシステムが起動するようにします。)