Administrator
发布于 2026-04-07 / 1 阅读
0
0

PXE 网络启动与 Cobbler 批量部署

引言

PXE 是网络启动的底层协议,Cobbler 是基于 PXE 封装的一站式批量部署工具,两者结合可实现无 U 盘、无人值守、批量自动化安装 Linux系统,也能通过第三方补丁部署Windows系统,是数据中心、机房运维的核心效率工具。

基础环境准备

因为Cobbler 最早由 Red Hat 工程师开发,原生跑在 RHEL / CentOS 体系上

  • 官方源、依赖包、启动脚本都对 CentOS 最友好

  • Ubuntu/Debian 上装 Cobbler 经常缺依赖、版本老旧、坑多

  • 企业机房里,批量部署服务器本身就以 Linux 为主,用 CentOS 最统一

# 关闭防火墙
sudo systemctl stop firewalld
sudo systemctl disable firewalld

# 关闭SElinux
sudo setenforce 0
sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
sudo reboot

# 安装 epel 源(因为 Cobbler 软件包在此源中)
sudo yum install -y https://mirrors.aliyun.com/epel-archive/7/x86_64/Packages/e/epel-release-7-14.noarch.rpm

验证EPEL源是否生效

yum repolist enabled | grep epel

显示DNS解析失败

替换 CentOS 7 base 源为阿里云归档源(解决 DNS/404 问题)

# 备份原repo文件
sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
sudo mv /etc/yum.repos.d/CentOS-Media.repo /etc/yum.repos.d/CentOS-Media.repo.bak 2>/dev/null

# 下载阿里云CentOS 7归档源(适配已停服版本)
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

# 替换EPEL源为阿里云归档源(避免后续404)
sudo mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.bak
sudo curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo

# 清理旧缓存并重建新缓存
sudo yum clean all
sudo yum makecache

验证源配置是否生效

# 验证所有启用源,确认无解析错误
sudo yum repolist enabled

Cobbler安装配置

sudo yum install dhcp tftp-server xinetd httpd cobbler cobbler-web pykickstart -y

启动并设置开机自启

# 启动 cobblerd、httpd、xinetd 服务
sudo systemctl start cobblerd httpd xinetd
# 设置开机自启
sudo systemctl enable cobblerd httpd xinetd

执行Cobbler环境检查

sudo cobbler check
# 如上各问题解决方法如下:
# 第 1、2、7 个问题,顺便修改其他功能
[root@linux-node1 ~]# cp /etc/cobbler/settings{,.bak}	# 备份

# 问题1:客户端无法通过 localhost 访问 Cobbler,Kickstart 自动化部署会失败。
# 修改 /etc/cobbler/settings 文件中的 server 参数的值绑定为 eth1 的静态 IP,确保所有 PXE 客户端都能访问
[xxx@xxx ~]# sudo sed -i 's/^server: .*/server: 192.168.232.100/' /etc/cobbler/settings
[xxx@xxx ~]# sudo grep "^server: " /etc/cobbler/settings
server: 192.168.232.100

# 问题2:PXE 启动需要获取 TFTP 文件,127.0.0.1 会导致客户端无法下载。
# 修改 /etc/cobbler/settings 文件中的 next_server 参数的值为提供 PXE 服务的主机相应的 IP 地址
[xxx@xxx ~]# sudo sed -i 's/^next_server: .*/next_server: 192.168.232.100/' /etc/cobbler/settings
[xxx@xxx ~]# sudo grep "^next_server: " /etc/cobbler/settings
next_server: 192.168.232.100

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

# 问题7:默认密码 cobbler 存在严重安全风险,Kickstart 模板会使用该密码。
# 设置新装系统的默认 root 密码 cobbler
[xxx@xxx ~]# openssl passwd -1 -salt 'cobbler' 'yourpassword'
$1$cobbler$M6SE55xZodWc9.vAKLJs6.
# 修改 /etc/cobbler/settings 文件中的 default_password_crypted 参数的值为上面生成的密码串
[root@linux-node1 ~]# sudo vi /etc/cobbler/settings

