005-(已测试成功的方案)kickstart模式实现批量安装centos7.x系统
1.1 安装系统的方法
l 光盘(ISO文件,光盘的镜像文件)===>>每一台物理机都得给一个光驱,如果用外置光驱的话,是不是每台机器都需要插一下
l U盘:ISO镜像刻录到U盘==>>需要每台机器都需要插一下
l 并行安装==>>网络安装
l 自动化安装
1.2 linux下批量安装系统
kickstart是RedHat公司开源的软件,所以对CentOS兼容性最好。
原理:
我们将手动安装的所有的详细步骤记录到一个文件中,然后kickstart通过读取这个文件就可以实现自动化安装系统。
kickstart是一个项目的名称。没有这个软件。使用者水平是高中以上
cobbler是对kickstart的所有组件的封装。使用者水平是初中以上。本质上就是网页版本的kickstart。
1.2.1 PXE说明
PXE,全名Pre-boot Execution Environment,预启动执行环境;
通过网络接口启动计算机,不依赖本地存储设备(如硬盘)或本地已安装的操作系统;
由Intel和Systemsoft公司于1999年9月20日公布的技术;
客户端/Server的工作模式;
PXE客户端会调用网际协议(IP)、用户数据报协议(UDP)、动态主机设定协议(DHCP)、小型文件传输协议(TFTP)等网络协议;
PXE客户端(客户端)这个术语是指机器在PXE启动过程中的角色。一个PXE客户端可以是一台服务器、笔记本电脑或者其他装有PXE启动代码的机器(我们电脑的网卡)
1.2.2 kickstart原理
1.2.3 PXE请求顺序说明
① PXE 客户端发送UDP广播请求
PXE 客户端从自己的PXE网卡启动,通过PXE BootROM(自启动芯片)会以UDP(简单用户数据报协议)发送一个广播请求,向本网络中的DHCP服务器索取IP。
② DHCP服务器提供信息
DHCP服务器收到客户端的请求,验证是否来至合法的PXE 客户端的请求,验证通过它将给客户端一个“提供”响应,这个“提供”响应中包含了为客户端分配的IP地址、pxelinux启动程序(TFTP)位置,以及配置文件所在位置。
③ PXE客户端请求下载启动文件
客户端收到服务器的“回应”后,会回应一个帧,以请求传送启动所需文件。这些启动文件包括:pxelinux.0、pxelinux.cfg/default、vmlinuz、initrd.img等文件。
④ TETP服务器响应客户端请求并传送文件
当服务器收到客户端的请求后,他们之间之后将有更多的信息在客户端与服务器之间作应答, 用以决定启动参数。BootROM由TFTP通讯协议从tftp服务器 下载启动安装程序所必须的文件(pxelinux.0、pxelinux.cfg/default)。default文件下载完成后,会根据该文件中定义的引导顺序,启动Linux安装程序的引导内核。
⑤ 请求下载自动应答文件
客户端通过pxelinux.cfg/default文件成功的引导Linux安装内核后,安装程序首先必须确定你通过什么安装介质来安装linux,如果是通过网络安装(NFS, FTP, HTTP),则会在这个时候初始化网络,并定位安装源位置。接着会读取default文件中指定的自动应答文件ks.cfg所在位置,根据该位置请求下载该文件。
⑥ 客户端安装操作系统
将ks.cfg文件下载回来后,通过该文件找到http镜像,并按照该文件的配置请求下载安装过程需要的软件包。
http镜像和客户端建立连接后,将开始传输软件包,客户端将开始安装操作系统。
安装完成后,将提示重新引导计算机。
1.3 kickstart批量安装系统实践
一般批量安装操作系统最好一次安装23台机器最佳,主要因为大部分交换机为24口,安装23台服务器没有太大的压力
1.3.1 环境说明
防火墙与selinux必须关闭。
[root@kickstart ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [root@kickstart ~]# uname -r 3.10.0-693.el7.x86_64 [root@kickstart ~]# getenforce Disabled [root@kickstart ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1) [root@kickstart ~]# hostname -I 10.0.0.201 192.168.1.230
1.3.2 第一个里程碑:安装dhcp服务
安装
yum install dhcp -y
配置DHCP服务
cat >>/etc/dhcp/dhcpd.conf<<EOF subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.240 192.168.1.252; option subnet-mask 255.255.255.0; default-lease-time 21600; max-lease-time 43200; next-server 192.168.1.230; filename "/pxelinux.0"; } EOF
配置文件说明:
range 192.168.1.240 192.168.1.252; # 可分配的起始IP-结束IP option subnet-mask 255.255.255.0; # 设定netmask default-lease-time 21600; # 设置默认的IP租用期限 max-lease-time 43200; # 设置最大的IP租用期限 next-server 192.168.1.230; # 告知客户端TFTP服务器的ip filename "/pxelinux.0"; # 告知客户端从TFTP根目录下载pxelinux.0文件
启动DHCP服务
[root@kickstart ~]# systemctl start dhcpd.service [root@kickstart ~]# systemctl status dhcpd.service ● dhcpd.service - DHCPv4 Server Daemon
检测端口信息
[root@kickstart ~]# netstat -lntup |grep dhcpd udp 0 0 0.0.0.0:43679 0.0.0.0:* 2090/dhcpd udp 0 0 0.0.0.0:67 0.0.0.0:* 2090/dhcpd udp6 0 0 :::58101 :::* 2090/dhcpd
查看其日志信息: (日志位置为/var/log/messages)
[root@kickstart ~]# tailf /var/log/messages Nov 13 19:01:40 clsn dhcpd: Listening on PF/eth1/00:0c:29:a8:59:b2/172.16.1.0/24 Nov 13 19:01:40 clsn dhcpd: Sending on LPF/eth1/00:0c:29:a8:59:b2/172.16.1.0/24 Nov 13 19:01:40 clsn dhcpd: Nov 13 19:01:40 clsn dhcpd: No subnet declaration for eth0 (10.0.0.201). Nov 13 19:01:40 clsn dhcpd: ** Ignoring requests on eth0. If this is not what Nov 13 19:01:40 clsn dhcpd: you want, please write a subnet declaration Nov 13 19:01:40 clsn dhcpd: in your dhcpd.conf file for the network segment Nov 13 19:01:40 clsn dhcpd: to which interface eth0 is attached. **
注:配置dhcp的时候是可以配置监听的网卡,指定监听网卡
DHCPDARGS=eth1 # 指定监听网卡
1.3.3 创建一个新的空白虚拟机
说明:Centos7.3之后安装系统至少需要2G内存,低于2G将无法安装
开启虚拟机
日志输出
Nov 13 19:01:40 clsn dhcpd: Sending on Socket/fallback/fallback-net Nov 13 19:01:40 clsn systemd: Started DHCPv4 Server Daemon. Nov 13 19:12:16 clsn dhcpd: DHCPDISCOVER from 00:0c:29:64:7b:09 via eth1 Nov 13 19:12:17 clsn dhcpd: DHCPOFFER on 172.16.1.120 to 00:0c:29:64:7b:09 via eth1 Nov 13 19:12:18 clsn dhcpd: DHCPREQUEST for 172.16.1.120 (172.16.1.201) from 00:0c:29:64:7b:09 via eth1 Nov 13 19:12:18 clsn dhcpd: DHCPACK on 172.16.1.120 to 00:0c:29:64:7b:09 via eth1 Nov 13 19:12:54 clsn kernel: perf: interrupt took too long (6342 > 6262), lowering kernel.perf_event_max_sample_rate to 31000
1.3.4 安装tftp服务
安装tftp软件
[root@kickstart ~]# yum install tftp-server -y
[root@linux-node1 ~]# vim /etc/xinetd.d/tftp
# default: off
# description: The tftp server serves files using the trivial file transfer \
# protocol. The tftp protocol is often used to boot diskless \
# workstations, download configuration files to network-aware printers, \
# and to start the installation process for some operating systems.
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot # 指定目录,保持默认,不用修改
disable = no # 由原来的yes改为no
per_source = 11
cps = 100 2
flags = IPv4
}
启动服务
[root@kickstart ~]# systemctl start tftp.socket [root@kickstart ~]# systemctl status tftp.socket
tftp根目录
[root@kickstart ~]# cd /var/lib/tftpboot/
再次启动虚拟机
启动发现又tftp但是没找到要加载的系统。上面报错是在TFTP服务的根目录找不到启动文件pxelinux.0
1.3.5 获取pxelinux.0系统
通过安装软件获得
[root@kickstart tftpboot]# yum install -y syslinux
复制pxelinux.0文件到tftp根目录
[root@kickstart tftpboot]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/ [root@kickstart tftpboot]# ls pxelinux.0
首先排除最简单故障原因:selinux是否关闭,防火墙是否关闭
上面的错误是因为pxelinux.0这个小系统的配置文件(default)不存在,或者文件名不对
1.3.6 添加pxelinux.0配置文件
1)给虚拟机添加上centos7的镜像,注意实在kickstart服务端添加
2)将镜像挂载上
特别说明:由于这是测试环境可以使用挂载,在生产环境中必须把镜像中的文件复制到硬盘上,光驱速度太慢。
mkdir -p /var/www/html/CentOS7 mount /dev/cdrom /var/www/html/CentOS7
3)将镜像中的相关文件复制到tftp根目录
cp -a /var/www/html/CentOS7/isolinux/* /var/lib/tftpboot/ mkdir -p /var/lib/tftpboot/pxelinux.cfg cp /var/www/html/CentOS7/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
4)修改default配置文件实现通过网络安装操作系统
CentOS7.X 网络安装的关键点,修改default文件
修改完成后,重启pxe客户端,就会有安装界面,与使用光盘安装一致,这里就不是做详细的记录了。注意实现网路安装需要将下一步完成(配置http服务)。
5)CentOS7实现自动化安装的default文件
[root@kickstart ~]# cat /var/lib/tftpboot/pxelinux.cfg/default default ks prompt 0 label ks kernel vmlinuz append initrd=initrd.img ks=http://192.168.1.230/ks_config/CentOS7-ks.cfg net.ifnames=0
1.3.7 配置httpd服务
安装apache服务
[root@kickstart tftpboot]# yum install httpd -y
启动apache服务
[root@kickstart tftpboot]# systemctl start httpd.service [root@kickstart tftpboot]# systemctl status httpd.service ● httpd.service - The Apache HTTP Server
通过浏览器访问,使用curl命令镜像访问。
http://192.168.1.230/CentOS7/ curl http://192.168.1.230/CentOS7/
1.4 ks文件说明
1.4.1 ks文件的作用
通常,我们在安装操作系统的过程中,需要大量的和服务器交互操作,为了减少这个交互过程,kickstart就诞生了。使用这种kickstart,只需事先定义好一个Kickstart自动应答配置文件ks.cfg(通常存放在安装服务器上),并让安装程序知道该配置文件的位置,在安装过程中安装程序就可以自己从该文件中读取安装配置,这样就避免了在安装过程中多次的人机交互,从而实现无人值守的自动化安装。
1.4.2 ks文件生成的三种方式
方法1
每安装好一台Centos机器,Centos安装程序都会创建一个kickstart配置文件,记录你的真实安装配置。如果你希望实现和某系统类似的安装,可以基于该系统的kickstart配置文件来生成你自己的kickstart配置文件。(生成的文件名字叫anaconda-ks.cfg位于/root/anaconda-ks.cfg)
方法2
Centos提供了一个图形化的kickstart配置工具。在任何一个安装好的Linux系统上运行该工具,就可以很容易地创建你自己的kickstart配置文件。kickstart配置工具命令为redhat-config-kickstart(RHEL3)或system-config-kickstart(RHEL4,RHEL5).网上有很多用CentOS桌面版生成ks文件的文章,如果有现成的系统就没什么可说。但没有现成的,也没有必要去用桌面版,命令行也很简单。
方法3
阅读kickstart配置文件的手册。用任何一个文本编辑器都可以创建你自己的kickstart配置文件。
1.4.3 centos7.4自动应答文件(ks)
# Kickstart Configurator for CentOS 7 by yao zhang #命令段
install #告知安装程序,这是一次全新安装,而不是升级
url --url="http://192.168.1.230/CentOS7/" #通过http下载安装镜像
text #以文本格式安装
lang en_US.UTF-8 #设置字符集格式
keyboard us #设置键盘类型
zerombr #清除mbr引导
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet" #指定引导记录被写入的位置
network --bootproto=dhcp --device=ens33 --onboot=yes --noipv6 --hostname=CentOS7
timezone --utc Asia/Shanghai #可以使用dhcp方式设置网络
authconfig --enableshadow --passalgo=sha512 #设置密码格式
rootpw --iscrypted $6$X20eRtuZhkHznTb4$dK0BJByOSAWSDD8jccLVFz0CscijS9ldMWwpoCw/ZEjYw2BTQYGWlgKsn945fFTjRC658UXjuocwJbAjVI5D6/ #密文密码
clearpart --all --initlabel #清空分区
part /boot --fstype xfs --size 1024 #/boot分区
part swap --size 1024 #swap分区
part / --fstype xfs --size 1 --grow #/分区
firstboot --disable #负责协助配置redhat一些重要的信息
selinux --disabled #关闭selinux
firewall --disabled #关闭防火墙
logging --level=info #设置日志级别
reboot #安装完成重启
%packages #包组段 @表示包组
@^minimal
@compat-libraries
@debugging
@development
tree
nmap
sysstat
lrzsz
dos2unix
telnet
wget
vim
bash-completion
%end
%post #脚本段,可以放脚本或命令
systemctl disable postfix.service #关闭邮件服务开机自启动
wget -O /tmp/optimization.sh http://192.168.1.230/ks_config/optimization.sh &>/dev/null
chmod +x /tmp/optimization.sh
/bin/sh /tmp/optimization.sh
%end
[root@CentOS7 tmp]# cat optimization.sh
#!/bin/bash
##############################################################
# File Name: /var/www/html/ks_config/optimization.sh
# Version: V1.0
##############################################################
Ip=192.168.1.230
Port=80
ConfigDir=ks_config
# Judge Http server is ok?
PortNum=`nmap $Ip -p $Port 2>/dev/null|grep open|wc -l`
[ $PortNum -lt 1 ] && {
echo "Http server is bad!"
exit 1
}
# Defined result function
function Msg(){
if [ $? -eq 0 ];then
action "$1" /bin/true
else
action "$1" /bin/false
fi
}
# Defined IP function
function ConfigIP(){
#Suffix=`ifconfig ens33|awk -F "[ .]+" 'NR==2 {print $6}'`
Suffix=`ip a | grep ens33 | grep inet | awk '{print $2}' | awk -F '/' '{print $1}' | cut -d "." -f 4`
cat >/etc/sysconfig/network-scripts/ifcfg-ens33 <<-END
DEVICE=ens33
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.1.$Suffix
PREFIX=24
GATEWAY=192.168.1.1
DNS1=192.168.1.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System ens33"
END
Msg "config ens33"
}
# Defined Yum source Functions
function yum(){
YumDir=/etc/yum.repos.d
[ -f "$YumDir/CentOS-Base.repo" ] && cp $YumDir/CentOS-Base.repo{,.ori}
wget -O $YumDir/CentOS-Base.repo http://$Ip:$Port/$ConfigDir/CentOS-Base.repo &>/dev/null &&\
wget -O $YumDir/epel.repo http://$Ip:$Port/$ConfigDir/epel.repo &>/dev/null &&\
Msg "YUM source"
}
# Defined Hide the system version number Functions
function HideVersion(){
[ -f "/etc/issue" ] && >/etc/issue
Msg "Hide issue"
[ -f "/etc/issue.net" ] && > /etc/issue.net
Msg "Hide issue.net"
}
# Defined OPEN FILES Functions
function openfiles(){
[ -f "/etc/security/limits.conf" ] && {
echo '* - nofile 65535' >> /etc/security/limits.conf
Msg "open files"
}
}
# Defined Kernel parameters Functions
function kernel(){
KernelDir=/etc
[ -f "$KernelDir/sysctl.conf" ] && /bin/mv $KernelDir/sysctl.conf{,.ori}
wget -O $KernelDir/sysctl.conf http://$Ip:$Port/$ConfigDir/sysctl.conf &>/dev/null
Msg "Kernel config"
}
# Defined System Startup Services Functions
function boot(){
for i in `chkconfig --list|grep "3:开"|awk '{print $1}'|grep -vE "crond|network|rsyslog|sshd|sysstat"`
do
chkconfig $i off
done
Msg "BOOT config"
}
# Defined Time Synchronization Functions
function Time(){
echo "#time sync by xue at $(date +%F)" >>/var/spool/cron/root
echo '*/5 * * * * /usr/sbin/ntpdate time.nist.gov &>/dev/null' >>/var/spool/cron/root
Msg "Time Synchronization"
}
function Update(){
yum update -y
reboot
}
# Defined main Functions
function main(){
ConfigIP
yum
HideVersion
openfiles
kernel
boot
Time
Update
}
main
1.4.4 PXE配置文件default
由于多个客户端可以从一个PXE服务器引导,PXE引导映像使用了一个复杂的配置文件搜索方式来查找针对客户机的配置文件。如果客户机的网卡的MAC地址为8F:3H:AA:6B:CC:5D,对应的IP地址为10.0.0.195,那么客户机首先尝试以MAC地址为文件名匹配的配置文件,如果不存在就以IP地址来查找。根据上述环境针对这台主机要查找的以一个配置文件就是 /tftpboot/pxelinux.cfg/01-8F:3H:AA:6B:CC:5D。如果该文件不存在,就会根据IP地址来查找配置文件了,这个算法更复杂些,PXE映像查找会根据IP地址16进制命名的客户机配置文件。例如:10.0.0.195对应的16进制的形式为C0A801C3。(可以通过syslinux软件包提供的gethostip命令将10进制的IP转换为16进制)
如果C0A801C3文件不存在,就尝试查找C0A801C文件,如果C0A801C也不存在,那么就尝试C0A801文件,依次类推,直到查找C文件,如果C也不存在的话,那么最后尝试default文件。
总体来说,pxelinux搜索的文件的顺序是:
/tftpboot/pxelinux.cfg/01-88-99-aa-bb-cc-dd /tftpboot/pxelinux.cfg/C0A801C3 /tftpboot/pxelinux.cfg/C0A801C /tftpboot/pxelinux.cfg/C0A801 /tftpboot/pxelinux.cfg/C0A80 /tftpboot/pxelinux.cfg/C0A8 /tftpboot/pxelinux.cfg/C0A /tftpboot/pxelinux.cfg/C0 /tftpboot/pxelinux.cfg/C /tftpboot/pxelinux.cfg/default
1.4.5 上面的事情做完以后就可以批量安装系统了
[root@Cobbler ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 98G 1.5G 97G 2% / devtmpfs 227M 0 227M 0% /dev tmpfs 237M 0 237M 0% /dev/shm tmpfs 237M 4.6M 232M 2% /run tmpfs 237M 0 237M 0% /sys/fs/cgroup /dev/sda1 1014M 135M 880M 14% /boot tmpfs 48M 0 48M 0% /run/user/0 [root@Cobbler ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1) [root@Cobbler ~]# getenforce Disabled [root@Cobbler ~]# hostname -I 10.0.0.202 172.16.1.202
1.5 常见错误
1.5.1 网卡无法启动解决
解决办法:yum install xinetd
将NetworkManager服务停止,再重新启动network服务
[root@CentOS7 ~]# systemctl disable NetworkManager Removed symlink /etc/systemd/system/multi-user.target.wants/NetworkManager.service. Removed symlink /etc/systemd/system/dbus-org.freedesktop.NetworkManager.service. Removed symlink /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service. [root@CentOS7 ~]# systemctl stop NetworkManager
1.5.2 Could not find kernel image
报错原因:selinux没关
如不行则添加:
1.5.3 查考文档
http://blog.oldboyedu.com/autoinstall-kickstart/
http://www.zyops.com/autoinstall-kickstart