Boot Linux Through PXE

测试 porteus 的时候,每次都是做好 iso 之后写到一个 u 盘,然后用 u 盘启动看看效果,发现有点蛋疼,这浪费时间不说,我的 u 盘寿命估计也得少一截。就研究了一下 pxe 启动,这样每次改完之后通过 pxe 直接读取我改了之后的 iso 引导 linux 就好了。

我这看 pxe 启动主要需要做两个事情,一个是 dhcp 的时候广播 tftp 的信息,一个是通过 nfs 共享给那个系统需要读取的文件。nfs 共享也可以改用 http 等其他服务。

dnsmasq

广播 tftp 的信息,可以通过 dnsmasq 来做。dhcp 部分就不贴了,只贴 tftp 相关的。

tftp-root=/srv/pxe/boot
dhcp-boot=/pxelinux.0
enable-tftp

网卡启动的时候会获取 /pxelinux.0 然后获取 /pxelinux.cfg/default (这个实际上有一个判断顺序,方便给不同的机器不同的配置)。然后根据这里面的配置,获取内核信息。然后加载内核。

nfs

加载内核之后还需要系统文件,这个时候貌似有几个选择,比如通过 http 发送。我这用的是 nfs。想要通过 nfs 发送,内核得能支持 nfs mount。各 linux 的做法貌似不太一样。

配置 nfs 的目录,在 /etc/exports 里面加入类似这样的信息。

/srv/pxe/porteus *(ro,fsid=0,no_subtree_check)
/srv/pxe/storage *(rw,fsid=1,no_root_squash,no_subtree_check)

然后 exportfs -rv ,这样 nfs 设置好了。

我这 export 的目录和上面 tftp-root 的目录不一样,有的发行版可能会按照 tftp-root 的设置来读取,这个还得区分发行版看。

其他

上面的例子只是写了一个大高,是实际使用相差很大。比如如何得到 pxelinux.0 ,如何让内核支持 nfs,以及在内核启动的时候加载 nfs 并使用 nfs 的数据启动,这些都和发行版有关系,还需要单看。

参考