파일 시스템을 읽기 전용으로 마운트하고 쓰기를 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에 의해 사용됩니다. Wikipedia aufs 항목에는 몇 가지가 있습니다.


+1 감사합니다! 질문 : (1) fstab마운트 포인트가 /? 와 같이 이것을 할 수 있습니까? (즉, 시스템은 무시할 수있는 이미지로 부팅됩니다.)
Mehrdad

나는 그렇게 생각하지 않습니다. 에 대해 그렇게하고 싶다면 /initrd를 사용하는 것이 좋습니다 (그것이 내가 믿는 livecd에 대해 수행 된 방법입니다). 까다로운 소리이지만 init 스크립트에서 할 수 있습니다.
Mat

8

최신 정보:

우분투 (적어도 이후 버전) 에서이 작업을 수행하는 다른 두 가지 간단한 방법이 있습니다.

  1. sudo apt-get install overlayroot에 설정 overlayroot="tmpfs:swap=1,recurse=0"이 이어집니다/etc/overlayroot.local.conf .

  2. sudo apt-get install fsprotectfsprotect커널 매개 변수로 전달


마지막으로 루트 파일 시스템 (우분투 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.

    보너스 : 가끔 리디렉션을 일시적으로 해제 해야하는 경우 커널 매개 변수 목록에서이 인수를 제거하십시오. GRUB 메뉴를 표시하기 위해 시스템을 부팅 할 때 Shift 키를 눌러이를 수행 할 수 있습니다. 그런 다음 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를 통해 두 번째 읽기 / 쓰기 RAM 파일 시스템으로 마운트했습니다.

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.