赞
踩
基于 Ubuntu 22.04 搭建 PXE 服务器,支持 IPv4, IPv6 网络,支持 Legacy, UEFI 启动模式。
PXE 启动大致流程如下:
必要条件:
核心软件:
网络地址:
IPv4: 192.168.9.1/24
IPv6: (先获取一个 ULA 前缀(点我) )
前缀:fdb0:d7fa:87bd::/64
选择一个 IP 作为配置使用:fdb0:d7fa:87bd::1/64
建议在配置前关闭防火墙。
sudo ufw disable
安装 apache2。
sudo apt install apache2
拷贝镜像。
sudo cp <你的镜像文件所在路径>/ubuntu-22.04.2-desktop-amd64.iso /var/www/html/
挂载镜像(解压也行)。
sudo mkdir /var/www/html/Ubuntu_22.04_Desktop/
sudo mount /var/www/html/ubuntu-22.04.2-desktop-amd64.iso /var/www/html/Ubuntu_22.04_Desktop/
安装 tftp-hpa
。
sudo apt install tftpd-hpa
安装 syslinux, pxelinux 并拷贝需要的文件。
# 建立 Legacy 目录
sudo mkdir /srv/tftp/Legacy
# 安装 syslinux pxelinux
sudo apt install syslinux pxelinux
# 拷贝文件
sudo cp /var/www/html/Ubuntu_22.04_Desktop/casper/{vmlinuz,initrd} /srv/tftp/Legacy/
sudo cp /usr/lib/syslinux/modules/bios/{ldlinux.c32,libutil.c32,menu.c32,vesamenu.c32} /srv/tftp/Legacy/
sudo cp /usr/lib/PXELINUX/{lpxelinux.0,pxelinux.0} /srv/tftp/Legacy/
创建 pxelinux 的配置文件。
cd /srv/tftp/Legacy
sudo mkdir pxelinux.cfg
vim pxelinux.cfg/default
编辑配置文件:
DEFAULT menu.c32 MENU TITLE ULTIMATE PXE SERVER - By Griffon - Ver 1.0 PROMPT 0 TIMEOUT 0 MENU COLOR TABMSG 37;40 #ffffffff #00000000 MENU COLOR TITLE 37;40 #ffffffff #00000000 MENU COLOR SEL 7 #ffffffff #00000000 MENU COLOR UNSEL 37;40 #ffffffff #00000000 MENU COLOR BORDER 37;40 #ffffffff #00000000 LABEL Ubuntu Desktop 22.04 ISO IPv4 kernel /vmlinuz initrd /initrd append root=/dev/ram0 ramdisk_size=1500000 ip=dhcp url=http://192.168.9.1/ubuntu-22.04.2-desktop-amd64.iso LABEL Ubuntu Desktop 22.04 ISO IPv6 kernel /vmlinuz initrd /initrd append root=/dev/ram0 ramdisk_size=1500000 ip=dhcp url=http://[fdb0:d7fa:87bd::1]/ubuntu-22.04.2-desktop-amd64.iso
下载并拷贝需要的文件。
# 建立 UEFI 目录 mkdir /srv/tftp/UEFI # 拷贝文件 sudo cp /var/www/html/Ubuntu_22.04_Desktop/casper/{vmlinuz,initrd} /srv/tftp/UEFI/ # 下载并拷贝必要的文件 cd ~ # shim-signed apt download shim-signed dpkg -x shim-signed*deb shim sudo cp shim/usr/lib/shim/shimx64.efi.signed.latest /srv/tftp/UEFI/bootx64.efi # grub-efi-amd64-signed apt download grub-efi-amd64-signed dpkg -x grub-efi-amd64-signed*deb grub sudo cp grub/usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed /srv/tftp/UEFI/grubx64.efi # grub-common apt download grub-common dpkg -x grub-common*deb grub-common sudo cp grub-common/usr/share/grub/unicode.pf2 /srv/tftp/UEFI/
创建配置文件。
sudo mkdir /srv/tftp/grub
sudo vim /srv/tftp/grub/grub.cfg
编辑配置文件:
set default="0" set timeout=-1 if loadfont unicode ; then set gfxmode=auto set locale_dir=$prefix/locale set lang=en_US fi terminal_output gfxterm set menu_color_normal=white/black set menu_color_highlight=black/light-gray if background_color 44,0,30; then clear fi function gfxmode { set gfxpayload="${1}" if [ "${1}" = "keep" ]; then set vt_handoff=vt.handoff=7 else set vt_handoff= fi } set linux_gfx_mode=keep export linux_gfx_mode menuentry 'Ubuntu 22.04 IPv4' { gfxmode $linux_gfx_mode linux /UEFI/vmlinuz root=/dev/ram0 ramdisk_size=1500000 ip=dhcp url=http://192.168.9.1/ubuntu-22.04.2-desktop-amd64.iso initrd /UEFI/initrd } menuentry 'Ubuntu 22.04 IPv6' { gfxmode $linux_gfx_mode linux /UEFI/vmlinuz root=/dev/ram0 ramdisk_size=1500000 ip=dhcp url=http://[fdb0:d7fa:87bd::1]/ubuntu-22.04.2-desktop-amd64.iso initrd /UEFI/initrd }
安装 isc-dhcp-server
sudo apt install isc-dhcp-server
使用 ip a
查看网络接口
vboxuser@Ubuntu-22:~$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:02:fa:39 brd ff:ff:ff:ff:ff:ff inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic noprefixroute enp0s3 valid_lft 84432sec preferred_lft 84432sec inet6 fe80::cd67:89ac:208:e978/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:3d:0d:a4 brd ff:ff:ff:ff:ff:ff inet6 fe80::51b:be51:b6c2:43ee/64 scope link noprefixroute valid_lft forever preferred_lft forever
可以看到我这台机器上有两张网卡 enp0s3
和 enp0s8
,前者用来上网,后者用来连接局域网提供 PXE 服务。
先给目标网卡 enp0s8
配置静态 IP。
使用 netplan
配置静态 IP,打开配置文件。
sudo vim /etc/netplan/01-network-manager-all.yaml
打开后的默认配置文件如下:
# Let NetworkManager manage all devices on this system
network:
version: 2
renderer: NetworkManager
编辑配置文件内容。
# Let NetworkManager manage all devices on this system
network:
ethernets:
enp0s8:
dhcp4: no
dhcp6: no
addresses:
- 192.168.9.1/24
- fdb0:d7fa:87bd::1/64
version: 2
renderer: NetworkManager
应用更改。
sudo netplan apply
检查是否配置成功。
vboxuser@Ubuntu-22:~$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:02:fa:39 brd ff:ff:ff:ff:ff:ff inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic noprefixroute enp0s3 valid_lft 86356sec preferred_lft 86356sec inet6 fe80::cd67:89ac:208:e978/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:3d:0d:a4 brd ff:ff:ff:ff:ff:ff inet 192.168.9.1/24 brd 192.168.9.255 scope global noprefixroute enp0s8 valid_lft forever preferred_lft forever inet6 fdb0:d7fa:87bd::1/64 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fe3d:da4/64 scope link noprefixroute valid_lft forever preferred_lft forever
指定 isc-dhcp-server
要监听的网卡。打开配置文件。
sudo vim /etc/default/isc-dhcp-server
编辑内容:
INTERFACESv4="enp0s8"
INTERFACESv6="enp0s8"
编辑 dhcpd.conf
配置文件。
sudo vim /etc/dhcp/dhcpd.conf
添加内容:
option arch code 93 = unsigned integer 16;
subnet 192.168.9.0 netmask 255.255.255.0 {
range 192.168.9.2 192.168.9.254;
option routers 192.168.9.1;
next-server 192.168.9.1;
if option arch = 00:07 {
filename "/UEFI/bootx64.efi";
} else {
filename "/Legacy/pxelinux.0";
}
}
重启服务。
sudo systemctl restart isc-dhcp-server
检查服务是否启动成功。
systemctl status isc-dhcp-server
此时基于 IPv4 的 PXE 服务器已配置完成。
编辑 dhcpd6.conf
配置文件。
sudo vim /etc/dhcp/dhcpd6.conf
编辑内容:
option dhcp6.bootfile-url code 59 = string; option dhcp6.client-arch-type code 61 = array of unsigned integer 16; option dhcp6.name-servers fdb0:d7fa:87bd::1; if option dhcp6.client-arch-type = 00:07 { option dhcp6.bootfile-url "tftp://[fdb0:d7fa:87bd::1]/UEFI/bootx64.efi"; } else { # Support a hypothetical BIOS system that can PXE boot over IPv6 option dhcp6.bootfile-url "tftp://[fdb0:d7fa:87bd::1]/Legacy/pxelinux.0"; } subnet6 fdb0:d7fa:87bd::/64 { range6 fdb0:d7fa:87bd::3:10 fdb0:d7fa:87bd::3:99; range6 fdb0:d7fa:87bd:: temporary; }
重启服务。
sudo systemctl restart isc-dhcp-server6
检查服务是否启动成功。
systemctl status isc-dhcp-server6
注意:由于 IPv6 的特性,当 dhcpd6 搭建成功后,局域网内的机器能够正确获得 IP,但是却无法连通。因此,还需要继续配置 [radvd](#3.4 搭建 RA 服务器)。
安装 radvd。
sudo apt install radvd
创建配置文件。
vim /etc/radvd.conf
编辑配置文件:
interface enp0s8
{
AdvSendAdvert on;
prefix fdb0:d7fa:87bd::/64 {
AdvOnLink on;
AdvAutonomous on;
};
#Send DNS Server setting - assumes there is a DNS server setup at the address below
RDNSS fdb0:d7fa:87bd::1{
};
};
重启 radvd 服务。
sudo systemctl restart radvd
检查 radvd 服务状态。
systemctl status radvd
若服务正常运行,则此时 IPv6 网络已配置完成。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。