第1章:rootfs文件系统解剖:/etc目录下的网络配置全家桶

嵌入式Linux开发中,网络配置出问题是最让人头疼的。我见过太多工程师,明明驱动都调通了,ping包就是不通。最后发现,问题出在rootfs里那几个配置文件上。

今天,我们就来解剖一下/etc目录下的网络配置全家桶。说白了,就是那几个你天天见、但未必真正理解的文件。

1.1 /etc/network/interfaces:网络接口的"户口本"

这个文件,是Debian/Ubuntu系嵌入式系统的网络配置核心。它定义了每个网络接口怎么启动、用什么IP、要不要DHCP。

我个人习惯,拿到一个新板子,第一件事就是cat这个文件。为什么?因为它直接决定了你的网口能不能干活。

# /etc/network/interfaces — 典型嵌入式配置
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 192.168.1.100
    netmask 255.255.255.0
    gateway 192.168.1.1
    dns-nameservers 8.8.8.8 114.114.114.114

这里有几个关键点:

  • auto:系统启动时自动激活该接口。不加的话,你得手动ifup。
  • iface eth0 inet static:eth0用静态IP。换成dhcp就是自动获取。
  • dns-nameservers:这个很多人会漏掉。不加的话,DNS解析会出问题。
⚠️ 注意: 嵌入式系统中,eth0的命名可能不是eth0。我遇到过某款海思芯片,网口叫ra0。别想当然,先ifconfig -a看看。

1.2 /etc/resolv.conf:DNS的"通讯录"

这个文件,决定了你的设备怎么把域名翻译成IP。没有它,你能ping通IP,但打不开网页。

# /etc/resolv.conf
nameserver 8.8.8.8
nameserver 114.114.114.114
search localdomain

我曾经在项目中遇到一个坑:用systemd-networkd管理的系统,resolv.conf会被自动覆盖。你手动改了,重启就没了。后来发现,得去改/etc/systemd/resolved.conf才行。

💡 小技巧: 如果你不想让系统自动修改resolv.conf,可以把它设为只读:chmod 444 /etc/resolv.conf。但要注意,有些系统会报错。

1.3 /etc/hostname:设备的"身份证"

这个文件就一行,写你的设备名字。比如:

my-embedded-device

别小看这个。我调试多设备组网时,经常靠hostname区分设备。如果两个设备hostname一样,DHCP服务器可能会分配冲突的IP。

修改hostname后,记得执行hostname -F /etc/hostname让它立即生效。或者直接重启。

1.4 /etc/hosts:本地DNS缓存

这个文件,是本地域名解析的"走后门"通道。系统查DNS之前,会先看这里。

127.0.0.1   localhost
127.0.1.1   my-embedded-device
192.168.1.10   gateway.local

嗯,这里要注意:如果你把某个域名写死在hosts里,DNS解析就会跳过。我调试时经常用这个来模拟DNS解析,避免依赖外部网络。

1.5 /etc/nsswitch.conf:解析顺序的"调度员"

这个文件决定了系统先查hosts还是先查DNS。默认配置是:

hosts:          files dns

意思是先查/etc/hosts(files),再查DNS。如果你改成dns files,那就先查DNS。我一般不动这个,除非有特殊需求。

1.6 知识体系总览

下面这张图,帮你理清这几个文件的关系:

/etc目录下网络配置全家桶关系图 网络配置核心 interfaces IP、网关、DNS配置 resolv.conf DNS服务器地址 hostname 设备名称标识 hosts 本地域名映射 nsswitch.conf 解析顺序控制 配置生效顺序:interfaces → resolv.conf → hosts → nsswitch.conf 修改后建议执行:/etc/init.d/networking restart 或 reboot

1.7 实战避坑指南

我总结几个常见问题,你遇到了可以直接对号入座:

现象 可能原因 排查方法
能ping IP,不能ping域名 resolv.conf配置错误或缺失 cat /etc/resolv.conf,检查nameserver
网口起不来 interfaces中auto没加 检查interfaces,确认auto eth0存在
hostname改了不生效 没执行hostname命令或没重启 执行hostname -F /etc/hostname
DNS解析顺序不对 nsswitch.conf被改过 检查hosts: files dns的顺序

🔑 核心要点: 网络配置不是玄学,就是这几个文件的事。你只要搞懂它们各自管什么、怎么配合,90%的网络问题都能自己解决。

我曾经帮一个客户排查问题,他们设备在实验室好好的,一到现场就ping不通外网。折腾了两天,最后发现是现场的路由器DNS指向了内网服务器,而resolv.conf里写的是8.8.8.8。改过来就好了。你看,就是一行配置的事。

好了,这一章的内容就到这里。记住这几个文件的位置和作用,后面我们讲具体调试时,你会觉得特别顺手。

可可精品资料库