前言

在数据中心运维工作中,操作系统安装是最基础也是最频繁的操作之一。当服务器规模达到数十台甚至数百台时,传统的光盘/U盘逐台安装方式显然无法满足效率要求。Cobbler作为一款强大的自动化部署工具,集成了DHCP、TFTP、HTTP等服务,能够实现操作系统的全自动批量安装,大大提升了运维效率。

本文将系统性地介绍Cobbler的完整知识体系,从基础概念到实战部署,涵盖传统BIOS和UEFI两种引导模式,支持CentOS、RHEL、AlmaLinux、Ubuntu、Debian等主流Linux发行版。

一、Cobbler概述

1.1 什么是Cobbler

Cobbler是一款开源的Linux操作系统自动化部署工具,由Python开发,本质上是对PXE(预启动执行环境)技术的二次封装和增强。它集成了DHCP、TFTP、DNS、HTTP等服务,形成一个集中化的管理节点,能够实现操作系统的无人值守安装。

核心功能:

  • 配置DHCP、TFTP、DNS、HTTP等服务

  • 创建和管理操作系统安装源(YUM/APT仓库)

  • 解压缩和准备安装介质

  • 与Puppet、Ansible等配置管理系统集成

  • 支持电源管理(IPMI)实现远程开关机

  • 提供CLI和Web管理界面及REST API接口

支持的平台:

  • 物理机(x86_64架构)

  • KVM虚拟机

  • Xen虚拟化

1.2 Cobbler能做什么

功能 说明
自动化系统安装 服务器上架后网络引导自动安装CentOS、RHEL、Ubuntu等系统
配置管理 安装过程中配置IP地址、主机名、安装包等参数
初始化脚本 安装后自动执行自定义脚本(如Zabbix-agent安装、系统优化)
内部YUM源 可作为企业内部的软件包仓库
系统重装 支持已部署系统的重装操作
高级网络配置 支持网卡路由、DNS配置、网卡Bonding
API集成 提供REST API,可与企业内部系统集成

1.3 Cobbler应用架构

二、PXE自动化安装服务

2.1 PXE介绍

PXE(Preboot eXecution Environment,预启动执行环境)是Intel开发的一项网络引导技术,允许计算机通过网络接口而不是本地存储设备(如硬盘、光盘)来启动操作系统。

必要条件:

  • 计算机网卡支持PXE(集成BOOTROM芯片)

  • 主板支持网络引导启动

2.2 PXE工作流程

PXE采用Client/Server模式,PXE Client程序位于网卡的ROM芯片中。整个工作流程需要以下服务器配合:

服务器 作用 说明
DHCP服务器 分配IP地址 为客户端提供IP及引导文件位置信息
TFTP服务器 提供引导文件 传输pxelinux.0、grubx64.efi等启动文件
HTTP/NFS服务器 提供安装源 存放操作系统ISO镜像文件和应答文件

2.3 TFTP协议简介

TFTP(Trivial File Transfer Protocol,简单文件传输协议):

  • 基于UDP协议,端口号69

  • 设计简单,无认证机制

  • 适用于小文件的快速传输

  • 常用于PXE引导场景

2.4 DHCP协议简介

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议):

  • 自动为网络中的设备分配IP地址

  • 可同时指定网关、DNS、TFTP服务器等信息

  • 在PXE环境中,通过DHCP的next-serverfilename选项指定TFTP服务器地址和引导文件名

三、自动应答配置文件

3.1 Kickstart(红帽系列)

Kickstart是红帽系列Linux(RHEL、CentOS、AlmaLinux等)的自动化安装配置文件,将安装过程中需要手动输入的参数预写入ks.cfg文件,实现无人值守安装。

Kickstart文件组成部分:

部分 说明
安装选项 语言、时区、防火墙、磁盘分区、root密码等
%pre 安装前执行的脚本(在分区前运行)
%packages 指定要安装的软件包组或单个软件包
%post 安装后执行的脚本(如系统初始化、部署监控Agent)

Kickstart示例片段:

# 安装选项
install
url --url=http://192.168.38.221/centos7
lang en_US.UTF-8
keyboard us
timezone Asia/Shanghai
rootpw --iscrypted $6$randomsalt$encryptedpassword

# 分区配置
clearpart --all --initlabel
autopart --type=lvm

# 软件包
%packages
@base
@core
vim
wget
%end

# 安装后脚本
%post
echo "System installation completed at $(date)" > /root/install.log
%end

3.2 Preseed(Debian/Ubuntu 18.04及以前)

