Kickstart 无人值守安装
Kickstart 是 EL 系发行版提供的自动化安装技术,通过一个配置文件(ks.cfg)预定义所有安装选项,实现完全无人值守的操作系统部署。本文将介绍 Kickstart 的工作原理、配置文件结构、常用指令、从现有系统生成配置以及结合 PXE 的网络引导安装。
什么是 Kickstart
Section titled “什么是 Kickstart”传统安装需要管理员在安装界面逐步选择选项(语言、时区、分区、软件包等)。Kickstart 将所有这些选项预先写入一个文本文件,安装程序(Anaconda)读取该文件后自动完成全部安装过程。
核心优势:
- 无需人工干预,适合大规模批量部署
- 配置可版本控制,确保一致性
- 支持自定义脚本(pre/post),实现安装后自动配置
- 可通过 HTTP、FTP、NFS 或本地媒体提供
从现有安装生成 Kickstart 文件
Section titled “从现有安装生成 Kickstart 文件”每次安装完成后,Anaconda 会自动生成一个 Kickstart 文件,记录本次安装的所有选项:
cat /root/anaconda-ks.cfg这个文件可以作为模板,根据需要修改后用于后续安装。
cp /root/anaconda-ks.cfg /root/my-ks.cfg使用 Kickstart Generator
Section titled “使用 Kickstart Generator”也可以使用 Red Hat 提供的在线 Kickstart Generator 工具(pykickstart)来生成配置:
sudo dnf install pykickstart -yksvalidator /root/my-ks.cfgks.cfg 配置文件结构
Section titled “ks.cfg 配置文件结构”Kickstart 配置文件分为三个部分,按顺序排列:
- 命令部分 — 安装选项(必选和可选指令)
- %packages 部分 — 要安装的软件包
- %pre / %post 脚本部分 — 安装前后执行的脚本
完整配置示例
Section titled “完整配置示例”#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@standardvim-enhancedwgetcurlchronybash-completion%end
# === 安装后脚本 ===%post --log=/root/ks-post.log#!/bin/bash
# 启用常用服务systemctl enable chronydsystemctl 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 noPasswordAuthentication yesEOF# 上线后请尽快注入 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常用指令详解
Section titled “常用指令详解”url --url="https://repo.almalinux.org/almalinux/9/BaseOS/x86_64/os/"cdromnfs --server=192.168.1.100 --dir=/exports/almalinux9network --bootproto=dhcp --device=ens18 --onboot=onnetwork --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=onnetwork --hostname=server01.example.comclearpart --all --initlabelautopart --type=lvmclearpart --all --initlabelautopart --type=plainclearpart --all --initlabel --drives=sdapart /boot --fstype=xfs --size=1024 --ondisk=sdapart /boot/efi --fstype=efi --size=512 --ondisk=sdapart pv.01 --size=1 --grow --ondisk=sdavolgroup vg_sys pv.01logvol / --fstype=xfs --name=lv_root --vgname=vg_sys --size=20480logvol /home --fstype=xfs --name=lv_home --vgname=vg_sys --size=10240logvol /var --fstype=xfs --name=lv_var --vgname=vg_sys --size=10240logvol /var/log --fstype=xfs --name=lv_log --vgname=vg_sys --size=5120logvol swap --name=lv_swap --vgname=vg_sys --size=4096Kickstart 中的密码应使用加密格式。使用以下命令生成:
python3 -c 'import crypt; print(crypt.crypt("YourPassword", crypt.mksalt(crypt.METHOD_SHA512)))'或使用 openssl:
openssl passwd -6%packages 部分
Section titled “%packages 部分”%packages@^minimal-environmentvim-enhancedwgetcurlnet-tools-iwl*firmware%end@^minimal-environment— 安装环境组(最小化安装)@standard— 软件包组-iwl*firmware— 前缀-表示排除该包
%post 脚本
Section titled “%post 脚本”%post --log=/root/ks-post.log#!/bin/bash
# 配置额外的 YUM 仓库dnf install -y epel-release
# 安装监控代理dnf install -y zabbix-agent
# 配置 NTPsed -i 's/^pool.*iburst/server ntp.aliyun.com iburst/' /etc/chrony.confsystemctl enable chronyd
# 禁用不需要的服务systemctl disable postfix
%end%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 脚本
Section titled “%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使用 Kickstart 文件
Section titled “使用 Kickstart 文件”通过 HTTP 服务器提供
Section titled “通过 HTTP 服务器提供”sudo dnf install httpd -ysudo cp /root/my-ks.cfg /var/www/html/ks.cfgsudo systemctl start httpdsudo firewall-cmd --permanent --add-service=httpsudo firewall-cmd --reload在安装引导时,添加引导参数:
inst.ks=http://192.168.1.100/ks.cfg通过 USB 驱动器提供
Section titled “通过 USB 驱动器提供”sudo mount /dev/sdc1 /mntsudo cp /root/my-ks.cfg /mnt/ks.cfgsudo umount /mnt引导参数:
inst.ks=hd:sdc1:/ks.cfg通过 NFS 提供
Section titled “通过 NFS 提供”inst.ks=nfs:192.168.1.100:/exports/ks.cfgPXE 网络引导安装
Section titled “PXE 网络引导安装”PXE (Preboot eXecution Environment) 允许通过网络引导安装,结合 Kickstart 实现完全自动化的网络部署。
PXE 架构组件
Section titled “PXE 架构组件”- DHCP 服务器 — 分配 IP 地址并指向 TFTP 服务器
- TFTP 服务器 — 提供引导文件(pxelinux.0 / GRUB)
- HTTP/FTP 服务器 — 提供安装源和 Kickstart 文件
sudo dnf install dhcp-server tftp-server syslinux httpd -ysudo mkdir -p /var/lib/tftpboot/pxelinux.cfgsudo 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/DEFAULT menu.c32PROMPT 0TIMEOUT 100
LABEL almalinux9 MENU LABEL Install AlmaLinux 9 KERNEL vmlinuz APPEND initrd=initrd.img inst.ks=http://192.168.1.100/ks.cfgPXE 的详细配置超出了本文范围,完整部署建议参考各发行版的官方文档。
使用虚拟机测试 Kickstart
Section titled “使用虚拟机测试 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" \ --nographicssudo virsh list --allsudo virsh console ks-test验证安装结果
Section titled “验证安装结果”cat /root/ks-post.loglsblkrpm -qa | wc -l- 版本控制 Kickstart 文件 — 使用 Git 管理所有 ks.cfg 文件
- 使用加密密码 — 永远不要在 ks.cfg 中存储明文密码
- 先在虚拟机中测试 — 每次修改后都在虚拟机中验证
- 使用 ksvalidator 检查语法 — 避免语法错误导致安装失败
- 利用 %post 脚本 — 将安装后配置自动化,减少手动操作
- 记录日志 — 在 %post 中使用
--log参数记录执行日志 - 模块化配置 — 可以使用
%include引入其他配置文件片段