Linux的PXE与UEFI PXE远程安装系统
原文链接:http://control.blog.sina.com.cn/admin/article/article_add.php
在Linux中有多种的安装方式:HD、USB、CDROM、PXE及远程管理卡等。在我们的系统运维的生涯中,经常要安装操作系统,然而我们维护的机器不是一两台而已,一般的企业服务器数量都在几十、几百、几千、甚至上万台。这么多的机器,如果人工的一台一台去安装,那我们这些运维人员,可能要把大部分时间都花费在了安装系统上,所以,我们一般都会建立一个PXE服务器,通过网络来批量部署系统。
随着计算机产品的更新换代以及IT企业的发展,一个公司的计算机型号种类越来越多,硬盘也不一样,那么我们维护的手段也需要与时俱进。本文主要介绍硬件环境差异比较大的情况下,如何搭建一机多用的PXE服务器,下面以CentOS-6.4-x86_64版本为例,进行服务器的配置。
一、普通机器的PXE系统部署
实现自动获取IP网络安装linux是这样的:客启端PXE网卡启动-->通过Bootp协议广播dhcp请求-->DHCP服务器-->获取IP,TFTP服务器地址-->从TFTP上下载 pxelinux.0以及系统内核文件vmlinuz、initrd.img-->启动系统-->(到指定url去下载ks.cfg文件-->根据ks.cfg文件去NFS/HTTP/FTP服务器自动下载软件包)安装系统-->完成安装。
主要使用的使用到的服务,FTP server用来发布linux系统的安装树(也可以使用NFS、HTTP或HTTPS),DHCP server为客户端分配ip并提供TFTP服务器地址及PXE启动文件位置,TFTP server为客户端提供引导文件。三个服务可以安装在同一台服务器上,也可以安装在三台服务器上。
1、安装配置FTP server
-
[root@pxe
~]# yum install vsftpd -
[root@pxe
~]# chkconfig vsftpd on -
[root@pxe
~]# service vsftpd start
vsftpd的默认配置文件在/etc/vsftpd/vsftpd.conf,共享目录在/var/ftp/pub/下,不用做什么修改就可以直接使用了。安装好后要把系统盘镜像的全部文件复制到这里,或挂载到这个目录下,我就是把光盘镜像挂载到了这里,因为还有个ks.cfg文件要发到这里,所以我在这里有建立了mirror目录,将系统镜像挂载到了/var/ftp/pub/mirror/下。
2、安装配置DHCP server
-
[root@pxe
~]# yum install dhcp
编辑配置文件,这里是很重要的。
-
[root@pxe
~]# vim /etc/dhcp/dhcpd.conf -
default-lease-time
600; -
max-lease-time
7200; -
ddns-update-style
none; -
subnet
10.12.190.0 netmask 255.255.255.0 { -
range
dynamic-bootp 10.12.190.100 10.12.190.120; -
option
routers 10.12.190.254; -
option
subnet-mask 255.255.255.0; -
filename
"pxelinux.0"; //如果不是在TFTP根目录下,要写上目录 -
next-server
10.12.190.140; //tftp服务器地址 -
}
3、安装配置TFTP server
①安装TFTP,然后编辑配置文件,开启开启服务,默认的数据目录/var/lib/tftpboot
-
[root@pxe
~]# yum install tftp-server -
[root@pxe
~]# vim /etc/xinetd.d/tftp -
service
tftp -
{
-
socket_type
= -
protocol
= -
wait
= -
user
= -
server
= /usr/sbin/in.tftpd -
server_args
= -s /tftpboot //这个可以自己修改 -
disable
= //将yes改成no是启用 -
per_source
= -
cps
= 2 -
flags
= -
}
-
[root@pxe
~]# service xinetd restart
②将pxelinux.0拷贝到tftpboot目录下
-
[root@pxe
~]# cp /usr/share/syslinux/pxelinux.0 /tftpboot //如果找不到这个文件,要安装syslinux软件包
③将启动文件从光盘中找到,并复制到该目录下:
-
[root@pxe
~]# ll /tftpboot/
总用量 36084:
-
-rwxrw-rw-
1 root root 32491856 3月 2 2013 initrd.img //这是一个初始化文件,一个最小的系统镜像 -
-rwxrw-rw-
1 root root 26828 12月 9 22:57 pxelinux.0 //这文件是为legcay启动,它是legcay的启动镜像, -
drwxrwxrwx
2 root root 4096 1月 28 12:14 pxelinux.cfg //该文件夹下放的是启动菜单,手动创建 -
-rwxrw-rw-
1 root root 151230 3月 5 2013 splash.jpg //背景图片,可以不要 -
-rwxrw-rw-
1 root root 162860 3月 5 2013 vesamenu.c32 //legacy BIOS引导菜单工具,可以从光盘或 /usr/share/syslinux/ 中找到 -
-rwxrw-rw-
1 root root 4043888 3月 5 2013 vmlinuz //内核文件
④在pxelinux.cfg目录下,建立默认文件,该文件可以使用光盘中的isolinux.cfg文件来当模板,这个启动菜单很重要
-
[root@pxe
~]# vim /tftpboot/pxelinux.cfg/default -
default
vesamenu.c32 -
timeout
30 -
menu
background splash.jpg -
menu
title Welcome to PXE CentOS-6.4-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 CentOS-6.4-x86_64 an existing system from to Network -
kernel
vmlinuz -
append
initrdinitrd=initrd.img ksdevice=eth0 repo=ftp://10.12.190.187/pub/mirror 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 -
label
rescue -
menu
label ^Rescue installed system -
kernel
vmlinuz -
append
initrdinitrd=initrd.img rescue ksdevice=eth0repo=ftp://10.12.190.187/pub/mirror ip=dhcp -
label
local -
menu
label Boot from ^local drive -
localboot
0xffff
以上参数可以接在kernel后边,也可以接在initrd.img后边,都不影响。
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字段,或是按Esa键,在命令行里直接输入linux vnc vncpassword=123456就可以了,U盘安装,光盘装都有效。
假设远程机器ip是10.12.190.181.,被安装机器的ip是10.12.190.101
(1)正向连接方式:
-
linux
vnc ip=10.12.190.101netmask=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.181vncpassword=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 -
initrd
/initrd.img
以上就是普通PXE安装系统的所有操作方法,现在就可以使用了。
二、UEFI PXE的系统部署
对于使用UEFI来启动的机器来说,上述方法已经完全无效了,根本无法顺利的安装系统了,如果想顺利的安装系统,必须首先加载UEFI驱动才可以。UEFI PXE和上边的方法区别就在于TFTPserver所提供的系统启动必须文件,和DHCP server的设置, 所使用到的服务还是这几个。
1、TFTP server的配置
配置文件与上边一样,只是目录中的文件要更换一下,这次要从系统盘中提取三个文件。
将光盘中的efiboot.img挂在到系统中:
-
[root@pxe
~]# mount -o loop efiboot.img /mnt -
[root@pxe
~]# ll /mnt/EFI/BOOT/ -
total
250 -
-rwxr-xr-x
1 root root 411 Mar 5 2013 BOOTX64.conf //为grub的配置文件,用于显示引导菜单 -
-rwxr-xr-x
1 root root 251274 Mar 5 2013 BOOTX64.efi //UEFI的启动镜像 -
-rwxr-xr-x
1 root root 1341 Mar 5 2013 splash.xpm.gz //UEFI启动菜单工具 -
[root@pxe
~]# cp /mnt/EFI/BOOT/* /tftpboot/
BOOTX64.efi就是我们开机所需要的,这三个文件也可也直接使用光盘中EFI目录下的文件。
2、DHCP server配置
DHCP重点是要修改一下/etc/dhcp/dhcpd.conf文件,把开机前引导改成BOOTX64.efi,之前我们指定的是pxelinux.0这个文件。
-
[root@pxe
~]# vim /etc/dhcp/dhcpd.conf -
default-lease-time
600; -
max-lease-time
7200; -
ddns-update-style
none; -
subnet
10.12.190.0 netmask 255.255.255.0 { -
range
dynamic-bootp 10.12.190.100 10.12.190.120; -
option
routers 10.12.190.254; -
option
subnet-mask 255.255.255.0; -
filename
"BOOTX64.efi"; -
next-server
10.12.190.140; -
}
3、创建开机启动菜单
-
[root@pxe
~]# vim /tftpboot/efidefault -
default=0
-
timeout=15
-
splashimage=(nd)/splash.xpm.gz
-
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
注意这个菜单只能这样编写,选项参数都要加在kernel行后边,不然无法加载,使用的参数和普通的PXE是一样的,编辑好之后就可以使用了。
选择一个菜单后,等待的时间比较长,当你看到这是小企鹅时,UEFI驱动已经加载上了,说明你TFTP server和DHCP server设置都没有问题。
如果你看到上面的错误信息,说明是的你的菜单写得有问题,initrd /initrd.img要另起一行,不能与kernel同行。
UEFI安装系统时,也可以使用vnc远程安装,但硬盘的分区表必须是GPT格式的,如果你的硬盘不是这种格式的,那就需要多一步操作了,使用parted命令去修改。遗憾的是vnc没有提供Ctrl+Alt+F1~F6快捷键,让你切换到一个字符终端去操作。不过也不是没有办法,我们可以在救援模式下连上vnc,这样输入命令操作就行了。
parted命令的使用,请参考此文档。
三、混合模式
一般情况下,我们的机房里,2种类型的服务都会有,可能还会有安腾架构的机器,不会是统一型号的。这样的话,每次都要去修改DHCP server服务,比较麻烦,将这些不同的机器划分不同的vlan里,每个vlan里都做个DHCP服务器,这样有点太浪费资源了。所以就要用个更好的方法,一台服务器同时提供多种系统安装,而要安装系统的客户端机器,会自己从服务器下载属于自己的引导文件。
1、TFTP server配置
在/tftpboot/目录下,不同平台需要的文件是不一样的,可以直接把它们全都放在TFTP的根目录下,但这样管理不太方便,所以我将普通PXE的引导文件放在/tftpboot/Legacy/下,将UEFI的引导文件放在/tftpboot/UEFI下,其他平台的也这样操作就可以了。
2、DHCP server配置
想要实现混合模式,最关键的就是DHCP的配置文件了
-
[root@pxe
~]# vim /etc/dhcp/dhcpd.conf -
default-lease-time
600; -
max-lease-time
7200; -
ddns-update-style
none; -
option
space PXE; -
option
PXE.mtftp-ip code 1 = ip-address; -
option
PXE.mtftp-cport code 2 = unsignedinteger 16; -
option
PXE.mtftp-sport code 3 = unsignedinteger 16; -
option
PXE.mtftp-tmout code 4 = unsignedinteger 8; -
option
PXE.mtftp-delay code 5 = unsignedinteger 8; -
option
arch code 93 = unsignedinteger 16; -
subnet
10.12.190.0 netmask 255.255.255.0 { -
option
routers 10.12.190.254; -
range
10.12.190.10 10.12.190.20; -
class
"pxeclients" { -
match
if substring (option vendor-class-identifier, 0, 9) = "PXEClient"; -
next-server
10.12.190.181; -
if
option arch = 00:02{ -
filename
"ia64/elilo.efi"; -
}
else if option arch = 00:06{ -
filename
"X86PC/bootia32.efi"; -
}
else if option arch = 00:07{ -
filename
"UEFI/BOOTX64.efi"; -
}
else { -
filename
"Legacy/pxelinux.0"; -
}
-
}
-
}
这里不再详细解释每行的含义,具体可以参考相关资料。这里很重要的一点是根据客户端信息进行判断来指定服务器为客户端提供哪些信息。
启动文件名称(如果客户端使用EFI,启动名称为bootia32.efi和boottx64.efi,如果客户端使用Legacy BIOS启动,名称为pxelinux.0),其它服务部分没有什么变化,FTP服务不需要做什么更改。
至此,我们就大功告成了,所有的准备工作就都完成了,现在就可以使用这个多平台的PXE进行批量部署了。