netctl (简体中文)

From ArchWiki
Revision as of 17:12, 13 November 2013 by Khwarizmigee (Talk | contribs) (翻译了自动化操作一节)

Jump to: navigation, search

Summary help replacing me
用netctl和网络配置脚本设置网络的指南。
概要
Template:Networking overview (简体中文)
资源
Bridge with netctl
翻译状态: 本文是英文页面 Netctl翻译,最后翻译时间:2013-07-27,点击这里可以查看翻译后英文页面的改动。

Netctl 是基于命令行的网络管理器,支持场景配置。它是 Arch 的项目,取代了原来的 netcfg

安装

netctl 软件包已经进入官方软件仓库.

netctlnetcfgAUR相互冲突,安装 netctl 会替换掉netcfgAUR。如果配置不正确,可能导致连接中断。

Note: 请使用systemctl --type=service确保其它可以配置网络的服务都没有运行,同时使用多个网络配置工具会导致冲突。

建议阅读

建议用户使用前阅读如下文档:

配置

netctl 使用配置文件来管理网络连接,这些配置文件保存在 /etc/netctl/ 。软件提供了一些配置文件的示例以供参考。这些示例位于 /etc/netctl/examples/。配置文件通常包括:

  • ethernet-dhcp
  • ethernet-static
  • wireless-wpa
  • wireless-wpa-static

若要使用上述示例配置文件,只需将其从 /etc/netctl/examples/ 复制到 /etc/netctl/ 然后按照自己的需求进一步配置即可,如:

# cp /etc/netctl/examples/wireless-wpa /etc/netctl/profile
Tip: 如要配置无线网络,可以使用 wifi-menu -o 来自动在 /etc/netctl/ 中生成配置文件。
Warning: 使用 wifi-menu -o 而在 /etc/netctl/ 中生成的文件名中带有 '-' 。这将在自动设置中带来问题,建议重新为配置文件命名。

在创建好你自己的配置文件之后,可以尝试运行:

# netctl start profile

来使用新的配置文件创建一个连接。

Note: 其中profile是文件名,不包含完整路径,使用完整的路径将使 netctl 异常退出。

如果上述命令出错,可使用 journalctl -xnnetctl status profile 来获得对错误的详细描述,对配置文件做必要的更正后重试。

自动化操作

如果使用单一配置文件(对每个网络接口)或想人工切换配置文件,请看 基本方法 。使用这种配置方法的多为服务器、工作站和路由器等。

如果需要方便的在多个配置文件间切换,请看 自动切换配置。笔记本多用此种方式。

基本方法

使用此种方式,可以为每个网络接口固定地启用一个配置文件。首先需手动检查该配置文件可以正常使用,那么可以用下面的命令启用它:

# netctl enable profile

这将创建并启用一个随计算机启动而自动运行的 systemd 服务。对配置文件本身的修改无法自动关联到前述创建的服务文件,修改之后,需用下述命令重新启用该配置。

# netctl reenable profile
Note: 只有在计算机启动时(或服务启动时),配置文件可以被成功地启用,连接才可以建立。特别地,对于有线连接,需插好电缆;对于无线连接,需处于信号覆盖范围内。
Tip: 若要无视线缆是否插好,强制对有线网络接口启用一个固定IP的配置,可以在配置文件中加入 SkipNoCarrier=yes

自动切换配置

netctl 提供了两个特殊的 systemd 服务来自动切换配置:

  • 有线网络: netctl-ifplugd@interface.service。使用它,将在你插入和拔出电缆时自动切换配置文件。
  • 无线网络: netctl-auto@interface.service。使用它,将在你从一个无线网络的覆盖范围进入另一个无线网络的范围时自动切换配置文件。
Note: netcfg 使用 net-auto-wireless.servicenet-auto-wired.service 来实现相同的目的。

首先 安装 下列软件包:

  • wpa_actiond 用来支持使用 netctl-auto@interface.service 命令。
  • ifplugd 用来支持使用 netctl-ifplugd@interface.service 命令。

然后将 netctl-auto@interface.servicenetctl-ifplugd@interface.service 需要启动的所有配置文件编辑好。

如果希望某些无线网络配置不要netctl-auto@interface.service自动启用,需要专门在该配置文件中加入 ExcludeAuto=yes 。存在多个可用配置时,可以通过设置 Priority= 来为某些文件设置优先级。 netctl-ifplugd@interface.service 优先启用使用了 DHCP 的配置文件,如要优先启用一个使用固定IP的配置,可以设置 AutoWired=yes 。详细内容参见 netctl.profile(5)

