Linux 部分 PXE 引导选项和 Kickstart 选项的配置

常见引导选项

Linux 引导选项是内核启动时传递给 Linux kernel 的参数,就是系统开机时可以修改 GRUB 的界面。

下边是 UEFI 模式的 GRUB 界面,引导选项在 linux 那一行添加就行。

image-20260516005527310

设置镜像安装源

设置镜像安装源有如下几个参数:

  • inst.repo=
  • inst.addrepo=
  • inst.stage2=
  • inst.dd=

这里的 inst.stage2= 不做过多介绍。

关于 inst.stage2=,RHEL 镜像里有一个 images/install.imginst.stage2= 负责指定它的位置,inst.stage2= 通过 ISO 镜像根目录下的 .treeinfo 文件查找 install.img,如果没有 .treeinfo,则默认查找 images/install.img

[root@pxe ~]# ls /mnt/iso/.treeinfo
/mnt/iso/.treeinfo
[root@pxe ~]# grep -C1 install.img /mnt/iso/.treeinfo
images/efiboot.img = sha256:83f57635a14645c2410571b7f376503c4b373357e024d7bb372f46b3df9cd8de
images/install.img = sha256:bb1237598c9e508318eb92019bba9e5c84af14946c04d9978a81388e3f19f117
images/pxeboot/initrd.img = sha256:3ced31fac810242419b93d74f32f7f55d6dd607d3b50b4c5663ad03be2fafa02
--
[stage2]
mainimage = images/install.img

如果 inst.repo= 指定的安装源中有 .treeinfoinstall.img,则 inst.stage2= 可以忽略。

更多请参考:https://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/8/html/performing_an_advanced_rhel_8_installation/installation-source-boot-options_kickstart-and-advanced-boot-options

inst.repo=

inst.repo=Anaconda 安装程序的启动参数。它的作用是指定安装源(Installation Source)的位置。

它告诉安装器:

  • 去哪里找 RPM 包
  • 去哪里找 BaseOS
  • 去哪里找 AppStream
  • 如果存在 .treeinfo,也会找到 stage2

inst.repo= 支持如下协议:

# HTTP / HTTPS
inst.repo=http://192.168.255.254/iso/Rocky8.10/
inst.repo=https://192.168.255.254/iso/Rocky8.10/

# NFS
inst.repo=nfs:192.168.255.254:/export/rhel8

# 本地 ISO
inst.repo=cdrom

# FTP
inst.repo=ftp://<username>:<password>@192.168.255.254/ftp/rhel8

# 可挂载设备(HDD 或 USB 盘)
inst.repo=hd:/dev/sda1:/rhel8
# 对于可挂载设备还有个更好的处理方式
inst.repo=hd:LABEL=Rocky-8-10-x86_64-dvd

这里我只用过 HTTP 和 USB,其他的没测试过写的对不对。

对于 CDROM 和可挂载设备,可以使用如下三种设备名称:

[root@pxe ~]# blkid /dev/sr0
/dev/sr0: BLOCK_SIZE="2048" UUID="2024-05-27-14-12-59-00" LABEL="Rocky-8-10-x86_64-dvd" TYPE="iso9660" PTUUID="a4c29e7f" PTTYPE="dos"
[root@remote-host ~]# blkid /dev/vda3
/dev/vda3: UUID="a16c8857-5a72-40c7-a096-75e9bf3b7b8f" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="7c0612c7-a703-4a04-ac1a-120500bac8b7"
  • 内核设备名称:/dev/sda1 或者 sdb2
  • 文件系统标签:LABEL=Rocky-8-10-x86_64-dvd
  • 文件系统 UUID:UUID=a16c8857-5a72-40c7-a096-75e9bf3b7b8f

非字母数字字符必须使用 \xNN 表示,其中 NN 是字符对应的十六进制代码。例如: \x20 是一个空格 (" ")

inst.addrepo=

用于添加额外的 YUM 存储库:

# HTTP / HTTPS
inst.addrepo=REPO_NAME,[http,https,ftp]://<host>/<path>

# NFS
inst.addrepo=REPO_NAME,nfs://<server>:/<path>

# 安装环境中的仓库源
inst.addrepo=REPO_NAME,file://<path>

# 磁盘
inst.addrepo=REPO_NAME,hd:<device>:<path>

REPO_NAME 表示存储库的名称。

inst.dd=

inst.dd= 主要用于驱动的安装和更新,比如:要安装的系统缺少相应 RAID 卡的驱动,此时可以通过 inst.dd= 来安装额外的 RAID 卡驱动。

inst.dd= 的格式和 inst.repo= 类似,指定到驱动(ISO 文件)所在目录。

inst.dd=http://192.168.255.254/drivers/
inst.dd=hd:LABEL=DRIVERDISK/drivers/

设置网络

设置 IP 地址

这个设置地址虽然是系统安装阶段设置的,但是配置也可以继承到安装完成的系统,前提是没有其他配置干预。

通过 ip= 来设置网络配置。

ip= 有如下格式:

引导选项格式 配置方法
ip=method 自动配置任意接口
ip=interface:method 自动配置特定的接口
ip=ip::gateway:netmask:hostname:interface:none 静态配置,例如, IPv4:ip=192.168.10.100::192.168.10.1:255.255.255.0:server.example.com:enp1s0:none IPv6: ip=[2001:db8::100]::[2001:db8::1]:64:server.example.com:enp1s0:none
ip=ip::gateway:netmask:hostname:interface:method:mtu 自动配置特定接口并进行覆盖