Debian和Ubuntu 18.04及更早版本使用Preseed文件实现自动化安装,采用键值对格式定义安装参数。

Preseed示例:

d-i debian-installer/locale string en_US
d-i keyboard-configuration/xkb-keymap select us
d-i netcfg/choose_interface select auto
d-i netcfg/get_hostname string ubuntu-server
d-i mirror/country string manual
d-i mirror/http/hostname string archive.ubuntu.com
d-i partman-auto/method string lvm
d-i passwd/root-login boolean true
d-i passwd/root-password password admin123
d-i passwd/root-password-again password admin123
tasksel tasksel/first multiselect server

3.3 Cloud-init(Ubuntu 20.04+)

Ubuntu从20.04版本开始,使用Cloud-init替代Preseed作为自动化配置工具。Cloud-init是Canonical开发的跨平台云实例初始化工具,功能更加强大。

Cloud-init核心文件:

文件 用途
user-data 用户自定义配置(用户、密码、脚本、软件包等)
meta-data 实例元数据(主机名、实例ID等)
vendor-data 厂商自定义数据

User-data示例:

#cloud-config
autoinstall:
  version: 1
  identity:
    hostname: ubuntu-server
    username: ubuntu
    password: "$6$randomsalt$encryptedpassword"
  storage:
    layout:
      name: lvm
  locale: en_US
  timezone: Asia/Shanghai
  packages:
    - vim
    - htop
    - net-tools
  late-commands:
    - 'echo "Installation completed" >> /target/root/install.log'

四、Cobbler安装与配置

4.1 实验环境

组件 配置
Cobbler服务器 AlmaLinux 9 / RHEL 9(IP: 192.168.38.221)
客户端 任意支持PXE启动的物理机或虚拟机
网络要求 同一局域网,DHCP服务可达

4.2 安装Cobbler

# 安装EPEL源
[root@cobbler ~]# yum install -y epel-release

# 安装Cobbler及相关组件
[root@cobbler ~]# yum install -y cobbler cobbler-web dhcp-server pykickstart httpd yum-utils

# 启动并设置开机自启
[root@cobbler ~]# systemctl restart httpd cobblerd
[root@cobbler ~]# systemctl enable httpd cobblerd

4.3 Cobbler目录结构

目录 说明
/etc/cobbler/ 配置文件目录
/var/lib/cobbler/ 数据存储目录
/var/www/cobbler/ 镜像和安装文件目录(HTTP根)
/var/log/cobbler/ 日志文件目录
/var/lib/tftpboot/ TFTP根目录

4.4 配置Cobbler

步骤1:执行环境检查

[root@cobbler ~]# cobbler check

根据检查结果,逐一解决以下问题:

步骤2:修改主配置文件

编辑 /etc/cobbler/settings.yaml

# 设置TFTP服务器IP(本机IP)
next_server_v4: 192.168.38.221

# 设置Cobbler服务器IP
server: 192.168.38.221

# 启用DHCP管理
manage_dhcp: true
manage_tftp: true
manage_dns: false

步骤3:安装引导程序

[root@cobbler ~]# yum install -y syslinux

