前言

最近在研究 DHCP 服务,注意到 DHCP 可以配挺多 Option 的,其中我觉得最有意思的就是 Option66 和 Option67 了,指定这两个参数就可以实现网络启动,通过搭建 PXE 服务就可以实现无人值守一键装机,不需要 U 盘,不需要人看着,只需要插上网线就能搞定,是不是很有意思?今天咱们就来安装一套 PXE 服务!

准备阶段

选型

概述

网上的教程基本上都是把 DHCP 服务和 PXE 服务安装在一台机器上面,在实际的网络环境中,往往已经存在了 DHCP 服务(路由器 or 交换机),而且这种通过手写配置的 DHCP 并不好进行管理,所以本次部署我们将 DHCP 和 PXE 分开。

顺带一提,如果需要把 DHCP 和 PXE 放在一台机器上运行,可以不装 dhcp 包,试试 ISC DHCP 加上 glass 管理界面,前几天搭了一套还挺好看。不过 glass 是一个 DashBoard ,只能看状态不能做设置,WEB 上给了一个写设置的地方但是其实是一个网页编辑器,还是要写文本的配置,不小心改错了就寄(xiaoku)

DHCP

DHCP 的话,可以用内网现有的 DHCP 服务器,如果没有的话,可以试试 ROS 或者 OPNsense ,ROS 的话,现在 CHR 版本可以白嫖了,优点是 DHCP 的 Option 支持比较全,各种该有的功能都有了,CLI 类似交换机,缺点是 WinBox 配置和逻辑上手稍复杂一点,加上没有中文版,OPNsense 算是 pfSense 的继任,基于 FreeBSD,在做 PXE 的时候优点是 Option67 比较灵活,可以根据启动类型指定文件(也就是能同时支持 Legacy 和 UEFI ,不然只能选一个,服务器一般都用 Legacy 所以倒是也无妨)。两者都非常稳定,我试用了一下,我个人的话偏向用 ROS ,实际部署的时候上虚拟机开网卡直通应该就能达到正常物理机的效果

PXE

选用的是 CentOS7 + Cobbler ,Cobbler 同时支持 Linux 和 Windows 的自动安装,集成了 KickStart 支持,联动 Apache 、DHCP(这里我们不装)、TFTP 、PXE 、电源管理、仓库管理等服务,全家桶一次安排上,很好用

安装

环境准备

准备一台 CentOS7 的机器

首先关闭防火墙

systemctl disable firewalld && systemctl stop firewalld

关闭 SELinux ,Cobbler 和 SELinux 不兼容

setenforce 0
sed -i ‘s#SELINUX=enforcing#SELINUX=disabled#g’ /etc/selinux/config
# 重启系统之后用下面的命令并查看 SELinux 状态
sestatus

换源,提升下载速度,选用 tuna 源

sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://mirror.centos.org|baseurl=https://mirrors.tuna.tsinghua.edu.cn|g' \
-i.bak \
/etc/yum.repos.d/CentOS-*.repo

安装 Cobbler

# 升级系统软件包 安装 Cobbler 以及相关服务
yum update -y && yum install epel-release -y && yum install -y cobbler cobbler-web tftp-server pykickstart httpd xinetd python-ctypes
# 启用开机自启并检查相关服务启用状态
systemctl enable httpd
systemctl enable xinetd
systemctl enable rsyncd
systemctl enable tftp
systemctl enable cobblerd
systemctl is-enabled xinetd rsyncd tftp httpd cobblerd
# 启动相关服务
systemctl start httpd
systemctl start xinetd
systemctl start rsyncd
systemctl start tftp
systemctl start cobblerd
# 使用 Check 检查当前配置问题
cobbler check
# 生成系统安装后默认密码,生成的字符串后面填写
openssl passwd -1 -salt `openssl rand 15 -base64` 'admin@123456'
# 修改 /etc/cobbler/settings 文件中的 server 参数的值为提供 cobbler 服务的主机相应的 IP 地址或主机名
# 根据实际情况修改 IP
[root@cobbler ~] sed -i 's%^server: 127.0.0.1%server: 10.0.0.13%g' /etc/cobbler/settings
[root@cobbler ~] grep "^server: " /etc/cobbler/settings
server: 10.0.0.13