上述字段(ip= 后的内容)的解释:

  • method:设置网卡自动获取地址模式

    参数可以如下任意一个

    • dhcp:通过 DHCp 服务自动获取(IPV4)
    • dhcp6:通过 DHCP 服务自动获取(IPV6)
    • auto6:通过路由器广播自动生成 IPv6
    • ibft:iSCSI Boot Firmware Table (iBFT)
  • interface:网卡名

  • ip:IP 地址

  • gateway:网关

  • netmask:子网掩码

  • hostname:主机名

设置 DNS

通过 nameserver= 设置 DNS。

# IPV4,多个 DNS 时写多个
nameserver=8.8.8.8 nameserver=8.8.4.4

# IPV6,不能加中括号
nameserver=2001:4860:4860::8888

这个 DNS 是安装过程中使用的 DNS,安装后的系统里不包含这个配置。

设置引导网卡

有多个网卡时(多个网卡时建议使用),通过 bootdev= 设置引导网卡。

bootdev=ens192

Kickstart 引导选项

通过 inst.ks= 来设置 Kickstart 文件的位置,格式和 inst.repo= 类似。

inst.ks=http://192.168.255.254/ks/rhel_8_UEFI.ks

强制硬盘分区为 GPT

通过 inst.gpt 来强制设置硬盘分区为 GPT 分区。

inst.gpt

Kickstart 文件常见配置

这里的 Kickstart 文件配置当参考就行,完整的配置可以看文底的链接。

一个简单的 Kickstart 文件的获取方式是先装一个 RHEL 系统,安装后可以在 /root 下找到 anaconda-ks.cfg 文件,然后根据需要修改这个文件。

Anaconda 安装流程

  1. 解析 Kickstart
  2. 执行 %pre 脚本
  3. 磁盘分区 / LVM 创建
  4. 挂载目标系统到 /mnt/sysroot
  5. 执行 %pre-install 脚本
  6. 安装 RPM 包
  7. 系统安装完成
  8. 执行 %post 脚本

安装模式

安装模式有如下几种:

  • graphical:图形模式下执行安装。这是默认值。
  • text:在文本模式下执行 Kickstart 安装。
  • cmdline:完全非互动的命令行模式执行安装。任何互动提示都会终止安装。

graphicaltext 带有 --non-interactive 选项,用于强制设置安装过程中不允许人工修改任何选项。

graphical --non-interactive
text --non-interactive

安装源及额外存储库配置

安装源配置

安装源有如下几种配置:

  • url:使用 FTP、HTTP 或者 HTTPS 协议从远程服务器上的安装树镜像进行安装
  • cdrom:使用第一个光驱进行安装
  • harddrive:通过本地硬盘安装,一般是 U 盘
  • nfs:安装源来自 NFS
  • liveimg:系统安装通过将一个系统镜像复制到本地硬盘来部署,而非默认的 RPM 部署
  • ostreesetup:基于 OStree 的部署
  • rhsm:从红帽 CDN 注册并安装 RHEL

这里主要介绍 urlharddrive,其他的没用过。

url

url 选项:

  • --url=FROM – 指定要从中安装的 HTTPHTTPSFTPFILE位置。
  • --mirrorlist= – 指定要从中安装的镜像 URL。
  • --proxy= – 指定在安装过程中要使用的 HTTPHTTPS 或者 FTP 代理。
  • --noverifyssl – 连接到 HTTPS 服务器时禁用 SSL 验证。
  • --metalink=URL – 指定要从中安装的 metalink URL。变量替换用于 URL 中的 $releasever$basearch
url --url=http://server/path
url --url=ftp://username:password@server/path
url --url=nfs:server:/path
url --url=hd:LABEL=RHELUSB:/path

这个应该和之前的 inst.repo 格式相同。

harddrive

harddrive 是从本地硬盘查找安装源,支持的文件系统有:ext2, ext3, ext4, vfat, 或 xfs

harddrive 选项:

  • --partition= – 要从中安装的分区(如 sdb2)。
  • --dir= – 包含安装树 variant 目录或完整安装 DVD 的 ISO 镜像的目录。
harddrive --partition=LABEL=<label> --dir=<path>

设置安装时使用的软件存储库

repo 命令可以设置软件仓库。

repo --name="AppStream" --baseurl=http://192.168.255.254/iso/Rocky8.10/AppStream
  • --name:存储库的 ID,必填
  • --baseurl=:存储库的 URL
  • --mirrorlist=:指向存储库镜像列表的 URL
  • --metalink=:存储库的 metalink 的 URL
  • --install:配置的仓库保留到安装后的系统中(默认存储库只在安装环境中生效)
  • --cost=:当多个 repo 都提供同一个包时设置优先级,cost 越小越优先
  • --excludepkgs=:排除某些安装包,用逗号(,)分隔
  • --includepkgs=:只允许安装特定包
  • --proxy=:添加代理
  • --noverifyssl:禁用 SSL 验证

更新额外的驱动

Kickstart 支持安装过程中更新额外的驱动,通过 driverdisk 命令。

