使用 kickstart 文件自动安装 CentOS

anaconda

说到 kickstart,就不能不说 anaconda。什么是 anaconda 呢?简单的来说,就是使用光盘安装系统时引导安装程序,而 kickstart,就是 anaconda 的配置文件。

isolinux

在说 anaconda 是如何启动的之前,先来说说 isolinux 的启动流程和它的配置文件。

配置文件

先来看看 isolinux 配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# /media 为光盘挂载目录

[root@magedu isolinux]# more /media/isolinux/isolinux.cfg
default vesamenu.c32
#prompt 1
timeout 600

display boot.msg

menu background splash.jpg
menu title Welcome to CentOS 6.5!
menu color border 0 #ffffffff #00000000
menu color sel 7 #ffffffff #ff000000
menu color title 0 #ffffffff #00000000
menu color tabmsg 0 #ffffffff #00000000
menu color unsel 0 #ffffffff #00000000
menu color hotsel 0 #ff000000 #ffffffff
menu color hotkey 7 #ffffffff #ff000000
menu color scrollbar 0 #ffffffff #00000000

label linux
menu label ^Install or upgrade an existing system
menu default
kernel vmlinuz
append initrd=initrd.img
label vesa
menu label Install system with ^basic video driver
kernel vmlinuz
append initrd=initrd.img xdriver=vesa nomodeset
label rescue
menu label ^Rescue installed system
kernel vmlinuz
append initrd=initrd.img rescue
label local
menu label Boot from ^local drive
localboot 0xffff
label memtest86
menu label ^Memory test
kernel memtest
append -

[root@magedu isolinux]#

再来看看 Linux 安装时的初始界面:

linux 安装界面

我们发现,每一个配置文件里面的 label 区域,都对应着一个安装选项,比如第一段 label:

1
2
3
4
5
label linux # 安装别名
menu label ^Install or upgrade an existing system # 菜单名称
menu default # 是否默认
kernel vmlinuz # 内核
append initrd=initrd.img # 附加选项

其中安装别名,可以用在 boot 命令行,直接启动;附加选项,就是向内核传递的参数。

比如,在默认情况下,对于内存大于 512M 的机器,Linux 默认会启动 gui(图形界面) 安装;而对于内存小于 512M 的机器,Linux 会启动 tui(基于 cureses 的文本配置窗口) 安装。但是,我们可以通过 boot 命令行,利用安装别名和附加参数的方式,让其快速启动 tui 安装。

  • 在安装菜单界面按 esc 即可进入 boot 命令行模式。

boot 命令行

tui 安装模式

引导流程

说完了 isolinux 和安装菜单的有趣关联,现在就来说说枯燥的 isolinux 引导流程。

咱先来看看光盘内 isolinux 里面都有啥:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@magedu isolinux]# ls -lh
总用量 37M
-r--r--r--. 1 root root 2.0K 1129 2013 boot.cat
-r--r--r--. 1 root root 84 1129 2013 boot.msg
-r--r--r--. 1 root root 334 1128 2013 grub.conf
-r--r--r--. 1 root root 32M 1128 2013 initrd.img
-r--r--r--. 1 root root 24K 1129 2013 isolinux.bin
-r--r--r--. 1 root root 936 1129 2013 isolinux.cfg
-r--r--r--. 1 root root 162K 1129 2013 memtest
-r--r--r--. 1 root root 148K 1129 2013 splash.jpg
-r--r--r--. 1 root root 2.2K 1129 2013 TRANS.TBL
-r--r--r--. 1 root root 160K 1129 2013 vesamenu.c32
-r-xr-xr-x. 2 root root 4.0M 1129 2013 vmlinuz
[root@magedu isolinux]#

看到 vmlinuz、grub.conf 和 initrd.img,就可以知道 isolinux 就是光盘版的 boot。

其中 boot.cat 就是 grub 的 stage 1,也就是需要安装在 MBR 里面内容,用于引导光盘启动;isolinux.bin 是 grub 的 stage 2,用来加载系统;而我们之前说的 isolinux.cfg,就是 isolinux.bin 的配置文件。

回顾:《Grub Legacy 简介

至于 anaconda,就藏在 initrd.img 里面,在内核加载后启动。

kickstart

anaconda 的配置方式有两种:

  1. 通过 gui 或 tui 进行交互式安装;
  2. 通过 kickstart 文件进行自动安装。

第1种方式就不介绍了,交互式的图形界面,比较简单。下面终于进入重点了,看看如何通过 kickstart 文件进行 Linux 的自动安装。

boot 引导选项

