为了即将开始的 Linux 入门培训,笔者简单学习了一下 PXE启动服务器的配置,在路由器上面配置之后,大家随时可以网络引导 Ubuntu 之类的发行版,真心很方便啊 :)
一、基础知识
废话少说,看 wiki 去吧
https://en.wikipedia.org/wiki/Preboot_Execution_Environment
二、启动文件准备
这里,我们将使用 ubuntu 14.04 amd64 的iso安装镜像作为示例。另外,请准备好相应的U盘,建议格式为ext3/4
1、拷贝安装文件
| 1 2 3 4 5 6 7 8 9 | mount -o loop ubuntu-14.04.3-desktop-amd64+mac.iso  /media/cdrom     # 挂载iso文件 mount /dev/sdb1 /mnt     # 挂载U盘,这里磁盘设备因人而异 mkdir -p /mnt/PXEboot/OS/ubuntu14.04 cp -r /media/cdrom/* /mnt/PXEboot/OS/ubuntu14.04     # 拷贝安装文件 | 
2、准备 PXE 引导文件
这里我们使用 syslinux 里的相关组件
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | wget https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.03.tar.xz     # 下载syslinux软件包 tar -xf syslinux-6.03.tar.xz     # 解压 cd syslinux-6.03/     # 进入该目录,下面复制一堆文件到U盘的PXE启动目录中     # 这一块是BIOS启动文件 mkdir -p /mnt/PXEboot/bios cp ./bios/core/pxelinux.0 /mnt/PXEboot/bios/ cp ./bios/com32/elflink/ldlinux/ldlinux.c32 /mnt/PXEboot/bios/ cp ./bios/com32/lib/libcom32.c32 /mnt/PXEboot/bios/ cp ./bios/com32/libutil/libutil.c32 /mnt/PXEboot/bios/ cp ./bios/com32/menu/vesamenu.c32 /mnt/PXEboot/bios/     # 然后是UEFI启动文件(我用的是64位 UEFI启动文件) mkdir -p /mnt/PXEboot/uefi cp efi64/efi/syslinux.efi /mnt/PXEboot/uefi/ cp efi64/com32/elflink/ldlinux/ldlinux.e64 /mnt/PXEboot/uefi/ cp efi64/com32/menu/vesamenu.c32 /mnt/PXEboot/uefi/ cp efi64/com32/lib/libcom32.c32 /mnt/PXEboot/uefi/ cp efi64/com32/libutil/libutil.c32 /mnt/PXEboot/uefi/ | 
然后准备 *.cfg 配置文件
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | mkdir -p /mnt/PXEboot/pxelinux.cfg/     # 在PXE启动目录下面新建cfg目录 vim /mnt/PXEboot/pxelinux.cfg/default     # 新建文件,写入以下内容     DEFAULT vesamenu.c32     MENU TITLE My PXEboot Server     PROMPT 0     TIMEOUT 100     label  Ubuntu 14.04 amd64         KERNEL OS/ubuntu14.04/casper/vmlinuz         INITRD OS/ubuntu14.04/casper/initrd.lz         APPEND netboot=nfs nfsroot=192.168.2.1:/mnt/PXEboot/OS/ubuntu14.04 boot=casper quiet splash -- | 
在BIOS和UEFI目录下建立相应目录的软链接
| 1 2 3 4 5 6 7 | cd /mnt/PXEboot/bios ln -s ../pxelinux.cfg/ ln -s ../OS/ cd /mnt/PXEboot/uefi ln -s ../pxelinux.cfg/ ln -s ../OS/ | 
三、OpenWrt 环境准备
1、安装 USB 支持软件
| 1 | opkg install usbutils kmod-usb-storage  block-mount | 
安装完毕之后,插上U盘,使用 lsusb 命令查看设备
2、配置U盘自动挂载
先尝试手动挂载
| 1 2 | mount /dev/sda1 /mnt     # 注意,设备号因人而异 | 
编辑 /etc/config/fstab 文件,在mount 代码块中修改配置
| 1 2 3 4 5 | config 'mount'         option  target  /mnt                option  device  /dev/sda1                                      option  enabled 1           option enabled_fsck 0 | 
检测能否正常挂载
| 1 2 3 4 5 6 | umount /mnt     # 先卸载U盘 /etc/init.d/fstab enable /etc/init.d/fstab start     # 再次启动 fstab | 
3、安装并配置 NFS server
| 1 | opkg install nfs-kernel-server | 
| 1 2 3 4 5 6 7 8 9 10 | vim /etc/exports     # 编辑配置文件,修改如下(根据U盘挂载目录决定)     /mnt/PXEboot *(ro,all_squash,insecure,sync) /etc/init.d/portmap enable /etc/init.d/portmap restart /etc/init.d/nfsd enable /etc/init.d/nfsd restart     # 这里重启了两个服务,如发生错误,请尝试重启设备 | 
说明一下,NFS用来给ubuntu live cd加载系统的,如果使用ubuntu或者debian的最小网络安装镜像里的内核,可以不配置NFS
4、配置 DHCP 以及 TFTP
最简单也是最实用的办法就是 编辑 /etc/dnsmasq.conf 文件:
| 1 2 3 4 5 6 7 8 | # filename: /etc/dnsmasq.conf # 在最后添加以下几行,这里会根据client类型自动选择镜像 enable-tftp tftp-root=/mnt/PXEboot dhcp-boot=bios/pxelinux.0 dhcp-match=set:efi-x86_64,option:client-arch,7 dhcp-boot=tag:efi-x86_64,uefi/syslinux.efi | 
然后重启dnsmasq服务:
| 1 2 | # 重启dnsmasq /etc/init.d/dnsmasq restart | 
如果不需要UEFl+BIOS双启动支持,可以使用Luci 图形操作: 登录Luci web页面,Network --> DHCP and DNS  --> TFTP Settings
然后启用 TFTP server,根目录设置为 /mnt/PXEboot,引导镜像填写 pxelinux.0或者efi启动文件,保存即可,如下图。
 然后luci会在 /etc/config/dhcp 文件里的 dnsmasq 配置段里自动添加如下几行内容:
