ループバックファイルを読み取り専用でマウントし、すべての書き込みをRAMにリダイレクトできますか?
答え1
連合ファイルシステム階層を使用できます。オブ。
デモ:
ファイルシステムイメージの作成
# 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)すべての詳細については、マニュアルページを参照してください。 )
これですべての作業が完了したので、次の結果が表示されます。
# 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ディストリビューションでは、このテクノロジ(またはそのバリエーション)を使用しています。ウィキペディアオブ項目にはいくつかのリストがあります。
答え2
修正する:
Ubuntu(少なくとも最新バージョン)でこれを行う2つのより簡単な方法があるようです。
最後に、ルートファイルシステム(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メニューが表示されます。金利パラメータを編集するには、
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
書き込み可能にしたら、ディレクトリに必要に応じて変更できます。
答え3
はい、Unionfsが提供しています。参考Unionfs.filesystems.org。 Unionfsを介して、最初の読み取り専用ファイルシステムと2番目の読み取り/書き込みRAMファイルシステムをマウントしました。
Ubuntuでは、同じ機能を実装した別のUnionfs-fuseパッケージを見つけることができますが、カーネルモジュールではなくユーザースペースにあります。
答え4
aufsなどのUnionfsを必要とせずに、デバイスレベルでこれを行うこともできます。デバイスマッパーの表示snapshot-origin
。