为 GRUB PXE 设置 nfsroot

为 GRUB PXE 设置 nfsroot

嘿朋友们。前段时间我有一个类似的问题,但现在我更接近解决方案。我在 tftp/pxe 服务器上设置了一个简单的 grub 菜单。我希望客户端能够以 efi 和传统模式启动 iso 文件!所以我决定使用 GRUB 而不是 SYSLINUX。但现在我遇到了问题。我必须安装一个 nfs 共享才能加载 initrd,对吗?我花了几个小时的时间,但不幸的是只有少数人尝试执行此操作。此外,我在运行 memtest 等 linux16 映像时没有遇到任何问题。它们工作正常,没有任何问题。

这就是我当前的 grub.cfg 菜单项,用于从 pxegrub 启动我的clonezilla live iso 文件。

menuentry "Netroot" {
   echo 'Trying to boot via nfs ...'
   load_video
   insmod gzio
   if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
   insmod part_msdos
   insmod ext2
   echo 'Loading Linux ...'
   linux /programs/clonezilla/live/vmlinuz root=/dev/nfs netboot=nfs nfsroot=192.168.2.55:/var/lib/tftpboot/programs/clonezilla/live/ rw  quiet
   echo 'Loading initial ramdisk ...'
   initrd initrd.img
}

还有我的导出文件

/etc/出口

/var/lib/tftpboot/programs/clonezilla/live 192.168.2.55/(rw,no_root_squash,sync,no_subtree_check)

不幸的是它无法设置正确的根目录,所以我还无法加载 initrd。这里有什么问题吗?有人可以帮我让它通过 grub 运行吗?我找到了一些 SYSLINUX 的示例,但是是否可以让它们在 grub 中运行?

DEFAULT ubuntu
LABEL ubuntu
KERNEL /vmlinux-4.8.17-040817-generic
APPEND ip=dhcp rw root=/dev/nfs nfsroot=192.168.1.254:/diskless/ubuntu/0185 raid=noautodetect quiet splash amdgpu.vm_fragment_size=9
INITRD /initrd.img-4.8.17-040817-generic

与 syslinux 相比,我更喜欢 grub,而且它更先进一些。

我希望有一个人可以帮助我。也许是我的 nfs 共享有问题?我以前从未使用过它们。

答案1

不,GRUB 根本不支持 NFS。

即使该linux行包含 NFS 挂载参数,GRUB 也不会对其进行操作;它只是在内核实际启动时将参数传递给 Linux 内核。一旦内核启动并执行 initramfs,它将使用这些参数来设置 NFS 挂载的根文件系统。

GRUBinitrd.img使用与加载内核文件完全相同的机制来加载该文件。在您的“简单 tftp/pxe”解决方案中,该机制很可能是 TFTP。 (最新版本的 UEFI 也可能支持 HTTP,但我不确定 GRUB 是否可以使用 UEFI 的 HTTP 功能。)

一旦 GRUB 将内核、initramfs 和引导选项字符串加载到 PXE 客户端的 RAM 中,它将系统的控制权转移到内核:GRUB 将不会参与此后的任何操作。

为了处理传统 PXE 启动和 UEFI PXE 启动,您的 DHCP 服务器必须读取 PXE 架构选项,使用它来识别 PXE 客户端是传统还是 UEFI,然后将适当的启动文件路径传递给传统 PXE 启动加载程序(例如使用 ) 创建的 GRUB PXE 映像grub-mkimage --format=i386-pc-pxe或 UEFI 引导加载程序(例如,grub.efi使用 )创建的映像grub-mkimage --format=x86_64-efi

要通过 PXE 引导 Clonezilla Live,您不需要 nfsroot 选项。相反,你的linux行可能是这样的:

linux /programs/clonezilla/live/vmlinuz boot=live username=user union=overlay config components quiet noswap edd=on nomodeset nodmraid locales=en_US.UTF-8 keyboard-layouts=us ocs_live_run="ocs-live-general" ocs_live_extra_param="" ocs_live_batch=no net.ifnames=0 nosplash noprompt fetch=http://URI_path_on_your_server_containing/filesystem.squashfs

显然,用指向 HTTP 服务器的实际 URL 替换该http://URI_path_on_your_server_containing/filesystem.squashfs部分,Clonezilla initramfs 可以从该服务器下载 Clonezillafilesystem.squashfs文件。如果您更喜欢非美国键盘,也可以更改该keyboard-layouts=us部分。该选项字符串最初是按照以下说明编写的:

以及 Clonezilla 引导选项参考:

我将其与传统 PXE 引导上的 SYSLINUX 和 UEFI 上的 iPXE.org 引导加载程序一起使用,当我使用 clonezilla-live-20191024-eoan-amd64.zip 对其进行测试时,它起作用了。

相关内容