Diskless Booting

来自osdev
Zhang3讨论 | 贡献2022年3月5日 (六) 03:50的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

“Diskless Booting无盘引导” 是通过网络引导的同义词。 操作系统的内核及其模块是从网络计算机下载的。 这对于Bochs模拟器太慢或必须使用软盘的大型项目非常有用,并且在某些公司环境中用于启用集中式操作系统更新。

为了通过网络启动内核,你需要一个DHCP服务器,一个TFTP服务器以及在另一台计算机上充当客户端的程序。

GRUB Legacy方式

首先,你必须创建一个配置为支持网络的 GRUB Legacy 软盘。 你可以下载 GRUB Legacy 的当前源代码版本,并 ./configure 支持你的网卡。

尽管这是最简单的方法,但GRUB Legacy似乎并不支持所有的网卡。

PXELINUX方式

编译syslinux; 将创建一个 pxelinux.0 文件。 它是一个简单的通过tftp引导加载程序的PXE二进制文件,可以由客户端计算机 (而不是带有TFTP服务器的计算机) 引导。 相应地设置DHCP和TFTP以便文件启动后,你可以使用pxelinux加载syslinux附带的 “memdisk”。

此文件使用memdisk initrd=grub.ima语法加载,这将导致pxelinux通过TFTP加载memdisk和grub.ima。 Memdisk将拦截中断0x13,并以这种方式引导磁盘映像。 (但是,似乎并非所有 GRUB Legacy 磁盘映像希望都通过bios访问软盘。 如果你有这样的映像,你在这里就被卡住了。)

你应该获得一个 pxelinux.0 文件,该文件可以通过例如etherboot的方式加载。 许多现代计算机允许从NIC启动,因此你只需要启动TFTP和DHCP服务器。

此时,你可以对grub.ima磁盘映像进行更改,并在此处放置 GRUB Legacy 配置文件和内核的二进制文件。

例如,在linux下尝试 mount /tftpboot/grub.ima /mnt/fpy -o loop

gPXE + GRUB方式

GRUB 从版本2可以在 gPXE 的网络上piggy-back,不像GRUB Legacy不支持更新的网卡。 gPXE项目是当前维护的一个开源免费网络引导加载程序。 从他们的网站上获取gPXE ISO,磁盘或USB磁盘映像很容易,但是你需要做一些额外工作才能使GRUB成功加载。

gPXE支持多引导,但是如果它检测到多引导映像,则它将不提供PXE服务。 不幸的是,它将你生成的GRUB映像检测为multiboot,而我发现解决此问题的唯一方法是在没有multiboot支持的情况下重新编译gPXE。 重新编译gPXE很容易: 解压缩,cd src; make。 在此之前,你将需要编辑 src/config/defaults/pcbios.h 并注释掉预定义 IMAGE_MULTIBOOT 的代码行。 编译后,你应该得到 bin/gpxe.{dsk,iso,usb},你可以将其写入磁盘或CD。

要创建GRUB PXE可引导映像,可以按照 GRUB手册的网络章节 中的建议进行操作。 grub-mkimage 的几个选项在过去的版本中不存在,如果不支持,则需要升级。 如果从源代码编译,则可以在源目录中获取所需的所有 *.{lst,mod,img} 文件。 如果你编译自己的GRUB,则不需要安装它,只需执行以下命令:

./grub-mkimage -d . --format=i386-pc --output=core.img --prefix="(pxe)/boot/grub" pxe pxecmd
cat pxeboot.img core.img > grub2pxe

你需要做的最后一件事是设置一个DHCP/BOOTP/TFTP服务器。 我使用了 dnsmasq,它预先安装在我的工作站上,并且似乎在发行版中广泛可用。 可以轻松地在命令行或 /etc/dnsmasq.conf 中进行配置,该命令行使用与长格式命令行选项相同的语法,但没有前导破折号。 你将需要以下选项:

interface=...                # 注意dhcp服务器运行在什么接口上!
bind-interfaces              # *真的* 只绑定该接口
dhcp-range=a.b.c.d,e.f.g.h   # 无论你的专用网络使用什么
dhcp-boot=boot/grub/grub2pxe # 告诉机器启动grub
dhcp-no-override             # gpxe需要的某种工作环境
enable-tftp
tftp-root=/tftp              # 或任何方式

还有其他选择可以探索。 现在,请确保从GRUB源中获取 grub2pxe,*.lst,*.mod,并将它们放入 /tftp/boot/grub 或等效项中。 也把你的 grub.cfg 文件放在那里。 格式相当简单。 这是我使用的关键代码:

set timeout=0
set default=0
menuentry "MY OS" {
  set root=(pxe)
  multiboot /kernel
  module    /shell
  module    /test
}

确保你的内核和模块出现在tftp根目录中,并且你应该设置为通过工作站之间连接的专用网络连接使用gPXE介质引导。

自制直接方式

正文: PXE

上面的两个选项都涉及使用别人的代码来完成繁琐的工作,在某些情况下可能是不希望这么做 - 许可证冲突,技术问题 (例如,对于 “memdisk”,中断0x13钩子拦截在受保护模式下无法工作) 以及可能出于个人自豪感。 幸运的是,编写自己的PXE引导代码并不像听起来那么困难。

乍一看,PXE规范看起来相当令人生畏,但是其中大部分与BIOS和网卡有关,可以放心地忽略。 重要的部分是在第3章,PXE API。

PXE API能够在本机和其他几台电脑之间进行原始UDP连接,在这里首先,你可能只想使用TFTP来读取文件。

另见

外部链接