driverdisk [partition|--source=url|--biospart=biospart]

driverdisk 有如下选项:

  • partition:指定一个磁盘分区及其路径
  • --source=url:驱动的 URL
  • --biospart=biospart:包含驱动程序磁盘(如 82p2)的 BIOS 分区。
driverdisk --source=ftp://path/to/dd.img
driverdisk --source=http://path/to/dd.img
driverdisk --source=nfs:host:/path/to/dd.img
driverdisk LABEL=DriverDisk:/e1000.rpm

安装完成后操作

安装完成后有如下操作:

  • poweroff:安装完成后关机

  • reboot:安装完成后重启

    reboot 有如下选项:

    • --eject:在重新启动前尝试弹出可引导介质(DVD、USB 或其他介质)
reboot

安装配置

磁盘管理

关于硬盘的 LUKS 加密我没有写,因为没用过,如果想了解 LUKS 的可以看文底链接。

自动分区

autopart 可以自动分区,这个用的应该很少,就写几个选项吧,更多的参考文底链接。

选项:

  • --type=:要使用的预定义自动分区方案之一。可接受以下值:

    • lvm:LVM 分区方案
    • plain:没有 LVM 的常规分区
    • thinp :LVM Thin Provisioning 分区方案
  • --fstype=:选择其中一个可用文件系统类型。可用值包括 ext2ext3ext4xfsvfat。默认的文件系统是 xfs

  • --nohome:禁用自动创建 /home 分区

  • --nolvm:不使用 LVM 进行自动分区。这个选项等同于 --type=plain

  • --noboot:不创建 /boot 分区

  • --noswap:不创建交换分区

指定引导方式(包含添加内核参数)

bootloader 可以设置引导方式。

这个说是必需的,但是 Rocky 8.10 装完的 Kickstart 里并没有这个命令,所以它应该是可以自动识别的,估计用到它的时候就是添加额外的内核启动参数了。

选项:

  • --append=:添加内核启动参数,多个参数用空格分隔

  • --boot-drive=:指定引导装载程序应写入的驱动器

  • --driveorder=:指定哪个驱动器最先在 BIOS 引导顺序中

  • --location=:指定引导记录的写入位置。有效值如下:

    • mbr – 默认选项.具体要看驱动器是使用主引导记录(MBR)还是 GUID 分区表(GPT)方案:

    在 GPT 格式的磁盘中,这个选项会在 BIOS 引导分区中安装 stage 1.5 引导装载程序。

    在使用 MBR 格式化的磁盘中,会在 MBR 和第一个分区之间的空白空间中安装 stage 1.5。

    • partition – 在包含内核的分区的第一个扇区安装引导装载程序。

    • none – 不安装引导装载程序。

    在大多数情况下,不需要指定这个选项。

  • --nombr:不在 MBR 中安装引导加载器

  • --password=:为 GRUB2 设置密码,用户名为 root

  • --iscrypted:添加这个参数表示密码是加密密码(可以通过 grub2-mkpasswd-pbkdf2 生成加密密码)

    [root@study ~]# grub2-mkpasswd-pbkdf2
    Enter password:
    Reenter password:
    PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.9F38F2E9382219C202E81A9FAD5C439EFBFDACFAB92429BF6A0FA3A1AA54EAAC0AE0C41BFC658CDD41A245F1D9F72D8EC773415D9E9CBC2C7F295D1165EF7637.35D81C9DAAA01D21F16326C931053CEFD248F7784E8AC7E79B0B1C31E535EE664B9EF3F62B0C4BA87E1A2263693F6F3965449DF5C63E3B016435441E29FE4167

示例:

bootloader --append="enforcing=0 audit=0" --iscrypted --password=grub.pbkdf2.sha512.10000.9F38F2E9382219C202E81A9FAD5C439EFBFDACFAB92429BF6A0FA3A1AA54EAAC0AE0C41BFC658CDD41A245F1D9F72D8EC773415D9E9CBC2C7F295D1165EF7637.35D81C9DAAA01D21F16326C931053CEFD248F7784E8AC7E79B0B1C31E535EE664B9EF3F62B0C4BA87E1A2263693F6F3965449DF5C63E3B016435441E29FE4167

清理分区

clearpart 命令可以清理旧磁盘分区。

选项:

  • --all:删掉系统中的所有分区(使用的时候会清理所有数据,建议配合 --drives= 使用)

  • --drives=:指定要清理分区的磁盘

    它既可以指定设备名如:sda,也可以指定 /dev/disk/ 下的路径,方法:clearpart --drives=disk/by-id/scsi-...

  • --initlabel:为磁盘创建一个磁盘标签,对于 x86 架构,使用 msdos,建议配合 --drives= 使用

clearpart --all --initlabel --drives=sda

忽略磁盘

ignoredisk 可以忽略某些磁盘。

选项:

  • --drives=driveN,…:忽略哪些磁盘,逗号分隔
  • --only-use=driveN,…:使用哪些磁盘,逗号分隔

两个选项二选一。

ignoredisk --only-use=sda
ignoredisk --only-use==/dev/disk/by-id/dm-uuid-mpath-...

标准分区管理

partpartition 命令来创建分区。

part|partition mntpoint [OPTIONS]

