BuildRoot系统网络配置

📌 核心逻辑与避坑原理

Buildroot 系统采用经典的 SYSV init 启动机制(即 /etc/init.d/Sxx 脚本按数字顺序从小到大执行)。

  1. /etc/init.d/S40network 会优先执行,尝试去读取 /etc/network/interfaces 或直接通过 ifconfig 设好静态 IP。
  2. 随后执行的 /etc/init.d/S45connman(ConnMan 服务)会强制接管网卡。如果未插网线或未连上 DHCP,它会自作聪明地把 IP 改为 Link-Local 地址(169.254.x.x),导致之前的配置失效。

因此,最简单、彻底的配置方案是:废除 ConnMan 服务,直接将控制权交还给底层的网络脚本。

🛠️ 两步配置固定 IP 法(最推荐、最稳妥)

第一步:关闭并废除 ConnMan 服务

在开发板终端执行以下命令,剥夺 S45connman 脚本的执行权限并对其重命名,防止其开机自启截胡:

Bash

1
2
chmod -x /etc/init.d/S45connman
mv /etc/init.d/S45connman /etc/init.d/S45connman.bak

第二步:正确配置 /etc/network/interfaces

BusyBox/Debian 移植版的 ifupdown 工具对语法要求极高。请确保你的 /etc/network/interfaces 严格按照以下格式编写(注意:iface 等配置行前面的缩进必须是标准的 4 个空格或 1 个 Tab,且前面不能有任何杂质):

Plaintext

1
2
3
4
5
6
7
8
9
10
# 本地环回网络
auto lo
iface lo inet loopback

# 配置 eth0 为静态 IP
auto eth0
iface eth0 inet static
address 192.168.66.66
netmask 255.255.255.0
gateway 192.168.66.1

⚠️ 原子固件避坑:如果文件里原本有 allow-hotplug eth0,请直接删掉或注释掉,只保留 auto eth0。因为在某些嵌入式固件上,热插拔检测会导致开机时 ifup 误判网线状态而跳过静态 IP 初始化。

第三步:配置静态 DNS(可选,确保外网畅通)

由于不再通过 DHCP 自动获取域名解析服务器,必须手动配置 DNS。

  1. 打开配置文件:
    Bash
    1
    vi /etc/resolv.conf
  2. 写入主流的公共 DNS 地址:
    Plaintext
    1
    2
    nameserver 114.114.114.114
    nameserver 8.8.8.8

🔄 验证与生效

完成上述三步后,直接重启开发板:

Bash

1
reboot

开机后,通过以下命令验证网络状态:

  1. 检查 IP:输入 ifconfig eth0,看 inet addr 是否精准锁定为 192.168.66.66
  2. 检查外网:输入 ping 8.8.8.8ping baidu.com,确认网络和 DNS 解析完全正常。