Kickstart无人值守安装系统

1.导言

已经或未来将从事Linux系统运维工作的读者,经常会遇到一些机器式的重复的共走,例如:有时间同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。

q  光盘安装系统===>一个的服务器DVD内置光驱百千块,百台服务器都配光驱就浪费了,因为一台服务器也就开始装系统能用的上,以后用的机会屈指可数。用USB外置光驱,插来插去也是醉了。

q  U盘安装系统===>还是同样的问题,要一台一台服务器插U盘。

q  网络安装系统(ftp,http,nfs) ===>这个方法不错,只要服务器能联网就可以安装系统了,但是还需要一台台服务器去敲键盘点鼠标。时刻想着偷懒的我们,有没有更好的方法!

1.1什么是PXE

严格来说,PXE并不是一种安装方式,而是一种引导方式。进行PXE安装的必要条件是在要安装的计算机中必须包含一个PXE支持的网卡(NIC)即网卡中必须要有PXE ClientPXE(Pre-boot Execution Environment)协议可以使计算机通过网络启动。此协议分为Client端和Server端,而PXE Client则在网卡的ROM中。当计算机引导时,BIOSPXE Client调入内存中执行,然后由PXE Client将放置在远端的文件通过网络下载到本地运行。运行PXE协议需要设置DHCP服务器和TFTP服务器。DHCP服务器会给PXE Client(将要安装系统的主机)分配一个IP地址,由于是给PXE Client分配IP地址,所以在配置DHCP服务器时需要增加2PXE设置。此外,在PXE ClientROM中,已经存在了TFTP Client,那么它就可以通过TFTP协议到TFTP Server上下载所需的文件了。

1.2什么是KickStart

KickStart是一种无人值守的安装方法。它的工作原理时在安装过程中记录典型的需要人工干预填写的各种参数,并生成一个名为ks.cfg的文件。如果在安装过程中(不只局限于生成KickStart安装文件的机器)出现要填写参数的情况,安装程序首选会去查找KickStart生成的文件,如果找到合适的参数,就采用所找到的参数;如果没有找到合适的参数,便需要安装着手工干预了。所以如果KickStart文件涵盖了安装过程中可能出现的所有需要填写的参数,那么安装着完全可以只告诉安装程序从何处去ks.cfg文件,然后就去忙自己的事情。等安装完毕,安装程序会根据ks.cfg中设置重启系统,并结束安装。

2.DHCP工作过程的六个主要步骤

     对于学习 DHCP来说,很重要的一部分就是对于DHCP工作过程的理解。那么首先DHCP分为两个部分:一个是服务器端,另一个是客户端。所有客户机的IP地址设 定资料都由DHCP服务器集中管理,并负责处理客户端的DHCP要求;而客户端则会使用从服务器分配下来的IP地址。

    DHCP服务器提供三 IP分配方式:自动分配(Automatic Allocation)、动态分配(Dynamic Allocation)和手动分配。自动分配是当DHCP客户端第一次成功地从DHCP服务器端分配到一个IP地址之后,就永远使用这个地址。动态分配是 DHCP客户端第一次从DHCP服务器分配到IP地址后,并非永久地使用该地址,每次使用完后,DHCP客户端就得释放这个IP地址,以给其他客户端使 用,而手动分配是由DHCP服务器管理员专门指定IP地址。

    DHCP客户机在启动时,会搜寻网络中是否存在DHCP服务器。如果找到,则给 DHCP服务器发送一个请求。DHCP服务器接到请求后,为DHCP客户机选择TCP/IP配置的参数,并把这些参数发送给客户端。如果已配置冲突检测设置,则 DHCP 服务器在将租约中的地址提供给客户机之前会试用Ping测试作用域中每个可用地址的连通性。这可确保提供给客户的每个IP地址都没有被使用手动 TCP/IP配置的另一台非 DHCP 计算机使用。

    根据客户端是否第一次登录网络,DHCP的工作形式会有所不同。客户端从DHCP服务器上获得IP地址的整个过程分为以下六个步骤:

