最近在配置一台服务器的时候遇到了一个不大不小的麻烦。有一台 Dell 的服务器需要重新安装系统,然而这台十年前的 Dell 服务器由于光驱和USB接口都出现了未知的故障,从而并不能使用传统的光盘和 USB 磁盘来安装系统。于是唯一能利用的就只有网络,也就是说只能通过 PXE 来引导系统。然而通过 PXE 安装的过程并没有想象中的那么简单。
0x01 什么是PXE?
PXE 是 Preboot eXecution Environment 的缩写,意为“预启动执行环境”,这种机制可以使得计算机通过网络来引导。现在的绝大多数电脑都可以设置通过 PXE 启动。PXE 的工作原理是 PXE Client 通过DHCP获取IP并由DHCP服务器告诉客户端启动文件的位置,再通过TFTP协议传输引导文件,最终引导电脑启动。详细的流程见下图:
0x02 所需要的准备工作
既然PXE是通过DHCP获取引导文件的,那么必须要准备DHCP服务器,同时还必须准备传输引导文件用的TFTP服务器。本次部署将采用一台安装有CentOS的电脑来充当服务器,并且网络拓扑图如下:
其中在交换机与公网连接之间存在有DHCP服务器负责地址分配。有人可能会问,既然存在DHCP服务器,那么我们自己搭建的DHCP服务器岂不是没有用了?事实上,这个问题大可不必担心,客户端在向网络中请求DHCP的时候会优先选择就近的DHCP服务器,我们用另一台PC搭建的DHCP服务器显然比交换机外部的DHCP服务器更快地响应来自客户端的DHCP请求。
在引导并启动Linux内核之后客户端就开始通过HTTP/FTP获取安装文件,这时候我们还必须指定安装文件的地址。如果你连接某个镜像站的速度很快的话,可以指定镜像站的地址。而如果条件不允许我们还必须搭建一个HTTP或者FTP服务器。以下以用vsftpd搭建的FTP服务器为例。
0x03 开始配置
在Terminal中执行如下命令安装dhcp、tftp-server、syslinux、vsftpd:
yum install dhcp tftp-server syslinux vsftpd –y
关闭iptables以及SELinux
service iptables stop setenforce 0
或修改/etc/selinux/config中
SELINUX=disabled
再执行setenforce 0
DHCP服务器配置
vim /etc/dhcpd/dhcp.conf
DHCPD_INTERFACE="eth0"; #设置dhcp服务监听的网卡,一般为eth0,请按实际情况确定 ddns-update-style none; ignore client-updates; option routers 192.168.1.101; #本机IP,以192.168.1.101为例 option domain-name-servers 8.8.8.8, 114.114.114.114; allow booting; allow bootp; #添加子网 subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.100 192.168.1.200; #DHCP分配的IP段,要包含本机IP option routers 192.168.1.101; filename "pxelinux.0"; #启动文件 next-server 192.168.1.101; #引导服务器,填本机IP default-lease-time 600; max-lease-time 7200; }
接着启动dhcpd服务
service dhcpd start
如果遇到错误,可以通过以下命令查看
tail –n 50 /var/log/messages
tftp服务器配置
tftp服务器需要xinetd的支持,如果没有安装则必须先安装xinetd
查看tftp服务器的配置文件
vim /etc/xinetd.d/tftp
service tftp { disable = no socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /var/lib/tftpboot per_source = 11 cps = 100 2 flags = IPv4 }
保持默认即可,注意这里的tftp服务器的根目录是/var/lib/tftpboot
执行
service xinetd start
启动tftp服务器
准备启动文件
cd /var/lib/tftpboot mkdir pxeboot
复制syslinux的文件到该目录下
cp /usr/share/syslinux/pxelinux.0 ./ cp /usr/share/syslinux/menu.c32 ./ cp /usr/share/syslinux/memdisk ./ cp /usr/share/syslinux/mboot.c32 ./ cp /usr/share/syslinux/chain.c32 ./
接着从要安装的系统镜像中提取内核,可以从安装光盘的images/pxeboot/下找到initrd.img和vmlinuz文件,复制到/var/lib/tftpboot/pxeboot/下面,也可以从镜像站下载(参考:http://mirror-site-url/centos/7/os/x86_64/images/pxeboot/)
配置ftp(如果通过镜像站下载安装文件,则忽略此步骤)
vsftpd默认配置就已经能够满足我们的需要了,直接执行
service vsftpd start
即可启动,ftp的根目录为/var/ftp
可以在其中新建一个os文件夹,只需要把CentOS安装镜像的文件全部复制到其中即可,当然可以mount镜像然后创建软连接,然而实测发现权限设置似乎存在问题导致不能访问,所以还是建议复制。
配置启动菜单
PXE启动的时候通过读取远程目录(即为本机的/var/lib/tftpboot)下的pxelinux.cfg目录中的配置文件显示启动菜单,当然这个启动菜单是可以自定义的,但是我们的任务是装系统而不是欣赏启动菜单,所以能完成基本功能就好。
依次执行
mkdir pxelinux.cfg cd pxelinux.cfg vim default
编辑内容为
default menu.c32 prompt 0 timeout 600 ONTIMEOUT local MENU TITLE PXE Boot Menu LABEL Install CentOS 6 via FTP MENU LABEL Install CentOS 6 KERNEL images/vmlinuz APPEND initrd=images/initrd.img method=ftp://192.168.1.101/os
注:此处URL末尾不能加斜杠。
从启动菜单可以看出,这里的method指向的正是网络上的安装文件路径,如果说使用镜像站下载安装文件便可以改为镜像站的系统路径(参考:http://mirror-site-url/centos/7/os/x86_64/)。
执行安装
接着便可以启动那台Dell的服务器,选择从PXE启动。然后进入我们设定的启动菜单,加载内核并进入安装程序,设置好区域、语言、网络,便从我们指定的地址下载一些img文件,最后可以进入图形化的安装程序。
注意,如果采用从镜像站下载安装文件安装的话,有可能在安装的时候出现不能下载文件的问题,这时必须在安装程序启动之后设置网络之前关闭我们自己搭建的DHCP服务器,让安装程序去真正的DHCP服务器那里获得IP地址并连接到网络,否则可能无法正常下载安装文件。
0x04 参考文献
[1] PXE 安装 CentOS 6.4(CentOS-6.4-x86_64-bin-DVD1.iso) (http://www.javaarm.cn/faces/display.xhtml?tid=2972)
[2] 预启动执行环境——Wikipedia (http://zh.wikipedia.org/zh/%E9%A2%84%E5%90%AF%E5%8A%A8%E6%89%A7%E8%A1%8C%E7%8E%AF%E5%A2%83)
[3] 鳥哥的 Linux 私房菜 — 安裝伺服器與 kickstart(http://linux.vbird.org/linux_enterprise/0120installation.php)
[4] 鳥哥的 Linux 私房菜 — DHCP 伺服器(http://linux.vbird.org/linux_server/0340dhcp.php)
[5] CentOS 6.4下PXE+Kickstart无人值守安装操作系统(http://www.cnblogs.com/mchina/p/centos-pxe-kickstart-auto-install-os.html)
屌屌屌!
如果不是我本地有DNS劫持,那么下面的友情链接里好像被做了黑帽SEO的样子?
其实应该说是类似于“有人联系我做广告”这种的吧,然后以此来补贴一小部分主机的费用。
能有广告收入,也挺厉害了