CentOS8的PXE安装-1-PXE服务搭建

1. PXE服务搭建

  • pxe服务器
    • 硬件基本信息
      • CPU大于4核
      • 内存大于4G
      • 硬盘大于50G
    • 系统基本信息
      • 系统版本:centos7.4
      • selinux:关闭
      • Firewalld:关闭
      • yum源:阿里云的yum源
  • client服务器
    • 硬件基本信息
      • CPU大于4核
      • 内存大于4G
      • 硬盘大于50G
      • 支持网络启动

1.1. 搭建dhcp服务

  • 基本配置:
    • DHCP服务器地址:192.168.17.128/24
    • 服务器装机网段:192.168.17.0/24 网关: 192.168.17.254
    • 交换机装机网段:192.168.100.0/24 网关: 192.168.100.254
    • 服务器带外管理网段:192.168.255.0/24 网关: 192.168.255.254
    • 默认filename:gpxelinux.0(获取方式)
    • 默认next-server:192.168.17.128/24
  • 其它不太重要的配置(可选择性关注):
    • DNS服务器地址:192.168.17.2
    • NTP服务器地址:ntp.aliyun.com
    • domain-search:test.com

1.1.1. 安装dhcp服务

[root@pxe01 ~]# yum install dhcp

文件路径:/etc/dhcp/dhcpd.conf

include "/etc/dhcp/ipxe.conf";
include "/etc/dhcp/ipmi_host";
 
# 用来设置DHCP服务器与DNS服务器的动态信息更新模式:
# interim为DNS互动更新模式
# ad-hoc为特>殊DNS更新模式
# none为不支持动态更新模式
ddns-update-style none;
 
# 现在这个选项是可以忽略的,因为 DDNS 在前面已在配置文件中已经被禁用。
# 但是当 DDNS 运行时,这个选项会忽略主机更新其 DNS 主机名的请求。
ignore client-updates;
 
# 是否动态分配IP给未知的使用者
allow unknown-clients;
 
 
# 当dhcp服务器准备动态分配ip地址给一个客户端时,它先发送一个icmp echo 请求 (ping)给这个要分配的地址,然后等1秒钟,
# 如果没有icmp echo信息返回,它就分配这个地址。
# 如果有返回信息,就把这个地址放弃,服务器不会给客户端回应。
# 这个ping检查导致在回应dhcpdiscover信息时默认有1秒钟的延迟,这对某些客户端可能是问题。
# 可以在这里配置是否检查。如果这个值设置为false,就不进行ping检查。
ping-check true;
 
# 因为ping-check 设置为true,ping-timeout允许配置dhcp服务器应该等多长时间。如果没有设置值,默认是1秒。
ping-timeout 1;
 
 
#客户端是否通过ICMP发现网络掩码,路由
option perform-mask-discovery true;
option router-discovery  true;
 
# 设置服务器时间(与格林威治时间相差8个小时,,台湾本地时间(local time)会比GMT时间快8小时(GMT + 8))
option time-offset 28800; 
option ntp-servers ntp.aliyun.com;
option domain-search "test.com";
option domain-name-servers 192.168.17.2;

# 安装系统的PXE环境下的IP网段 
group host_pool {
    allow bootp;
    allow booting;
    default-lease-time 1800;
    max-lease-time 2400;

    next-server 192.168.17.128;
    filename "gpxelinux.0";
 
    if exists user-class and option user-class = "iPXE" {
        filename "http://192.168.17.128/pxe_boot/boot.ipxe";
    }
    else if option client-arch != 00:00 {
        filename "ipxe.efi";
    }
    else {
        filename "gpxelinux.0";
    }
 
    subnet 192.168.17.0   netmask 255.255.255.0 {option routers 192.168.17.254;  range 192.168.17.100 192.168.17.200;}
}

# 带外IP的分配,一般用于mac绑定,这里只写网段
group ipmi_pool {
    default-lease-time 3600;
    max-lease-time 7200;

    subnet 192.168.255.0   netmask 255.255.255.0 { option routers 192.168.255.254;   }
}

# 交换机的pxe引导配置
group sw_pool {
    allow bootp;
    allow booting;
    default-lease-time 1800;
    max-lease-time 3600;

    if substring (option host-name, 0, 6) = "Ruijie" {
        option tftp-server-name "192.168.17.128";
        option bootfile-name "ruijie.py";
    }
    else if substring (option vendor-class-identifier, 0, 6) = "HUAWEI" {
        option tftp-server-name "192.168.17.128";
        option bootfile-name "huawei.py";
    }
    else if substring (option vendor-class-identifier, 0, 3) = "H3C" {
        option tftp-server-name "192.168.17.128";
        option bootfile-name "h3c.py";
    }

    subnet 192.168.100.0  netmask 255.255.255.0 { option routers 192.168.100.254   ; range 192.168.100.100 192.168.100.200;}
}

