为了即将开始的 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 配置段里自动添加如下几行内容:
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 稳定,而且可能需要加入他们的一些社群才能咨询吧