2.1寻找DHCP服务器

    DHCP客户端第一次登录网络的时候,计算机发现本机上没有任何IP地址设定,将以广播方式发送DHCP discover发现信息来寻找DHCP服务器,即向255.255.255.255发送特定的广播信息。网络上每一台安装了TCP/IP协议的主机都会 介绍这个广播信息,但只有DHCP服务器才会做出响应。

4.2分配IP地址

    在网络中接收到DHCP discover发现信息的DHCP服务器都会做出相应,它从尚未分配的IP地址中挑选一个分配给DHCP客户机,向DHCP客户机发送一个包含分配的IP地址和其他设置的DHCP offer提供信息。

2.3接受 IP地址

    DHCP客户端接受到DHCP offer提供信息之后,选择第一个接收到的提供信息,然后以广播的方式回答一个DHCP request请求信息,该信息包含向它所选定的DHCP服务器请求IP地址的内容。

2.4IP地址分配确认

    DHCP服务器收到DHCP客户端回答的DHCP request请求信息之后,便向DHCP客户端发送一个包含它所提供的IP地址和其他设置的DHCP ack确认信息,告诉DHCP客户端可以使用它提供的IP地址。然后,DHCP客户机便将其TCP/IP协议与网卡绑定,另外,除了DHCP客户机选中的 服务器外,其他的DHCP服务器将收回曾经提供的IP地址。

2.5重新登录

    以后DHCP客户端每次重新登录网络时,就不需要再发送DHCP discover发现信息了,而是直接发送包含前一次所分配的IP地址的DHCP request请求信息。当DHCP服务器收到这一信息后,它会尝试让DHCP客户机继续使用原来的IP地址,并回答一个DHCP ack确认信息。如果此IP地址已无法再分配给原来的DHCP客户机使用时,则DHCP服务器给DHCP客户机回答一个DHCP nack否认信息。当原来的DHCP客户机收到此DHCP nack否认信息后,它就必须重新发送DHCPdiscover发现信息来请求新的IP地址。

客户端重新登录.如图1-1

1-1

如果客DHCP request 内的IP地址在服器端没有被使用,DHCP器回复DHCP ACK继续使用IP。如1-2

 

1-2

如果客DHCP request 内的IP地址在服器端已被使用,DHCP器回复DHCP NACKIP已被使用。1-3

 

1-3

端重新开始DHCP流程。如图1-4

1-4

2.6更新租约

    DHCP 服务器向DHCP客户机出租的IP地址一般都有一个租借期限,期满后DHCP服务器便会收回出租的IP地址。如果DHCP客户机要延长其IP租约,则必须更新其IP租约。DHCP客户机启动时和IP租约期限过一半时,DHCP客户机都会自动向DHCP服务器发送更新其IP租约的信息。

3.PXE+KickStart自动部署操作系统实战

执行PXE+KickStart安装需要的设备:

q  DHCP服务器

q  TFTP服务器

q  KickStart所生成的ks.cfg配置文件

q  一台存放系统安装文件的服务器,如NFSHTTP、或FTP服务器

q  一个带有PXE支持网卡的主机。

通过Kickstart+Dhcp+tftp+httpd实现

3.1查看当前系统版本

[root@kickstart ~]# cat /etc/redhat-release

CentOS release 6.7 (Final)

3.2准备环境

必须关闭selinux防火墙,临时关闭会不生效,建议修改配置文件后,重启操作系统。

