1、 背景介绍
现在很多企业都有这样的需求,一次安装多台服务器,常规的光盘安装即费时也费力,只能一台一台的安装,当服务器数量几十到几百台的时候,这样安装效率就大大降低了,这样就诞生了自动化部署软件,常用的有kickstart和cubbler
1.1什么是PXE
PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统,在启动过程中,终端要求服务器分配IP地址,再用TFTP(trivial file transfer protocol)或MTFTP(multicasttrivial file transfer protocol)协议下载一个启动软件包到本机内存中执行,由这个启动软件包完成终端(客户?)基本软件设置,从而引导预先安装在服务器中的终端操作系统。PXE可以引导多种操作系统,如:Windows95/98/2000/windows2003/windows2008/winXP/win7/win8,linux等。
1.2 kickstart工作机制
1).PXE Client向DHCP发送请求
PXE Client从自己的PXE网卡启动,通过PXEBootROM(自启动芯片)会以UDP(简单用户数据报协议)发送一个广播请求,向本网络中的DHCP服务器索取IP。
2).DHCP服务器提供信息
DHCP服务器收到客户端的请求,验证是否来至合法的PXEClient的请求,验证通过它将给客户端一个“提供”响应,这个“提供”响应中包含了为客户端分配的IP地址、pxelinux启动程序(TFTP)位置,以及配置文件所在位置。
3).PXE客户端请求下载启动文件
客户端收到服务器的“回应”后,会回应一个帧,以请求传送启动所需文件。这些启动文件包括:pxelinux.0、pxelinux.cfg/default、vmlinuz、initrd.img等文件。
4).Boot Server响应客户端请求并传送文件
当服务器收到客户端的请求后,他们之间之后将有更多的信息在客户端与服务器之间作应答,用以决定启动参数。BootROM由TFTP通讯协议从Boot Server下载启动安装程序所必须的文件(pxelinux.0、pxelinux.cfg/default)。default文件下载完成后,会根据该文件中定义的引导顺序,启动Linux安装程序的引导内核。
客户端通过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和客户端建立连接后,将开始传输软件包,客户端将开始安装操作系统。安装完成后,将提示重新引导计算机。
2 环境准备
2.1 系统环境
本次以Centos 6.6为例讲解kickstart的安装过程
[root@kickstart~]#uname-a Linuxkickstart2.6.32-504.el6.x86_64#1SMPWedOct1504:27:16UTC2014x86_64x86_64x86_64GNU/Linux [root@kickstart~]#cat/etc/redhat-release CentOSrelease6.6(Final)
2.2 安装syslinux软件
[root@kickstart~]#yuminstall-ysyslinux
主要需要的文件为/usr/share/syslinux/pxelinux.0
3、 安装dhcp服务
3.1 安装dhcp软件
[root@kickstart~]#yuminstall-ydhcp
修改配置文件/etc/dhcp/dhcpd.conf,默认配置文件为空
[root@kickstart~]#vim/etc/dhcp/dhcpd.conf subnet192.168.18.0netmask255.255.255.0{ range192.168.18.50192.168.18.100; optionsubnet-mask255.255.255.0; default-lease-time21600; max-lease-time43200; next-server192.168.18.100; filename"/pxelinux.0"; }
配置说明
subnet192.168.18.0netmask255.255.255.0{#定义子网和掩码 range192.168.18.50192.168.18.100;#定义dhcp分配的地址范围 optionsubnet-mask255.255.255.0;#定义分配给客户端的掩码 default-lease-time21600;#最小的dhcp租期 max-lease-time43200;#最长的dhcp租期 next-server192.168.18.100;#填写kickstart服务器的地址 filename"/pxelinux.0";#注明pxelinux.0的目录,相对tftpserver目录 }
修改dhcp监听的网卡
[root@kickstart~]#vim/etc/sysconfig/dhcpd #Commandlineoptionshere DHCPDARGS=eth0
3.3 启动dhcp服务
[root@kickstart~]#/etc/init.d/dhcpdstart Startingdhcpd:[OK] [root@kickstart~]#netstat-tlunp|grep67 tcp00127.0.0.1:250.0.0.0:*LISTEN1467/master tcp00::1:25:::*LISTEN1467/master udp000.0.0.0:670.0.0.0:*8437/dhcpd
4、 安装apache
4.1 安装apache软件
使用yum安装httpd,安装完成默认的程序路径文件为/var/www/html
[root@kickstart~]#yum-yinstallhttpd
关掉iptables和selinux
[root@kickstart~]#/etc/init.d/iptablesstop iptables:SettingchainstopolicyACCEPT:filter[OK] iptables:Flushingfirewallrules:[OK] iptables:Unloadingmodules:[OK] [root@kickstart~]#getenforce Permissive
启动apache软件,没有配置ServerName,错误提示不用管
[root@kickstart~]#/etc/init.d/httpdstart Startinghttpd:httpd:Couldnotreliablydeterminetheserver'sfullyqualifieddomainname,using111.175.221.58forServerName [OK] [root@kickstart~]#netstat-tlunp|grep80 tcp00:::80:::*LISTEN8227/httpd
4.2 挂载光盘
新建光盘加载目录,并挂载,如果是真机,则可以将光盘文件上传至服务器目录内或者使用ISO文件挂载即可
[root@kickstart~]#mkdir/var/www/html/centos6 [root@kickstart~]#mount-tiso9660/dev/sr0/var/www/html/centos6 mount:blockdevice/dev/sr0iswrite-protected,mountingread-only [root@kickstart~]#df-h FilesystemSizeUsedAvailUse%Mountedon /dev/mapper/vg_centos-LogVol00 20G2.9G16G16%/ tmpfs238M0238M0%/dev/shm /dev/sda1190M27M153M16%/boot /dev/mapper/vg_centos-LogVol02 5.7G12M5.4G1%/db /dev/sr04.4G4.4G0100%/var/www/html/centos6
在浏览器中输入http://192.168.18.100/centos6/正常显示的结果如下:
5 安装tftp
5.1安装tftp-server
使用yum安装tftp-server软件,tftp-server使用的是xinetd控制
yuminstalltftp-server�y
查看tftp-server使用的文件,/var/lib/tftpboot为系统默认的安装路径
[root@kickstart~]#rpm-qltftp-server /etc/xinetd.d/tftp /usr/sbin/in.tftpd /usr/share/doc/tftp-server-0.49 /usr/share/doc/tftp-server-0.49/CHANGES /usr/share/doc/tftp-server-0.49/README /usr/share/doc/tftp-server-0.49/README.security /usr/share/doc/tftp-server-0.49/README.security.tftpboot /usr/share/man/man8/in.tftpd.8.gz /usr/share/man/man8/tftpd.8.gz /var/lib/tftpboot
编辑tftp-server配置文件/etc/xinet.d/tftp
[root@kickstart~]#vim/etc/xinetd.d/tftp servicetftp { socket_type=dgram protocol=udp wait=yes user=root server=/usr/sbin/in.tftpd server_args=-s/var/lib/tftpboot disable=no per_source=11 cps=1002 flags=IPv4 }
5.3 启动tftp-server
tftp-server通过xinetd控制
[root@kickstart~]#/etc/init.d/xinetdrestart Stoppingxinetd:[Failed] Startingxinetd:[OK]
检查启动是否成功
[root@kickstart~]#netstat-tlunp|grep69 udp000.0.0.0:690.0.0.0:*8286/xinetd
5.4 拷坝启动文件
将pxelinux.0复制到tftp目录
[root@kickstart~]#cp/usr/share/syslinux/pxelinux.0/var/lib/tftpboot/ [root@kickstart~]#cp/var/www/html/centos6/isolinux/*/var/lib/tftpboot/
[root@kickstart~]#ls/var/lib/tftpboot/ boot.catgrub.confisolinux.binmemtestsplash.jpgvesamenu.c32 boot.msginitrd.imgisolinux.cfgpxelinux.0TRANS.TBLvmlinuz
新建目录pxelinux.cfg目录
[root@kickstarttftpboot]#mkdirpxelinux.cfg [root@kickstarttftpboot]#cpisolinux.cfgpxelinux.cfg/default
编辑/var/lib/tftpboot/pxelinux.cfg/default文件,在label rescue前添加一个标签,将default选项移动到新添加的标签中
[root@kickstartpxelinux.cfg]#catdefault defaultvesamenu.c32 #prompt1 timeout600 displayboot.msg menubackgroundsplash.jpg menutitleWelcometoCentOS6.6! menucolorborder0#ffffffff#00000000 menucolorsel7#ffffffff#ff000000 menucolortitle0#ffffffff#00000000 menucolortabmsg0#ffffffff#00000000 menucolorunsel0#ffffffff#00000000 menucolorhotsel0#ff000000#ffffffff menucolorhotkey7#ffffffff#ff000000 menucolorscrollbar0#ffffffff#00000000 labellinux menulabel^Installorupgradeanexistingsystem kernelvmlinuz appendinitrd=initrd.img labelvesa menulabelInstallsystemwith^basicvideodriver kernelvmlinuz appendinitrd=initrd.imgxdriver=vesanomodeset labelkickstart menulabelInstallsystemwithkickstart menudefault kernelvmlinuz appendinitrd=initrd.imgks=http://192.168.18.100/ks.cfg labelrescue menulabel^Rescueinstalledsystem kernelvmlinuz appendinitrd=initrd.imgrescue labellocal menulabelBootfrom^localdrive localboot0xffff labelmemtest86 menulabel^Memorytest kernelmemtest append-
6.1 ks参数介绍
软件包段 %packages @groupname:指定安装的包组 package_name:指定安装的包 -package_name:指定不安装的包 脚本段(可选) %pre:安装系统前执行的命令或脚本(由于只依赖于启动镜像,支持的命令很少) %post:安装系统后执行的命令或脚本(基本支持所有命令) install告知安装程序,这是一次全新安装,而不是升级upgrade。 url--url=""通过FTP或HTTP从远程服务器上的安装树中安装。 url--url="http://192.168.18.100/centos6/" url--urlftp://<username>:<password>@<server>/<dir> nfs从指定的NFS服务器安装。 nfs--server=nfsserver.example.com--dir=/tmp/install-tree text使用文本模式安装。 lang设置在安装过程中使用的语言以及系统的缺省语言。langen_US.UTF-8 keyboard设置系统键盘类型。keyboardus zerombr清除mbr引导信息。 bootloader系统引导相关配置。 bootloader--location=mbr--driveorder=sda--append="crashkernel=autorhgbquiet" --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=192.168.18.100--netmask=255.255.255.0--gateway=192.168.18.254--nameserver=202.103.24.68 请注意所有配置信息都必须在一行上指定,不能使用反斜线来换行。 --ip=,要安装的机器的IP地址. --gateway=,IP地址格式的默认网关. --netmask=,安装的系统的子网掩码. --hostname=,安装的系统的主机名. --onboot=,是否在引导时启用该设备. --noipv6=,禁用此设备的IPv6. --nameserver=,配置dns解析. timezone设置系统时区。timezone--utcAsia/Shanghai authconfig系统认证信息。authconfig--enableshadow--passalgo=sha512 设置密码加密方式为sha512启用shadow文件。 rootpwroot密码 clearpart清空分区。clearpart--all--initlabel --all从系统中清除所有分区,--initlable初始化磁盘标签 part磁盘分区。 part/boot--fstype=ext4--asprimary--size=200 partswap--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关机。
6.2 ks配置文件
系统安装完成默认的会生成当前安装的应答文件anaconda-ks.cfg,可以参照此文件
生成一个密码备用
[root@kickstart~]#grub-crypt Password:redhat Retypepassword:redhat $6$7T2aV99xUqQ6RKc9$MH.mEiFWbiHenAaLdb3y0EQ2MUOrSpGqdjOC8vymtIIRsHitwSbjRTSKWOKi81p7aJsHHswYCSEXoWwaI2L2D/
ks.cfg配置文件,放置于/var/www/html目录中
install url--url="http://192.168.18.100/centos6/" text langen_US.UTF-8 keyboardus zerombr bootloader--location=mbr--driveorder=sda--append="crashkernel=autorhgbquiet" network--bootproto=dhcp--device=eth0--onboot=yes--noipv6--hostname=CentOS6 timezone--utcAsia/Shanghai authconfig--enableshadow--passalgo=sha512 rootpw--iscrypted$6$7T2aV99xUqQ6RKc9$MH.mEiFWbiHenAaLdb3y0EQ2MUOrSpGqdjOC8vymtIIRsHitwSbjRTSKWOKi81p7aJsHHswYCSEXoWwaI2L2D/ clearpart--all--initlabel part/boot--fstype=ext4--asprimary--size=800 partswap--size=1024 part/--fstype=ext4--grow--asprimary--size=200 firstboot--disable selinux--disabled firewall--disabled logging--level=info reboot %packages @base @compat-libraries @debugging @development tree nmap sysstat lrzsz dos2unix telnet %post wget-O/tmp/optimization.shhttp://192.168.18.100/optimization.sh&>/dev/null /bin/sh/tmp/optimization.sh %end
6.3Dell服务器多网卡启动弹选择框
使用dell服务器进行安装时,默认会有四块网卡,em1-em4,如果在配置文件中不作设定,会弹出一个启动网卡选择框,影响自动化安装,处理办法如下:
a)编辑/var/lib/tftpboot/pxelinux.cfg/default文件
找到启动参数
appendinitrd=initrd.imgks=http://192.168.18.100/ks.cfg
改为
appendinitrd=initrd.imgksdevice=eth0ks=http://192.168.18.100/ks.cfgbiosdevicename=0
b)编辑ks.cfg文件
找到
bootloader--location=mbr--driveorder=sda--append="crashkernel=autorhgbquiet"
改为
bootloader--location=mbr--driveorder=sda--append="biosdevicename=0crashkernel=autorhgbquiet"
6.4优化脚本
[root@kickstarthtml]#vimoptimization.sh #!/bin/bash #sunny #mail:519209@qq.com ./etc/init.d/functions functionMsg(){ if[$?-eq0];then action"$1"/bin/true else action"$1"/bin/false fi } #changethelimit functionlimits(){ [`grep"addedforchange"/etc/security/limits.conf|wc-l`-eq0]&&{ cat>>/etc/security/limits.conf<<EOF #addedforchangelimit *hardnofile131072 *softnofile131072 *hardnproc16384 *softnproc16384 EOF Msg"Configsystemlimits.conf" } } #changesysctl.confforkernel functionchangekernel(){ cat>/etc/sysctl.conf<<EOF #KernelsysctlconfigurationfileforRedHatLinux # #Forbinaryvalues,0isdisabled,1isenabled.Seesysctl(8)and #sysctl.conf(5)formoredetails. #ControlsIPpacketforwarding net.ipv4.ip_forward=0 #Controlssourcerouteverification net.ipv4.conf.default.rp_filter=1 #Donotacceptsourcerouting net.ipv4.conf.default.accept_source_route=0 #ControlstheSystemRequestdebuggingfunctionalityofthekernel kernel.sysrq=0 #ControlswhethercoredumpswillappendthePIDtothecorefilename. #Usefulfordebuggingmulti-threadedapplications. kernel.core_uses_pid=1 #ControlstheuSEOfTCPsyncookies net.ipv4.tcp_syncookies=1 #Disablenetfilteronbridges. net.bridge.bridge-nf-call-ip6tables=0 net.bridge.bridge-nf-call-iptables=0 net.bridge.bridge-nf-call-arptables=0 #Controlsthedefaultmaxmimumsizeofamesagequeue kernel.msgmnb=65536 #Controlsthemaximumsizeofamessage,inbytes kernel.msgmax=65536 #Controlsthemaximumsharedsegmentsize,inbytes kernel.shmmax=68719476736 #Controlsthemaximumnumberofsharedmemorysegments,inpages kernel.shmall=4294967296 net.ipv4.tcp_fin_timeout=2 net.ipv4.tcp_tw_reuse=1 net.ipv4.tcp_tw_recycle=1 net.ipv4.tcp_syncookies=1 net.ipv4.tcp_keepalive_time=600 net.ipv4.ip_local_port_range=400065000 net.ipv4.tcp_max_syn_backlog=16384 net.ipv4.tcp_max_tw_buckets=36000 net.ipv4.route.gc_timeout=100 net.ipv4.tcp_syn_retries=1 net.ipv4.tcp_synack_retries=1 net.core.somaxconn=16384 net.core.netdev_max_backlog=16384 net.ipv4.tcp_max_orphans=16384 EOF Msg"Configkernel" sysctl-p } #setntp functionntptime(){ [`/usr/bin/crontab-l|grep"synctime"|wc-l`-eq0]&&{ echo"#synctimeaddedbysunnyat$(date+%F)">>/var/spool/cron/root echo'*/5****/usr/sbin/ntpdatecn.pool.ntp.org&>/dev/null'>>/var/spool/cron/root Msg"Timesync" } } #DefinedSystemStartupServicesFunctions functionboot(){ forprogin`chkconfig--list|grep"3:on"|awk'{print$1}'|grep-vE"crond|network|rsyslog|sshd|sysstat"` do chkconfig$progoff done Msg"chkconfigforboot" } #stopctrl+alt+del functionstopctl(){ [-f/etc/init/control-alt-delete.conf]&&{ sed-is/start/#start/g/etc/init/control-alt-delete.conf } Msg"StopCtrl+Alt+Del" } #Defineaddusersunny functionadduser(){ useraddsunny echo"123456"|passwd--stdinsunny cat>>/etc/sudoers<<EOF #addsudousersunny sunnyALL=(ALL)ALL EOF } #Definemainfunctions functionmain(){ limits sysctl ntptime stopctl boot adduser } main
7 测试安装
启动客户端机器,从网卡启动,检查是否能够自动化部署,如果是多台,将多台客户端和kickstart服务器接入同一台交换机上,即可实现
如果是redhat系统,部署方法类似,部署完成后可以单独执行一上优化检查脚本记录至日志文件,可以通过查看日志文件,检查部署结果