选项:

  • mntpoint:挂载分区的位置

    • /path:挂在目录,如 /

    • swap:设置为交换分区

    如果要自动分配 swap,可以添加 --recommended 选项

    如果要系统支持休眠,可以添加 --hibernation 选项

    • pv.id:分区用于逻辑卷

    • biosboot:BIOS 启动要使用 GPT 分区表时创建的分区

    • /boot/efi:EFI 系统分区

  • --ondisk= / --ondrive=:创建新分区,并指定在哪个磁盘上创建

  • --fstype=:文件系统类型,有效值为 xfsext2ext3ext4swapvfatefibiosboot,如果是逻辑卷还有 lvmpv

  • --size=:分区大小

  • --grow:自动使用剩余空间

  • --label=:单个分区的文件系统标签

  • --maxsize=:使用 --grow 时,分区最大多少,单位 MiB

  • --recommended:自动确定分区的大小

  • --mkfsoptions=:文件系统参数,类似传递给 mkfs 命令的参数(例如:--fstype=xfs --mkfsoptions="-m bigtime=0,finobt=0"

  • --fsoptions=:设置 /etc/fstab 中的挂在参数,/etc/fstab 第四列的参数(默认是 defaults

  • --fsprofile=:用于 ext 系文件系统的 profile,配置文件为 /etc/mke2fs.conf

  • --noformat:不要格式化分区,配合 --onpart 使用

  • --onpart= / --usepart=:使用已有分区,不创建新分区

  • --asprimary:适用于 MBR 分区表,设置分区为主分区

  • --onbiosdisk:强制按 BIOS 识别顺序选磁盘

part /boot/efi --fstype="efi" --ondisk=sda --size=1024 --fsoptions="umask=0077,shortname=winnt"
part / --fstype="xfs" --ondisk=sda --grow
part /boot --fstype="xfs" --ondisk=sda --size=1024

逻辑卷管理

逻辑卷依赖 part 命令来创建分区。

管理卷组

volgroup 可以管理卷组。

volgroup name [OPTIONS] [partition]

选项:

  • name:卷组名称,必填
  • partition:要添加到卷组的物理分区
  • --pesize=:LVM 里最小的分配单位,单位 KiB,最小 1024(1 MiB),默认 4096(4 MiB)
  • --reserved-space=:预留一部分空间,不分配给任何 LV,单位 MiB
  • --reserved-percent=:预留一部分空间,不分配给任何 LV,按百分比预留
  • --noformat:使用现有卷组而不对其进行格式化
  • --useexisting:使用现有卷组并重新格式化它
管理逻辑卷

logvol 可以设置逻辑卷。

logvol mntpoint --vgname=name --name=name [OPTIONS]

选项:

  • mntpoint:设置挂载点,必填

    • /path:挂在目录,如 /

    • swap:设置为交换分区

    如果要自动分配 swap,可以添加 --recommended 选项

    如果要系统支持休眠,可以添加 --hibernation 选项

  • --vgname=name:卷组名称

  • --name=name:逻辑卷名称

  • --fstype=:为逻辑卷设置文件系统类型。有效值为 xfsext2ext3ext4swapvfat

  • --label=:设置文件系统标签

  • --grow:自动使用剩余空间

  • --size=:逻辑卷大小,单位 MiB,和 --percent= 互斥

  • --percent=:使用剩余空间的百分比

  • --maxsize=:逻辑卷的最大值

  • --fsoptions=:设置 /etc/fstab 中的挂在参数,/etc/fstab 第四列的参数(默认是 defaults

  • --mkfsoptions=:文件系统参数,类似传递给 mkfs 命令的参数(例如:--fstype=xfs --mkfsoptions="-m bigtime=0,finobt=0"

  • --fsprofile=:用于 ext 系文件系统的 profile,配置文件为 /etc/mke2fs.conf

  • --recommended:自动分配空间大小

  • --thinpool:创建一个 thin pool(精简池),挂载点要使用 none

  • --metadatasize=size:指定 thin pool 元数据大小,单位 MiB

  • --chunksize=size:thin pool 的块大小,单位 KiB

  • --thin:在 thin pool 里创建 thin 逻辑卷(需要使用 --poolname

  • --poolname=name:指定 thin 卷属于哪个 thin pool,必须配合 --thin

  • --profile=name:指定 LVM profile,LVM profile 在 /etc/lvm/profile/

  • --cachepvs=:指定哪些 PV 作为缓存设备(如:sdb),多个逗号分隔

  • --cachesize=:缓存大小,单位 MiB,需要配合 --cachepvs=

  • --cachemode=:缓存模式,有 writebackwritethrough 两种

因为我不怎么用逻辑卷装系统,所以这里只列出一个用逻辑卷安装系统后的 Kickstart 配置:

part pv.658 --fstype="lvmpv" --ondisk=sda --size=19453
part biosboot --fstype="biosboot" --ondisk=sda --size=2
part /boot --fstype="xfs" --ondisk=sda --size=1024
volgroup rl --pesize=4096 pv.658
logvol / --fstype="xfs" --size=19452 --name=root --vgname=rl

part /boot/efi --fstype="efi" --ondisk=sda --size=1024 --fsoptions="umask=0077,shortname=winnt"
part pv.658 --fstype="lvmpv" --ondisk=sda --size=18430
part /boot --fstype="xfs" --ondisk=sda --size=1024
volgroup rl --pesize=4096 pv.658
logvol none --size=14708 --thinpool --metadatasize=16 --chunksize=64 --name=pool00 --vgname=rl
logvol / --fstype="xfs" --size=14708 --label="test" --thin --poolname=pool00 --name=root --vgname=rl

系统设置

自动同意用户协议(图形化安装的系统)

图形化安装的 RHEL 系统会有一个同意协议的过程,通过 EULA 命令可以自动同意协议。

# eula 只有一个选项,必加
eula --agreed

跳过系统初始化(图形化安装的系统)

图形化安装的系统会有一个 Initial Setup 的向导(第一次登录桌面的点几下才能关闭的那个页面),通过 firstboot 命令可以跳过。

有如下选项:

  • --enable / --enabled:系统第一次启动时会进入 Initial Setup 向导。

  • --disable / --disabled:系统第一次启动时不会运行 Initial Setup。

  • --reconfig:在重新配置模式下运行 Initial Setup。

    这个模式比 --enable强制,它会额外打开:

    • root 密码配置
    • 时间和日期
    • 网络和主机名

    即使 Kickstart 已经配置过。

firstboot --enabled
firstboot --disabled
firstboot --reconfig

设置防火墙

安装好的 RHEL 系统默认开启 Firewall 防火墙,通过 firewall 命令可以关闭。

# 开启
firewall --enabled
# 关闭
firewall --disabled

设置键盘布局

keyboard 命令可以设置键盘布局。

选项:

  • --vckeymap=:控制 虚拟控制台(VConsole) 的键盘布局,影响 TTY(Ctrl+Alt+F2 那种纯文本界面)

    有效名称与 /usr/lib/kbd/keymaps/xkb/ 目录中的文件列表对应,没有 .map.gz 扩展名

  • --xlayouts=:控制 X/Wayland 图形界面的键盘布局

  • --switch=:可切换语言的列表

一般只用一个英文字母的布局:

keyboard --xlayouts='us'

以下示例使用 --xlayouts= 选项设置了两种键盘布局 (English (US)Czech (qwerty)),并允许使用 Alt+Shift 在它们之间切换:

keyboard --xlayouts=us,'cz (qwerty)' --switch=grp:alt_shift_toggle

语言设置

lang 可以设置语言。

可选选项:

  • --addsupport=:添加对其他语言的支持
lang en_US.UTF-8
lang en_US.UTF-8 --addsupport=zh_CN.UTF-8

设置 root 密码

通过 rootpw 命令设置 root 密码。

选项:

  • --iscrypted:后加已加密的密码
  • --plaintext:后加纯文本密码
  • --lock:锁定 root 用户的登录
rootpw --iscrypted $6$kg4JgovHBe.HpdX4$gjR1tX/nMUHH4JM0gnHhVz3mfDKmPjguNW3fT4S4Bjn0kaEEArjHA73fZAZAXFm/khvUX7A90PwfD5YojHQva0

通过如下命令创建加密密码:

[root@study ~]# openssl passwd -6
Password:
Verifying - Password:
$6$9viGzphaddyBmMXG$uKud3onWg5PFoI0i1Q5ZVHLrDvLEMwaS1pNVxJJxzxJt1PLEuuOjyFdfDsU2h/PeQ3SjBLvfo0AnLR/.26Emw1

[root@study ~]# python3 -c 'import crypt; print(crypt.crypt("redhat", crypt.mksalt(crypt.METHOD_SHA512)))'
$6$vJHHbJxEC3CeVcSR$WhXO5J5tBJuCdzVPJPy2L25GKnSpG4gMQ50zTKANmNEipB1JXkTyudaL8jOw7LGxduqUCk8nGQxzItT/Q7UrU0

设置 SELinux

selinux 命令可以设置 SELinux。

选项:

  • --enforcing:使用默认目标策略启用 SELinux。

  • --permissive:根据 SELinux 策略输出警告,但并不强制执行该策略。

  • --disabled:在系统上完全禁用 SELinux。

selinux --disabled

设置时区

timezone 命令可以设置时区。

选项:

  • --UTC(早期使用)/ --isUtc:如果存在,系统假定硬件时钟被设置为 UTC(格林威治 Mean)时间。
  • --nontp:禁用 NTP 服务自动启动。
  • --ntpservers=:指定用作没有空格的逗号分隔列表的 NTP 服务器列表。
timezone Asia/Shanghai --isUtc --nontp

设置 Kdump

%addon com_redhat_kdump 用于设置 Kdump。

选项:

  • --enable:在安装的系统中启用 kdump

  • --disable:在安装的系统中禁用 kdump

  • --reserve-mb=:要为 kdump 保留的内存量,单位为 MiB

# 设置自动内存,默认
%addon com_redhat_kdump --enable --reserve-mb='auto'

%end

# 设置固定内存
%addon com_redhat_kdump --enable --reserve-mb='160M'

%end

软件包管理

Kickstart 通过 %packages 来设置要安装哪些软件包。

%packages 有如下要求:

  • 安装环境用 @^ 开头
  • 软件包组用 @ 开头
  • 单个软件包一行一个,支持 * 通配符
  • 排除软件包或软件包组就以 - 开头
  • 最后以 %end 结尾
%packages
@^minimal-environment
kexec-tools
@System Tools
vim
bash-completion

%end

%packages 还支持一些参数:

  • --default:安装默认软件包组,即交互安装时什么都不改的默认选择
  • --ignoremissing:忽略缺失的软件包 / 组 / 模块,而非停止安装来询问是否继续安装
  • --multilib:允许 64 位系统安装 32 位包
  • --excludedocs:不安装文档
  • --instLangs=:限制语言包
  • --excludeWeakdeps:禁用弱依赖
  • --nocore:不安装 @Core 组(应该不会用到)
  • --retries=:安装时下载重试次数,默认 10
  • --timeout=:安装时下载超时秒数,默认 30

针对软件包组:

  • --nodefaults:只安装组的强制软件包,而不是默认选择
  • --optional:除了安装默认选择外,还要安装在 *-comps-repository.architecture.xml 文件中的组定义中标记为可选的软件包

关于软件包组选项,说的是 YUM 源的 repodata 目录下会有相关文件 repository/repodata/*-comps-repository.architecture.xml 记录软件包的安装策略:

  • mandatory:总是安装
  • default:如果没有被排除则安装
  • optional:在被指定的时候安装

不同的软件包组中软件包的策略不同。

# tcpdump 在不同软件包组中的安装策略
[root@study repodata]# pwd
/mnt/iso/AppStream/repodata
[root@study repodata]# grep tcpdump ec2fa1982439f4b0ca7dc86f882f18657457a2d42f06ac6718298c7f7528df43-comps-AppStream.x86_64.xml
      <packagereq type="default">tcpdump</packagereq>
      <packagereq type="mandatory">tcpdump</packagereq>
      <packagereq type="default">tcpdump</packagereq>

[root@study repodata]# grep plymout ec2fa1982439f4b0ca7dc86f882f18657457a2d42f06ac6718298c7f7528df43-comps-AppStream.x86_64.xml
      <packagereq type="default">plymouth</packagereq>
      <packagereq type="mandatory">plymouth-system-theme</packagereq>
      <packagereq type="mandatory">plymouth</packagereq>
      <packagereq type="default">plymouth</packagereq>
      <packagereq type="mandatory">plymouth</packagereq>

服务管理

services 设置服务开机自启或开机不自启。

选项:

  • --disabled=:禁用在逗号分隔列表中给出的服务
  • --enabled=:启用逗号分隔列表中给出的服务
# 不能包含空格,有空格的话只有第一个空格之前的内容生效
services --disabled=auditd,cups,smartd,nfslock

用户管理

创建用户

user 可以创建新的用户。

选项:

  • --name=:用户名,必填
  • --password=:密码,可以写明文,也可以写加密后的密码
  • --iscrypted:添加该选项表示密码已加密
  • --plaintext:添加该选项表示密码是明文
  • --uid= / --gid=:UID 和 GID
  • --homedir=:用户的主目录,默认使用 /home/<username>
  • --groups=:额外的组
  • --lock:锁定用户
  • --shell=:设置用户使用的 SHELL
  • --GECOS=:添加 GECOS 信息
user --name=admin --uid=5000 --gid=5000 --groups=group1 --iscrypted --password=$6$mpeKZsxTA6rL7a45$BeocFR1Sx2CDcFg9NbpL4L7KvCEGxVKq.uGFuqcAuPhHs78/0t10wPDfY64zKWLqNx/jzIrZDZopObqeccpN5.

创建用户组

group 创建用户组。

选项:

  • --name=:用户组名称,必填
  • --gid=:用户组 ID
group --name group1

添加 SSH 密钥

sshkey 设置 SSH 密钥。

选项:

  • --username:要添加密钥的用户名
sshkey --username=admin "ssh-rsa AAAAB3...HGt9o0= root@study"

网络管理

network 用于设置网络。

部分选项:

  • --activate:激活网卡
  • --no-activate:不激活网卡
  • --hostname=:主机名
  • --bootproto=:设置网卡模式(用于 IPV4 配置)。dhcpbootpibftstatic 之一,默认为 dhcp
  • --device=:要设置的网卡,必填
  • --ipv4-dns-search / --ipv6-dns-search:设置搜索域
  • --ipv4-ignore-auto-dns / --ipv6-ignore-auto-dns:设置来忽略 DHCP 中的 DNS 设置
  • --ip=:IP 地址
  • --netmask=:子网掩码
  • --nameserver=:DNS 地址,多个地址用逗号分隔(,
  • --ipv6=:IPV6 地址
  • --gateway=:IPV4 网关
  • --ipv6gateway=:IPV6 网关
  • --onboot=:网卡是否开机自启
  • --dhcpclass=:DHCP 类
  • --mtu=:设备的 MTU
  • --noipv4:在这个设备上禁用 IPv4
  • --noipv6:在这个设备上禁用 IPv6
  • --ethtool=:添加 ethtool 命令的一些设置(这个貌似不生效
  • --nodefroute:防止网卡被设置为默认路由接口
  • --bondslaves=:设置 bond,此时 --device= 设置 bond 网卡名,--bondslaves= 后加物理网卡名
  • --bondopts=:bond 网卡的配置
  • --vlanid=:设置 VLAN,此时 --device= 接物理网卡名,--interfacename 接虚拟 VLAN 网卡名
  • --interfaceName=:接 VLAN 的虚拟网卡名
  • --bridgeslaves=:添加网桥,--device= 接网桥名,--bridgeslaves= 接物理网卡名
  • --bridgeopts=:接网桥配置
  • --bindto=mac:网卡配置根据 MAC 地址绑定
# 激活并设置 ens160 网卡地址自动获取
network --bootproto=dhcp --device=ens160 --ipv6=auto --activate

# 设置 ens160 网卡静态地址
network --bootproto=static --device=ens160 --onboot=yes --ip=192.168.255.10 --netmask=255.255.255.0 --gateway=192.168.255.254 --nameserver=192.168.255.254,8.8.8.8 --ipv4-dns-search=example.com

# 设置主机名
network --hostname=localhost.localdomain

# 创建 bond
network --device=bond0 --bondslaves=ens192,ens224 --bondopts=mode=active-backup;primary=ens192;miimon=100 --onboot=yes

# 添加 VLAN 虚拟网卡
network --device=bond0 --vlanid=10 --interfacename=bond0.10 --onboot=yes

# 创建 bond 并添加 VALN 网卡(一般情况下 Kickstart 里所有网卡设备只出现在一个命令里的 --device 上)
network --device=bond0 --bondslaves=ens192,ens224 --bondopts=mode=active-backup;primary=ens192;miimon=100 --vlanid=10 --interfacename=bond0.10 --onboot=yes

# 添加网桥
network --device=bridge0 --bridgeslaves=bond0 --bridgeopts=stp=yes,forward-delay=4 --mtu=9000 --onboot=yes

这里不建议用 Kickstart 配置 bond 或 bridge,因为 Kickstart 配置的部分网卡配置文件名字不好识别。

[root@localhost ~]# ls /etc/sysconfig/network-scripts/
ifcfg-bond0  ifcfg-bond0.10  ifcfg-bond0_slave_1  ifcfg-bond0_slave_2  ifcfg-bridge0  ifcfg-ens160  ifcfg-ens192

Kickstart 高级管理

设置 Anaconda 的密码策略

pwpolicy 命令可以设置 Anaconda 安装页面的用户密码策略,不会设置安装后的系统的。

pwpolicy name [--minlen=length] [--minquality=quality] [--strict|--notstrict] [--emptyok|--notempty] [--changesok|--nochanges]

选项:

  • name:使用 rootuserluks 替换,以分别强制执行与 root 密码、普通用户密码或 LUKS 密码相关的策略
  • --minlen=:最小长度(字符数),默认 6
  • --minquality=:来自 libpwquality 的评分标准,默认 1(可以用 echo "123456" | pwscore 测试)
  • --strict:强制执行,如果密码不合格就阻止安装
  • --notstrict:可以在 GUI 里点两次 Done 强制通过,默认是这个
  • --emptyok:允许空密码,默认普通用户允许,root 不允许
  • --changesok:允许在安装 UI 修改 kickstart 里已经写好的密码,默认不允许
%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end

执行额外脚本

Kickstart 可以执行一下脚本:

  • %pre:脚本在 Kickstart 进行系统安装前执行,用于设置和检查初始环境(在分区之前执行)
  • %pre-install:脚本在 Kickstart 进行系统安装前执行,用于修改安装后的系统(在分区完成之后、安装软件包之前执行)
  • %post:在系统安装完成后执行脚本,默认在安装好的系统中执行

所有脚本最后一行必须以 %end 结尾。

%pre

%pre 脚本在 Kickstart 进行系统安装前执行,用于设置和检查初始环境。

%pre 中只能使用 IP,不能使用域名。

相关选项:

  • --interpreter=:设置脚本解释器,如:/usr/bin/sh/usr/bin/bash/usr/libexec/platform-python
  • --erroronfail:显示错误并在脚本失败时暂停安装
  • --log=:将脚本的输出记录到指定的日志文件中,如:%pre --log=/tmp/ks-pre.log
%pre --interpreter=/bin/bash --log=/tmp/ks-pre.log

set -euo pipefail

#exec 3<&0 4>&1 5>&2
exec < /dev/tty3 > /dev/tty3 2>&1
chvt 3

SYSTEM_DISK=sda
set_system_disk() {
        lsblk
        read -p "System Disk(default is sda): " SYSTEM_DISK
}

set_kickstart_file() {
        : > /tmp/disk.ks
        echo "ignoredisk --only-use=$SYSTEM_DISK" > /tmp/disk.ks
        echo "clearpart --all --initlabel --drives=$SYSTEM_DISK" >> /tmp/disk.ks
        if [ -d /sys/firmware/efi ] ; then
                echo "part /boot/efi --fstype=\"efi\" --ondisk=$SYSTEM_DISK --size=1024 --fsoptions=\"umask=0077,shortname=winnt\"" >> /tmp/disk.ks
        else ; then
                echo "part biosboot --fstype=\"biosboot\" --ondisk=$SYSTEM_DISK --size=2" >> /tmp/disk.ks
        fi
        echo "part /boot --fstype="xfs" --ondisk=$SYSTEM_DISK --size=1024" >> /tmp/disk.ks
        echo "part / --fstype="xfs" --ondisk=$SYSTEM_DISK --grow" >> /tmp/disk.ks
}

set_system_disk
set_kickstart_file

chvt 1
#exec 0<&3 1>&4 2>&5

%end

%pre-install

pre-install 脚本中的命令会在以下任务完成后运行:

  • 系统已被分区
  • 文件系统创建并挂载到 /mnt/sysroot 下
  • 网络已根据任何引导选项和 kickstart 命令进行配置

这个可以修改已安装的系统,但是感觉用处不大,因为执行这个脚本的时候相关 RPM 包还没有开始安装,能改的东西不多,而且 %post 比它更适合修改安装后的系统。

相关选项:

  • --interpreter=:设置脚本解释器,如:/usr/bin/sh/usr/bin/bash/usr/libexec/platform-python
  • --erroronfail:显示错误并在脚本失败时暂停安装
  • --log=:将脚本的输出记录到指定的日志文件中,如:%pre-install --log=/tmp/ks-pre-install.log

%post

%post 脚本是安装后脚本,可在安装完成后运行,用于修改已安装的系统。

%post 默认在 chroot /mnt/sysroot 环境下执行,即已安装的系统中。

相关选项:

  • --nochroot:在 chroot /mnt/sysroot 环境外执行,即安装环境中
  • --interpreter=:设置脚本解释器,如:/usr/bin/sh/usr/bin/bash/usr/libexec/platform-python
  • --erroronfail:显示错误并在脚本失败时暂停安装
  • --log=:将脚本的输出记录到指定的日志文件中,如:%post --log=/tmp/ks-post.log
%post --interpreter=/bin/bash --log=/tmp/ks-post.log

set -euo pipefail

INSTALL_DATE=`date "+%F %T"`
echo "system install time is $INSTALL_DATE" > /root/install.log

%end

上边这个脚本表示在安装好的系统中把系统安装完成时间保存到 /root/install.log 文件里。

导入额外的 Kickstart 文件

导入额外 Kickstart 文件有两种方法:

  • %include:在 Kickstart 解析过程中导入额外 Kickstart 文件,通常跟 %pre 配合(动态生成新的 Kickstart 文件并导入)
  • ksappend:在 Kickstart 解析之前导入额外 Kickstart 文件(导入已有的额外 Kickstart 文件,静态导图)
%include path/to/file

%ksappend path/to/file

参考文件

写 Kickstart 文件时有一些必填项,具体哪些我也没记住,但是下边这个应该是一个最基础的 Kickstart 文件了:

repo --name="AppStream" --baseurl=http://192.168.255.254/iso/Rocky8.10/AppStream

url --url=http://192.168.255.254/iso/Rocky8.10/

%packages
@^minimal-environment
kexec-tools

%end

keyboard --xlayouts='us'
lang en_US.UTF-8 --addsupport=zh_CN.UTF-8
timezone Asia/Shanghai --isUtc --nontp

%addon com_redhat_kdump --enable --reserve-mb='auto'

%end

rootpw --iscrypted $6$kg4JgovHBe.HpdX4$gjR1tX/nMUHH4JM0gnHhVz3mfDKmPjguNW3fT4S4Bjn0kaEEArjHA73fZAZAXFm/khvUX7A90PwfD5YojHQva0

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end

poweroff

# 从这往下就是通过额外的脚本来设置硬盘和系统初始化配置了
%include /tmp/disk.ks

%pre --interpreter=/bin/bash --log=/tmp/ks-pre.log

set -euo pipefail

exec < /dev/tty3 > /dev/tty3 2>&1
chvt 3

SYSTEM_DISK=sda

set_system_disk() {
        lsblk
        read -p "System Disk(default is sda): " SYSTEM_DISK
}

set_kickstart_file() {
        : > /tmp/disk.ks
        echo "ignoredisk --only-use=$SYSTEM_DISK" > /tmp/disk.ks
        echo "clearpart --all --initlabel --drives=$SYSTEM_DISK" >> /tmp/disk.ks
        if [ -d /sys/firmware/efi ] ; then
                echo "part /boot/efi --fstype=\"efi\" --ondisk=$SYSTEM_DISK --size=1024 --fsoptions=\"umask=0077,shortname=winnt\"" >> /tmp/disk.ks
        else
                echo "part biosboot --fstype=\"biosboot\" --ondisk=$SYSTEM_DISK --size=2" >> /tmp/disk.ks
        fi
        echo "part /boot --fstype="xfs" --ondisk=$SYSTEM_DISK --size=1024" >> /tmp/disk.ks
        echo "part / --fstype="xfs" --ondisk=$SYSTEM_DISK --grow" >> /tmp/disk.ks
}

set_system_disk
set_kickstart_file

chvt 1

%end

%post --interpreter=/bin/bash --log=/tmp/ks-post.log

set -euo pipefail

INSTALL_DATE=`date "+%F %T"`
echo "system install time is $INSTALL_DATE" > /root/install.log

%end

更多参考

还有一些配置没有写,更多配置参考:https://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/8/html/performing_an_advanced_rhel_8_installation/kickstart_references

Linux 部分 PXE 引导选项和 Kickstart 选项的配置
https://www.linuxstudynotes.com/2026/05/16/linux/linux-%e9%83%a8%e5%88%86-pxe-%e5%bc%95%e5%af%bc%e9%80%89%e9%a1%b9%e5%92%8c-kickstart-%e9%80%89%e9%a1%b9%e7%9a%84%e9%85%8d%e7%bd%ae/
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