本文介绍PXE方式引导自动化安装CentOS6.5系统,主要用到的系统服务有DHCP、TFTP、Vsftpd和Kickstart。通过配置Kickstart自动化应答脚本,实现客户端批量、无人值守安装系统。
1.PXE介绍
PXE(Preboot Execution Environment,预启动执行环境)由Intel公司开发,工作于Client/Server的网络模式,支持客户端通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统。PXE可以引导windows2003/2008/XP/win7/linux系列等多种系统。
图 1 PXE网络安装服务架构图
图 2 支持PXE启动的网卡
PXE启动流程:进行PXE引导安装的必要条件是有一个支持PXE启动的网卡(NIC),即网卡ROM中必须要有PXE Client。当客户端计算机启动引导时,BIOS 把PXE Client 调入内存中执行,首先通过ARP协议广播请求IP地址与TFTP服务器地址,在获取到IP后,尝试向TFTP服务器发起TFTP请求,并将TFTP服务器根目录中的pxelinux.0文件下载到本地并执行,pxelinux.0引导程序执行后,会从TFTP根目录的pxelinux.cfg文件夹中下载default配置文件,然后根据default配置文件中指定的位置,去下载操作系统内核vmlinuz和虚拟文件系统initrd.img,同时default配置文件中还指明了ks.cfg文件的位置,ks.cfg也会被一并下载到本地,在通过网络下载操作系统安装的过程中,PXE引导程序会尝试读取ks.cfg文件内容,用于初始化系统配置,实现全自动无人值守安装。
2.kickstart自动化安装实例
2.1 安装环境介绍
实验环境以两台VMware虚拟机为例:
虚拟机A:CentOS 6.5系统,作为PXE安装服务器,网络连接到NAT网络,并关闭VMnet8的DHCP服务,IP地址:192.168.2.60/24,网关192.168.2.1/24;
虚拟机B:新建空白虚拟机,作为PXE客户端,网络连接到NAT网络,也可以和虚拟机A一起放在“仅主机”或“桥接”网络(相同即可),移除DVD及其他不用的设备;
在正式进行服务配置前,最好关闭PXE服务器的防火墙和Selinux:
关闭防火墙iptables:
[root@localhost ~]#iptables -F [root@localhost ~]#service iptables stop
关闭Selinux:
[root@localhost ~]#setenforce 0 [root@localhost ~]#vim /etc/selinux/config SELINUX=disabled
2.2 配置DHCP服务
PXE启动流程第一阶段需要通过DHCP服务为客户端分配IP地址,指定TFTP服务器地址,指定pxelinux.0引导程序。
1. 安装DHCP服务
[root@localhost ~]# yum -y install dhcp
2. 设置DHCP服务开机启动
[root@localhost ~]#chkconfig --level dhcpd 2345 on [root@localhost ~]#chkconfig --list dhcpd 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
3. 修改DHCP服务主配置文件
[root@localhost ~]#vim /etc/dhcp/dhcpd.conf #响应客户端的启动查询(开机时发送的DHCP请求) allow booting; allow bootp; #不使用DNS动态更新,忽略客户端DNS更新 ddns-update-style none; ignore client-updates; #为客户端指定DNS名称和DNS服务器的IP地址 option domain-name "example.org"; option domain-name-servers 192.168.2.60; #指定客户端DHCP租期和连接DHCP服务器超时时间即最大租期 default-lease-time 3600; max-lease-time 7200; #指定DHCP服务器发送的日志信息的日志级别 log-facility local7; #子网区域 subnet 192.168.2.0 netmask 255.255.255.0 { #设置客户端子网掩码 option subnet-mask 255.255.255.0; #客户端IP地址池 range dynamic-bootp 192.168.2.100 192.168.2.200; #tftp服务器的地址 next-server 192.168.2.60; #需要从tftp服务器下载并执行的PXE引导文件 filename "pxelinux.0"; default-lease-time 3600; max-lease-time 7200; #指定客户端默认网关IP地址 option routers 192.168.2.1; }
4. 重启DHCP服务
[root@localhost ~]#service dhcpd restart
2.3 配置TFTP服务
TFTP服务是一个没有主服务程序的轻量级服务,它依靠系统xinetd守护进程启动。xinetd进程监听不同网络端口,根据端口发送数据到不同的服务进程。在安装好TFTP服务后,xinetd服务就监听UDP的69号端口,将这个端口收到的数据发送给TFTP程序。
1. 安装xinetd和tftp-server
[root@localhost ~]#yum -y install xinetd tftp-server
2. 设置xinetd服务开机启动
[root@localhost ~]#chkconfig --level xinetd 345 on [root@localhost ~]#chkconfig --list xinetd 0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭 基于 xinetd 的服务: tftp: 启用
3. 编辑tftp配置文件,开启tftp服务
[root@localhost ~]#vim /etc/xinetd.d/tftp #将配置文件中disable后面的yes改成no service tftp { …… disable = no …… }
4. 重启xinetd服务
[root@localhost ~]#service xinetd restart
2.4 配置Syslinux及系统引导必须文件
PXE系统启动引导需要一些必须的文件,其中pxelinux.0文件通过安装syslinux包获得;vmlinuz是压缩的可引导、可执行的linux内核文件,initrd.img是“initial ramdisk”,用于临时引导硬件到内核vmlinuz接管,加载文件系统和SCSI设备驱动,这两个文件可以从安装光盘images/pxeboot目录复制;
1. 安装syslinux包,复制引导文件pxelinux.0
[root@localhost ~]#yum -y install syslinux [root@localhost ~]#locate pxelinux.0 /usr/share/syslinux/pxelinux.0 #将pxe引导文件复制到TFTP根目录中 [root@localhost ~]#cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
2. 挂载CentOS光盘,复制系统引导必须文件
[root@localhost ~]#mount /dev/cdrom /media/cdrom [root@localhost cdrom]#cp images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/ [root@localhost cdrom]#cp isolinux/{vesamenu.c32,boot.msg} /var/lib/tftpboot/
3. 创建系统引导模版文件default
[root@localhost cdrom]#mkdir /var/lib/tftpboot/pxelinux.cfg [root@localhost cdrom]#cp isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
4. 编辑系统引导模版文件default
[root@localhost ~]#vim /var/lib/tftpboot/pxelinux.cfg/default #需要修改两处 #第1处:将第一行default后面标签改成linux,表示引导时使用这个标签下指定的内容去查找操作系统的位置 default linux #第2处:找到linux标签,修改inst.stage2和ks后面配置指向FTP服务器 label linux menu label ^Install CentOS 6.5 32bit menu default kernel vmlinuz append initrd=initrd.img inst.stage2=ftp://192.168.2.60 ks=ftp://192.168.2.60/pub/ks.cfg quiet
2.5 配置Vsftpd服务
Vsftpd服务通过FTP协议发送系统光盘文件和自动化应答脚本文件ks.cfg到客户端。
1. 安装Vsftpd服务
[root@localhost cdrom]#yum -y install vsftpd
2. 设置Vsftpd开机启动
[root@localhost ~]#chkconfig --level vsftpd 2345 on [root@localhost ~]#chkconfig --list vsftpd 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
3. 将CentOS6.5系统安装光盘所有文件复制到FTP根目录
[root@localhost ~]#cp -a /media/cdrom/* /var/ftp/
2.6 配置Kickstart
Kickstart是一种无人值守安装方式,它的工作原理是通过记录典型的安装过程中所需人工干预填写的各种参数,并生成一个名为ks.cfg的自动应答脚本文件,在其后的安装过程中,当出现要求填写参数的情况时,安装程序会首先去查找Kickstart生成的文件,当找到合适的参数时,就采用找到的参数;当没有找到合适的参数时,才需要安装者手工干预。这样,如果告诉安装程序ks.cfg文件位置,并且文件涵盖了安装过程中出现的所有需要填写的参数时,就能实现全自动无人值守安装。
1. 在RHEL桌面环境下配置Kickstart
[root@localhost ~]#yum –y install system-config-kickstart [root@localhost ~]#system-config-kickstart
A:开始设置语言,键盘,时区,Root密码,安装完毕自动重启;
B:设置安装方式(ftp/http/nfs);
C:安装MBR;
D:设置分区;
E:配置网络;
F:认证配置;
G:SELinux 和防火墙配置;
H:软件包安装选择
图 3 Kickstart配置界面
经过各种设置,最后是生成的ks.cfg文件预览界面, 文件保存在/var/www/html/文件夹。
图 4 Kickstart生成ks.cfg预览界面
2. 使用系统现有ks.cfg模版文件
在已安装好的CentOS系统root用户家目录,存在一个anaconda.cfg文件即为本系统的自动化应答脚本文件,可以以此为模版进行配置。
[root@localhost ~]#ls -l anaconda-ks.cfg -rw------- 1 root root 1080 5月 24 11:08 anaconda-ks.cfg
注意:此配置文件权限为其他人不可读,使用前需要设置权限为其他人可读,否则自动化安装时候anaconda程序会报错“找不到ks.cfg文件”。
#复制一份anaconda-ks.cfg到FTP共享目录pub下: [root@localhost ~]#cp anaconda-ks.cfg /var/ftp/pub/ks.cfg #修改权限为其他人可读 [root@localhost pub]#chmod 644 ks.cfg [root@localhost pub]#ls -l -rw-r--r-- 1 root root 1353 5月 28 08:59 ks.cfg
下面是一个典型的ks.cfg配置文件:
[root@localhost pub]#vim ks.cfg # Kickstart file automatically generated by anaconda. #version=DEVEL install graphical url --url="ftp://192.168.2.60/" lang zh_CN.UTF-8 keyboard us timezone --utc Asia/Shanghai rootpw --iscrypted $6$VfvSB5Zx$ufvfpkzYy/nHoDukZXm1Z6LBlUg1n2OrO1.K7F8d2fRlYDdHwwR7MVUqT2h0Qab7rRPnRGPFa1/VYyBSDeGTt1 firewall --disabled selinux --disabled authconfig --enableshadow --passalgo=sha512 firstboot --disable network --onboot yes --hostname=localhost.localdomain --device eth0 --bootproto dhcp --noipv6 user --name=todd --password=$6$vTfBqgQT$Xkjrx/kpRYEGfS1wRnsZw5MNRMUCZ3/Ld969pTG0wv4WBrMHUpWEwRSzPqJ95dIaZasWOU3pbS2at/dRZZZA11 --iscrypted bootloader --location=mbr --driveorder=sda zerombr yes clearpart --all --initlabel part /boot --fstype=ext4 --size=200 part swap --size=2048 part / --fstype=ext4 --grow --size=200 reboot %packages @^minimal @core @base @development @chinese-support net-tools vim wget %post /bin/tar zcPf centos.repo.tar.gz /etc/yum.repos.d/*.repo > /dev/null 2>&1 /bin/rm -f /etc/yum.repos.d/*.repo > /dev/null 2>&1 cat >> /etc/yum.repos.d/base.repo << EOF [base] name=CentOS6.5 baseurl=ftp://192.168.2.60/ enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 EOF %end
说明:
①key --skip 如果是红帽系统,此选项可以跳过输入序列号过程;如果是CentOS 系列,则可以不保留此项内容;
②reboot选项必须存在,否则安装完毕后kickstart显示等待用户按任意键重新引导;
③clearpart --all –initlabel 此条命令必须添加,否则系统会让用户手动选择是否清除所有数据,这就需要人为干预了,从而导致自动化过程失败;
④安装完毕后登录系统,root用户密码为root,todd用户密码为todd;
⑤%post安装后脚本打包备份原有yum仓库文件,生成新的base.repo仓库。
补充解释:
以下补充解释一下加密的密码密文生成方法,如下这样的密码有几种生成方法:
password=$6$vTfBqgQT$Xkjrx/kpRYEGfS1wRnsZw5MNRMUCZ3/Ld969pTG0wv4WBrMHUpWEwRSzPqJ95dIaZasWOU3pbS2at/dRZZZA11
(1) 复制/etc/shadow中的加密过的密码密文
[root@localhost ~]# echo hello | passwd --stdin leven 更改用户 leven 的密码 。 passwd: 所有的身份验证令牌已经成功更新。 [root@localhost ~]# grep leven /etc/shadow leven:$6$K3DVGnpn$r/yZY.RoyM6dHKsqwKLllvj0M98XPiak9Kefh6X/NA5Tpmp3F/jBYhc4d.kCcGOnHsey33XBvWGqixo6Rl7oP0:17928:0:99999:7:::
这一段“$6$K3DVGnpn$r/yZY.RoyM6dHKsqwKLllvj0M98XPiak9Kefh6X/NA5Tpmp3F/jBYhc4d.kCcGOnHsey33XBvWGqixo6Rl7oP0”就是使用sha-512方式加密后的密码密文。(开头的$6$表明)
(2) 使用OpenSSL生成加密过的密码密文
[root@localhost ~]# openssl passwd -1 -salt 'world' Password: $1$world$6A5UXMoQ04WBPD9pce/FT0
“-1”指加密算法使用md5算法,不指定加密算法的话默认使用Unix标准加密算法,即不指定默认使用-crypt算法;
“-salt”指定加密时候需要添加的“盐”(杂质),不指定的话默认随机生成。
此方法缺点是OpenSSL不支持生成sha-256和sha-512算法的密码,目前Linux默认的密码加密算法已经是sha-512了,md5算法不安全,详见/etc/shadow中加密密码“$6$”表明sha-512算法。
(3)使用grub-crypt生成加密过的密码密文
[root@localhost ~]# grub-crypt -h Usage: grub-crypt [OPTION]... Encrypt a password. --md5 Use MD5 to encrypt the password --sha-256 Use SHA-256 to encrypt the password --sha-512 Use SHA-512 to encrypt the password (default) [root@localhost ~]# grub-crypt --sha-512 Password: Retype password: $6$RD4Mt5EjtHgGopk2$GrGNdH5kMUNIo5rnCl6qAJhn6mOruc9QcFcTbN/7fPhInJvsiiTqrXORMeFn.m7k73WKKa9qs0lu2m3j79ABj1
grub-crypt其实是一个python脚本,交互式生成密码。在CentOS 6上,可以借助grub提供的密码生成工具grub-crypt生成。遗憾的是CentOS 7上默认安装的是grub2,它不提供grub-crypt。
但是我们可以参照grub-crypt脚本内容,使用下面的python语句简单地代替grub-crypt,以下是交互式方式获取密码:
python -c 'import crypt,getpass;pw=getpass.getpass();print(crypt.crypt(pw) if (pw==getpass.getpass("Confirm: ")) else exit())'
如果不想交互式,可以改成如下形式:
python -c 'import crypt,getpass;pw="123456";print(crypt.crypt(pw))'
现在就方便多了,直接将结果赋值给变量即可。
[root@localhost ~]# a=$(python -c 'import crypt,getpass;pw="123456";print(crypt.crypt(pw))') [root@localhost ~]# echo $a $6$uKhnBg5A4/jC8KaU$scXof3ZwtYWl/6ckD4GFOpsQa8eDu6RDbHdlFcRLd/2cDv5xYe8hzw5ekYCV5L2gLBBSfZ.Uc166nz6TLchlp.
3.测试安装
自动化应答脚本文件ks.cfg配置完毕后,初始化一个VMware虚拟机,将网络连接到NAT网络(必须和作为PXE服务器的虚拟机A在同一个网络,并且VMnet8关闭DHCP服务),移除客户端虚拟机B的DVD及其他不用的设备。
图 5 新建空白虚拟机PXE Client
启动PXE Client虚拟机B,自动选择从网卡PXE引导,DHCP 服务器开始给客户机分配IP地址,并指定TFTP服务器地址。
图 6 PXE Client向DHCP Server请求IP地址和TFTP服务器地址
图 7 加载vmlinuz和initrd.img文件
图 8 启动CentOS6.5安装过程