답변:
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
# 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 항목에는 몇 가지가 있습니다.
/
initrd를 사용하는 것이 좋습니다 (그것이 내가 믿는 livecd에 대해 수행 된 방법입니다). 까다로운 소리이지만 init 스크립트에서 할 수 있습니다.
우분투 (적어도 이후 버전) 에서이 작업을 수행하는 다른 두 가지 간단한 방법이 있습니다.
시스템을 부팅 가능하게 만드는 단계는 간단합니다. 내가 사용 이 가이드 와 조합을 이 가이드 및 여러 웹 검색과 하여 버그없이 올바르게 작동하는 방법을 알아 냈습니다.
개요:
운영:
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
.
보너스 : 가끔 리디렉션을 일시적으로 해제 해야하는 경우 커널 매개 변수 목록에서이 인수를 제거하십시오. GRUB 메뉴를 표시하기 위해 시스템을 부팅 할 때 Shift 키를 눌러이를 수행 할 수 있습니다. 그런 다음 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 . 첫 번째 읽기 전용 파일 시스템을 마운트하고 unionfs를 통해 두 번째 읽기 / 쓰기 RAM 파일 시스템으로 마운트했습니다.
우분투에서는 unionfs-fuse 패키지를 찾을 수 있습니다.이 패키지는 커널 모듈이 아닌 사용자 공간에 동일한 기능을 구현 한 또 다른 구현입니다.
aufs와 같은 공용체없이 장치 수준에서이 작업을 수행 할 수도 있습니다. device-mapper를 참조하십시오 snapshot-origin
.
fstab
마운트 포인트가/
? 와 같이 이것을 할 수 있습니까? (즉, 시스템은 무시할 수있는 이미지로 부팅됩니다.)