PXE装机避坑指南麒麟KylinV10 SP2在UEFI模式下的特殊配置最近在给几台新到的服务器批量部署麒麟KylinV10 SP2系统本以为是个常规的PXE部署任务结果在UEFI模式下遇到了不少意料之外的“坑”。从引导文件提取到DHCP配置再到那个让人头疼的“no space left”报错整个过程就像是在解一个连环谜题。如果你也正在为ARM架构尤其是鲲鹏920平台和x86架构混合环境下的PXE部署头疼这篇文章或许能帮你省下不少排查时间。我会把这次实践中遇到的特殊配置点、容易忽略的细节以及最终的解决方案都梳理出来希望能给各位系统集成工程师提供一份实用的参考手册。1. 理解UEFI PXE的核心差异与架构识别传统的Legacy BIOS PXE和UEFI PXE在底层机制上有着本质区别这直接影响了我们的配置思路。Legacy模式依赖pxelinux.0这个引导文件而UEFI模式则需要特定的EFI可执行文件。最关键的是不同CPU架构的UEFI固件期望的EFI文件完全不同如果给错了客户端根本不会进入引导流程直接卡在PXE初始化阶段。x86_64架构的UEFI固件在PXE启动时会向TFTP服务器请求名为BOOTX64.EFI的文件。这个文件通常位于安装镜像的/EFI/BOOT/目录下。有时候你可能会看到grubx64.efi在麒麟的镜像里BOOTX64.EFI往往就是grubx64.efi的重命名或符号链接核心作用是加载GRUB2并解析grub.cfg配置文件。aarch64ARM64架构比如鲲鹏920平台其UEFI固件请求的文件则是BOOTAA64.EFI。这是第一个容易踩坑的地方直接从x86的镜像里拷贝文件过去是行不通的必须使用对应架构的麒麟安装ISO。如何让DHCP服务器智能地分发正确的引导文件这依赖于PXE客户端在DHCP Discover报文中携带的option 93即pxe-system-type。这个选项的值标识了客户端的系统架构类型。下面这个表格整理了常见的类型代码类型代码 (十六进制)对应架构与固件类型典型引导文件名00:00IA32 BIOS (Legacy)pxelinux.000:06EFI IA32 (32位UEFI)BOOTIA32.EFI00:07EFI BC (x64 UEFI, 常见)BOOTX64.EFI00:09EFI x64 (x64 UEFI, 另一种)BOOTX64.EFI00:0bEFI ARM (AArch64 UEFI)BOOTAA64.EFI00:27EFI LoongArch64BOOTLOONGARCH64.EFI在实际的DHCP配置中我们可以利用option pxe-system-type来条件判断。下面是一个配置片段示例它同时处理了x86 UEFI、ARM UEFI以及传统的Legacy BIOS客户端# /etc/dhcp/dhcpd.conf 关键配置段 class pxeclients { match if substring (option vendor-class-identifier, 0, 9) PXEClient; # x86_64 UEFI 客户端 if option pxe-system-type 00:07 or option pxe-system-type 00:09 { filename x86_uefi/BOOTX64.EFI; } # ARM64 UEFI 客户端 else if option pxe-system-type 00:0b { filename arm_uefi/BOOTAA64.EFI; } # 其他情况如Legacy BIOS回退到传统引导 else { filename pxelinux.0; } }注意在实际部署前最好先在DHCP服务器上开启调试日志抓取一下真实客户端的DHCP请求确认其发送的pxe-system-type值。有些服务器的UEFI实现可能有细微差别。2. 引导文件提取与GRUB配置的架构适配拿到对应架构的麒麟KylinV10 SP2安装ISO后第一步就是正确提取引导文件。这里有个细节麒麟的ISO镜像里/EFI/BOOT/目录下通常已经包含了正确的EFI引导文件但/images/pxeboot/目录下的vmlinuz和initrd.img才是真正的内核与初始内存盘两者缺一不可。假设我们将ISO挂载到/mnt/kylin_x86和/mnt/kylin_armTFTP根目录为/var/lib/tftpboot。操作命令如下# 创建TFTP子目录实现架构隔离 mkdir -p /var/lib/tftpboot/{x86_uefi,arm_uefi} # 为x86_64架构准备文件 cp /mnt/kylin_x86/EFI/BOOT/BOOTX64.EFI /var/lib/tftpboot/x86_uefi/ cp /mnt/kylin_x86/images/pxeboot/vmlinuz /var/lib/tftpboot/x86_uefi/ cp /mnt/kylin_x86/images/pxeboot/initrd.img /var/lib/tftpboot/x86_uefi/ # 为ARM64架构准备文件 cp /mnt/kylin_arm/EFI/BOOT/BOOTAA64.EFI /var/lib/tftpboot/arm_uefi/ cp /mnt/kylin_arm/images/pxeboot/vmlinuz /var/lib/tftpboot/arm_uefi/ cp /mnt/kylin_arm/images/pxeboot/initrd.img /var/lib/tftpboot/arm_uefi/文件就位后接下来是重头戏编写grub.cfg。这个文件必须放在与EFI文件相同的TFTP子目录下例如/var/lib/tftpboot/x86_uefi/grub.cfg因为UEFI固件在加载BOOTX64.EFI或BOOTAA64.EFI后会在同级目录寻找这个配置文件。x86_64架构的grub.cfg配置相对标准重点是指定正确的内核路径和Kickstart文件URL# /var/lib/tftpboot/x86_uefi/grub.cfg set default0 set timeout5 menuentry Install Kylin Linux Advanced Server V10 SP2 (x86_64) --class kylin --class gnu-linux --class os { # 注意内核路径是相对于TFTP根目录的 linuxefi x86_uefi/vmlinuz inst.repohttp://192.168.100.21/kylin_x86/ inst.kshttp://192.168.100.21/ks/ks_x86.cfg ipdhcp quiet initrdefi x86_uefi/initrd.img }ARM64架构的grub.cfg则需要特别注意语法差异。ARM平台的GRUB可能不支持linuxefi和initrdefi命令而是使用linux和initrd。此外内核参数也可能需要调整# /var/lib/tftpboot/arm_uefi/grub.cfg set default0 set timeout3 menuentry Install Kylin Linux Advanced Server V10 SP2 (ARM64) --class kylin --class gnu-linux --class os { # ARM UEFI下通常使用 linux 和 initrd 命令 linux arm_uefi/vmlinuz inst.repohttp://192.168.100.21/kylin_arm/ inst.kshttp://192.168.100.21/ks/ks_arm.cfg ipdhcp ro initrd arm_uefi/initrd.img }提示inst.repo参数用于指定安装源HTTP/HTTPS/NFS路径inst.ks指定Kickstart自动应答文件。ipdhcp确保安装环境能获取网络。roread-only参数有时在ARM平台上能避免一些早期的挂载问题。3. 解决ARM服务器常见的“no space left”报错在部署鲲鹏920等ARM服务器时一个高频出现的错误是客户端在加载initrd.img时提示“no space left on device”。这个报错极具误导性它并非指磁盘空间不足而是客户端内存不足以容纳解压后的initrd镜像。麒麟系统的initrd.img文件通常比较大尤其是在包含大量驱动和固件的服务器版本中解压后可能达到数百MB甚至超过1GB。如果PXE客户端的内存特别是分配给PXE启动阶段的内存小于这个值就会触发此错误。解决方案的核心是增加客户端可用内存或优化initrd具体可以从以下几个层面入手增加客户端物理内存这是最根本的解决方法。确保用于PXE安装的ARM服务器节点内存至少为4GB推荐8GB或以上。在虚拟机环境中检查并调高分配给虚拟机的内存容量。优化Kickstart精简安装环境在Kickstart文件的%packages部分避免安装庞大的软件包组尤其是在%post阶段。一个臃肿的安装后脚本会显著增大initrd在内存中的占用。检查并调整服务器端TFTP配置虽然不常见但TFTP服务器的块大小blksize设置不当也可能影响大文件传输。可以尝试在/etc/xinetd.d/tftp配置文件中增加-s安全模式和-B 1468调整块大小参数。不过这通常不是主因。终极方案定制裁剪initrd进阶。如果必须在小内存机器上安装可以考虑从麒麟ISO中提取initrd.img解压后移除不必要的驱动模块再重新打包。这个过程比较复杂有风险一般不建议在生产环境轻易尝试。# 示例查看initrd.img的大致大小 ls -lh /var/lib/tftpboot/arm_uefi/initrd.img # 输出类似-rw-r--r-- 1 root root 180M Mar 10 10:00 initrd.img # 如果这个文件超过150M而客户端内存只有2G就非常危险了。我的经验是对于麒麟V10 SP2确保客户端有4GB可用内存是避免“no space left”错误的相对安全线。如果条件允许加到8GB会更稳妥。4. Kickstart文件的安全加固与多架构适配Kickstart文件是实现无人值守安装的灵魂但也藏着不少“坑”。一个配置不当的ks文件轻则安装失败重则可能引发安全问题。特别是在多架构混合环境中x86和ARM的ks文件需要区别对待。首先绝对不要在ks文件中使用明文密码。像rootpw --plaintext 123456这样的写法是安全大忌。应该使用加密后的密码。生成加密密码的方法如下# 使用python生成sha-512加密的密码 python3 -c import crypt; print(crypt.crypt(YourStrongPassword, crypt.mksalt(crypt.METHOD_SHA512))) # 输出类似$6$rounds656000$SALTSTRING$HASH...然后在ks文件中使用rootpw --iscrypted $6$rounds656000$SALTSTRING$HASH...其次分区方案需要根据架构和磁盘类型仔细规划。UEFI模式必须有一个EFI系统分区。以下是一个兼顾x86和ARM的LVM分区示例注意引导加载器的安装位置# 适用于x86和ARM的通用分区骨架需根据实际磁盘调整如sda, vda, nvme0n1等 clearpart --all --initlabel part /boot/efi --fstypeefi --size600 --ondisksda part /boot --fstypexfs --size1024 --ondisksda part pv.01 --size1 --grow --ondisksda volgroup vg_root pv.01 logvol / --fstypexfs --size10240 --namelv_root --vgnamevg_root logvol swap --fstypeswap --size4096 --namelv_swap --vgnamevg_root # 引导加载器配置UEFI模式下通常不需要指定具体位置系统会自动安装到EFI分区 bootloader --locationnone第三%post阶段脚本的兼容性。如果你的%post脚本里包含硬件相关的操作比如加载特定内核模块、配置特定网卡一定要用条件判断区分架构。可以通过uname -m来获取机器架构。%post --log/root/post-install.log # 获取架构 ARCH$(uname -m) case $ARCH in x86_64) echo Running x86_64 specific post-install tasks... # 例如安装intel微码 dnf install -y microcode_ctl ;; aarch64) echo Running aarch64 specific post-install tasks... # 例如调整ARM相关的内核参数 echo kernel.panic10 /etc/sysctl.d/99-arm.conf ;; *) echo Unsupported architecture: $ARCH ;; esac # 通用配置 systemctl disable firewalld systemctl disable --now NetworkManager-wait-online %end最后务必使用ksvalidator工具校验语法。在部署前运行ksvalidator your_kickstart.cfg可以检查出许多常见的语法错误避免安装过程中途失败。# 安装校验工具并检查 yum install -y pykickstart ksvalidator /var/www/html/ks/ks_arm.cfg # 如果没有输出通常表示语法正确。5. 服务配置与网络环境排查清单即使所有文件都配置正确网络服务本身的问题也可能导致PXE失败。下面是一个按服务分类的快速排查清单可以帮助你系统性地定位问题。DHCP服务确认IP地址池充足检查dhcpd.conf中range定义的地址范围是否够用是否与现有网络冲突。检查next-server这个选项必须指向你的TFTP服务器的正确IP地址。查看租约文件/var/lib/dhcpd/dhcpd.leases记录了DHCP分配的详细信息包括客户端的MAC地址、IP和获取的引导文件名。这是验证DHCP是否按预期响应客户端请求的最佳证据。防火墙确保DHCP服务端口UDP 67在服务器防火墙是放行的。TFTP服务目录权限/var/lib/tftpboot及其子目录需要对nobody用户或tftp服务运行用户有读取和执行权限。通常chmod -R 755 /var/lib/tftpboot可以解决大部分权限问题。SELinux如果服务器开启了SELinux需要确保TFTP目录有正确的上下文标签。可以尝试restorecon -Rv /var/lib/tftpboot或者临时将SELinux设置为宽容模式测试setenforce 0。服务状态TFTP服务通常由xinetd管理。确保/etc/xinetd.d/tftp中disable no并且xinetd服务正在运行。HTTP/NFS服务安装源路径可访问在PXE服务器本机用curl或wget测试安装源URL是否能正常访问例如curl -I http://192.168.100.21/kylin_arm/应返回200 OK。目录索引确保HTTP服务配置了目录索引Options Indexes或者至少repodata/目录和.treeinfo文件能被访问到。防火墙放行HTTP80/tcp或NFS相关端口。客户端侧检查UEFI设置进入服务器的BIOS/UEFI设置确认启动模式为UEFI Only或UEFI with Legacy并启用PXE网络启动。安全启动尝试暂时关闭Secure Boot。某些麒麟版本或自定义内核可能与安全启动不兼容导致引导失败。网络连接确保PXE服务器和客户端在同一广播域VLAN内没有中间设备过滤了DHCP或TFTP广播包。当遇到问题时一个有效的调试方法是开启各个服务的详细日志同时在客户端启动时观察PXE获取IP、下载引导文件、加载内核等各个阶段的信息。多架构混合环境下的PXE部署耐心和细致的分段测试是关键。先从单一架构比如x86调通再加入另一种架构的配置这样能有效缩小问题范围。