# 修改 /etc/cobbler/settings 文件中的 next_server 参数的值为提供 PXE 服务的主机相应的 IP 地址
# Next-Server:不启用 DHCP 或跨网段时需要配置
[root@cobbler ~] sed -i "s#next_server: 127.0.0.1#next_server: 10.0.0.13#" /etc/cobbler/settings
[root@cobbler ~] grep "^next_server: " /etc/cobbler/settings
next_server: 10.0.0.13

# 防止循环装系统,适用于服务器第一启动项是 PXE 启动
[root@cobbler ~] sed -i "s#pxe_just_once: 0#pxe_just_once: 1#" /etc/cobbler/settings
[root@cobbler ~] grep "^pxe_just_once: " /etc/cobbler/settings
pxe_just_once: 1

# 修改默认密码 即:/etc/cobbler/settings 文件中的 default_password_crypted 参数的值为上面生成的密码串
[root@cobbler ~] sed -i 's%^default_password_crypted.*%default_password_crypted: "$1$bBB1GeSf$25JtWFpTAqGdCLf0/KlsO0"%g' /etc/cobbler/settings
[root@cobbler ~] grep "^default_password_crypted: " /etc/cobbler/settings
default_password_crypted: "$1$bBB1GeSf$25JtWFpTAqGdCLf0/KlsO0"

# 修改 /etc/xinetd.d/tftp 文件中的 disable 参数修改为 disable = no
[root@cobbler ~] sed -i "/disable/ {s#yes#no#}" /etc/xinetd.d/tftp
[root@cobbler ~] grep "disable" /etc/xinetd.d/tftp
disable = no

# 允许动态配置文件
sed -i '/allow_dynamic_settings:/c\allow_dynamic_settings: 1' /etc/cobbler/settings
grep "allow_dynamic_settings" /etc/cobbler/settings
allow_dynamic_settings: 1
# 重启 cobbler
systemctl restart cobblerd

配置 TFTP

编辑 tftp 服务配置文件 /etc/xinetd.d/tftp

service tftp 
{
socket_type = dgram
protocol = udp
wait = yes #此处修改为no-可选
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot
disable = no #修改此处值为no-必须
no per_source = 11
cps = 100 2
flags = IPv4
}

针对 Debian 系,调整 deb 源

yum -y install debmirror 
#修改/etc/debmirror.conf配置文件,注释掉@dists和@arches两行
vim /etc/debmirror.conf
...
#@dists="sid";
@sections="main,main/debian-installer,contrib,non-free";
#@arches="amd64";
...

安装电源管理工具

yum -y install fence-agents

修改 WEB 管理密码

WEB 的地址是 https://IP/cobbler_web

/etc/cobbler/users.conf #Web服务授权配置文件
/etc/cobbler/users.digest #用于web访问的用户名密码

[root@cobbler ~]# cat /etc/cobbler/users.digest
cobbler:Cobbler # 这里可以看到允许的登录名

#设置密码,在Cobbler组添加cobbler用户,输入两遍密码确认

[root@cobbler ~]# htdigest /etc/cobbler/users.digest Cobbler cobbler
Changing password for user cobbler in realm Cobbler
New password: test
Re-type new password: test

同步配置并重启httpd、cobbler

[root@cobbler ~]# cobbler sync
[root@cobbler ~]# systemctl restart httpd
[root@cobbler ~]# systemctl restart cobblerd

完成配置,重启相关服务

systemctl restart tftp
systemctl restart xinetd
systemctl restart cobblerd
cobbler check
cobbler sync