然后luci会在 /etc/config/dhcp 文件里的 dnsmasq 配置段里自动添加如下几行内容:
| 1 2 3 4 5 6 | <del>config dnsmasq         ...          option enable_tftp '1'         option tftp_root '/mnt/PXEboot'         option dhcp_boot 'pxelinux.0'         ...</del>  | 
另外,官方文档里还在 /etc/config/dhcp 文件里添加了  “config boot linux”的配置,我没有添加这段,也没问题。
5、启动测试
最后就剩下实战测试了。不方便重启电脑的,可以使用虚拟机,桥接到物理网卡上面即可。附上截图一张:
6、我的其他配置
除了 ubuntu 14.04 的ISO,还尝试了添加 ubuntu netinstall的镜像。
| 1 2 3 4 5 6 7 | wget http://archive.ubuntu.com/ubuntu/dists/trusty-updates/main/installer-amd64/current/images/netboot/netboot.tar.gz -O /tmp/netboot.tar.gz cd tmp && tar zvxf /tmp/netboot.tar.gz     # 下载并解压netboot压缩包 cp -r /tmp/ubuntu-installer /mnt/PXEboot/OS/ mv /mnt/PXEboot/OS/ubuntu-installer ubuntu-netinst     # 复制进PXE引导目录. 顺便改名为ubuntu-netinst | 
下面是我的 pxelinux.cfg/default 文件内容:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | DEFAULT vesamenu.c32 MENU TITLE DuoHuo PXE Boot PROMPT 0 TIMEOUT 100 label  Ubuntu 14.04 amd64        KERNEL OS/ubuntu14.04/casper/vmlinuz        INITRD OS/ubuntu14.04/casper/initrd.lz        APPEND netboot=nfs nfsroot=192.168.2.1:/mnt/PXEboot/OS/ubuntu14.04 boot=casper quiet splash -- label Ubuntu netinst amd64         kernel OS/ubuntu-netinst/amd64/linux         append vga=788 initrd=OS/ubuntu-netinst/amd64/initrd.gz -- quiet | 
参考资料:
https://wiki.openwrt.org/doc/howto/tftp.pxe-server
http://www.syslinux.org/wiki/index.php?title=Install
https://wiki.kubuntu.org/UEFI/SecureBoot-PXE-IPv6
http://fixmynix.com/how-to-setup-an-openwrt-pxe-boot-server/

请问,我要pxe启动的是win10pe.iso,这个pxelinux.cfg/default 文件应该怎么写?多谢!
我在运行FreshTomato的路由器上,可以用BIOS方式pxe启动,并通过tftp/http/ftp三种方式下载ISO文件。但用UEFI方式进行pxe启动时总失败,想试试你的方法。
不好意思,这个事情太久了,好久没折腾过了,可能给不了您太多帮助;
不过可以推荐一个网站 https://netboot.xyz , 公网的PXE引导服务,他们的资料都在github开源了;
另外,USTC 的 PXE 引导服务也可以看一看,就是不如 netboot.xyz 稳定,而且可能需要加入他们的一些社群才能咨询吧