关于更多操作系统比如debian,centos等的PXE实现,可参考:
环境说明
操作系统镜像:ubuntu-22.04.1-live-server-amd64.iso
可以直接去官网下载https://ubuntu.com/download/server
PXE Server选择的是最小化安装ubuntu-22.04
(一) PXE Server安装必须的软件(2个)
安装HTTP服务器
这里使用的是apache2sudo apt-get install apache2
安装DHCP、TFTP服务器
dnsmasq同时实现了DHCP、TFTP、DNS三种服务器sudo apt-get install dnsmasq
安装后报53端口冲突:
直接忽略该报错就行,后面会通过绑定端口解决
bind-interfaces
(二) 准备相关文件
1. tftpd的默认服务根目录是/var/ftpd
ftpd
├── grubx64.efi
├── boot
│ └── live-server
│ ├── initrd
│ └── vmlinuz
└── grub
├── bootx64.efi
├── grub.cfg
└── x86_64-efi
├── command.lst
├── crypto.lst
├── fs.lst
└── terminal.lst
说明:文件initrd、vmlinuz、command.lst、crypto.lst、fs.lst和terminal.lst来自 ubuntu安装包
- bootx64.efi、grubx64.efi 引导程序,来自shim.signed 和grub-efi-amd64-signed安装包
sudo apt-get download shim.signed dpkg -x shim-signed_1.51+15.4-0ubuntu9_amd64.deb shim sudo apt-get download grub-efi-amd64-signed dpkg -x grub-efi-amd64-signed_1.182~22.04.1+2.06-2ubuntu10_amd64.deb grub cp ./grub/usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed /var/ftpd/grubx64.efi cp ./shim/usr/lib/shim/shimx64.efi.signed /var/ftpd/grub/bootx64.efi |
- grub.cfg 自建,内容如下
menuentry "Try or Install Ubuntu Server" { set gfxpayload=keep linux /boot/live-server/vmlinuz root=/dev/ram0 ramdisk_size=1500000 ip=dhcp url='http://192.168.0.49/iso/ubuntu-22.04.1-live-server-amd64.iso' autoinstall ds=nocloud-net\;s=http://192.168.0.49/autoinstall/ --- initrd /boot/live-server/initrd } |
这里的ip:192.168.0.49是“安装源服务器”传输以上文件所用的那个网卡的网络地址,根据实际情况修改。
2. apache2的默认服务根目录是 /var/www/html
html/
├── autoinstall
│ ├── meta-data
│ └── user-data
├── index.html
└── iso
└── ubuntu-22.04.1-live-server-amd64.iso
说明
- autoinstall 目录存放参数自动配置文件,user-data、meta-data是cloud-init要求的文件名。
meta-data只需创建一个依此命名的空文件;
user-data的内容可以参考此安装源服务器在 /var/log/installer/ 目录下的 autoinstall-user-data ,这是基于当前的系统的应答文件,我们可以以它作为基础,根据实际情况进行修改。重点要关注一下网络和分区那里。
- iso 目录存放操作系统镜像文件。
(三) 修改配置文件
dnsmasq的默认配置文件为/etc/dnsmasq.conf,关键配置有以下几个
# 指定服务的网卡,对应上述ip:192.168.0.49的那张网卡名 interface=enp2s0 # 绑定端口 bind-interfaces # 设置DHCP分发IP端范围、地址掩码、IP地址有效时间(网段自定义) dhcp-range=192.168.0.50,192.168.0.150,255.255.255.0,12h # 设置引导程序相对tftp根目录的路径 dhcp-match=set:efi-x86_64,option:client-arch,7 dhcp-boot=tag:efi-x86_64,grub/bootx64.efi # 打开tftp服务 enable-tftp # 设置tftp根路径 tftp-root=/var/ftpd # 设置日志路径 log-facility=/var/log/dnsmasq.log |
修改配置后,重启dnsmasq服务才能生效。
sudo service dnsmasq restart |
至此,安装源服务器上的配置都已修改完毕,接着网络启动所有客户端服务器就
开始进行网络安装了。
参考 :devops - 通过 PXE 自动化安装 Ubuntu Server - logger - SegmentFault 思否
---------------------------------------------------------------------------------------------------------------------------------
测试验证过程:
一、使用Hyper-V虚拟化环境验证
验证主机系统:Windows 10,16G内存
Hyper-V 管理器版本如下:
PXE server安装 ubuntu-22.04.1-live-server-amd64.iso时选择最小化安装
PXE server配置如下图所示,新增了一张网卡MyPrivateNet(内部网络)专门用于PXE启动
PXE client配置如下:
在创建PXE client虚拟机时选择从网络启动,在PXE server上按照上述步骤配置后,启动PXE client即可完成操作系统安装。
遇到的问题:
1、无法从PXE启动,进入到PXE后很快就失败
取消勾选“启用安全启动”即可
2、 使用Hyper-V 验证时报“Out of memory”,经检查发现是虚拟机的内存设置的太小了,增加内存大小即可解决。
3、 Failed to start initial cloud-init job
怀疑cloud-init不兼容Hyper-V,使用物理机验证时没有类似问题。
二、使用物理机验证
1、选择一台物理机作为PXE server,最小化安装 ubuntu-22.04.1-live-server-amd64.iso
2、另选一台服务器作为PXE client,组网如下,服务器配置有RAID卡的话,需要提前对系统盘做RAID。
按照前文配置说明完成对PXE server的部署后,启动PXE client,当出现如下画面的时候代表已经连接到PXE server
这一步显示的就是我们再grub.cfg中配置的菜单:menuentry "Try or Install Ubuntu Server"
在PXE server查看dnsmasq日志,正常的启动日志如下:
PXE client在OS安装完成后会自动重启。
---------------------------------------------------------------------------------------------------------------------------------
记录一下测试过程中遇到的问题:
1、最后一步分区的时候报错,提示如下:
根据倒数第二行的提示,按enter键后去查看crash日志:
从日志可以看出我们再user-data中配置的ubuntu-vg在文件系统中已经存在。
原因就是我们测试用的PXE client已经安装过操作系统了
而且之前的操作系统并没有安装到系统盘sda上 ,清除掉nvme0n1p3上的ubuntu-vg之后重新PXE安装即可
2、报错“pxe unable to find a live file system on the network”
经检查发现是PXE sever上的iso包不是从官方下载的,文件名不一样,导致这个iso下载不到PXE client,更改文件名即可。
3、使用物理机验证时报“wget: can't connect to remote host”,提示信息显示获取了一个169.254.3.1的ip地址,并不是DHCP server分配的那个。
经排查发现是那台服务器的网卡不支持PXE启动,换了一台服务器就没有类似问题。