PXE server的原理:
客启端PXE网卡启动-->
通过Bootp协议广播DHCP请求-->
DHCP服务器响应DHCP请求-->
客户端获取IP,TFTP服务器地址-->
客户端从TFTP上下载 pxelinux.0、系统内核文件vmlinuz、initrd.img-->
启动系统-->(到指定url去下载ks.cfg文件-->根据ks.cfg文件去NFS/HTTP/FTP服务器自动下载软件包)安装系统-->
完成安装。
主要使用的使用到的服务:
DHCP server,为客户端:1)分配IP地址;2)提供TFTP服务器地址;3)提供PXE启动文件位置;
TFTP server为客户端提供OS引导文件;
FTP server,用来发布linux系统的安装树(也可以使用NFS、HTTP或HTTPS)。
三个服务可以安装在同一台服务器上,也可以安装在三台服务器上。
硬件配置要求:
1)PXE客户端要求网卡具备PXE功能
软件配置要求:
1)以RHEL6.5系统为例,其它OS可能稍微有些不同。
2)为简单起见,假定PXE服务器端网卡地址为192.168.56.2
3)为简单起见,要求Firewall和SELinux要禁用
一、安装配置DHCP服务
1. 检查DHCP服务是否已经安装
rpm -qa | grep dhcp
2. 若没有安装,则需要使用rpm来安装dhcp组件
yum install dhcp
注:对于没有向Red Hat注册过的RHEL系统,该命令可能无法执行。在打入上述命令后,系统可能会显示以下提示:
This system is not registered with RHN
这是由于RHEL系统中的yum组件使用的是Red Hat负责提供官方升级和技术支持的软件安装源。这种官方升级和技术支持都是有偿的,所以需要注册。如果不想注册,可以将yum使用的缺省软件安装源替换成其它的地址。具体方法另述。
3. 安装了DHCP组件以后,需要手动编辑DHCP配置文件,这个步骤是很重要的。
vim /etc/dhcp/dhcpd.conf
注:其它系统的配置文件路径可能会稍有不同
下面是一个简单的DHCP子网配置的实例:
#
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp*/dhcpd.conf.sample
# see 'man 5 dhcpd.conf'
#
default-lease-time 21600;
max-lease-time 43200;
ddns-update-style none;
allow booting;
allow bootp;
subnet 192.168.56.0 netmask 255.255.255.0 {
range dynamic-bootp 192.168.56.10 192.168.56.80;
option routers 192.168.56.2;
option subnet-mask 255.255.255.0;
next-server 192.168.56.2;
filename "pxelinux.0";
}
注释:
1)注释中的第三行指明了一个很好的DHCP服务器配置的参考实例。在这个文件里可以看到各种配置选项的使用方法及说明。当然,也可以使用第五行中的命令来获取更多关于DHCP配置的帮助信息
2)default-lease-time和max-lease-time顾名思义,就是指DHCP client端的地址租借期限
3)ddns-update-style选项用于控制Dynamic DNS updating是否启用以及启用的方式。关于Dynamic DNS updating的原理另述。目前RHEL6.5中的DHCP服务实际上只支持两种模式:一种是禁用Dynamic DNS updating,另一种是Interim模式。Interim模式并不完全符合IETF标准,但却是RHEL6.5中的DHCP服务仅有的一种Dynamic DNS updating的模式因为另一种模式(ad-hoc模式)实际上已不支持。
4)allow booting指定DHCP服务器是否允许客户端在booting阶段查询host declaration
5)allow bootp指定DHCP服务器是否对bootp query做出响应
6)range dynamic-bootp,指定动态地址分配的区间。dynamic-bootp允许使用bootp协议的client端也获取动态地址
7)option routers指定提供路由器服务的主机地址
8)option subnet-mask指定当前地址池中的子网掩码
9)next-server指定主机启动文件从哪个地址的服务器上获取
10)filename指定了主机启动文件的名字。这个名字可以带相对路径。主机启动文件的根路径对应的实际本地路径是由TFTP服务的配置文件指定的。详情见下。
11)上述地址池中的缩进可以使用空格,也可以使用tab键
4. 启动DHCP后台服务程序(daemon)
/etc/init.d/dhcpd start
/etc/init.d/dhcpd restart
或者
service dhcpd start
service dhcpd restart
5. DHCP后台服务程序调试
[root@ws-rhel65 ~]# vim /var/log/messages
[root@ws-rhel65 ~]# ps -e | grep dhcp
DHCP 服务的默认日志不会输出到指定文件,而是和NFS 服务一样,输出到/var/log/messages 文件中,成了日志的大杂烩,不便于分辨,更不便于查找故障,一旦messages 文件遭到破坏,DHCP 日志也跟着受影响。
/var/lib/dhcp/db/dhcpd.leases 文件,它记录了客户机分配IP 的详细信息。每当发生租约变化的时候,都会在文件结尾添加新的租约记录。
如何将DHCP 的日志专门转储到特定文件中呢?下面介绍一种方法。
假设需要将日志记录在/var/log/目录下,则可以先用touch 命令创建一个dhcp.log 文件。
1)创建dhcp.log 文件
#touch /var/log/dhcp.log
#chmod 640 /var/log/dhcp.log
2)修改/etc/dhcp/dhcpd.conf 配置文件,添加“log-facility”参数并赋值为local4,内容如下:
log-facility local4;
3)在/etc/rsyslog.conf 文件中添加
local4.* /var/log/dhcp.log
将下面这条
*.info;mail.none;authpriv.none;cron.none /var/log/mesages
改为:
*.info;mail.none;authpriv.none;cron.none;local4.none /var/log/messages
目的是把消息传送到/var/log/messages 文件,而不再向local4 传送。
注意要把下面这行语句注销:
$ActionFileDefaultTemplate,RSYSLOG_TraditionalFileFormat
4)重启Rsyslog 和DHCP 服务
#service rsyslog restart
#service dhcpd restart
没生效!!
二、安装配置TFTP server
1. 检查TFTP服务是否已经安装
rpm -qa | grep tftp
2. 若没有安装,则需要使用rpm来安装tftp组件
yum install tftp-server
注意:这里已经要指定安装tftp-server,如果指定的是tftp则只安装TFTP client端应用程序
3. 安装了TFTP组件以后,需要手动编辑TFTP配置文件。
vim /etc/xinetd.d/tftp
以下是一个实例:
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /share/server/tftp/pxe_leg //这个可以自己修改
disable = no //将yes改成no是启用
per_source = 11
cps = 100 2
flags = IPv4
}
注解:
1)
4. 启动TFTP后台服务程序
service xinetd restart
/etc/init.d/xinetd start
5. TFTP后台服务程序调试
若PXE客户端能够连接TFTP服务器,但是报“Permission denied”错误,则可以考虑将SELinux禁用然后再试。
SELinux关闭的办法有两种,一种是永久有效的,即修改 /etc/selinux/config 文件中的 SELINUX="" 为 disabled ,然后重启。
第二种办法是即时生效的,但系统重启以后就会失效,即使用命令行:
setenforce 0
三、配置FTP服务
1. 确认FTP后台服务程序是否已经安装到系统中
rpm -qa | grep ftp
vsftpd-2.2.2-11.el6_4.1.x86_64
2. 若没有安装,就是用yum安装vsftpd软件包
yum install vsftpd
3. 编辑vsftpd的配置文件
vim /etc/vsftpd/vsftpd.conf
对于支持PXE的FTP服务器来讲,我们只需要确认Ensure anonymous_enable在vsftpd.conf文件中已经被设为YES
anonymous_enable=YES
4. 启动或重启vsftpd后台服务进程
service vsftpd restart
5. vsftpd后台服务程序调试
在启动vsftpd后台服务程序以后,可以在一个客户端尝试访问其服务器对应的IP地址。如果不能访问,可以尝试禁用RHEL6.5的防火墙
如果想知道vsftpd将FTP服务器的根目录设置在什么地方,可以使用以下命令:
cat /etc/passwd | grep ftp
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
四、复制与PXE启动和OS安装相关的文件
1. 首先,确认syslinux是否已经安装在系统中
rpm -qa | grep syslinux
若没有,需安装syslinux(从RHEL6.5的安装光盘上)
ll /mnt/cdrom/
mount /dev/cdrom /mnt/cdrom
yum install syslinux
2. 将PXE启动需要用到的文件复制到TFTP根目录下
cp /usr/share/syslinux/pxelinux.0 /share/server/tftp/pxe_leg/
cp /mnt/cdrom/images/pxeboot/{vmlinuz,initrd.img} /share/server/tftp/pxe_leg/
cp /mnt/cdrom/isolinux/{boot.msg,splash.jpg,vesamenu.c32} /share/server/tftp/pxe_leg/
mkdir /share/server/tftp/pxe_leg/pxelinux.cfg
cp /mnt/cdrom/isolinux/isolinux.cfg /share/server/tftp/pxe_leg/pxelinux.cfg/default
最后确认以下文件都成功复制到了目的文件夹
[root@ws-rhel65 pxe_leg]# ll /share/server/tftp/pxe_leg
total 38208
-r--r--r--. 1 root root 84 May 13 21:12 boot.msg
-r--r--r--. 1 root root 33383449 May 13 20:56 initrd.img
-r--r--r--. 1 root root 165080 May 13 21:29 memtest
-rw-r--r--. 1 root root 26828 May 13 19:48 pxelinux.0
drwxr-xr-x. 2 root root 4096 May 13 21:37 pxelinux.cfg
-r--r--r--. 1 root root 1236005 May 13 21:05 splash.jpg
-r--r--r--. 1 root root 162860 May 13 21:05 vesamenu.c32
-r-xr-xr-x. 1 root root 4128944 May 13 20:56 vmlinuz
注意:以上文件中vmlinuz和initrd.img是与PXE客户端的CPU架构相关的。比如:如果放在/share/server/tftp/pxe_leg/下面的是i686架构的启动文件,则其只有在PXE客户端的CPU也是i686时才能启动,如果PXE客户端的CPU是X86-64的,则无法启动。
3. 找到FTP服务的根目录(见上节提供的方法),然后将OS安装光盘(此处以RHEL6.5为例)中的所有文件复制到该目录下:
cd /var/ftp
mkdir pxe
cd pxe
mkdir rhel65
cd /mnt/cdrom
cp -r -v * /var/ftp/pxe/rhel65/
五、对PXE配置文件的更改
1. 运行命令:
vim /share/server/tftp/pxe_leg/pxelinux.cfg/default
并在文件中增加以下内容:
default vesamenu.c32
timeout 30
menu background splash.jpg
menu title Welcome to Red Hat Enterprise Linux 6.5 PXE server X86_64!
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
label linux
menu label ^ Install or upgrade RHEL 6.5 X86_64 to an existing system
kernel vmlinuz
append initrdinitrd=initrd.img ksdevice=eth0 repo=ftp://192.168.56.2/pxe/rhel65 ip=dhcp
label linux
menu label ^ Install CentOS-6.4-x86_64 use kisckstart file
menu default
kernel vmlinuz
append initrdinitrd=initrd.img ip=10.12.190.183 netmask=255.255.255.0 gateway=10.12.13.254 dns=202.106.0.20 ksdevice=eth0 ks=ftp://10.12.190.187/pub/ks.cfg
label rescue
menu label ^Rescue installed system
kernel vmlinuz
append initrdinitrd=initrd.img rescue ksdevice=eth0 repo=ftp://192.168.56.2/pxe/rhel65 ip=dhcp
label local
menu label Boot from ^local drive
localboot 0xffff
注:以上参数可以接在kernel后边,也可以接在initrd.img后边,都不影响。(EFI PXE中的参数只能加到kernel后边)
2. pxelinux.cfg/default文件中内容的注解:
ksdevice= 是为了指定使用哪块网卡,因为机器有多块网卡,无人值守会卡在这里。
repo= 是指定安装镜像的url,如果没有,就会提示要以下画面,那就需要手工处理了。
ip= 可以指定网卡自动获取ip,还是使用固定ip,如果使用固定ip,系统将把这个ip写入到配置文件中去。
ks= 是指定ks.cfg文件的url,ks.cfg是个应答文件,可以替我们处理所有安装时需要手工设置的内容,该文件可以直接编辑系统中的/home/anaconda-ks.cfg文件,或者在图形化下使用system-config-kickstart包来编辑一个,非常好用。
有的时候,可能需要手工来处里某一台机器,还要跑到那台机器前吗?当然不需要,安装的时候也可以使用vnc来远程操作的。机器不一样,用途也不一样,有的时候不能完全自动,也需要我们手工做些改动。
⑤允许远程访问安装系统
在另一个系统上显示图形或字符安装界面,这时就可以使用vnc服务,这是操作系统本身就支持的功能,vnc选项启动VNC服务,vncpassword选项用来设置一个远程访问的密码,VNC密码必须至少6个字符,不设置密码去掉vncpassword选项也可以。使用方法很简单,可以写在PXE的引导菜单中,添加在kernel或initrd.img后边,或是在出现菜单画面时,按Tab键,编辑某一行,在最后边加入vnc vncpassword=123456字段,或是按Esc键,在命令行里直接输入linux vnc vncpassword=123456就可以了,U盘安装,光盘装都有效。
假设远程机器ip是10.12.190.181.,被安装机器的ip是10.12.190.101
(1)正向连接方式:
- linux vnc ip=10.12.190.101 netmask=255.255.255.0 gateway=10.12.190.254 vncpassword=123456
指定被安装机器的ip是10.12.190.181 网关是10.12.190.254 掩码是24, vnc连接的密码是123456
由远程vnc客户端,连入被安装机器进行安装,之后的操作就和平时一样了。在安装系统上将显示如下信息:
![]()
vnc连接地址为10.12.190.101:1
(2)反向连接方式:
在远程启动vnc的被动连接:vncviewer.exe -listen,当客户端安装过程启动后,远程端的vnc会自动连接
- linux vnc vncconnect=10.12.190.181 vncpassword=123456
vnc会自动反向联接10.12.190.181,如果远程机器开启vnc监听,在10次超时15秒后,会变成主动方式连接,在安装系统上将显示如下信息:
以上2种方式,如果IP是DHCP自动获取的话,使用反向连接方式比较好,这样,无需知道安装系统的客户端获取的IP是多少,也可以建立连接。
⑥另一种安装菜单的写法:
- label linux
- menu label ^ Install or upgrade CentOS-6.4-x86_64 an existing system from to Network
- kernel /vmlinuz ksdevice=eth0 repo=ftp://10.12.190.187/pub/mirror ip=dhcp
- initrd /initrd.img
- label linux
- menu label ^ Install CentOS-6.4-x86_64 use kisckstart file
- menu default
- kernel /vmlinuz ip=10.12.190.183 netmask=255.255.255.0 gateway=10.12.13.254 dns=202.106.0.20 ksdevice=eth0 ks=ftp://10.12.190.187/pub/ks.cfg
- initrd /initrd.img
以上就是普通PXE安装系统的所有操作方法,现在就可以使用了。
对于使用UEFI来启动的机器来说,legacy PXE启动的方法已经完全无效了,根本无法顺利的安装系统。如果想顺利的安装系统,必须首先加载UEFI驱动才可以。
UEFI PXE和legacy PXE服务器的主要区别就在于TFTP server所提供的系统启动必须文件和DHCP server的设置, 所使用到的服务还是legacy PXE server那几个。
1、TFTP server的配置
配置文件与上边一样,只是目录中的文件要更换一下,这次要从系统盘中提取三个文件。
将光盘中的efiboot.img挂在到系统中
mount -o loop /mnt/cdrom/images/efiboot.img /mnt/efiboot
或者直接到/mnt/cdrom/EFI/BOOT/下面去复制
cp {BOOTX64.*,splash.xpm.gz} /share/server/tftp/pxe_uefi/
ll /share/server/tftp/pxe_uefi
total 256
-r--r--r-- 1 root root 429 May 14 21:25 BOOTX64.conf //grub的配置文件,用于显示引导菜单
-r-xr-xr-x 1 root root 252990 May 14 21:25 BOOTX64.efi //UEFI的启动镜像
-r--r--r-- 1 root root 1341 May 14 21:25 splash.xpm.gz //UEFI启动菜单工具
BOOTX64.efi就是我们开机所需要的。
2、DHCP server配置
DHCP重点是要修改一下/etc/dhcp/dhcpd.conf文件,把开机前引导改成BOOTX64.efi,之前我们指定的是pxelinux.0这个文件。
vim /etc/dhcp/dhcpd.conf
## DHCP Server Configuration file.# see /usr/share/doc/dhcp*/dhcpd.conf.sample# see 'man 5 dhcpd.conf'#default-lease-time 21600;max-lease-time 43200;ddns-update-style none;allow booting;allow bootp; host WadeSong-PC { hardware ethernet 00:50:56:C0:00:01; fixed-address 192.168.56.1;} subnet 192.168.56.0 netmask 255.255.255.0 { range dynamic-bootp 192.168.56.10 192.168.56.80; option routers 192.168.56.2; option subnet-mask 255.255.255.0; next-server 192.168.56.2; filename "pxe_uefi/BOOTX64.efi";}
3、创建开机启动菜单
/share/server/tftp/pxe_uefi下面的BOOTX64.conf文件不能直接使用,需要将其重命名。
vim /share/server/tftp/pxe_uefi/efidefault
debug --graphics
default=0
splashimage=(nd)/splash.xpm.gz
timeout 5
title Red Hat Enterprise Linux 7.0 X86_64(UEFI)
root(nd)
kernel (nd)/x64/rhel70/vmlinuz repo=ftp://192.168.56.2/pxe/rhel70 ip=dhcp
initrd (nd)/x64/rhel70/initrd.img
title Install system with basic video driver
kernel /images/pxeboot/vmlinuz xdriver=vesa nomodeset askmethod
initrd /images/pxeboot/initrd.img
title rescue
kernel /images/pxeboot/vmlinuz rescue askmethod
initrd /images/pxeboot/initrd.img
title Install CentOS-6.4-x86_64 (UEFI)
root (nd) kernel /vmlinuz method=ftp://10.12.190.187/pub/mirror/ ip=10.12.16.100 netmask=255.255.255.0 gateway=10.12.16.1 lang=en_US keymap=us ksdevice=eth0 vnc vncpassword=123456 initrd /initrd.img title Install CentOS-6.4-x86_64 use Kickstart File root (nd) kernel /vmlinuz ks=ftp://10.12.190.187/pub/ks.cfg ksdevice=eth0 ip=dhcp initrd /initrd.img title Rescue installed system root (nd) kernel /vmlinuz rescue method=ftp://10.12.190.187/pub/mirror initrd /initrd.img
注解:
1)(nd)表示的是network drive的路径,即BOOTX64.efi和efidefault所在的路径
2)每个OS安装启动选项中的root(nd)是用来告诉GRUB该启动项中的文件需要从网络上下载
3)菜单中的选项参数都要加在kernel行后边,不然无法加载,使用的参数和普通的PXE是一样的,编辑好之后就可以使用了。
4)OS安装过程中文件下载超级慢,不知道是怎么回事?