作为中小公司的运维,经常会遇到一些机械式的重复工作。如何进行批量一次大批量部署服务器安装?方法: Kickstart (PXE+DHCP+TFTP+HTTP) 或 Cobbler
一、PXE简介
PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统,在启动过程中,终端要求服务器分配IP地址,再用TFTP(trivial file transfer protocol)或MTFTP(multicast trivial file transfer protocol)协议下载一个启动软件包到本机内存中执行,由这个启动软件包完成终端基本软件设置,从而引导预先安装在服务器中的终端操作系统。
进行 PXE 安装的必要条件是在要安装的计算机中必须包含一个 PXE 支持的网卡(NIC),即网卡中必须要有 PXE Client。PXE 协议可以使计算机通过网络启动。此协议分为 Client端和 Server 端,而PXE Client则在网卡的 ROM 中。当计算机引导时,BIOS 把 PXE Client 调入内存中执行,然后由 PXE Client 将放置在远端的文件通过网络下载到本地运行。运行 PXE 协议需要设置 DHCP 服务器和 TFTP 服务器。DHCP 服务器会给 PXE Client(将要安装系统的主机)分配一个 IP 地址,由于是给 PXE Client 分配 IP 地址,所以在配置 DHCP 服务器时需要增加相应的 PXE 设置。此外,在 PXE Client 的 ROM 中,已经存在了 TFTP Client,那么它就可以通过 TFTP 协议到 TFTP Server 上下载所需的文件了。
二、PXE工作过程
PXE client是需要安装Linux的计算机,TFTP Server、DHCP Server及HTTPD Server部署在在PXE Server端。Bootstrap文件、配置文件以及Linux根文件系统都放置在Linux Server上TFTP服务器的根目录下,而ks.cfg 及 系统内核部署在HTTPD server目录。
Kickstart是一种无人值守的安装方式。它的工作原理是在安装过程中记录典型的需要人工干预填写的各种参数,并生成一个名为ks.cfg的文件。如果在安装过程中(不只局限于生成Kickstart安装文件的机器)出现要填写参数的情况,安装程序首先会去查找Kickstart生成的文件,如果找到合适的参数,就采用所找到的参数;如果没有找到合适的参数,便需要安装者手工干预了。所以,如果Kickstart文件涵盖了安装过程中可能出现的所有需要填写的参数,那么安装者完全可以只告诉安装程序从何处取ks.cfg文件,然后就去忙自己的事情。等安装完毕,安装程序会根据ks.cfg中的设置重启系统,并结束安装。
PXE+Kickstart 无人值守安装操作系统完整过程如下
生成ks.cfg文件需要System-config-kickstart工具,而此工具依赖于X Windows,所以需要下载安装“X Window System”和“Desktop”并重启系统
#yum groupinstall “X Window System”
#yum groupinstall Desktop
#reboot
动态主机设置协议(Dynamic Host Configuration Protocol,DHCP)是一种使网络管理员能够集中管理和自动分配IP网络地址的通信协议,使用UDP协议工作,DHCP使用统一端口作为BOOTP:服务器端使用67/udp,客户端使用68/udp。主要有两个用途:用于内部网络或网络服务供应商自动分配IP地址给用户;用于内部网络管理员作为对所有电脑作中央管理的手段。
DHCP协议的工作流程:
客户端在局域网广播DHCPDISCOVER报文,请求获得ip地址、网关、dns地址 等信息;DHCP服务器收到DHCPDISCOVER报文后 ,发送DHCPOFFER 报文进行响应 ;客户端收到DHCPOFFER报文后,发送DHCPREQUEST 报文进行请求 ;最终DHCP 服务器发送 DHCPACK报文进行确认 。
DHCP配置文件dhcp.conf 分为4段:
1、DHCP属性段: log-facility 定义日志等级
2、全局属性段: 使用option 关键字定义
3、子网分配段: 使用subnet 来定义
4、主机配置段: 使用host来定义
[root@PXE ~]# yum install dhcp # 安装dhcp server
[root@ ~]# rpm -ql dhcp
/etc/dhcp
/etc/dhcp/dhcpd.conf # dhcpd配置文件
/etc/rc.d/init.d/dhcpd # dhcpd启动文件
/usr/sbin/dhcpd # 启动脚本配置文件
[root@ pxelinux.cfg]# vi /etc/dhcp/dhcpd.conf # 调整配置文件dhcpd.conf
option domain-name “shitan.cn”;
option domain-name-servers 192.168.31.55 ;
default-lease-time 600;
max-lease-time 7200;
log-facility local7;
subnet 192.168.31.0 netmask 255.255.255.0 { # 定义子网
range 192.168.31.10 192.168.31.200;
option routers 192.168.31.1;
next-server 192.168.31.55; # 注:添加 tftp服务器地址
filename=“pxelinux.0”; #注:告诉TFTP目录下的bootstarp文件
}
#注:配置文件中以";" 号结尾 ,且需添加next-server 和filename 项。pxelinux.0是一个bootloader,类似于grub,通过它来load kernel,我们可以在它的配置文件中指定内核的位置和内核的启动参数 安装及配置都在 /tftpboot 目录下操作
启动dhcp并验证dhcpd进程是否处于监听状态:
[root@~]# chkconfig --add dhcpd
[root@~]# chkconfig dhcpd on
[root@ ~]# service dhcpd start
Starting dhcpd: [ OK ]
[root@ ~]# ps aux | grep dhcpd # 验证dhcpd 启动
dhcpd 14087 0.0 0.1 48324 3572 ? Ss 03:13 0:00 /usr/sbin/dhcpd -user dhcpd -group dhcpd
root 14108 0.0 0.0 103272 840 pts/0 S+ 03:14 0:00 grep dhcpd
[root@~]# ss -tunl | grep 67
udp UNCONN 0 0 *:67 :
简单文件传输协议也称小型文件传输协议(Trivial File Transfer Protocol, TFTP),工作在UDP/69 端口,是一种于1981年在RFC 783中定义的简化的文件传输协议(FTP)。
瞬时(非独立)守护进程:他们无需定义在运行级别下,只需要一次性的定义xinetd的运行级别
xinetd——为那些极少接受用户请求的服务,专门提供监听功能,如 监听tftpd进程,独立(standlone)守护进程 :能自我管理,无须xinet 提供监听服务的进程
安装TFTP:
[root@ ~]# yum install xinetd tftp-server
[root@ ~]# rpm -ql tftp-server
/etc/xinetd.d/tftp # 配置文件路径
/var/lib/tftpboot # 默认tftp存储目录
[root@ ~]# vi /etc/xinetd.d/tftp
default: off
service tftp
{
disable = no # no 表明tftp处于启用状态 ,yes 表示tftp处于禁用状态
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot # 默认tftp存储目录
per_source = 11
cps = 100 2
flags = IPv4
}
[root@~]# chkconfig xinetd on
[root@ ~]# chkconfig tftp on
[root@ ~]# service xinetd start
Starting xinetd:
[root@ ~]# ss -tunl | grep 69
udp UNCONN 0 0 *:69 :
生成pxelinux.0文件
使用 syslinux 提供的bootstart :
[root@~]# yum install syslinux
[root@ ~]# rpm -ql syslinux
/usr/share/syslinux # pxelinux.0 文件存储目录
[root@ ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
#复制pxelinux.0到 /var/lib/tftpboot 目录
[root@ boot]# mount /dev/cdrom /media/ # 挂载光盘
mount: block device /dev/sr0 is write-protected, mounting read-only
配置pxelinux.cfg/default 文件,
pxelinux.cfg/default是pxelinux的配置文件
Pxelinux会以IP地址的16进制表示来搜索配置文件,如果没找到去除最低一位继续找。如果所有匹配都失败,就使用default文件。
举例来说:
192.168.0.15 16进制表示是 C0A8000F.
它会搜索下面的配置文件,最先找到的会被使用。
pxelinux.cfg/C0A8000F
pxelinux.cfg/C0A8000
pxelinux.cfg/C0A800
pxelinux.cfg/C0A80
pxelinux.cfg/C0A8
pxelinux.cfg/C0A
pxelinux.cfg/C0
pxelinux.cfg/C
pxelinux.cfg/default
我的default文件内容如下:
[root@ ~]# mkdir /var/lib/tftpboot/pxelinux.cfg # 创建pxelinux.cfg 文件夹
[root@ ~]# cp /media/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
#把isolinux.cfg引导文件拷贝到tftpd存储目录下的pxelinux.cfg文件中,并命名为default
[root@ ~]# vi /var/lib/tftpboot/pxelinux.cfg/default # 修改linux内核引导文件
default vesamenu.c32 # 默认启动界面,该文件需要拷贝到tftp存储目录中。
#prompt 1
timeout 600 # 倒计时 600就是60 秒,改数字为秒数的10倍
display boot.msg # 将额外信息写入到boot.msg文件中,该文件需要拷贝到tftp存储目录中。
menu background splash.jpg # 菜单背景图,该文件需要拷贝到tftp存储目录中。
menu title Welcome to CentOS 6! # 菜单主标题
label linux
menu label ^Install or upgrade an PXE system #菜单項目
menu default # 预设项目
kernel vmlinuz # 内核 vmlinuz,该文件需要拷贝到tftp存储目录中。
append initrd=initrd.img ks=http://192.168.31.55/ks.cfg
#核心参数,指定initrd 核心文件,该文件需要拷贝到tftp存储目录中。另指定ks文件目录,这儿使用的http协议
把内核及根文件拷贝到tftpd存储目录 :参照上菜单配置信息,包括 vesamenu.c32,boot.msg,splash.jpg,vmlinuz,initrd.img 文件做拷贝
[root@ ~]# cp /media/images/pxeboot/{initrd.img,vmlinuz} /var/lib/tftpboot/
[root@ ~]# cp /media/isolinux/{boot.msg,vesamenu.c32,splash.jpg} /var/lib/tftpboot/
创建kickstart文件方式:
1、复制模板 /root/anaconda-ks.cfg ,而后使用vim编辑配置
2、使用system-config-kickstart 来生成,建议也使用/root/anaconda-ks.cfg 作为模板来进行
# ksvalidator 查看ks文件语法是否正确
kickstat文件的组成部分 :
1、命令段: 用于配置系统 ,如:install ,firewall, part,lv 等
2、软件包段%packages;指定要安装的程序包组(@组包名)及程序包(程序包名),每行一个 ;在程序包之前加 “-”号,表示不希望安装
3、%pre %post脚本段:安装过程开始之前、后执行的安装预备式脚本
httpd安装:
[root@ ~]# yum install httpd
[root@ ~]# rpm -ql httpd
/etc/httpd
/etc/httpd/conf/httpd.conf # httpd 配置文件
/var/www/html # httpd 默认存储目录
[root@ ~]# chkconfig httpd on
[root@ ~]# service httpd start
Starting httpd:
[root@~]# ss -tunl |grep 80
tcp LISTEN 0 128 :::80 ::?
[root@ ~]# ps aux | grep httpd
root 1877 0.0 3.3 479948 20284 ? Ss 08:20 0:01 /usr/sbin/httpd
apache 2184 0.0 1.6 480084 9908 ? S 09:07 0:00 /usr/sbin/httpd
apache 2185 0.0 1.6 480084 9884 ? S 09:07 0:00 /usr/sbin/httpd
apache 2188 0.0 1.6 480084 9884 ? S 09:07 0:00 /usr/sbin/httpd
apache 2189 0.0 1.6 480084 9884 ? S 09:07 0:00 /usr/sbin/httpd
apache 2190 0.0 1.6 480084 9884 ? S 09:07 0:00 /usr/sbin/httpd
apache 2191 0.0 1.6 480084 9884 ? S 09:07 0:00 /usr/sbin/httpd
apache 2192 0.0 1.6 480084 9884 ? S 09:07 0:00 /usr/sbin/httpd
apache 2193 0.0 1.6 480084 9884 ? S 09:07 0:00 /usr/sbin/httpd
root 3116 0.0 0.1 103324 844 pts/0 S+ 19:48 0:00 grep httpd
[root@PXE ~]# cp /root/anaconda-ks.cfg /var/www/html/ks.cfg # 拷贝模板到/var/www/html 目录,并重命名为ks.cfg
[root@PXE ~]# chmod o+r /var/www/html/ks.cfg # 分配权限,为pxe client引导安装使用
[root@PXE isolinux]# cp -r /media/* /var/www/html/cdrom # 拷贝安装系统
或者mount dev/cdrom /var/www/html/cdrom
以/root/anaconda.cfg 为模板,配置ks.cfg文件
Kickstart file automatically generated by anaconda.
#version=DEVEL
install # 命令段 ,安装
url --url="http://192.168.31.55/cdrom" # 指定网络url安装目录
lang en_US.UTF-8 # 默认字体
keyboard us # 键盘类型
network --onboot yes --device eth0 --bootproto dhcp --noipv6
#指定开机自启,网络接口eth0 ,dhcp获取网络地址,ipv6 禁用
rootpw --iscrypted $6$zqF4QZHsgSfRDAgu$9pVdPkkG2ZrcTiCAyTP12hXixo.ILE7NMqgpDxkBNBOXe6sR7AUshq7Sig2nYizVz438Aq8ayjPlwoICbUV181
#root 加密密码,使用grub-crypt 生成的字符串替代
#reboot
firewall --disabled # 防火墙禁用
authconfig --enableshadow --passalgo=sha512# 登录身份使用 sha1 的 512bits 加密算法
selinux --disabled# selinux 功能禁用
timezone --utc Asia/Shanghai# 定义上海时区
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
#定义bootloader,grub安装mbr ,安装在sda磁盘
#The following is the partition information you requested
#Note that any partitions you deleted are not expressed
#here so unless you clear all partitions first, this is
#not guaranteed to work
#clearpart --none
clearpart --none --initlabel # 清除磁盘分区表
text # 纯文本格式安装显示
zerombr # 对磁盘进行初始化
part /boot --fstype=ext4 --asprimary --size=500
#part swap --grow --maxsize=1500 --asprimary --size=1500
#part / --fstype=ext4 --grow --asprimary --size=200
part / --fstype=ext4 --size=10240
part swap --size=1500
part /var --fstype=ext4 --grow --size=500
#分区规划
repo --name="CentOS" --baseurl="http://192.168.31.55/cdrom" --cost=100# 定义yum仓库 ,类别为bashurl ,名称为CentOS
reboot # 配置完毕后,重启内核
%packages
@base
@compat-libraries
@core
@debugging
@development
@server-policy
@workstation-policy
sgpio
device-mapper-persistent-data
systemtap-client
%end
新建虚拟机配置如图
选择启动方式选择"Network boot from Intel E1000"
pxe client获取dhcp地址后 ,获取pxelinux.cfg中配置文件
加载内核和根文件系统
安装networkmanager ,创建磁盘分区
检查包依赖关系,并安装程序。
完成安装,重启 ,进入登录界面
1.网卡上的pxe芯片存放了DHCP和TFTP客户端
2.启动计算机选择网卡启动
3.pxe上的DHCP客户端会向DHCP服务器申请IP地址
4.DHCP服务器分配给客户端IP地址的同时通过以下字段告诉pxe,tftp的地址和客户端要下载的文件
1.next-server 192.168.31.55; | |
---|---|
2.filename “pxelinux.0”; |
5.pxelinux.0告诉pxe要下载的配置文件是pxelinux.cfg目录下的default
6.pxe 下载并依据配置文件的内容下载启动必须的文件,并通过ks.cfg开始安装系统