1 简介

1.1 PXE简介

q  PXE是预启动执行环境,全名是Pre-boot Execution Environment

q  通过网络接口启动计算机,不需要依赖本地存储设备或本地已安装的操作系统

q  IntelSystemsoft公司于1999920日公布的技术

q  C/S的工作模式

q  PXE客户端会调用网际协议(IP)、用户数据协议(UDP)、动态主机分配协议(DHCP)、小型文件传输协议(TFTP)等网络协议

1.2 kickstart简介

kickstart是一种无人值守的安装方式    ,他的工作原理就是在安装的过程中记录人工干预填写的各种参数,并会生成一个名为ks.cfg的文件,如果在自动化安装的过程中出现需要填写参数的情况,安装程序就会去找ks.cfg程序,如果找到合适的参数,就采用所找到的参数,若找不到则需要人工进行填写,所以如果ks.cfg文件中涵盖了所有需要填写的参数,那么安装者完全可以只需告诉安装程序从何处下载ks.cfg文件,然后就可以等待安装完毕,然后会根据ks.cfg

文件设置重启/安装系统,最后结束安装。

1.3 Cobbler简介

 Cobbler集中和简化了通过网络安装操作系统需要使用的DHCPTFTP、和DNS服务的配置,Cobbler不仅有一个命令行界面,还提供了一个web界面,大大降低了使用者的入门水平。Cobbler内置了一个轻量级的配置管理系统,但也支持和其他配置管理系统集成,例如Puppet,但是暂时还不支持SaltStack

1.4 KickstartCobbler的区别

 简单的说就是Cobbler是对Kickstart的封装,简化了安装步骤、使用流程、降低了使用者的门槛

1.5 PXE+Kickstart装机流程图

image.png

2 环境准备

2.1 系统环境

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

CentOS release 6.9 (Final)

[root@kisckstart ~]# uname -m

x86_64

[root@kisckstart ~]# uname -r

2.6.32-696.el6.x86_64

[root@kisckstart ~]# ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}'

10.33.1.2

[root@kisckstart ~]# hostname

kisckstart

2.2 关闭安装机制

[root@kisckstart ~]# /etc/init.d/iptables stop

[root@kisckstart ~]# chkconfig iptables off

[root@kisckstart ~]# setenforce 0

[root@kisckstart ~]# sed "s#SELINUX=enforcing#SELINUX=disabled#g" /etc/sysconfig/selinux

3 部署kickstart

3.1 安装DHCP服务

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

[root@kisckstart ~]# rpm -ql dhcp|grep "dhcpd.conf"  ==》查找配置文件的位置

/etc/dhcp/dhcpd.conf

[root@kisckstart ~]# cat /etc/dhcp/dhcpd.conf

subnet 10.33.0.0 netmask 255.255.0.0 {

  range 10.33.1.100 10.33.1.200;  ##分配的IP地址范围

  option subnet-mask 255.255.0.0;  ##设定netmask

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

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

  next-server 10.33.1.2;  ##TFTP服务器的IP地址

  filename "/pxelinux.0";  ##告诉客户端从根目录下载pxelinux.0文件

 

}

[root@kisckstart ~]# /etc/init.d/dhcpd start

[root@kisckstart ~]# netstat -tunlp |grep dhcpd  ==》查看端口

3.2 安装TFTP服务

[root@kisckstart ~]# yum install -y tftp-server

[root@kisckstart ~]# cat /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    ##由原来的yes变为no

       per_source             = 11

       cps                 = 100 2

       flags              = IPv4

}

[root@kisckstart ~]# /etc/init.d/xinetd start

[root@kisckstart ~]# netstat -tnulp|grep "xinetd"

3.3 配置HTTP服务

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

[root@kisckstart ~]#sed -i "277i ServerName 127.0.0.1:80" /etc/httpd/conf/httpd.conf

[root@kisckstart conf]# /etc/init.d/httpd start

3.4 上传镜像

[root@kisckstart ~]# mkdir /var/www/html/centos-6.9 ==》创建镜像存放目录

[root@kisckstart ~]# mount /dev/cdrom /var/www/html/centos-6.9/  ==》挂载

mount: block device /dev/sr0 is write-protected, mounting read-only

[root@kisckstart ~]# df -h  ==》检查

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda3        19G  1.8G   16G  10% /

tmpfs           491M     0  491M   0% /dev/shm

/dev/sda1       190M   35M  146M  19% /boot

/dev/sr0        3.7G  3.7G     0 100% /var/www/html/centos-6.9

注意:只要将镜像通过web发布即可,所以不管你怎么弄都行!!!

3.5 浏览器访问测试

image.png

3.6 配置支持PXE的启动程序

3.6.1 PXE引导配置

q  syslinux是一个功能强大的引导加载程序,并且兼容各种介质

q  syslinux是一个小型的linux操作系统,目的是简化linux首次安装的时间,并建立维护或其他特殊用途的启动盘

