跳转到内容
搜索 RunEntLinux 文档

仅搜索 RunEntLinux 通用文档,各发行版文档使用各自的搜索入口。

    浏览当前文档目录

    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 # 装 EL10 时改为 RHEL10,并把下面的树换成 almalinux/10
    # === 安装方式 ===
    # 使用网络安装源(EL9;EL10 换成 /almalinux/10/BaseOS/x86_64/os/,路径已实测 200)
    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
    从网络安装
    # EL9
    url --url="https://repo.almalinux.org/almalinux/9/BaseOS/x86_64/os/"
    # EL10
    url --url="https://repo.almalinux.org/almalinux/10/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 引入其他配置文件片段