据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 $PXEHOSTmount –t squashfs /overlay/$SQUASHIMAGE /overlay/lower:
:debian的initrd环境中使用/root作为根挂载的准备目录,后续/dev,/proc,/sys等系统配置已有相应脚本,所以仅在overlay脚本中映射挂载/root即可:
海外CN2线在IP层,实现了平均500ms以内的快速路由收敛;在MPLS层,核心节点间50条链路与FRR一起部署,实现50ms的保护倒换。
:
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可以解析所有内容