Linux
將 root 掛載為 overlayfs
我一直在嘗試將 root (/) 掛載為 overlayfs。
作業系統正在通過 NFS 引導到 RAM。我在 initrd 中添加了一個 premount 腳本,它創建了“work”、“upper”和“lower”目錄。
在引導過程中,我將 NFS 的內容複製到“較低”目錄。之後 Overlayfs 被掛載到 ${rootmnt} 中。
最後,初始化腳本 chroots 到 ${rootmnt} (接下來,從真正的根目錄初始化等……)並且作業系統工作正常。
自然,我看不到“工作”和“上層”目錄。我怎樣才能做到這一點?我必須在 initrd 中更改什麼?
將 root 安裝為 overlayfs 的挑戰已經解決。
簡而言之,“lower”、“work”和“upper”目錄應該移動到“merge”目錄。但是,您應該考慮:
如果“下”目錄作為磁碟映像存在,則無需執行任何操作。裝上就行了。如果沒有,請在其上創建tmpfs掛載點並通過 NFS 將所有需要的文件複製到其中。
‘upper’ 和 ’lower’ 目錄必須位於一個文件系統中。創建另一個tmpfs掛載點並在其上放置“上”和“下”目錄就足夠了。
確保您
initrd.img
有 NFS 和 Overlayfs 的模組。如果它們不存在,則將它們添加到 /etc/initramfs-tools/modules 中。確保您
initrd.img
擁有完整版本的“mount”命令。它不存在,然後將其添加到/etc/initramfs-tools/hooks
.例如(省略了一些細節):
/etc/initramfs-tools/hooks/mount_full: #!/bin/sh PREREQ="/bin/mount" prereqs() { echo "$PREREQ" } case $1 in prereqs) prereqs exit 0 ;; esac . /usr/share/initramfs-tools/hook-functions # Begin real processing below this line copy_exec /bin/mount /bin/mount_full exit 0
最後,在
/etc/initramfs-tools/scripts/init-premount/
. 例如:/etc/initramfs-tools/scripts/init-premount/ramboot: #!/bin/sh PREREQ="" prereqs() { echo "$PREREQ" } case $1 in prereqs) prereqs exit 0 ;; esac . /scripts/functions # Begin real processing below this line # Preparing work dirs mkdir /overlaytmp mkdir /overlaytmp/lower mkdir /overlaytmp/upper_and_work mkdir /overlaytmp/merge mkdir /ramboottmp # Preparing RAM disks and thus layers mount -t tmpfs -o size=100% none /overlaytmp/lower mount -t tmpfs -o size=100% none /overlaytmp/upper_and_work mkdir /overlaytmp/upper_and_work/upper mkdir /overlaytmp/upper_and_work/work ... mount nfs_share /ramboottmp ... # Copy root content over NFS to RAM echo "Copying / to RAM ..." cp -rfa /ramboottmp/* /overlaytmp/lower # Preparing layers mount points mkdir /overlaytmp/lower/mnt/lower mkdir /overlaytmp/lower/mnt/upper_and_work # Lower layer will be read-only mount -o remount,ro /overlaytmp/lower # Mounting overlayfs mount -t overlay -olowerdir=/overlaytmp/lower,upperdir=/overlaytmp/upper_and_work/upper,workdir=/overlaytmp/upper_and_work/work none /overlaytmp/merge # Moving layers to merge layer mount --move /overlaytmp/lower /overlaytmp/merge/mnt/lower mount --move /overlaytmp/upper_and_work /overlaytmp/merge/mnt/upper_and_work # Moving merge layer to finally root mount --move /overlaytmp/merge ${rootmnt} umount /ramboottmp