PXE+DHCP+Apache+KickStart 无人值守安装 CentOS

PXE+DHCP+Apache+KickStart 无人值守安装 CentOS

本文介绍通过PXE和相应的服务自动化安装 Linux 系统的原理。然后通过一个实验演示如何通过网络自动化安装 CentOS6 和 CentOS7 系统。


一、原理介绍

1. PXE介绍

PXE(Pre-boot Execution Environment)是由Intel设计的协议,协议分为Client和Server端,PXE-Client存于网卡的ROM中,当计算机引导时,BIOS将PXE-Client调入内存中执行。
要通过网络安装操作系统:首先PXE-Client得获取IP地址,其次得从PXE服务端下载引导程序(bootstrap),内核,虚拟内存磁盘文件,启动菜单配置文件等资料。通过以下方式解决这两个问题

  • 网络中有DHCP服务器,PXE-Client自动向DHCP服务器请求IP地址
  • 网络中有TFTP服务器,PXE-Client中集成了tftp客户端,可以通过TFTP服务获取所需的资料

如下图示所示通过PXE引导安装系统的流程:

由上面的流程可知,通过PXE引导安装系统需有以下服务的支持方可

  • DHCP服务,用于给PXE客户端(即安装系统的主机)分配地址,告知引导安装程序的位置。
  • TFTP服务,用于传送引导安装程序,内核,虚拟磁盘文件,启动菜单文件等给PXE客户端
  • HTTP/NFS/FTP 服务中的任意一种,用于传送yum源给PXE客户端

下面我们简要介绍PXE引导安装系统必不可少的两个服务 DHCP 和 TFTP

2. DHCP介绍

DHCP (Dynamic Host Configuration Protocol) 用于给内部网络分配地址(包括IP,域名,域名服务器地址等),DHCP 分配地址是通过广播完成的,也就是 DHCP 通常是给同一网段内的主机分配地址,若要跨网段分配地址,则需使用用中继代理之类的方式方可。

DHCP客户端获取动态地址的过程如下

DHCP客户端的网卡若设置了通过 DHCP 服务获取动态地址,当网络服务启动时,客户端会向本网段网络中发送广播,请求IP地址。当本网段网络中的DHPC服务器(也可能是中继代理服务器) 收到该请求后,会从自己的地址池中找一个新的IP地址分配给客户端。当客户端收到DHCP服务器分配的地址后,会向网络中发送广播,询问是否有其它主机也有该IP地址,防止IP地址冲突。若该IP地址已被网络中的主机使用,则DHCP客户端会向DHCP服务器重新申请其它IP地址。如此重复,直到获取一个唯一的IP地址。然后客户端回复一个消息告知服务器接受分配的地址,服务端也向客户端回复确认信息。

DHCP端口

  • 服务器 UDP 67
  • 客户端 UPD 68

3. TFTP介绍

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

TFTP 端口为 UDP 69


二、安装、配置、启动相应服务

1. 服务器搭建规划

我们按下图所示配置一台PXE服务器,服务器地址为 192.168.8.8,服务器上安装DHCP、TFTP、HTTP服务。

服务器使用的是 CentOS6 系统

Alt text

关闭防火墙和SELinux

# 关闭防火墙,开机不启动
[root@zhubiao ~]# chkconfig iptables off
[root@zhubiao ~]# service iptables stop
# 关闭SELinux,开机不启动
[root@zhubiao ~]# sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
[root@zhubiao ~]# setenforce 0

2. DHCP

安装dhcp

yum -y install dhcp

配置dhcp配置文件
dhcp配置文件路径 /etc/dhcp/dhcpd.conf,该文件是空的,我们可以参照模板文件 /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample 进行配置

