需求:同时批量自动化安装Kylin-Server-V10 ARM64 和 LoongArch64版本操作系统,避免光盘缓慢的逐个安装
先基于Kylin-Server-V10 ARM64安装一台系统,然后作为PXE服务器提供安装所需要的软件和服务,iso挂载到/mnt下:
mount -o loop Kylin-Server-V10-GFB-Release-2204-Build03-ARM64.iso /mnt/
然后配置本地源:
vim /etc/yum.repos.d/kylin_aarch64.repo
###Kylin Linux Advanced Server 10 - os repo###
[ks10-adv-cdrom]
name = Kylin Linux Advanced Server 10 - cdrom
baseurl = file:///mnt
gpgcheck = 0
安装软件包tftp xinetd tftp-server vsftpd
yum -y install xinetd dhcp tftp-server vsftpd
此处采用vsftpd作为存储镜像,后期云平台WEB需要用httpd,确保二者可共存
修改dhcp配置文件,ipv4的编辑/etc/dhcp/dhcpd.conf,如下:
#
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp-server/dhcpd.conf.example
# see dhcpd.conf(5) man page
#
ddns-update-style interim;
ignore client-updates;
authoritative;
allow booting;
allow bootp;
allow unknown-clients;
default-lease-time 21600;
max-lease-time 43200;
option pxe-system-type code 93 = unsigned integer 16;
# internal subnet for my DHCP Server
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.101 192.168.0.200;
option domain-name-servers 223.5.5.5;
option routers 255.255.255.0;
option broadcast-address 192.168.0.255;
# IP of PXE Server
next-server 192.168.0.10;
if substring(option vendor-class-identifier, 0, 9) = "PXEClient" {
if option pxe-system-type = 00:07 or pxe-system-type = 00:09 {
filename "/X64/BOOTX64.EFI";
} else if option pxe-system-type = 00:0b {
filename "/ARM64/grubaa64.efi";
} else if option pxe-system-type = 00:27 {
filename "/LoongArch64/grubloongarch64.efi";
}
}
# filename "/ARM64/grubaa64.efi";
# filename "/LoongArch64/grubloongarch64.efi";
}
配置完成后,重启服务systemctl restart dhcpd
通过pxe-system-type选项可以指定x64、ARM64和LoongArch64使用不同的引导文件,07和09为x64 UEFI;0b为ARM UEFI;27为LoongArch64的UEFI。
在客户端下租约文件在/var/lib/dhclient/dhclient.leases;在服务器端的租约文件在/var/lib/dhcpd/dhcpd.leases,pxe-system-type可以通过查看/var/lib/dhcpd/dhcpd.leases获取,如下:
lease 192.168.0.101 {
starts 4 2022/08/25 01:47:58;
ends 4 2022/08/25 07:47:58;
tstp 4 2022/08/25 07:47:58;
cltt 4 2022/08/25 01:47:58;
binding state free;
hardware ethernet 52:54:00:ed:b5:77;
uid "\000\302\020eO\302\300\316K\207y\321\355\205\331\327\016";
set vendor-class-identifier = "PXEClient:Arch:00011:UNDI:003000";
}
lease 192.168.0.103 {
starts 4 2022/08/25 01:48:38;
ends 4 2022/08/25 07:48:38;
tstp 4 2022/08/25 07:48:38;
cltt 4 2022/08/25 02:16:44;
binding state free;
hardware ethernet 52:54:00:b4:6e:8d;
uid "\0007\301\254\201yCAA\237\033\323~z\305\316\312";
set vendor-class-identifier = "PXEClient:Arch:00039:UNDI:003000";
}
其中PXEClient:Arch:00039是通过十进制显示,需要转成成十六进制写入/etc/dhcp/dhcpd.conf pxe-system-type字段指定。
在ARM64下,ISO中的BOOTAA64.EFI和grubaa64.efi是一样的,任选其中之一即可,在LoongArch64下ISO里面自带的BOOTLOONGARCH.EFI存在问题,需要替换为自己编译的grubloongarch64.efi。
配置文件主要参数介绍:
option domain-name "example.org"; //指定网域的域名
option domain-name-servers ns1.example.org, ns2.example.org; //指定域名解析服务器(DNS)的ip地址。
default-lease-time 600; //默认租约时间,单位为s
max-lease-time 7200; //最大租约时间,单位为s。过期续约,续约直接发送request包即可。
log-facility local7; //日志设备类型为local7.一般日志设备类型包括mail、crontab。通过此选项可以找到该服务的日志记录路径
subnet 192.168.0.0 netmask 255.255.255.0 { //指定分配网段的ip地址以及子网掩码,括号内部为局部配置。
range 192.168.0.101 192.168.0.200; //可使用的地址池范围
option domain-name-servers ns1.internal.example.org; //该网段的域名,可以省略
option domain-name "internal.example.org"; //网段DNS
option routers 255.255.255.0; //指定网关
option broadcast-address 192.168.0.255; //指定广播地址
default-lease-time 600; //租约时间
max-lease-time 7200; //最大租约时间。
}
绑定MAC地址和IP,如下:
host compute1{
hardware ethernet 2C:97:B1:C7:F3:6A;
fixed-address 192.168.0.101;
}
host compute2{
hardware ethernet b8:59:9f:bd:f7:92;
fixed-address 192.168.0.102;
}
修改TFTP配置文件,将disable改为no即可。默认情况下TFTP服务是禁用的编辑文件/etc/xinetd.d/tftp如下:
# default: off
# description: The tftp server serves files using the trivial file transfer \
# protocol. The tftp protocol is often used to boot diskless \
# workstations, download configuration files to network-aware printers, \
# and to start the installation process for some operating systems.
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
拷贝ARM64镜像引导文件:
mkdir -p /var/lib/tftpboot/ARM64
cp -av /mnt/images/pxeboot/* /var/lib/tftpboot/ARM64
cp -av /mnt/EFI/BOOT/grub*.efi /var/lib/tftpboot/ARM64
cp -av /mnt/EFI/BOOT/*.EFI /var/lib/tftpboot/ARM64
拷贝LoongArch64镜像引导文件:
mkdir -p /var/lib/tftpboot/LoongArch64
cp -av /mnt/images/pxeboot/* /var/lib/tftpboot/LoongArch64
cp -av /mnt/EFI/BOOT/*.EFI /var/lib/tftpboot/LoongArch64
cp -av grubloongarch64.efi /var/lib/tftpboot/LoongArch64
由于LoongArch64 grubloongarch64.efi仅支持80MB以内的引导文件,initrd文件过大(超过了80MB),报error: out of memory,通过解压重新用算法lzma压缩后小于80MB,如下:
mkdir initrd
cp initrd.img initrd/
cd initrd/
mv initrd.img initrd.xz
xz -d initrd.xz
cat initrd | cpio -idmv
rm -rf initrd
find . 2>/dev/null | cpio -o -c | xz -9 --format=lzma > ../initrd.img
关闭防火墙,SELINUX:
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
重启服务:
systemctl restart xinetd
systemctl restart tftp
验证tftp是否正常下载:
tftp 192.168.0.10
tftp> get ARM64/grubaa64.efi
tftp> quit
然后查看是否下载,成功下载说明tftp配置正常。
将ARM64 ISO镜像所有文件拷贝至vsftpd服务器:
mkdir /var/ftp/pub/Kylin-Server-V10-ARM64
cd /mnt
cp -rv * /var/ftp/pub/Kylin-Server-V10-ARM64
cp .discinfo .kyinfo .kylin-ks.cfg .kylin-post-actions .kylin-post-actions-nochroot .productinfo .treeinfo /var/ftp/pub/Kylin-Server-V10-ARM64
将LoongArch64ISO镜像所有文件拷贝至vsftpd服务器:
mkdir /var/ftp/pub/Kylin-Server-V10-LoongArch64
cd /mnt
cp -rv * /var/ftp/pub/Kylin-Server-V10-LoongArch64
cp .discinfo .kyinfo .kylin-ks.cfg .kylin-post-actions .treeinfo /var/ftp/pub/Kylin-Server-V10-LoongArch64
修改vsftpd配置文件,编辑/etc/vsftpd/vsftpd.conf,修改如下:
anonymous_enable=YES
这里我们仅需要开启匿名访问即可,其他的高级参数暂且不用,若有需要可以参考参考文献中的链接。
重启服务:
systemctl restart vsftpd
systemctl enable vsftpd
通过浏览器输入ftp://192.168.0.10/pub可以匿名正常访问,且点击文件可以正常查看或者下载,说明vsftpd配置正常。
ARM64的在/var/ftp/pub/Kylin-Server-V10-ARM64/目录下,已经有一份.kylin-ks.cfg,重命名为kylin-ks.cfg,略作修改,内容如下:
#version=DEVEL
# Use graphical install
# 安装时使用图形化安装,亦可采用字符界面text
graphical
# 设置安装系统
install
# 设置安装源
url --url=ftp://192.168.0.10/pub/Kylin-Server-V10-ARM64
# Keyboard layouts
# 设置键盘布局为cn
keyboard --vckeymap=cn --xlayouts='cn'
# System language
# 设置系统语言
lang zh_CN.UTF-8
# Network information
# 设置网卡和主机名等信息
network --bootproto=dhcp
network --hostname=localhost.localdomain
# Root password
# 设置root密码,根据实际情况变更密码
rootpw --plaintext ******
# X Window System configuration information
xconfig --startxonboot
# Run the Setup Agent on first boot
# 系统第一次引导时,启动"设置代理"。需要安装额外的工具包,关闭即可
firstboot --disable
# 关闭selinux
selinux --disabled
# 关闭防火墙
firewall --disabled
# System services
# 启用chrony来同步时间
services --enabled="chronyd"
# 安装完成后自动重启
reboot
# System timezone
# 设置时区
timezone Asia/Shanghai --isUtc
# 自动寻找磁盘进行系统安装
# 删除硬盘上的所有分区并初始化磁盘标签
%include /tmp/partition
%pre
# pick first drive that is not removable
SYS_DIR="/sys/block"
ROOT_DRIVE=""
# sd: SCSI disk
# hd: IDE disk
# vd: virtio disk
for dev in $SYS_DIR/sd? $SYS_DIR/hd? $SYS_DIR/vd?
do
if [ -d $dev ]; then
REMOVABLE=$(cat $dev/removable)
if [ "$REMOVABLE" = "0" ]; then
ROOT_DRIVE=${dev##*/}
break
fi
fi
done
# if there is no non-removable drive, pick the first drive that
# is not the installation media
if [ "$ROOT_DRIVE" = "" ]; then
REPO=$(mount | grep "/run/install/repo" | awk '{print $1}')
for dev in /dev/sd? /dev/hd? /dev/vd?
do
if ! [[ $REPO =~ ${dev}[0-9]+ ]]; then
ROOT_DRIVE=${dev##*/}
break
fi
done
fi
cat << EOF > /tmp/partition
ignoredisk --only-use=$ROOT_DRIVE
autopart --type=lvm
clearpart --all --initlabel --drives=$ROOT_DRIVE
EOF
%end
%post
systemctl disable systemd-networkd-wait-online.service
systemctl disable multipathd.service
systemctl disable libvirtd.service
#####copy kyinfo and LICENSE
wget ftp://192.168.0.10/pub/Kylin-Server-V10-ARM64/.kyinfo --random-wait --directory-prefix /etc/
wget ftp://192.168.0.10/pub/Kylin-Server-V10-ARM64/LICENSE --random-wait --directory-prefix /etc/
## copy kylin post scripts in new os, do kylin post action
wget ftp://192.168.0.10/pub/Kylin-Server-V10-ARM64/.kylin-post-actions --random-wait --directory-prefix /bin
/bin/bash -x /bin/.kylin-post-actions &> /var/log/.kylin-post-actions.log
## copy and run .kylin-post-actions-nochroot
wget ftp://192.168.0.10/pub/Kylin-Server-V10-ARM64/.kylin-post-actions-nochroot --random-wait --directory-prefix /tmp
/bin/bash -x /tmp/.kylin-post-actions-nochroot &> /var/log/.kylin-post-actions-nochroot.log
# 配置ssh无密码登陆
mkdir -p /root/.ssh/
cat > /root/.ssh/id_rsa << EOF
******
EOF
cat > /root/.ssh/id_rsa.pub << EOF
******
EOF
cat > /root/.ssh/authorized_keys << EOF
******
EOF
chmod 600 /root/.ssh/id_rsa
chmod 600 /root/.ssh/authorized_keys
%end
# Environment groups,通过repodata/xxxxxxxxxx-comps.xml可以查看
# minimal-environment 最小安装
# minimal-desktop-environment 最小图形系统
# server-product-environment 基础服务器
# kylin-desktop-environment 工作站(带有用于配置服务和开发的 UKUI GUI 的服务器。)
%packages
@^kylin-desktop-environment
kexec-tools
# 添加需要安装的包
wget
%end
%addon com_redhat_kdump --disable --reserve-mb='auto'
%end
%anaconda
pwpolicy root --minlen=8 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=8 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=8 --minquality=1 --notstrict --nochanges --notempty
%end
LoongArch64的在/var/ftp/pub/Kylin-Server-V10-LoongArch64/目录下,已经有一份.kylin-ks.cfg,重命名为kylin-ks.cfg,略作修改,内容如下:
#version=DEVEL
# Use graphical install
# 安装时使用图形化安装,亦可采用字符界面text
graphical
# 设置安装系统
install
# 设置安装源
url --url=ftp://192.168.0.10/pub/Kylin-Server-V10-LoongArch64
# Keyboard layouts
# 设置键盘布局为cn
keyboard --vckeymap=cn --xlayouts='cn'
# System language
# 设置系统语言
lang zh_CN.UTF-8
# Network information
# 设置网卡和主机名等信息
network --bootproto=dhcp
network --hostname=localhost.localdomain
# Root password
# 设置root密码
rootpw --plaintext ******
# X Window System configuration information
xconfig --startxonboot
# Run the Setup Agent on first boot
# 系统第一次引导时,启动"设置代理"。需要安装额外的工具包,关闭即可
firstboot --disable
# 关闭selinux
selinux --disabled
# 关闭防火墙
firewall --disabled
# System services
# 启用chrony来同步时间
services --enabled="chronyd"
# 安装完成后自动重启
reboot
# System timezone
# 设置时区
timezone Asia/Shanghai --isUtc
# 自动寻找磁盘进行系统安装
# 删除硬盘上的所有分区并初始化磁盘标签
%include /tmp/partition
%pre
# pick first drive that is not removable
SYS_DIR="/sys/block"
ROOT_DRIVE=""
# sd: SCSI disk
# hd: IDE disk
# vd: virtio disk
for dev in $SYS_DIR/sd? $SYS_DIR/hd? $SYS_DIR/vd?
do
if [ -d $dev ]; then
REMOVABLE=$(cat $dev/removable)
if [ "$REMOVABLE" = "0" ]; then
ROOT_DRIVE=${dev##*/}
break
fi
fi
done
# if there is no non-removable drive, pick the first drive that
# is not the installation media
if [ "$ROOT_DRIVE" = "" ]; then
REPO=$(mount | grep "/run/install/repo" | awk '{print $1}')
for dev in /dev/sd? /dev/hd? /dev/vd?
do
if ! [[ $REPO =~ ${dev}[0-9]+ ]]; then
ROOT_DRIVE=${dev##*/}
break
fi
done
fi
cat << EOF > /tmp/partition
ignoredisk --only-use=$ROOT_DRIVE
autopart --type=lvm
clearpart --all --initlabel --drives=$ROOT_DRIVE
EOF
%end
%post
systemctl disable systemd-networkd-wait-online.service
systemctl disable multipathd.service
systemctl disable libvirtd.service
systemctl disable iscsi.service
systemctl disable iscsid.socket
#####copy kyinfo and LICENSE
wget ftp://192.168.0.10/pub/Kylin-Server-V10-LoongArch64/.kyinfo --random-wait --directory-prefix /etc/
wget ftp://192.168.0.10/pub/Kylin-Server-V10-LoongArch64/LICENSE --random-wait --directory-prefix /etc/
## copy kylin post scripts in new os, do kylin post action
wget ftp://192.168.0.10/pub/Kylin-Server-V10-LoongArch64/.kylin-post-actions --random-wait --directory-prefix /bin
/bin/bash -x /bin/.kylin-post-actions &> /var/log/.kylin-post-actions.log
## copy and run .kylin-post-actions-nochroot
wget ftp://192.168.0.10/pub/Kylin-Server-V10-LoongArch64/.kylin-post-actions-nochroot --random-wait --directory-prefix /tmp
/bin/bash -x /tmp/.kylin-post-actions-nochroot &> /var/log/.kylin-post-actions-nochroot.log
# 配置ssh无密码登陆
mkdir -p /root/.ssh/
cat > /root/.ssh/id_rsa << EOF
******
EOF
cat > /root/.ssh/id_rsa.pub << EOF
******
EOF
cat > /root/.ssh/authorized_keys << EOF
******
EOF
chmod 600 /root/.ssh/id_rsa
chmod 600 /root/.ssh/authorized_keys
%end
# Environment groups,通过repodata/xxxxxxxxxx-comps.xml可以查看
# minimal-environment 最小安装
# minimal-desktop-environment 最小图形系统
# server-product-environment 基础服务器
# kylin-desktop-environment 工作站(带有用于配置服务和开发的 UKUI GUI 的服务器。)
%packages
@^kylin-desktop-environment
kexec-tools
# 添加需要安装的包
wget
%end
%addon com_redhat_kdump --disable --reserve-mb='auto'
%end
%anaconda
pwpolicy root --minlen=8 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=8 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=8 --minquality=1 --notstrict --nochanges --notempty
%end
若通过python库调用的话,这里面涉及的ssh key需要转换下格式:ssh-keygen -p -m PEM -f ~/.ssh/id_rsa或者生成key时添加-m PEM,ssh-keygen -m PEM -t rsa
手动分区如下:
# 清除硬盘分区表
zerombr
# 删除硬盘上的所有分区并初始化磁盘标签
clearpart --all --initlabel
#UEFI引导,必须指定efi分区且分区的类型必须是efi,挂载到/boot/efi
#size的单位: M --fstype是指定文件系统类型,例如:ext4、xfs
part /boot/efi --fstype="efi" --ondisk=sda --size=1024 --fsoptions="defaults,uid=0,gid=0,umask=0077,shortname=winnt"
part /boot --fstype="ext4" --size=1024
part swap --fstype="swap" --size=8192
part / --fstype="xfs" --size=102400
# 分区使用全部空闲磁盘空间,如下
# part / --fstype="xfs" --grow --size=1
#基于LVM分区
part /boot/efi --fstype="efi" --ondisk=sda --size=1024 --fsoptions="defaults,uid=0,gid=0,umask=0077,shortname=winnt"
part /boot --fstype="ext4" --size=1024
part klas --size=1 --grow
volgroup klas00 klas
logvol swap --vgname=swap --size=8192 --fstype="swap" --name=swap
logvol / --vgname=root --size=1 --grow --fstype="xfs" --name=root
ARM64的grub编辑/var/lib/tftpboot/ARM64/grub.cfg,可参考EFI/BOOT/grub.cfg的内容,修改如下:
set default="0"
function load_video {
if [ x$feature_all_video_module = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi
}
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
set timeout=10
### END /etc/grub.d/00_header ###
search --no-floppy --set=root -l 'KYLIN10-SVR'
### BEGIN /etc/grub.d/10_linux ###
menuentry 'Install Kylin Linux Advanced Server V10 ARM64 From Network' --class red --class gnu-linux --class gnu --class os {
set root=(tftp,192.168.0.10)
linux /ARM64/vmlinuz inst.ks=ftp://192.168.0.10/pub/Kylin-Server-V10-ARM64/kylin-ks.cfg ro console=tty0 console=ttyS0,11520
initrd /ARM64/initrd.img
}
menuentry "Kylin Linux Advanced Server V10 ARM64 From Disk" {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod xfs
set root='hd0,gpt2'
linux /vmlinuz-4.19.90-25.10.v2101.ky10.aarch64 root=/dev/mapper/klas-root ro rd.lvm.lv=klas/root rd.lvm.lv=klas/swap console=tty0 console=ttyS0,11520
initrd /initramfs-4.19.90-25.10.v2101.ky10.aarch64.img
}
LoongArch64的grub编辑/var/lib/tftpboot/LoongArch64/grub.cfg,可参考EFI/BOOT/grub.cfg的内容,修改如下:
set default="0"
function load_video {
if [ x$feature_all_video_module = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi
}
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
set timeout=10
### END /etc/grub.d/00_header ###
search --no-floppy --set=root -l 'KYLIN10-SVR'
### BEGIN /etc/grub.d/10_linux ###
menuentry 'Install Kylin Linux Advanced Server V10 LoongArch64 From Network' --class red --class gnu-linux --class gnu --class os {
set root=(tftp,192.168.0.10)
linux /LoongArch64/vmlinuz inst.ks=ftp://192.168.0.10/pub/Kylin-Server-V10-LoongArch64/kylin-ks.cfg ro console=tty0 console=ttyS0,11520
initrd /LoongArch64/initrd.img.new
}
menuentry "Kylin Linux Advanced Server V10 LoongArch64 From Disk" {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
set root='hd0,gpt2'
echo 'Loading Linux 4.19.90-23.19.v2101.a.ky10.loongarch64 ...'
linux /vmlinuz-4.19.90-23.19.v2101.a.ky10.loongarch64 root=/dev/mapper/klas-root ro rd.lvm.lv=klas/root rd.lvm.lv=klas/swap console=ttyS0,11520 quiet
echo 'Loading initial ramdisk ...'
initrd /initramfs-4.19.90-23.19.v2101.a.ky10.loongarch64.img
}
服务器启动选择通过网络启动安装(一般按F12选择网络引导)即可,如下图进入网络安装界面:
ARM64:
systemctl status dhcpd
● dhcpd.service - DHCPv4 Server Daemon
Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; disabled; vendor preset: disabled)
Active: active (running) since Tue 2022-08-02 08:53:18 CST; 4s ago
Docs: man:dhcpd(8)
man:dhcpd.conf(5)
Main PID: 3779296 (dhcpd)
Status: "Dispatching packets..."
Tasks: 1
Memory: 13.7M
CGroup: /system.slice/dhcpd.service
└─3779296 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid
8月 02 08:53:18 controller1 dhcpd[3779296]:
8月 02 08:53:18 controller1 dhcpd[3779296]:
8月 02 08:53:18 controller1 dhcpd[3779296]: No subnet declaration for enp6s0f0 (172.19.0.10).
8月 02 08:53:18 controller1 dhcpd[3779296]: ** Ignoring requests on enp6s0f0. If this is not what
8月 02 08:53:18 controller1 dhcpd[3779296]: you want, please write a subnet declaration
8月 02 08:53:18 controller1 dhcpd[3779296]: in your dhcpd.conf file for the network segment
8月 02 08:53:18 controller1 dhcpd[3779296]: to which interface enp6s0f0 is attached. **
8月 02 08:53:18 controller1 dhcpd[3779296]:
8月 02 08:53:18 controller1 dhcpd[3779296]: Sending on Socket/fallback/fallback-net
8月 02 08:53:18 controller1 dhcpd[3779296]: Server starting service.
物理机拥有多个带地址网卡引起的,配置dhcp所用的网卡即可,解决方案如下:
vim /etc/sysconfig/dhcpd
DHCPDARGS=enp4s0f0
https://www.cnblogs.com/easonscx/p/10724742.html
https://bbs.huaweicloud.com/forum/thread-64622-1-1.html
https://blog.51cto.com/u_14442495/2905867
https://blog.csdn.net/aiynmimi/article/details/77012507
https://www.cpci.dev/pxe-the-batch-deployment/