本文转自http://blog.51cto.com/itwish/2154820
工作环境中,想要安装Linux但是计算机没有光驱,或者是有大批量的计算机需要同时安装Linux,就需要通过部署环境PXE+DHCP+TFTP+HTTP+kickstart 方式来实现了 。
PXE协议详解:
PXE,预启动执行环境(Preboot eXecution Environment,PXE,也被称为预执行环境)提供了一种使用网络接口(Network Interface)启动计算机的机制。这种机制让计算机的启动可以不依赖本地数据存储设备(如硬盘)或本地已安装的操作系统。
PXE(Pre-boot Execution Environment)是由Intel设计的协议,它可以使计算机通过网络启动。协议分为client和server两端,支持工作站通过网络从远端服务器下载映像,并由此支持来自网络的操作系统的启动过程,其启动过程中,终端要求服务器分配IP地址,再用TFTP(trivial file transfer protocol)或MTFTP(multicast trivial file transfer protocol)协议下载一个启动软件包到本机内存中并执行,由这个启动软件包完成终端基本软件设置,从而引导预先安装在服务器中的终端操作系统。
PXE工作原理:
1.PXE client从自己的PXE网卡启动,向本网络中的DHCP服务器请求ip地址
2.DHCP服务器收到dhcp请求后,分配dhcp地址池中ip给PXE client
3.PXE client向本网络中的TFTP服务器索取bootstarp文件
4.PXE client取得bootstarp文件后之执行pxelinux.0文件引导,使用pxelinux环境来引导os安装程序。
5.PXE client然后读取pxelinux.cfg文件夹中的default(isolinux.cfg)引导文件,通过TFTP服务器加载内核vmlinuz和根文件系统(boot.msg,vesamenu.c32,initrd.img,splash.jpg),通过http服务器加载ks.cfg引导文件。
6.启动linux内核完成安装
在上图中,PXE client是需要安装Linux的计算机,TFTP Server和DHCP Server运行部署在在PXE Server端。Bootstrap文件、配置文件、Linux内核以及Linux根文件系统都放置在Linux Server上TFTP服务器的根目录下。
PXE必要条件:
1、pxe client必须支持pxe用户端功能,并且开机时选择网络启动,这样系统才能以网络的方式进入pxe启动程序
2、pxe服务器必须至少提供DHCP及TFTP的服务才行,且其中
DHCP服务器必须能够除未pxe client分配ip地址外,还需告知tftp所在的位置(即pxelinux.0的文件位置)
TFTP服务器则为pxe client 提供bootloader 及 kernel 等重要文件下载服务
3、使用NFS/HTTP/FTP之一的服务器提供pxe client所需程序及软件来源等通讯协议
PXE工作流程图:
PXE安装DHCP
动态主机设置协议(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来定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
[root@PXE pxelinux.cfg]
# vi /etc/dhcp/dhcpd.conf
# dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#
# option definitions common to all supported networks...
option domain-name
"itwish.cn"
;
# 全局定义域名
option domain-name-servers 192.168.4.150 ;
# 全局定义dns 地址
default
-lease-time 600;
# 全局定义默认租约期限
max-lease-time 7200;
# 全局定义最长租约期限
log-facility local7;
# 文件属性
subnet NETWORK_ADDR netmask NETMASK {
# 定义子网
range 10.254.239.10 10.254.239.20;
# 分配地址池
option routers dns1;
option domain-name-servers ns.itwish.cn;
option domain-name
"internal.example.org"
;
default
-lease-time 600;
max-lease-time 7200;
range dynamic-bootp 10.254.239.40 10.254.239.60;
# 定义bootp
option broadcast-address 10.254.239.31;
# 广播地址
next-server 192.168.4.100;
# tftp服务器地址
filename
"pxelinux.0"
;
# 告诉TFTP目录下的bootstarp文件
}
host passacaglia {
# 主机定义
hardware ethernet 0:0:c0:5d:bd:95;
# 物理地址
filename
"vmunix.passacaglia"
;
server-name
"toccata.fugue.com"
;
fixed-address ip;
# 固定地址
}
|
-
安装DHCP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
[root@PXE ~]
# yum install dhcp # 安装dhcp server
[root@PXE ~]
# rpm -ql dhcp
/etc/dhcp
/etc/dhcp/dhcpd.conf
# dhcpd配置文件
/etc/rc.d/init.d/dhcpd
# dhcpd启动文件
/usr/sbin/dhcpd
# 启动脚本配置文件
[root@PXE pxelinux.cfg]
# vi /etc/dhcp/dhcpd.conf # 调整配置文件
# dhcpd.conf
#
option domain-name
"itwish.cn"
;
option domain-name-servers 192.168.4.150 ;
default
-lease-time 600;
max-lease-time 7200;
log-facility local7;
subnet 192.168.4.0 netmask 255.255.255.0 {
# 定义子网
range 192.168.4.10 192.168.4.100;
option routers 192.168.4.1;
next-server 192.168.4.150;
# 注:添加 tftp服务器地址
filename=
"pxelinux.0"
;
#注:告诉TFTP目录下的bootstarp文件
}
#注:配置文件中以";" 号结尾 ,且需添加next-server 和filename 项
|
-
启动dhcp并验证dhcpd进程是否处于监听状态:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@PXE ~]
# chkconfig --add dhcpd
[root@PXE ~]
# chkconfig dhcpd on
[root@PXE ~]
# service dhcpd start
Starting dhcpd: [ OK ]
[root@PXE ~]
# 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@PXE ~]
# ss -tunl | grep 67
udp UNCONN 0 0 *:67 *:*
|
PXE 安装 TFTP
简单文件传输协议也称小型文件传输协议(Trivial File Transfer Protocol, TFTP),工作在UDP/69 端口,是一种于1981年在RFC 783中定义的简化的文件传输协议(FTP)。
瞬时(非独立)守护进程:他们无需定义在运行级别下,只需要一次性的定义xinetd的运行级别
xinetd——为那些极少接受用户请求的服务,专门提供监听功能,如 监听tftpd进程
独立(standlone)守护进程 :能自我管理,无须xinet 提供监听服务的进程
-
安装TFTP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
[root@PXE ~]
# yum install xinetd tftp-server
[root@PXE ~]
# rpm -ql tftp-server
/etc/xinetd.d/tftp
# 配置文件路径
/
var
/lib/tftpboot
# 默认tftp存储目录
[root@PXE ~]
# 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@PXE ~]
# chkconfig xinetd on
[root@PXE ~]
# chkconfig tftp on
[root@PXE ~]
# service xinetd start
Starting xinetd:
[root@PXE ~]
# ss -tunl | grep 69
udp UNCONN 0 0 *:69 *:*
|
-
使用 syslinux 提供的bootstart :
1
2
3
4
5
6
7
8
9
10
|
[root@PXE ~]
# yum install syslinux
[root@PXE ~]
# rpm -ql syslinux
/usr/share/syslinux
# pxelinux.0 文件存储目录
[root@PXE ~]
# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
# 复制pxelinux.0到 /var/lib/tftpboot 目录
[root@PXE boot]
# mount /dev/cdrom /media/ # 挂载光盘
mount: block device /dev/sr0 is write-protected, mounting read-only
|
-
配置pxelinux.cfg 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[root@PXE ~]
# mkdir /var/lib/tftpboot/pxelinux.cfg # 创建pxelinux.cfg 文件夹
[root@PXE ~]
# cp isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
# 把isolinux.cfg引导文件拷贝到tftpd存储目录下的pxelinux.cfg文件中,并命名为default
[root@PXE ~]
# 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.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.4.150/ks.cfg
# 核心参数,指定initrd 核心文件,该文件需要拷贝到tftp存储目录中。另指定ks文件目录,这儿使用的http协议
|
-
把内核及根文件拷贝到tftpd存储目录 :参照上菜单配置信息,包括 vesamenu.c32,boot.msg,splash.jpg,vmlinuz,initrd.img 文件做拷贝
1
2
3
|
[root@PXE ~]
# cp /media/images/pxeboot/{initrd.img,vmlinuz} /var/lib/tftpboot/
[root@PXE ~]
# cp /media/isolinux/{boot.msg,vesamenu.c32,splash.jpg} /var/lib/tftpboot/
|
linux PXE环境HTTPD部署
创建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安装:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
[root@PXE ~]
# yum install httpd
[root@PXE ~]
# rpm -ql httpd
/etc/httpd
/etc/httpd/conf/httpd.conf
# httpd 配置文件
/
var
/www/html
# httpd 默认存储目录
[root@PXE ~]
# chkconfig httpd on
[root@PXE ~]
# service httpd start
Starting httpd:
[root@PXE ~]
# ss -tunl |grep 80
tcp LISTEN 0 128 :::80 :::*
[root@PXE ~]
# 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 /media/* /var/www/html/centos/os/ # 拷贝安装系统
[root@PXE os]
# grub-crypt # 密码加密,使用grub-crypt 默认512位加密方式
Password:
Retype password:
$6$DnceMH60Kiu8TaME$ySd/QOpPtEcLnnoW36bDjb59xr1eJHGUwTTV/4MHoojT.RoXXdsLHMWJXcLCETQNRF2xITSqKHAAUNZq6df0i/
|
-
以/root/anaconda.cfg 为模板,配置ks.cfg文件 ,配置repo url 和 ks.cfg 。
ks引用格式如下图
针对集群的计算节点设置的,比如设置用户信息、关闭防火墙等,请根据自己需要定制,kickstart文件说明参见:https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/6/html/installation_guide/s1-kickstart2-options
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
[root@PXE ~]
# vi /var/www/html/ks.cfg # 调整配置文件
# Kickstart file automatically generated by anaconda.
#version=DEVEL
install
# 命令段 ,安装
url --url=http:
//192.168.4.150/centos/os/ # 指定网络url安装目录
lang en_US.UTF-8
# 默认字体
keyboard us
# 键盘类型
network --onboot yes --device eth0 --bootproto dhcp --noipv6
# 指定开机自启,网络接口eth0 ,dhcp获取网络地址,ipv6 禁用
rootpw --iscrypted $6$ZOGP2tA0PI/6SI/X$MlC5bJyXfP9TBN5/0vwoc6dqAqIijOQthEbAZUnIXft85Tj9n4sKWB2PfxrsVfkZ2ibqX63apu8ElmdEvBo9o/
# root 加密密码,使用grub-crypt 生成的字符串替代
reboot
# 配置完毕后,重启内核
firewall --disabled
# 防火墙禁用
authconfig --enableshadow --passalgo=sha512
# 登录身份使用 sha1 的 512bits 加密算法
selinux --disabled
# selinux 功能禁用
timezone 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 --all
# 清除磁盘分区表
text
# 纯文本格式安装显示
zerombr
# 对磁盘进行初始化
part /boot --fstype=ext4 --asprimary --size=2000
# 分区信息 ,定义boot分区 ,格式为ext4 ,大小为2G
part swap --size=4096
# 分区信息 ,定义swap分区 ,大小为4G
part pv.008003 --size=80000
# 分区信息 ,定义lv分区 pv.008003,大小为80G
volgroup vg0 --pesize=8192 pv.008003
# 分区信息 ,在lv分区pv.008003定义vg0卷组 ,pe大小为8M
logvol / --fstype=ext4 --name=root --vgname=vg0 --size=15000
logvol /usr --fstype=ext4 --name=/usr --vgname=vg0 --size=30000
logvol /
var
--fstype=ext4 --name=/
var
--vgname=vg0 --size=20000
logvol /home --fstype=ext4 --name=/home --vgname=vg0 --size=12000
repo --name=
"CentOS-6.6"
--baseurl=http:
//192.168.4.150/centos/os/ --cost=100
# 定义yum仓库 ,类别为bashurl ,名称为CentOS-6.6
%packages
# 包组段,安装包组及程序包
@core
@server-policy
@workstation-policy
%end
[root@PXE ~]
# yum -y install pykickstart #安装ksvalidator 软件
[root@PXE ~]
# ksvalidator /var/www/html/ks.cfg # ksvalidator验证ks.cfg语法是否正确
|
-
ks.cfg及repo验证:
注:ks.cfg若不能正常打开,确认是否有读权限
注: 若不能显示以上连接方式,确认httpd配置文件中,是否开启相关选项。
至此,PXE服务器环境部署完成,出现问题时,一般需要查看系统日志,如:/var/log/messages, 通过日志报错信息进行解决 。
centos PXE环境测试,安装,启动
部署环境:vmware 虚拟机
PXE服务器: PXE, ip :192.168.4.150
PXE client : vm
实验:
一、配置PXE client 客户端 ,网络需与PXE服务器处于同一网段 192.168.4.150 /24
二、选择开机启动顺序,选择"Network boot from Intel E1000"
三、pxe client获取dhcp地址后 ,获取pxelinux.cfg中配置文件
四、加载内核和根文件系统
五、安装networkmanager ,创建磁盘分区
六、检查包依赖关系,并安装程序。
七、完成安装,重启 ,进入登录界面
至此,pxe 服务器端 部署完成 ,并成功自动化安装pxeclient 端 。