上篇文章详细介绍了 Ubuntu 16.04 初次安装之后要做的一些优化建议, 见

Ubuntu 16.04 初次安装之后要做的一些优化建议

经过前面几篇文章的介绍, 一个干净的 Ubuntu 环境搭建完成, 接下来我们要准备下 PXE(Preboot eXecution Environment) 环境的构建.在正式介绍 PXE 之前,我们需要知道 PXE 到底是什么?

PXE(预启动执行环境,也被称为预执行环境)提供了一种使用网络接口(Network Interface)启动计算机的机制。这种机制让计算机的启动可以不依赖本地数据存储设备(如硬盘)或本地已安装的操作系统。

结构图见:

PXE diagram

这里涉及两个角色:

  • 一个是 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, 如下图, 将勾选取消:

Cancel VirtualBox Host Only 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, 如下

Create PXE Client VM

虚拟创建好之后, 在使用之前,我们需要对 bios 和网卡调整下, 因为我们要通过网络启动, 所以 bios 中通过软驱/硬盘/光驱等启动项直接取消, 仅仅勾选网络启动项

Change PXE Client BIOS

PXE 启动过程,依赖 192.168.56.0/24 网段内的 DHCP 服务, 我们需要将这个新机器的网卡设置为仅主机(Host-Only)网络

Change PXE Client Interface

接下来, 我们启动下 PXE Client VM, 如果出现下面的界面, 整个 PXE 的环境就说明已经完美 OK 了.

Change PXE Enviroment Completely

到这里, 我们仅仅能通过远程来管理机器的装机过程, 还需要人工一步一步点击确认, 输入必要参数, 才能完成整个装机过程, 目前不能满足我们全自动化完成整个装机过程.这块需要涉及到 RHL 系列操作系统 的 kickstart技术和 debian 系列 preseed 技术来完成整个自动化的安装过程.

如果未到达上述界面, 若是获取不了 PXE IP, 你需要检查你的 DHCP 服务是否正常, 以及 PXE Client VM 的网卡配置是否是仅主机(Host-Only)网络, 如果是真实基于交换机的环境, 还需要确定交换机对 DHCP 广播包的中继是否配置正确. 若是无法下载ldlinux.c32/pxelinux.0/pxelinux.cfg 等文件, 需要检查下 tftpd 服务是否正常以及 tftpd 的工作目录内容和权限是否都正常.要还有有未知的问题, 欢迎邮件(linuxcoming@qq.com)沟通吧

【腾讯云】境外1核2G服务器低至2折,半价续费券限量免费领取!
https://cloud.tencent.com/act/cps/redirect?redirect=1068&cps_key=e4b50f6c64a4480367f8a8d16fd07c5a&from=console

标签: pxe, tftp, dhcp, inetd

添加新评论