别急,还是先说说 boot 的引导选项,就是在安装菜单界面按 esc 进入的 boot 命令行模式。

之前已经介绍过一个引导选项,就是 text,这是手动选择使用 tui 界面进行安装的选项,下面介绍一个跟 kickstart 相关的选项:ks。

ks 是指定 kickstart 文件的一个选项,支持众多协议:

1
2
3
4
5
DVD drive:ks=cdrom:/PATH/TO/KICKSTART_FILE
Hard Drive:ks=hd:/DEVICE/PATH/TO/KICKSTART_FILE
HTTP Server:ks=http://HOST[:PORT]/PATH/TO/KICKSTART_FILE
FTP Server:ks=ftp://HOST[:PORT]/PATH/TO/KICKSTART_FILE
HTTPS Server:ks=https://HOST[:PORT]/PATH/TO/KICKSTART_FILE

指定 kickstart 文件后,anaconda 就无需通过引导进行安装了,而是会根据文件内容进行安装。

如果需要手动配置 IP 地址才能访问网络,则需要添加网络引导选项:

1
2
3
4
ip=IPADDR
netmask=MASK
gateway=GW
dns=DNS_SERVER_IP

kickstart 配置

使用模板创建配置

先看一个 kickstart 案例:anaconda-ks.cfg。

每个系统安装完成后,都会在 /root 下面产生三个文件:

1
2
3
4
5
[root@magedu ~]# echo "$(ls)"
anaconda-ks.cfg # kickstart 文件
install.log # 安装日志
install.log.syslog # 操作日志
[root@magedu ~]#

其中 anaconda-ks.cfg,就是我们在进行 anaconda 的 tui 或 gui 界面配置后,产生的 kickstart 配置,以便以后安装系统时使用。

先来看看 anaconda-ks.cfg 的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
[root@magedu ~]# more anaconda-ks.cfg 
# Kickstart file automatically generated by anaconda.

#version=DEVEL
# 运行方式:install 或 upgrade
install
# 运行介质
cdrom
# 设置语言类型
lang zh_CN.UTF-8
# 设置键盘类型
keyboard us
# 设置网络
network --onboot yes --device eth0 --bootproto dhcp --noipv6
# 设置 root 密码
rootpw --iscrypted $6$Ptaz13vXh7ghUtmc$NkrYZFn6W45QlKUGjZw1uc/ax0ThyXXc8mQIOdF8PzSZ8.RAoFtCdfQPUHSJWS5oBCsclT2a.ua3iD1Q2qw1X/
# 设置防火墙
firewall --service=ssh
# 设置密码校验方式
authconfig --enableshadow --passalgo=sha512
# 设置 SELinux
selinux --enforcing
# 设置时区
timezone --utc Asia/Shanghai
# 设置引导参数
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"

######## 设置磁盘分区开始 ########
# The following is the partition information you requested
# Note that any partitions you deleted are not expressed
# here so unless you clear all partitions first, this is
# not guaranteed to work
# 清除分区
#clearpart --all --drives=sda
# 创建 boot 分区
#part /boot --fstype=ext4 --size=500
# 创建 pv
#part pv.008002 --grow --size=1
# 创建 vg
#volgroup vg_magedu --pesize=4096 pv.008002
# 创建 lv
#logvol /home --fstype=ext4 --name=lv_home --vgname=vg_magedu --grow --size=100
# 创建 lv
#logvol / --fstype=ext4 --name=lv_root --vgname=vg_magedu --grow --size=1024 --maxsize=51200
# 创建 lv
#logvol swap --name=lv_swap --vgname=vg_magedu --grow --size=2016 --maxsize=2016
######## 设置磁盘分区结束 ########

# 设置软件仓库
repo --name="CentOS" --baseurl=cdrom:sr0 --cost=100

######## 指明要安装的程序包开始 ########
%packages --nobase
# 安装核心包组
@core
%end
######## 指明要安装的程序包结束 ########
[root@magedu ~]#

系统安装时自动创建的这份 ks 文件是比较简单的,但是也足够大多数场景使用,根据其内容,我们可以成修改自己想要的功能。但有两处地方需要特别说明:

  1. root 用户的加密密码,需要用 openssl passwd -1 -salt $(openssl rand -hex 4) 这条加密命令创建;
  2. 磁盘分区默认是屏蔽的,是为了避免不小心将有数据的磁盘格式化。如果是全新安装,需要解除屏蔽,并小心执行。

修改过的 kickstart-hzz.cfg 文件为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
[root@magedu ~]# more kickstart-hzz.cfg 
# Kickstart file automatically generated by huangzz.xyz .

