Kickstart无人值守安装CentOS6.8

要想同时上线几十甚至上百台服务器,在短时间内完成系统安装,如果通过光驱、U盘的方式逐台安装,不仅效率低,也不利于维护。

Kickstart 是一种无人值守的安装方式。它的工作原理是在安装过程中记录人工干预填写的各种参数,并生成一个名为 ks.cfg 的文件。如果在自动安装过程中出现要填写参数的情况,安装程序首先会去查找 ks.cfg 文件,如果找到合适的参数,就采用所找到的参数;如果没有找到合适的参数,便会弹出对话框让安装者手工填写。所以,如果 ks.cfg 文件涵盖了安装过程中所有需要填写的参数,那么安装者完全可以只告诉安装程序从何处下载 ks.cfg 文件,然后就去忙自己的事情。等安装完毕,安装程序会根据 ks.cfg 中的设置重启/关闭系统,并结束安装。

题外话:

  • Cobbler 集中和简化了通过网络安装操作系统需要使用到的 DHCP、TFTP 和 DNS 服务的配置,它不仅有一个命令行界面,还提供了一个 Web 界面,大大降低了使用者的入门水平。

  • 简单地说,Cobbler 是对 Kickstart 的封装,简化安装步骤、使用流程,降低使用者的门槛

PXE

什么是PXE?

  • PXE(Pre-boot Execution Environment,预启动执行环境)是由 Intel 公司开发的最新技术,工作于 Client/Serve r的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统。

  • 通过网络接口启动计算机,不依赖本地存储设备(如硬盘)或本地已安装的操作系统。

  • 在启动过程中,PXE 客户端会调用网际协议(IP)、用户数据报协议(UDP)、动态主机设定协议(DHCP)、小型文件传输协议(TFTP)等网络协议。

  • 终端要求服务器分配IP地址,再用 TFTP(trivial file transfer protocol)或 MTFTP(multicast trivial file transfer protocol) 协议下载一个启动软件包到本机内存中执行,由这个启动软件包完成终端基本软件设置,从而引导预先安装在服务器中的终端操作系统。

  • 严格来说,PXE 并不是一种安装方式,而是一种引导方式。进行 PXE 安装的必要条件是在要安装的计算机中必须包含一个 PXE 支持的网卡(NIC),即网卡中必须要有 PXE Client。PXE 协议可以使计算机通过网络启动。此协议分为 Client端 和 Server 端,而 PXE Client 则在网卡的 ROM 中。当计算机引导时,BIOS 把 PXE Client 调入内存中执行,然后由 PXE Client 将放置在远端的文件通过网络下载到本地运行。运行 PXE 协议需要设置 DHCP 服务器和 TFTP 服务器。DHCP 服务器会给 PXE Client(将要安装系统的主机)分配一个 IP 地址,由于是给 PXE Client 分配 IP 地址,所以在配置 DHCP 服务器时需要增加相应的 PXE 设置。此外,在 PXE Client 的 ROM 中,已经存在了 TFTP Client,那么它就可以通过 TFTP 协议到 TFTP Server 上下载所需的文件了。

  • PXE 技术与 RPL 技术不同之处为 RPL 是静态路由,PXE 是动态路由。RPL 是根据网卡上的ID号加上其他记录组成的一个 Frame(帧)向服务器发出请求。而服务器中已有这个ID数据,匹配成功则进行远程启动。PXE 则是根据服务器端收到的工件站MAC地址,使用DHCP 服务为这个MAC地址指定一个IP地址。每次启动可能同一台工作站有与上次启动有不同的IP,即动态分配地址。

PXE工作过程

1、PXE Client 向 DHCP 发送请求

PXE Client开机后,PXE BootROM(自启动芯片)获得控制权之前执行自我测试,然后以UDP发送一个广播请求(FIND帧) ,向本网络中的DHCP服务器索取IP;

2、DHCP服务器提供信息

DHCP 收到客户端的请求,送回DHCP响应应,包括用户端的IP地址、预设通信通道、PXE文件的放置位置(一般放在一台TFTP服务器上) 以及开机映像文件;

3、 PXE客户端请求下载启动文件

  • 客户端收到服务器发回的响应后则会回应一个帧,以请求传送启动所需文件,并把自己的MAC地址写到服务器端的Netnames.db文件中。
  • 启动所需文件包含:pxelinux.0、pxelinux.cfg / default、vmlinuz、initrd.img等文件。

