web-dev-qa-db-ja.com

ファイルシステムを読み取り専用でマウントし、書き込みをRAMにリダイレクトしますか?

ループバックファイルを読み取り専用としてマウントし、すべての書き込みをRAMにリダイレクトすることは可能ですか?

21
user541686

更新:

Ubuntu(これ以降のバージョン)でこれを行うには、他に2つの簡単な方法があるようです。

  1. Sudo apt-get install overlayrootに続いてoverlayroot="tmpfs:swap=1,recurse=0"/etc/overlayroot.local.confに設定

  2. Sudo apt-get install fsprotectの後にfsprotectをカーネルパラメータとして渡す


ルートファイルシステム(Ubuntu 11.04)でこれを行う方法をついに見つけました!

システムを起動可能にする手順は簡単です。私は このガイドこのガイド と組み合わせて使用​​し、多くのWeb検索を使用して、バグなしで適切に機能させる方法を見つけました。

概要:

  1. 実行:

    Sudo apt-get install fsprotect apparmor-utils
    
  2. これを/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
    
  3. /etc/default/grubで、GRUB_CMDLINE_LINUX_DEFAULTで始まる行を見つけ、その後の引用符の中にパラメーターaufs=tmpfsを追加します。

    ボーナス:時々一時的にリダイレクトをオフにする必要がある場合は、この引数をカーネルから削除してくださいパラメータリスト。システムの起動時にShiftキーを押してGRUBメニューを表示し、eを押してパラメータを編集することで、おそらくこれを実行できます、およびaufs=...パラメータをリストから削除するだけです。

  4. これらの行を/etc/sysctl.confに追加します。 (警告:潜在的なセキュリティリスク。)

    kernel.yama.protected_nonaccess_hardlinks = 0
    kernel.yama.protected_sticky_symlinks = 0
    
  5. 次の行を実行します。

    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

書き込み可能にしてから、そのディレクトリに必要な変更を加えることができます。

8
user541686

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

/tmp/rammnt(読み取り専用)の上に/tmp/imgmnt(読み取り/書き込み)をスタックして新しい「ブランチ」(br)を作成するためのマウントオプション。この「ブランチ」は、/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ファイルシステムに「stop」と書き込んでも、ループにマウントされたイメージファイルへの伝播は試行されません。

特定のtmpfsを作成する代わりに、(読み取り/書き込みファイルシステム上の)プレーンディレクトリ、または/dev/shmの下のディレクトリを使用できます。


この手法(またはそのバリエーション)は、一部のディストリビューションLiveCDで使用されています。ウィキペディア aufs エントリにはいくつかのリストがあります。

19
Mat

はい、unionfsによって、 nionfs.filesystems.org を参照してください。最初に読み取り専用のファイルシステムをマウントし、2番目に読み取り/書き込みとしてRAM unionfsを介してファイルシステムをマウントします。

Ubuntuでは、同じものの別の実装であるunionfs-Fuseパッケージを見つけることができますが、カーネルモジュールとしてではなく、ユーザー空間にあります。

2
Jan Marek

Aufsのようなunionfsなしで、これをデバイスレベルで行うこともできます。 device-mapper snapshot-Origin

0
Tor Klingberg