Warning: 不能通过选项Security=wpa-config来让netctl-auto自动选择一个启用了WPA的配置文件。请使用 Security=wpa-configsection 来代替。

在设置好你的配置文件并且确认它们可以正常工作后,使用systemctl启动这些服务:

# systemctl enable netctl-auto@interface.service 
# systemctl enable netctl-ifplugd@interface.service  
Warning:
  • 如果任何一个配置文件包含错误,例如包含空变量 Key=,这个文件将无法在开机时自动启用。
  • 本方法与 基本方法 矛盾。如果你之前已经通过netctl启用了一个配置文件,运行 netctl disable profile 来防止这个配置在计算机启动时被启用两次。

从netctl 1.3开始,允许在不停止netctl-auto服务的情况下手工控制一个不受netctl-auto管理的网络接口。这可以通过netctl-auto命令完成。若要获得可用行为的列表,运行:

 # netctl-auto --help

从 netcfg 迁移的方法

netctl 使用 /etc/netctl 保存配置,而不是 /etc/network.d (netcfg保存配置的位置).

从 netcfg 迁移,请执行:

  • 禁用 netcfg 服务: # systemctl disable netcfg.service.
  • 删除 netcfg,然后安装 netctl
  • 将老的网络配置移动到新目录
  • 根据 netctl.profile(5) 修改变量名称(主要是大小写变化,例如 CONNECTION 变成 Connection).
  • For static IP configuration make sure the Address variables have a netmask after the IP (e.g. Address=('192.168.1.23/24' '192.168.1.87/24') in the example profile).
  • If you setup a wireless profile according in the wireless-wpa-configsection example, note that this overrides wpa_supplicant options defined above the brackets. For a connection to a hidden wireless network, add scan_ssid=1 to the options in the wireless-wpa-configsection; Hidden=yes does not work there.
  • 接口变量和其他变量不再需要引号(这仅仅是风格变化).
  • 为每一个配置执行netctl enable profile, last工作方式有变化,参阅 netctl.special(7).
  • 使用 netctl list / netctl start <profile> 替换 netcfg-menu. wifi-menu 依然保留。
  • Unlike netcfg, by default netctl fails to bring up a NIC when it is not connected to another powered up NIC. To solve this problem, add SkipNoCarrier=yes at the end of your /etc/netctl/profile.

密码加密(256-bit PSK)

不想用明文保存密码的用户可以使用 256 位加密 PSK,数据是通过密码和 SSID 通过标准算法生成。

  • 方法1: 使用 wifi-menu -o/etc/netctl 中生成配置文件。
  • 方法2: 下面有手动配置方法,如果密码失败,可以试试删除 Key= 中的 \"

不管使用哪种方法,都建议用 chmod 600 /etc/netctl/<config_file> 限制一般用户的访问权限。

然后用wpa_passphrase生成256位加密 PSK:

Usage: wpa_passphrase [ssid] [passphrase]
$ wpa_passphrase archlinux freenode

在第二个终端将/etc/netctl/examples/wireless-wpa 复制到 /etc/netctl

# cp /etc/netctl/examples/wireless-wpa /etc/netctl/wireless-wpa

编辑/etc/netctl/wireless-wpa,将之前生成的Encrypted Pre-shared Key设置到Key

完成后的wireless-wpa应该类似于:

/etc/netctl/wireless-wpa
Description='A simple WPA encrypted wireless connection using 256-bit PSK'
Interface=wlp2s2
Connection=wireless
Security=wpa
IP=dhcp
ESSID=archlinux
Key=\"64cf3ced850ecef39197bb7b7b301fc39437a6aa6c6a599d0534b16af578e04a
注意: * 请使用'''special non-quoted rules''' 设置 Key=,参阅 [https://github.com/joukewitteveen/netctl/blob/master/docs/netctl.profile.5.txt netctl.profile(5)] * 配置文件中的 Key 足够连接到 WPA-PSK 网络。也就是说,此方法仅仅将密码变得不可读,但是只要用户能够读取配置文件,就能连接到网络。请不要使用相同的密码作为网络密码。

支持

官方通知帖: https://bbs.archlinux.org/viewtopic.php?id=157670

提示和技巧

Replace 'netcfg current'

As of April 2013 there is no netctl alternative to netcfg current. If you relied on it for something, like a status bar for a tiling window manager, you can now use:

# netctl list | awk '/*/ {print $2}'

or, when netctl-auto was used to connect:

# wpa_cli -i interface status | sed -n 's/^id_str=//p'

Eduroam

Some universities use a system called "Eduroam" to manage their wireless networks. For this system, a WPA config-section profile with the following format is often useful:

/etc/netctl/wlan0-eduroam
Description='Eduroam-profile for <user>'
Interface=wlan0
Connection=wireless
Security=wpa-configsection
IP=dhcp
WPAConfigSection=(
 'ssid="eduroam"'
 'proto=RSN'
 'key_mgmt=WPA-EAP'
 'pairwise=CCMP'
 'auth_alg=OPEN'
 'eap=PEAP'
 'identity="<user>"'
 'password="<password>"'
)

Bonding

From kernel documentation:

The Linux bonding driver provides a method for aggregating multiple network interfaces into a single logical "bonded" interface. The behavior of the bonded interfaces depends on the mode. Generally speaking, modes provide either hot standby or load balancing services. Additionally, link integrity monitoring may be performed.

Load balancing

To use bonding with netctl, additional package from official repositories is required: ifenslave.

复制 /etc/netctl/examples/bonding/etc/netctl/bonding 并进行编辑,举例来说,像下面这样:

/etc/netctl/bonding
Description='Bond Interface'
 Interface='bond0'
 BindsToInterfaces=('eth0' 'eth1')
 IP=dhcp
 IP6=stateless

现在你可以禁用和停止旧的网络配置,然后设置自动启动 bonding:

禁用旧的配置文件:

 # netctl stop ethernet
 # netctl disable ethernet

启用并启动 bonding:

 # netctl start bonding
 # netctl enable bonding
注意: 要改变绑定模式(默认值是轮询),例如,用于active backup:

创建 /etc/modprobe.d/bonding.conf

/etc/modprobe.d/bonding.conf
options bonding mode=active-backup
options bonding miimon=100
更多关于不同绑定策略(以及其它驱动程序设置)的信息,参见 Linux Ethernet Bonding Driver HOWTOThe Linux Foundation: bonding

查看状态和绑定模式:

$ cat /proc/net/bonding/bond0

有线 -> 无线故障切换

当有线网络断开时,使用 bonding 切换到无线网络,这种方法也会在探测这两种网络连接,并在至少一种已连接时启动 dhcpcd。

你将需要官方源中的 netctlifplugdifenslavewpa_supplicant

首先配置 bonding 驱动程序使用 active-backup 模式:

/etc/modprobe.d/bonding.conf
options bonding mode=active-backup
options bonding miimon=100
options bonding primary=eth0
options bonding max_bonds=0

设置`max-bonds`可以避免"Interface bond0 already exists" 错误。

然后,配置一份 netctl 配置文件,使用这两个硬件接口:

/etc/netctl/failover
Description='A wired connection with failover to wireless'
Interface='bond0'
Connection=bond
BindsToInterface=('eth0' 'wlan0')
IP='no'
SkipNoCarrier='no'

启动时启用配置文件。

# netctl enable failover

将 wpa_supplicant 配置为关联一个已知网络,可以通过 netctl profile (记得设置 IP='no'), 长期运行的 wpa_supplicant 服务或者 wpa_cli 命令实现。具体方法请访问 wpa_supplicant 页面。

创建 ifplugd 操作,自动为绑定的接口进行 DHCP 分配:

/etc/ifplugd/bond_dhcp.action
#!/bin/sh

case "$2" in
  up)
    systemctl start "dhcpcd@$1.service" && exit 0
    ;;
  down)
    systemctl stop "dhcpcd@$1.service" && exit 0
    ;;
  *)
    echo "Wrong arguments" > /dev/stderr
    ;;
esac
exit 1

并使它可执行

# chmod +x /etc/ifplugd/bond_dhcp.action

然后创建 systemd 服务,启动 bond0 上的 ifplugd:

/etc/systemd/system/net-auto-bonded@.service
[Unit]
Description=Provides automatic dhcp resolution for bonded failover connection
Requires=netctl@failover.service
After=netctl@failover.service

[Service]
ExecStart=/usr/bin/ifplugd -i %i -r /etc/ifplugd/bond_dhcp.action -fIns

[Install]
WantedBy=multi-user.target

启用 net-auto-bonded 服务并重启:

# systemctl enable net-auto-bonded@bond0.service
# reboot

如果有线连接和无线连接位于同一个网络,现在你可以断开重连有线网络而不会断网。甚至大多数情况下,播放流媒体音乐都不会有间断!