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安装程序的引导内核。
5).请求下载自动应答文件
客户端通过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的安装过程
[[email protected] ~]#uname -a Linux kickstart2.6.32-504.el6.x86_64 #1 SMP Wed Oct 15 04:27:16 UTC 2014 x86_64 x86_64 x86_64GNU/Linux [[email protected] ~]#cat /etc/redhat-release CentOS release 6.6(Final)
2.2 安装syslinux软件
[[email protected] ~]#yum install -y syslinux
主要需要的文件为/usr/share/syslinux/pxelinux.0
3、 安装dhcp服务
3.1 安装dhcp软件
[[email protected] ~]#yum install -y dhcp
3.2 修改配置文件
修改配置文件/etc/dhcp/dhcpd.conf,默认配置文件为空
[[email protected] ~]#vim /etc/dhcp/dhcpd.conf subnet 192.168.18.0netmask 255.255.255.0 { range 192.168.18.50 192.168.18.100; option subnet-mask 255.255.255.0; default-lease-time 21600; max-lease-time 43200; next-server 192.168.18.100; filename "/pxelinux.0"; }
配置说明
subnet 192.168.18.0netmask 255.255.255.0 { #定义子网和掩码 range 192.168.18.50 192.168.18.100; #定义dhcp分配的地址范围 option subnet-mask 255.255.255.0; #定义分配给客户端的掩码 default-lease-time 21600; #最小的dhcp租期 max-lease-time 43200; #最长的dhcp租期 next-server 192.168.18.100; #填写kickstart服务器的地址 filename "/pxelinux.0"; #注明pxelinux.0的目录,相对tftpserver目录 }
修改dhcp监听的网卡
[[email protected] ~]#vim /etc/sysconfig/dhcpd # Command lineoptions here DHCPDARGS=eth0
3.3 启动dhcp服务
[[email protected] ~]#/etc/init.d/dhcpd start Starting dhcpd: [ OK ] [[email protected] ~]#netstat -tlunp|grep 67 tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1467/master tcp 0 0 ::1:25 :::* LISTEN 1467/master udp 0 0 0.0.0.0:67 0.0.0.0:* 8437/dhcpd
4、 安装apache
4.1 安装apache软件
使用yum安装httpd,安装完成默认的程序路径文件为/var/www/html
[[email protected] ~]#yum -y install httpd
关掉iptables和selinux
[[email protected] ~]#/etc/init.d/iptables stop iptables: Settingchains to policy ACCEPT: filter [ OK ] iptables: Flushingfirewall rules: [ OK ] iptables: Unloadingmodules: [ OK ] [[email protected] ~]#getenforce Permissive
启动apache软件,没有配置ServerName,错误提示不用管
[[email protected] ~]#/etc/init.d/httpd start Starting httpd:httpd: Could not reliably determine the server‘s fully qualified domain name,using 111.175.221.58 for ServerName [ OK ] [[email protected] ~]#netstat -tlunp|grep 80 tcp 0 0 :::80 :::* LISTEN 8227/httpd
4.2 挂载光盘
新建光盘加载目录,并挂载,如果是真机,则可以将光盘文件上传至服务器目录内或者使用ISO文件挂载即可
[[email protected] ~]#mkdir /var/www/html/centos6 [[email protected] ~]#mount -t iso9660 /dev/sr0 /var/www/html/centos6 mount: block device/dev/sr0 is write-protected, mounting read-only [[email protected] ~]#df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_centos-LogVol00 20G 2.9G 16G 16% / tmpfs 238M 0 238M 0% /dev/shm /dev/sda1 190M 27M 153M 16% /boot /dev/mapper/vg_centos-LogVol02 5.7G 12M 5.4G 1% /db /dev/sr0 4.4G 4.4G 0 100% /var/www/html/centos6
在浏览器中输入http://192.168.18.100/centos6/正常显示的结果如下:
5 安装tftp
5.1安装tftp-server
使用yum安装tftp-server软件,tftp-server使用的是xinetd控制
yum installtftp-server –y
查看tftp-server使用的文件,/var/lib/tftpboot为系统默认的安装路径
[[email protected] ~]#rpm -ql tftp-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
5.2 修改配置文件
编辑tftp-server配置文件/etc/xinet.d/tftp
[[email protected] ~]#vim /etc/xinetd.d/tftp service tftp { 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 = 100 2 flags = IPv4 }
5.3 启动tftp-server
tftp-server通过xinetd控制
[[email protected] ~]#/etc/init.d/xinetd restart Stoppingxinetd: [FAILED] Startingxinetd: [ OK ]
检查启动是否成功
[[email protected] ~]#netstat -tlunp|grep 69 udp 0 0 0.0.0.0:69 0.0.0.0:* 8286/xinetd
5.4 拷坝启动文件
将pxelinux.0复制到tftp目录
[[email protected] ~]#cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/ [[email protected] ~]#cp /var/www/html/centos6/isolinux/* /var/lib/tftpboot/
查看tftpboot文件内容
[[email protected] ~]#ls /var/lib/tftpboot/ boot.cat grub.conf isolinux.bin memtest splash.jpg vesamenu.c32 boot.msg initrd.img isolinux.cfg pxelinux.0 TRANS.TBL vmlinuz
新建目录pxelinux.cfg目录
[[email protected]]# mkdir pxelinux.cfg [[email protected]]# cp isolinux.cfg pxelinux.cfg/default
编辑/var/lib/tftpboot/pxelinux.cfg/default文件,在label rescue前添加一个标签,将default选项移动到新添加的标签中
[[email protected]]# cat default default vesamenu.c32 #prompt 1 timeout 600 display boot.msg menu backgroundsplash.jpg menu title Welcometo CentOS 6.6! menu color border 0#ffffffff #00000000 menu color sel 7#ffffffff #ff000000 menu color title 0#ffffffff #00000000 menu color tabmsg 0#ffffffff #00000000 menu color unsel 0#ffffffff #00000000 menu color hotsel 0#ff000000 #ffffffff menu color hotkey 7#ffffffff #ff000000 menu color scrollbar0 #ffffffff #00000000 label linux menu label ^Install or upgrade an existingsystem kernel vmlinuz append initrd=initrd.img label vesa menu label Install system with ^basic videodriver kernel vmlinuz append initrd=initrd.img xdriver=vesanomodeset labelkickstart menu label Install system with kickstart menu default kernel vmlinuz append initrd=initrd.img ks=http://192.168.18.100/ks.cfg label rescue menu label ^Rescue installed system kernel vmlinuz append initrd=initrd.img rescue label local menu label Boot from ^local drive localboot 0xffff label memtest86 menu label ^Memory test kernel memtest append -
6 生成ks.cfg文件
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 设置在安装过程中使用的语言以及系统的缺省语言。lang en_US.UTF-8 keyboard 设置系统键盘类型。keyboard us zerombr清除mbr引导信息。 bootloader 系统引导相关配置。 bootloader--location=mbr --driveorder=sda --append="crashkernel=auto rhgbquiet" --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 --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关机。
6.2 ks配置文件
系统安装完成默认的会生成当前安装的应答文件anaconda-ks.cfg,可以参照此文件
生成一个密码备用
[[email protected] ~]#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 lang en_US.UTF-8 keyboard us zerombr bootloader--location=mbr --driveorder=sda --append="crashkernel=auto rhgbquiet" 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 part swap--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.sh http://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.img ks=http://192.168.18.100/ks.cfg
改为
appendinitrd=initrd.img ksdevice=eth0 ks=http://192.168.18.100/ks.cfg biosdevicename=0
b)编辑ks.cfg文件
找到
bootloader--location=mbr --driveorder=sda --append="crashkernel=auto rhgbquiet"
改为
bootloader--location=mbr --driveorder=sda --append="biosdevicename=0 crashkernel=auto rhgb quiet"
6.4优化脚本
可在在main函数中选择需要调和的优化函数来加载一部分
[[email protected]]# vim optimization.sh #!/bin/bash #sunny #mail:[email protected] ./etc/init.d/functions function Msg(){ if [ $? -eq 0 ];then action "$1" /bin/true else action "$1" /bin/false fi } #change the limit function limits(){ [ `grep "addedfor change" /etc/security/limits.conf|wc -l` -eq 0 ] && { cat>>/etc/security/limits.conf <<EOF #added for changelimit * hard nofile 131072 * soft nofile 131072 * hard nproc16384 * soft nproc16384 EOF Msg "Configsystem limits.conf" } } #change sysctl.conffor kernel functionchangekernel(){ cat>/etc/sysctl.conf <<EOF # Kernel sysctlconfiguration file for Red Hat Linux # # For binary values,0 is disabled, 1 is enabled. Seesysctl(8) and # sysctl.conf(5) formore details. # Controls IP packetforwarding net.ipv4.ip_forward= 0 # Controls sourceroute verification net.ipv4.conf.default.rp_filter= 1 # Do not acceptsource routing net.ipv4.conf.default.accept_source_route= 0 # Controls theSystem Request debugging functionality of the kernel kernel.sysrq = 0 # Controls whethercore dumps will append the PID to the core filename. # Useful fordebugging multi-threaded applications. kernel.core_uses_pid= 1 # Controls the useof TCP syncookies net.ipv4.tcp_syncookies= 1 # Disable netfilteron bridges. net.bridge.bridge-nf-call-ip6tables= 0 net.bridge.bridge-nf-call-iptables= 0 net.bridge.bridge-nf-call-arptables= 0 # Controls thedefault maxmimum size of a mesage queue kernel.msgmnb =65536 # Controls themaximum size of a message, in bytes kernel.msgmax =65536 # Controls themaximum shared segment size, in bytes kernel.shmmax =68719476736 # Controls themaximum number of shared memory segments, in pages 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= 4000 65000 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 "Config kernel" sysctl -p } #set ntp function ntptime(){ [ `/usr/bin/crontab-l|grep "sync time"|wc -l` -eq 0] && { echo "#sync time added by sunny at$(date +%F)" >>/var/spool/cron/root echo ‘*/5 * * * * /usr/sbin/ntpdatecn.pool.ntp.org &>/dev/null‘ >>/var/spool/cron/root Msg "Time sync" } } # Defined SystemStartup Services Functions function boot(){ for prog in `chkconfig --list|grep"3:on"|awk ‘{print $1}‘|grep -vE"crond|network|rsyslog|sshd|sysstat"` do chkconfig $prog off done Msg "chkconfig for boot" } #stop ctrl+alt+del function stopctl(){ [ -f /etc/init/control-alt-delete.conf ]&& { sed -i s/start/#start/g/etc/init/control-alt-delete.conf } Msg "Stop Ctrl+Alt+Del" } #Define add usersunny function adduser(){ useradd sunny echo "123456"|passwd --stdinsunny cat>>/etc/sudoers <<EOF #add sudo user sunny sunny ALL=(ALL) ALL EOF } #Define mainfunctions function main(){ limits sysctl ntptime stopctl boot adduser } main
7 测试安装
启动客户端机器,从网卡启动,检查是否能够自动化部署,如果是多台,将多台客户端和kickstart服务器接入同一台交换机上,即可实现
如果是redhat系统,部署方法类似,部署完成后可以单独执行一上优化检查脚本记录至日志文件,可以通过查看日志文件,检查部署结果