跳转到内容

Kickstart 无人值守安装

Kickstart 是 EL 系发行版提供的自动化安装技术,通过一个配置文件(ks.cfg)预定义所有安装选项,实现完全无人值守的操作系统部署。本文将介绍 Kickstart 的工作原理、配置文件结构、常用指令、从现有系统生成配置以及结合 PXE 的网络引导安装。

传统安装需要管理员在安装界面逐步选择选项(语言、时区、分区、软件包等)。Kickstart 将所有这些选项预先写入一个文本文件,安装程序(Anaconda)读取该文件后自动完成全部安装过程。

核心优势:

  • 无需人工干预,适合大规模批量部署
  • 配置可版本控制,确保一致性
  • 支持自定义脚本(pre/post),实现安装后自动配置
  • 可通过 HTTP、FTP、NFS 或本地媒体提供

每次安装完成后,Anaconda 会自动生成一个 Kickstart 文件,记录本次安装的所有选项:

查看安装时自动生成的 Kickstart 文件
cat /root/anaconda-ks.cfg

这个文件可以作为模板,根据需要修改后用于后续安装。

复制一份作为工作模板
cp /root/anaconda-ks.cfg /root/my-ks.cfg

也可以使用 Red Hat 提供的在线 Kickstart Generator 工具(pykickstart)来生成配置:

安装 pykickstart 工具
sudo dnf install pykickstart -y
验证现有 Kickstart 文件语法
ksvalidator /root/my-ks.cfg

Kickstart 配置文件分为三个部分,按顺序排列:

  1. 命令部分 — 安装选项(必选和可选指令)
  2. %packages 部分 — 要安装的软件包
  3. %pre / %post 脚本部分 — 安装前后执行的脚本
/root/my-ks.cfg 完整示例
#version=RHEL9
# === 安装方式 ===
# 使用网络安装源
url --url="https://repo.almalinux.org/almalinux/9/BaseOS/x86_64/os/"
# 使用文本模式安装(无图形界面)
text
# 安装完成后自动重启
reboot
# === 系统基本设置 ===
# 语言
lang zh_CN.UTF-8
# 键盘布局
keyboard --xlayouts='us'
# 时区
timezone Asia/Shanghai --utc
# === 网络配置 ===
network --bootproto=dhcp --device=ens18 --onboot=on --hostname=server01.example.com
# === 安全设置 ===
# Root 密码(加密格式)
rootpw --iscrypted $6$rounds=4096$randomsalt$hashedpasswordhere
# 创建普通用户
user --name=admin --groups=wheel --iscrypted --password=$6$rounds=4096$salt$hash
# SELinux 模式
selinux --enforcing
# 防火墙
firewall --enabled --ssh
# === 磁盘分区 ===
# 清除所有分区
clearpart --all --initlabel
# 自动分区方案
autopart --type=lvm
# 或手动分区
# part /boot --fstype=xfs --size=1024
# part /boot/efi --fstype=efi --size=512
# part pv.01 --size=1 --grow
# volgroup vg_sys pv.01
# logvol / --fstype=xfs --name=lv_root --vgname=vg_sys --size=20480
# logvol /var --fstype=xfs --name=lv_var --vgname=vg_sys --size=10240
# logvol swap --name=lv_swap --vgname=vg_sys --size=4096
# 引导加载器
bootloader --location=mbr --append="crashkernel=auto"
# === 软件包 ===
%packages
@^minimal-environment
@standard
vim-enhanced
wget
curl
chrony
bash-completion
%end
# === 安装后脚本 ===
%post --log=/root/ks-post.log
#!/bin/bash
# 启用常用服务
systemctl enable chronyd
systemctl enable sshd
# 更新系统
dnf update -y
# 配置 SSH 安全选项(用 drop-in 文件,避免依赖主配置中的默认注释行)
# 注意:直接 sed 改 sshd_config 容易因默认值不是 "#PermitRootLogin yes" 而匹配失败
# 本示例只配置了密码(rootpw / user),没有注入 SSH 公钥,所以必须保留密码登录,
# 否则首次启动后将无法 SSH 进入系统。
cat > /etc/ssh/sshd_config.d/00-hardening.conf <<'EOF'
PermitRootLogin no
PasswordAuthentication yes
EOF
# 上线后请尽快注入 SSH 公钥并把 PasswordAuthentication 改为 no(改用密钥认证)。
# 如果在 Kickstart 中已通过 %post 写入 ~/.ssh/authorized_keys,可直接设为 no。
# 安装 EPEL 仓库
dnf install -y epel-release
# 创建自定义目录
mkdir -p /opt/apps
echo "Post-installation script completed." >> /root/ks-post.log
%end
从网络安装
url --url="https://repo.almalinux.org/almalinux/9/BaseOS/x86_64/os/"
从本地光盘安装
cdrom
从 NFS 安装
nfs --server=192.168.1.100 --dir=/exports/almalinux9
DHCP 配置
network --bootproto=dhcp --device=ens18 --onboot=on
静态 IP 配置
network --bootproto=static --device=ens18 --ip=192.168.1.10 --netmask=255.255.255.0 --gateway=192.168.1.1 --nameserver=8.8.8.8,8.8.4.4 --onboot=on
设置主机名
network --hostname=server01.example.com
自动分区(LVM)
clearpart --all --initlabel
autopart --type=lvm
自动分区(普通分区)
clearpart --all --initlabel
autopart --type=plain
手动分区示例
clearpart --all --initlabel --drives=sda
part /boot --fstype=xfs --size=1024 --ondisk=sda
part /boot/efi --fstype=efi --size=512 --ondisk=sda
part pv.01 --size=1 --grow --ondisk=sda
volgroup vg_sys pv.01
logvol / --fstype=xfs --name=lv_root --vgname=vg_sys --size=20480
logvol /home --fstype=xfs --name=lv_home --vgname=vg_sys --size=10240
logvol /var --fstype=xfs --name=lv_var --vgname=vg_sys --size=10240
logvol /var/log --fstype=xfs --name=lv_log --vgname=vg_sys --size=5120
logvol swap --name=lv_swap --vgname=vg_sys --size=4096

