在 RHEL,CentOS,Fedora 等系统中,安装系统使用的程序名叫 anaconda,它属于 FedoraProject,由 Python 开发,能够提供图形或者文本界面用于系统安装。 Anaconda 安装程序最大的优点是:它可以用一个称之为 Kickstart 的特性进行非交互式脚本安装。Kickstart 脚本是一个用来指定安装要求详情的简单 ASCII 文本文件。该脚本可用常规文本编辑器编写,或用 Kickstart 配置程序来生成。

Kickstart 脚本通常有三个不同的部分。

  • 命令部分
  • 软件包部分
  • 脚本部分

Anaconda 会忽略 Kickstart 脚本中所有以“#”开始的行和空行。

一、Kickstart语法结构

1、命令部分

从文件的最开始直到出现以%packages 开始的行,这一部分都属于命令部分。命令行必须以可识别的关键字开始,并且所有与该关键字有关的参数都必须出现在同一行中。命令部分是用来指定安装程序需要的除软件选项外的所有标准信息。关键字在命令部分可以以任意次序出现。

这部分中一般我们会指定安装源、分区信息、防火墙、用户组等。如下:

 1# 键盘类型设定
 2keyboard us
 3# 语言设定
 4lang en_US
 5# 时区、ntp服务器及硬件时钟设置
 6timezone [--utc] Asia/Shanghai --ntpservers=ntp1.aliyun.com
 7# 系统安装完成后的操作(重启或关机)
 8reboot | poweroff | halt
 9# 是否启用 selinux
10selinux --enforcing | --disabled
11# 系统的认证方式,这里选择密码认证加密算法sha512
12authconfig --useshadow --passalgo=sha512
13# 密码设定,明文或加密后的 root 密码
14rootpw --plaintext 361way  或
15rootpw --iscrypted 密码串
16# 安装/升级 操作系统
17install | upgrade
18# 指明安装源或安装介质,如FTP 或 HTTP 路径
19url --url=....
20# 是否开启防火墙
21firewall --disabled | --enabled --service=ssh,cups
22# 系统第一次启动后是否进行用户配置
23firstboot --disabled | --enabled
24# 安装界面为 文本/图形
25text | graphical
26#允许通过vnc远程查看图形安装
27vnc --password=361way
28# bootloader 的安装位置,这里选择安装至 mbr 中
29bootloader --location=mbr --boot-drive=sda
30# 安装前清除系统的哪些分区,--all 表示清除所有分区
31clearpart  --all --drivers=sda,sdb --initlabel
32# 使用 clearpart --all 时,需要加上这个选项,否则安装过程会被暂停,需要手动选择
33zerombr
34# ignoredisk安装时忽略指定的磁盘
35ignoredisk --drives=sdc
36# 分区设定
37part
38part swap --size=2048                       # 对 swap 进行分区的示例
39part /boot --fstype ext4 --size=100000      # 对 /boot 进行分区的示例
40part pv.01 --size=8192                     # 创建一个 PV
41volgroup vgname pvname                  # 创建 VG
42logval /home --fstype ext4 --name=home --vgname=vgname --size=1024      # 创建一个逻辑卷的示例
43# 网络配置并激活网络设备
44network --drive=eth0 --bootproto=dhcp
45# 默认服务配置
46services --disabled=NetworkManager,ip6tables  --enabled=network,iptables
47# 创建本地用户和组
48group --name=admins --gid=10001
49user --name=ybk --gecos="itybku" --groups=admins --password=test --plaintext
50# 指定安装期间anaconda 将如何进行日志记录
51logging --hosts=www.361way.com --level=info
52#firstboot 确认系统首次启动时是否启动firstboot
53firstboot --disabled
54# 可以将其他文件的内容包含进 kickstart 文件中来,包含的文件必须是安装系统过程中能够访问的
55%include 文件名

2、软件包部分(%packages)

软件包部分是用来指定需要安装的软件。这部分从以%packages 开头的行开始,直到下一个以 “%”字符开始的行为止。这一部分通常采用以下两种格式之一。

1@ Component Name
2package-name

第一种格式是用软件组来指定软件,在这里一定要注意正确拼写软件组名称,并注意大小写。

第二种格式是用来指定要安装的软件包的具体名称。如果%packages 行包含额外的–resolvedeps 参数,那么也会安装解决相依性的软件包。

注:使用小横线(-)开头指定安装中不使用的软件包或组

示例如下:

 1%packages
 2@base
 3@core
 4@chinese-support
 5@fonts
 6chrony
 7rsync
 8grub2
 9firewalld
10-NetworkManager
11-autofs

3、脚本部分

脚本部分又分为预安装脚本(pre)及安装后脚本(post)两部分。这部分必须以%pre或%post开头,以%end结尾。两者顺序是没有关系的。有一点不同的是:预安装脚本不会在 chroot 环境中运行。

官方文档中拿磁盘分区部分做为了这部分的示例,这里我发现一个更合适的例子 --- swap 分区设定。交换分区一般需要通过物理内存大小去定义 ,可以将该部分写入%pre 部分。如下:

