GNU/Linux >> Linux の 問題 >  >> Linux

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

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


    Linux
    1. iノードとLinuxファイルシステム

    2. Linuxで出力をファイルとStdoutにリダイレクトする方法

    3. SSHFS?それは何ですか、どのように使用しますか?

    1. ファイルシステムをマウントする方法、ユーザーIDのマッピング?

    2. Cifsファイルシステムを直接またはFstab経由でマウントしますか?

    3. リダイレクトとパイプ出力?

    1. ファイルを作成してファイルシステムとしてマウントする方法は?

    2. Linux でファイルシステム / パーティションをマウントおよびアンマウントする方法 (Mount/Umount コマンドの例)

    3. FUSE ファイルシステム タイプを mount(8) と fstab に登録する方法は?