PXE不外乎就是待安装机器从网卡pxe启动,安装服务器DHCP分配IP(包括启动文件),然后待安装机器拿到这些信息后,通过tftp去安装服务器下载启动文件以及内核之类,然后内核启动后驱动网卡在Linux启动环境(vmlinz + initrd)下配置正常驱动的网卡IP,获取启动镜像以及ks文件(ks指定了安装树来源,比如nfs http ftp等等)。
实际部署过程,只需要安装2个软件就行:nfs-server(nfs) dnsmasq(tftp + dhcp)
nfs 安装配置:
sudo apt install nfs-kernel-server
然后配置
/home/xxx/nfsshare/ *(ro)
把光盘iso的文件放到/home/xxx/nfsshare/ 根目录下,但我选择放在/home/xxx/nfsshare/1020e下 ,这样这个nfsshare目录下可以存在多个目录,可以一套环境同时安装好多个版本和架构的系统。
dnsmasq安装配置:
系统默认安装了dnsmasq-base用于libvirt给虚拟机分配IP,完整版需要安装dnsmasq软件包
sudo apt install dnsmasq
然后配置
# grep -v ^# /etc/dnsmasq.conf | tr -s '\n'
dhcp-range=192.168.100.50,192.168.100.150,2h
dhcp-match=x32, option:client-arch, 0 #x86-32
dhcp-match=efix32, option:client-arch, 6 #x86-64
dhcp-match=tag:efix64, option:client-arch, 7 #EFI x86-64
dhcp-match=tag:efiaarch64, option:client-arch, 11 #EFI aarch64 only test on libvirt
dhcp-boot=tag:efix64,grubx64.efi
dhcp-boot=tag:efiaarch64,aarch64-1020e/EFI/BOOT/grubaa64.efi
dhcp-boot=tag:x32,pxelinux.0
enable-tftp
tftp-root=/home/actionchen/nfsshare/tftp/
log-queries
log-dhcp
其中,我们在这里面针对不通架构的机器,分发不同的启动文件,用于支持多指令集机器安装。
dhcp-match=tag:efiaarch64, option:client-arch, 11
dhcp-boot=tag:efiaarch64,aarch64-1020e/EFI/BOOT/grubaa64.efi
这两行是对aarch64虚拟机的ipxe请求的DHCP里面Option 93 里面的值来定义了一个tag,然后这个tag下的机器Pxe都给他分发tftp目录下aarch64-1020e/EFI/BOOT/grubaa64.efi这个文件做为启动文件。这里指定目录也是为了方便不同架构的启动文件在不通目录里,不互相冲突。
tftp服务器就用dnsmasq自带的就行,配置文件指定了根目录
上面dhcp的option 93 ,可以参考
rfc4578https://www.rfc-editor.org/rfc/inline-errata/rfc4578.html
这个RFC标准,但是里面就是没定义aarch64的option93代码是多少。网上查了下,Ipv6里面倒是定义了。
PXE Boot Arch Field DHCP Option 93 - Stack Overflowhttps://stackoverflow.com/questions/58921055/pxe-boot-arch-field-dhcp-option-93不过实际情况,我们可以用抓包工具来抓就是了。我的kvm + libvirt虚拟机报上来的是11,所以我上面定义aarch64的就用的11,别的机器报多少或者报不报不好说,革命全凭自觉。
定义好这个后,把安装ISO下的EFI images两个目录(里面包含了efi启动文件,grub.cfg,vmlinuz initrd.img等启动需要的文件)拷贝到/home/actionchen/nfsshare/tftp/aarch64-1020e目录下,不在tftp根目录而放子目录也是为了区分多个架构或者版本,免得文件名冲突或者错乱。将来要安装个x86的就放/home/actionchen/nfsshare/tftp/x64-1020e目录,互相不影响。
拷贝完后还需要准备2个文件:grub.cf ks.cfg
ks.cfg好理解,anaconda安装的时候要读取。必要的就写一行
nfs --server=192.168.100.1 --dir=/home/xxx/nfsshare/1020e_aarch64
这样指定安装树(源),其余的可以图形手配置,当然实际安装还是能配置都配置上吧,包括安装后要执行的脚本之类。这样真正做到自动安装。
grub.cfg 这个文件是pxe发送的启动文件grubaa64.efi的配置文件,默认会在grubaa64.efi这个目录查找。由于我们修改了tftp下的目录结构,把所有启动文件放到tftp的子目录aarch64-1020e目录了,所以配置文件默认的$prefix就变了,不是默认的目录了。所以需要修改,才能正常读取到启动文件。
set prefix=/home/xxx/nfsshare/tftp/aarch64-1020e/
set theme=$prefix/EFI/BOOT/theme/theme.txt
loadfont $prefix/EFI/BOOT/fonts/unicode.pf2
menuentry 'Install UnionTech OS Server 20 (Graphic)' --class red --class gnu-linux --class gnu --class os {
linux $prefix/images/pxeboot/vmlinuz inst.stage2=nfs:192.168.100.1:/home/xxx/nfsshare/1020e_aarch64 inst.ks=nfs://192.168.100.1:/home/xxx/nfsshare/ks-1020e.cfg ro console=tty0 smmu.bypassdev=0x1000:0x17 smmu.bypassdev=0x1000:0x15 video=efifb:off video=VGA-1:640x480-32@60me rhgb
initrd $prefix/images/pxeboot/initrd.img
}
主要修改的就是这几行
set prefix=/home/xxx/nfsshare/tftp/aarch64-1020e/
主要是这个设置grub的prefix目录,默认是定死在安装目录的,efi和legacy方式目录应该不一样。
通过修改后,后面的都可以引用这个路径来修改,然后ks文件貌似只能在nfs的根目录,放子目录他还要去mount卡住,那就根目录用文件名来区分了。