![PXE 启动 Centos 8 失败,并显示“失败的 initrd-switch-root.service”](https://linux22.com/image/755665/PXE%20%E5%90%AF%E5%8A%A8%20Centos%208%20%E5%A4%B1%E8%B4%A5%EF%BC%8C%E5%B9%B6%E6%98%BE%E7%A4%BA%E2%80%9C%E5%A4%B1%E8%B4%A5%E7%9A%84%20initrd-switch-root.service%E2%80%9D.png)
我正在尝试以 pxe 方式启动 centos 8 作为无盘系统,但在加载内核和 initrd.img 后,当系统尝试将控制权移交给根文件结构时,启动失败。我收到以下错误
Starting Switch Root...
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
现在我已经看到了关于此问题的其他帖子,但除了一篇之外,其他都是关于如何在单台机器上修复它而不是 pxe 启动,除了一篇我无法评论或添加的帖子,因为声誉点或缺乏声誉点。然而,我不认为那个帖子足够好,如果有人能指出那里可能存在的错误,我会在底部列出我的配置,但主要是,
我认为 /sysroot 路径无效,因为它可能正在寻找克隆的原始系统上的路径,因此我该如何编辑或更改 initrd.img 文件正在寻找的路径?
或者这只是一个 pxe 服务器问题,其中客户端无法通过 nfs 访问 pxelinux.cfg/default 文件中列出的目录。不过,它在 etc/export 列表中,并且防火墙允许 tftp 和 nfs 通过。
pxelinux.cfg/默认
default menu.c32
prompt 0
timeout 10
ONTIMEOUT local
menu title ########PXE BOOT MENU #############
lable 1
menu label ^1) Install cnetos 8
kernel root/boot/vmlinuz-4.18.0-193.e18.x86_64
append initrd=root/boot/initramfs-4.18.0-193.e18.x86_64.img root=nfs:192.10.100.10:/var/lib/tftpboot/root/ ip=dhcp ro net.ifnames=0 biosdevname=0
我还使用 rsync 来刷新一个可以正常工作的系统的 USB,然后将内容移动到 pxe 服务器上的 tftpboot 目录。该系统仍然启动并运行,所以我相信根目录中的内容没有问题,我只是无法让 pxe 客户端看到和挂载它。如能得到帮助我将非常感激。
答案1
建立 NFS 根文件系统的正常方式是:
root=/dev/nfs nfsroot=192.10.100.10:/var/lib/tftpboot/root rw
我不确定您使用的语法是否完全受支持。
此外,它是只读还是读写取决于发行版;所有发行版都需要为只读根 NFS 文件系统进行特殊设置(如果它们支持的话)。您可能应该从读写开始,直到其他一切都准备就绪并运行。
答案2
好吧,对于其他人来说,这是我设置的主要问题,以及从处理 centos 8 和 7 中获得的一些其他见解。交换机根失败是由于没有来自目标的 ip 地址,它在启动 pxe 菜单时从服务器的原始 dhcpd 获得该地址。这是因为我使用的是 initramfs.img 文件而不是 initrd.img 文件,并且使用了我克隆系统中的 vmlinuz 文件而不是 dvd.iso 安装文件上的 pxeboot 目录中的 vmlinuz 和 initrd.img 文件。此 initrd 文件使用 pxe.cfg 默认文件中指定的 dhcp 选项找到并建立了 nic。我也知道这对经验丰富的人来说可能是显而易见的,但我在许多不同的例子中看到了许多不同的附加行。对于新用户来说,这让我们一头雾水,所以下面是我的发现
#append for an install of centos 7 or 8
append initrd=/path/to/initrd/file/initrd.img ip=dhcp inst.repo=nfs:/sharedfilepath/ biosdevname=0 net.ifnames=0 rw
#notes: initrd path is relative to the file you pointed to in the dhcpd.conf file so it #could be tftpboot or a sub directory like centos8/pxelinux.0 in my case etc..
#inst.repo is an installation option if you are trying to boot an already configured system
#like I was then this is wrong you need to simple set the root argument like below
append initrd.img ip=dhcp root=nfs:servername(or ip):/path/to/root/of/image/ rw net.ifnames=0 biosdevname=0
#also if you are going to a headless setup you will need to include the serial console and #baud rate in the append
append initrd.img root=nfs:serverip:/path/to/image ro net.. bios.. console=ttys0,115200