前几天又到了一批新测试机。这批机器里,一部分要给老业务跑 CentOS 7,一部分要装 CentOS 8 当新环境。要是一台台插 U 盘,光是刻盘、改启动顺序、盯着安装界面就能耗掉一整天。所以这次我直接在一台 CentOS 8 服务器上把 PXE 自动化安装环境搭了起来:DHCP、TFTP、HTTP 三个服务协同,同一套引导菜单里同时提供 CentOS 7 和 CentOS 8 两个入口,网卡一引导就能自动进入安装。本文记录这套环境的完整搭建过程、每一份关键配置,以及我实测中踩过的坑和排错思路。无论你是刚接触网络装机,还是已经在用 PXE 的老手,这套双系统共存的方案应该都能给你一些参考。
1. 先搞懂PXE的完整链路,再动手不迟
1.1 PXE装机到底分几步走
PXE 本质上不是一个工具,而是一套协议组合。很多人配置半天没成功,就是因为它涉及的服务太多,搞不清每一段到底是谁在干活。我习惯把它拆成四个阶段来理解。
第一阶段是 DHCP 发现。客户端开机的瞬间,网卡固件向网络广播“我需要一个 IP”,DHCP 服务不仅要回 IP,还要顺带告诉它两个关键信息:引导文件叫什么名字(filename),以及去哪里下载这个文件(next-server)。
第二阶段是 TFTP 下载。客户端拿到地址后,通过 TFTP 协议从 next-server 下载引导程序。传统 BIOS 机器拿到的是 pxelinux.0,它相当于一个小型操作系统,负责后续的加载流程。pxelinux.0 会继续去寻找它的配置文件,默认是 pxelinux.cfg/default,也支持按 MAC 或 IP 匹配专属配置,后面批量自动化会用到这个特性。
第三阶段是内核加载。配置菜单里写了 vmlinuz 和 initrd.img 的路径,pxelinux.0 会把这两个文件从 TFTP 服务下载下来,然后启动内核。注意,这个阶段客户端其实还没有完整的安装环境,它只是把安装器的内核和内存盘拉了起来。
第四阶段才是真正开始“装系统”。内核起来后运行的 anaconda 安装器,会从 pre-defined 的 HTTP 地址拉取安装源(repo)和应答文件(ks.cfg)。repo 是软件包仓库,ks.cfg 是我们的自动化安装剧本。
用生活化的类比就是:DHCP 像是一个前台接待,它告诉你怎么走;TFTP 像是传菜员,它只送菜单和餐前小菜;HTTP 才是真正的厨房,不管是 CentOS 7 还是 CentOS 8 的“食材”都从这里出。搞明白这张分工图,后面排错就是按图索骥。
1.2 为什么我选“dnsmasq + nginx”这个组合
我见过不少教程推荐用 isc-dhcp-server + tftp-server + httpd 三个独立服务来搭。这套组合当然没问题,但配置分散在三四个配置文件里,哪一环挂了都得单独查。这次我做双系统共存,不想为这种事情分心,所以选了 dnsmasq + nginx。
dnsmasq 一个进程同时搞定 DHCP 和 TFTP。它在小规模内网里非常常见,配置文件语法简单,还内置了 tftp 服务。配合 nginx 做静态文件服务,装机和提供安装源都足够稳定。相比 httpd,nginx 配置更短,对静态文件的支持也毫不含糊。
如果你已经有生产级 DHCP 服务器在运行,不想动它,那完全可以只保留现有的 DHCP,把 dnsmasq 里的 DHCP 关掉,只开 TFTP,这也是可行的。但要注意别让两个 DHCP 服务在同一个网段互相打架,否则客户端收到的 IP 很混乱,PXE 也起不来。
1.3 网络和目录规划,动工前的关键表格
在一条命令都没执行之前,我先把整个环境的地址和目录规划清楚。这次使用的环境是纯内网,服务端 IP 固定在 192.168.1.10,客户端和它处在同一个二层网段。
| 角色 | 协议/端口 | 服务 | 值/位置 |
|---|---|---|---|
| DHCP/TFTP | 67/udp、69/udp | dnsmasq | 地址池 192.168.1.100 - 200 |
| HTTP 镜像站 | 80/tcp | nginx | 根目录 /data/pxe |
| CentOS 7 安装源 | HTTP | ISO 挂载 | /data/pxe/centos/7 |
| CentOS 8 安装源 | HTTP | ISO 挂载 | /data/pxe/centos/8 |
| 应答文件 | HTTP | nginx | /data/pxe/ks/ |
| TFTP 根 | 69/udp | dnsmasq | /var/lib/tftpboot |
这里多数读者容易忽略的是:TFTP 根目录和 HTTP 根目录是两套东西。TFTP 里放的是引导文件和内核,HTTP 里放的是安装镜像和 ks。两个根不要混在一起,不然你会在“明明文件存在,却加载不到”的诡异问题里浪费很久。
2. 服务端搭建:DHCP/TFTP/HTTP一次跑通
2.1 安装软件包,先避开 syslinux 这个坑
在 CentOS 8 上装包的指令很直接:
dnf install -y dnsmasq nginx这里有个坑必须提前说:网上很多老教程会让你yum install syslinux,但 CentOS 8 默认仓库里已经没有 syslinux 了,直接执行大概率会得到“Unable to find a match”的报错。pxelinux.0 这个关键的引导文件就来自 syslinux 包,所以你还需要先用 EPEL 把它的仓库补上:
dnf install -y epel-release dnf install -y syslinux安装完成后,确认这几个文件是否就位:
ls -l /usr/share/syslinux/pxelinux.0 /usr/share/syslinux/vesamenu.c32另外,CentOS 8 默认没有现成的 /var/lib/tftpboot 目录,需要自己创建,后续 dnsmasq 的 tftp-root 就指向这里。
2.2 dnsmasq 配置逐行拆解
我最推荐的写法是直接把配置追加到 /etc/dnsmasq.conf 末尾。这样最省心,不用去考虑 conf-dir 是否生效的问题。内容如下:
# 局域网内已有其他 DNS 服务时,可以加 port=0 禁用 dnsmasq 的 DNS # port=0 # 指定 DHCP 地址池和租期,12h 足够一次安装 dhcp-range=192.168.1.100,192.168.1.200,12h # 给客户端分配的网关与 DNS dhcp-option=option:router,192.168.1.1 dhcp-option=option:dns-server,192.168.1.10 # 关键:告诉客户端引导文件名和 TFTP 服务端地址 dhcp-boot=pxelinux.0,192.168.1.10 # 开启内嵌 TFTP,并指定根目录 enable-tftp tftp-root=/var/lib/tftpboot解释几个容易踩坑的点。
dhcp-boot=pxelinux.0,192.168.1.10这里的第二个参数是 next-server 地址,也就是客户端去哪个服务器下载引导文件。如果你的客户端显示“TFTP open timeout”,一半以上的情况是这里没写对或防火墙把 69 端口挡了。
TFTP 根目录默认路径是 /var/lib/tftpboot,这不是我随手选的。CentOS 8 的 SELinux 对这个路径有内置的访问策略,dnsmasq 去读它比较顺畅。如果你换成自定义路径,后面还要额外处理 SELinux 类型,白白增加工作量。
配置写完后,用下面的命令检查语法并启动:
dnsmasq --test systemctl enable --now dnsmasq如果启动失败,第一时间看 journalctl -u dnsmasq,错误信息一般都会提示具体行号。
2.3 nginx 镜像站与 ISO 挂载
把安装镜像放到 HTTP 服务下之前,需要先挂载 ISO。我习惯在 /data/iso 下保存原始镜像文件,然后统一用 loop 方式挂载到 HTTP 根目录:
mkdir -p /data/iso /data/pxe/centos/7 /data/pxe/centos/8 mount -o loop,ro /data/iso/CentOS-7-x86_64-DVD.iso /data/pxe/centos/7 mount -o loop,ro /data/iso/CentOS-8.5.2111-x86_64-dvd1.iso /data/pxe/centos/8注意看两个镜像内部的目录结构,这是双系统共存方案的难点之一。CentOS 7 的 DVD 根目录下直接就是 Packages 和 repodata,所以 HTTP 源直接指到 /data/pxe/centos/7 就能用。CentOS 8 的 DVD 根目录下没有独立的 repodata,而是把软件仓库拆成了 BaseOS 和 AppStream 两个子目录。也就是说,CentOS 8 的安装源必须精确指向 /data/pxe/centos/8/BaseOS/x86_64/os/ 这一层,AppStream 需要单独在 ks 里再声明一次。
nginx 的配置很简单,一个 server 块就够:
server { listen 80; server_name _; root /data/pxe; autoindex on; charset utf-8; }autoindex on是为了调试方便。装到一半发现找不到镜像源时,直接在浏览器里打开 http://192.168.1.10/centos/8/BaseOS/x86_64/os/ 就能看到目录结构,问题出在哪一目了然。
光挂载不够,重启后这些 loop 挂载会丢失。我一般把挂载命令写进一个脚本,再交给 systemd 来管理,或者直接写进 /etc/fstab。如果你选择 fstab,示例是:
/data/iso/CentOS-7-x86_64-DVD.iso /data/pxe/centos/7 iso9660 loop,ro 0 0 /data/iso/CentOS-8.5.2111-x86_64-dvd1.iso /data/pxe/centos/8 iso9660 loop,ro 0 0注意文件名必须和实际完全一致,否则重启后镜像源就“消失”了,到时候排查起来很痛苦。
2.4 Firewalld 和 SELinux 两个拦路虎
服务都装好后,火墙和 SELinux 是很多人最终被卡住的地方。CentOS 8 默认 firewalld 是开启的,需要放行三个服务:
firewall-cmd --permanent --add-service=dhcp firewall-cmd --permanent --add-service=tftp firewall-cmd --permanent --add-service=http firewall-cmd --reloadfirewalld 的 tftp 服务默认对应 69/udp,并且它预置的规则对 /var/lib/tftpboot 目录的开场是友好的,这也是我坚持用默认 TFTP 根的原因。
SELinux 方面,如果 HTTP 根目录用的是自定义路径,需要显式把目录标记为 Web 服务可读:
chcon -R -t httpd_sys_content_t /data/pxe如果要让这个标记在重启后依然生效,用 semanage 写入持久化规则:
semanage fcontext -a -t httpd_sys_content_t "/data/pxe(/.*)?" restorecon -Rv /data/pxe如果安装过这些命令但 semanage 提示不存在,先dnf install -y policycoreutils-python-utils。一旦 SELinux 拦截,别急着一下把 enforcing 关掉,先看审计日志:
grep avc /var/log/audit/audit.log | tail -20看到类似 denied 的记录,再结合是哪个进程被拦,基本就知道是目录标记还是端口策略的问题。
3. 两代系统共存的PXE引导目录与启动菜单
3.1 引导文件从哪里来
PXE 引导的第一步是下载 pxelinux.0,但这个文件单独一个还不行,它还需要一堆配套的 .c32 模块,特别是菜单界面需要的 vesamenu.c32。缺了这些,客户端可能会停在黑屏或者直接报错找不到文件。
把需要的文件一次性复制到 TFTP 根目录:
mkdir -p /var/lib/tftpboot/pxelinux.cfg cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/ cp /usr/share/syslinux/*.c32 /var/lib/tftpboot/然后从两个 ISO 里拷贝内核和内存盘。注意路径差异:CentOS 7 的 vmlinuz 和 initrd.img 通常位于 ISO 的 isolinux 目录下,而 CentOS 8 的位于 images/pxeboot 目录下。实际操作时按这个思路拷贝即可,如果发现文件不在预期路径,挂载 ISO 后 find 一下就能找到。
3.2 TFTP 根目录和 HTTP 目录的布局
摆放好后,整个目录结构大致长这样:
/var/lib/tftpboot/ ├── pxelinux.0 ├── ldlinux.c32 ├── libcom32.c32 ├── libutil.c32 ├── vesamenu.c32 ├── centos/ │ ├── 7/ │ │ ├── vmlinuz │ │ └── initrd.img │ └── 8/ │ ├── vmlinuz │ └── initrd.img └── pxelinux.cfg/ └── default到这里很多人会问,为什么 TFTP 里也要建 centos/7 和 centos/8 的目录?这是因为启动菜单里的 kernel 和 initrd 路径是相对于 TFTP 根的。我们可以把两代系统的内核放在不同子目录里,这样菜单里指向哪套就不会乱。
nginx 的 /data/pxe 目录布局相对简单,就是两个镜像挂载点加上 ks 目录:
/data/pxe/ ├── centos/ │ ├── 7/ # ISO 挂载点 │ └── 8/ # ISO 挂载点 └── ks/ ├── ks7.cfg └── ks8.cfg3.3 default 菜单:一套PXE同时装7和8
一切准备就绪后,核心文件就是 /var/lib/tftpboot/pxelinux.cfg/default。我的配置如下:
default vesamenu.c32 prompt 0 timeout 300 menu title PXE Boot Menu label centos7 menu label Install CentOS 7 x86_64 kernel centos/7/vmlinuz append initrd=centos/7/initrd.img inst.repo=http://192.168.1.10/centos/7 ks=http://192.168.1.10/ks/ks7.cfg label centos8 menu label Install CentOS 8 x86_64 kernel centos/8/vmlinuz append initrd=centos/8/initrd.img inst.repo=http://192.168.1.10/centos/8/BaseOS/x86_64/os/ ks=http://192.168.1.10/ks/ks8.cfg label local menu label Boot from local disk localboot 0两个细节必须提醒。
第一,kernel和initrd后面的路径不要带前导斜杠,也就是写centos/7/vmlinuz,而不是/centos/7/vmlinuz。虽然部分版本能容忍,但带斜杠的写法更容易在 TFTP 阶段触发文件找不到的问题。
第二,timeout 300的单位是 0.1 秒,也就是 30 秒后自动执行默认项。默认项是第一个 label centos7,如果你不想让装机过程中意外重装,可以在菜单里把default localboot 0提到最前面,或者从 BIOS 启动顺序上做文章。后面的实战部分我会专门讲这个坑。
4. 安装自动化核心:KS应答文件
4.1 CentOS 7的ks要点与示例
PXE 只是把安装器拉了起来,真正决定“装什么、怎么分区、装完做什么”的是 ks 应答文件。没有 ks,PXE 就只相当于把光盘放进了光驱,还是要人工点。
这次我采用一个分工原则:安装源由内核参数 inst.repo 负责,ks 文件里只写分区和软件包选择,不写 url 指令。原因是 anaconda 一旦在 ks 里发现 url 配置,会以它为准,如果和内核参数不一致,轻则安装源切换,重则卡在奇怪的步骤上。
CentOS 7 的 ks7.cfg 如下:
install text lang en_US.UTF-8 keyboard us rootpw P@ssw0rd network --bootproto=dhcp --device=link --activate firewall --disabled selinux --disabled timezone Asia/Shanghai --utc bootloader --location=mbr zerombr clearpart --all --initlabel part /boot --fstype=xfs --size=1024 part swap --size=4096 part / --fstype=xfs --grow --size=1 %packages @^minimal %end几个容易踩的地方:
rootpw后面直接跟明文密码,测试环境图省事可以这么用,但生产环境建议先执行openssl passwd -6 '你的密码'生成加密串,再写成rootpw --iscrypted $6$...。
@^minimal里的^表示它对应一个环境组,不是普通软件包组。CentOS 7 的最小化安装环境组 id 是 minimal,这里不要写成@minimal,否则安装器可能只装一个简化版基础环境,连很多常用命令都不带。
--device=link表示选择当前正在 PXE 引导的网卡,避免服务器有多块网卡时 anaconda 选错设备导致网络起不来,后面拉不到 ks 或者 repo。
text指定安装界面使用字符模式。PXE 装机时如果客户端内存不足 2G,图形安装环境经常直接崩,text 模式会稳得多。
4.2 CentOS 8的ks差异与AppStream处理
CentOS 8 的 ks 整体逻辑和 7 差不多,但有两处差异非常关键,直接决定你能不能装成功。
第一,安装源结构不同。8 把软件包拆成了 BaseOS 和 AppStream 两个仓库。前文已经说过,inst.repo 参数指向 BaseOS 目录,而 AppStream 需要在 ks 中显式补充,否则安装器会试图访问外网默认镜像。内网环境没有外网时,表现就是装到一半卡在“Downloading packages”或者直接提示无法找到仓库。
第二,环境组 id 变了。CentOS 8 最小化安装的环境组是minimal-environment,所以%packages里要写@^minimal-environment。
我用的 ks8.cfg 如下:
install text lang en_US.UTF-8 keyboard us rootpw P@ssw0rd network --bootproto=dhcp --device=link --activate firewall --disabled selinux --disabled timezone Asia/Shanghai --utc repo --name="AppStream" --baseurl="http://192.168.1.10/centos/8/AppStream/x86_64/os/" bootloader --location=mbr zerombr clearpart --all --initlabel autopart --type=lvm %packages @^minimal-environment %end这里我没有写 url 指令,BaseOS 完全由内核参数 inst.repo 提供,AppStream 则通过 repo 指令单独补充。如果你把整个 ks 文件放到 nginx 下面,记得先在本机用 curl 验证两个仓库根地址都能正常列出文件。
4.3 ks 里加一段 %post,让装机结果更可控
自动化安装不只是把系统装上,通常还希望它在第一次重启前就把一些初始终结掉。ks 的%post段落会在安装完成后、系统首次启动前于目标系统环境内执行,非常适合做这类收尾工作。
例如我可以顺手清理 SSH 主机密钥并关闭 NetworkManager 的随机连接:
%post # 移除安装时生成的主机密钥,让首次启动重新生成 rm -f /etc/ssh/ssh_host_* # 确保防火墙默认关闭(仅限内部装机网络) systemctl disable firewalld %end注意%post默认在 chroot 环境中执行,也就是你操作的是目标磁盘上的“新系统”,不是安装器的临时系统。想在这里做网络请求,就用%post --interpreter /bin/bash,但不建议让这一步过分依赖外网,毕竟自动化装机的意义之一就是摆脱外网依赖。
5. 实测中的坑与定位手法
5.1 卡在DHCP循环的排查链路
最常见的故障画面:客户端网卡启动后一直显示类似“No DHCP or proxyDHCP offers received”,然后过一会儿超时重启。遇到这种情况,按链路从底层往上查。
先看服务端 dnsmasq 是不是真的活着:
systemctl status dnsmasq ss -lunp | grep 6767 端口没有监听,多半是 dnsmasq 启动失败,用dnsmasq --test和journalctl -u dnsmasq排配置错误。如果端口正常,再看防火墙有没有放行 67/udp 和 69/udp。很多人在服务端本机测试都正常,但客户端就是拿不到地址,最后发现 firewalld 里 tftp 服务没加。
还有一种容易被忽略的情况:客户端和服务端不在同一个广播域。如果中间跨了 VLAN,交换机上必须配置 DHCP 中继把广播请求转向服务器。测试环境最简单的方式就是先全部丢同一个二层,等链路通了再考虑跨网段。
想抓包确认的话,在服务端执行:
tcpdump -i any port 67 or port 68 -n能看到 DHCP Discover 广播却收不到 Offer,基本就是 DHCP 服务本身没响应,反过来完全没包,就是客户端根本没把请求送到服务器网段。
5.2 TFTP加载不了引导文件的定位思路
DHCP 正常了,客户端拿到了 IP,却报“TFTP open timeout”或者“PXE-E11: ARP timeout”。这多半是 TFTP 链路的问题。
首先验证 tftp-root 下确实有 pxelinux.0,并且文件名大小写完全正确。Linux 下文件名是区分大小写的,pxelinux.0 写成 Pxelinux.0 就加载失败。
其次检查防火墙 69/udp。再一个隐蔽问题是,dnsmasq 的 tftp 服务只允许访问 tftp-root 下的文件,如果 pxelinux.0 被放在 tftp-root 之外的目录,即使 HTTP 那边能看到也没用。
如果你改了自定义 tftp-root,记得确认目录的 SELinux 上下文是否允许 tftp 服务读取。最简单的是先用默认路径,跑通了再折腾自定义路径。
5.3 镜像源连不上的定位思路
内核已经加载,anaconda 界面也出来了,最后卡在“Unable to find install source”或者“Error downloading packages”,这是最让人抓狂的。排查思路其实就一条主线:看 HTTP 到没到。
服务端先确认目录挂载正常:
ls /data/pxe/centos/7 ls /data/pxe/centos/8/BaseOS/x86_64/os/然后模拟客户端视角验证仓库元数据:
curl -I http://192.168.1.10/centos/7/repodata/repomd.xml curl -I http://192.168.1.10/centos/8/BaseOS/x86_64/os/repodata/repomd.xml如果返回 403 而不是 200,优先查 SELinux 上下文,用之前提到的 chcon 或 semanage 把 /data/pxe 标记为 httpd_sys_content_t。如果返回 404,说明路径写错了,仔细比对 inst.repo 参数和目录层级。
还有一个高频问题是内存不够导致图形安装环境崩溃。如果你在菜单里没有指定 text 模式,客户端又是 1G 内存的小虚拟机,anaconda 可能直接没有界面输出或者闪退。这时在 append 里显式加上inst.text,或者依赖 ks 里的 text 指令,基本能解决。
5.4 UEFI客户机的处理方式
前面写的菜单默认跑的是传统 BIOS 的 pxelinux.0。但现在很多服务器默认是 UEFI 引导,UEFI 机器不会执行 pxelinux.0,你需要提供 EFI 格式的引导文件。
dnsmasq 可以按客户端的固件架构返回不同的引导文件名,这是最优雅的做法:
dhcp-match=set:efi-x86_64,option:client-arch,7 dhcp-boot=tag:efi-x86_64,efi/BOOT/BOOTX64.EFI,192.168.1.10 dhcp-boot=tag:!efi-x86_64,pxelinux.0,192.168.1.10option:client-arch,7对应 x86_64 UEFI。然后我把 CentOS 8 ISO 里的 EFI 目录复制到 TFTP 根:
cp -r /data/pxe/centos/8/EFI /var/lib/tftpboot/efi修改 /var/lib/tftpboot/efi/BOOT/grub.cfg,加上双系统菜单,核心内容和 pxelinux 的 default 差不多,只是语法换成了 grub 的 menuentry。注意如果启动时提示找不到 grub.cfg,把 ISO 里 boot/grub2 目录一并拷到 TFTP 根对应的位置即可,这是 CentOS 8 的 grub EFI 镜像搜索路径决定的。
5.5 批量自动化与装机后重启循环
PXE 的价值在于批量,而不只是省一张 U 盘。这里分享一个我实际用得很爽的小技巧:利用 pxelinux 的配置文件优先级,按客户端 IP 自动选择安装系统。
PXE 协议规定,客户端在读取 default 之前,会先尝试读取按 MAC 地址命名的文件,再尝试按 IP 十六进制命名的文件。比如客户端 IP 是 192.168.1.100,十六进制就是 C0A80164,它对应的配置文件是 /var/lib/tftpboot/pxelinux.cfg/C0A80164。我可以在里面写:
default centos8 prompt 0 timeout 1 label centos8 kernel centos/8/vmlinuz append initrd=centos/8/initrd.img inst.repo=http://192.168.1.10/centos/8/BaseOS/x86_64/os/ ks=http://192.168.1.10/ks/ks8.cfg这样这台机器开机直接装 CentOS 8,完全不用人点菜单。批量新机器上线时,我用脚本把 IP 段和系统版本的对应关系批量生成配置文件,效率非常高。
最后说说装机完成后的重启循环。很多机器把 Network Boot 放在第一启动项,装完系统重启后又进入 PXE 引导,如果 default 菜单超时后又默认开始安装,就会掉进装完重启再装的死循环。我的处理原则是把 PXE 引导当作“一次性流程”来用:常规服务器 BIOS 里硬盘启动顺序保持第一,只有需要新装系统的那一台,才通过启动菜单临时选择网络引导。如果你确实要实现真正全自动,那就要在 DHCP 层面按 MAC 区分,只有“待装机名单”里的机器才返回 PXE 引导参数,装完的机器不做响应。这个思路实现起来也不难,就是在 dnsmasq 里维护一份 dhcp-host 名单,然后结合 tag 控制 dhcp-boot。
实际跑过几轮之后,我最大的体会是:PXE 环境本身不难调,最难的是被“多个协议混在一起”的错觉吓住。只要你心里始终清楚当前卡在哪一层——DHCP、TFTP、HTTP 这三段各自负责什么,再配合抓包日志,排错思路就会非常清晰。另外就是尽量让配置“朴素”一点,能用默认路径就用默认路径,能少装一个服务就少装一个,环境越简单,后续批量装机时的故障率越低。这套双系统方案我已经在内部连续用了小半年,装过几十台机器,稳定可靠。如果你也打算在 CentOS 8 上搭一套同时支持 CentOS 7 和 8 的 PXE 环境,直接照这套配置起步,再根据你的实际网段和机器型号微调,应该能少走很多弯路。