搭建 PXE 服务器(基于 Ubuntu 22.04,支持 IPv4/6 及 Legacy/UEFI) ...

宁睿  论坛元老 | 2024-6-15 02:44:30 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1051|帖子 1051|积分 3163

基于 Ubuntu 22.04 搭建 PXE 服务器,支持 IPv4, IPv6 网络,支持 Legacy, UEFI 启动模式。
  
  
一、PXE 启动流程

PXE 启动大抵流程如下:

  • PXE Client(客户端)通过 DHCP 哀求获取 IP,DHCP 服务器在相应哀求时同时提供网络启动引导步调(Boot File)的地点(使用 TFTP 协议)。
  • PXE Client 得到 IP 后,访问 Boot File 地点获取并加载引导步调(Legacy 和 UEFI 的区别在于引导步调差异)及其设置文件。
  • 引导步调根据设置文件通过 HTTP/FTP/NFS 协议获取完整的系统镜像举行启动。
二、设置清单

须要条件:


  • 正常的 Internet 网络
  • Ubuntu 22.04 操作系统
  • Ubuntu 22.04 系统 ISO 镜像文件
核心软件:


  • DHCP 服务器: isc-dhcp-server
  • TFTP 服务器: tftp-hpa
  • HTTP 服务器: apache2
  • RA 服务器: radvd(IPv6)
网络地点:


  • IPv4: 192.168.9.1/24
  • IPv6: (先获取一个 ULA 前缀(点我) )
前缀:fdb0:d7fa:87bd::/64
选择一个 IP 作为设置使用:fdb0:d7fa:87bd::1/64
三、设置步调

发起在设置前关闭防火墙。
  1. sudo ufw disable
复制代码
3.1 搭建 HTTP 服务器

安装 apache2。
  1. sudo apt install apache2
复制代码
拷贝镜像。
  1. sudo cp <你的镜像文件所在路径>/ubuntu-22.04.2-desktop-amd64.iso /var/www/html/
复制代码
挂载镜像(解压也行)。
  1. sudo mkdir /var/www/html/Ubuntu_22.04_Desktop/
  2. sudo mount /var/www/html/ubuntu-22.04.2-desktop-amd64.iso /var/www/html/Ubuntu_22.04_Desktop/
复制代码
3.2 搭建 TFTP 服务器

安装 tftp-hpa。
  1. sudo apt install tftpd-hpa
复制代码
3.2.1 设置 Legacy PXE 启动项

安装 syslinux, pxelinux 并拷贝需要的文件。
  1. # 建立 Legacy 目录
  2. sudo mkdir /srv/tftp/Legacy
  3. # 安装 syslinux pxelinux
  4. sudo apt install syslinux pxelinux
  5. # 拷贝文件
  6. sudo cp /var/www/html/Ubuntu_22.04_Desktop/casper/{vmlinuz,initrd} /srv/tftp/Legacy/
  7. sudo cp /usr/lib/syslinux/modules/bios/{ldlinux.c32,libutil.c32,menu.c32,vesamenu.c32} /srv/tftp/Legacy/
  8. sudo cp /usr/lib/PXELINUX/{lpxelinux.0,pxelinux.0} /srv/tftp/Legacy/
复制代码
创建 pxelinux 的设置文件。
  1. cd /srv/tftp/Legacy
  2. sudo mkdir pxelinux.cfg
  3. vim pxelinux.cfg/default
复制代码
编辑设置文件:
  1. DEFAULT menu.c32
  2. MENU TITLE ULTIMATE PXE SERVER - By Griffon - Ver 1.0
  3. PROMPT 0
  4. TIMEOUT 0
  5. MENU COLOR TABMSG  37;40  #ffffffff #00000000
  6. MENU COLOR TITLE   37;40  #ffffffff #00000000
  7. MENU COLOR SEL      7     #ffffffff #00000000
  8. MENU COLOR UNSEL    37;40 #ffffffff #00000000
  9. MENU COLOR BORDER   37;40 #ffffffff #00000000
  10. LABEL Ubuntu Desktop 22.04 ISO IPv4
  11.     kernel /vmlinuz
  12.     initrd /initrd
  13.     append root=/dev/ram0 ramdisk_size=1500000 ip=dhcp url=http://192.168.9.1/ubuntu-22.04.2-desktop-amd64.iso
  14. LABEL Ubuntu Desktop 22.04 ISO IPv6
  15.     kernel /vmlinuz
  16.     initrd /initrd
  17.     append root=/dev/ram0 ramdisk_size=1500000 ip=dhcp url=http://[fdb0:d7fa:87bd::1]/ubuntu-22.04.2-desktop-amd64.iso
复制代码
3.2.2 设置 UEFI PXE 启动项

