1、  背景介绍

   现在很多企业都有这样的需求,一次安装多台服务器,常规的光盘安装即费时也费力,只能一台一台的安装,当服务器数量几十到几百台的时候,这样安装效率就大大降低了,这样就诞生了自动化部署软件,常用的有kickstartcubbler

1.1什么是PXE

PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统,在启动过程中,终端要求服务器分配IP地址,再用TFTPtrivial file transfer protocol)或MTFTP(multicasttrivial file transfer protocol)协议下载一个启动软件包到本机内存中执行,由这个启动软件包完成终端(客户?)基本软件设置,从而引导预先安装在服务器中的终端操作系统。PXE可以引导多种操作系统,如:Windows95/98/2000/windows2003/windows2008/winXP/win7/win8,linux等。

1.2  kickstart工作机制

1.PXE ClientDHCP发送请求

PXE Client从自己的PXE网卡启动,通过PXEBootROM(自启动芯片)会以UDP(简单用户数据报协议)发送一个广播请求,向本网络中的DHCP服务器索取IP

2.DHCP服务器提供信息

DHCP服务器收到客户端的请求,验证是否来至合法的PXEClient的请求,验证通过它将给客户端一个“提供”响应,这个“提供”响应中包含了为客户端分配的IP地址、pxelinux启动程序(TFTP)位置,以及配置文件所在位置。

3.PXE客户端请求下载启动文件

客户端收到服务器的“回应”后,会回应一个帧,以请求传送启动所需文件。这些启动文件包括:pxelinux.0pxelinux.cfg/defaultvmlinuzinitrd.img等文件。

4.Boot Server响应客户端请求并传送文件

当服务器收到客户端的请求后,他们之间之后将有更多的信息在客户端与服务器之间作应答, 用以决定启动参数。BootROMTFTP通讯协议从Boot Server下载启动安装程序所必须的文件(pxelinux.0pxelinux.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的安装过程

[root@kickstart ~]#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
[root@kickstart ~]#cat /etc/redhat-release
CentOS release 6.6(Final)

2.2  安装syslinux软件

[root@kickstart ~]#yum install -y syslinux

主要需要的文件为/usr/share/syslinux/pxelinux.0

3、  安装dhcp服务

3.1  安装dhcp软件

[root@kickstart ~]#yum install -y dhcp

3.2  修改配置文件

修改配置文件/etc/dhcp/dhcpd.conf,默认配置文件为空

[root@kickstart ~]#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监听的网卡

[root@kickstart ~]#vim /etc/sysconfig/dhcpd
# Command lineoptions here
DHCPDARGS=eth0

3.3  启动dhcp服务

[root@kickstart ~]#/etc/init.d/dhcpd start
Starting dhcpd:                                           [  OK  ]
[root@kickstart ~]#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

[root@kickstart ~]#yum -y install httpd

关掉iptablesselinux

[root@kickstart ~]#/etc/init.d/iptables stop
iptables: Settingchains to policy ACCEPT: filter            [  OK  ]
iptables: Flushingfirewall rules:                        [  OK  ]
iptables: Unloadingmodules:                           [  OK  ]
[root@kickstart ~]#getenforce
Permissive

启动apache软件,没有配置ServerName,错误提示不用管

[root@kickstart ~]#/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  ]
[root@kickstart ~]#netstat -tlunp|grep 80
tcp        0     0 :::80                      :::*                        LISTEN      8227/httpd

4.2  挂载光盘

新建光盘加载目录,并挂载,如果是真机,则可以将光盘文件上传至服务器目录内或者使用ISO文件挂载即可

[root@kickstart ~]#mkdir /var/www/html/centos6
[root@kickstart ~]#mount -t iso9660 /dev/sr0 /var/www/html/centos6
mount: block device/dev/sr0 is write-protected, mounting read-only
[root@kickstart ~]#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/正常显示的结果如下:

wKiom1fNLa7C4CzqAABj2sPhPt0377.png-wh_50

5    安装tftp

5.1安装tftp-server

使用yum安装tftp-server软件,tftp-server使用的是xinetd控制

yum installtftp-server –y

查看tftp-server使用的文件,/var/lib/tftpboot为系统默认的安装路径

[root@kickstart ~]#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

[root@kickstart ~]#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控制

[root@kickstart ~]#/etc/init.d/xinetd restart
Stoppingxinetd:                                          [FAILED]
Startingxinetd:                                          [  OK  ]

检查启动是否成功

[root@kickstart ~]#netstat -tlunp|grep 69
udp        0     0 0.0.0.0:69                  0.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/

查看tftpboot文件内容

[root@kickstart ~]#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目录

[root@kickstarttftpboot]# mkdir pxelinux.cfg
[root@kickstarttftpboot]# cp isolinux.cfg pxelinux.cfg/default


编辑/var/lib/tftpboot/pxelinux.cfg/default文件,在label rescue前添加一个标签,default选项移动到新添加的标签中

[root@kickstartpxelinux.cfg]# 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,可以参照此文件

生成一个密码备用

[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
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函数中选择需要调和的优化函数来加载一部分

[root@kickstarthtml]# vim optimization.sh
#!/bin/bash
#sunny
#mail:519209@qq.com
 
./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系统,部署方法类似,部署完成后可以单独执行一上优化检查脚本记录至日志文件,可以通过查看日志文件,检查部署结果