check 完成之后应该只剩一个问题,说不能支持多架构的操作系统,因为我们只需要支持 x86_64 所以无所谓,在 CentOS7 的 yum 源装出来的 cobbler 是不支持 cobbler get-loader 命令的所以也没有办法解决,只需要确保 SYSLINUX 包安装即可

yum install -y syslinux

配置 distro

主要用来定义和设置系统发行版本,包含了系统的内核,引导文件,以及安装包等内容,一个 ISO 文件配置一个 distro

挂载 iso 文件

mount  /opt/CentOS-7-x86_64-DVD-2009.iso  /mnt

导入镜像

cobbler import --path=/mnt/ --name=CentOS-7-x86_64  --arch=x86_64
# --path 镜像路径
# --name 为安装源定义一个名字
# --arch 指定安装源是 32 位、64 位、ia64, 目前支持的选项有: x86│x86_64│ia64
# 安装源的唯一标识就是根据 name 参数来定义,本例导入成功后,安装源的唯一标识就是:CentOS-7-x86_64,如果重复,系统会提示导入失败
cobbler distro list # 查看镜像列表

后期想改名字的话,可以在 WEB 页面轻松修改

自定义配置 profile

定义自动安装应答文件

主要用来定义 kickstart 配置文件,安装时依据配置文件进行定制化自动安装,配置此项时要和distro进行关联

准备 KickStart 文件

在进行 profile 配置之前,我们需要准备 kickstart 文件对安装进行自动应答,kickstart 文件的生成方式有以下几种

  • 购买红帽订阅,可以在红帽支持网站生成
  • 使用 kickstart 的 GUI (应该是叫 system-config-kickstart 这个包来着),不大推荐,有些系统的不一定能生成,而且有些参数需要微调,建议用它生成一个模板参考,对小白比较友好
  • RHEL 系安装后在 /root 文件夹生成的 anaconda-ks.cfg 记录了本次安装的设置信息(推荐),手动安装一次,参考这个配置来做 kickstart
  • 参考官方文档手写 kickstart 文件,像 OpenEulerFedora 官方都给了示例

生成了 Kickstart 文件之后,我们指定了用户密码,时区,硬盘分区,网络,语言,键盘,安装源,安装的软件包,安装后操作等等,即可用它完成 profile的配置

将 kickstart 文件上传到以下位置

/var/lib/cobbler/kickstarts/

编辑配置文件,命令行导入时会自动使用一个 kickstart 文件(按默认配置完成安装,需要改成我们制作的文件完成定制自动安装)

cobbler profile edit --name=CentOS-7-x86_64 --kickstart=/var/lib/cobbler/kickstarts/ks_centos7_9_2009x64.cfg

name 是 distro 的名称

tips:对 KickStart 文件怎么写没有头绪?本文最下面提供一份脱敏的 KickStart 文件示例供参考

针对网络安装的内核启动选项调整

需要把网卡归一化命名为 eth0 ,方便搭配 KickStart 文件使用(针对 CentOS7 及以后的 Linux 操作系统)

如图,修改 Profile 的内核启动参数,Kernel Options=biosdevname=0 net.ifnames=0

这样电脑的网卡名称就一定是 eth0 ,写 KickStart 的时候就可以把网卡名称指定为 eth0

网卡归一化

在启动时 TAB 查看启动参数,发现已经添加这个参数到启动选项中

网卡归一化_参数确认

修改引导界面的菜单

你可能注意到了,上面的引导菜单里面的标题你和我的不一样,如果想修改的话,修改下面的文件

# vi /etc/cobbler/pxe/pxedefault.template
DEFAULT menu
PROMPT 0
MENU TITLE HBFU Server OS Auto Install By Luckykeeper # 这里就是标题名称
TIMEOUT 200
TOTALTIMEOUT 6000
ONTIMEOUT $pxe_timeout_profile

LABEL support # 添加其它项,LABEL 名不能重复
MENU LABEL https://luckykeeper.site

