Linux 无盘启动 - NFS 共享在 ramdisk 启动期间未安装

Linux 无盘启动 - NFS 共享在 ramdisk 启动期间未安装

(这是我的第一篇文章,所以希望我的格式正确)。我添加了尽可能多的信息,但不是太长。

我的基本问题是,当我尝试对 NFS 服务器(CentOS 6.7 或 CentOS 7)进行 PXE 无盘启动时,我遇到了障碍。我尝试了各种方法,但似乎无法复制我最初在 CentOS7 服务器和客户端上取得的成功。现在,每次我按照笔记操作,都无济于事。

我遇到的最常见错误(取决于我使用的 initrd.img 文件或 initramfs*.img)是

A ticker of *** that shows a text-based progress bar and the message

A start job is running for dev-nfs.device (xx s / 1min 30s)

然后它超时并说

Timed out waiting for device dev-nfs.device
Dependency failed for File System Check on /dev/nfs
Dependency failed for /sysroot
Dependency failed for Initrd Root File System
Dependency failed for Reload Configuration from the Real Root

当我将 initramfs-3.10.*.img(任何一个)从 /boot/ 复制到 PXE 映像位置时,会发生上述错误。

如果我尝试从 dracut 生成新的 initramfs 映像文件,它也会引发上述错误。

dracut initramfsnew.img

可能是我不知道如何生成正确的 initramfs,或者我真的不了解 initrd.img 和 initramfs 功能。我认为发生超时是因为在启动过程的该阶段尚未加载 NFS 驱动程序,因此客户端无法正确挂载 NFS 共享。我之所以这么想,是因为我已经将完全相同的 PXE 客户端启动到其本地操作系统并手动挂载了 NFS 共享,并且它 100% 正常工作,因此 NFS 共享处于活动状态并且可以正常工作。我认为我对 initrd.img 和 initramfs*.img 的工作原理的理解是错误的。

如果我从 CentOS 镜像站点下载 initrd.img,我完成了 90%,然后错误变为

No /sbin/init trying fallback

我现在处于一个(用一个更好的术语来说,是半加载的)shell 中,它为我提供了 NFS 共享的基本导航。我可以转到 /home/disklessuser/,甚至可以写入 NFS 或从 NFS 读取新文件(在服务器和客户端上测试了简单的“touch”命令)。似乎主要缺少的是此实例中的登录选项,以及目录的正确边界(即,在启动的此时,我似乎以 root 身份登录)。

据我所知,基本配置非常标准:

/var/lib/tftpboot/pxelinux.cfg/default 包含(我省略了我知道可以工作的部分 - PXE 可以工作并指向正确的图像等):

menu label ^1) CentOS 7
  kernel /images/centos7/vmlinuz
  append root=/dev/nfs initrd=/images/centos7/initrd.img nfsroot=10.10.10.10:/srv/nfs/diskless/images/centos7/root rw selinux=0

我尝试了上述方法,例如用 initramfs3.10*.img(位于服务器的 /boot/ 中的各种版本)替换 initrd.img,并尝试添加类似以下参数

ip=dhcp

因为 dracut 文档表明这将告诉它从 DHCP 而不是 PXE 菜单获取 nfsroot 路径。

我目前的 DHCP 配置如下:

subnet 10.10.10.0 netmask 255.255.255.0 {
   option broadcast-address 10.10.10.255;
   option routers 10.10.10.1;
   range 10.10.10.100 10.10.10.150;

   next-server 10.10.10.10;
   option root-path "10.10.10.10:/var/lib/tftpboot";
   filename "pxelinux.0";
}

这可能与 PXE 菜单中规定的 NFS 共享冲突吗?

无论如何,我非常感激任何指导 - 也许对我来说最相关的是如何处理 initrd 或 initramfs。我假设两者没有太大区别,但如何生成一个新的,应该(希望)包含允许 NFS 挂载的基本网络驱动程序?

其次,当我使用存储在 /os/x86_64/isolinux 下的 CentOS 镜像目录中的 initrd.img 几乎找到解决方案时,为什么 /sbin/init 不见了?

答案1

你可以使用 HTML 而不是 NFS 来启动 CentOS-7.0-1406-x86_64-DVD.iso

kernel   = /NWA_PXE/$HEAD_DIR$/images/pxeboot/vmlinuz 
append   = initrd=/NWA_PXE/$HEAD_DIR$/images/pxeboot/initrd.img root=live:http://$IP_BSRV$/$HEAD_DIR$/LiveOS/squashfs.img ksdevice=bootif repo=http://$IP_BSRV$/$HEAD_DIR$/ 
ipappend = 2

来源塞瓦

如果确实需要,您可以轻松地将其更改为 NFS

答案2

根据您的信息,很难说出超时的具体原因。以下是一些建议:

  • 在禁用 selinux 的情况下启动系统,使用 rd.brak 进入 initrd 预启动。
  • 检查超时的原因。验证网络驱动程序是否已加载,以及 dhcp 分配是否有效。查看手动 nfs 挂载是否会成功。尝试手动启动 dev-nfs.device。
  • 根据各种文档验证你的步骤,例如http://www.iram.fr/~blanchet/tutorials/diskless-centos-7.pdf
  • 尝试全面了解启动过程和 initramfs 文件的创建。

关于实例启动的一些话:

  • vmlinux/vmlinuz 仅包含带有驱动程序的内核映像
  • initramfs 包含一个基本根文件系统,已完全加载到 RAM 中
  • 通常(在桌面和服务器系统上)initramfs 的职责是准备内核(例如,加载相关的内核驱动程序)、挂载根文件系统(rhel 7 中,通常在 rd.break 之后真正的根文件系统位于 /sysroot 中),然后将引导移交给真正的根文件系统。
  • 在这种情况下,我假设在准备内核时出现了问题,看起来好像某些东西丢失了或者在 initramfs 中找不到。最终是 nfs 驱动程序模块。

相关内容