Linux

將 root 掛載為 overlayfs

  • February 3, 2018

我一直在嘗試將 root (/) 掛載為 overlayfs。

作業系統正在通過 NFS 引導到 RAM。我在 initrd 中添加了一個 premount 腳本,它創建了“work”、“upper”和“lower”目錄。

在引導過程中,我將 NFS 的內容複製到“較低”目錄。之後 Overlayfs 被掛載到 ${rootmnt} 中。

最後,初始化腳本 chroots 到 ${rootmnt} (接下來,從真正的根目錄初始化等……)並且作業系統工作正常。

自然,我看不到“工作”和“上層”目錄。我怎樣才能做到這一點?我必須在 initrd 中更改什麼?

將 root 安裝為 overlayfs 的挑戰已經解決。

簡而言之,“lower”、“work”和“upper”目錄應該移動到“merge”目錄。但是,您應該考慮:

  1. 如果“下”目錄作為磁碟映像存在,則無需執行任何操作。裝上就行了。如果沒有,請在其上創建tmpfs掛載點並通過 NFS 將所有需要的文件複製到其中。

  2. ‘upper’ 和 ’lower’ 目錄必須位於一個文件系統中。創建另一個tmpfs掛載點並在其上放置“上”和“下”目錄就足夠了。

  3. 確保您initrd.img有 NFS 和 Overlayfs 的模組。如果它們不存在,則將它們添加到 /etc/initramfs-tools/modules 中。

  4. 確保您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

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