Debian JessieとStretchの間で色々と大きな変更があったのですが、その中ネットワークインタフェースの扱いの違いが大きいです。ですが、きちんとしたドキュメントが無いためにかなり分かりにくいことになってます。Linuxのネットワーク管理について一から書くと大変な分量が必要なので、Jessie以前の設定に知識のある人向けに、Stretchでの変更点のみを書いてきます。
predictable interface names
predictable interface namesとは、eth0やwlan0, wlan1のようなOSが認識した順番で付いた名前で扱うのではなく、Mac addressをベースにしたデバイス名をインタフェースネームに用いるということです。例えば私の外付けwifiドングルの名前はwlan1ではなく、wlx0013ef6b19cbとなります。これがRaspbian Stretchの一番最初の公式リリースで有効になっていました。
ネットワーク技術者にはデバイス名が必ず一位に決定されるため好評でしたが、Jessieからの移行組には非常に評判が悪く、Raspberry Foundationは三ヶ月後のStretchリリース版からデフォルトで無効にしました。
どちらかを使うかはお好み次第ですが、有効/無効にするには、raspi-configの中の、2) Netowrk Options, N3 Network Interface Namesからpredictable interface namingの設定を変更できます。
または/boot/cmdline.txtの中の最後に
net.ifnames=0
1 (有効) 0 (無効)
を追加します。変更したらrebootが必要です。この設定を変更するとすべてのネットワーク関連のコンフィグファイル内にあるインタフェースネームを書き直すことになります。本当に必要かどうかよく考えてから変更してください。
/etc/network/interfaces – (Debian networking serviceの扱い)
Jessieでおなじみだった/etc/network/interfacesですが、Stretchでの最大の変更点はnetworking serviceがデフォルトでは事実上使用されないということです(OS起動時にexit statusになっている)。これはnetworkingサービスが動いていない状態ですから/etc/networkの下を変更しても意味はなく混乱するだけです。Stretchでは、dhcpを使うならネットワークインタフェースのip管理はすべてdhcpcdが行います。
dhcpcdを使わずに完全に固定ipアドレスのみを使用する場合には、networkingサービスでinterfacesおよび/etc/network下での設定が有効になります。この場合、dhcpcdの干渉を避けるため、dhcpcdを起動しないようにして、networkingサービスだけを有効にしてください。具体的には
systemctl disable dhcpcd
systemctl enable networking
とします。Stretchではnetworkingとdhcpcdは排他サービスと捉えて同時に起動することは絶対に避けてください。
Static IP アドレスはdhcpcd serviceで管理する!
「dhcpcdってDHCP clientデーモンさん、、、どうしてdhcpcdがstatic IPの管理までするの?」
ごもっとも。とてもまともな疑問ですが、偉い人たちが考えてStretchではそうすることにした、としか答えられません。各インタフェースにdhcpアドレスを与えるだけの場合は何も記述する必要はありませんが、static IPを与える場合には/etc/dhcpcd.confで次のように設定します。
interface wlan1
static ip_address=172.24.1.1/24
static routers=172.24.1.1
static domain_name_servers=172.24.1.1 8.8.4.4 8.8.8.8
以上の例では内蔵wifiはwlan0、wlan1はUSB wifiドングルと暗黙的に仮定しています。そして、そのwlan1にstatic IPを与える、という設定です。dhcpcdは記述されていないインタフェースに対しては適切なdhcpアドレスを与えます。思ったように特定のデバイスが特定のインタフェース名に割り振られない場合、前述のpredictable netowrking namesを有効すればそこに割り振られます。
Stretchのdhcpcdは結構バギーで、アドレスがうまく割り振られてたりしなかったりします。これは多くの人が経験していろいろな情報が飛び交って特定のコマンドを入れたら動いた、動かないの報告があります。私の経験では下手なコマンドを追加するよりも、dhcpcdを使うならまずはnetworkingサービスが動いていないことを確認してください。
/etc/wpa_supplicant/wpa_supplicant.conf
wpa_supplicantはwifiアクセス用のサイト情報を書くファイルでした。これも今でも動きます、、、動きますが多少推奨動作が変更になってます。まず重要なこと。wpa_supplicantはdhcpcdから呼び出されます。そして、wpa_supplicant.conf自体は触ってはいけない、です。なぜならwpa_supplicant.conf自体はすべてのwifiネットワークデバイスに適応されるからです。従ってこれも放置してください。次がデフォルト(米国の場合)です。
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=US
ではwifiアクセスの方法はどうやって記述するかになりますが、特定のネットワークインタフェースごとに記述することになります。具体的には、
/etc/wpa_supplicant/wpa_supplicant-InterfaceName.conf
が自動的にInterfaceNameに対して実行されます。例えばwlan0を用いてwifi APにアクセするなら、wpa_supplicant-wlan0.confというファイルを作って、その中にwifi接続用の情報を書き込むことになります。例えば次のようになります。
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=US
network={
ssid=”ねこの家”
psk=”ねこの家パスワード”
key_mgmt=WPA-PSK
}
もし、<InterfaceName>に相当する(例えばwlan1)にwpa_supplicant-InterfaceName.confが存在しない場合には(wlan1に対してwpa_supplicant-wlan1.confが無い場合)、デフォルトでwpa_supplicant.confがそのネットワークインタフェースに対して適用されます。Jessieからのwpa_supplicant.confをコピーして動作するのはこれが理由ですが、かならずしも想定どおりに動いているわけではありません。
ネットワーク・インタフェースのリスタート方法
Jessieまでは、個別のネットワーク・インタフェースが反応しなくなっときに停止・再起動することによってリセットする方法がいくつかありました。以下、<dev>はデバイス名として、
- ifup <dev>, ifdown <dev>コマンド
- ifconfig <dev> up, ifconfig <dev> down
- ip link set <dev> up, ip link <dev> down
この中で1がStretchのデフォルト設定では動作しなくなりました。理由はifup / ifdownは/etc/network/interfacesで定義されている名前を元にデバイスの操作を行おうとします。しかし、前述したとおり、Stretchでは/etc/network/interfacesは通常何も書かれていません。そのため、このコマンドを用いてもデバイス名が見つからないと実行されません。
2と3に関してはカーネル内部のデバイス名を直接参考するので問題なく動作します。どちらがいいかは慣れの問題もありますが、できれば3のipコマンドに慣れましょう。ifconfigは実装が古く、Linux自体でipコマンドの使用がおすすめになっているからです。
ipコマンドに不慣れな人には、便利なチートシートがありますので、参考にしてください。
ネットワーク・インタフェースのイベントフック方法
ネットワーク・インタフェースが起動/終了された時にコマンドを実行させることができます。以前は/etc/network/interfacesにhookされた時に実行するコマンドを書き込めたり、/etc/networkの下のif-up.d / if-down.dなどにスクリプトファイルを置いて実行させていました。
しかし、networkingサービスを使用しないですから、どこでhookさせるかと言えばdhcpcdの設定にファイルになります。もしくはwpa_supplicantもdhcpcdからhookされているので、そちらからでも可能でしょう。でも、この2つにスクリプトを追加する方法はあまりみかけません。随分と長くなってしまったので、これらはおいおい解説していきます。