Red Hat Training

A Red Hat training course is available for RHEL 8

第 25 章 systemd 网络目标和服务

NetworkManager 在系统引导过程中配置网络。但是,当使用远程根(/)引导时,如 root 目录存储在 iSCSI 设备中时,网络设置会在 RHEL 启动前在初始 RAM 磁盘(initrd)中应用。例如:如果在内核命令行中使用 rd.neednet=1 指定网络配置,或者指定了用于挂载远程文件系统的配置,那么网络设置就会在 initrd 中应用。

本节描述了应用网络设置时使用的不同目标,如 networknetwork-onlineNetworkManager-wait-online 服务,以及如何配置 systemd 服务在 network-online 服务启动后启动。

25.1. network 和 network-online systemd target 的不同

Systemd 维护 networknetwork-online 目标单元。特殊单元,如 NetworkManager-wait-online.serviceWantedBy=network-online.targetBefore=network-online.target 参数。如果启用,这些单元以 network-online.target 开始,并延迟达到目标直到建立了某种类型的网络连接。它们会延迟 network-online 目标直到网络连接。

network-online 目标启动一个服务,这会增加更长的延迟来进一步执行。Systemd 会自动将这个目标单元的带有 WantsAfter 参数的依赖关系添加到所有 System V(SysV) init 脚本服务单元中,并引用 $network 工具。LSB 标头是 init 脚本的元数据。您可以使用它指定依赖项。这与 systemd 目标类似。

network 目标不会显著延迟引导过程的执行。达到 network 目标意味着,负责设置网络的服务已启动。但并不意味着已经配置了一个网络设备。这个目标在关闭系统的过程中非常重要。例如:如果您在引导过程中有一个在 network 目标之后排序的服务,则在关闭过程中会取消这个依赖关系。在服务停止后,网络才会断开连接。远程网络文件系统的所有挂载单元都自动启动 network-online 目标单元和顺序。

注意

network-online 目标单元只在系统启动时有用。系统完成引导后,这个目标不会跟踪网络的在线状态。因此,您无法使用 network-online 来监控网络连接。这个目标提供了一个一次性系统启动概念。

25.2. NetworkManager-wait-online 概述

同步传统网络脚本会遍历所有配置文件来设置设备。它们应用所有与网络相关的配置并确保网络在线。

NetworkManager-wait-online 服务会等待一个超时时间来配置网络。这个网络配置涉及插入以太网设备、扫描 Wi-Fi 设备等。NetworkManager 会自动激活配置为自动启动的适当配置集。因 DHCP 超时或类似事件导致自动激活失败,网络管理器(NetworkManager)可能会在一定时间内处于忙碌状态。根据配置,NetworkManager 会重新尝试激活同一配置集或不同的配置集。

当启动完成后,所有配置集都处于断开连接的状态,或被成功激活。您可以配置配置集来自动连接。以下是一些参数示例,这些参数设定超时或者在连接被视为活跃时定义:

  • connection.wait-device-timeout - 为驱动程序设定检测设备的超时时间
  • ipv4.may-failipv6.may-fail - 使用一个 IP 地址家族或者一个特定的地址系列是否已完成配置进行激活。
  • ipv4.gateway-ping-timeout - 延迟激活。

其它资源

  • nm-settings(5) man page

25.3. 将 systemd 服务配置为在网络已启动后再启动

Red Hat Enterprise Linux 在 /usr/lib/systemd/system/ 目录中安装 systemd 服务文件。此流程为 /etc/systemd/system/service_name.service.d/ 中的服务文件创建一个 drop-in 片断,该文件与 /usr/lib/systemd/system/ 中的服务文件一同使用,以便在网络 上线后启动特定服务。如果在 drop-in 片断中的设置与 /usr/lib/systemd/system/ 中的服务文件中的设置重叠,则其具有更高优先级。

流程

  1. 要在编辑器中打开服务文件,请输入:

    # systemctl edit service_name

  2. 输入以下内容并保存更改:

    [Unit]
    After=network-online.target
  3. 重新载入 systemd 服务。

    # systemctl daemon-reload