# 复制PXE引导文件
[root@cobbler ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/cobbler/loaders/
[root@cobbler ~]# cp /usr/share/syslinux/menu.c32 /var/lib/cobbler/loaders/
[root@cobbler ~]# cp /usr/share/syslinux/ldlinux.c32 /var/lib/cobbler/loaders/

步骤4:配置root密码

# 生成加密密码(密码为admin123456)
[root@cobbler ~]# openssl passwd -1 -salt `openssl rand -hex 4` 'admin123456'
$1$abc123$def456ghi789jkl012mno345

# 将生成的加密字符串写入settings.yaml
# default_password_crypted: "$1$abc123$def456ghi789jkl012mno345"

步骤5:配置DHCP模板

编辑 /etc/cobbler/dhcp.template

# 关键配置片段
subnet 192.168.38.0 netmask 255.255.255.0 {
    option routers             192.168.38.1;
    option domain-name-servers 192.168.38.1;
    option subnet-mask         255.255.255.0;
    range dynamic-bootp        192.168.38.100 192.168.38.200;
    filename                   "/pxelinux.0";
    next-server                $next_server;
    default-lease-time         21600;
    max-lease-time             43200;
}

步骤6:同步配置并重启服务

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

4.5 导入系统镜像

导入CentOS 7镜像:

# 挂载ISO镜像
[root@cobbler ~]# mount -o loop /data/CentOS-7-x86_64-DVD-2009.iso /mnt/centos7

# 导入镜像到Cobbler
[root@cobbler ~]# cobbler import --path=/mnt/centos7 --name=centos7 --arch=x86_64

# 查看已导入的发行版和配置文件
[root@cobbler ~]# cobbler list
distros:
  centos7-x86_64
profiles:
  centos7-x86_64

修改Profile关联的Kickstart文件:

[root@cobbler ~]# cobbler profile edit --name=centos7-x86_64 --autoinstall=/var/lib/cobbler/templates/centos7.ks

生成GRUB2引导文件:

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

五、传统模式全自动安装

5.1 安装CentOS 7 / RHEL 8

在传统BIOS/Legacy模式下,配置完成后客户端只需设置网络启动(PXE),即可自动引导安装。

客户端操作:

  1. 开机进入BIOS设置

  2. 将启动顺序调整为网络启动(PXE)优先

  3. 保存重启

  4. 等待自动进入安装界面

  5. 系统自动完成安装

5.2 安装RHEL 9 / AlmaLinux 9

Kickstart模板调整:

RHEL 9/AlmaLinux 9在Kickstart语法上有以下变化:

旧语法 新语法
auth authselect
需要install 需注释掉install

Kickstart示例:

# 注释掉install
# install

# 使用authselect替代auth
authselect select minimal

url --url=http://192.168.38.221/almalinux9
lang en_US.UTF-8
keyboard us
timezone Asia/Shanghai
rootpw --iscrypted $6$...

去除kssendmac警告:

编辑 /usr/lib/python3.9/site-packages/cobbler/tftpgen.py,找到第868行附近:

# 原代码
# args.append("kssendmac")

# 修改为
args.append("inst.ks.sendmac")

修改后重启Cobbler服务并重新同步:

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

5.3 安装Ubuntu 18.04

使用版本: ubuntu-18.04-legacy-server-amd64.iso

导入命令:

[root@cobbler ~]# mount -o loop /data/ubuntu-18.04-legacy-server-amd64.iso /mnt/ubuntu18
[root@cobbler ~]# cobbler import --path=/mnt/ubuntu18 --name=ubuntu18 --arch=x86_64

导入后会有两个发行版选项,建议使用 ubuntu18-hwe-x86_64

替换initrd.gz文件:

[root@cobbler ~]# cp /mnt/ubuntu18/install/netboot/ubuntu-installer/amd64/initrd.gz /var/www/cobbler/distro_mirror/ubuntu18-x86_64/install/

六、Legacy Boot与UEFI Boot机制

6.1 Legacy BIOS vs UEFI

对比项 Legacy BIOS UEFI
分区表 MBR(主引导记录) GPT(GUID分区表)
支持架构 32位和64位 仅64位
引导文件 pxelinux.0 grubx64.efi
配置文件 /pxelinux.cfg/default grub.cfg
EFI分区 不需要 需要 /boot/efi 分区

6.2 Legacy Boot + PXE

DHCP配置:

# 指定TFTP服务器地址
next-server 192.168.38.221;

# 指定引导文件名
filename "pxelinux.0";

TFTP需要提供的文件:

  • pxelinux.0 — 主引导程序

  • menu.c32 — 菜单界面

  • ldlinux.c32 — Linux引导加载器

  • /pxelinux.cfg/default — 启动菜单配置文件

6.3 UEFI Boot + PXE

DHCP配置:

# 指定TFTP服务器地址
next-server 192.168.38.221;

# 指定UEFI引导文件名
filename "grubx64.efi";

TFTP需要提供的文件:

  • grubx64.efi — GRUB2 UEFI引导程序

  • grub.cfg — GRUB配置文件

  • 内核和initrd文件(vmlinuz和initrd.img)

七、使用PXE+TFTP构建UEFI自动安装环境

7.1 构建UEFI引导环境

创建目录结构:

[root@cobbler ~]# mkdir -p /var/lib/cobbler/loaders/uefi/
[root@cobbler ~]# mkdir -p /var/lib/tftpboot/grub/

拷贝GRUB引导文件(从AlmaLinux 9 ISO获取):

[root@cobbler ~]# cp /mnt/almalinux9/EFI/BOOT/BOOTX64.EFI /var/lib/cobbler/loaders/uefi/grubx64.efi
[root@cobbler ~]# cp /var/lib/cobbler/loaders/uefi/grubx64.efi /var/lib/tftpboot/

准备内核和initrd:

[root@cobbler ~]# mkdir -p /var/lib/tftpboot/rhel9
[root@cobbler ~]# cp /mnt/almalinux9/images/pxeboot/vmlinuz /var/lib/tftpboot/rhel9/
[root@cobbler ~]# cp /mnt/almalinux9/images/pxeboot/initrd.img /var/lib/tftpboot/rhel9/

7.2 编写GRUB配置文件

创建 /var/lib/tftpboot/grub/grub.cfg

set default="1"
set timeout=60

menuentry "Auto Install AlmaLinux 9" {
    linuxefi /rhel9/vmlinuz inst.stage2=http://192.168.38.221/almalinux9 inst.repo=http://192.168.38.221/almalinux9 inst.ks=http://192.168.38.221/almalinux9.ks
    initrdefi /rhel9/initrd.img
}

7.3 AlmaLinux 9 Kickstart示例

/var/www/cobbler/almalinux9.ks

# 注释install
# install

# 使用authselect替代auth
authselect select minimal

url --url=http://192.168.38.221/almalinux9

lang en_US.UTF-8
keyboard us
timezone Asia/Shanghai
rootpw --iscrypted $6$...

# UEFI分区配置
clearpart --all --initlabel
part /boot/efi --fstype=efi --size=200
part /boot --fstype=ext4 --size=1024
part pv.01 --size=1 --grow
volgroup vg01 pv.01
logvol / --fstype=ext4 --name=root --vgname=vg01 --size=1 --grow

# 软件包
%packages
@base
@core
vim
wget
net-tools
%end

# 安装后脚本
%post
echo "AlmaLinux 9 installation completed" > /root/install.log
%end

八、配置各系统的UEFI引导

8.1 CentOS 8 / RHEL 8 / AlmaLinux 8

拷贝内核文件:

[root@cobbler ~]# mkdir -p /var/lib/tftpboot/rhel8
[root@cobbler ~]# cp /mnt/rhel8/images/pxeboot/vmlinuz /var/lib/tftpboot/rhel8/
[root@cobbler ~]# cp /mnt/rhel8/images/pxeboot/initrd.img /var/lib/tftpboot/rhel8/

在grub.cfg中添加引导项:

menuentry "Auto Install RHEL 8" {
    linuxefi /rhel8/vmlinuz inst.stage2=http://192.168.38.221/rhel8 inst.repo=http://192.168.38.221/rhel8 inst.ks=http://192.168.38.221/rhel8.ks
    initrdefi /rhel8/initrd.img
}

RHEL 8 Kickstart示例(注意auth和install参数):

install
auth --enableshadow --passalgo=sha512
url --url=http://192.168.38.221/rhel8
lang en_US.UTF-8
keyboard us
timezone Asia/Shanghai
rootpw --iscrypted $6$...

8.2 Ubuntu 20.04 / 22.04

准备工作:

Ubuntu 20.04+使用live-server版本,需要拷贝 casper/ 目录下的内核和initrd:

[root@cobbler ~]# mkdir -p /var/lib/tftpboot/ubuntu22
[root@cobbler ~]# cp /mnt/ubuntu22/casper/vmlinuz /var/lib/tftpboot/ubuntu22/
[root@cobbler ~]# cp /mnt/ubuntu22/casper/initrd /var/lib/tftpboot/ubuntu22/

grub.cfg引导项:

menuentry "Auto Install Ubuntu 22.04" {
    linux /ubuntu22/vmlinuz url=http://192.168.38.221/ubuntu22.iso autoinstall ds=nocloud-net;s=http://192.168.38.221/cloud-init/
    initrd /ubuntu22/initrd
}

Cloud-init配置(user-data):

/var/www/cobbler/cloud-init/user-data

#cloud-config
autoinstall:
  version: 1
  identity:
    hostname: ubuntu-server
    username: ubuntu
    password: "$6$randomsalt$encryptedpassword"
  storage:
    layout:
      name: lvm
  locale: en_US
  timezone: Asia/Shanghai
  packages:
    - vim
    - htop
    - net-tools
  late-commands:
    - 'echo "Ubuntu installation completed" >> /target/root/install.log'

meta-data:

instance-id: ubuntu-server
local-hostname: ubuntu-server

8.3 Debian 11

下载netboot文件:

[root@cobbler ~]# cd /tmp
[root@cobbler ~]# wget https://deb.debian.org/debian/dists/bullseye/main/installer-amd64/current/images/netboot/netboot.tar.gz
[root@cobbler ~]# tar -xzf netboot.tar.gz
[root@cobbler ~]# cp ./debian-installer/amd64/initrd.gz /var/lib/tftpboot/debian11/
[root@cobbler ~]# cp ./debian-installer/amd64/linux /var/lib/tftpboot/debian11/

grub.cfg引导项:

menuentry "Auto Install Debian 11" {
    linux /debian11/linux url=http://192.168.38.221/debian11.iso auto=true priority=critical preseed/url=http://192.168.38.221/debian11.preseed
    initrd /debian11/initrd.gz
}

Preseed配置(preseed.cfg):

# 语言和地区
d-i debian-installer/locale string en_US
d-i keyboard-configuration/xkb-keymap select us
d-i netcfg/choose_interface select auto
d-i netcfg/get_hostname string debian-server
d-i netcfg/get_domain string example.com

# 镜像源(使用国内镜像)
d-i mirror/country string manual
d-i mirror/http/hostname string mirrors.ustc.edu.cn
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string

# 分区配置(格式:size priority maxsize filesystem mountpoint)
d-i partman-auto/choose_recipe select atomic
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

# 用户和密码
d-i passwd/root-login boolean true
d-i passwd/root-password password admin123
d-i passwd/root-password-again password admin123

# 软件包选择
tasksel tasksel/first multiselect server
d-i pkgsel/include string vim wget curl net-tools

# 允许未认证软件包(解决签名问题)
d-i debian-installer/allow_unauthenticated string true

# 后期脚本
d-i preseed/late_command string \
    in-target echo "Debian installation completed" > /root/install.log

九、常用管理命令

命令 用途
cobbler check 检查Cobbler环境配置
cobbler sync 同步所有配置到相关服务
cobbler list 列出所有已导入的发行版和配置文件
cobbler distro list 列出所有发行版
cobbler profile list 列出所有配置文件
cobbler import --path=/path --name=name --arch=arch 导入系统镜像
cobbler profile edit --name=name --autoinstall=ks.cfg 修改配置文件关联的应答文件
cobbler mkloaders 生成GRUB引导文件
cobbler repo add --name=name --mirror=url 添加YUM仓库
cobbler system add --name=name --profile=profile 添加特定系统(指定MAC地址)

十、常见问题排查

10.1 DHCP服务未启动

# 检查DHCP服务状态
systemctl status dhcpd

# 查看DHCP日志
tail -f /var/log/messages | grep dhcp

10.2 TFTP传输失败

# 检查TFTP服务状态
systemctl status xinetd

# 检查TFTP根目录权限
ls -la /var/lib/tftpboot/
chmod -R 755 /var/lib/tftpboot/

10.3 客户端获取不到IP

  • 确认网络连通性

  • 确认DHCP服务器配置的网段和地址池

  • 检查DHCP服务是否绑定到正确的网卡

10.4 Kickstart文件无法下载

  • 确认HTTP服务状态:systemctl status httpd

  • 确认Kickstart文件路径和权限

  • 确认防火墙开放80端口:firewall-cmd --add-service=http

10.5 UEFI引导失败

  • 确认客户端支持UEFI引导

  • 确认grubx64.efi文件存在且版本匹配

  • 检查grub.cfg配置文件语法是否正确

十一、总结

本文系统性地介绍了Cobbler自动化部署工具的完整知识体系,涵盖以下核心内容:

核心知识点 说明
Cobbler基础架构 集成了DHCP、TFTP、HTTP等服务,实现集中式自动化部署
PXE工作流程 基于网络引导技术,Client/Server模式自动安装
应答文件配置 Kickstart(红帽系列)、Preseed(Debian/Ubuntu 18.04)、Cloud-init(Ubuntu 20.04+)
Legacy vs UEFI 两种引导模式的原理、配置差异及迁移方法
多发行版支持 CentOS、RHEL、AlmaLinux、Ubuntu、Debian的自动安装配置

通过Cobbler,运维团队可以:

  1. 极大提升部署效率:新服务器上架后无需人工干预即可完成操作系统安装

  2. 统一系统标准:通过标准化的应答文件保证所有服务器配置的一致性

  3. 灵活的扩展能力:通过安装后脚本实现系统初始化、监控部署等自动化操作

  4. 降低运维成本:减少重复性劳动,让运维人员专注于更有价值的工作


📌 相关文章推荐

  • 《Ansible自动化运维工具完整知识体系》

  • 《Zabbix监控Windows应用实践》

  • 《PXE网络安装环境搭建完全指南》

如果文章对您有帮助,欢迎点赞收藏!如有疑问,请在评论区留言交流。

原创文章,转载请注明出处。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