[root@kickstart ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

测试环境IP地址:外网eth0NAT模式,可以上网

[root@kickstart ~]# ifconfig eth0

eth0Link encap:Ethernet  HWaddr 00:1C:42:C4:75:DD 

          inet addr:10.0.0.3  Bcast:10.0.0.255  Mask:255.255.255.0

inet6 addr: fe80::21c:42ff:fec4:75dd/64 Scope:Link

UP BROADCAST RUNNING MULTICASTMTU:1500  Metric:1

RX packets:501 errors:0 dropped:0 overruns:0 frame:0

TX packets:216 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:61453 (60.0 KiB)  TX bytes:27706 (27.0 KiB)

3.3安装DHCP服务

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

[root@kickstart ~]# cp /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample /etc/dhcp/dhcpd.conf  #拷贝dhcp配置文件

#修改配置文件/etc/dhcpd/dhcpd.conf;添加如下

ddns-update-style none;           

ignore client-updates;            

subnet 10.0.0.0 netmask 255.255.255.0 {

  range 10.0.0.100 10.0.0.200;

  option subnet-mask 255.255.255.0;

  option domain-name "internal.example.org";

default-lease-time 600;

max-lease-time 7200;

  next-server 10.0.0.3;

  filename "/pxelinux.0";

}

[root@kickstart ~]# cat /etc/sysconfig/dhcpd  #修改/etc/sysconfig/dhcpd配置文件表示dhcp将只在eth0网络接口上提供DHCP服务。

# Command line options here

DHCPDARGS=eth0

[root@kickstart ~]# /etc/init.d/dhcpd start  #启动dhcpd服务

 

DHCP注释:

ddns-update-style none;  #设置与DHCP服务相关联的DNS数据动态更新模式,实际的DHCP应用中很少用改参数,设置为none即可。   

ignore client-updates;     #不允许客户机更新DNS记录

subnet 172.16.10.0 netmask 255.255.255.0 {

        range 172.16.10.100 172.16.10.200;  #可分配的起始IP-结束IP   

        option subnet-mask 255.255.255.0;   #设置netmask

        default-lease-time 21600;           #设置默认的IP租用期限   

        max-lease-time 43200;                       #设置最大的IP租用期限

        next-server 172.16.10.20;            #告知客户端TFTP服务器ip

        filename "/pxelinux.0";              #告知客户端从TFTP根目录下载pexlinux.0

}

3.4安装TFTP服务

TFTPTrivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69

[root@kickstart ~]# yum -y install tftp-server  #安装tftp-server服务

#修改配置文件/etc/xinetd.d/tftp   disabled修改为no

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

}

[root@kickstart ~]# /etc/init.d/xinetd start  #启动服务xinetd代理服务

3.5安装httpd服务

可以用ApacheNginx提供HTTPPython的命令web不行,会有报错

[root@kickstart ~]# yum -y install httpd  #安装httpd服务

[root@kickstart ~]#sed -i "277i ServerName 127.0.0.1:80" /etc/httpd/conf/httpd.conf #修改apache配置文件

[root@kickstart ~]# /etc/init.d/httpd start #启动apache服务

[root@kickstart ~]# mkdir /var/www/html/centos6/  #创建centos66目录

[root@kickstart ~]# mount /dev/cdrom /var/www/html/centos6/  #挂载镜像文件

不管怎么弄,只要把安装光盘内容能通过web发布即可。因为是演示,如果复制镜像就有点浪费时间。但生产环境就一定要复制了,光盘读取速度有限。

3.6PXE配置引导

syslinux是一个功能强大的引导加载程序,而且兼容各种介质。SYSLINUX是一个小型的Linux操作系统,它的目的是简化首次安装Linux的时间,并建立修护或其它特殊用途的启动盘。如果没有找到pxelinux.0这个文件,可以安装一下。

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

复制配置文件

