PXE系列文章(5)-基于 Ubuntu 16.04 构建 PXE 装机环境
上篇文章详细介绍了 Ubuntu 16.04 初次安装之后要做的一些优化建议, 见
经过前面几篇文章的介绍, 一个干净的 Ubuntu 环境搭建完成, 接下来我们要准备下 PXE(Preboot eXecution Environment) 环境的构建.在正式介绍 PXE 之前,我们需要知道 PXE 到底是什么?
PXE(预启动执行环境,也被称为预执行环境)提供了一种使用网络接口(Network Interface)启动计算机的机制。这种机制让计算机的启动可以不依赖本地数据存储设备(如硬盘)或本地已安装的操作系统。
结构图见:
这里涉及两个角色:
- 一个是 PXE Server, 相当于中控, 提供 PXE 启动过程必须要依赖的服务,比如 DHCP/TFTP等.
- 一个是 PXE Booting Client, 就是我们要通过 PXE 技术启动的目标机器.
设计初衷就是用于机器通过网络下载镜像,然后启动操作系统.
传统的对机器的管理是维护人员和机器 一对一的处理, 但是到目前, 大量机房轻轻松松上万台而言, 人工处理模式已经完全难以满足需求. 批量/远程管理的述求就可以很好的通过 PXE 技术满足.
另外对于一些大型企业而言, 它的应用层软件已经 SAAS 化, 对具体 OS 的硬件不强绑定, 那就可以通过网络启动集成自身业务的基于内存的 OS, 自动启动业务服务. 而不需要再去完成整个装机过程之后再使用, 当然这个需要企业内部有很强的 SAAS 层基础设施.
先前安装的 Ubuntu 虚拟机这里作为 PXE Server使用, 需要在其上安装 dhcp/tftp 服务, 接下来我们一步一步来构建我们的PXE Server.
安装 tftp 服务
sudo apt -y install tftpd-hpa
网上很多介绍需要安装inetutils-inetd, 我尝试过后, 发现 tftpd-hpa 和 inetutils-inetd 使用有冲突, 只安装tftpd-hpa也完全足够. 这块有经验的同学欢迎一起沟通讨论下.inetd是一个超级服务器, 用于托管一些非经常使用的网络服务.详细文档可以参考Debian 管理员手册 9.6. The inetd 超级服务器, 这里主要用它来托管 tftp服务.
配置 tftp
编辑 tftpd 服务主配置文件 /etc/default/tftpd-hpa
sudo vim /etc/default/tftpd-hpa
在配置文件末尾添加下述内容
RUN_DAEMON="yes"
OPTIONS="-l -s /var/lib/tftpboot"
完成上述配置后,重启 tftpd-hpa 服务.
sudo systemctl restart tftpd-hpa
配置 inetd
编辑 inetd 服务主配置文件
sudo vim /etc/inetd.conf
在配置文件末尾添加下述内容, 意思是让 inetd 托管 tftpd 服务
tftp dgram udp wait root /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot
如果你使用IPv6,需要把udp改为udp4。
到此 tftp 相关的服务配置完成,重启服务即可.
sudo systemctl restart tftpd-hpa
安装 dhcp 服务
安装 dhcp server
sudo apt -y install isc-dhcp-server
dhcp 涉及两个配置文件, /etc/default/isc-dhcp-server和/etc/dhcp/dhcpd.conf
配置 /etc/default/isc-dhcp-server
sudo vim /etc/default/isc-dhcp-server
将INTERFACES设置为 dhcp 绑定的目标网卡. 我们先前已经将启动第二块 Host Only 网卡作为 PXE Server 业务网络, 虚拟机启动后将自动获取到192.168.56.1/24网段的 IP,将INTERFACES设置为对应网卡名称即可.
# Defaults for isc-dhcp-server initscript
# sourced by /etc/init.d/isc-dhcp-server
# installed at /etc/default/isc-dhcp-server by the maintainer scripts
#
# This is a POSIX shell fragment
#
# Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf).
#DHCPD_CONF=/etc/dhcp/dhcpd.conf
# Path to dhcpd's PID file (default: /var/run/dhcpd.pid).
#DHCPD_PID=/var/run/dhcpd.pid
# Additional options to start dhcpd with.
# Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead
#OPTIONS=""
# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
# Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACES="enp0s8"
配置 /etc/dhcp/dhcpd.conf
sudo vim /etc/dhcp/dhcpd.conf
在末尾添加下述子网内容, 添加子网网段192.168.56.0/24,设置 next-server 指向当前的 PXE Server(192.168.56.10), 同时定义初始启动文件 filename(/pxelinux.0).
将 PXE Server 的仅主机(Host-Only)网络
网卡获取的 DHCP 的 IP 为固定 IP.
subnet 192.168.56.0 netmask 255.255.255.0 {
range 192.168.56.10 192.168.56.253;
option routers 192.168.56.1;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.56.254;
option ntp-servers 192.168.56.10;
next-server 192.168.56.10;
filename "/pxelinux.0";
}
dhcp服务就配置完毕了, 重启isc-dhcp-server即可.
sudo systemctl restart isc-dhcp-server
检查下上述服务是否都正常
sudo netstat -uap
root@server:~# netstat -uap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 *:bootps *:* 3227/dhcpd
udp 0 0 *:bootpc *:* 1084/dhclient
udp 0 0 *:bootpc *:* 1037/dhclient
udp 0 0 *:tftp *:* 2079/in.tftpd
udp 0 0 *:42715 *:* 3227/dhcpd
udp6 0 0 [::]:tftp [::]:* 2079/in.tftpd
udp6 0 0 [::]:18462 [::]:* 3227/dhcpd
root@server:~# netstat -npl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 651/sshd
tcp6 0 0 :::22 :::* LISTEN 651/sshd
udp 0 0 0.0.0.0:67 0.0.0.0:* 3227/dhcpd
udp 0 0 0.0.0.0:68 0.0.0.0:* 1084/dhclient
udp 0 0 0.0.0.0:68 0.0.0.0:* 1037/dhclient
udp 0 0 0.0.0.0:69 0.0.0.0:* 2079/in.tftpd
udp 0 0 0.0.0.0:42715 0.0.0.0:* 3227/dhcpd
udp6 0 0 :::69 :::* 2079/in.tftpd
udp6 0 0 :::18462 :::* 3227/dhcpd
raw 0 0 0.0.0.0:1 0.0.0.0:* 7 3227/dhcpd
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 9145 1/init /run/systemd/fsck.progress
unix 2 [ ACC ] STREAM LISTENING 9148 1/init /run/systemd/journal/stdout
unix 2 [ ACC ] STREAM LISTENING 13580 787/systemd /run/user/0/systemd/private
unix 2 [ ACC ] SEQPACKET LISTENING 9146 1/init /run/udev/control
unix 2 [ ACC ] STREAM LISTENING 11321 1/init /run/uuidd/request
unix 2 [ ACC ] STREAM LISTENING 11322 1/init /var/run/dbus/system_bus_socket
unix 2 [ ACC ] STREAM LISTENING 9141 1/init /run/systemd/private
取消 VirtualBox 提供的 192.168.56.0/24 网段的 DHCP 服务.
在先前的说明中, PXE Server 虚拟机初始化第二块网卡的过程中, 我们通过 VirtualBox
的 主机网络管理器
创建了一个界面为vboxnet0的仅主机(Host-Only)网络的子网, 其中我们启用了这个界面自带的 DHCP 功能, 因为在192.168.56.0/24网段我们上述已经安装了自定义的 DHCP 服务, 所以我们要取消 VirtualBox
提供的这个界面的 DHCP, 如下图, 将勾选取消:
初始化 TFTP 工作目录内容
tftp
的工作目录在 /var/lib/tftpboot
,我们看到当前目录的内容依然为空.
root@server:/var/lib/tftpboot# ll
total 8
drwxr-xr-x 2 root nogroup 4096 Jun 11 21:48 ./
drwxr-xr-x 39 root root 4096 Jun 11 21:48 ../
大多数操作系统都对 PXE 有良好的支持, 在各自的发行版中,都能找到这部分内容. 我们以 Ubuntu 发行版为例来介绍接下来的内容.
到 http://mirrors.163.com/ubuntu-releases/16.04.6/ 目录下, 我们看到有 desktop/server
版本镜像, 我们这里选择 server 版本镜像, 下载 ubuntu-16.04.6-server-amd64.iso
镜像文件, 我们需要的 PXE 相关的文件都在该文件中, 现在网速已经够快, 不过还是需要几分钟的时间, 去喝杯茶再回来继续吧^_^.
有时候网易镜像源也会较慢,可以切换到清华或者中科大的源,对应地址是https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/16.04.6/和https://mirrors.ustc.edu.cn/ubuntu-releases/16.04.6/
ubuntu-16.04.6-server-amd64.iso
下载完成后,将其挂着到 PXE Server 的 /mnt
目录, 将/mnt/install/netboot
下的内容拷贝到/var/lib/tftpboot
.拷贝过去之后一定要确认ldlinux.c32/pxelinux.0/pxelinux.cfg的权限,均设置为 777
root@server:~# mount ubuntu-16.04.6-server-amd64.iso /mnt/
mount: /dev/loop0 is write-protected, mounting read-only
root@server:~# ll /mnt/
total 217
dr-xr-xr-x 1 root root 2048 Feb 27 08:06 ./
drwxr-xr-x 22 root root 4096 Jun 10 11:15 ../
dr-xr-xr-x 1 root root 2048 Feb 27 08:06 boot/
dr-xr-xr-x 1 root root 2048 Feb 27 08:05 .disk/
dr-xr-xr-x 1 root root 2048 Feb 27 08:05 dists/
dr-xr-xr-x 1 root root 2048 Feb 27 08:05 doc/
dr-xr-xr-x 1 root root 2048 Feb 27 08:06 EFI/
dr-xr-xr-x 1 root root 2048 Feb 27 08:06 install/
dr-xr-xr-x 1 root root 18432 Feb 27 08:06 isolinux/
-r--r--r-- 1 root root 177923 Feb 27 08:06 md5sum.txt
dr-xr-xr-x 1 root root 2048 Feb 27 08:05 pics/
dr-xr-xr-x 1 root root 2048 Feb 27 08:05 pool/
dr-xr-xr-x 1 root root 2048 Feb 27 08:05 preseed/
-r--r--r-- 1 root root 239 Feb 27 08:05 README.diskdefines
lr-xr-xr-x 1 root root 1 Feb 27 08:05 ubuntu -> ./
root@server:~# ll /mnt/install/netboot/
total 7
dr-xr-xr-x 1 root root 2048 Feb 27 08:06 ./
dr-xr-xr-x 1 root root 2048 Feb 27 08:06 ../
lr-xr-xr-x 1 root root 47 Feb 20 22:37 ldlinux.c32 -> ubuntu-installer/amd64/boot-screens/ldlinux.c32
lr-xr-xr-x 1 root root 33 Feb 20 22:37 pxelinux.0 -> ubuntu-installer/amd64/pxelinux.0
lr-xr-xr-x 1 root root 35 Feb 20 22:37 pxelinux.cfg -> ubuntu-installer/amd64/pxelinux.cfg/
dr-xr-xr-x 1 root root 2048 Feb 20 22:30 ubuntu-installer/
-r--r--r-- 2 root root 61 Feb 20 22:37 version.info
到此我们已经将整个 PXE 的环境构建完成, 我们来通过一个虚拟机验证下 PXE 实验环境.
创建一个新的 VirtualBox 虚拟机, 命名为 client, 如下
虚拟创建好之后, 在使用之前,我们需要对 bios 和网卡调整下, 因为我们要通过网络启动, 所以 bios 中通过软驱/硬盘/光驱等启动项直接取消, 仅仅勾选网络启动项
PXE 启动过程,依赖 192.168.56.0/24 网段内的 DHCP 服务, 我们需要将这个新机器的网卡设置为仅主机(Host-Only)网络
接下来, 我们启动下 PXE Client VM, 如果出现下面的界面, 整个 PXE 的环境就说明已经完美 OK 了.
到这里, 我们仅仅能通过远程来管理机器的装机过程, 还需要人工一步一步点击确认, 输入必要参数, 才能完成整个装机过程, 目前不能满足我们全自动化完成整个装机过程.这块需要涉及到 RHL 系列操作系统 的 kickstart技术和 debian 系列 preseed 技术来完成整个自动化的安装过程.
如果未到达上述界面, 若是获取不了 PXE IP, 你需要检查你的 DHCP 服务是否正常, 以及 PXE Client VM 的网卡配置是否是仅主机(Host-Only)网络
, 如果是真实基于交换机的环境, 还需要确定交换机对 DHCP 广播包的中继是否配置正确. 若是无法下载ldlinux.c32/pxelinux.0/pxelinux.cfg 等文件, 需要检查下 tftpd 服务是否正常以及 tftpd 的工作目录内容和权限是否都正常.要还有有未知的问题, 欢迎邮件(linuxcoming@qq.com)沟通吧