搭建PXE服务器安装UEFI启动的centos7

搭建PXE服务器安装UEFI启动的centos7

by: 铁乐与猫

环境

注: 此文暂不涉及kickstart方式的自动安装。

pxe-server服务器

  • 虚拟机:VirtualBox

  • 虚拟网卡:VirtualBox Host-Only Network #2

    • 后面和VMware的桥接要用到,注意要关闭dhcp功能

    • 管理-主机网络管理器中不勾选相应网卡的DHCP服务器,如图:

      搭建PXE服务器安装UEFI启动的centos7_第1张图片

  • cpu: 2核

  • 内存:2G

  • 磁盘:40GB

  • 操作系统:centos 7.6

  • 主机名:pxe-server.tielemao.com

  • 镜像:CentOS-7-x86_64-DVD-1611.iso

  • ip:192.168.33.110

  • dhcp: 12:4.2.5-77.el7.centos

  • tftp-server: 5.2-22.el7

  • vsftpd: 3.0.2-25.el7

  • syslinux: 4.05-15.el7

pxe-client 测试客户端

  • 虚拟机:Vmware

这里你也可以server和client都使用virtualbox或都使用vmware,网络设置的方式又稍有不同,但原理是一样的.

同样是保证server和client在同一网络模式且关闭dhcp服务即可。

  • 网卡:自定义模式-桥接外部网卡-桥接到virtualbox的server端所用的网卡,如图:

搭建PXE服务器安装UEFI启动的centos7_第2张图片

  • cpu: 1核

  • 磁盘:20G

  • 内存:3G或以上!这里我设置了4G.

    • 着重要说一下内存的设置,因为这个我踩了一个大坑,且一般讲述pxe安装系统的各个官网都不会注明,因为那些文档是写给真实环境的,不太可能有低于3G的内存了。我之前设了1G,结果最后会碰到

      /dev/root does not exist的错误,想都想不到这个居然是调整一下虚拟机的内存就可以避免了。

      这里要特别感谢一下以下博客,我是在这里才找到解决的办法的:

      http://m.blog.chinaunix.net/uid-31555782-id-5819768.html

其它参数就没有什么好注意的了

搭建PXE服务端

配置主机名

[root@localhost ~]# hostnamectl set-hostname pxe-server.tielemao.com
[root@localhost ~]# hostname
pxe-server.tielemao.com

配置DHCP服务

yum install -y dhcp

安装完成后进行配置,如下:

vim /etc/dhcp/dhcpd.conf

# 不使用DNS动态更新
ddns-update-style none;
# 忽略客户端DNS更新
ignore client-updates;

authoritative;

# 响应客户端的启动查询(开机时发送的DHCP请求)
allow booting;
allow bootp;
allow unknown-clients;

#DHCP configuration for PXE boot server
option space PXE;
option PXE.mtftp-ip    code 1 = ip-address;
option PXE.mtftp-cport code 2 = unsigned integer 16;
option PXE.mtftp-sport code 3 = unsigned integer 16;
option PXE.mtftp-tmout code 4 = unsigned integer 8;
option PXE.mtftp-delay code 5 = unsigned integer 8;
option arch code 93 = unsigned integer 16; # RFC4578

subnet 192.168.33.0 netmask 255.255.255.0 {
  range 192.168.33.100 192.168.33.199;
  # 设置DNS服务器地址
  option domain-name-servers 192.168.33.110;
  # 设置DNS域
  option domain-name "tielemao.com";
  # 设置客户租的默认网关
  option routers 192.168.33.1;
  option broadcast-address 192.168.33.255;
  # 默认租约时间,单位为秒
  default-lease-time 3600;
  # 设置最大租约时间,单位为秒
  max-lease-time 7200;

  class "pxeclients" {
          match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
          next-server 192.168.33.110;

          # UEFI x86-64 boot (RFC4578 architecture types 7, 8 and 9)
          if option arch = 00:07 {
              filename "uefi/bootx64.efi";
          } else if option arch = 00:08 {
              filename "uefi/bootx64.efi";
          } else if option arch = 00:09 {
              filename "uefi/bootx64.efi";
          } else {
              filename "pxelinux.0";
          }
  }
}

注:centos6的话可以使用service dhcpd configtest测试文件是否有错误。

启动并启用dhcpd.service

[root@pxe-server]# systemctl start dhcpd.service && systemctl enable dhcpd.service

允许通过Linux防火墙的DHCP服务。同样,proxy-dhcp端口是传播TFTP服务器IP地址所必需的。