[root@kickstart ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/

[root@kickstart ~]# cp -a  /var/www/html/centos6/isolinux/*  /var/lib/tftpboot/

[root@kickstart ~]# mkdir -p /var/lib/tftpboot/pxelinux.cfg

[root@kickstart ~]# cp /var/www/html/centos6/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default

添加如下,配置文件

[root@kickstart ~]# cat /var/lib/tftpboot/pxelinux.cfg/default

default ks

prompt 0

 

label ks

  kernel vmlinuz

  append initrd=initrd.img ks=http://10.0.0.3/config/Centos6-ks.cfg ksdevice=eth0

# ksdevice=eth0代表当客户端有多块网卡的时候,要实现自动化需要设置从eth0安装,不指定的话,安装的时候系统会让你选择,那就不叫全自动化了。

3.6.1PXE配置文件default解析

[root@kickstart ~]# cat /var/lib/tftpboot/pxelinux.cfg/default

default vesamenu.c32  #默认加载一个菜单

#prompt 1  #开启会显示命令行’boot:’ 提示符。prompt值为0时则不提示,将会直接启动’default’参数中指定的内容

timeout 600#timeout时间是引导等待用户手动选择的时间,设为1可直接引导,单位为1/10秒。

display boot.msg

#菜单背景图片、标题、颜色。

menu background splash.jpg

menu title Welcome to CentOS 6.7!

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 scrollbar 0 #ffffffff #00000000

#lable指定在boot:提示符下输入的关键字,比如boot:linux[ENTER],这个会启动lable linux下标记的kernelinitrd.img文件

label linux#一个标签就是前面图片的一行选项。

  menu label ^Install or upgrade an existing system

  menu default

  kernel vmlinuz #指定要启动的内核。同样要注意路径,默认是/tftpboot目录

  append initrd=initrd.img #指定追加给内核的参数,initrd.img是一个最小的linux系统

label vesa

  menu label Install system with ^basic video driver

  kernel vmlinuz

  append initrd=initrd.img nomodeset

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 -

3.7上传kscfg配置文件

[root@kickstart ~]# grub-crypt  #配置root使用密码,加入修改Centos6-ks.cfg文件

Password:

Retype password:

$6$006TOzR9rk18CPQw$t/xTyZEw60OWqAho.J1oj3PRo2ib93blCIlVuFCPc6/fuCADB02LKHfNV4x7jtpNAX98TK3K8Zpem8Qkv92111

[root@kickstart ]#mkdir /var/www/html/config  创建配置文件及优化脚本站点目录

[root@kickstart html]# cat /var/www/html/config/Centos6-ks.cfg

install  安装

url --url="http://10.0.0.3/centos6"  系统文件地址,这里使用http

text  文本界面安装

lang en_US.UTF-8语言

keyboard us键盘

zerombr  清空mbr

bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"  引导加载程序参数

network --bootproto=dhcp --device=eth1 --onboot=yes --noipv6 --hostname=CentOS6eth1网络配置

timezone --utc Asia/Shanghai  时区

authconfig --enableshadow --passalgo=sha512  验证配置

rootpw--iscrypted $6$006TOzR9rk18CPQw$t/xTyZEw60OWqAho.J1oj3PRo2ib93blCIlVuFCPc6/fuCADB02LKHfNV4x7jtpNAX98TK3K8Zpem8Qkv92111root密码,使用grub-crypt生成

clearpart --all --initlabel  清空分区

part /boot --fstype=ext4 --asprimary --size=100  分区/boot 100M

part swap --size=1500  分区swap 1500M

part / --fstype=ext4 --grow --asprimary --size=200  分区所有

firstboot --disable  关闭一系列服务

selinux --disabled

firewall --disabled

logging --level=info  日志记录等级info级别

reboot  重启

%packages  包组-软件名

@base

@compat-libraries

@debugging

@development

tree

nmap

sysstat

lrzsz

dos2unix

telnet

 

%post  安装完执行脚本

wget -O /tmp/optimization.sh http://10.0.0.3/config/optimization.sh &>/dev/null   下载脚本,然后执行

/bin/sh /tmp/optimization.sh 执行脚本

%end

 

3.8准备全新服务器

需要和pxe服务器内网同网段,开机通过dhcp自动获取,然后自动开始装机

3.9kickstart错误汇总

 

解决办法:

1)我们先证明安装源服务器是正常的,我们用其他机器下载install.img文件,使用下面的命令:

wget spacer.gifhttp://192.168.0.3/centos6/p_w_picpaths/install.img

若可以正常的下载这个文件,说明安装源服务器(即kickstart服务器)正常。

2)查找install.img文件的前一阶段是配置网卡、网关阶段,检查你的ks文件的配置的网卡部分,是否与安装源的ip不是一个网段,若不是一个网段就会造成网络不通,产生这个错误。这个问题也是困扰了我好几个小时的问题,迷惑性很大。

 

报错原因:selinux没关   解决法:关Selinux防火,然后重启,不生效