#version=DEVEL
# 运行方式:install 或 upgrade
install
# 运行介质
cdrom
# 使用 tui 界面安装
text
# 设置语言类型(必须)
lang zh_CN.UTF-8
# 设置键盘类型(必须)
keyboard us
# 设置网络
network --onboot yes --device eth0 --bootproto dhcp --noipv6
# 跳过不支持的硬件(一般来说不影响,生产系统谨慎使用)
unsupported_hardware
# 设置 root 密码(必须)
rootpw --iscrypted $6$Ptaz13vXh7ghUtmc$NkrYZFn6W45QlKUGjZw1uc/ax0ThyXXc8mQIOdF8PzSZ8.RAoFtCdfQPUHSJWS5oBCsclT2a.ua3iD1Q2qw1X/
# 设置防火墙
firewall --disabled
# 设置密码校验方式(必须)
authconfig --enableshadow --passalgo=sha512
# 设置 SELinux
selinux --disabled
# 设置时区(必须)
timezone --utc Asia/Shanghai
# 设置引导参数(必须)
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"

######## 设置磁盘分区开始(必须) ########
# The following is the partition information you requested
# Note that any partitions you deleted are not expressed
# here so unless you clear all partitions first, this is
# not guaranteed to work
# 清除分区
clearpart --all --drives=sda
# 清除分区表
zerombr
# 创建 boot 分区
part /boot --fstype=ext4 --size=500
# 创建 pv
part pv.008002 --grow --size=1
# 创建 vg
volgroup vg_magedu --pesize=4096 pv.008002
# 创建 lv
logvol /home --fstype=ext4 --name=lv_home --vgname=vg_magedu --grow --size=100
# 创建 lv
logvol / --fstype=ext4 --name=lv_root --vgname=vg_magedu --grow --size=1024 --maxsize=51200
# 创建 lv
logvol swap --name=lv_swap --vgname=vg_magedu --grow --size=2016 --maxsize=2016
######## 设置磁盘分区结束(必须) ########

# 设置软件仓库
#repo --name="CentOS" --baseurl=cdrom:sr0 --cost=100

# 设置 url 方式的软件仓库(要确保设置的网络在安装过程中能联网)
# 最好不要用 https,否则可能会出现无法连接的问题
url --url=http://mirrors.aliyun.com/centos/6/os/x86_64/

# 安装完成后的行为
reboot

######## 指明要安装的程序包开始 ########
%packages --nobase
# 安装核心包组
@core
# 安装基本桌面包组
@basic-desktop
# 安装 http 服务程序包
httpd
# 不安装 php 程序包
-php
%end
######## 指明要安装的程序包结束 ########

######## 安装前脚本开始 ########
# 此时的 Linux 系统环境为微缩版环境,脚本应尽可能简单。
# 示例
%pre
#!/bin/sh
echo "start install..."
%end
######## 安装前脚本结束 ########

######## 安装后脚本开始 ########
# 此时的 Linux 系统环境为已经安装完成的系统。。
# 示例
%post
#!/bin/sh
echo "install complete..."
%end
######## 安装后脚本结束 ########
[root@magedu ~]# ksvalidator kickstart-hzz.cfg # 检查语法错误
[root@magedu ~]#

使用工具创建配置

如果 Linux 安装有桌面,那创建 kickstart 配置就更加简单了,可使用 system-config-kickstart 工具来创建。

1
2
3
4
5
# 安装
[hzz@magedu ~]$ sudo yum install -y system-config-kickstart

# 启动
[hzz@magedu ~]$ system-config-kickstart

启动后界面:

kickstart configurator

根据选择需要的功能生成 kickstart 配置即可,此处就不多说了。

使用 kickstart 文件安装系统

搞定 kickstart 配置后,就可以使用 ks 选项来指定配置文件安装系统了。比如我用已上传的 kickstart 配置进行安装:

guide kickstart

retrieving kickstart cfg

install system

创建 ISO 镜像

虽然我们定制了 kickstart 配置,可以无人值守安装 CentOS。但还是需要手动进入 boot 命令行才能继续操作。能否有一种方式,直接光盘启动就能自动安装的呢?

答案是肯定的,那就是自行创建光盘镜像,把 ks 选项写进 label,并使其默认选定即可。下面就来说说如何创建光盘镜像。

步骤一:创建 MyISO 目录

1
2
3
4
5
6
# 创建 MyISO 目录
[hzz@magedu ~]$ mkdir MyISO