LABEL local
MENU LABEL (Boot From Local)
MENU DEFAULT # 默认菜单
LOCALBOOT -1

$pxe_menu_items

MENU end

# 以上是菜单配置,配置完成之后,需要同步生效,命令如下
cobbler sync

配置 DHCP 服务器

需要配置的有三项

  • Next Server -> TFTP 服务器 IP ,本例和 PXE 部署在同服务器
  • Option66 -> PXE 服务器 IP
  • Option67 -> 启动文件:pxelinux.0

配置的时候不同设备方法不一样,以下介绍三种设备的配置方法供参考

文本转十六进制在线工具:http://www.ab126.com/goju/1711.html

iKuai

需要转16进制并进行处理,具体请参考 iKuai 的文档

假设 PXE 服务器 IP 为 192.168.1.123

Option66、67需要把原值转十六进制去掉0x并用英文冒号“**:**”两两隔开

Next Server:192.168.1.123

Option66:31:39:32:2e:31:36:38:2e:31:2e:31:32:33

Option67:70:78:65:6c:69:6e:75:78:2e:30

ROS

需要转16进制并进行处理,具体可参考 ROS从入门到精通v6.7e

假设 PXE 服务器 IP 为 192.168.1.123

Option66、67需要把原值转十六进制去掉0x并在最前添加0x

IP->DHCP Server->Options

Name Code Value
option66 66 0x3139322e3136382e312e313233
option67 67 0x7078656c696e75782e30

IP->DHCP Server->Networks

选择需要修改的 IP 地址段->Next Server:192.168.1.123

华为交换机

官方文档即可,不需要转16进制,比较省事儿

[SwitchA] interface vlanif 10
[SwitchA-Vlanif10] dhcp server option 66 ip-address 192.168.1.123
[SwitchA-Vlanif10] dhcp server option 67 ascii pxelinux.0
[SwitchA-Vlanif10] dhcp server next-server 192.168.1.123
[SwitchA-Vlanif10] quit

顺带一提,有趣的是,正是这篇文档让我确定能够把 DHCP 服务和 PXE 分开部署,网上的教程都是不分开,这很不合鲤的说

蛤为队拿下一分huaji

体验自动装机

马上来体验一下

开机时选择网卡启动,然后选择你想要安装的系统,喝杯茶,散散步,回来系统就自己装好了

PXE界面

我的评价是:你已经是一台成熟的机器了,要学会自己给自己装系统

题外话:这个印章最近挺火的,我也去找店家对了暗号整了一个,心奈阔耐捏huaji

过段时间再去进点儿ba新壁纸放博客

针对特殊镜像的特殊处理

手动导入

部分最新系统使用 Cobbler import 时会出错,这时我们需要手动导入

首先使用正常的方式导入

mount  /opt/ Fedora-Server-dvd-x86_64-36.iso  /mnt
cobbler import --path=/mnt/ --name= Fedora-Server-dvd-x86_64-36 --arch=x86_64

发现报 Task Failed!

此时虽然 Task Failed 了,但是系统已经导入到相关文件夹了,这时我们需要去 Cobbler 的 WEB 界面进行手动导入

Configuration->Distros-> Create New Distro

填写以下参数

其中

  • Kernel 参数是 /var/www/cobbler/ks_mirror/ 加上 http://服务器IP/cobbler/ks_mirror/ 这个目录下镜像的 vmlinuxz 文件位置,一般是在 images/pxeboot/ 下。以 Fedora Server 36 为例,这个文件在 Fedora-Server-dvd-x86_64-36-x86_64/images/pxeboot/vmlinuxz
  • Initrd 参数同理,参照 Kernel 参数填写,文件是 vmlinuxz 同目录下 initrd.img 文件
  • Kernel Option 参数见下面一节的说明
  • KickStart Metadata 暂时没法填写,先提交一次之后在 http://服务器IP/cblr/links/ 下就能找到相应文件,写上 tree=http://@@http_server@@/cblr/links/ 加上系统文件夹名称
  • Architecture 填写系统架构
  • Breed 根据系统类型填写
  • OS Version 在找不到同款的情况下填写最接近的即可