下载并拷贝需要的文件。
  1. # 建立 UEFI 目录
  2. mkdir /srv/tftp/UEFI
  3. # 拷贝文件
  4. sudo cp /var/www/html/Ubuntu_22.04_Desktop/casper/{vmlinuz,initrd} /srv/tftp/UEFI/
  5. # 下载并拷贝必要的文件
  6. cd ~
  7. # shim-signed
  8. apt download shim-signed
  9. dpkg -x shim-signed*deb shim
  10. sudo cp shim/usr/lib/shim/shimx64.efi.signed.latest /srv/tftp/UEFI/bootx64.efi
  11. # grub-efi-amd64-signed
  12. apt download grub-efi-amd64-signed
  13. dpkg -x grub-efi-amd64-signed*deb grub
  14. sudo cp grub/usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed /srv/tftp/UEFI/grubx64.efi
  15. # grub-common
  16. apt download grub-common
  17. dpkg -x grub-common*deb grub-common
  18. sudo cp grub-common/usr/share/grub/unicode.pf2 /srv/tftp/UEFI/
复制代码
创建设置文件。
  1. sudo mkdir /srv/tftp/grub
  2. sudo vim /srv/tftp/grub/grub.cfg
复制代码
编辑设置文件:
  1.         set default="0"
  2.         set timeout=-1
  3.       
  4.         if loadfont unicode ; then
  5.           set gfxmode=auto
  6.           set locale_dir=$prefix/locale
  7.           set lang=en_US
  8.         fi
  9.         terminal_output gfxterm
  10.         set menu_color_normal=white/black
  11.         set menu_color_highlight=black/light-gray
  12.         if background_color 44,0,30; then
  13.           clear
  14.         fi
  15.         function gfxmode {
  16.                 set gfxpayload="${1}"
  17.                 if [ "${1}" = "keep" ]; then
  18.                         set vt_handoff=vt.handoff=7
  19.                 else
  20.                         set vt_handoff=
  21.                 fi
  22.         }
  23.         set linux_gfx_mode=keep
  24.         export linux_gfx_mode
  25.         menuentry 'Ubuntu 22.04 IPv4' {
  26.                 gfxmode $linux_gfx_mode
  27.                 linux /UEFI/vmlinuz root=/dev/ram0 ramdisk_size=1500000 ip=dhcp url=http://192.168.9.1/ubuntu-22.04.2-desktop-amd64.iso
  28.                 initrd /UEFI/initrd
  29.         }
  30.         menuentry 'Ubuntu 22.04 IPv6' {
  31.                 gfxmode $linux_gfx_mode
  32.                 linux /UEFI/vmlinuz root=/dev/ram0 ramdisk_size=1500000 ip=dhcp url=http://[fdb0:d7fa:87bd::1]/ubuntu-22.04.2-desktop-amd64.iso
  33.                 initrd /UEFI/initrd
  34.         }
复制代码
3.3 搭建 DHCP 服务器

安装 isc-dhcp-server
  1. sudo apt install isc-dhcp-server
复制代码
使用 ip a 查看网络接口
  1. vboxuser@Ubuntu-22:~$ ip a
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  3.     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4.     inet 127.0.0.1/8 scope host lo
  5.        valid_lft forever preferred_lft forever
  6.     inet6 ::1/128 scope host
  7.        valid_lft forever preferred_lft forever
  8. 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
  9.     link/ether 08:00:27:02:fa:39 brd ff:ff:ff:ff:ff:ff
  10.     inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic noprefixroute enp0s3
  11.        valid_lft 84432sec preferred_lft 84432sec
  12.     inet6 fe80::cd67:89ac:208:e978/64 scope link noprefixroute
  13.        valid_lft forever preferred_lft forever
  14. 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
  15.     link/ether 08:00:27:3d:0d:a4 brd ff:ff:ff:ff:ff:ff
  16.     inet6 fe80::51b:be51:b6c2:43ee/64 scope link noprefixroute
  17.        valid_lft forever preferred_lft forever
复制代码
可以看到我这台呆板上有两张网卡 enp0s3 和 enp0s8,前者用来上网,后者用来连接局域网提供 PXE 服务。
先给目的网卡 enp0s8 设置静态 IP。
3.3.1 设置静态 IP

使用 netplan 设置静态 IP,打开设置文件。
  1. sudo vim /etc/netplan/01-network-manager-all.yaml
复制代码
打开后的默认设置文件如下:
  1. # Let NetworkManager manage all devices on this system
  2. network:
  3.   version: 2
  4.   renderer: NetworkManager
复制代码
编辑设置文件内容。
  1. # Let NetworkManager manage all devices on this system
  2. network:
  3.   ethernets:
  4.     enp0s8:
  5.       dhcp4: no
  6.       dhcp6: no
  7.       addresses:
  8.         - 192.168.9.1/24
  9.         - fdb0:d7fa:87bd::1/64
  10.   version: 2
  11.   renderer: NetworkManager
复制代码
应用更改。
  1. sudo netplan apply
