![如何在 Linux 中创建无盘 PXE 映像](https://linux22.com/image/190310/%E5%A6%82%E4%BD%95%E5%9C%A8%20Linux%20%E4%B8%AD%E5%88%9B%E5%BB%BA%E6%97%A0%E7%9B%98%20PXE%20%E6%98%A0%E5%83%8F.png)
标题是介绍:我确实需要一些 Linux 专家来解决这个问题,这不是一个显而易见的问题,或者至少对我来说不是。我很清楚如何做到这一点,并且以前也这样做过,但这次我错过了一些东西。在这种情况下,我的 pxe 映像无法启动,并且无法切换根目录。
我为创建我尝试过的当前图像所做的事情:
在目标硬件上安装并设置 Linux Redhat 版本 7。
创建了一个包含“nfs”和“网络”模块的自定义 initramfs(因此该映像从板载硬盘启动并工作。
使用 rsync cmd 复制根文件系统,然后将我的自定义 initramfs 和匹配的内核放入 pxe 的 tftpboot 服务器中。
清除 fstab 文件并注释掉硬盘驱动器的 uuid 并尝试两者(fstab 为空或 root 挂载在 nfs 上的 fstab)
更改了 initramfs 和 vmlinuz 的权限
设置 nfs 服务器服务并使用 no_root_squash 和 rw 将根文件系统设置为可导出
我遇到的问题:图像将 pxe 过来并运行 vmlinuz,然后运行 initramfs,但一旦到达交换机根服务就会失败。一段时间后,它让我进入 dracut shell,我查看了 dracut 报告 /run/initramfs/rdsosreport.txt,其中一行包含以下内容
Failed to switch root: Specified switch root path '/sysroot' does not seem to be an OS tree. os-release file is missing initrd-switch-root.service: Main Process exited, code=exited, status=1/FAILURE
我查看过,操作系统发布文件就在那里,并且与目标硬件硬盘上的工作映像上的文件相同(每次都会成功启动)。
根文件系统在那里并通过正确的绝对路径指向适当的位置,这是我的 pxelinux.cfg 默认行
root=nfs:192.9.600.5:/correct/path/to/rootfilesystem
另外,当这行过去错误或不正确时,我会收到 dracut 致命错误,dracut 不知道如何处理 root=nfs... 等,或者如果 rootfilesystem 由于错误的路径或权限而不可用,它会吐出权限不足的错误。
我还注意到,我在切换 root 期间失去了与 pxe 服务器的连接,这可能是它失败的原因,因为 root 位于 nfs 上,但它具有 nfs 和网络模块,否则 initramfs 会在 switch-root.service 之前失败?所以我很困惑为什么我在这一点上失去了连接。特别是因为创建 pxe 映像的映像确实具有 nfs 并在启动时启用。
我对此进行了研究,但没有结果,如果有人能指出我做错了什么或帮助我发现问题的根源,我将非常感激。
答案1
它可能是 NFS 版本上的锁定。首先,手册建议使用 root=nfs:server-ip:/exported/root/directory,vers=4.2 作为引导选项。您还可以从工作系统将 /root 挂载到 /mnt 中来检查:
- 如果安装正确
- cat /proc/mounts 检查默认挂载中的 NFS 版本
- lsmod 可以显示实际使用了哪些模块
NFS 相当棘手,因为 NFSv4 有许多衍生品和不兼容性,而 NFSv3 需要 RPC 守护进程来工作,有时这会很混乱。运行一些无盘客户端时,我可以说 initramfs 中的模块的行为与主系统中的模块有很大不同。
您还可以尝试从 dracut 挂载 NFS 并向我们提供结果。 tcpdump 客户端流量也可以帮助查看是否发生了某些情况。
今晚我还将尝试启动现代 EL7,看看是否还有其他一些警告。