Pxe-kickstart

Liunx系统批量自动安装

实现原理:将手动安装的所有的详细步骤记录到一个文件中,然后有一种软件通过读取这个文件就可以实现自动化安装系统。

这个工具叫做Kickstart,kickstart是RedHat公司开源的工具,所以对Centos兼容性最好。注意Kickstart是一个项目的名称,没有这个软件。

cobbler是对kickstart的所有组件的封装。本质上就是网页版的Kickstart

PXE原理
PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站(主机)通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统,在启动过程中,终端要求服务器分配IP地址,再用TFTP(trivial file transfer protocol)或MTFTP(multicast trivial file transfer protocol)协议下载一个启动软件包到本机内存中执行,由这个启动软件包完成终端基本软件设置,从而引导预先安装在服务器中的终端操作系统。

PXE的工作过程:

  1. PXE Client 从自己的PXE网卡启动,向本网络中的DHCP服务器索取IP;
  2. DHCP 服务器返回分配给客户机的IP 以及PXE文件的放置位置(该文件一般是放在一台TFTP服务器上) ;
  3. PXE Client 向本网络中的TFTP服务器索取pxelinux.0 文件;
  4. PXE Client 取得pxelinux.0 文件后之执行该文件;
  5. 根据pxelinux.0 的执行结果,通过TFTP服务器加载内核和文件系统 ;
  6. 进入安装画面, 此时可以通过选择HTTP、FTP、NFS 方式之一进行安装;

详细工作流程,请参考下面这幅图:

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

PXE+Kickstart 无人值守安装操作系统完整过程如下:
PXE-Kickstart批量安装系统_第1张图片

Kickstart部署
1.环境准备

[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)

DHCP部署
需要把虚拟机的DHCP分配的功能关闭,网卡模式不能使用桥接模式,首选NAT模式

//1.yum安装DHCP
[root@Kickstart ~]# yum install dhcp -y

//2.修改DHCP配置文件/etc/dhcp/dhcpd.conf,添加如下参数:
//在该配置文件中默认是没有任何关于DHCP的配置参数
cat >>/etc/dhcp/dhcpd.conf<

批量安装系统的主机最好不要将dhcp服务开启自启动,不然有可能会导致在同一个局域网中的其它服务器自动重装系统。

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

//1.yum安装TFTP和xinetd,xinetd 用于管理TFTP的服务
[root@Kickstart /]# yum install xinetd  tftp-server -y

//2.自行创建/tftpboot目录作为tftp的根目录,通过xinetd来指定TFTP的根目录
[root@Kickstart /]# mkdir /tftpboot
[root@Kickstart /]# cat /etc/xinetd.d/tftp  |grep -E "server_args|disable"
    server_args     = -s /tftpboot  #新根目录的位置
    disable         = no   #是否开启tftp服务(no=开启,yes=不开启)

//3.启动xinetd服务,TFTP服务时通过xinetd来管理重启和启动。
[root@Kickstart /]# systemctl start xinetd
[root@Kickstart /]# lsof -i:69

TFTP的根目录不管在哪里创建都无所谓,看个人,不过如果不适用默认的TFTP的根目录就得需要在/etc/xinetd.d/tftp文件中将server_args参数指定为新的根目录

HTTP部署
可以用Apache或Nginx提供HTTP服务。Python的命令web服务不行,会有报错。

//1.安装并启动Httpd
[root@Kickstart ~]# yum install httpd -y
[root@Kickstart ~]# systemctl start httpd
[root@Kickstart ~]# sed -i "277i ServerName 127.0.0.1:80" /etc/httpd/conf/httpd.conf

//2.镜像挂载和目录创建
#/var/www/html/该目录是httpd的网站站点目录
[root@Kickstart ~]# mkdir -p /var/www/html/CentOS7
[root@Kickstart ~]# mount  /dev/cdrom /var/www/html/CentOS7

//不管怎么操作,只要把安装光盘内容能通过web发布即可。因为是演示,如果复制镜像就有点浪费时间。但生产环境就一定要复制了,光盘读取速度有限。

浏览器访问 http://10.0.0.201/CentOS7/ 校验是否正确PXE-Kickstart批量安装系统_第2张图片

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

