파일 시스템을 읽기 전용으로 마운트하고 쓰기를 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(적어도 최신 버전)에서 이 작업을 수행하는 두 가지 더 쉬운 방법이 있는 것 같습니다.

  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)을 사용하여 이 작업을 수행하는 방법을 알아냈습니다!

시스템을 부팅 가능하게 만드는 단계는 간단합니다. 나는 사용했다이 가이드결합하다이 가이드그리고 오류 없이 작동하는 방법을 찾기 위해 수많은 웹 검색을 했습니다.

요약:

  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 메뉴를 표시할 수 있습니다.이자형매개변수를 편집하려면 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를 통해 첫 번째 읽기 전용 파일 시스템과 두 번째 읽기-쓰기 RAM 파일 시스템을 마운트했습니다.

Ubuntu에서는 동일한 기능을 구현한 또 다른 Unionfs-fuse 패키지를 찾을 수 있지만 커널 모듈이 아닌 사용자 공간에 있습니다.

답변4

aufs와 같은 Unionfs가 필요 없이 장치 수준에서 이 작업을 수행할 수도 있습니다. 장치 매퍼 보기snapshot-origin.

관련 정보