ZBLOG

能不能说一下网络启动的过程

好的,网络启动过程是一个复杂的、分阶段的链条,其具体细节会根据 Linux 发行版和所使用的网络管理工具(如传统的 ifupdown、现代的 NetworkManagersystemd-networkd)而有所不同。

以下是一个基于 systemd 的现代 Linux 发行版(如 Debian, Ubuntu, CentOS, Fedora)使用传统 ifupdown 工具的通用网络启动过程详解。这个过程清晰地展示了 ifupdown-pre.service 在其中的位置和作用。


网络启动过程全景图

整个流程可以看作一个由 systemd 管理的、目标(target)和服务(service)相互依赖的链条:

flowchart TD
A[系统内核初始化] --> B["sysinit.target<br>基础系统就绪"]
B --> C["network-pre.target<br>网络启动前阶段"]
    
C --> D["ifupdown-pre.service<br>执行预处理脚本"]
D --> E
    
subgraph E[核心网络配置阶段]
    direction TB
    F["为每个接口生成<br>ifup@eth0.service"]
    F --> G["运行 ifup<br>激活接口"]
end

E --> H["network.target<br>(传统网络就绪标志)"]
H --> I["network-online.target<br>(真实网络连接就绪标志)"]
I --> J["multi-user.target<br>多用户系统可登录"]

过程详解

1. 内核阶段

  • 系统启动:内核初始化后,会启动第一个用户空间进程 systemd (PID 1)。
  • 检测硬件:内核识别并初始化系统中的网络硬件(网卡),并为其创建对应的网络接口设备文件(如 eth0, ens33, wlan0)。

2. Systemd 目标阶段 (target)

Systemd 通过一系列“目标”来组织启动过程。

  • sysinit.target:基础系统服务和服务器的初始化完成。
  • network-pre.target:这是一个特殊的目标,标志着正式配置网络接口之前的时刻。所有需要在网络配置前完成的服务都应在此目标之前完成。
  • network.target:这是一个传统的目标,通常表示网络配置脚本已被运行(即接口已启动),但并不保证网络一定可以连通(例如,可能还在等待DHCP获取IP地址)。
  • network-online.target:这是一个更高级的目标,表示获得了真正的网络连接(例如,成功分配了IP地址或通过了某种连通性测试)。其他需要网络的服务(如远程文件系统挂载、时间同步)应依赖此目标而非 network.target

3. 服务执行阶段 (service)

这是具体工作发生的阶段,也是 ifupdown-pre.service 登场的阶段。

  • 触发点: Systemd 在到达 network-pre.target 后,会启动那些为此目标服务的单元。

  • ifupdown-pre.service 运行:

    1. 该服务被激活。
    2. 它执行主脚本 /lib/net-ifupdown.sh pre-up
    3. 该脚本进而运行 /etc/network/if-pre-up.d/ 目录下的所有可执行脚本。这些脚本可以执行任何需要在接口启动*前*完成的准备工作(例如加载特定驱动模块、设置链路状态)。
  • 配置网络接口:

    • ifupdown-pre.service 完成后,systemd 会为 /etc/network/interfaces 文件中定义的每一个自动启动 (auto <interface>) 的接口生成并启动一个类似的瞬时服务单元 (transient unit),例如 ifup@eth0.service.
  • 单个接口的启动 (ifup@.service):

    1. 该服务调用 /sbin/ifup <interface> 命令。
    2. 它会读取 /etc/network/interfaces 中对应接口的配置。
    3. 根据需要调用:
      • if-pre-up.d/ (再次) -> (虽然主要预处理由 ifupdown-pre.service完成)
      • DHCP客户端 (如 dhclient) 设置静态IP。
      • 设置路由规则。
      • if-up.d/ -> 接口成功启用后执行的脚本(如更新DNS、发送邮件通知IP)。
    4. 所有定义的接口都成功启动后,systmed就会认为network.target

.4.

一旦 nline.targe (这通常由一个其他服务实现,如 systemd-networkd-wait-online.serviceis-network-online.service),就会解锁 multi-user.target


:key:

  1. 3.

希望这个详细的分解能帮助您透彻地理解 Linux


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=8409

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?