# 问题3:TFTP 默认禁用,PXE 启动会卡在获取引导文件阶段。
# 修改 /etc/xinetd.d/tftp 文件中的 disable 参数修改为 disable = no
[xxx@xxx ~]# sudo sed -i "/disable/ {s#yes#no#}" /etc/xinetd.d/tftp 
[xxx@xxx ~]# sudo grep "disable" /etc/xinetd.d/tftp
        disable                 = no

# 问题4:缺少 pxelinux.0、menu.c32 等核心引导文件,x86_64 架构无法启动。
# 安装 syslinux 包并复制文件到对应目录。
sudo yum install -y syslinux
sudo cp /usr/share/syslinux/pxelinux.0 /var/lib/cobbler/loaders/
sudo cp /usr/share/syslinux/menu.c32 /var/lib/cobbler/loaders/
# 辅助文件(内存镜像/多启动支持)
sudo cp /usr/share/syslinux/memdisk /var/lib/cobbler/loaders/
sudo cp /usr/share/syslinux/mboot.c32 /var/lib/cobbler/loaders/
sudo cp /usr/share/syslinux/chain.c32 /var/lib/cobbler/loaders/
# 同步 Cobbler 配置,使新文件生效
sudo cobbler sync

# 问题5:rsync 未启用,Cobbler 无法同步镜像、Kickstart 脚本等文件。
# 设置开机自启并立即启动。
[xxx@xxx ~]# sudo systemctl enable rsyncd
[xxx@xxx ~]# sudo systemctl restart xinetd rsyncd
[xxx@xxx ~]# sudo systemctl status rsyncd

# 第 6 个问题,和 Debian 系统相关,不需要

# 第 8 个问题,fence设备相关,暂不需要

# 上面相关问题配置完后,重启 Cobbler,并再次执行 cobbler check 检查确认(如下算解决了相关问题)
[xxx@xxx ~]# sudo systemctl restart cobblerd
[xxx@xxx ~]# sudo cobbler check
The following are potential configuration items that you may want to fix:

1 : debmirror package is not installed, it will be required to manage debian deployments and repositories
2 : fencing tools were not found, and are required to use the (optional) power management features. install cman or fence-agents to use them

Restart cobblerd and then run '
cobbler sync
' to apply changes.
问题4结果

配置DHCP

# 配置使用 Cobbler 管理 DHCP
sudo sed -i "s#manage_dhcp: 0#manage_dhcp: 1#" /etc/cobbler/settings
sudo grep "^manage_dhcp: " /etc/cobbler/settings
# 修改 Cobbler 的 DHCP 模版,不要直接修改 DHCP 本身的配置文件,因为 Cobbler 会覆盖
sudo cp /etc/cobbler/dhcp.template{,.bak}
sudo vi /etc/cobbler/dhcp.template

