概述
大家好,我是Tarzan,最近学习了麒麟桌面arm架构PXE装机
PXE
规模化:同时装配多台服务器
自动化:安装系统、配置各种服务
远程实现:不需要光盘、U盘等安装介质
-
流程图
网上一大把 -
PXE所需服务
-
DHCP (10.0.0.1)
DHCP通常被用于局域网环境,主要作用是集中的管理、分配IP地址,使client动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。简单来说,DHCP就是一个不需要账号密码登录的、自动给内网机器分配IP地址等信息的协议。
-
TFTP(10.0.0.1)
用作引导加载的标准文件传输协议
我们来看一下正确麒麟桌面版Arm架构PXE启动过程所获取的文件顺序
Aug 15 18:22:38 129 dnsmasq-tftp[200290]: sent /var/tftp/arm_uefi/grubnetaa64.efi to 10.0.0.2 Aug 15 18:22:41 129 dnsmasq-tftp[200290]: file /var/tftp/grub/arm64-efi/command.lst not found Aug 15 18:22:41 129 dnsmasq-tftp[200290]: file /var/tftp/grub/arm64-efi/fs.lst not found Aug 15 18:22:41 129 dnsmasq-tftp[200290]: file /var/tftp/grub/arm64-efi/crypto.lst not found Aug 15 18:22:41 129 dnsmasq-tftp[200290]: file /var/tftp/grub/arm64-efi/terminal.lst not found Aug 15 18:22:41 129 dnsmasq-tftp[200290]: sent /var/tftp/grub/grub.cfg to 10.0.0.2 Aug 15 18:22:45 129 dnsmasq-tftp[200290]: sent /var/tftp/arm_uefi/vmlinuz to 10.0.0.2 Aug 15 18:22:47 129 dnsmasq-tftp[200290]: sent /var/tftp/arm_uefi/vmlinuz to 10.0.0.2 Aug 15 18:23:03 129 dnsmasq-tftp[200290]: sent /var/tftp/arm_uefi/initrd.lz to 10.0.0.2 # not found 文件不影响正常pxe装机 # 10.0.0.2 这个ip是dhcp 分配的ip
-
FTP/HTTP/NFS(10.0.0.1)
使用ftp/http/nfs中的一个来获取系统文件
本文采用nfs
-
-
部署服务(debian系列):
-
Dhcp:
sudo apt install isc-dhcp-server
查看
dhcp
服务:sudo systemctl status isc-dhcp-server
DHCP配置的主文件是
/etc/dhcp/dhcpd.conf
# 部分代码,详细代码在文章末尾 next-server 10.0.0.1; # 下一个服务找谁?就是你的tftp 服务的ip,找到tftp-root后需要找到引导文件 efi class "pxeclients" { match if substring (option vendor-class-identifier, 0, 9) = "PXEClient"; if option pxe-system-type = 00:07 { filename "amd_uefi/BOOTX64.EFI"; } else if option pxe-system-type = 00:0b { #麒麟桌面arm架构pxe 引导文件 filename "arm_uefi/grubnetaa64.efi";#告诉pc机器去tftp-root目录下面的:/var/tftp/arm_uefi/grubnetaa64.efi } else { filename "pxelinux.0";
grubnetaa64.efi
该文件来自镜像挂载后本身自带的.下载后将镜像文件解压到~/iso目录下 mkdir -p ~/iso/arm_mount mount /home/Kylin-Desktop-V10-SP1-General-Release-2203-ARM64.iso ~/iso/arm_mount cd ~/iso/arm_mount find ./ -name *.efi # 这样就找到了grubnetaa64.efi,将其放到 /var/tftp/arm_uefi 对应dhcpd.conf 中的filename cp ./boot/grub/arm64-efi/monolithic/grubnetaa64.efi /var/tftp/arm_uefi
-
Tftp:
sudo apt install dnsmasq
该工具支持dns、dhcp、tftp (dhcp配置有问题,所以没有采用它)查看
dnsmasq
打开tftp功能需修改配置文件/etc/dnsmasq.conf
# Enable dnsmasq's built-in TFTP server enable-tftp # Set the root directory for files available via FTP. tftp-root=/var/tftp # 手动新建该目录,该文件夹放一些引导文件和内核文件
重启
dnsmasq
服务:sudo systemctl restart dnsmasq
Dhcp讲了
/var/tftp/arm_uefi/grubnetaa64.efi
,除了efi
文件/var/tftp/arm_uefi
还需要vmlinuz
和initrd
这两个文件,同理在挂载后镜像中寻找.vmlinuz
和initrd
也是pc机器找到efi
后自动获取的,只需要到对应路径就可以了。这里解释一下为什么需要再创建一个
arm_uefi
呢?主要是为后期做铺垫,解决多架构、多镜像的问题。 -
NFS:
sudo apt-get install nfs-kernel-server
配置文件:
etc/exports
/var/nfs_tarzan *(rw,sync,no_subtree_check,no_root_squash) # 说明:/var/nfs_tarzan 是共享的路径,就是需要安装镜像的文件挂载后放到这里
这里说明一下拷贝镜像文件的时候一定要注意
./的隐藏文件
cp -r ~/iso/arm_mount/. /var/nfs_tarzan/kylin_arm
/kylin_arm
目录同理兼容多架构到这里后,我们需要告诉pc机器去来我们
/var/nfs_tarzan/kylin_arm
目录下面找镜像,该接口实在grub.cfg
中配置nfsroot=10.0.0.1:/var/nfs_tarzan/kylin_arm
-
-
引导文件:
-
bootloader 需要放到
tftp-root
所对应的路径中e.g./var/tftp
-
不同启动方式、不同架构都会导致bootloader 不同。
-
Legacy模式使用pxelinux.0引导,
-
UEFI模式使用BOOTAA64.EFI(ARM架构引导文件,但不适合麒麟桌面arm架构pxe),
-
x86为(BOOTX64.EFI)引导。
-
麒麟 桌面 arm 架构pxe引导文件
麒麟arm架构pxe引导文件在镜像解压后的:
/boot/grub/arm64-efi/monolithic/grubnetaa64.efi
-
-
-
grub.cfg文件
PC机器获取到
grubnetaa64.efi
文件后自动去找grub.cfg
文件。grub.cfg
文件路径是在编译grubnetaa64.efi
时候指定了grub.cfg
文件路径(基于/var/tftp的相对路径),请参考:编译efi麒麟桌面arm架构pxe 启动所需要的
grub.cfg
路径相对于/var/tftp
:/grub/grub.cfg
,绝对路径/var/tftp/grub/grub.cfg
.手动创建该文件。详细内容在文章末尾# grub.cfg 部分内容 menuentry 'Install Kylin V10 @ ARM64 UEFI Manually' --class red --class gnu-linux --class gnu --class os { linux /arm_uefi/vmlinuz boot=casper ip=dhcp rootwait ro locale=zh_CN netboot=nfs nfsroot=10.0.0.1:/var/nfs_tarzan/kylin_arm automatic initrd /arm_uefi/initrd.lz }
automatic
这个参数是无人值守自动安装的,配合ky-installer.cfg
文件使用。如果没有写automatic ,则
ky-installer.cfg` 不生效。 -
ky-installer.cfg
该文件存放到安装镜像的nfs
目录/var/nfs_tarzan/kylin_arm
该文件如何使用?在
grub.cfg
说添加automatic
参数自动读取完成无人值守安装,包括一些预装软件都可以。详细内容在文章末尾
配置
-
dhcp 配置
/etc/dhcp/dhcpd.conf
ddns-update-style interim; allow booting; allow bootp; ignore client-updates; set vendorclass = option vendor-class-identifier; option pxe-system-type code 93 = unsigned integer 16; subnet 10.0.0.1 netmask 255.255.255.0 { #配置要分配的地址段及netmask, 需要修改为自己的网段 option routers 10.0.0.1; #配置网关,如dhcp有问题,注意网关的配置 option domain-name-servers 223.5.5.5; #配置dns,也可配置自己内部的dns option subnet-mask 255.255.255.0; #配置netmask range dynamic-bootp 10.0.0.50 10.0.0.255; #分配的ip范围 default-lease-time 21600; #缺省租约时间 max-lease-time 43200; #最大租约时间 next-server 10.0.0.1; #指定引导装机的ip class "pxeclients" { match if substring (option vendor-class-identifier, 0, 9) = "PXEClient"; if option pxe-system-type = 00:07 { filename "amd_uefi/BOOTX64.EFI"; } else if option pxe-system-type = 00:09 { filename "amd_uefi/BOOTX64.EFI"; } else if option pxe-system-type = 00:0b { #arm服务器引导 filename "arm_uefi/grubnetaa64.efi"; } else { filename "pxelinux.0"; } } }
-
grup.cfg
insmod gzio set default=0 set timeout=5 set is_preload=false set color_normal=white/black set color_highlight=black/light-gray menuentry 'Install Kylin V10 @ ARM64 UEFI Manually' --class red --class gnu-linux --class gnu --class os { linux /arm_uefi/vmlinuz boot=casper ip=dhcp rootwait ro locale=zh_CN netboot=nfs nfsroot=10.0.0.1:/var/nfs_tarzan/kylin_arm automatic initrd /arm_uefi/initrd.lz }
-
无人值守 ky-installer.cfg
[Encrypty] # true开启加密,false 为关闭 encrypty=false # 加密密钥,如 qwer1234 encryptyPWD=@ByteArray(abcd@1234) # true开启lvm逻辑卷安装(不常用),false 为非逻辑卷安装(常用) lvm=false [config] # 自动登陆,0 为不自动登录 autologin=1 # 自动安装,不用改动 automatic-installation=1 # 全盘安装指定设备,默认为/dev/sda,若需指定安装设备,将/dev/sda替换成指定设备名即可; # (推荐)若不填磁盘设备名(将下面设备名/dev/sda去掉),系统会默认选择合适磁盘安装。默认磁盘优先级:先最大nvme盘,再最大固态sdX盘,最后最大机械sdX盘 devpath= # 使用 swapfile 替代swap分区,false 为不使用 swapfile,990/9A0 使用swapfile enable-swapfile=false # 出厂备份,0 为不出厂备份 factory-backup=0 # 主机名,仅包含字母、数字、下划线和连接符,长度不超过 64 hostname=kylin # 语言,默认为中文 language=zh_CN # 密码,默认为 qwer1234,至少 8 位,至少包含两类字符 password=qwer1234 #配置安装完成是否重启。1表示重启,0表示关机 reboot=1 # 时区,默认上海 timezone=Asia/Shanghai # 用户名、全名,小写字母开头,且仅包含字母、数字、下划线和短横线,长度不超过 32 username=kylin # 自动安装,不用改动 data-unformat=false # 预安装软件配置清单,软件包名用逗号分隔,前后不要使用引号 PreinstallApps=wps-office,rc-reader #以下主要用于自动安装的自定义分区和双系统需求,若无此需求,下面的配置无需改动 [custompartition] # true为开启pxe自动安装自定义分区,false为关闭。自定义安装不支持加密安装和逻辑卷分区安装。其中自动安装需要在grub.cfg中增加automatic参数 disk-custom=false # true为格式化整块磁盘,false为不格式化整块磁盘。不格式化磁盘主要用于安装第二个系统。 format-disk=true # 系统偏移安装。可以根据需要,对系统在磁盘的起始位置进行设置。单位为MB,默认为1MB,且最小不能小于1MB # 安装第二个系统时,需根据第一个系统占用磁盘大小,合理设置偏移安装的起始位置。 kos-start=1 # 自定义分区清单。请将所需的分区名称填入下面的双引号内,分区之间请用“;”隔开(双引号和“;”均为英文输入格式)。 # 下面分区的前后顺序,表示新装系统分区的顺序,可以根据需要进行调整。如下所示,efi、boot、root分别为系统的第一、二、三分区。 custom-partitions="efi;boot;root;backup;data;swap;" # 自定义分区设置格式。custom-XXX中XXX为上面自定义的分区名称。fs=分区格式;mount=挂载点;size=分区大小,单位为MB; # 请将分区格式、挂载点和大小填入下面的双引号内,之间用“;”隔开(双引号和“;”均为英文输入格式)。 custom-XXX="fs=***;mount=***;size=***;" # efi分区。默认格式为fat32; 挂载点为/boot/efi; 大小建议在0.5~2g之间,设置单位为MB; custom-efi="fs=fat32;mount=/boot/efi;size=1024;" # boot分区。默认格式为ext4; 挂载点为/boot; 大小建议在0.5~2g之间,设置单位为MB; custom-boot="fs=ext4;mount=/boot;size=1024;" # 系统根分区。默认格式为ext4; 挂载点为/; 大小,建议不小于25g,设置单位为MB; custom-root="fs=ext4;mount=/;size=40980;" # backup分区。默认格式为ext4; 挂载点为/backup; 大小设置单位为MB; custom-backup="fs=ext4;mount=/backup;size=20480;" # data分区。默认格式为ext4; 挂载点为/data; 大小设置单位为MB; custom-data="fs=ext4;mount=/data;size=10240;" # swap分区。默认格式为linux-swap; 挂载点为[swap]; 大小,建议不小于内存大小的1.2倍。如8g内存的机器,建议不小于8.8g,设置单位为MB; custom-swap="fs=linux-swap;mount=[swap];size=10240;" # 自动安装,下面的配置不用改动 bootloader=/dev/sda ATA ST1000DM003-1SB1 partitions="/boot/efi:/dev/sda1;/:/dev/sda7;linux-swap:/dev/sda5;" [setting] EnableSwap=false FileSystem="ext4;ext3;fat32;xfs;btrfs;kylin-data;efi;linux-swap;unused" FileSystemBoot="ext4;vfat" PartitionMountedPoints=";/;/boot;/backup;/tmp"
Tips
-
查看tftp 日志信息:
tail -f -n 1000000 /var/log/syslog |grep dnsmasq-tftp
-
每个服务搭建好了之后一定要手动测试一下,不要直接用pc机器就开始。
-
完整的流程来自
chat gpt
的回答+---------------------------------------------------+ | Power On | +---------------------------------------------------+ | v +---------------------------------------------------+ | BIOS/UEFI Initialization and POST | +---------------------------------------------------+ | v +---------------------------------------------------+ | PXE Option ROM Initialization | +---------------------------------------------------+ | v +---------------------------------------------------+ | Network Initialization and DHCP | +---------------------------------------------------+ | v +---------------------------------------------------+ | DHCP Discover and Offer | +---------------------------------------------------+ | v +---------------------------------------------------+ | DHCP Request and Acknowledge | +---------------------------------------------------+ | v +---------------------------------------------------+ | TFTP Download of PXE Bootloader | +---------------------------------------------------+ | v +---------------------------------------------------+ | Execute PXE Bootloader (e.g., iPXE) | +---------------------------------------------------+ | v +---------------------------------------------------+ | Load and Execute Boot Menu or Configuration | +---------------------------------------------------+ | v +---------------------------------------------------+ | Load and Boot OS Kernel | +---------------------------------------------------+ | v +---------------------------------------------------+ | OS Initialization and Boot | +---------------------------------------------------+