复制代码
查抄是否设置成功。
  1. vboxuser@Ubuntu-22:~$ ip a
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  3.     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4.     inet 127.0.0.1/8 scope host lo
  5.        valid_lft forever preferred_lft forever
  6.     inet6 ::1/128 scope host
  7.        valid_lft forever preferred_lft forever
  8. 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
  9.     link/ether 08:00:27:02:fa:39 brd ff:ff:ff:ff:ff:ff
  10.     inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic noprefixroute enp0s3
  11.        valid_lft 86356sec preferred_lft 86356sec
  12.     inet6 fe80::cd67:89ac:208:e978/64 scope link noprefixroute
  13.        valid_lft forever preferred_lft forever
  14. 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
  15.     link/ether 08:00:27:3d:0d:a4 brd ff:ff:ff:ff:ff:ff
  16.     inet 192.168.9.1/24 brd 192.168.9.255 scope global noprefixroute enp0s8
  17.        valid_lft forever preferred_lft forever
  18.     inet6 fdb0:d7fa:87bd::1/64 scope global noprefixroute
  19.        valid_lft forever preferred_lft forever
  20.     inet6 fe80::a00:27ff:fe3d:da4/64 scope link noprefixroute
  21.        valid_lft forever preferred_lft forever
复制代码
3.3.2 设置 dhcpd

指定 isc-dhcp-server 要监听的网卡。打开设置文件。
  1. sudo vim /etc/default/isc-dhcp-server
复制代码
编辑内容:
  1. INTERFACESv4="enp0s8"
  2. INTERFACESv6="enp0s8"
复制代码
编辑 dhcpd.conf 设置文件。
  1. sudo vim /etc/dhcp/dhcpd.conf
复制代码
添加内容:
  1. option arch code 93 = unsigned integer 16;
  2.   
  3. subnet 192.168.9.0 netmask 255.255.255.0 {
  4.   range  192.168.9.2 192.168.9.254;
  5.   option routers 192.168.9.1;
  6.   next-server 192.168.9.1;
  7.   if option arch = 00:07 {
  8.         filename "/UEFI/bootx64.efi";
  9.   } else {
  10.         filename "/Legacy/pxelinux.0";
  11.   }
  12. }
复制代码
重启服务。
  1. sudo systemctl restart isc-dhcp-server
复制代码
查抄服务是否启动成功。
  1. systemctl status isc-dhcp-server
复制代码
此时基于 IPv4 的 PXE 服务器已设置完成。
3.3.3 (IPv6)设置 dhcpd6

编辑 dhcpd6.conf 设置文件。
  1. sudo vim /etc/dhcp/dhcpd6.conf
复制代码
编辑内容:
  1. option dhcp6.bootfile-url code 59 = string;
  2. option dhcp6.client-arch-type code 61 = array of unsigned integer 16;
  3. option dhcp6.name-servers fdb0:d7fa:87bd::1;
  4. if option dhcp6.client-arch-type = 00:07 {
  5.         option dhcp6.bootfile-url "tftp://[fdb0:d7fa:87bd::1]/UEFI/bootx64.efi";
  6. } else {
  7.         # Support a hypothetical BIOS system that can PXE boot over IPv6
  8.         option dhcp6.bootfile-url "tftp://[fdb0:d7fa:87bd::1]/Legacy/pxelinux.0";
  9. }
  10. subnet6 fdb0:d7fa:87bd::/64 {
  11.         range6 fdb0:d7fa:87bd::3:10 fdb0:d7fa:87bd::3:99;
  12.         range6 fdb0:d7fa:87bd:: temporary;
  13. }
复制代码
重启服务。
  1. sudo systemctl restart isc-dhcp-server
  2. 6
复制代码
查抄服务是否启动成功。
  1. systemctl status isc-dhcp-server
  2. 6
复制代码
注意:由于 IPv6 的特性,当 dhcpd6 搭建成功后,局域网内的呆板能够正确得到 IP,但是却无法连通。因此,还需要继续设置 [radvd](#3.4 搭建 RA 服务器)。
3.4 (IPv6)搭建 RA 服务器

安装 radvd。
  1. sudo apt install radvd
复制代码
创建设置文件。
  1. vim /etc/radvd.conf
复制代码
编辑设置文件:
  1. interface enp0s8
  2. {
  3.     AdvSendAdvert on;
  4.     prefix fdb0:d7fa:87bd::/64 {
  5.         AdvOnLink on;
  6.         AdvAutonomous on;
  7.     };
  8.     #Send DNS Server setting - assumes there is a DNS server setup at the address below
  9.     RDNSS fdb0:d7fa:87bd::1{
  10.     };
  11. };
复制代码
重启 radvd 服务。
  1. sudo systemctl restart radvd
复制代码
查抄 radvd 服务状态。
  1. systemctl status radvd
复制代码
若服务正常运行,则此时 IPv6 网络已设置完成。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宁睿

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表