====== PXE服务器的安装和配置 ====== ===== 概述 ===== PXE是Preboot Execution Environment的简称,个人一般用它来实现系统的网络引导安装。简要的说,PXE引导的过程是这样的: - 机器从网卡引导(网卡要支持PXE启动); - 网卡的PXE固件代码使用BOOTP协议发送广播消息,期待本地网络有一台支持BOOTP的服务器响应,这通常是一台DHCP服务器。DHCP服务器除了回应IP地址、子网掩码等通常的网络参数外,还同时回应一个TFTP文件服务器地址; - TFTP服务器上存放着引导所需的bootloader、内核等必要程序; - 机器通过TFTP协议从TFTP服务器下载并执行这些引导程序; - 后续步骤就与正常安装一样了。 当然,由于机器本地没有安装介质,后续还是要通过NFS/HTTP/FTP等服务器获得安装源文件,但这不属于PXE服务器的范畴,就不讲述了。 综上,搭建一个PXE服务器,包括三个部分的工作: * 一个DHCP服务器; * 一个TFTP服务器; * 引导所需的相关程序文件。 前两个都是标准的服务,但不同系统引导所需的文件是不相同的,各有各的特点。 本文先在[[http://www.slackware.com/|slackware]]环境下搭建PXE服务器环境,之后介绍个人涉及的几个Linux发行版的引导程序文件,最后配置一个综合的PXE服务器。 ===== slackware下的PXE服务器配置 ===== 下面的具体操作基于slackware64 13.37,详细的说明可参阅slackware官方文档[[ftp://slackware.osuosl.org/pub/slackware/slackware64-13.37/usb-and-pxe-installers/README_PXE.TXT|README_PXE.TXT]]。 ==== TFTP服务器 ==== slackware下的tftp服务器通过inetd启动。编辑/etc/inetd.conf,修改tftp所在行: tftp dgram udp wait root /usr/sbin/in.tftpd in.tftpd -s /repo/ftp/tftpboot -r blksize 这里将服务器的文件目录设置为/repo/ftp/tftpboot,缺省是/tftpboot。 如果之前inetd服务没启用,则启用之: chmod a+x /etc/rc.d/rc.inetd /etc/rc.d/rc.inetd start ==== 引导文件 ==== 首先进入tftp服务器文件根目录: cd /repo/ftp/tftpboot 为了方便后续与其他Linux发行版的整合,这里不将文件直接放在根目录下,而是新建子目录: mkdir -p slackware/64-13.37 cd slackware/64-13.37 拷贝相关文件(假设安装源文件在~/ftp/slackware/slackware64-13.37/目录下): mkdir pxelinux.cfg cp /usr/share/syslinux/pxelinux.0 . cp ~/ftp/slackware/slackware64-13.37/isolinux/message.txt . cp ~/ftp/slackware/slackware64-13.37/isolinux/f2.txt . cp ~/ftp/slackware/slackware64-13.37/isolinux/initrd.img . cp ~/ftp/slackware/slackware64-13.37/usb-and-pxe-installers/pxelinux.cfg_default pxelinux.cfg/default cp -a ~/ftp/slackware/slackware64-13.37/kernels . ==== DHCP服务器 ==== 编辑配置文件/etc/dhcpd.conf,下面是一个最简单的配置模式: # dhcpd.conf # # Configuration file for ISC dhcpd # # If this DHCP server is the official DHCP server for the local # network, the authoritative directive should be uncommented. authoritative; ddns-update-style none; # Allow bootp requests allow bootp; # Point to the TFTP server: next-server 172.18.0.1; # Default lease is 1 week (604800 sec.) default-lease-time 604800; # Max lease is 4 weeks (2419200 sec.) max-lease-time 2419200; subnet 172.18.0.0 netmask 255.255.255.0 { option domain-name "copyleft.net"; option broadcast-address 172.18.0.255; option subnet-mask 255.255.255.0; option domain-name-servers 192.168.176.1; option routers 172.18.0.99; range dynamic-bootp 172.18.0.201 172.18.0.210; use-host-decl-names on; if substring (option vendor-class-identifier, 0, 9) = "PXEClient" { filename "/slackware/64-13.37/pxelinux.0"; } } 这里的几个关键配置分别是第11、14、30行。 新建启动脚本/etc/rc.d/rc.dhcpd: #!/bin/sh # # /etc/rc.d/rc.dhcpd # This shell script takes care of starting and stopping # the ISC DHCPD service # # Put the command line options here that you want to pass to dhcpd: DHCPD_OPTIONS="-q eth0" [ -x /usr/sbin/dhcpd ] || exit 0 [ -f /etc/dhcpd.conf ] || exit 0 start() { # Start daemons. echo -n "Starting dhcpd: /usr/sbin/dhcpd $DHCPD_OPTIONS " /usr/sbin/dhcpd $DHCPD_OPTIONS echo } stop() { # Stop daemons. echo -n "Shutting down dhcpd: " killall -TERM dhcpd echo } status() { PIDS=$(pidof dhcpd) if [ "$PIDS" == "" ]; then echo "dhcpd is not running!" else echo "dhcpd is running at pid(s) ${PIDS}." fi } restart() { stop start } # See how we were called. case "$1" in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) echo "Usage: $0 {start|stop|status|restart}" ;; esac exit 0 其中的第9行指定dhcpd服务的网络接口。 最后,启动dhcpd服务,就可以测试PXE网络安装了: chmod +x /etc/rc.d/rc.dhcpd touch /var/state/dhcp/dhcpd.leases /etc/rc.d/rc.dhcpd start ===== 几个Linux发行版的引导文件设置 ===== ==== CentOS 5 ===== [[http://www.centos.org|CentOS]] 5本身有一个工具Network Booting Services,可以自动配置引导文件。如果之前没有安装,可以执行如下命令安装: yum install system-config-netboot 运行: system-config-netboot 点击:Configure -> Network Installation -> Add,按照提示进行配置,完毕所有输出文件存放在/tftpboot/linux-install/目录下。生成的文件列表如下(这里以64位的CentOS 5.8为例): ./msgs ./msgs/rescue.msg ./msgs/boot.msg ./msgs/general.msg ./msgs/param.msg ./msgs/snake.msg ./msgs/expert.msg ./pxelinux.0 ./CentOS_5_x86_64 ./CentOS_5_x86_64/vmlinuz ./CentOS_5_x86_64/ks.cfg ./CentOS_5_x86_64/initrd.img ./pxelinux.cfg ./pxelinux.cfg/default ./pxelinux.cfg/pxeos.xml 同样的,我们将所有文件复制到特定目录下: cp -a /tftpboot/linux-install/* /repo/ftp/tftpboot/centos/5/x86_64/ 要测试,只需修改dhcpd.conf的如下部分: if substring (option vendor-class-identifier, 0, 9) = "PXEClient" { filename "/centos/5/x86_64/pxelinux.0"; } ==== CentOS 6 ===== 之所以CentOS要分两个版本来说明,是因为在6版本中已经没有Network Booting Services了。不过没关系,在了解了引导文件的大概架构后,可以手工来实现。 这里以64位的CentOS 6.3为例,并假设安装源文件在~/ftp/centos/6/os/x86_64/目录下。同时需要事先安装syslinux软件包,如果未安装,则执行: yum install syslinux 拷贝相关文件: mkdir -p /repo/ftp/tftpboot/centos/6/x86_64 cd /repo/ftp/tftpboot/centos/6/x86_64/ cp /usr/share/syslinux/menu.c32 . cp /usr/share/syslinux/pxelinux.0 . mkdir CentOS_6_x86_64 cp ~/ftp/centos/6/os/x86_64/images/pxeboot/vmlinuz CentOS_6_x86_64/ cp ~/ftp/centos/6/os/x86_64/images/pxeboot/initrd.img CentOS_6_x86_64/ mkdir pxelinux.cfg 接下来新建文件pxelinux.cfg/default: timeout 100 default menu.c32 menu title ########## PXE Boot Menu ########## label 1 menu label ^1) Install CentOS 6 x86_64 kernel CentOS_6_x86_64/vmlinuz append initrd=CentOS_6_x86_64/initrd.img label 2 menu label ^2) Boot from local drive localboot 这是一个最简单的配置模式。 修改dhcpd.conf的如下部分,以便测试: if substring (option vendor-class-identifier, 0, 9) = "PXEClient" { filename "/centos/6/x86_64/pxelinux.0"; } ==== Debian 6 ===== 这里以64位的[[http://www.debian.org|Debian]] 6(squeeze)为例,相关文件官方已经打包做好,直接下载就行了,所在位置:debian-mirror-site/dists/squeeze/main/installer-amd64/current/images/netboot/netboot.tar.gz。 解开netboot.tar.gz文件: mkdir -p /repo/ftp/tftpboot/debian/6/amd64 cd /repo/ftp/tftpboot/debian/6/amd64/ tar xzvf netboot.tar.gz 修改dhcpd.conf的如下部分,以便测试: if substring (option vendor-class-identifier, 0, 9) = "PXEClient" { filename "/debian/6/amd64/pxelinux.0"; } ==== Ubuntu 12.04 ===== [[http://www.ubuntu.com|Ubuntu]]和Debian的方法是一样的。这里以64位的Ubuntu 12.04为例,下载位置:ubuntu-mirror-site/dists/precise/main/installer-amd64/current/images/netboot/netboot.tar.gz。 解开netboot.tar.gz文件: mkdir -p /repo/ftp/tftpboot/ubuntu/12.04/amd64 cd /repo/ftp/tftpboot/ubuntu/12.04/amd64/ tar xzvf netboot.tar.gz 修改dhcpd.conf的如下部分,以便测试: if substring (option vendor-class-identifier, 0, 9) = "PXEClient" { filename "/ubuntu/12.04/amd64/pxelinux.0"; } ===== 整合PXE服务器 ===== 经过上述操作,很自然就会想到,何不做一个综合各个Linux发行版的PXE服务器呢?而不用每次手工修改dhcp配置文件,想装哪个系统就装哪个。好吧,接下来就做。 上面的实现中,Debian和Ubuntu的形式是多层次菜单驱动的。经过短暂对Debian架构的了解,决定基于Debian来构建。架构不算太复杂,就不过多说明了,下面直接列出具体操作。 ==== pxelinu.0 ==== 复制Debian的pxelinu.0: cd /repo/ftp/tftpboot/ cp debian/6/amd64/pxelinux.0 . ==== pxelinux.cfg/default ==== 建立pxelinux.cfg目录: mkdir pxelinux.cfg 参照Debian在pxelinux.cfg目录下新建default文件: include config/menu.cfg default config/vesamenu.c32 prompt 0 timeout 0 ==== config目录 ==== 建立config目录,后续操作在config目录下进行: mkdir config cd config/ ==== splash.png和vesamenu.c32 ==== 复制Debian的splash.png和vesamenu.c32: cp ../debian/6/amd64/debian-installer/amd64/boot-screens/splash.png . cp ../debian/6/amd64/debian-installer/amd64/boot-screens/vesamenu.c32 . ==== stdmenu.cfg ==== 复制Debian的stdmenu.cfg并做相应修改: cp ../debian/6/amd64/debian-installer/amd64/boot-screens/stdmenu.cfg . 这里只修改了文件路径: diff stdmenu.cfg ../debian/6/amd64/debian-installer/amd64/boot-screens/stdmenu.cfg 1c1 < menu background config/splash.png --- > menu background debian-installer/amd64/boot-screens/splash.png ==== menu.cfg ==== 参照Debian新建menu.cfg文件: menu hshift 15 menu width 49 menu title Installer boot menu include config/stdmenu.cfg menu begin slackware64-13.37 menu title Slackware64-13.37 label mainmenu menu label ^Back.. menu exit include config/slackware64-13.37.cfg menu end menu begin centos64-5 menu title CentOS/x86_64 5 label mainmenu menu label ^Back.. menu exit include config/centos64-5.cfg menu end menu begin centos64-6 menu title CentOS/x86_64 6 label mainmenu menu label ^Back.. menu exit include config/centos64-6.cfg menu end menu begin debian64-6 menu title Debian/amd64 6 label mainmenu menu label ^Back.. menu exit include config/debian64-6.cfg menu end menu begin ubuntu64-12.04 menu title Ubuntu/amd64 12.04 label mainmenu menu label ^Back.. menu exit include config/ubuntu64-12.04.cfg menu end 每个发行版占用一个菜单项,对应一个单独的配置文件,文件里的每个安装选项又对应一个子菜单项。 下面是各个发行版配置文件的具体内容,除了基本的安装选项外,也融合了Expert、Rescue等选项,方便使用。 ==== slackware配置文件 ==== default huge.s label huge.s menu label ^huge.s menu default kernel slackware/64-13.37/kernels/huge.s/bzImage append initrd=slackware/64-13.37/initrd.img load_ramdisk=1 prompt_ramdisk=0 rw printk.time=0 SLACK_KERNEL=huge.s label speakup.s menu label ^speakup.s kernel slackware/64-13.37/kernels/huge.s/bzImage append initrd=slackware/64-13.37/initrd.img load_ramdisk=1 prompt_ramdisk=0 rw printk.time=0 SLACK_KERNEL=huge.s label memtest menu label ^memset kernel slackware/64-13.37/kernels/memtest/memtest ==== CentOS 5配置文件 ==== default install label install menu label ^Install menu default kernel centos/5/x86_64/CentOS_5_x86_64/vmlinuz append initrd=centos/5/x86_64/CentOS_5_x86_64/initrd.img label expert menu label ^Install (Expert mode) kernel centos/5/x86_64/CentOS_5_x86_64/vmlinuz append initrd=centos/5/x86_64/CentOS_5_x86_64/initrd.img expert label rescue menu label ^Rescue mode kernel centos/5/x86_64/CentOS_5_x86_64/vmlinuz append initrd=centos/5/x86_64/CentOS_5_x86_64/initrd.img rescue ==== CentOS 6配置文件 ==== default install label install menu label ^Install menu default kernel centos/6/x86_64/CentOS_6_x86_64/vmlinuz append initrd=centos/6/x86_64/CentOS_6_x86_64/initrd.img label basic menu label ^Install (basic video) kernel centos/6/x86_64/CentOS_6_x86_64/vmlinuz append initrd=centos/6/x86_64/CentOS_6_x86_64/initrd.img xdriver=vesa nomodeset label rescue menu label ^Rescue mode kernel centos/6/x86_64/CentOS_6_x86_64/vmlinuz append initrd=centos/6/x86_64/CentOS_6_x86_64/initrd.img rescue ==== Debian 6配置文件 ==== default install label install menu label ^Install menu default kernel debian/6/amd64/debian-installer/amd64/linux append vga=788 initrd=debian/6/amd64/debian-installer/amd64/initrd.gz -- quiet label expert menu label ^Expert install kernel debian/6/amd64/debian-installer/amd64/linux append priority=low vga=788 initrd=debian/6/amd64/debian-installer/amd64/initrd.gz -- label rescue menu label ^Rescue mode kernel debian/6/amd64/debian-installer/amd64/linux append vga=788 initrd=debian/6/amd64/debian-installer/amd64/initrd.gz rescue/enable=true -- quiet label auto menu label ^Automated install kernel debian/5.0/amd64/debian-installer/amd64/linux append auto=true priority=critical vga=788 initrd=debian/6/amd64/debian-installer/amd64/initrd.gz -- quiet ==== Ubuntu 12.04配置文件 ==== default install label install menu label ^Install menu default kernel ubuntu/12.04/amd64/ubuntu-installer/amd64/linux append vga=788 initrd=ubuntu/12.04/amd64/ubuntu-installer/amd64/initrd.gz -- quiet label cli menu label ^Command-line install kernel ubuntu/12.04/amd64/ubuntu-installer/amd64/linux append tasks=standard pkgsel/language-pack-patterns= pkgsel/install-language-support=false vga=788 initrd=ubuntu/12.04/amd64/ubuntu-installer/amd64/initrd.gz -- quiet label expert menu label ^Expert install kernel ubuntu/12.04/amd64/ubuntu-installer/amd64/linux append priority=low vga=788 initrd=ubuntu/12.04/amd64/ubuntu-installer/amd64/initrd.gz -- label cli-expert menu label Command-^line expert install kernel ubuntu/12.04/amd64/ubuntu-installer/amd64/linux append tasks=standard pkgsel/language-pack-patterns= pkgsel/install-language-support=false priority=low vga=788 initrd=ubuntu/12.04/amd64/ubuntu-installer/amd64/initrd.gz -- label rescue menu label ^Rescue mode kernel ubuntu/12.04/amd64/ubuntu-installer/amd64/linux append vga=788 initrd=ubuntu/12.04/amd64/ubuntu-installer/amd64/initrd.gz rescue/enable=true -- quiet ==== dhcpd.conf ==== 最后,修改dhcpd.conf的如下部分: if substring (option vendor-class-identifier, 0, 9) = "PXEClient" { filename "/pxelinux.0"; } 配置完毕。 ==== 效果图 ==== 这是一个运行效果的截图: {{ :computer:env:pxe.png |}} 这里偷懒直接使用了Debian的背景图,你可以根据自己喜好更换,感谢Debian团队的贡献! \\ 相关文章: [[.:centos-pxe | CentOS 6下PXE服务器配置的几点事项]] {{tag>PXE slackware}}