# 修改内容
subnet 192.168.2.0 netmask 255.255.255.0 { #这里改为分配的网段和掩码
     #option routers             192.168.1.5; #如果有网关,这里改为网关地址
     #option domain-name-servers 192.168.1.1; #如果有DNS,这里改为DNS地址
     option subnet-mask         255.255.255.0; #改为分配的IP的掩码
     range dynamic-bootp        192.168.2.100 192.168.2.254; #改为分配的IP的范围

# 同步Cobbler配置
sudo systemctl restart cobblerd
sudo cobbler sync

配置开机启动

sudo systemctl enable dhcpd xinetd httpd cobblerd

镜像导入

由于我这里实在centos7系统上面配置的cobbler,所以上传了一个centos7的镜像并进行挂载。

创建挂载点,并进行挂载

sudo mkdir /centos7
sudo mount -o loop CentOS-7-x86_64-DVD-2207-02.iso /centos7
# 查看挂载后的目录
ls /centos7

导入镜像

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

查看导入后镜像信息

# 查看所有发行版本
sudo cobbler distro list
sudo cobbler distro report --name=centos7.9-x86_64

管理profile

查看profile配置文件

直接copy一份profile文件进行修改

# 进行profile文件目录
cd /var/liv/cobbler/kickstarts/
ls
# 复制文件
sudo cp sample_end.ks centos7.ks
# 编制文件
sudo vi centos7.ks

修改内容

# This kickstart file should only be used with EL > 5 and/or Fedora > 7.
# For older versions please use the sample.ks kickstart file.
# 全新安装,不是升级
install
# 文本模式安装(快,稳定)
text
# 美式键盘
keyboard us
# 语言英文
lang en_US
# 时区:伤害
timezone  Asia/ShangHai
# root密码为(cobbler变量中的默认密码之前已经修改)
rootpw --iscrypted $default_password_crypted
# 用户密码加密
auth  --useshadow  --enablemd5
# 安装后直接关闭防火墙
firewall --disabled
# 安装后直接关闭SElinux
selinux --disabled
# 从 Cobbler 网络源安装系统
url --url=$tree

# 清除磁盘 MBR 引导记录
zerombr
# 把引导撞到 MBR
bootloader --location=mbr
# 清空所有分区!!
clearpart --all --initlabel
# boot分区500M
part /boot --fstype=ext4 --size=500
# 交换分区 2G
part swap --fstype=swap --size=2048
# 根分区占满剩余所有空间
part / --fstype=ext4 --grow --size=200 

# 自动使用Cobbler源
$yum_repo_stanza
# 自动配置网卡(Cobbler变量)
$SNIPPET('network_config')
# 不安装图形界面化
skipx
# 首次开机不跑初始化向导
firstboot --disable
# 装完自动重启
reboot


%pre
$SNIPPET('log_ks_pre')
$SNIPPET('kickstart_start')
$SNIPPET('pre_install_network_config')
# Enable installation monitoring
$SNIPPET('pre_anamon')
%end

%packages
$SNIPPET('func_install_if_enabled')
@core
@base
tree
nmap
wget
lftp
lrzsz
telnet
%end

%post --nochroot
$SNIPPET('log_ks_post_nochroot')
%end

%post
$SNIPPET('log_ks_post')
# Start yum configuration
$yum_config_stanza
# End yum configuration
$SNIPPET('post_install_kernel_options')
$SNIPPET('post_install_network_config')
$SNIPPET('func_register_if_enabled')
$SNIPPET('download_config_files')
$SNIPPET('koan_environment')
$SNIPPET('redhat_register')
$SNIPPET('cobbler_register')
# Enable post-install boot notification
$SNIPPET('post_anamon')
# Start final steps
$SNIPPET('kickstart_done')
# End final steps

sed -ri "/^#UseDNS/c\UseDNS no" /etc/ssh/sshd_config
sed -ri "/^GSSAPIAuthentication/c\GSSAPIAuthentication no" /etc/ssh/sshd_config
%end

验证kickstart脚本语法完整性

sudo cobbler profile getks --name=centos7.9-x86_64 > /tmp/centos7.9-final.ks
sudo ksvalidator /tmp/centos7.9-final.ks
# 没有输出 = 语法完全正确

编辑centos7镜像所使用的kickstart文件

# 动态编辑指定使用新的kickstart文件
sudo cobbler profile edit --name=centos7.9-x86_64 --kickstart=/var/lib/cobbler/kickstarts/centos7.ks

# 验证是否更改成功
sudo cobbler profile report --name=centos7.9-x86_64 |grep Kickstart

# 同步cobbler配置
sudo cobbler sync

安装系统

新建虚拟机进行测试,选择centos7.9进行安装,会按照kickstart脚本文件安装并启动

安装完成后验证,使用root账户登录,密码为cobbler之前设置的密码。

# 查看ip是否成功下发。
ip a

下发成功

检查kickstart指定的工具是否成功安装

which tree nmap wget telnet lftp
# 检查防火墙状态
systemctl status firewalld
# 检查 SELinux 状
getenforce

预期输出:防火墙 inactive,SELinux Disabled,配置成功


评论