4、Boot Server响应客户端请求并传送文件

  • 当服务器收到客户端的请求后,他们之间之后将有更多的信息在客户端与服务器之间作应答, 用以决定启动参数。
  • BootROM基于TFTP通讯协议从Boot Server下载启动安装程序所必须的文件(pxelinux.0、pxelinux.cfg / default)。default文件下载完成后,会根据该文件中定义的引导顺序,启动Linux安装程序的引导内核。

5、请求下载自动应答文件

客户端通过pxelinux.cfg / default文件成功的引导Linux安装内核后,安装程序首先必须确定你通过什么安装介质来安装linux,如果是通过网络安装(NFS, FTP, HTTP),则会在这个时候初始化网络,并定位安装源位置。接着会读取default文件中指定的自动应答文件ks.cfg所在位置,根据该位置请求下载该文件。

注意: 在第2步和第5步初始化2次网络,这是由于PXE获取的是安装用的内核以及安装程序等,而安装程序要获取的是安装系统所需的二进制包以及配置文件。因此PXE模块和安装程序是相对独立的,PXE的网络配置并不能传递给安装程序,从而进行两次获取IP地址过程,但IP地址在DHCP的租期内是一样的。

6、客户端安装操作系统

将ks.cfg文件下载回来后,通过该文件找到OS Server,并按照该文件的配置请求下载安装过程需要的软件包。
OS Server和客户端建立连接后,将开始传输软件包,客户端将开始安装操作系统。安装完成后,将提示重新引导计算机。

PXE + Kickstart 配置并安装系统

流程图

系统服务器 OS Server 可以使用 http、nfs、ftp 服务器,此处使用 http 作为系统文件下载服务器。

系统环境

虚拟机:VMware® Workstation 12 Pro
系统:CentOS release 6.8

1
2
service iptables stop
setenforce permissive

网络环境

  • 虚拟机 NAT 模式的地址段 192.168.247.0 255.255.255.0,可以在虚拟网络编辑器自定义。

  • DHCP、TFTP、HTTP 均安装在一台服务器,IP地址为 192.168.247.6,网络模式为 NAT

注意:

  • 虚拟机网卡采用NAT模式,不要使用桥接模式,因为后续会搭建DHCP服务器,在同一局域网多个DHCP服务会有冲突。

  • VMware的NAT模式的dhcp服务也关闭,避免干扰。

    • “编辑” - “虚拟网络编辑器” - “使用本地DHCP服务将IP地址分配给虚拟机”,将其关闭
  • 基本设置完成后,可以在 Windows 物理机中看到 VMware Network Adapter VMnet8 的网卡上的IP为192.168.247.1,子网掩码是 255.255.255.0,此网卡作为本子网的网关。

DHCP配置

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
yum -y install dhcp
# 安装DHCP

\cp -arf /usr/share/doc/dhcp-4.?.?/dhcpd.conf.sample /etc/dhcp/dhcpd.conf
# 清注意,问号区域视dhcp版本而定

cp /etc/dhcp/dhcpd.conf{,.bak};
cat >| /etc/dhcp/dhcpd.conf << 'EOF'
ddns-update-style interim;
ignore client-updates;
allow booting; # 定义能够PXE启动
allow bootp; # 定义支持bootp
subnet 192.168.247.0 netmask 255.255.255.0 {
range 192.168.247.100 192.168.247.200; # 可分配的起始IP-结束IP
option subnet-mask 255.255.255.0; # 子网掩码
option routers 192.168.247.1; # 设置路由器地址(网关)
default-lease-time 21600; # 设置默认的IP租用期限
max-lease-time 43200; # 设置最大的IP租用期限
filename "pxelinux.0"; # 告知客户端从TFTP根目录下载pxelinux.0文件
next-server 192.168.247.6; # 告知客户端TFTP服务器的ip ,此处为本机IP
}
EOF
# 配置dchpd

sed -i 's@\(DHCPDARGS=\).*@\1eth0@' /etc/sysconfig/dhcpd
# 绑定网卡

/etc/init.d/dhcpd start
# 服务启动

chkconfig dhcpd on
# 添加开机启动

TFTP配置

TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为 69 。

1
2
3
4
5
6
7
8
9
10
11
yum -y install tftp-server
# 安装

sed -ri 's#(disable( |\t)+= ).*#\1no#' /etc/xinetd.d/tftp
# 将disable后的值改为no

/etc/init.d/xinetd restart
chkconfig xinetd on
# 因为tftp服务是挂载在超级进程xinetd 下的,所以通过启动xinetd 来启动tftp服务。