# 配置DHCP配置文件
[root@zhubiao ~]# cat /etc/dhcp/dhcpd.conf
# subnet declaration
subnet 192.168.8.0 netmask 255.255.255.0 {
range 192.168.8.100 192.168.8.200; <=地址分配范围(必填)
option routers 192.168.8.1; <=分配的网关
option domain-name "zhubiaook.com"; <=域名
option domain-name-servers 8.8.8.8; <=域名服务器地址
filename "pxelinux.0"; <=PXE引导安装程序的文件名(必填)
next-server 192.168.8.8; <=TFTP服务器的地址(pxelinux.0等文件的位置,必填)
default-lease-time 600; <=默认最长租期
max-lease-time 7200; <=客户端主动请求的最长租期
}
# CentOS6 上可以使用 service dhcpd configtest 检查配置文件语法是否正确
[root@zhubiao ~]# service dhcpd configtest
Syntax: OK

启动DHCP服务
启动 DHCP 服务,并开机就启动

[root@zhubiao ~]# service dhcpd start
Starting dhcpd: [ OK ]
[root@zhubiao ~]# chkconfig dhcpd on

测试DHCP服务
找一台同网段的客户机,将网卡设置为通过dhcp服务获取IP地址,测试是否能自动获取IP地址。

3. HTTP

安装httpd服务

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

修改httpd配置文件
我们可以按照自己的规划修改httpd服务的根目录,此处修改为 /var/www

[root@zhubiao ~]# cat /etc/httpd/conf/httpd.conf | grep '^DocumentRoot '
DocumentRoot "/var/www"

启动httpd服务
启动httpd服务,并设置为开机启动

[root@zhubiao ~]# service httpd start
[root@zhubiao ~]# chkconfig httpd on

测试
我们新建一个简单的html网页,通过其它主机测试是否能够访问该网页

# 新建一个主页
[root@zhubiao ~]# echo "blog.zhubiaook.com" > /var/www/index.html

使用其它主机访问该主页

[root@7 network-scripts]# curl http://192.168.8.8/
blog.zhubiaook.com

4. TFTP

安装tftp-server

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

启动tftp服务
启动 tftp-server,并设置开机启动
由于tftp在 CentOS6 上是一个非独立服务,依赖于xinetd守护进程,所以需将xinetd也启动。

[root@zhubiao ~]# chkconfig tftp on
[root@zhubiao ~]# service xinetd start
Starting xinetd:
[root@zhubiao ~]# chkconfig xinetd on

测试tftp服务
tftp服务安装好后,默认文件存放目录 /var/lib/tftpboot

# tftp服务器上新建测试文件
[root@zhubiao ~]# echo 'TFTP-SERVER, you are successful!!!' > /var/lib/tftpboot/text

找一台客户端测试是否能够下载tftp服务器上的文件

[root@7 network-scripts]# tftp 192.168.8.8
tftp> get text
tftp> quit
[root@7 network-scripts]# cat text
TFTP-SERVER, you are successful!!!

三、准备yum源

我们通过 httpd 服务传送安装包,将yum源复制到httpd服务目录下。

/var/www/
├── centos6 从centos6光盘中复制,重建repodata
├── centos7 从centos7光盘中复制,重建repodata
└── ksdir

按照上图的目录结构准备yum源

# 创建两个目录存放CentOS6 和 CentOS7 yum 源
[root@zhubiao ~]# mkdir /var/www/centos{6,7}
[root@zhubiao ~]# lsblk /dev/{sr0,sr1}
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 3.7G 0 rom
sr1 11:1 1 3.7G 0 rom
# 此处为了省略复制的时间,将光盘直接挂载到对应目录下,实际生产过程中,应该复制到对应目录下,并重建repodata.
# 将CentOS6 和 CentOS7 的光盘挂载到对应的目录下
[root@zhubiao ~]# mount /dev/sr0 /var/www/centos6
mount: block device /dev/sr0 is write-protected, mounting read-only
[root@zhubiao ~]# mount /dev/sr1 /var/www/centos7
mount: block device /dev/sr1 is write-protected, mounting read-only

四、准备PXE相关文件