//1.安装syslinux,将/usr/share/syslinux/下的pxelinux.0和reboot.32文件将其拷贝到TFTP的根目录
[root@Kickstart /]# cd /var/lib/tftpboot/ #TFTP的根目录
[root@Kickstart /]# yum install syslinux -y  #通过安装syslinux获得pxelinux.0文件
[root@Kickstart /]# rpm -ql syslinux |grep pxelinux.0  #pxelinux.0文件的路径
/usr/share/syslinux/gpxelinux.0
/usr/share/syslinux/pxelinux.0 
[root@Kickstart /]# cp /usr/share/syslinux/reboot.c32 /tftpboot/
[root@Kickstart /]# cp /usr/share/syslinux/pxelinux.0 /tftpboot/

//2.从镜像中找到相关的配置文件并拷贝到tftp的根目录
[root@Kickstart /]# cp  /var/www/html/CentOS7/isolinux/* /tftpboot/
[root@Kickstart /]# ls /tftpboot/
TRANS.TBL  boot.msg   initrd.img    isolinux.cfg  pxelinux.0  splash.png    vmlinuz
boot.cat   grub.conf  isolinux.bin  memtest       reboot.c32  vesamenu.c32

文件说明:
pxelinux.0 #该文件用于启动PXE的环境
reboot.c32 #装完系统后自动启动文件
vmlinuz #vm内核文件
initrd.img #启动文件
vesamenu.c32 #框架文件(欢迎界面)

//3.新键一个pxelinux.cnf目录,isolinux.cfg文件拷贝到/tftpboot/pxelinux.cfg目录下并重命名为default
[root@Kickstart /]# mkdir -p /tftpboot/pxelinux.cfg
[root@Kickstart /]# cp /var/www/html/CentOS7/isolinux/isolinux.cfg ./tftpboot/pxelinux.cfg/default #该文件决定了pxe的安装界面样式和选项等

手动网络安装
该方式是通过网络的方式手动的安装系统,那么PXE客户端需要手工的选择菜单进行系统的安装
1.编辑default文件,/tftpboot/pxelinux.cfg/default,其它参数不需要修改保持默认即可,只需要修改append initrd=initrd.img这项

[root@Kickstart /]# vim /tftpboot/pxelinux.cfg/default
default jason-ks
timeout 600
prompt 0

label jason-ks
   kernel vmlinuz
append initrd=initrd.img inst.repo=http://10.0.0.201/CentOS7/

2.如果需要安装系统的时候(针对Centos7),网卡以ethXX 命名,配置参数如下:

append initrd=initrd.img inst.repo=http://10.0.0.201/CentOS7/ net.ifnames=0 biosdevname=0

PXE-Kickstart批量安装系统_第3张图片
3.启动虚拟机,会出现以下界面:
PXE-Kickstart批量安装系统_第4张图片
PXE-Kickstart批量安装系统_第5张图片

自动化安装
编写KS文件(包含安装的所有步骤)
方法1:新装CentOS系统会自动生成文件,存放在/root/anaconda-ks.cfg
方法2:图形CentOS系统提供的图形工具
方法3:了解ks文件语法,编写ks文件。(推荐)

KS文件语法
官网文档

CentOS6 : https://access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-kickstart2-options.html
CentOS7:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html-single/installation_guide/
官网支持中文语言

ks文件组成

命令段
包组段 以%packages开头,以%end结束
脚本段 以%post开头,以%end结束,在安装完系统之后执行的相关Linux命令、脚本
以%pre开头,以%end结束,在安装完系统之前执行的相关Linux命令、脚本

kickstart文件语法检查

yum install pykickstart
ksvalidator /var/www/html/ks_config/CentOS-7-ks.cfg 

请记住这个验证工具有其局限性。Kickstart 文件可能会很复杂;ksvalidator 可保证其语法正确,且该文件不包含淘汰的选项,但它无法保证安装会成功。它也不会尝试验证 Kickstart 文件的 %pre、%post 和 %packages 部分。

root加密密码生成

python -c 'import crypt; print(crypt.crypt("密码"))'

ks文件解析

