将root挂载为overlayfs

将root挂载为overlayfs

我一直在尝试将根(/)挂载为overlayfs。

操作系统正在通过 NFS 启动到 RAM。我在 initrd 中添加了一个预安装脚本,它创建了“work”、“upper”和“lower”目录。

在引导过程中,我将 NFS 的内容复制到“较低”目录。之后 Overlayfs 将被挂载到 ${rootmnt} 中。

最后,init 脚本 chroots 到 ${rootmnt} (接下来,从真正的 root 初始化等等......)并且操作系统工作正常。

当然,我看不到“工作”和“上层”目录。我怎样才能做到这一点?我必须在 initrd 中更改什么?

答案1

将root安装为overlayfs的挑战已经解决。

简而言之,“lower”、“work”和“upper”目录应移动到“merge”目录。但是,您应该考虑:

1) 如果“较低”目录作为磁盘映像存在,则无需执行任何操作。只需安装即可。如果没有,则创建临时文件系统挂载点并将所有需要的文件通过 NFS 复制到其中。

2) 'upper' 和 'lower' 目录必须位于同一个文件系统中。创建另一个临时文件系统挂载点,因此在其上放置“上”和“下”目录就足够了。

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 

最后,在.txt文件中添加预挂载脚本/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

相关内容