如何在进行 iPXE 启动时将 SquashFS 文件设为根文件系统?

如何在进行 iPXE 启动时将 SquashFS 文件设为根文件系统?

我有一个可以完美用作 iPXE 启动服务器的系统。现在我尝试让它使用 SquashFS 文件作为根文件系统,而不是 NFS 文件系统。

当前系统使用 iPXE 配置如下(显示相关行),并且运行良好:

:retry
kernel http://${next-server}/installdcos/ubuntu_os/vmlinuz root=/dev/nfs nfsroot=${next-server}:/installdcos/ubuntu_os/nfsroot ro ip=dhcp BOOTIF=%(mac)s console=ttyS0,38400n8 console=ttyS1,9600n8 console=tty0  || goto retry
initrd http://${next-server}/installdcos/ubuntu_os/initrd.gz || goto retry
boot || goto retry

现在,我希望使用单个 SquashFS 作为根文件系统,而不是使用启动系统/installdcos/ubuntu_os/nfsroot作为根文件系统(我的意思是系统应该挂载它然后使用它作为根文件系统)。

为此,我首先使用 创建了一个保存目录ubuntu_os.squashfs内容的文件。然后我将该文件放在目录中。nfsrootmksquashfsubuntu_os.squashfs/installdcos/ubuntu_os/nfsroot

现在,在我的 iPXE 配置中,我想说:请ubuntu_os.squashfs通过网络获取,将其安装为 SquashFS 文件系统,并将其用作您的根文件系统(这样您就不必再次通过 NFS 来调用驻留在根文件系统中的命令)。

但当我尝试进行以下更改时核心配置中的行:

kernel http://${next-server}/installdcos/ubuntu_os/vmlinuz root=/dev/nfs nfsroot=${next-server}:/installdcos/ubuntu_os/nfsroot/ubuntu_os.squashfs ro rootfstype=squashfs ip=dhcp BOOTIF=%(mac)s console=ttyS0,38400n8 console=ttyS1,9600n8 console=tty0  || goto retry

从机器执行 iPXE 启动时,它会启动 iPXE 启动过程,在打印几行之后,它会卡在以下错误:

  Begin: Retrying nfs mount ... Begin: Running /scripts/nfs-premount ... done.
  mount: Not a directory
  done
  Begin: Retrying nfs mount ... Begin: Running /scripts/nfs-premount ... done.
  mount: Not a directory
  done
  Begin: Retrying nfs mount ... Begin: Running /scripts/nfs-premount ... done.
  mount: Not a directory
  done

错误信息很有道理,确实/installdcos/ubuntu_os/nfsroot/ubuntu_os.squashfs不是一个目录。

那么我应该为该内核配置行编写什么样的参数和值组合?

我检查过以下文件http://www.tldp.org/HOWTO/BootPrompt-HOWTO-3.htmlhttps://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt,但无法弄清楚我应该向内核传递什么魔法咒语(并且我发现的其余 SquashFS 启动教程都认为启动操作是从磁盘进行的,而不是 PXE,或者通过 LiveCD 进行,这与我的情况不完全一样)。

答案1

要了解发生了什么,您需要知道 Linux PXE 如何启动。

  1. 内核vmlinuz 已转移
  2. initrdinitrd.gz已传输
  3. 内核挂载 initrd 并启动其init脚本

initrd 是一个超小型的 Linux 系统,包含用于连接(NFS)或检索(HTTP/CIFS)“真实”操作系统(在您的情况下包含在内ubuntu_os.squashfs)、安装它以及最终“chrooting”到其中的最小功能。

PXE 就绪init脚本负责解析内核变量、启动网络服务、处理 NFS、HTTP、CIFS 等。在大多数情况下,特定的脚本initrd.gz无法处理上面提到的所有协议,那么您需要“定制”您的脚本initrd.gz或创建一个“补充”的 initrd,在需要时提供缺少的功能。

在你的情况下,你的init脚本仍然认为它必须挂载 NFS 目录而不是文件;那么如果你想使用 NFS,你应该挂载你所在的目录ubuntu_os.squashfs,然后挂载ubuntu_os.squashfs文件。这当然意味着修补init(和/或其相关组件)

如果你不介意ubuntu_os.squashfs在 CIFS 共享上提供,你可以看看塞瓦用于 PXE 启动 Ubuntu live 发行版;您将在那里看到 CIFS 启动的所有参数(我与 Serva 开发有关)

即 Ubuntu LTS 14.04 桌面直播

[PXESERVA_MENU_ENTRY]
asset    = Ubuntu LTS 14.04 Desktop Live
platform = amd64
kernel   = /NWA_PXE/$HEAD_DIR$/casper/vmlinuz
append   = showmounts toram root=/dev/cifs initrd=/NWA_PXE/$HEAD_DIR$/casper/initrd.lz,/NWA_PXE/$HEAD_DIR$/casper/INITRD_N11.GZ boot=casper netboot=cifs nfsroot=//$IP_BSRV$/NWA_PXE_SHARE/$HEAD_DIR$ NFSOPTS=-ouser=serva,pass=avres,ro ip=dhcp ro

答案2

如果 init 脚本能够在没有额外挂载的情况下搜索 squashfs,那么应该可以将 squashfs 包含在/作为 initrd。

在 pcbios 模式下,可以通过将其添加为额外的 initrd 行来实现。困难的是要知道将其放在哪里,以便 init 脚本能够找到它。 iPXE 文档显示.ko 模块作为示例。

在 EFI 模式下,它变得有点复杂,但最近的 iPXE 也支持将任何文件包装在 cpio 头中,但这有点不同。

相关内容