使用 kickstart 文件自动安装 CentOS
anaconda
说到 kickstart,就不能不说 anaconda。什么是 anaconda 呢?简单的来说,就是使用光盘安装系统时引导安装程序,而 kickstart,就是 anaconda 的配置文件。
isolinux
在说 anaconda 是如何启动的之前,先来说说 isolinux 的启动流程和它的配置文件。
配置文件
先来看看 isolinux 配置:
# /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 安装时的初始界面:

我们发现,每一个配置文件里面的 label 区域,都对应着一个安装选项,比如第一段 label:
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 命令行模式。


引导流程
说完了 isolinux 和安装菜单的有趣关联,现在就来说说枯燥的 isolinux 引导流程。
咱先来看看光盘内 isolinux 里面都有啥:
[root@magedu isolinux]# ls -lh
总用量 37M
-r--r--r--. 1 root root 2.0K 11月 29 2013 boot.cat
-r--r--r--. 1 root root 84 11月 29 2013 boot.msg
-r--r--r--. 1 root root 334 11月 28 2013 grub.conf
-r--r--r--. 1 root root 32M 11月 28 2013 initrd.img
-r--r--r--. 1 root root 24K 11月 29 2013 isolinux.bin
-r--r--r--. 1 root root 936 11月 29 2013 isolinux.cfg
-r--r--r--. 1 root root 162K 11月 29 2013 memtest
-r--r--r--. 1 root root 148K 11月 29 2013 splash.jpg
-r--r--r--. 1 root root 2.2K 11月 29 2013 TRANS.TBL
-r--r--r--. 1 root root 160K 11月 29 2013 vesamenu.c32
-r-xr-xr-x. 2 root root 4.0M 11月 29 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 的配置方式有两种:
- 通过 gui 或 tui 进行交互式安装;
- 通过 kickstart 文件进行自动安装。
第1种方式就不介绍了,交互式的图形界面,比较简单。下面终于进入重点了,看看如何通过 kickstart 文件进行 Linux 的自动安装。
boot 引导选项
别急,还是先说说 boot 的引导选项,就是在安装菜单界面按 esc
进入的 boot 命令行模式。
之前已经介绍过一个引导选项,就是 text,这是手动选择使用 tui 界面进行安装的选项,下面介绍一个跟 kickstart 相关的选项:ks。
ks 是指定 kickstart 文件的一个选项,支持众多协议:
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 地址才能访问网络,则需要添加网络引导选项:
ip=IPADDR
netmask=MASK
gateway=GW
dns=DNS_SERVER_IP
kickstart 配置
使用模板创建配置
先看一个 kickstart 案例:anaconda-ks.cfg。
每个系统安装完成后,都会在 /root 下面产生三个文件:
[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 的内容:
[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 文件是比较简单的,但是也足够大多数场景使用,根据其内容,我们可以成修改自己想要的功能。但有两处地方需要特别说明:
- root 用户的加密密码,需要用
openssl passwd -1 -salt $(openssl rand -hex 4)
这条加密命令创建; - 磁盘分区默认是屏蔽的,是为了避免不小心将有数据的磁盘格式化。如果是全新安装,需要解除屏蔽,并小心执行。
修改过的 kickstart-hzz.cfg 文件为:
[root@magedu ~]# more kickstart-hzz.cfg
# Kickstart file automatically generated by www.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 工具来创建。
# 安装
[hzz@magedu ~]$ sudo yum install -y system-config-kickstart
# 启动
[hzz@magedu ~]$ system-config-kickstart
启动后界面:

根据选择需要的功能生成 kickstart 配置即可,此处就不多说了。
使用 kickstart 文件安装系统
搞定 kickstart 配置后,就可以使用 ks 选项来指定配置文件安装系统了。比如我用已上传的 kickstart 配置进行安装:



创建 ISO 镜像
虽然我们定制了 kickstart 配置,可以无人值守安装 CentOS。但还是需要手动进入 boot 命令行才能继续操作。能否有一种方式,直接光盘启动就能自动安装的呢?
答案是肯定的,那就是自行创建光盘镜像,把 ks 选项写进 label,并使其默认选定即可。下面就来说说如何创建光盘镜像。
步骤一:创建 MyISO 目录
# 创建 MyISO 目录
[hzz@magedu ~]$ mkdir MyISO
# 拷贝光盘内的 isolinux 到 MyISO 目录并设置可写
[hzz@magedu ~]$ cp -rf /media/isolinux MyISO/
[hzz@magedu ~]$ chmod +w -R MyISO/isolinux/
步骤二:修改 isolinux.cfg 配置
以下是我修改后的内容:
[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
[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 镜像:

启动后显示的菜单界面:

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

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