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
小さな RAM ファイルシステム
# 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) の man ページを参照してください。)
これですべての作業が完了しました。これが次のとおりです。
# 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 エントリにいくつかリストされています。
更新:
Ubuntu (少なくともそれ以降のバージョン) でこれを行うには、他に 2 つの簡単な方法があるようです:
<オール>
sudo apt-get install overlayroot
続いて overlayroot="tmpfs:swap=1,recurse=0"
を設定します /etc/overlayroot.local.conf
で .
sudo apt-get install fsprotect
続いて fsprotect
を渡します カーネルパラメータとして
最終的にルートファイルシステム (Ubuntu 11.04) でこれを行う方法を見つけました!
システムを起動可能にする手順は簡単です。このガイドと一連の Web 検索を組み合わせて、このガイドを使用して、バグなしで適切に動作させる方法を見つけました。
まとめ:
<オール>実行:
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 を参照してください。最初の読み取り専用ファイルシステムをマウントし、2 つ目の読み取り/書き込み RAM ファイルシステムとして、unionfs を介してマウントしました。
Ubuntu では、unionfs-fuse パッケージを見つけることができます。これは、同じものの別の実装ですが、カーネル モジュールとしてではなく、ユーザー空間にあります。