netctl
netctl 是一个基于配置文件的命令行网络管理器,也是 Arch 的一个项目。
安装
netctl 的 #特殊的 systemd 服务单元 用于自动化连接,需要一些额外的依赖;请参阅该章节了解更多信息。
其他可选依赖项显示在下表中。
| 特性 | 依赖 |
|---|---|
| WPA | wpa_supplicant |
| DHCP | dhcpcd 或 dhclient |
| wifi-menu | dialog |
| PPPoE | ppp |
systemctl --type=service 确保在启用 netctl 配置文件/服务之前没有其他网络服务正在运行。配置
netctl 使用配置文件来管理网络连接,并提供不同的操作模式,以便按需自动或手动启动配置文件。
netctl 的配置文件存储在 /etc/netctl/,示例配置文件位于 /etc/netctl/examples/。
要使用示例配置文件,只需将其从 /etc/netctl/examples/ 复制到 /etc/netctl/ 并根据需要进行配置;请参阅下面的 #示例配置文件。创建配置文件所需的第一个参数是网络 Interface,有关详细信息,请参阅 网络配置#网络接口。
- 对于无线设置,您可以使用 root 权限运行
wifi-menu来生成/etc/netctl/下的配置文件。要使用 wifi-menu,需要安装 dialog 包。 - 在您的配置文件中使用
SkipNoCarrier=yes,以便在有线接口上启用静态 IP 配置,无论网线是否连接。
有关配置文件选项的完整列表,请参阅 netctl.profile(5)。
用法
有关 netctl 命令的完整列表,请参阅 netctl(1)。
启动配置文件
创建配置文件后,尝试建立连接,其中 profile 仅指配置文件名,而不是完整路径
# netctl start profile
如果上述命令失败,请以 root 身份运行 journalctl -xn 并使用 netctl status profile 来获取失败的更深入的解释。
启用配置文件
可以通过以下方式启用配置文件,使其在启动时启动:
# netctl enable profile
这将创建并启用一个 systemd 服务,该服务将在计算机启动时启动。对配置文件所做的更改不会自动传播到服务文件。在进行此类更改后,有必要重新启用该配置文件
# netctl reenable profile
启用配置文件后,它将在下次启动时启动。显然,只有当插入有线连接的网线,或无线接入点在配置文件中使用时,才能成功。
如果您需要频繁切换多个配置文件(例如,携带笔记本电脑旅行),请使用 #特殊的 systemd 服务单元 而不是启用单个配置文件。
特殊的 systemd 服务单元
netctl 为有线和无线连接的配置文件自动切换提供了特殊的 systemd 服务。有关特殊 systemd 服务单元的完整列表,请参阅 netctl.special(7)。
有线
安装 ifplugd 包并 启动/启用 netctl-ifplugd@interface.service systemd 服务单元。DHCP 配置文件将在网络电缆插入/拔出时启动/停止。
netctl-ifplugd@interface.service将优先使用使用 DHCP 的配置文件。- 要自动启动静态 IP 配置文件,需要在其中设置
ExcludeAuto=no选项。 - 要优先使用静态 IP 配置文件而非 DHCP 配置文件,您可以设置
Priority=2,其优先级高于 DHCP 配置文件的默认优先级Priority=1。
无线
启动/启用 netctl-auto@interface.service systemd 服务单元。当您从一个网络的范围移动到另一个网络的范围(漫游)时,netctl 配置文件将自动启动/停止。
- 配置文件必须使用
Security=wpa-configsection或Security=wpa才能与 netctl-auto 一起使用,而不是Security=wpa-config。 - 如果您希望某个无线配置文件不被
netctl-auto@interface.service自动启动,您必须在该配置文件中明确添加ExcludeAuto=yes。 - 您可以在 WPAConfigSection 中使用
priority=(参见/etc/netctl/examples/wireless-wpa-configsection)来设置当有多个无线接入点可用时配置文件的优先级。数字越大表示优先级越高。
请注意,interface 不是字面意思,而是要替换为您的设备接口的名称,例如 netctl-auto@wlp4s0.service。有关详细信息,请参阅 netctl.profile(5)。
- 如果任何配置文件包含错误,例如
Key=变量为空或拼写错误,即使该配置文件未使用,单元也会加载失败,并显示消息"Failed to read or parse configuration '/run/network/wpa_supplicant_wlan0.conf'。 - 如果您之前通过 netctl 启用了某个配置文件,请运行
netctl disable profile以防止该配置文件在启动时启动两次。
可以手动控制由 netctl-auto 管理的接口,而无需停止 netctl-auto.service。这可以使用 netctl-auto 命令来完成。有关可用操作的完整列表,请参阅 netctl-auto(1)。
技巧与提示
示例配置文件
有线
对于 DHCP 连接,只需在将 /etc/netctl/examples/ethernet-dhcp 示例配置文件复制到 /etc/netctl 后配置 Interface。
例如:
/etc/netctl/my_dhcp_profile
Interface=enp1s0 Connection=ethernet IP=dhcp
对于静态 IP 配置,将 /etc/netctl/examples/ethernet-static 示例配置文件复制到 /etc/netctl,并根据需要修改 Interface、Address、Gateway 和 DNS。
例如:
/etc/netctl/my_static_profile
Interface=enp1s0
Connection=ethernet
IP=static
Address=('10.1.10.2/24')
Gateway='10.1.10.1'
DNS=('10.1.10.1')
请务必包含 /24 的子网表示法。(它等同于掩码 255.255.255.0),否则配置文件将无法启动。另请参阅 CIDR 表示法。要为每个 NIC 别名多个 IP 地址,请设置 Address=('10.1.10.2/24' '192.168.1.2/24')。要别名多个 DNS 服务器地址,请设置,例如 DNS=('1.1.1.1' '1.0.0.1')。
无线 (WPA-PSK)
以下适用于使用预共享密钥 (WPA-PSK) 的标准无线连接。
/etc/netctl/wireless-wpa
Description='A simple WPA encrypted wireless connection using 256-bit PSK' Interface=wlp2s2 Connection=wireless Security=wpa IP=dhcp ESSID=your_essid Key=\"64cf3ced850ecef39197bb7b7b301fc39437a6aa6c6a599d0534b16af578e04a
- 确保为
Key变量使用特殊的引用规则,如 netctl.profile(5) § SPECIAL QUOTING RULES 中所述。 - 如果密码无效,请尝试删除
Key变量中的\"。 - 尽管是“加密”的,但在配置文件中输入的密钥足以连接到 WPA-PSK 网络。因此,此过程仅用于隐藏密码的可读版本。这不会阻止任何有权访问此文件的用户连接到网络。
混淆无线密码
您也可以按照以下步骤混淆无线密码(wifi-menu 在使用 -o 标志时会自动执行此操作)
不希望将无线网络密码以纯文本形式存储的用户,可以选择存储相应的 256 位预共享密钥,该密钥使用标准算法从密码和 SSID 计算得出。
使用 wpa_passphrase 计算您的 256 位 PSK
$ wpa_passphrase your_essid
network={
ssid="your_essid"
#psk="passphrase"
psk=64cf3ced850ecef39197bb7b7b301fc39437a6aa6c6a599d0534b16af578e04a
}
现在需要将 预共享密钥 (psk) 替换配置文件中 Key 变量的纯文本密码。
使用实验性 GUI
如果您想要一个图形用户界面来管理 netctl 和您的连接,并且不怕高度实验性的非官方软件包,有一些选项可用。netctl-guiAUR 提供了一个基于 Qt 的图形界面、DBus 守护进程和 KDE 小部件。netmenuAUR 使用 dmenu 作为其图形界面。
还有一个应用程序可以显示配置文件更改时的桌面通知并显示托盘图标:netctl-trayAUR。
绑定
来自 内核文档
- Linux 绑定驱动程序提供了一种将多个网络接口聚合到单个逻辑“绑定”接口的方法。绑定接口的行为取决于模式。总的来说,模式提供热备用或负载均衡服务。此外,还可以执行链路完整性监控。
负载均衡
将 /etc/netctl/examples/bonding 复制到 /etc/netctl/bond0 并进行编辑,例如
/etc/netctl/bond0
Description='Bond Interface'
Interface='bond0'
Connection=bond
BindsToInterfaces=('eth0' 'eth1')
IP=dhcp
IP6=stateless
现在您可以禁用旧配置,并设置 bond0 自动启动。切换到新配置文件,例如
# netctl switch-to bond0
bonding 驱动程序的默认设置。有关详细信息,请参阅 官方文档。在 netctl 配置中设置 MODE 并不总是成功的,可能需要直接将选项传递给加载时的绑定模块,如 此处所述。这可能需要使用 LACP / 模式 4。
$ cat /proc/net/bonding/bond0
有线到无线故障转移
此示例说明如何使用 bonding 在有线以太网断开时回退到无线。当有线和无线接口都连接到同一网络时,这最有用。您的无线路由器/接入点必须配置为 桥接模式。
您需要一个额外的软件包:wpa_supplicant。
首先,在启动时加载模块
/etc/modules-load.d/bonding.conf
bonding
然后,配置 bonding 驱动程序的选项以使用 active-backup,并配置 primary 参数为您想要激活的设备(通常是有线接口)。另外,请确保使用运行 ip link 时返回的设备名称。
/etc/modprobe.d/bonding.conf
options bonding mode=active-backup miimon=100 primary=eth0 max_bonds=0
需要 miimon 选项来检测链路故障。max_bonds 选项可以避免 Interface bond0 already exists 错误。有关更多信息,请参阅 内核文档。
接下来,配置一个 netctl 配置文件来从属这两个硬件接口。使用您想要从属的所有设备的名称。如果您有多个有线或无线接口,可以将它们全部从属于一个绑定接口。但在大多数情况下,您只有两个设备,一个有线和一个无线。
/etc/netctl/failover
Description='A wired connection with failover to wireless'
Interface='bond0'
Connection=bond
BindsToInterfaces=('eth0' 'wlan0')
IP='dhcp'
禁用您之前启用的任何其他配置文件(尤其是任何有线或无线配置文件),然后启用故障转移配置文件在启动时启动。
# netctl enable failover
现在您需要配置 wpa_supplicant 来连接到您希望的任何已知网络。您应该为每个接口创建一个文件并启用它。创建以下文件并包含以下内容
/etc/wpa_supplicant/wpa_supplicant-wlan0.conf
ctrl_interface=/run/wpa_supplicant update_config=1
并在该文件末尾附加您希望连接到的任何网络
network={
ssid="SSID"
psk=PSK
}
要生成混淆后的 PSK,您可以运行 wpa_passphrase,正如在 wpa_supplicant#Connecting with wpa_passphrase 页面上所做的那样。
现在,启用 wpa_supplicant@ 模板服务在网络接口上,例如 wpa_supplicant@wlan0。
现在您可以尝试重启您的机器,看看您的配置是否有效。
现在,您可以测试您的故障转移设置,方法是开始一个大的下载。拔掉您的有线接口。您的下载应该继续通过无线接口进行。然后,重新插上有线接口,它应该继续工作。您可以通过检查 netctl@failover.service 和 wpa_supplicant@wlan0.service 单元的 journalctl 来进行调试。
使用任意接口
在某些情况下,可能希望允许配置文件使用系统上的任意接口。一个常见的用例是跨多台具有不同硬件的机器使用通用磁盘映像(如果它们是无头设备,则特别有用)。如果您使用内核的命名方案,并且您的机器只有一个以太网接口,您可能可以猜测 eth0 是正确的接口。但是,如果您使用 udev 的 可预测网络接口名称,则名称将基于特定硬件本身(例如 enp1s0),而不是简单地基于硬件检测到的顺序(例如 eth0、eth1)。这意味着一个 netctl 配置文件在一个机器上可能工作,在另一个机器上则不行,因为它们各自具有不同的接口名称。
一个快速简便的解决方案是利用 /etc/netctl/interfaces/ 目录。为您的接口别名选择一个名称(在本例中为 en-any),然后将以下内容写入一个具有该名称的文件(确保它是 可执行的)。
/etc/netctl/interfaces/en-any
#!/bin/sh
for interface in /sys/class/net/en*; do
break;
done
Interface=$(basename "$interface")
echo "en-any: using interface $Interface";
然后创建一个使用该接口的配置文件。特别注意 Interface 指令。其余的仅作为示例提供。
/etc/netctl/wired
Description='Wired'
Interface=en-any
Connection=ethernet
IP=static
Address=('192.168.1.15/24')
Gateway='192.168.1.1'
DNS=('192.168.1.1')
当启动 wired 配置文件时,使用上述两个文件的任何机器都将自动启动并配置系统中找到的第一个以太网接口,而不管 udev 分配给它的名称是什么。请注意,这不是配置接口的最健壮的方法。如果您使用多个接口,netctl 可能会尝试将同一接口分配给它们,并很可能导致连接中断。如果您不介意更复杂的解决方案,netctl-auto 可能会更可靠。
使用钩子
netctl 支持 /etc/netctl/hooks/ 中的钩子以及 /etc/netctl/interfaces/ 中的每个接口钩子。您可以在钩子/接口中设置任何您可以在配置文件中设置的选项。其中最重要的是 ExecUpPost 和 ExecDownPre。
当读取配置文件时,netctl 会先加载 hooks 中的所有可执行脚本,然后读取连接的配置文件,最后加载 interfaces 目录中与配置文件中使用的接口名称同名的可执行脚本。因此,接口脚本中的声明会覆盖配置文件中的声明,而配置文件中的声明又会覆盖钩子中的声明。
变量 $INTERFACE 和 $ACTION 在钩子/接口中仅当使用 netctl-auto 时可用。
示例
在连接建立后执行命令
/etc/netctl/hooks/myservices
#!/bin/sh ExecUpPost="systemctl start crashplan.service; systemctl start dropbox@<username>.service" ExecDownPre="systemctl stop crashplan.service; systemctl stop dropbox@<username>.service"
设置默认 DHCP 客户端
设置或更改所有配置文件的 DHCP 客户端
/etc/netctl/hooks/dhcp
#!/bin/sh DHCPClient='dhclient'
不要忘记使文件 可执行。
或者,也可以通过创建一个可执行文件 /etc/netctl/interfaces/<interface> 并包含以下行来为特定网络接口指定:
DHCPClient='dhclient'
最小的 WPAConfigSection
如 netctl.profile(5) § OPTIONS FOR ‘WIRELESS’ CONNECTIONS 中所述,WPAConfigSection 变量是传递给 wpa_supplicant 的配置行数组。因此,最小的 WPAConfigSection 将包含
Description='A wireless connection using a custom network block configuration'
Interface=wlan0
Connection=wireless
Security=wpa-configsection
IP=dhcp
WPAConfigSection=(
'ssid="University"'
'psk="very secret passphrase"'
)
ssid=F09F90BA 代表 "🐺"。如果不确定十六进制编码,请运行 wifi-menu(确保删除 \ 和 x 字符)。/etc/resolv.conf
如果您在配置文件中使用 DNS* 选项,netctl 会调用 resolvconf 来覆盖 resolv.conf。
故障排除
Job for netctl@wlan(...).service failed
一些人在使用 netctl 连接到网络时会遇到问题,例如
# netctl start wlan0-ssid
Job for netctl@wlan0\x2ssid.service failed. See 'systemctl status netctl@wlan0\x2ssid.service' and 'journalctl -xn' for details.
当查看运行 journalctl -xn(以 root 身份)的日志时,会显示以下任一内容
1. 如果您的设备(此处为 wlan0)已启动
network[2322]: The interface of network profile 'wlan0-ssid' is already up
将接口关闭应能解决问题
# ip link set wlan0 down
然后重试
# netctl start wlan0-ssid
2. 如果错误仍然存在,请在添加 ForceConnect 选项后重试
/etc/netctl/wlan0-ssid
... ForceConnect=yes
保存并尝试使用该配置文件进行连接
# netctl start wlan0-ssid
dhcpcd: ipv4_addroute: File exists
在某些系统上,dhcpcd 与 netctl 结合使用会导致恢复时出现超时问题,尤其是在切换网络之后。netctl 会报告您已成功连接,但您仍然会遇到超时问题。在这种情况下,旧的默认路由仍然存在且未被续订。一种避免此行为的解决方法是切换到 dhclient 作为默认的 dhcp 客户端。有关该问题的更多信息,请在此处找到:此处。
DHCP 超时问题
如果您在通过 DHCP 请求租约时遇到超时问题,您可以将超时值设置得比 netctl 的默认 30 秒更高。在 /etc/netctl/hooks/ 或 /etc/netctl/interfaces/ 中创建一个文件,并在其中添加 TimeoutDHCP=40 以设置 40 秒的超时,并使该文件可执行。
dhcpcd 调试
如果 dhcpcd 无法获取地址,请在 /usr/lib/netctl/dhcp 中添加 -d 选项,然后以 root 身份运行 journalctl -xe 查看调试消息,这可能表明,例如,服务器提供的 IP 地址在客户端检测到 IP 地址已被使用后被拒绝。
连接超时问题
如果您遇到与 DHCP 无关的超时问题(例如在静态以太网连接上),并且在启动配置文件时遇到类似以下错误的症状
# journalctl _SYSTEMD_UNIT=netctl@profile.service
Starting network profile 'profile'... No connection found on interface 'eth0' (timeout) Failed to bring the network up for profile 'profile'
那么您应该通过在配置文件中添加 TimeoutUp= 和 TimeoutCarrier= 来增加载波和启动超时。
/etc/netctl/profile
... TimeoutUp=300 TimeoutCarrier=300
不要忘记重新启用您的配置文件
# netctl reenable profile
netctl-auto 在恢复时出现问题
有时 netctl-auto 在系统从挂起、休眠或混合睡眠中恢复时无法重新连接。一个简单的解决方法是重启 netctl-auto 服务。这可以通过一个额外的服务来自动化,例如以下服务:
/etc/systemd/system/netctl-auto-resume@.service
[Unit] Description=restart netctl-auto on resume. Requisite=netctl-auto@%i.service After=sleep.target [Service] Type=oneshot ExecStart=/usr/bin/systemctl restart netctl-auto@%i.service [Install] WantedBy=sleep.target
要为您的无线网卡 启用此服务,例如,以 root 身份启用 netctl-auto-resume@wlan0.service。将 wlan0 更改为所需的网络接口。
如果在单元启动时设备尚未运行,则此操作将失败。可以通过在 After 行中添加以下依赖项来解决:
/etc/systemd/system/netctl-auto-resume@.service
... After=sleep.target sys-subsystem-net-devices-%i.device ...
netctl-auto 未自动解除无线网卡阻塞以使用接口
许多笔记本电脑都有一个硬件按钮(或开关)来关闭无线网卡,但是,网卡也可能被内核阻塞。这可以通过 rfkill 来处理。
如果您希望 netctl-auto 自动解除您的无线网卡阻塞以连接到特定网络,请在您选择的无线连接中设置 RFKill=++auto++ 选项,如 netctl.profile(5) 中所述。
RTNETLINK answers: File exists (with multiple NICs)
这是一个非常误导的响应,它实际上意味着您在之前的 netctl 控制文件中已经分配了一个默认网关。当 netctl 启动第 n 个 NIC 并尝试设置其本地路由时,由于已经存在来自 n-1 的默认路由而失败。
将其删除后一切正常,但您将不再有默认路由,因此无法访问互联网等内容。ExecUpPost 无效,因为它为每个网卡执行一次。
一种可能的解决方案是创建一个新服务。将“FIRST_INTERFACE”和“SECOND_INTERFACE”替换为您的接口名称,并将“192.168.xxx.yyy”替换为您的默认网关。
/etc/systemd/system/defaultrouter.service
[Unit] Description="Configure default gateway" Requires=netctl@FIRST_INTERFACE.service netctl@SECOND_INTERFACE.service After=netctl@FIRST_INTERFACE.service netctl@SECOND_INTERFACE.service [Service] Type=oneshot ExecStart=/usr/bin/ip route add default via 192.168.xxx.yyy [Install] WantedBy=network-online.target
Eduroam 和其他 MSCHAPv2 连接问题
请参阅 wpa_supplicant#Problems with Eduroam。
使用 .include 指令的配置文件的 Journal 警告
仍然使用 systemd 旧的 .include 指令的配置文件将产生 Journal 警告,例如
systemd[1]: /etc/systemd/system/netctl@<profile>.service:1: .include directives are deprecated, and support for them will be removed in a future version of systemd. Please use drop-in files instead.
有关详细信息,请参阅 FS#59494。
执行
netctl reenable profile
将更新配置文件为新的 drop-in unit file 格式。
钩子不起作用
如果您在 /etc/netctl/hooks/ 中有多个钩子,像 ExecUpPost 和 ExecDownPre 这样的变量将只从一个文件中执行。要解决此问题,请按以下方式定义变量:
/etc/netctl/hooks/test
ExecUpPost="some command ; "$ExecUpPost ExecDownPre="some command ; "$ExecDownPre
这将把您的命令追加到已定义的命令中。
网络挂载在关机时超时
如果您将网络挂载与 netctl-ifplugd 或 netctl-auto 结合使用,可能需要在相应服务停止之前取消挂载它们。一种实现此目的的方法是为 netctl-ifplugd@.service 或 netctl-auto@.service 创建一个 drop-in 文件,其内容如下:
/etc/systemd/system/netctl-*@.service.d/unmount_on_shutdown.conf
[Unit] Wants=remote-fs-pre.target Before=remote-fs-pre.target
这将确保在自动网络服务停止之前断开网络挂载。