Kickstart 中的密码应使用加密格式。使用以下命令生成:

生成加密密码
python3 -c 'import crypt; print(crypt.crypt("YourPassword", crypt.mksalt(crypt.METHOD_SHA512)))'

或使用 openssl:

使用 openssl 生成加密密码
openssl passwd -6
最小安装加额外包
%packages
@^minimal-environment
vim-enhanced
wget
curl
net-tools
-iwl*firmware
%end
  • @^minimal-environment — 安装环境组(最小化安装)
  • @standard — 软件包组
  • -iwl*firmware — 前缀 - 表示排除该包
post 脚本示例
%post --log=/root/ks-post.log
#!/bin/bash
# 配置额外的 YUM 仓库
dnf install -y epel-release
# 安装监控代理
dnf install -y zabbix-agent
# 配置 NTP
sed -i 's/^pool.*iburst/server ntp.aliyun.com iburst/' /etc/chrony.conf
systemctl enable chronyd
# 禁用不需要的服务
systemctl disable postfix
%end
post 脚本 — 使用非 chroot 环境
%post --nochroot --log=/mnt/sysimage/root/ks-nochroot.log
#!/bin/bash
# 在非 chroot 环境中执行(可以访问安装介质)
cp /run/install/repo/extras/custom.conf /mnt/sysimage/etc/custom.conf
%end
pre 脚本示例(安装前执行)
%pre --log=/tmp/ks-pre.log
#!/bin/bash
# 根据磁盘大小决定分区方案
DISK_SIZE=$(lsblk -dn -o SIZE -b /dev/sda | awk '{print int($1/1024/1024/1024)}')
if [ $DISK_SIZE -gt 500 ]; then
echo "Large disk detected: ${DISK_SIZE}GB"
fi
%end
安装 HTTP 服务器并托管 Kickstart 文件
sudo dnf install httpd -y
sudo cp /root/my-ks.cfg /var/www/html/ks.cfg
sudo systemctl start httpd
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload

在安装引导时,添加引导参数:

安装引导参数
inst.ks=http://192.168.1.100/ks.cfg
将 Kickstart 文件复制到 USB 驱动器
sudo mount /dev/sdc1 /mnt
sudo cp /root/my-ks.cfg /mnt/ks.cfg
sudo umount /mnt

引导参数:

从 USB 读取 Kickstart
inst.ks=hd:sdc1:/ks.cfg
从 NFS 读取 Kickstart
inst.ks=nfs:192.168.1.100:/exports/ks.cfg

PXE (Preboot eXecution Environment) 允许通过网络引导安装,结合 Kickstart 实现完全自动化的网络部署。

  • DHCP 服务器 — 分配 IP 地址并指向 TFTP 服务器
  • TFTP 服务器 — 提供引导文件(pxelinux.0 / GRUB)
  • HTTP/FTP 服务器 — 提供安装源和 Kickstart 文件
安装 PXE 所需的服务
sudo dnf install dhcp-server tftp-server syslinux httpd -y
配置 TFTP 目录
sudo mkdir -p /var/lib/tftpboot/pxelinux.cfg
sudo cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
sudo cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot/
sudo cp /usr/share/syslinux/ldlinux.c32 /var/lib/tftpboot/
sudo cp /usr/share/syslinux/libutil.c32 /var/lib/tftpboot/
/var/lib/tftpboot/pxelinux.cfg/default 配置示例
DEFAULT menu.c32
PROMPT 0
TIMEOUT 100
LABEL almalinux9
MENU LABEL Install AlmaLinux 9
KERNEL vmlinuz
APPEND initrd=initrd.img inst.ks=http://192.168.1.100/ks.cfg

PXE 的详细配置超出了本文范围,完整部署建议参考各发行版的官方文档。

在正式部署前,强烈建议使用虚拟机进行测试:

使用 virt-install 测试 Kickstart 安装
sudo virt-install \
--name ks-test \
--ram 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/ks-test.qcow2,size=20 \
--location https://repo.almalinux.org/almalinux/9/BaseOS/x86_64/os/ \
--initrd-inject=/root/my-ks.cfg \
--extra-args="inst.ks=file:/my-ks.cfg console=ttyS0" \
--nographics
安装完成后查看虚拟机
sudo virsh list --all
连接到虚拟机控制台
sudo virsh console ks-test
检查安装后的 Kickstart 日志
cat /root/ks-post.log
确认分区布局
lsblk
确认已安装的软件包
rpm -qa | wc -l
  1. 版本控制 Kickstart 文件 — 使用 Git 管理所有 ks.cfg 文件
  2. 使用加密密码 — 永远不要在 ks.cfg 中存储明文密码
  3. 先在虚拟机中测试 — 每次修改后都在虚拟机中验证
  4. 使用 ksvalidator 检查语法 — 避免语法错误导致安装失败
  5. 利用 %post 脚本 — 将安装后配置自动化,减少手动操作
  6. 记录日志 — 在 %post 中使用 --log 参数记录执行日志
  7. 模块化配置 — 可以使用 %include 引入其他配置文件片段