据wikipedia描述overlayfs在2014年融入linux内核,其轻量和易用特性已在openwrt中应用,但在debian发行版本中还没有直接使用overlayfs挂载根目录的启动选项。增加启动选项需对启动initrd进行相应改造,debian的initrt脚本已经预留了应用接口,使得应用overlayfs和无盘(或简盘)工作变得相对简单。
构建无盘工作站使用
TFTP+PXE启动服务器 <=== QEMU客户端
进行改造和测试
因需要在已安装系统中改造initrd,首先分析mkinitramfs脚本,可以得到启动脚本模板init使用的是/usr/share/initramfs-tools/init,进而分析该init脚本。
init脚本中挂载根目录片段
: : log_begin_msg "Mounting root file system" # Always load local and nfs (since these might be needed for /etc or # /usr, irrespective of the boot script used to mount the rootfs). . /scripts/local . /scripts/nfs . /scripts/${BOOT} parse_numeric ${ROOT} maybe_break mountroot mount_top mount_premount mountroot log_end_msg : : |
由此,在启动服务器上构建TFTP和PXE启动环境,配置PXE脚本启动部分可以使用BOOT参数传递应用overlay
在scripts子目录下需要增加overlay脚本文件,其中定义mountroot函数。
无盘工作使用tmpfs内存文件作为根目录。
: : #Use general mapping functions . /scripts/functions #Load related kernel modules modprobe overlay modprobe squashfs modprobe tmpfs #Setup overlay base directory mkdir –p /overlay mount –t tmpfs tmpfs /overlay –o size=4G : : |
overlay需要底层根目录作为只读的基础结构,在openwrt中使用flash区块,而在无盘环境内可以考虑多种选择,直接使用initrt的根目录,nfs挂载,本地squash镜像,远程squash镜像。
为保证无盘环境,而因initrd镜像的系统功能是不完整的,因debian的initrt环境下已有tftp客户端,在这里使用远程squash镜像方式。
(在单网卡环境下,nfs根挂载和overlayfs存在耦合性问题,并造成操作系统网络连接和应用系统存在配置干扰,造成系统网络不完整或不稳定,如需nfs根挂载,需使用至少双网卡方式,减少基础系统连接和应用网络的依赖和影响。因此种方式增加配置复杂程度且与overlay主题无关,不选择使用)
可以将squash镜像放置在pxe的tftp服务器上,debian(stretch)的最简安装系统后大约使用1.5G硬盘,squash镜像可以压缩到200M,在100M网络环境下传输30s左右。
补充后续脚本
: : #Setup overlay mapping directories mkdir -p /overlay/lower mkdir -p /overlay/upper mkdir -p /overlay/work : : #Recieve squash image and mount tftp –g –l /overlay/$SQUASHIMAGE –r $REMOTESQUASHIMAGE $PXEHOST mount –t squashfs /overlay/$SQUASHIMAGE /overlay/lower : : |
debian的initrd环境中使用/root作为根挂载的准备目录,后续/dev,/proc,/sys等系统配置已有相应脚本,所以仅在overlay脚本中映射挂载/root即可
: : mount –t overlay overlay /root –o lowerdir=/overlay/lower,upperdir=/overlay/upper,workdir=/overlay/work : : |
问题记录:
- 制作squash镜像的时候需要将原来系统的/etc/fstab的根目录和swap条目删除,stretch版本系统使用systemd,虽不影响使用,缺失映射盘会有很长超时等待
- 制作initrd镜像时,如需对镜像内容确认,可以恢复至本地文件夹,但最近版initrd使用了合成模式(不太明白原因),导致如果单纯做cpio的输出仅包含kernel/x86/microcode下面的内容,使用合成命令(cpio -id ; zcat | cpio -id) < ../$OUTFILE可以解析所有内容
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。