根据上面介绍的 PXE 引导安装流程,我们需将PXE 引导安装文件 pxelinux.0 及与版本相关的内核文件,启动菜单文件,虚拟磁盘文件放到 tftp 服务器目录下。我们此处准备的文件同时能安装CentOS6 和 CentOS7 系统,目录结构如下所示:

/var/lib/tftpboot/
├── centos6
│ ├── initrd.img 从centos6光盘isolinux/initrd.img中复制
│ └── vmlinuz 从centos6光盘isolinux/vmlinuz中复制
├── centos7
│ ├── initrd.img 从centos7光盘isolinux/initrd.img中复制
│ └── vmlinuz 从centos7光盘isolinux/vmlinuz中复制
├── menu.c32 从/usr/share/syslinux/menu.c32复制
├── pxelinux.0 从/usr/share/syslinux/pxelinux.0复制
└── pxelinux.cfg
└── default 创建安装菜单项 参照光盘isolinux/isolinux.cfg修改

/usr/share/syslinux/* 中的文件在CentOS6上是由syslinux-nonlinux 提供的,在CentOS7上由 syslinux 提供,首先安装该程序包

安装 syslinux-nonlinux

yum -y install syslinux-nonlinux

按上面的目录结构拷贝文件

# 创建目录centos6,centos7,pxelinux.cfg
[root@zhubiao ~]# mkdir /var/lib/tftpboot/{centos6,centos7,pxelinux.cfg}
# 复制 menu.c32,pxelinux.0
[root@zhubiao ~]# cp /usr/share/syslinux/{menu.c32,pxelinux.0} /var/lib/tftpboot/
# 复制 CentOS6 的 vmlinuz 和 initrd.img
[root@zhubiao ~]# cp /var/www/centos6/isolinux/{initrd.img,vmlinuz} /var/lib/tftpboot/centos6
# 复制 CentOS7 的 vmlinuz 和 initrd.img
[root@zhubiao ~]# cp /var/www/centos7/isolinux/{initrd.img,vmlinuz} /var/lib/tftpboot/centos7

创建安装启动菜单项,此处创建五个菜单项,分别为自动安装CentOS6 和 CentOS7,手动安装 CentOS6 和 CentOS7,从硬盘启动。

# 可以参照光盘中的 isolinux/isolinux.cfg 创建
[root@zhubiao ~]# cat /var/lib/tftpboot/pxelinux.cfg/default
default menu.c32
timeout 600
menu title PXE | CentOS Installation
label automatic6
menu label Automatic Install CentOS ^6 <=菜单项名称
kernel centos6/vmlinuz <=内核位置
append initrd=centos6/initrd.img ks=http://192.168.8.8/ksdir/ks6.cfg <=应答文件位置
label automatic7
menu label Automatic Install CentOS ^7
kernel centos7/vmlinuz
append initrd=centos7/initrd.img ks=http://192.168.8.8/ksdir/ks7.cfg
label manual6
menu label ^Manual Install CentOS 6
kernel centos6/vmlinuz
append initrd=centos6/initrd.img inst.repo=http://192.168.8.8/centos6 <=yum源位置
label manual7
menu label Manual ^Install CentOS 7
kernel centos7/vmlinuz
append initrd=centos7/initrd.img inst.repo=http://192.168.8.8/centos7
label local
menu default
menu label Boot from ^local drive
localboot 0xffff
menu end

五、准备应答文件

准备 CentOS6 和 CentOS7 的应答文件,将应答文件存放到 httpd 服务目录下

/var/www/ksdir/
├── ks6.cfg 通过system-config-kickstart创建
└── ks7.cfg 或参照/root/anaconda-ks.cfg修改
ksvalidator ks.cfg 检查ks文件语法

按照上面的目录结构准备应答文件,应答文件我们可以通过图形化工具 system-config-kickstart 按照向导一步步创建。也可以参照 root 家目录 /root/anaconda-ks.cfg 文件创建,anaconda-ks.cfg 文件是我们安装母机操作系统时生成的应答文件。此处CentOS6 和 CentOS7 需参照相应母机系统的进行创建。当然你也可以自己写一份。

# 创建ksdir目录存放应答文件
[root@zhubiao ~]# mkdir /var/www/ksdir

若使用图形化工具 system-config-kickstart 创建,首先安装该工具,然后在图形终端中启动该向导,根据向导一步步创建,最后将文件保存(点击 Fil e –> save)到相应目录中

[root@zhubiao ~]# yum -y install system-config-kickstart

Alt text
提示: CentOS7 系统将yum仓库的ID改为 development 才能选择到安装包

[root@7 ksdir]# cat /etc/yum.repos.d/local.repo
[development] <=一定要改为 development喔
name=local-repo
enabled=1
baseurl=file:///mnt/cd
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever


CentOS6 的应答文件

[root@zhubiao ~]# cat /var/www/ksdir/ks6.cfg
#platform=x86, AMD64, or Intel EM64T
#version=DEVEL
# Firewall configuration
firewall --disabled
# Install OS instead of upgrade
install
# Use network installation
url --url="http://192.168.8.8/centos6"
# Root password
rootpw --plaintext 123456
# System authorization information
auth --useshadow --passalgo=sha512
# Use text mode install
text
firstboot --disable
# System keyboard
keyboard us
# System language
lang en_US
# SELinux configuration
selinux --disabled
# Installation logging level
logging --level=info
# Reboot after installation
reboot
# System timezone
timezone Asia/Shanghai
# Network information
network --bootproto=dhcp --device=eth0 --onboot=on
# System bootloader configuration
bootloader --location=mbr
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart --all --initlabel
# Disk partitioning information
part /boot --fstype="ext4" --size=1024
part / --fstype="ext4" --size=20480
part swap --fstype="swap" --size=2048
part /app --fstype="ext4" --size=10240
%packages
@core
@server-policy
@workstation-policy
%end
%post
useradd zhubiao
echo 123456 | passwd --stdin zhubiao
%end


CentOS7 的应答文件

[root@zhubiao ~]# cat /var/www/ksdir/ks7.cfg
#platform=x86, AMD64, or Intel EM64T
#version=DEVEL
# Install OS instead of upgrade
install
# Keyboard layouts
keyboard 'us'
# Root password
rootpw --plaintext 123456
# Use network installation
url --url="http://192.168.8.8/centos7"
# System language
lang en_US
# Firewall configuration
firewall --disabled
# System authorization information
auth --useshadow --passalgo=sha512
# Use text mode install
text
firstboot --disable
# SELinux configuration
selinux --disabled
# Network information
network --bootproto=dhcp --device=ens33 --onboot=yes
# Reboot after installation
reboot
# System timezone
timezone Asia/Shanghai
# System bootloader configuration
bootloader --location=mbr
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart --all --initlabel
# Disk partitioning information
part /boot --fstype="xfs" --size=1048
part / --fstype="xfs" --size=20000
part swap --fstype="swap" --size=2048
part /app --fstype="xfs" --size=10240
%packages
@^minimal
@core
vim
%end
%post
useradd zhubiao
echo 123456 | passwd --stdin zhubiao
%end

注意: 应答文件的权限必须所有人都可读,否则。。。

[root@zhubiao ~]# ll /var/www/ksdir/
total 8
-rw-r--r--. 1 root root 1136 Aug 18 13:30 ks6.cfg
-rw-r--r--. 1 root root 1053 Aug 18 13:29 ks7.cfg

六、测试通过网络自动安装系统

准备工作

  1. 重启 PXE 服务器的 tftphttpd 服务,因为在这些服务的根目录下创建了许多文件,重启服务后才会生效。
  2. 关闭本网络中其它DHCP服务器,防止干扰。
  3. 准备一台支持PXE协议网卡的主机连接到网络中

测试
按下电源键,开机。自动获取IP地址

Alt text

进入 PXE 网络安装菜单选项界面

Alt text

选择要安装的系统,自动从PXE服务端下载相关文件进行系统的自动安装


–END–