Tips:以这种方法导入的需要手动创建 Profile ,创建 Profile 之后即可在启动菜单看到该项

RHEL9(Fedora 36 | RockyLinux 9.0)

注意事项

inst. 前缀

根据 Fedora 文档 的说法,想要装新版的 RHEL 系列系统,不能直接使用 ks= 参数了,也就是说,Cobbler 提供给我们的参数不再能够使用,需要把 ks= 选项换成 inst.ks= (也就是说需要加个前缀)

stage2

同时发现,这些系统还需要手动提供 stage2 参数(指定 root 挂载文件的地址,不提供会报 missing /dev/root 的错误),同样需要加 inst. 前缀

修改启动选项

ks 选项

如图,在 profile 中的内核启动参数添加

inst.ks=http://192.168.208.33/Fedora-Server-dvd-x86_64-36.cfg

同时指定 KickStart 文件为空,效果可以在 PXE 启动界面按 TAB 键确认

指定 stage2

stage2 需要指定为解压出来的镜像 iso 的文件位置,在 Distro 中添加内核参数

记得也需要添加 inst. 前缀

#inst.stage2=http://【服务器IP】/cblr/links/【系统文件夹名称】/
inst.stage2=http://IP/cblr/links/Fedora-Server-dvd-x86_64-36/

Windows 自动部署

你没看错, Windows 也是可以用 Cobbler 部署的,类似 KickStart 文件,Windows 在有了相应的应答文件之后也是可以自动装机的,准备以下东西就OK

  • SMB 服务器
  • 定制 WinPE ISO
  • 应答文件

应答文件

先说最重要的应答文件,它的作用类似 KickStart ,帮咱们选择正常安装 Windows 时的选项,有了它,就能完成自动安装。那么这个文件怎么生成捏?那就需要我们去巨硬的官网下载 ADK 工具了,网上的教程多是基于 Windows7 的 AIK 工具制作的教程,我也用这个试了一下,发现一些 OEM 机器的螃蟹网卡 Win7 PE 是不支持的,所以我们使用 Win10 的 ADK 工具,版本选择 1607 ,能够保持较好的兼容性

Tips:以下操作()均需要在 Windows 上进行

注:这里是在讲应答文件的生成,为什么提到了 WinPE 呢?

因为 ADK 工具和 WinPE 预安装环境是配套使用的

安装了 ADK 和 WinPE add-on 之后,咱们就可以开始制作应答文件了

首先,你需要准备好需要安装的原版镜像一份,挂载镜像,把 .\source\install.wim 这个文件复制出来

打开系统映像管理器

在左下角的“选择 Windows 映像或编录文件”选择 install.wim 文件,右边添加应答文件,选择映像时选择要自动安装的系统并记下它在菜单里面的位置(是第几个,从1开始)

在左边“Windows 映像”区域添加属性到应答文件那边,在网上找了一张图供参考,实际配置时稍有不同,下面我会结合我的配置说一下

安装语言请务必改为 en-US 否则某些系统可能会安装出错(比如我这里的 Windows Server 2022 DataCenter),这里只影响 Windows 安装程序语言,不影响实际使用

这里的 Restart 是安装后自动重启

这里选择 WillWipeDisk 清除已有分区

这里 Size 是分区大小,单位是 MB ,Type 选择 Primary 主分区

这里设置 C 盘文件系统和驱动器名称,盘符

这里的数字是选择安装的系统,最上面让记下来是第几个用来填在这里

这里填写 GVLK 密钥,用于搭配 KMS 服务器激活

这里填写系统基本配置,时区,计算机名,OEM名,组织名,等等

这里填写自动更新选项和网络位置

这里填写 Administrator 的密码,明文写在这里,保存的时候会转换成加密的密码

最后保存这个 XML 格式的应答文件即可

