常见引导选项
Linux 引导选项是内核启动时传递给 Linux kernel 的参数,就是系统开机时可以修改 GRUB 的界面。
下边是 UEFI 模式的 GRUB 界面,引导选项在 linux 那一行添加就行。

设置镜像安装源
设置镜像安装源有如下几个参数:
inst.repo=inst.addrepo=inst.stage2=inst.dd=
这里的
inst.stage2=不做过多介绍。
关于 inst.stage2=,RHEL 镜像里有一个 images/install.img,inst.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= 指定的安装源中有 .treeinfo 和 install.img,则 inst.stage2= 可以忽略。
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:通过路由器广播自动生成 IPv6ibft: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 安装流程
- 解析 Kickstart
- 执行 %pre 脚本
- 磁盘分区 / LVM 创建
- 挂载目标系统到 /mnt/sysroot
- 执行 %pre-install 脚本
- 安装 RPM 包
- 系统安装完成
- 执行 %post 脚本
安装模式
安装模式有如下几种:
graphical:图形模式下执行安装。这是默认值。text:在文本模式下执行 Kickstart 安装。cmdline:完全非互动的命令行模式执行安装。任何互动提示都会终止安装。
graphical 和 text 带有 --non-interactive 选项,用于强制设置安装过程中不允许人工修改任何选项。
graphical --non-interactive
text --non-interactive
安装源及额外存储库配置
安装源配置
安装源有如下几种配置:
url:使用 FTP、HTTP 或者 HTTPS 协议从远程服务器上的安装树镜像进行安装cdrom:使用第一个光驱进行安装harddrive:通过本地硬盘安装,一般是 U 盘nfs:安装源来自 NFSliveimg:系统安装通过将一个系统镜像复制到本地硬盘来部署,而非默认的 RPM 部署ostreesetup:基于 OStree 的部署rhsm:从红帽 CDN 注册并安装 RHEL
这里主要介绍 url 和 harddrive,其他的没用过。
url
url 选项:
--url=FROM– 指定要从中安装的HTTP、HTTPS、FTP或FILE位置。--mirrorlist=– 指定要从中安装的镜像 URL。--proxy=– 指定在安装过程中要使用的HTTP、HTTPS或者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=:选择其中一个可用文件系统类型。可用值包括ext2、ext3、ext4、xfs和vfat。默认的文件系统是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-...
标准分区管理
part 或 partition 命令来创建分区。
part|partition mntpoint [OPTIONS]
选项:
-
mntpoint:挂载分区的位置-
/path:挂在目录,如/ -
swap:设置为交换分区
如果要自动分配
swap,可以添加--recommended选项如果要系统支持休眠,可以添加
--hibernation选项-
pv.id:分区用于逻辑卷 -
biosboot:BIOS 启动要使用 GPT 分区表时创建的分区 -
/boot/efi:EFI 系统分区
-
-
--ondisk=/--ondrive=:创建新分区,并指定在哪个磁盘上创建 -
--fstype=:文件系统类型,有效值为xfs、ext2、ext3、ext4、swap、vfat、efi和biosboot,如果是逻辑卷还有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=:为逻辑卷设置文件系统类型。有效值为xfs、ext2、ext3、ext4、swap和vfat。 -
--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=:缓存模式,有writeback或writethrough两种
因为我不怎么用逻辑卷装系统,所以这里只列出一个用逻辑卷安装系统后的 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 配置)。dhcp、bootp、ibft或static之一,默认为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:使用root、user或luks替换,以分别强制执行与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。