文件路径:/etc/dhcp/ipxe.conf

option space ipxe;
option ipxe-encap-opts code 175 = encapsulate ipxe;
option ipxe.priority code 1 = signed integer 8;
option ipxe.keep-san code 8 = unsigned integer 8;
option ipxe.skip-san-boot code 9 = unsigned integer 8;
option ipxe.syslogs code 85 = string;
option ipxe.cert code 91 = string;
option ipxe.privkey code 92 = string;
option ipxe.crosscert code 93 = string;
option ipxe.no-pxedhcp code 176 = unsigned integer 8;
option ipxe.bus-id code 177 = string;
option ipxe.san-filename code 188 = string;
option ipxe.bios-drive code 189 = unsigned integer 8;
option ipxe.username code 190 = string;
option ipxe.password code 191 = string;
option ipxe.reverse-username code 192 = string;
option ipxe.reverse-password code 193 = string;
option ipxe.version code 235 = string;
option iscsi-initiator-iqn code 203 = string;
# Feature indicators
option ipxe.pxeext code 16 = unsigned integer 8;
option ipxe.iscsi code 17 = unsigned integer 8;
option ipxe.aoe code 18 = unsigned integer 8;
option ipxe.http code 19 = unsigned integer 8;
option ipxe.https code 20 = unsigned integer 8;
option ipxe.tftp code 21 = unsigned integer 8;
option ipxe.ftp code 22 = unsigned integer 8;
option ipxe.dns code 23 = unsigned integer 8;
option ipxe.bzimage code 24 = unsigned integer 8;
option ipxe.multiboot code 25 = unsigned integer 8;
option ipxe.slam code 26 = unsigned integer 8;
option ipxe.srp code 27 = unsigned integer 8;
option ipxe.nbi code 32 = unsigned integer 8;
option ipxe.pxe code 33 = unsigned integer 8;
option ipxe.elf code 34 = unsigned integer 8;
option ipxe.comboot code 35 = unsigned integer 8;
option ipxe.efi code 36 = unsigned integer 8;
option ipxe.fcoe code 37 = unsigned integer 8;
option ipxe.vlan code 38 = unsigned integer 8;
option ipxe.menu code 39 = unsigned integer 8;
option ipxe.sdi code 40 = unsigned integer 8;
option ipxe.nfs code 41 = unsigned integer 8;
 
option client-arch code 93 = unsigned integer 16;

文件路径:/etc/dhcp/ipmi_host

host BMC_XXXXX { hardware ethernet 00:00:00:00:27:85; fixed-address 192.168.255.11  ;}
host BMC_XXXX1 { hardware ethernet 00:00:00:00:EF:05; fixed-address 192.168.255.12  ;}

1.1.2. 设置开机自启

[root@pxe01 ~]# systemctl start dhcpd
[root@pxe01 ~]# systemctl enable dhcpd

1.2. 搭建tftp-server服务

1.2.1. 安装tftp-server

[root@pxe01 ~]# yum install tftp tftp-server xinetd

文件路径:/etc/xinetd.d/tftp

# default: off
# description: The tftp server serves files using the trivial file transfer \
#       protocol.  The tftp protocol is often used to boot diskless \
#       workstations, download configuration files to network-aware printers, \
#       and to start the installation process for some operating systems.
service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -s /var/lib/tftpboot
        disable                 = no
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}

1.2.2. 启动tftp服务

[root@pxe01 ~]# systemctl start xinetd
[root@pxe01 ~]# systemctl enable xinetd

1.2.3. 测试tftp是否正常

[root@pxe01 ~]# netstat -tuanpl |grep 69
udp        0      0 0.0.0.0:69              0.0.0.0:*                           1423/xinetd
[root@pxe01 ~]# echo "test tftp-server" >/var/lib/tftpboot/test.txt
[root@pxe01 ~]# ls
anaconda-ks.cfg
[root@pxe01 ~]# tftp 192.168.17.128 
tftp> get test.txt
tftp> quit
[root@pxe01 ~]# ls
anaconda-ks.cfg  test.txt
[root@pxe01 ~]# cat test.txt 
test tftp-server

1.3. 配置装机菜单界面

这里我们使用centos6的装机界面为模板,原因是看着舒服。

1.3.1. 获取gpxelinux.0

安装syslinux,即可获取gpxelinux.0

[root@pxe01 ~]# yum install syslinux
[root@pxe01 ~]# cp /usr/share/syslinux/gpxelinux.0 /var/lib/tftpboot/

1.3.2. 添加其它启动文件

[root@pxe01 ~]# mkdir /var/lib/tftpboot/pxelinux.cfg
[root@pxe01 ~]# wget -O /var/lib/tftpboot/pxelinux.cfg/default https://mirrors.aliyun.com/centos/6/os/x86_64/isolinux/isolinux.cfg
[root@pxe01 ~]# wget -O /var/lib/tftpboot/splash.jpg https://mirrors.aliyun.com/centos/6/os/x86_64/isolinux/splash.jpg
[root@pxe01 ~]# cp /usr/share/syslinux/vesamenu.c32 /var/lib/tftpboot/
[root@pxe01 ~]# ls /var/lib/tftpboot/
gpxelinux.0  pxelinux.cfg  splash.jpg  test.txt  vesamenu.c32