# 拷贝光盘内的 isolinux 到 MyISO 目录并设置可写
[hzz@magedu ~]$ cp -rf /media/isolinux MyISO/
[hzz@magedu ~]$ chmod +w -R MyISO/isolinux/

步骤二:修改 isolinux.cfg 配置

以下是我修改后的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[hzz@magedu isolinux]$ pwd
/home/hzz/MyISO/isolinux
[hzz@magedu isolinux]$ more isolinux.cfg
default vesamenu.c32
#prompt 1
timeout 60

display boot.msg

menu background splash.jpg
menu title Welcome to Magedu CentOS 6.5!
menu color border 0 #ffffffff #00000000
menu color sel 7 #ffffffff #ff000000
menu color title 0 #ffffffff #00000000
menu color tabmsg 0 #ffffffff #00000000
menu color unsel 0 #ffffffff #00000000
menu color hotsel 0 #ff000000 #ffffffff
menu color hotkey 7 #ffffffff #ff000000
menu color scrollbar 0 #ffffffff #00000000

label linux
menu label ^Install or upgrade an existing system (magedu)
menu default
kernel vmlinuz
append initrd=initrd.img ks=https://www.huangzz.xyz/uploads/kickstart-hzz.cfg
label rescue
menu label ^Rescue installed system
kernel vmlinuz
append initrd=initrd.img rescue
[hzz@magedu isolinux]$

由于我们是有目的性地进行制作,所以一些多余的选项可以去掉。

此处 ks 使用的是链接的方式,这样的好处是可以随时修改 ks 文件的内容,而无需重新制作 ISO 镜像;如果不确认安装的主机是否可以联网,也可以拷贝 ks 配置到 MyISO 目录,然后使用 ks=cdrom:/PATH/TO/KICKSTART_FILE 进行引用(注意 ks 文件里面的仓库连接,也要改为本地)。

若需要手动配置 IP 地址才可联网,在 append 最后添加 ip=IPADDR netmask=MASK gateway=GW dns=DNS_SERVER_IP 即可(注意 ks 文件里的 IP 配置也要同步修改)。

步骤三:创建 ISO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
[hzz@magedu ~]$ mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 6 x86_64 magedu boot" -c isolinux/boot.cat -b isolinux/isolinux.bin -o CentOS_6_x86_64_magedu.iso MyISO
I: -input-charset not specified, using utf-8 (detected in locale settings)
genisoimage 1.1.9 (Linux)
Scanning MyISO
Scanning MyISO/isolinux
Excluded: MyISO/isolinux/TRANS.TBL
Excluded by match: MyISO/isolinux/boot.cat
Writing: Initial Padblock Start Block 0
Done with: Initial Padblock Block(s) 16
Writing: Primary Volume Descriptor Start Block 16
Done with: Primary Volume Descriptor Block(s) 1
Writing: Eltorito Volume Descriptor Start Block 17
Size of boot image is 4 sectors -> No emulation
Done with: Eltorito Volume Descriptor Block(s) 1
Writing: Joliet Volume Descriptor Start Block 18
Done with: Joliet Volume Descriptor Block(s) 1
Writing: End Volume Descriptor Start Block 19
Done with: End Volume Descriptor Block(s) 1
Writing: Version block Start Block 20
Done with: Version block Block(s) 1
Writing: Path table Start Block 21
Done with: Path table Block(s) 4
Writing: Joliet path table Start Block 25
Done with: Joliet path table Block(s) 4
Writing: Directory tree Start Block 29
Done with: Directory tree Block(s) 2
Writing: Joliet directory tree Start Block 31
Done with: Joliet directory tree Block(s) 2
Writing: Directory tree cleanup Start Block 33
Done with: Directory tree cleanup Block(s) 0
Writing: Extension record Start Block 33
Done with: Extension record Block(s) 1
Writing: The File(s) Start Block 34
26.71% done, estimate finish Fri Nov 3 13:58:04 2017
53.32% done, estimate finish Fri Nov 3 13:58:04 2017
80.01% done, estimate finish Fri Nov 3 13:58:04 2017
Total translation table size: 4483
Total rockridge attributes bytes: 1360
Total directory bytes: 2048
Path table size(bytes): 26
Done with: The File(s) Block(s) 18576
Writing: Ending Padblock Start Block 18610
Done with: Ending Padblock Block(s) 150
Max brk space used 0
18760 extents written (36 MB)
[hzz@magedu ~]$

步骤四:测试启动

加载自建的 ISO 镜像:

load customer iso

启动后显示的菜单界面:

menu

从仓库下载 install.img 并进行安装:

installing

到这一步,基本就没问题了,静待安装成功即可。