当企业有大量的新机需要安装系统,如果每台都接上系统光盘并人工选择配置安装,无疑工作量巨大。而 PXE+kickstart 的安装方式能够实现自动化批量部署,特别适用于这种场景。
一、批量部署方式
①物理机:PXE
负载均衡
②虚拟机:映像文件模板
分布式文件系统
无论是针对物理机还是虚拟机的批量部署,都会对文件服务器造成巨大的压力,可以分别使用负载均衡和分布式文件系统的方式缓解
二、PXE工作原理
客户机通过支持PXE的网卡请求DHCP服务器 --> DHCP服务器给客户端分配IP地址等,并告诉客户端next server(通常是tftp服务器)的地址以及需要下载pxelinux.0 --> tftp客户端联系tftp服务器下载pxelinux.0并加载到内存中执行 --> 联系tftp服务器下载vmlinuz、ramdisk、vesamenu.c32、pxelinux.cfg等各种引导安装所需的文件--> 联系安装源(http、ftp、nfs等)
另外,还可提供kickstart文件,并在isolinux.cfg文件中或boot提示符后指明其位置以实现自动安装
①PXE:是由Intel开发的 client/server 协议,可以使计算机通过网络安装系统。PXE client在网卡的ROM中,计算机启动后,BIOS把PXE client中执行,并显示出命令菜单,经用户选择后,PXE client联系远端服务器下载安装所需的文件
②PXE client所在的网卡ROM中已经内置了tftp client
②pxelinux.0是类似于isolinxu.bin的引导加载程序,可调用启动菜单
④pxelinux.cfg:可直接复制现有isolinux.cfg并按需修改即可
三、如何配置PXE
以下DHCP、TFTP配置可参考博客http://9124573.blog.51cto.com/9114573/1715721,系统安装参考博客http://9124573.blog.51cto.com/9114573/1714822
1、配置DHCP服务
subnet ... netmask ... {
...
next-server TFTP-SERVER-IP;
filename "pxelinux.0";
}
2、配置TFTP server
yum install tftp-server
chkconfig tftp on
service xinetd restart
3、提供pxe工作环境
yum install syslinux #pxelinux.0由syslinux包提供
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot
4、提供引导内核等文件
mount /dev/cdrom /media/cdrom
cp /media/cdrom/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/
cp /media/cdrom/isolinux/{splash.jpg,vesamenu.c32,boot.msg} /var/lib/tftpboot/
mkdir /var/lib/tftpboot/pxeboot.cfg
cp /media/cdrom/isolinux/isolinux.cfg /var/lib/tftpboot/pxeboot.cfg/default
5、提供安装源(以http为例)
yum -y install httpd
mkdir -pv /var/www/html/centos/6/x86_64
mount --bind /media/cdrom /var/www/html/centos/6/x86_64
(mount --bind表示将后面的两个目录做捆绑,所以通过这两个目录都能访问光盘了)
6、提供kickstart文件
[root@node2 ~]# mount /dev/cdrom /media/cdrom #挂载光盘光盘 mount: block device /dev/sr0 is write-protected, mounting read-only [root@node2 ~]# ls /media/cdrom/images/pxeboot initrd.img TRANS.TBL vmlinuz [root@node2 ~]# ls /media/cdrom/isolinux boot.cat boot.msg grub.conf initrd.img isolinux.bin isolinux.cfg memtest splash.jpg TRANS.TBL vesamenu.c32 [root@node2 ~]# cp /media/cdrom/images/pxeboot/{initrd.img,vmlinuz} /var/lib/tftpboot/ vmlinuz #将相关引导文件都复制到tftpboot目录中 [root@node2 ~]# cp /media/cdrom/isolinux/{boot.msg,splash.jpg,vesamenu.c32} /var/lib/tftpboot/ [root@node2 ~]# mkdir /var/lib/tftpboot/pxelinux.cfg/ [root@node2 ~]# cp /media/cdrom/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default [root@node2 ~]# rpm -q syslinux syslinux-4.04-3.el6.x86_64 [root@node2 ~]# rpm -ql syslinux | grep 'pxelinux.0' #发现4.04版本的syslinux包没有提供pxelinux.0 [root@node2 ~]# yum -y remove syslinux ... [root@node2 ~]# yum -y install /media/cdrom/Packages/syslinux-4.02-8.el6.x86_64.rpm #重新安装了4.02版本的syslinux包 [root@node2 ~]# rpm -ql syslinux | grep 'pxelinux.0' /usr/share/syslinux/pxelinux.0 [root@node2 ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/ [root@node2 ~]# ls /var/lib/tftpboot/ #各种引导文件准备完毕 a.txt boot.msg initrd.img pxelinux.0 pxelinux.cfg splash.jpg vesamenu.c32 vmlinuz [root@node2 ~]# vim /etc/dhcp/dhcpd.conf ... subnet 192.168.30.0 netmask 255.255.255.0 { range 192.168.30.31 192.168.30.50; next-server 192.168.30.20; #指定下一个要联系的tftp服务器地址 filename "pxelinux.0"; #指定要下载pxelinux.0文件 } [root@node2 ~]# yum -y install httpd ... [root@node2 ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT #开放80端口 [root@node2 ~]# mkdir -pv /var/www/html/centos/6/x86_64 mkdir: created directory `/var/www/html/centos' mkdir: created directory `/var/www/html/centos/6' mkdir: created directory `/var/www/html/centos/6/x86_64' [root@node2 ~]# mount --bind /media/cdrom /var/www/html/centos/6/x86_64 [root@node2 ~]# cp /tmp/myiso/isolinux/ks.cfg /var/www/html/centos6.cfg #提供kickstart文件 [root@node2 ~]# vim /var/www/html/centos6.cfg #做适当修改 #platform=x86, AMD64, or Intel EM64T #version=DEVEL # Firewall configuration firewall --disabled # Install OS instead of upgrade install # Use network installation url --url="http://192.168.30.20/centos/6/x86_64/" repo --name="CentOS" --baseurl=http://192.168.30.20/centos/6/x86_64/ --cost=100 #指明安装源 # Root password rootpw --iscrypted $1$Bmn0VLX0$2o2vCmHL.aWp3zhewY1S.. # System authorization information auth --useshadow --passalgo=sha512 # Use text mode install text firstboot --disable # System keyboard keyboard us # System language lang en_US # SELinux configuration selinux --disabled # Installation logging level logging --level=info # Reboot after installation reboot # System timezone timezone Asia/Shanghai # Network information network --bootproto=dhcp --device=eth0 --onboot=on # System bootloader configuration ... [root@node2 ~]# ksvalidator /var/www/html/centos6.cfg #语法测试无误 [root@node2 ~]# ll /var/lib/tftpboot/pxelinux.cfg/default -r--r--r-- 1 root root 936 Nov 22 02:50 /var/lib/tftpboot/pxelinux.cfg/default [root@node2 ~]# chmod u+w /var/lib/tftpboot/pxelinux.cfg/default [root@node2 ~]# vim /var/lib/tftpboot/pxelinux.cfg/default ... label linux menu label ^Install or upgrade an existing system menu default kernel vmlinuz append initrd=initrd.img ks=http://192.168.30.20/centos6.cfg #指明kickstart文件位置,实现自动安装 label vesa menu label Install system with ^basic video driver kernel vmlinuz append initrd=initrd.img xdriver=vesa nomodeset label rescue menu label ^Rescue installed system kernel vmlinuz append initrd=initrd.img rescue label local ... [root@node2 ~]# service dhcpd restart #修改dhcpd配置文件后需重启服务 Shutting down dhcpd: [ OK ] Starting dhcpd: [ OK ] [root@node2 ~]# chkconfig tftp on [root@node2 ~]# service xinetd start Starting xinetd: [ OK ] [root@node2 ~]# service httpd start Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.30.20 for ServerName [ OK ] [root@node2 ~]# netstat -tunlp #可看到67/udp、69/udp、80/tcp都已处于监听状态 Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1267/rpcbind tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1532/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1387/cupsd tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 2645/sshd tcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN 1818/sshd tcp 0 0 0.0.0.0:56458 0.0.0.0:* LISTEN 1356/rpc.statd tcp 0 0 :::111 :::* LISTEN 1267/rpcbind tcp 0 0 :::80 :::* LISTEN 2988/httpd tcp 0 0 :::22 :::* LISTEN 1532/sshd tcp 0 0 ::1:631 :::* LISTEN 1387/cupsd tcp 0 0 ::1:6010 :::* LISTEN 2645/sshd tcp 0 0 ::1:6011 :::* LISTEN 1818/sshd tcp 0 0 :::45152 :::* LISTEN 1356/rpc.statd udp 0 0 0.0.0.0:111 0.0.0.0:* 1267/rpcbind udp 0 0 0.0.0.0:631 0.0.0.0:* 1387/cupsd udp 0 0 0.0.0.0:1018 0.0.0.0:* 1267/rpcbind udp 0 0 0.0.0.0:684 0.0.0.0:* 1356/rpc.statd udp 0 0 0.0.0.0:46906 0.0.0.0:* 1356/rpc.statd udp 0 0 0.0.0.0:67 0.0.0.0:* 2952/dhcpd udp 0 0 0.0.0.0:69 0.0.0.0:* 2976/xinetd udp 0 0 :::111 :::* 1267/rpcbind udp 0 0 :::1018 :::* 1267/rpcbind udp 0 0 :::60937 :::* 1356/rpc.statd
在一台新机上测试成功: