Linux
以只讀方式掛載文件系統,並將寫入重定向到 RAM?
是否可以將環回文件安裝為只讀,並將所有寫入重定向到 RAM?
更新:
在 Ubuntu 上似乎還有另外兩種更簡單的方法(至少是更高版本):
sudo apt-get install overlayroot
然後設置overlayroot="tmpfs:swap=1,recurse=0"
在/etc/overlayroot.local.conf
.sudo apt-get install fsprotect``fsprotect
然後作為核心參數傳遞我終於想出瞭如何使用根文件系統(在 Ubuntu 11.04 中)來做到這一點!
使系統可啟動的步驟很簡單。我將本指南與本指南和大量網路搜尋結合使用,以找出如何使其正常工作而沒有錯誤。
概括:
- 跑步:
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=...
編輯參數,然後從列表中刪除參數。 4. 將這些行附加到/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
使其可寫,然後您可以對該目錄進行所需的任何修改。
可以使用像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條目列出了一些。