SMB 服务器

Windows 的基本文件共享,无需赘述,记得创建只读共享,而且记得创建一个新用户给 PXE 的 WinPE 用,安全性更高

如果是按照我的教程使用 Win10 来做 WinPE 的话,注意 SMBv1 已经被禁用了,系统默认会用 SMBv3 ,所以不能再用 CentOS7 + SAMBA 来起 SMB 服务了,你需要另外找一台 Windows 服务器起一个 SMB 服务器,否则大概率在 PE 里面挂载不了 SMB 盘,Windows 不能通过 Linux 的 HTTP 获取文件,只能用 SMB

在 SMB 对应的共享文件夹内存放系统 ISO 文件里面的全部内容(复制粘贴)以及应答文件(在同目录下)

定制 WinPE ISO

还是上面那张图,这里还有一个“部署和映像工具环境”,这次需要用这个

打开之后依次输入以下命令,这里假设你的 SMB 服务器是 192.168.1.123 ,SMB 共享路径是 ./share ,SMB 账号 luckykeeper ,密码 cocoa ,同时注意应答文件名称和系统 iso 解压文件(cd win2022)存放位置,请根据实际情况修改

copype amd64 C:\winpex
Dism /mount-image /imagefile:C:\winpex\media\sources\boot.wim /index:1 /mountdir:C:\winpex\mount
echo net start lmhosts
echo net start LanmanWorkstation
echo ping -n 30 -l 69 192.168.1.123>> C:\winpex\mount\Windows\System32\startnet.cmd
echo net use z: \\192.168.1.123\share cocoa /user:luckykeeper >> C:\winpex\mount\Windows\System32\startnet.cmd
echo Z: >> C:\winpex\mount\Windows\System32\startnet.cmd
echo cd win2022>> C:\winpex\mount\Windows\System32\startnet.cmd
echo setup.exe /unattend:AutoRunWin2022.xml >> C:\winpex\mount\Windows\System32\startnet.cmd
Dism /unmount-image /mountdir:C:\winpex\mount /commit
MakeWinPEMedia /ISO C:\winpex C:\winpex\winpe_cobbler_amd64.iso

Cobbler 配置

把 XML 自动应答文件上传到 Cobbler 的 kickstart 文件夹下,把 WinPE ISO 上传到一个合适的位置

cobbler distro add --name=windows2022 --kernel=/var/lib/tftpboot/memdisk --initrd=/windows_isos/winpe_cobbler_amd64.iso --kopts="raw iso"

其中 kernel 是固定值不能修改,initrd 填写 WinPE ISO 文件的位置

然后去添加 Profile

这里的 kickstart 文件实际上不起作用,这里填写只是为了参数占位,实际使用的应答文件由制作 WinPE ISO 时指定

cobbler profile add --name=WindowsServer2022DC --distro=windows2022 --kickstart=/var/lib/cobbler/kickstarts/AutoRunWin2022.xml

最后即可体验一键安装 Windows 咯~

Windows 为防止你重复安装误清除数据,在蓝色的 PXE 界面加载 WinPE ISO 完成之后会让你按下任意键确认从 WinPE 启动,这个时间很短,一定不要错过

关于 Debian 系

因为 KickStart 是红帽家整的 ,使用 Debian 系的能用但是支持的不好,Ubuntu Server 在 GitHub 上有第三方写的过时的(作者自己说的)KickStart 文件,Ubuntu 官方文档推荐你用它自己的那套东西,因为我这里实际部署基本上都是 RHEL 系的,需要 Debian 系的时候很少,所以我没有进行尝试,根据网上的说法,你需要去定制镜像文件,感兴趣的可以自己去试试看

附录

Windows 10 1607 ADK 和 WinPE add-on ,方便下载不便的用户自取

CentOS 7 脱敏 KickStart 文件,供参考

其它参考资料,可供参考,我搭建服务的时候主要综合这些文字参考,感谢各位大佬