install       #告知安装程序,这是一次全新安装,而不是升级upgrade。
url --url=" "     #通过FTP或HTTP从远程服务器上的安装树中安装。
url --url="http://10.0.0.201/CentOS7/"
url --url ftp://:@/
nfs       #从指定的NFS服务器安装。
nfs --server=nfsserver.example.com --dir=/tmp/install-tree
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 --utc Asia/Shanghai
authconfig  #系统认证信息。authconfig --enableshadow --passalgo=sha512
#设置密码加密方式为sha512 启用shadow文件。
rootpw  #root密码
clearpart      #清空分区。clearpart --all --initlabel
--all #从系统中清除所有分区,--initlable 初始化磁盘标签
part       #磁盘分区。
part /boot --fstype=ext4 --asprimary --size=200
part swap --size=1024
part / --fstype=ext4 --grow --asprimary --size=200
--fstype=     #为分区设置文件系统类型.有效的类型为ext2,ext3,swap和vfat。
--asprimary   #强迫把分区分配为主分区,否则提示分区失败。
--size=       #以MB为单位的分区最小值.在此处指定一个整数值,如500.不要在数字后面加MB。
--grow        #告诉分区使用所有可用空间(若有),或使用设置的最大值。
firstboot        #负责协助配置redhat一些重要的信息。
firstboot --disable
selinux   #关闭selinux。selinux --disabled
firewall      #关闭防火墙。firewall --disabled
logging   #设置日志级别。logging --level=info
reboot    #设定安装完成后重启,此选项必须存在,不然kickstart显示一条消息,并等待用户按任意键后才重新引导,也可以选择halt关机。

KS配置文件
通过KS配置文件实现自动化安装系统
1.先要将default文件清空,然后添加如下内容:

[root@Kickstart ~]# cp /tftpboot/pxelinux.cfg/default{,.bak}
[root@Kickstart ~]# > /tftpboot/pxelinux.cfg/default
[root@Kickstart ~]# cat /tftpboot/pxelinux.cfg/default
#jason centos 7 kickstart configure
default jason-ks
timeout 600
prompt 0

label jason-ks
   kernel vmlinuz
   append initrd=initrd.img ks=http://10.0.0.201/ks.config/CentOS7-ks.cfg ksdevice=eth0 net.ifnames=0 biosdevname=0

#参数解释:
append initrd=initrd.img ks  #存放ks配置文件的服务器地址和路径,通过该路径找到对应的ks.cfg文件来引导系统安装
ksdevice=eth0  #指定该网卡进行ks的数据交互(可忽略)
net.ifnames=0 biosdevname=0 #修改内核参数,让网卡命名变为ethXX

2.创建存放ks文件的目录
如果ks文件有需要执行的脚本文件,那么该脚本文件需要和ks文件在同一个目录下

[root@Kickstart ~]# mkdir -p /var/www/html/ks.config/

3.ks配置文件如下:

[root@Kickstart ~]# cat /var/www/html/ks.config/CentOS7-ks.cfg
# Kickstart Configurator for CentOS 7 by yao zhang
install
url --url="http://10.0.0.201/CentOS7/"
text
lang en_US.UTF-8
keyboard us
zerombr
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
network  --bootproto=static --device=eth0 --gateway=10.0.0.2 --ip=10.0.0.202 --nameserver=223.5.5.5 --netmask=255.255.255.0 --activate
network  --bootproto=static --device=eth1 --ip=172.16.1.202 --netmask=255.255.255.0 --activate
network  --hostname=Addie
#network --bootproto=dhcp --device=eth1 --onboot=yes --noipv6 --hostname=CentOS7
timezone --utc Asia/Shanghai
authconfig --enableshadow --passalgo=sha512
#rootpw 123456
rootpw  --iscrypted $6$X20eRtuZhkHznTb4$dK0BJByOSAWSDD8jccLVFz0CscijS9ldMWwpoCw/ZEjYw2BTQYGWlgKsn945fFTjRC658UXjuocwJbAjVI5D6/
clearpart --all --initlabel
part /boot   --fstype xfs --size 1024
part swap    --size 1024
part /       --fstype xfs --size 1 --grow
firstboot --disable
selinux --disabled
firewall --disabled
logging --level=info
reboot

%packages
@^minimal
@compat-libraries
@debugging
@development
tree
nmap
sysstat
lrzsz
dos2unix
telnet 
wget 
vim 
bash-completion
net-tools
%end

%post
systemctl disable postfix.service
%end
#该ks配置文件只用于CentOS7的系统自动化安装。

4.启动空白虚拟机,观察自动安装过程

注意,如果是安装Centos7,需要把内存设置到大于2G,不然安装很可能会出现报错

PXE-Kickstart批量安装系统_第6张图片
PXE-Kickstart批量安装系统_第7张图片

5.等待数十分钟后,系统安装完毕(登录账号:root,密码:123456)PXE-Kickstart批量安装系统_第8张图片