Linux PXE Server 原理及配置

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)正向连接方式:

  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会自动连接

  1. linux vnc vncconnect=10.12.190.181 vncpassword=123456 
 
vnc会自动反向联接10.12.190.181,如果远程机器开启vnc监听,在10次超时15秒后,会变成主动方式连接,在安装系统上将显示如下信息:
 
 
 

以上2种方式,如果IP是DHCP自动获取的话,使用反向连接方式比较好,这样,无需知道安装系统的客户端获取的IP是多少,也可以建立连接。

⑥另一种安装菜单的写法:

  1. label linux 
  2. menu label ^ Install or upgrade CentOS-6.4-x86_64 an existing system from to Network 
  3. kernel /vmlinuz ksdevice=eth0 repo=ftp://10.12.190.187/pub/mirror ip=dhcp 
  4. initrd /initrd.img 
  5. label linux 
  6. menu label ^ Install CentOS-6.4-x86_64 use kisckstart file 
  7. menu default 
  8. 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 
  9. 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安装过程中文件下载超级慢,不知道是怎么回事?
 

posted on 2015-11-18 22:27  静水流深,学而再思  阅读(2365)  评论(0)    收藏  举报

导航