netstat -unlpt | grep --color 69

HTTP配置

可以用 Apache 或 Nginx 提供 HTTP 服务。Python 的模块 web 服务会有报错,不建议采用。

1
2
3
4
5
6
7
8
yum -y install httpd
# 安装

/etc/init.d/httpd start
# 启动

chkconfig --level 2345 httpd on
# 添加开机自启

OS Server

准备 CentOS 6.8 的镜像,插入服务器,拷贝系统安装文件。

1
2
3
4
5
install -cdv /mnt/cdrom
mount -r /dev/cdrom /mnt/cdrom

df -h
cp -r /mnt/cdrom /var/www/html/CentOS-6.8

浏览器访问 http://192.168.247.6/CentOS-6.8/ 检验配置是否正确。

配置 PXE 启动程序

syslinux 是一个功能强大的引导加载程序,而且兼容各种介质。它是一个小型的 Linux 操作系统,它的目的是简化首次安装 Linux 的时间,并建立修护或其它特殊用途的启动盘。如果没有找到 pxelinux.0 这个文件,可以安装一下。

1
2
3
4
5
6
7
8
9
10
11
12
yum -y install syslinux
# 安装

cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
# 复制启动菜单程序文件

cp -a /var/www/html/CentOS-6.8/isolinux/* /var/lib/tftpboot/
ls /var/lib/tftpboot/

mkdir -p /var/lib/tftpboot/pxelinux.cfg
cp -a /var/www/html/CentOS-6.8/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
# 新建一个 pxelinux.cfg 目录,存放客户端的配置文件

pxe的配置文件default参数配置

1
vim /var/lib/tftpboot/pxelinux.cfg/default

配置后的文件内容

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
default linux    # 默认启动的是 'label linux' 中标记的启动内核
prompt 1 # 开启会显示命令行'boot: '提示符。prompt值为0时则不提示,将会直接启动'default'参数中指定的内容。
timeout 30 # timeout时间是引导时等待用户手动选择的时间,设为1可直接引导,单位为1/10秒。
display boot.msg
# 菜单背景图片、标题、颜色。
menu background splash.jpg
menu title Welcome to CentOS 6.8!
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指定在boot:提示符下输入的关键字,比如boot:linux[ENTER],这个会启动label linux下标记的kernel和initrd.img文件。
label linux # 一个标签就是前面图片的一行选项。
menu label ^Install or upgrade an existing system
menu default
kernel vmlinuz # 指定要启动的内核。同样要注意路径,默认是/var/lib/tftpboot目录。
append ks=http://192.168.247.6/CentOS-6.8/ks.cfg initrd=initrd.img ksdevice=eth0
# 指定追加给内核的参数,告诉系统,从哪里获取ks.cfg文件
# initrd.img是一个最小的linux系统.
# 如果有多张网卡,默认会弹出让你选择需要从哪张网卡获取,导致无法实现全自动化,使用ksdevice指定默认网卡
label vesa
menu label Install system with ^basic video driver
kernel vmlinuz
append initrd=initrd.img 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 -

ks.cfg

通常,在安装操作系统的过程中,需要大量的和服务器交互操作,为了减少这个交互过程,Kickstart 就诞生了。使用这种 Kickstart,只需事先定义好一个 Kickstart 自动应答配置文件 ks.cfg(通常存放在安装服务器上),并让安装程序知道该配置文件的位置,在安装过程中安装程序就可以自己从该文件中读取安装配置,这样就避免了在安装过程中多次的人机交互,从而实现无人值守的自动化安装。

生成 Kickstart 配置文件的三种方法

  • 每安装好一台 CentOS 机器,CentOS 安装程序都会创建一个 Kickstart 配置文件,记录你的真实安装配置(生成的文件 /root/anaconda-ks.cfg)。如果你希望实现和某系统类似的安装,可以基于该系统的 Kickstart 配置文件来生成你自己的 Kickstart 配置文件。
  • CentOS 提供了一个图形化的 Kickstart 配置工具。在任何一个安装好的 Linux 系统上运行该工具,就可以很容易地创建你自己的 Kickstart 配置文件。Kickstart 配置工具命令为 redhat-config-kickstart (RHEL3)或 system-config-kickstart (RHEL4,RHEL5)。网上有很多用 CentOS 桌面版生成 ks 文件的文章。
  • 阅读 Kickstart 配置文件的手册。用任何一个文本编辑器都可以创建你自己的 Kickstart 配置文件。

ks.cfg文件组成

命令段:键盘类型,语言,安装方式等系统的配置,有必选项和可选项,如果缺少某项必选项,安装时会中断并提示用户选择此项的选项

软件包段:在安装过程中默认安装的软件包,安装软件时会自动分析依赖关系。

1
2
3
4
5
6
%packages
@compat-libraries
@development
# @groupname:指定安装的包组
# package_name:指定安装的包
# -package_name:指定不安装的包

脚本段(可选)

1
2
3
4
5
%pre
# 安装系统前执行的命令或脚本(由于只依赖于启动镜像,支持的命令很少)

%post
# 安装系统后执行的命令或脚本(基本支持所有命令)

这里使用 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
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# Kickstart file automatically generated by anaconda.
# CentOS 6.8
# Platform=x86, AMD64, or Intel EM64T

#version=DEVEL

firstboot --disable

# Firewall configuration
firewall --disabled

# Install OS instead of upgrade
install

# Use text mode install
#text
# 6.X系统可能文本模式安装导致初始化失败,此项注释

# Use graphical install
graphical

# Use network installation
url --url="http://192.168.247.6/CentOS-6.8"
# 这个选项告诉安装程序:到服务器192.168.247.6 的HTTP根目录下的CentOS-6.8目录下寻找安装介质

# System language
lang en_US.UTF-8

# System keyboard
keyboard us

# System timezone
timezone Asia/Shanghai

# Network information
network --onboot no --device eth0 --bootproto dhcp --noipv6

# Root password
rootpw --iscrypted $6$ZE3J70TVR5F1LApI$N.4/XjFTpzcwe3fdbBda4RACxjJWNcBZ0WWe57goL2prx1xjk0ayhVL42uEVdyh5A1tu0BMqUb7/UjEk4QJhX0

# System authorization information
auth --useshadow --passalgo=sha512

# Do not configure the X Window System
skipx

# SELinux configuration
selinux --disabled

# Installation logging level
logging --level=info

# Reboot after installation
reboot
# 此选项必须存在,也必须文中设定位置,不然kickstart显示一条消息,并等待用户按任意键后才重新引导;

# System bootloader configuration
bootloader --location=mbr --password="hehedadada"
key --skip
# 如果是红帽系统,此选项可以跳过输入序列号过程;如果是CentOS 系列,则可以不保留此项内容;

# Clear the Master Boot Record
zerombr

# Partition clearing information
clearpart --all --initlabel
# 此条命令必须添加,不然系统会让用户手动选择是否清除所有数据,这就需要人为干预了,从而导致自动化过程失败;

# Disk partitioning information
part /boot --asprimary --fstype="ext4" --size=500
part swap --fstype="swap" --size=2048
part / --asprimary --fstype="ext4" --grow --size=1

%packages
@base
@compat-libraries
@development
vim-enhanced
bind-utils
ntpdate
nmap
tcpdump
dos2unix

%post
# 禁用 ctrl+alt+del
/bin/sed -ri 'sSexec /sbin/shutdown -r now.*S#&Sg' /etc/init/control-alt-delete.conf

# 关闭 IPv6
if test -s /etc/modprobe.conf;then
/bin/sed -ri 's#(^options ipv6 disable=).*#\11#;s#(^alias net-pf-10 ).*#\1off#' /etc/modprobe.conf;
else
{
/bin/cat >>/etc/modprobe.conf <<- 'EOF'
options ip_conntrack hashsize=65536
options ipv6 disable=1
alias net-pf-10 off
EOF
}
fi
/sbin/chkconfig ip6tables off

# 禁用Zero Configuration Network
# 当系统无法连接DHCP server的时候,就会尝试通过ZEROCONF来获取IP,并添加一条169.254.0.0/16的路由条目
Netwfile="/etc/sysconfig/network"
if /bin/fgrep -q 'NOZEROCONF=' ${Netwfile};then
/bin/sed -ri 's#(NOZEROCONF=).*#\1yes#' ${Netwfile}
else
echo 'NOZEROCONF=yes' >> ${Netwfile}
fi

# 禁用sshd使用DNS功能
/bin/egrep -q '^UseDNS no' /etc/ssh/sshd_config || /bin/sed -ri '/#UseDNS /aUseDNS no' /etc/ssh/sshd_config

# 对grep系列命令添加别名,支持颜色高亮显示
echo "alias grep='grep --color'" >> /root/.bashrc;
echo "alias egrep='egrep --color'" >> /root/.bashrc;
echo "alias fgrep='fgrep --color'" >> /root/.bashrc;

# 记录bash历史命令的执行时间
time='HISTTIMEFORMAT="%Y-%m-%d\ %H:%M:%S "'
if /bin/egrep -qs "${time}" /etc/profile;then
:
else
/bin/sed -ri '/export PATH USER.*HISTSIZE/a'"${time}"'\nexport HISTTIMEFORMAT' /etc/profile
fi

# 启用vim的语法高亮
/bin/egrep -q '^syntax' /root/.vimrc || echo 'syntax on' >> /root/.vimrc

# 关闭不常用服务
for i in `/sbin/chkconfig --list | /bin/awk '/2:on/{if($1~/apmd|crond|network|snmpd|sshd|syslog/){}else{print $1}}'`;do
/sbin/chkconfig --level 2345 ${i} off
done
unset i

/bin/sed -r -i 's/(^id:)./\12/' /etc/inittab


%end

注意事项

  • 保证网络配置正常,避免发生网络冲突(比如虚拟机使用本网段的第二个地址作为tftp服务器有可能导致tftp无法响应客户端)
  • iptables 均为关闭状态
  • 安装模式最好保持默认(某些系统使用文本模式安装将导致失败)
  • 确保配置了自动清除分区的参数
  • 如果有多网卡环境的待安装服务器,pxelinux.cfg/default 中要使用 ksdevice 选择默认网卡
  • 确保 selinux 状态 setenforce 0

ks.cfg文件参数

关键字 含义
install 告知安装程序,这是一次全新安装,而不是upgrade(升级)
url --url="http://192.168.247.6/CentOS-6.8/" 通过HTTP从远程服务器上的安装树中安装。
url --url ftp://<username>:<password>@<server>/<dir> 通过FTP从远程服务器上的安装树中安装。
nfs --server=nfsserver.example.com --dir=/tmp/install-tree 从指定的NFS服务器安装
text 使用文本模式安装
lang 设置在安装过程中使用的语言以及系统的缺省语言。lang en_US.UTF-8
keyboard 设置系统键盘类型。keyboard us
zerombr 清除mbr引导信息。
bootloader bootloader --location=mbr --driveorder=sda --append=”crashkernel=auto rhgb quiet”
--location= 指定引导记录被写入的位置.有效的值如下:mbr(缺省),partition(在包含内核的分区的第一个扇区安装引导装载程序)或none(不安装引导装载程序)。
--driveorder,指定在BIOS引导顺序中居首的驱动器。
--append=,指定内核参数.要指定多个参数,使用空格分隔它们。
network 为通过网络的kickstart安装以及所安装的系统配置联网信息。
network --bootproto=dhcp --device=eth0 --onboot=yes --noipv6 --hostname=CentOS6 --bootproto=[dhcp/bootp/static]中的一种,缺省值是dhcp。bootp和dhcp被认为是相同的。
static方法要求在kickstart文件里输入所有的网络信息。
network --bootproto=static --ip=10.0.0.100 --netmask=255.255.255.0 --gateway=10.0.0.2 --nameserver=10.0.0.2
请注意所有配置信息都必须在一行上指定,不能使用反斜线来换行。
--ip=,要安装的机器的IP地址.
--gateway=,IP地址格式的默认网关.
--netmask=,安装的系统的子网掩码.
--hostname=,安装的系统的主机名.
--onboot=,是否在引导时启用该设备.
--noipv6=,禁用此设备的IPv6.
--nameserver=,配置dns解析.
timezone 设置系统时区 timezone Asia/Shanghai
authconfig 系统认证信息。authconfig --enableshadow --passalgo=sha512 设置密码加密方式为sha512 启用shadow文件。
rootpw root密码
clearpart 清空分区。clearpart --all --initlabel --all 从系统中清除所有分区--initlable 初始化磁盘标签
part 磁盘分区。
part /boot --fstype=ext4 --asprimary –size=500
part swap --size=2048
part / --fstype=ext4 --grow --asprimary --size=200
--fstype=,为分区设置文件系统类型.有效的类型为ext2,ext3,ext4,swap和vfat。
--asprimary,强迫把分区分配为主分区,否则提示分区失败。
--size=,以MB为单位的分区最小值.在此处指定一个整数值,如500.不要在数字后面加MB。
--grow,告诉分区使用所有可用空间(若有),或使用设置的最大值。
selinux 关闭selinux。selinux –disabled
firewall 关闭防火墙。firewall –disabled
logging 设置日志级别。logging --level=info

参考文档:

有钱任性,请我吃包辣条
0%