如何使用 Kickstart 执行无人值守的 Linux 安装
Kickstart 是一种自动安装方法,适用于使用 Anaconda 安装程序的发行版:Red Hat Enterprise Linux(及其克隆版本)和 Fedora。实际上,它也可以用于安装 Ubuntu,但在这种情况下,它充当 debian-native 预置方法的兼容层。借助 Kickstart,我们可以执行无人值守、可定制且可重复的安装。
在本教程中,我们学习 Kickstart 的基础知识,并了解如何执行 Fedora 工作站系统的无人值守安装。
在本教程中您将学习:
如何使用 Kickstart 执行无人值守安装
如何编写 Kickstart 文件
如何将 Kickstart 文件传递给 Anaconda 安装程序
介绍
当我们执行 Kickstart 安装时,我们不是以交互方式回答系统安装程序有关安装过程各个方面的问题,而是在所谓的 Kickstart 文件中传递一系列命令/指令。在其中,我们定义要使用的分区布局、新系统要使用的区域设置和时区、应安装哪些软件包等。
学习如何编写 Kickstart 文件的最佳方法是从实际示例开始,并分析其中使用的各个部分和命令。在本教程中,我们将看一下可用于安装 Fedora 工作站系统的 Kickstart 文件。其全文如下:
url --mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch
repo --name=rpmfusion-free --mirrorlist=https://mirrors.rpmfusion.org/metalink?repo=free-fedora-$releasever&arch=$basearch
rootpw --lock
user --groups=wheel --name=tux --password=$6$fz9G6LVJIRHXk39j$IKgBBqkj9RQBWz8MylDWwViuREVTCIBwuxLEAeY0A6yniK2FIWBZDr9lH5YbUBidmBtqKR5CLA0h9AigOucCT/ --iscrypted --gecos="tux"
lang en_US.UTF-8
keyboard --vckeymap=us --xlayouts=us
timezone Europe/Rome --utc
network --hostname=linuxconfig --device=eth0 --bootproto=dhcp --noipv6 --activate --onboot=yes
xconfig --startxonboot
ignoredisk --only-use=/dev/vda
clearpart --all --initlabel --drives=vda
part /boot/efi --fstype=efi --ondisk=/dev/vda --size=550 --fsoptions="umask=0077,shortname=winnt"
part /boot --fstype=ext2 --ondisk=/dev/vda --size=1024
part pv.0 --fstype=lvmpv --ondisk=/dev/vda --grow
volgroup linuxconfig_vg pv.0
logvol / --fstype=ext4 --vgname=linuxconfig_vg --name=root_lv --size=15360
logvol /home --fstype=ext4 --vgname=linuxconfig_vg --name=home_lv --percent=95
bootloader --location=mbr --boot-drive=/dev/vda
%packages
@workstation-product-environment
-gnome-boxes
%end
设置安装源
在上面的 kickstart 文件中,我们首先定义了安装源。安装源可以是“本地”(例如 CDROM)或远程(安装树),可通过受支持的协议之一(例如 ftp 或 http)进行访问。后者正是我们在示例中使用的:
url --mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch
通过 url
命令,我们指定要使用远程安装源。我们将包含可用镜像列表的文件的 URL 作为参数传递给 --mirrorlist
选项。 URL 中的 $releasever
和 $basearch
变量分别扩展到 Fedora 版本(例如 37)和系统架构。作为替代方案,我们可以直接使用特定的镜像,方法是将其 URL 作为参数传递给 --url
选项。
安装期间使用附加存储库
我们在示例中使用的 kickstart 文件中的第二行如下:
repo --name=rpmfusion-free --mirrorlist=https://mirrors.rpmfusion.org/metalink?repo=free-fedora-$releasever&arch=$basearch
repo
命令是可选的:它用于指定安装期间要使用的其他存储库。在示例中,我们添加了 RPMFusion 存储库作为软件源;它包含由于某种原因在官方 Fedora 存储库中不可用的软件包,例如 VLC。我们使用强制--name
选项来指定存储库ID,并使用--mirrorlist
来指定包含以下列表的文件的URL:存储库镜像。
我们在示例中定义的存储库仅在安装期间可用:要在已安装的系统上启用它,我们需要添加 --install
选项。
在指定附加存储库时,我们可能想要使用的另一个有趣的选项是--cost
。该选项采用整数作为值,用于定义安装优先级。当一个软件包可从多个软件源获得时,这一点非常有用:成本越低,优先级越高。
管理系统用户
在上面的示例中,我们使用了两个命令来管理新安装的系统中的用户:
根密码
用户
第一个命令。 rootpw
是必需的:它用于设置root 用户的密码。在本例中,我们将 --lock
选项传递给命令,正如您可以想象的那样,该选项用于锁定密码,以禁用直接 root 登录:
rootpw --lock
接下来,我们通过 user
命令,使用 --groups
、--name
、--password
、--iscrypted
和 --gecos
选项:
user --groups=wheel --name=tux --password=$6$fz9G6LVJIRHXk39j$IKgBBqkj9RQBWz8MylDWwViuREVTCIBwuxLEAeY0A6yniK2FIWBZDr9lH5YbUBidmBtqKR5CLA0h9AigOucCT/ --iscrypted --gecos="tux"
--name
选项用于指定帐户用户名,并且是必需的。相反,--groups
选项接受用户应属于的组的逗号分隔列表。在本例中,我们将用户设为 wheel
组的一部分,以便使其能够使用 sudo
升级权限。
--password
和 --iscrypted
选项是相关的。前者用于提供用户密码,后者指定应假定该密码已加密(此选项的反面是--plaintext
)。如果我们需要以某种方式共享 Kickstart 文件或将其置于版本控制之下,则使用已加密的密码非常有用。我们可以使用多种方法加密密码并获取要放置在文件中的字符串。一种选择是使用 pwkickstart
实用程序;它接受密码作为参数并返回其 md5、sha256 和 sha512 加密版本(后者是我们想要的):
$ pwkickstart mypassword
$1$shCWoE7t$eY546wqr/rrsaUugnvBbs0
$5$pmMb0I1fhyddIHJV$y9lmRW02wpSTxNzAoEh4qljlPBD1jCXulLDgTyvq1v9
$6$77bw2sxFQAU3Ejtw$DBj5IKCU3pw3sAH.XdGCalwqdIH/Nss7NVMnc6a9CbJyevo8BVPU3DFquqQvSzloQVjgfo0Z0YUSDDaZ.z.Tl1
我们使用的最后一个选项是--gecos
:需要提供其他用户信息,例如他/她的真实姓名。这些信息存储在 /etc/passwd
文件中每行的第五个字段中:
tux:x:1000:1000:tux:/home/tux:/bin/bash
区域设置、键盘和时区设置
系统配置/安装的另一个非常重要的部分是本地化。在示例中,我们使用三个指令来设置系统语言、键盘布局和系统时区;它们分别是:lang
、键盘
和时区
。
lang
指令设置安装期间使用的语言和系统语言。它以语言 id 作为参数:
lang en_US.UTF-8
keyboard
指令用于设置系统键盘布局。您可以看到我们使用了两个选项:--vckeymap
和 --xlayouts
,将“us”作为参数传递给这两个选项:
键盘 –vckeymap=us –xlayouts=us
前者用于设置控制台键盘映射,后者用于设置图形服务器的键盘布局。最后,使用 timezone
指令我们设置系统时区:
timezone Europe/Rome --utc
通过 --utc
选项,我们指定系统时钟设置为 UTC。
磁盘分区和引导加载程序安装
磁盘分区可能是系统安装中最重要的方面。使用示例中的 Kickstart 文件会创建两个标准分区(EFI 分区和专用“引导”分区),并将系统的其余部分安装在 LVM(逻辑卷管理器)布局上。首先,我们使用了 ignoredisk
命令:
ignoredisk --only-use=/dev/vda
此命令用作安全措施,指定 anaconda 安装程序可以访问哪些磁盘。我们可以在这里实施两种策略:要么将排除驱动器的逗号分隔列表作为参数传递给 --drives
选项,或者像我们在示例中所做的那样,执行相反的操作,并传递排除驱动器的列表可访问的磁盘作为 --only-use
选项的参数。
我们在示例中所做的基本上是允许安装程序仅访问 /dev/vda
磁盘。在本例中,我们使用分配给内核的名称来识别磁盘,因为它是唯一可用的。在现实场景中,最好使用 UUID 或 PATH 等唯一标识符,因为它们是可预测的(内核按检测顺序分配设备名称)。
擦除现有分区
我们使用的下一个命令是clearpart
:
clearpart --all --initlabel --drives=vda
此命令用于在创建新分区之前擦除指定磁盘上的所有现有分区。使用我们指定的 --all
选项,我们希望擦除所有现有分区(通过使用 --linux
,我们会指示安装程序仅删除“linux”分区)。
--initlabel
选项用于使用 MBR 或 GPT 分区标签初始化磁盘,具体取决于架构和我们启动安装程序的方式(UEFI 或 BIOS)。最后,--drives
用于指定应清除哪些驱动器上的分区。
创建分区和 LVM 设置
下一步,我们定义了实际的分区和逻辑卷。由于我们想要以 UEFI 模式安装系统,并使用 GPT 分区架构,因此我们需要创建一个 EFI 分区。用于创建标准分区的命令是part
:
part /boot/efi --fstype=efi --ondisk=/dev/vda --size=550 --fsoptions="umask=0077,shortname=winnt"
传递给该命令的第一个参数是将要创建的分区的挂载点。它可以是实际的文件系统路径,也可以是一些“特殊”值,例如“swap”(用于交换分区),或者用于 LVM 物理卷的 pv.
。
--fstype
选项用于指定应在分区上创建的文件系统。在这种情况下,“efi”本身并不是文件系统类型,而是告诉系统我们要创建一个 EFI 分区。
--ondisk
选项用于指定应在哪个磁盘上创建分区。这里我们使用了/dev/vda
(为了重用现有分区,使用了--onpart
)。
--size
选项用于指定最小分区大小(以 MiB 为单位)。最后,--fsoptions
采用逗号分隔的挂载选项列表,并将其复制到 /etc/fstab 文件中。
我们创建的第二个分区是启动分区:
part /boot --fstype=ext2 --ondisk=/dev/vda --size=1024
使用单独的引导分区和其上的 ext2 文件系统确实没有必要,因为 GRUB 同时支持 LVM 和 ext4,这只是习惯的力量。接下来,我们定义要用作 LVM 物理卷的分区。在这里您可以注意到我们使用 lvmpv
作为文件系统类型,以及 --grow
选项:通过它,我们指定分区应占用所有可用空间:
part pv.0 --fstype=lvmpv --ondisk=/dev/vda --grow
使用volgroup
命令我们创建了一个LVM卷组。该指令将卷组名称作为第一个参数,将要添加到其中的物理卷作为第二个参数:
volgroup linuxconfig_vg pv.0
在卷组之后,我们使用 logvol
命令创建了逻辑卷。此命令的工作方式与 part
类似,但接受一些附加选项,例如指定逻辑卷所属卷组所需的 --vgname
,以及 >--percent
可用于将逻辑卷的大小指定为可用空间的百分比。
引导加载程序安装
最后,我们使用了 bootloader
命令,该命令用于配置引导加载程序的安装方式和位置:
bootloader --location=mbr --boot-drive=/dev/vda
这里我们使用 --location
和 --boot-drive
选项指定引导加载程序应安装在 mbr 中(实际上是安装在 UEFI 系统上的 EFI 分区中) ,/dev/vda
驱动器。
指定包列表
通过使用 Kickstart,我们可以详细指定新系统中应安装的软件包以及应排除的软件包。我们在 %packages
部分列出了包,每行一个。该部分必须使用 %end
标签结束:
%packages
@workstation-product-environment
-gnome-boxes
%end
在此示例中,您可以看到我们明确包含 @workstation-product-environment
软件包组(组由名称前面的 @
标识),并且我们通过在名称前放置 -
符号来排除 gnome-boxes
包。
%pre 和 %post 部分
让我们谈谈示例中未使用的两个部分:%pre
和 %post
:Kickstart 文件中的这些部分非常有用,因为在其中我们可以使用系统上可用的脚本语言之一执行自定义操作(默认为 Bash)。两个部分都必须以 %end
标记结束,但在安装的不同阶段执行。 %pre
部分在安装开始之前、Kickstart 文件解析之后执行;相反,%post
部分是在安装完成后执行的。我们在其中执行的命令在已安装的系统中的 chroot 中运行。
将 Kickstart 文件传递给安装程序
一旦我们的 Kickstart 文件准备好,我们必须告诉安装程序在哪里可以找到它。我们通过 inst.ks
启动选项来完成此操作。例如,我们可以在线提供 Kickstart 文件,然后将安装程序指向它,如下所示(我们将文件保存为 test.ks
):
结论
在本教程中,我们学习了 Kickstart 基础知识。我们了解了如何使用适当的命令来设置安装源、添加额外的存储库、设置系统区域设置和定义分区布局。我们还了解了如何指定应安装哪些软件包,并讨论了 %pre
和 %post
部分,这些部分可用于编写在安装开始之前执行的自定义操作脚本,以及完成之后。最后,我们看到了如何将 Kickstart 文件传递给 Anaconda 安装程序的示例。有关 Kickstart 命令的完整列表,请查看官方文档。