q  如果没有找到pxelinux.0这个文件,可以安装下syslinux

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

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

[root@kisckstart ~]# cp -a /var/www/html/centos-6.9/isolinux/* /var/lib/tftpboot/

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

[root@kisckstart ~]# mkdir  /var/lib/tftpboot/pxelinux.cfg  ==》创建一个pxelinux.cfg目录,存放客户端的配置文件

[root@kisckstart ~]# cp /var/www/html/centos-6.9/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default

3.6.2 半自动安装

3.6.2.1 新建一个虚拟机然后开机

image.png

3.6.2.2 然后选择第一项

image.png

3.6.2.3 选择英语

image.png

3.6.2.5 选择美式英语

image.png

3.6.2.6 选择URL安装

image.png

3.6.2.7 禁用IPv6

image.png

3.6.2.8 输入http地址

image.png

3.6.2.9 最后和U盘或光盘安装的步骤一样

image.png

3.6.3 创建ks.cfg文件

3.6.3.1 生成配置文件的方式

【法1

       每安装好一台Centos机器,Centos就会创建一个名字为anaconda-ks.cfgkickstart文件,位于/root目录下面,记录你的真实安装配置,如果希望实现和某系统类似的安装,可以基于该系统的kickstart配置文件来生成你自己的kickstart配置文件

【法2

       阅读kickstart配置文件手册,用文本编辑器就可以创建属于自己的kickstart文件

【法3

Centos提供了一个图形化的kickstart配置工具。在任何一个安装好的Linux系统上运行该工具,就可以很容易地创建你自己的kickstart配置文件。kickstart配置工具命令为redhat-config-kickstartRHEL3)或system-config-kickstartRHEL4RHEL5.网上有很多用CentOS桌面版生成ks文件的文章,如果有现成的系统就没什么可说。但没有现成的,也没有必要去用桌面版,命令行也很简单

3.6.3.2 编写ks.cfg文件

mkdir -p /var/www/html/ks_config

cat /var/www/html/ks_config/CentOS-6.9-ks.cfg

#Kickstart Configurator for CentOS 6.9 by liuzhonghhe

install

url --url="http://172.16.1.200/centos-6.9"

text

lang en_US.UTF-8

keyboard us

zerombr

bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"

network --bootproto=dhcp --device=eth0 --onboot=yes --noipv6 --hostname=Centos6

timezone -utc Asia/Shanghai

authconfig --enableshadow --passalgo=sha512

rootpw --iscrypted $6$4/LtE7Epu9PGKS7B$FkjCppxcjDxfYJ6RAFU52W0JzPWYDjQmyt2sa8lydljECLrhGH6YwtKBNQtXqF59bDs2CSfSiFPLEzgy2EfPz0

clearpart --all --initlabel

part /boot --fstype=ext4 --asprimary --size=200

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://172.16.1.200/ks_config/optimization.sh &>/dev/null

/bin/sh /tmp/optimization.sh

%end

3.6.3.3 开机优化脚本

vim  /var/www/html/ks_config/optimization.sh

cat   /var/www/html/ks_config/optimization.sh

#!/bin/bash

##############################################################

# File Name: /var/www/html/ks_config/optimization.sh

# Version: V1.0

# Author: Liu Zhonghe

# Description: Linux system initialization

##############################################################

. /etc/init.d/functions

Ip=172.16.1.200

Port=80

ConfigDir=ks_config

# Judge Http server is ok?

PortNum=`nmap $Ip  -p $Port 2>/dev/null|grep open|wc -l`

[ $PortNum -lt 1 ] && {

        echo "Http server is bad!"

        exit 1

}

# Defined result function

function Msg(){

        if [ $? -eq 0 ];then

          action "$1" /bin/true

        else

          action "$1" /bin/false

        fi

}

# Defined IP function

function ConfigIP(){

        Suffix=`ifconfig eth1|awk -F "[ .]+" 'NR==2 {print $6}'`

        cat >/etc/sysconfig/network-scripts/ifcfg-eth1 <<-END

        DEVICE=eth1

        TYPE=Ethernet

        ONBOOT=yes

        NM_CONTROLLED=yes

        BOOTPROTO=none

        IPADDR=172.16.1.$Suffix

        PREFIX=24

        GATEWAY=172.16.1.61

        DNS1=10.0.0.2

        DEFROUTE=yes

        IPV4_FAILURE_FATAL=yes

        IPV6INIT=no

        NAME="System eth1"

        END

        Msg "config eth1"

}

# Defined Yum source Functions

function yum(){

        YumDir=/etc/yum.repos.d

        [ -f "$YumDir/CentOS-Base.repo" ] && cp $YumDir/CentOS-Base.repo{,.ori}

        wget -O $YumDir/CentOS-Base.repo http://$Ip:$Port/$ConfigDir/CentOS-Base.repo &>/dev/null &&\

        wget -O $YumDir/epel.repo http://$Ip:$Port/$ConfigDir/epel.repo &>/dev/null &&\

        Msg "YUM source"

}