%pre 表示安装前脚本,此时的 Linux 系统环境为微缩版环境,脚本应尽可能简单。这里的脚本通常用于查询一些系统信息,然后根据这些信息动态的设定安装配置

 1%pre
 2# 设置分区的配置,配置 swap 大小为和 内存大小一样
 3#!/bin/sh
 4act_mem=`cat /proc/meminfo | grep MemTotal | awk '{printf("%d",$2/1024)}'`
 5echo "" > /tmp/partition.ks
 6echo "clearpart --all --initlabel" >> /tmp/partition.ks
 7echo "part /boot --fstype=ext3 --asprimary --size=200" >> /tmp/partition.ks
 8echo "part swap --fstype=swap --size=${act_mem}" >> /tmp/partition.ks
 9echo "part / --fstype=ext3 --grow --size=1" >> /tmp/partition.ks
10%end
11%include /tmp/partitions.ks

%post 表示安装后脚本,此时的 Linux 系统环境为已经安装完成的系统。这里的脚本可以进行一些系统安装后配置,如公钥注入,仓库配置,第三方软件安装,系统服务配置文件修改等。这里举个简单的示例:

 1%post  --erroronfail
 2rm -f /etc/udev/rules.d/70*
 3cat > /etc/sysconfig/network-scripts/ifcfg-eth0 <<EOF
 4DEVICE=eth0
 5ONBOOT=yes
 6BOOTPROTO=static
 7IPADDR=10.144.189.71
 8NETMASK=255.255.240.0
 9EOF
10%end

二、ks文件生成验证及其他

1、ks.cfg文件的生成

ks.cfg 文件直接去写可能会感觉比较麻烦,不过系统为我们提供了两种快捷的方法得到该文件。

方法1:自定义安装好的OS /root目录下会有anaconda-ks.cfg 文件生成,直接可以复制一份该文件进行编辑;

方法2:使用图形化GUI 程序生成该配置文件。redhat/centos上有一个system-config-kickstart 包,安装好后启动5 level下打开该程序,可以傻瓜式的下一步下一步自定义生成该文件。

注: A、一般人我不告诉他---在没有图形化下也可以通过以下终端命令生成ks.cfg文件,不过下面的方法生成的ks 文件同样是基本当前主机的配置生成的(运行一段时间或安装过其他包后,生成的配置比/root/anaconda-ks.cfg 内容要多)。

1[root@361way ~]# system-config-kickstart  --generate /tmp/test.cfg

B、system-config-kickstart 不支持生成高级ks配置,如LVM 、软RAID等。

2、ks文件的验证

yum 源里有一个python写的工具包pykickstart ,其中包含了几个比较有用的工具 ,其中就包含对ks语法验证工具ksvalidator ,具体示例如下:

1[root@361way ~]# ksvalidator /tmp/anaconda-ks.cfg
2kickstart文件的第16 行发生问题:
3Unknown command: netwrk

上面的配置文件中network 部分我去掉了一个字母o ,其就会提到在某一行发生了什么错误。如果执行后无任何输出,表示该文件无语法错误。

3、rhel 7相对于rhel 6 的变化

由于rhel7 相对于之前的版本做了很大的变化,kickstart 文件的语法也在一些方面做了变动。不同不必担心的是。pykickstart 工具包中的ksverdiff 可以帮助我们了解两者的区别,如下:

 1[root@361way ~]# ksverdiff --help
 2Usage: ksverdiff [options]
 3Options:
 4  -h, --help      show this help message and exit
 5  -f F, --from=F
 6  -t T, --to=T
 7[root@361way ~]# ksverdiff -f rhel6 -t rhel7
 8以下命令在 rhel7 中被移除:
 9monitor interactive
10以下命令在 rhel7 中不推荐:
11upgrade
12以下命令在 rhel7 中被添加:
13btrfs realm eula liveimg
14以下选项添加到 logvol ,在 rhel7 中:
15--metadatasize --thin --thinpool --chunksize --label --resize --poolname
16以下选项从 logvol 中移除,在 rhel7:
17--bytes-per-inode
18以下选项添加到 firewall ,在 rhel7 中:
19--remove-service
20以下选项从 firewall 中移除,在 rhel7:
21--telnet
22……………………省略

4、常用项总结

kickstart 可配置项虽然比较多,但大部分在企业使用场景中是固定不变的,我们一般安装时需要关注的几个比较重要的配置部分是:

 1%packages
 2auth
 3url
 4%post
 5clearpart
 6services
 7rootpw
 8part
 9timezone
10network

三、利用ks文件安装

我在之前的 kvm虚拟化小结(三)guest安装 篇中就已经提到过使用ks 文件进行安装的示例,这里还是以kvm 中安装虚拟机为例,可以以下引用ks部分,自动化完成OS的安装。

1virt-install -n rhce --hvm -r 2048  \
2--vcpus=2 --os-type linux --os-variant=rhel7 \
3--network bridge=br0 --nographics \
4--location='http://192.168.0.102/centos7' \
5--extra-args='ks=http://192.168.0.102/kvm_rhel7.ks ksdevice=eth0 ip=192.168.0.120 netmask=255.255.255.0 dns=8.8.8.8 gateway=192.168.0.1 text console=tty0 console=ttyS0,115200n8 serial' \
6--disk path=/data/img/rhce/centos7.img,size=30

当然实际应用中,并不局限于虚拟机的安装 ,同样适用于物理机的安装。而且在很多像cobbler之类的自动化安装方案中也是通过对ks的二次封装搞出的解决方案。

参考页面:

RHEL7 kickstart 文档
fedora Anaconda项目wiki页