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


回答:


18

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)のマニュアルページを参照してください。)

これですべてが完了しました。次のとおりです。

# 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エントリにはいくつかがリストされています。


+1ありがとう!質問:(1)でこれを行うには、それが可能なfstabマウント・ポイントであるように、/?(つまり、かなりの廃棄イメージからシステムが起動するようにします。)
Mehrdad

そうは思いません。のためにそれをしたい場合/は、initrdの方が良いと思います(それが、私が信じているlivecdの方法です)。あなたはinitスクリプトからそれを行うことができるかもしれませんが、それは難しいように聞こえます。
マット

8

更新:

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

  1. sudo apt-get install overlayrootに設定overlayroot="tmpfs:swap=1,recurse=0"/etc/overlayroot.local.confます。

  2. sudo apt-get install fsprotectfsprotectカーネルパラメータとして渡す


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

システムを起動可能にする手順は簡単です。私が使用し、このガイドと組み合わせて、このガイドにはバグなしで、正常に動作し取得する方法を見つけ出すために、ウェブ検索の束を。

概要:

  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

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


2

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

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.