# Defined Hide the system version number Functions

function HideVersion(){

        [ -f "/etc/issue" ] && >/etc/issue

        Msg "Hide issue"

        [ -f "/etc/issue.net" ] && > /etc/issue.net

        Msg "Hide issue.net"

}

# Defined OPEN FILES Functions

function openfiles(){

        [ -f "/etc/security/limits.conf" ] && {

        echo '*  -  nofile  65535' >> /etc/security/limits.conf

        Msg "open files"

        }

}

# Defined Kernel parameters Functions

function kernel(){

        KernelDir=/etc

        [ -f "$KernelDir/sysctl.conf" ] && /bin/mv $KernelDir/sysctl.conf{,.ori}

        wget -O $KernelDir/sysctl.conf http://$Ip:$Port/$ConfigDir/sysctl.conf &>/dev/null

        Msg "Kernel config"

}

# Defined System Startup Services Functions

function boot(){

        for oldboy in `chkconfig --list|grep "3:on"|awk '{print $1}'|grep -vE "crond|network|rsyslog|sshd|sysstat"`

          do

           chkconfig $oldboy off

        done

        Msg "BOOT config"

}

# Defined Time Synchronization Functions

function Time(){

        echo "#time sync by zhangyao at $(date +%F)" >>/var/spool/cron/root

        echo '*/5 * * * * /usr/sbin/ntpdate time.nist.gov &>/dev/null' >>/var/spool/cron/root

        Msg "Time Synchronization"

}

# Defined main Functions

function main(){

        ConfigIP

        yum

        HideVersion

        openfiles

        kernel

        boot

        Time

}

main

 

default ks

prompt 0

label ks

kernel vmlinuz

append initrd=initrd.img ks=http://172.16.1.200/ks_config/CentOS-6.7-ks.cfg ksdevice=eth1

3.6.3.4  整合配置文件

vim /var/lib/tftpboot/pxelinux.cfg/default

default ks

prompt 0

label ks

kernel vmlinuz

append initrd=initrd.img ks=http://172.16.1.200/ks_config/CentOS-6.7-ks.cfg ksdevice=eth1

3.6.4 无人值守自动安装

过程截图

image.png

image.png

4 ks.cfg文件详解

4.1 Centos6官方参考文档

https://access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-kickstart2-options.html 

4.2 ks.cfg文件可以分为3

q  命令段

用来配置键盘类型、语言、安装方式等系统的配置,有必选项和可选项,若缺少必须项,在安装的过程中会暂定,需手动指定

q  软件包段

²  %packages

²  @groupname:指定安装的包组

²  package_name:指定安装的包

²  -package_name:指定不安装的包

q  脚本段

²  %pre:安装系统前执行的命令或脚本(由于只依赖于启动镜像,支持的命令很少)

²  %post:安装系统后执行的命令或脚本(基本支持所有命令)

4.3 详细解释

关键字

含义

install

告知安装程序,这是一次全新安装,而不是升级upgrade

url --url=" "

通过FTPHTTP从远程服务器上的安装树中安装。
  url --url="http://172.16.1.200/centOS-6.7/"
  url --url ftp://<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   rhgb quiet"
  --location=,指定引导记录被写入的位置.有效的值如下:mbr(缺省),partition(在包含内核的分区的第一个扇区安装引导装载程序)none(不安装引导装载程序)
  --driveorder,指定在BIOS引导顺序中居首的驱动器。
  --append=,指定内核参数.要指定多个参数,使用空格分隔它们。

network

为通过网络的kickstart安装以及所安装的系统配置联网信息。
  network --bootproto=dhcp --device=eth0 --onboot=yes --noipv6   --hostname=CentOS6
  --bootproto=[dhcp/bootp/static]中的一种,缺省值是dhcpbootpdhcp被认为是相同的。
  static方法要求在kickstart文件里输入所有的网络信息。
  network --bootproto=static --ip=10.0.0.200 --netmask=255.255.255.0   --gateway=10.0.0.2 --nameserver=10.0.0.2
  请注意所有配置信息都必须在一行上指定,不能使用反斜线来换行。
  --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,swapvfat
  --asprimary,强迫把分区分配为主分区,否则提示分区失败。
  --size=,MB为单位的分区最小值.在此处指定一个整数值,500.不要在数字后面加MB
  --grow,告诉分区使用所有可用空间(若有),或使用设置的最大值。

firstboot

负责协助配置redhat一些重要的信息。
  firstboot --disable

selinux

关闭selinuxselinux --disabled

firewall

关闭防火墙。firewall   --disabled

logging

设置日志级别。logging   --level=info

reboot

设定安装完成后重启,此选项必须存在,不然kickstart显示一条消息,并等待用户按任意键后才重新引导,也可以选择halt关机