netctl
netctl はプロファイルを使ってネットワーク接続を管理・設定する CLI ベースのツールです。netctl は古い netcfg ユーティリティを置き換える新しい Arch Linux の独自プロジェクトです。
インストール
netctl パッケージが公式リポジトリから利用できます。netctl をインストールすると netcfgAUR が置き換えられます。
netctl と netcfgAUR は衝突するパッケージです。プロファイルが正しく設定されていないと、netctl をインストールした後に接続を失う可能性があります。
必読
netctl を使う前に以下の man ページを読むのを推奨します:
設定
netctl はプロファイルを使ってネットワーク接続を管理します。様々な動作方法があり、プロファイルを自動的に起動したり、必要に応じて手動で起動することができます。
プロファイルの設定
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
プロファイルを作成したら、新しく作ったプロファイルを使って接続を確立するために次を実行して下さい:
# netctl start profile
上のコマンドが失敗する場合、journalctl -xn
や netctl status profile
を使って失敗の詳細情報を取得して下さい。そして設定を修正してから再テストして下さい。
自動操作
プロファイルを(一つのインターフェイスに)一つしか使わなかったり、手動でプロファイルを切り替える場合、基本的な方法を使って下さい。一般的な例として、サーバー・ワークステーション・ルーターなどがあります。
頻繁に複数のプロファイルを切り替える必要がある時は、プロファイルの自動切り替えを使って下さい。一般的な例として、ラップトップがあります。
基本的な方法
この方法では、インターフェイス毎に一つのプロファイルを固定して起動することができます。最初にプロファイルが問題なく起動することを手動で確認します:
# netctl start profile
それから次のコマンドで enabled
にしてください:
# netctl enable profile
このコマンドによって systemd サービスが作成・有効にされ、コンピュータが立ち上がる時にサービスが起動するようになります。ただし、netctl はネットワークインターフェイスデバイスが既に起動している場合 (例えば dhcpcd を使っている場合) はプロファイルを実行しません。
プロファイルへの変更はサービスファイルに自動的には適用されません。変更後、プロファイルを再度有効にする必要があります:
# netctl reenable profile
ブート時 (もしくはサービスの起動時) にプロファイルの起動が成功した時に初めて接続は確立されます。具体的に言うと、有線接続の場合はケーブルが挿さっている必要があり、無線接続の場合、ネットワークが圏内である必要があります。
プロファイルの自動切り替え
netctl は自動でプロファイルを切り替えるために2つの特別な systemd サービスを用意しています:
- 有線インターフェイス:
netctl-ifplugd@interface.service
。これを使うと、あなたがケーブルを抜き差しするたびに netctl プロファイルが変更されます。 - 無線インターフェイス:
netctl-auto@interface.service
。これを使うと、あなたが特定のネットワークの圏内から他のネットワークの圏内に移動したときに netctl のプロファイルが変更されます。
まず必要なパッケージをインストールしてください:
netctl-auto@interface.service
を使うには wpa_actiondAUR パッケージが必要です。netctl-ifplugd@interface.service
を使うには ifplugd パッケージが必要です。
そして netctl-auto@interface.service
や netctl-ifplugd@interface.service
が起動できるプロファイルを全て設定してください。
netctl-auto@interface.service
によって無線プロファイルが自動的に起動しないようにしたい場合は、そのプロファイルに ExcludeAuto=yes
を加える必要があります。また、Priority=
を使うことで複数のプロファイルが利用可能な場合に、どのプロファイルを優先的に使うか設定できます。netctl-ifplugd@interface.service
は DHCP を使うプロファイルを優先します。固定 IP のプロファイルを優先させるために、AutoWired=yes
を使うことができます。詳しくは netctl.profile(5)
を見て下さい。
プロファイルを設定して、動作するのを確認したら、systemctl を使ってサービスを有効にしてください:
# systemctl enable netctl-auto@interface.service # systemctl enable netctl-ifplugd@interface.service
netctl 1.3 から、netctl-auto サービスを止めないで netctl-auto によって管理されているインターフェイスを手動で操作できるようになりました。netctl-auto コマンドを使ってこれを行うことが可能です。利用可能な操作のリストを表示するには次を実行してください:
# netctl-auto --help
サンプルプロファイル
有線
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 表記を参照してください。Address=('10.1.10.2/24' '192.168.1.2/24')
と設定することで複数の IP アドレスを NIC にエイリアスできます。
ワイヤレス (WPA-PSK)
パスワードを平文で保存したくない場合、256-bit Encrypted PSK を生成するという方法があります。これはパスフレーズと SSID から標準アルゴリズムを使って計算します。
- 方法 1:
wifi-menu -o
を実行して/etc/netctl
に設定ファイルを生成する - 方法 2: 手順に従って手動設定する
どちらの方法でも、chmod 600 /etc/netctl/<config_file>
をしてパスワードにユーザーがアクセスできないようにするのを提案します。
wpa_passphrase を使ってあなたの 256-bit Encrypted PSK を生成してください:
$ wpa_passphrase your_essid passphrase
network={ ssid="your_essid" #psk="passphrase" psk=64cf3ced850ecef39197bb7b7b301fc39437a6aa6c6a599d0534b16af578e04a }
新しいターミナルを開き、サンプルファイル wireless-wpa
を /etc/netctl/examples
から /etc/netctl
にコピーしてください。
# cp /etc/netctl/examples/wireless-wpa /etc/netctl/wireless-wpa
それからお好きなテキストエディタを使って /etc/netctl/wireless-wpa
を編集する必要があります。先に wpa_passphrase を使って生成された Encrypted Pre-shared Key (psk) をプロファイルの Key
変数に追加してください。
256-bit Encrypted PSK を含むネットワークプロファイル wireless-wpa
は以下のようになるはずです:
/etc/netctl/wireless-wpa
Description='A simple WPA encrypted wireless connection using 256-bit Encrypted PSK' Interface=wlp2s2 Connection=wireless Security=wpa IP=dhcp ESSID=your_essid Key=\"64cf3ced850ecef39197bb7b7b301fc39437a6aa6c6a599d0534b16af578e04a
ヒントとテクニック
GUI を使う
netctl や接続を管理するのにグラフィカルユーザーインターフェースが欲しい場合、netguiAUR をインストールすることができます。ただし、netgui はまだベータなので問題が起こった時のために基本的な netctl の構文には慣れておいて下さい。
'netcfg current' の代用
以前 netcfg current
を使っていた場合は、netctl-auto
で起動した接続の代わりとして # netctl-auto current
を使うことができます (netctl-1.3 以降の機能)。
接続を手動でパースするには、次を使って下さい:
# netctl list | awk '/*/ {print $2}'
Eduroam
WPA2 Enterprise#netctl を見て下さい。
ボンディング
- Linux bonding ドライバは複数のネットワークインターフェースを単一の論理的な「結合された」インターフェースに統合する手段を提供します。結合されたインターフェースの動作はモードに依存します。一般に言われる事ですが、モードはホットスタンバイまたは負荷分散サービスを提供します。加えて、リンクの保全監視が実現されます。
ロードバランシング
netctl とボンディングを使うには、公式リポジトリから追加のパッケージをインストールする必要があります: ifenslave.
/etc/netctl/examples/bonding
を /etc/netctl/bonding
にコピーして、以下のように編集してください:
/etc/netctl/bonding
Description='Bond Interface' Interface='bond0' Connection=bond BindsToInterfaces=('eth0' 'eth1') IP=dhcp IP6=stateless
古い設定を無効にして、bonding を自動的に起動するよう設定してください。新しいプロファイルに切り替えるには:
# netctl switch-to bonding
有線から無線へのフェイルオーバー
ここでは有線のイーサネットが切断されたときに無線にフォールバックするボンディングを使用する方法を説明します。有線と無線のインターフェイスがどちらも同じネットワークに接続されるような場合に有用です。無線ルーター/アクセスポイントが bridge モードに設定されている必要があります。
公式リポジトリから以下のパッケージをインストールしてください: ifenslave と wpa_supplicant。
まずは起動時に bonding モジュールがロードされるように設定します (カーネルモジュール#ロードを参照):
/etc/modules-load.d/bonding.conf
bonding
そして、active-backup
を使うように bonding
ドライバーのオプションを設定して、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
エラーを回避します。詳しい情報は カーネルドキュメント を参照してください。
次に、2つのハードウェアインターフェイスを従属させる netctl プロファイルを設定します。使用したい全てのデバイスの名前を使ってください。有線・無線インターフェイスが3つ以上ある場合、全てのインターフェイスを bond インターフェイスに接続させることができます。ただし、大抵の場合は、有線と無線、2つのデバイスだけを使用します:
/etc/netctl/failover
Description='A wired connection with failover to wireless' Interface='bond0' Connection=bond BindsToInterfaces=('eth0' 'wlan0') IP='dhcp'
前に使っていた他のプロファイル (特に有線や無線のプロファイル) は全て無効化して、起動時に failover プロファイルを有効にするようにしてください:
# netctl enable failover
それから使用したい既知のネットワークに接続できるように wpa_supplicant を設定する必要があります。インターフェイスごとにファイルを作成して systemd で有効化してください。以下の内容でファイルを作成:
/etc/wpa_supplicant/wpa_supplicant-wlan0.conf
ctrl_interface=/run/wpa_supplicant update_config=1
ファイルの末尾に接続したいネットワークを追加してください:
network={ ssid="SSID" psk=PSK }
難読化された PSK を生成するには WPA supplicant#wpa_passphrase で接続する のページに書かれているように wpa_passphrase を実行します。
そして、wpa_supplicant@
テンプレートサービスにネットワークインターフェイスを指定して有効化してください。例: wpa_supplicant@wlan0
。
マシンを再起動して設定が上手く機能するかどうか確認できます。
巨大なダウンロードをすることで、ファイルオーバーの設定をテストすることができます。ダウンロードの途中に有線インターフェイスを抜いて見て下さい。無線インターフェイスに切り替わってダウンロードが継続するはずです。そして、もう一度有線インターフェイスを接続すると有線でダウンロードが続行されるはずです。netctl@failover.service
と wpa_supplicant@wlan0.service
ユニットの journal を確認することでデバッグできます。
全てのインターフェイスを使う
ときには、プロファイルでシステム上の全てのインターフェイスを使いたいという場合もあります。例えば、様々なハードウェアの様々なマシンにまたがって共通のディスクイメージを使用するケースです (ヘッドレスサーバーの場合、特にこういうことがあります)。カーネルの命名規則を使って、マシンにイーサネットインターフェイスが一つしかない場合、おそらく適切なインターフェイスは eth0 です。しかしながら、udev の Predictable Network Interface Names を使うとすると、ハードウェアが検出された順番ではなく (例: eth0, eth1)、名前はそれぞれのハードウェアに基づいて命名されます (例: enp1s0)。その場合、マシンによってインターフェイスの名前が変わってしまうため、netctl プロファイルを他のマシンで使うことはできなくなります。
簡単で粗雑な解決方法は /etc/netctl/interfaces/
ディレクトリを利用する方法です。インターフェイスのエイリアス (下記の例では en-any
) の名前を決めて、その名前を使ったファイルに以下を記述します (ファイルには実行可能権限を付与してください)。
/etc/netctl/interfaces/en-any
#!/bin/bash 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
プロファイルを起動すると、上記の2つのファイルを使用するマシンは自動的に、udev によって割り当てられた名前は無視して、システムで一番最初に認識されたイーサネットインターフェイスを立ち上げて設定します。インターフェイスの設定としてはあまり信頼性がある方法ではないので注意してください。インターフェイスが複数ある場合、netctl によって全てのインターフェイスに同じインターフェイスが割り当てられ、接続ができなくなってしまう可能性があります。ソリューションが複雑になるのを気にしないときは、netctl-auto
のほうが信頼できます。
フックを使う
netctl は /etc/netctl/hooks/
からフックを使うことができ、インターフェイスごとのフックは /etc/netctl/interfaces/
に保存します。フック/インターフェイスではプロファイルで使えるあらゆるオプションが設定できます。プロファイルと同じように読み込まれて、特に重要なのは ExecUpPost
と ExecDownPre
です。
プロファイルを読み込むとき、netctl は hooks
にある全ての実行可能なスクリプトを読み込んで、それからプロファイルを読み込み接続を行います。そして、最後に interfaces
ディレクトリに入っている、使用するインターフェイスと同じ名前の実行可能なスクリプトを読み込みます。そのため、インターフェイススクリプトで定義したオプションはプロファイル (とフック) の宣言を上書きします。
netctl-auto
を使用する場合、フックやインターフェイスで使うことができる変数は $INTERFACE
, $SSID
, $ACTION
, $Profile
だけです。
サンプル
接続の確立時にコマンドを実行
/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"
network-online.target の有効化
/etc/netctl/hooks/status
#!/bin/sh ExecUpPost="systemctl start network-online.target" ExecDownPre="systemctl stop network-online.target"
このフックを使うことで、ネットワーク接続が必要な systemd サービスを network-online.target
の後に起動するように順番を変えることができ、接続が切断される前にサービスが停止されます。
デフォルトの DHCP クライアントの設定
全てのプロファイルで使用する DHCP クライアントを設定・変更するには:
/etc/netctl/hooks/dhcp
#!/bin/sh DHCPClient='dhclient'
もしくは、以下の行を含んだ実行可能ファイル /etc/netctl/interfaces/<interface>
を作成することで、特定のネットワークインターフェイスでクライアントを指定することもできます:
DHCPClient='dhclient'
トラブルシューティング
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
を確認して、以下のどちらかを行なって下さい:
1. デバイスが立ち上がっている場合 (上記の場合 wlan0
):
network[2322]: The interface of network profile 'wlan0-ssid' is already up
インターフェイスを落とすように設定すれば問題は解決します:
# ip link set wlan0 down
一度落としてから再試行してください:
# netctl start wlan0-ssid
2. インターフェイスが落ちている場合:
dhcpcd[261]: wlan0: ipv4_sendrawpacket: Network is down
dhclient など、別の DHCP クライアントを使えば解決します。クライアントのパッケージをインストールしてから netctl を設定してください:
/etc/netctl/wlan0-ssid
... DHCPClient='dhclient'
ForceConnect
オプションを追加することで解決することもあります:
/etc/netctl/wlan0-ssid
... ForceConnect=yes
プロファイルを保存したら再度接続を試行してください:
# netctl start wlan0-ssid
dhcpcd: ipv4_addroute: File exists
dhcpcd と netctl を組み合わせた場合、特にスリープしている間にネットワークを切り替えたときに、復帰時にタイムアウトの問題が発生することがあります。netctl は接続が成功したと報告しますがタイムアウトしてしまいます。このような場合、古いデフォルトルートが残存していて新しくなっていません。この問題を回避するにはデフォルトの dhcp クライアントとして dhclient を使うようにしてください。詳しくは こちら を参照。
DHCP がタイムアウトする問題
DHCP でリースを要求するときにタイムアウトの問題が発生する場合、タイムアウトの値を netctl のデフォルト値である30秒よりも高く設定することができます。/etc/netctl/hooks/
や /etc/netctl/interfaces/
にファイルを作成して、ファイルに TimeoutDHCP=40
を追加して実行可能権限を与えればタイムアウト値が40秒になります。
接続がタイムアウトする問題
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
設定を変更したらプロファイルを reenable してください:
# 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=suspend.target [Service] Type=oneshot ExecStart=/usr/bin/systemctl restart netctl-auto@%i.service [Install] WantedBy=suspend.target
ワイヤレスカードでサービスを有効化するには、root で netctl-auto-resume@wlan0.service
などを有効化してください。wlan0
は適当なネットワークインターフェイスに置き換えてください。
netctl-auto で突然 WiFi アダプタが動作しなくなる
この問題は最近の wpa_supplicant のアップデートが関連しています (FS#44731 を参照)。ただし回避方法はとても簡単です。/etc/netctl/interfaces
にあなたの使っているインターフェイスの名前のファイル (例: wlp3s0) を以下の内容で作成して実行可能属性を付与してください:
/etc/netctl/interfaces/wlp3s0
WPAOptions="-m ''"
その後、netctl-auto
サービスを再起動すれば WiFi の自動検出がまた動作するようになります。
netctl-auto で自動的にワイヤレスカードのブロックを解除してインターフェイスを使うことができない
多くのノートパソコンにはワイヤレスカードをオフにするハードウェアボタン (あるいはスイッチ) が付いていますが、カードのブロックはカーネルでも行われます。ブロックは rfkill によって処理されています。
netctl-auto でワイヤレスカードのブロックを自動的に解除して特定のネットワークに接続したい場合、使用するワイヤレス接続のプロファイルで RFKill=++auto++
オプションを設定してください。詳しくは netctl.profile(5) の man ページを参照。
参照
- 公式アナウンススレッド: https://bbs.archlinux.org/viewtopic.php?id=157670
- AUR に cinnamon アプレットがあります: cinnamon-applet-netctl-systray-menuAUR[リンク切れ: アーカイブ: aur-mirror]