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

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

ループバックファイルを読み取り専用でマウントし、すべての書き込みを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つのより簡単な方法があるようです。

  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キーを押し、次にキーを押すとG​​RUBメニューが表示されます。金利パラメータを編集するには、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

書き込み可能にしたら、ディレクトリに必要に応じて変更できます。

答え3

はい、Unionfsが提供しています。参考Unionfs.filesystems.org。 Unionfsを介して、最初の読み取り専用ファイルシステムと2番目の読み取り/書き込みRAMファイルシステムをマウントしました。

Ubuntuでは、同じ機能を実装した別のUnionfs-fuseパッケージを見つけることができますが、カーネルモジュールではなくユーザースペースにあります。

答え4

aufsなどのUnionfsを必要とせずに、デバイスレベルでこれを行うこともできます。デバイスマッパーの表示snapshot-origin

関連情報