1.3.3. 配置default文件

文件路径:/var/lib/tftpboot/pxelinux.cfg/default

default vesamenu.c32
#prompt 1
timeout 600

#display boot.msg

menu background splash.jpg
menu title Welcome to CentOS 8.X!
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 local
  menu label Boot from local drive
  localboot 0xffff

label linux
  menu label CentOS 8.X
  menu default
  kernel http://192.168.17.128/centos8-pxe/vmlinuz
  append initrd=http://192.168.17.128/centos8-pxe/initrd.img net.ifnames=0 biosdevname=0 rd.driver.pre=mlx5_core,i40e,ixgbe ksdevice=bootif inst.gpt
  ipappend 2

1.3.3. 启动验证

系统安装选择界面

1.4. 安装源配置

1.4.1. 安装httpd服务

[root@pxe01 ~]# yum install httpd
[root@pxe01 ~]# vim /etc/httpd/conf.d/welcome.conf

    Options +Indexes
    ErrorDocument 403 /.noindex.html

[root@pxe01 ~]# vim /etc/httpd/conf.d/autoindex.conf
IndexOptions FancyIndexing HTMLTable VersionSort NameWidth=*
[root@pxe01 ~]# systemctl enable httpd.service 
[root@pxe01 ~]# systemctl restart httpd.service

1.4.2. PXE环境设置

1.4.2.1. 挂载CentOS8.1的ISO镜像
[root@pxe01 ~]# mkdir -p /var/www/html/iso/centos8u1
[root@pxe01 ~]# vim /etc/fstab 
/dev/cdrom /var/www/html/iso/centos8u1/ iso9660 defaults,loop 0 0
[root@pxe01 ~]# mount -a
[root@pxe01 ~]# ls /var/www/html/iso/centos8u1/
AppStream  BaseOS  EFI  images  isolinux  media.repo  TRANS.TBL
1.4.2.2. 配置PXE环境
[root@pxe01 ~]# mkdir -p /var/www/html/centos8-pxe/{ks,scripts}
[root@pxe01 ~]# cp /var/www/html/iso/centos8u1/isolinux/{initrd.img,vmlinuz} /var/www/html/centos8-pxe/
[root@pxe01 ~]# ls /var/www/html/centos8-pxe/
initrd.img  ks  scripts  vmlinuz
http服务启动正常

因为这次是手动安装,需要加入参数inst.stage2=http://192.168.17.128/iso/centos8u1

[root@pxe01 ~]# vim /var/lib/tftpboot/pxelinux.cfg/default
label linux
  menu label CentOS 8.X
  menu default
  kernel http://192.168.17.128/centos8-pxe/vmlinuz
  append initrd=http://192.168.17.128/centos8-pxe/initrd.img net.ifnames=0 biosdevname=0 rd.driver.pre=mlx5_core,i40e,ixgbe ksdevice=bootif inst.gpt inst.stage2=http://192.168.17.128/iso/centos8u1
  ipappend 2

1.4.3. 装机测试

装机界面

1.4.4. 加载过程

根据httpd服务的访问日志,可以知道pxe启动的过程

[root@pxe01 ~]# tail /var/log/httpd/access_log
192.168.17.101 - - [02/May/2020:00:32:20 +0800] "GET /centos8-pxe/vmlinuz HTTP/1.0" 200 8106744 "-" "gPXE/1.0.0"
192.168.17.101 - - [02/May/2020:00:32:20 +0800] "GET /centos8-pxe/initrd.img HTTP/1.0" 200 62113500 "-" "gPXE/1.0.0"
192.168.17.129 - - [02/May/2020:00:32:36 +0800] "GET /iso/centos8u1/.treeinfo HTTP/1.1" 200 1520 "-" "curl/7.61.1"
192.168.17.129 - - [02/May/2020:00:32:36 +0800] "GET /iso/centos8u1/images/install.img HTTP/1.1" 200 533405696 "-" "curl/7.61.1"
192.168.17.129 - - [02/May/2020:00:32:44 +0800] "GET /iso/centos8u1/images/updates.img HTTP/1.1" 404 230 "-" "curl/7.61.1"
192.168.17.129 - - [02/May/2020:00:32:44 +0800] "GET /iso/centos8u1/images/product.img HTTP/1.1" 404 230 "-" "curl/7.61.1"

1.5. 解决的问题

  1. 安装centos8系统需要的安装源问题
    也就是不需要刻录过个光盘了

你可能感兴趣的:(CentOS8的PXE安装-1-PXE服务搭建)