[root@pxe-server ~]# firewall-cmd --permanent --add-service={dhcp,proxy-dhcp}
success
[root@pxe-server ~]# firewall-cmd --reload
success

为某台主机设置IP地址保留,把要保留IP的MAC地址和要保留的IP地址写入dhcpd.conf的配置文件即可,然后设置客户机为自动获取IP。

例:

host fantasy {
  hardware ethernet 00:0c:29:74:DF:C5;
  fixed-address 192.168.33.151;
}

配置PXE引导支持基于UEFI的系统:

这里拆分说明一下全局配置中要增加以下配置以支持UEFI引导centos:

option space PXE;
option PXE.mtftp-ip    code 1 = ip-address;
option PXE.mtftp-cport code 2 = unsigned integer 16;
option PXE.mtftp-sport code 3 = unsigned integer 16;
option PXE.mtftp-tmout code 4 = unsigned integer 8;
option PXE.mtftp-delay code 5 = unsigned integer 8;
option arch code 93 = unsigned integer 16; # RFC4578

上面的dhcp的配置,如果不考虑uefi引导的话,是直接如下配就可以的:

  #PXE boot server
  next-server 192.168.33.110;
  filename "pxelinux.0";

因为要到uefi所以配置成如下:

 class "pxeclients" {
          match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
          next-server 192.168.33.110;

          # UEFI x86-64 boot (RFC4578 architecture types 7, 8 and 9)
          if option arch = 00:07 {
              filename "uefi/bootx64.efi";
          } else if option arch = 00:08 {
              filename "uefi/bootx64.efi";
          } else if option arch = 00:09 {
              filename "uefi/bootx64.efi";
          } else {
          # PXE boot
              filename "pxelinux.0";
          }
 }

当然针对其它系统你还得去查相应的match。我这里只示范centos的。

重新启动dhcpd.service以应用更改。

[root@pxe-server ~]# systemctl restart dhcpd.service

如果dhcpd.service在启动过程中出现错误,请在其中查找任何可能的语法错误,然后尝试重新启动该服务。

可以借助systemctl status dhcpd.service 查看。

另外上面的filename与之后的tftp放的efi引导文件密切相关。

配置TFTP服务

yum 安装tftp

yum install -y tftp-server

同样启动并启用tftp.service

[root@pxe-server ~]# systemctl start tftp.service && systemctl enable tftp.service

同样允许linux防火墙通过

[root@pxe-server ~]# firewall-cmd --permanent --add-service=tftp
success
[root@pxe-server ~]# firewall-cmd --reload
success

这里更推荐使用xinetd的方式运行和设置tftp,不过测试环境就从简了,默认tftp的根目录就在/var/lib/tftpboot

配置FTP服务

需要FTP服务才能将OS安装介质共享到PXE引导客户端。一些系统管理员使用NFS代替FTP服务。但是,如果我们使用NFS,则当我们要将Microsoft Windows OS安装选项添加到PXE引导服务器时,也必须配置Samba。因此,最好使用一种通用技术来共享不同操作系统的OS安装介质。HTTP也是FTP的良好替代,可用于共享OS安装介质。

使用yum安装VSFTPD服务器。

yum install -y vsftpd

启动并启用vsftpd.service

[root@pxe-server ~]# systemctl enable vsftpd.service && systemctl start vsftpd.service

允许通过Linux防火墙的FTP服务。

[root@pxe-server ~]# firewall-cmd --permanent --add-service=ftp
success
[root@pxe-server ~]# firewall-cmd --reload
success

以上如果只是为了单机测试,不在生产环境的话,大可systemctl stop firewalld关闭防火墙。

selinux也可以关闭以防影响。

安装Syslinux

Syslinux软件包提供了各种引导程序,包括FAT文件系统,可以引导到Microsoft Windows环境。

通过yum安装syslinux软件包。

[root@pxe-server ~]# yum install -y syslinux

配置PXE UEFI引导服务器:

将必要的引导程序(由syslinux提供)复制到**/var/lib/ tftpboot**目录,非必要,主要是针对非uefi的。

[root@pxe-server ~]# cp -v /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/

[root@pxe-server ~]# cp -v /usr/share/syslinux/menu.c32 /var/lib/tftpboot/

[root@pxe-server ~]# cp -v /usr/share/syslinux/mboot.c32 /var/lib/tftpboot/

[root@pxe-server ~]# cp -v /usr/share/syslinux/chain.c32 /var/lib/tftpboot/
  • 下载centos7 DVD镜像:
wget http://mirrors.ustc.edu.cn/centos/7.3.1611/isos/x86_64/CentOS-7-x86_64-DVD-1611.iso
  • 挂载第一张DVD镜像:
# mount -o loop CentOS-7-x86_64-DVD-1611.iso /mnt/centos7
  • 将pxelinux.0等复制到/tftpboot:
# cp /mnt/centos7/isolinux/{boot.cat,boot.msg,grub.conf,isolinux.bin,splash.png,TRANS.TBL,vesamenu.c32} /var/lib/tftpboot/
  • 创建必要的目录。这里以centos7为例:

    [root@pxe-server ~]# mkdir /var/lib/tftpboot/pxelinux.cfg
    [root@pxe-server ~]# mkdir -p /var/lib/tftpboot/networkboot/centos7
    [root@pxe-server ~]# mkdir /var/ftp/pub/centos7
    
  • 将安装光盘目录中的启动文件复制到tftpboot(重点):

# cp /mnt/centos7/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/networkboot/centos7

从centos7光盘中copy内容到/var/ftp/pub/centos7

[root@pxe-server ~]# cp -rf /mnt/centos7 /var/ftp/pub/

创建一个pxe服务器的默认菜单,针对不是uefi的,传统LEGACY引导

# vim /var/lib/tftpboot/pxelinux.cfg/default

内容可以如下:

default menu.c32
prompt 0
timeout 300
ONTIMEOUT 1

menu title ########## CentOS 7 PXE Boot Menu ##########

label 1
menu label ^1) Install CentOS 7
menu default
kernel /networkboot/centos7/vmlinuz
append initrd=/networkboot/centos7/initrd.img inst.repo=ftp://192.168.33.110/pub/centos7 

label 2
menu label ^2) Boot from local drive
localboot 0

UEFI引导

创建用于uefi启动的目录

mkdir /var/lib/tftpboot/uefi

需要复制来自centos7的uefi启动的文件,可以先安装以下rpm包:

yum install grub2-efi-x64 shim-x64

这样会在本地目录中存放有相关uefi的启动文件:

/boot/efi/EFI/centos/
/boot/efi/EFI/redhat/

复制到**/var/lib/tftpboot**目录下的uefi并设置相应属性为755:

cp -p /boot/efi/EFI/centos/*.efi /var/lib/tftpboot/uefi/
chmod 755 /var/lib/tftpboot/uefi/*.efi

同样,bootx64.efi文件我们先安装如下rpm:

yum install grub2-efi-x64-modules

然后构建你自己的启动文件bootx64.efi:

grub2-mkstandalone -d /usr/lib/grub/x86_64-efi/ -O x86_64-efi --modules="tftp net efinet linux part_gpt efifwsetup" -o /var/lib/tftpboot/uefi/bootx64.efi

The grub2 modules are documented in https://www.linux.org/threads/understanding-the-various-grub-modules.11142/

创建grub.cfg文件

我们的PXELINUX菜单不适用于UEFI系统,因此我们必须为UEFI客户端创建另一个菜单。

uefi/bootx64.efi引导文件将在同一子目录中查找Grub配置文件grub.cfg。使用以下内容创建/var/lib/tftpboot/uefi/grub.cfg

set default="0"
function load_video {
  insmod efi_gop
  insmod efi_uga
  insmod video_bochs
  insmod video_cirrus
  insmod all_video
}
load_video
set gfxpayload=keep
insmod net
insmod efinet
insmod tftp
insmod gzio
insmod part_gpt
insmod ext2
set timeout=60
menuentry 'Install UEFI CentOS Linux 7' --class fedora --class gnu-linux --class gnu --class os {
  linuxefi (tftp)/uefi/vmlinuz ip=dhcp inst.repo=ftp://192.168.33.110/pub/centos7/
  initrdefi (tftp)/uefi/initrd.img
}

重新启动tftp.service以应用更改:

[root@pxe-server ~]# systemctl restart tftp.service

UEFI配置己完成

要测试配置,请将基于UEFI的系统连接到网络,然后将其打开。

注意

需要检查清楚对应系统镜像的vmlinuz和initrd.img的md5值一不一致。

来避免一些奇葩问题。比如不一致的话会出现进到pxe安装的时候一直dracut-initqueue timeout的情况。

参考

http://m.blog.chinaunix.net/uid-31555782-id-5819768.html

http://hmli.ustc.edu.cn/doc/linux/centos-autoinstall.htm

你可能感兴趣的:(运维,PXE)