Linux

以只讀方式掛載文件系統,並將寫入重定向到 RAM?

  • May 27, 2018

是否可以將環回文件安裝為只讀,並將所有寫入重定向到 RAM?

更新:

在 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
  1. 將此保存到/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
  1. /etc/default/grub中,找到以 開頭的行GRUB_CMDLINE_LINUX_DEFAULT,並在後面的引號內添加參數aufs=tmpfs

**獎勵:**如果您偶爾需要暫時關閉重定向,只需從核心參數列表中刪除此參數即可。您可以通過在系統啟動時按住 Shift 鍵來執行此操作,以顯示 GRUB 菜單;然後按eaufs=...編輯參數,然後從列表中刪除參數。 4. 將這些行附加到/etc/sysctl.conf. (警告:潛在的安全風險。)

kernel.yama.protected_nonaccess_hardlinks = 0
kernel.yama.protected_sticky_symlinks = 0
  1. 執行這些行:
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條目列出了一些。

引用自:https://unix.stackexchange.com/questions/27449