Raspbian stretchのインターフェース設定に苦戦中です

Raspberry Pi 3
Raspberry PiのOS、RaspbianがDebian 9 stretchベースになりました。
ネットワーク名の規則が変わったため今後どう対応したらよいか調べています。
結論は・・・どうしたら良いかわからない!


Raspberry PiとTinker Boardで遊んでいます。どちらのOSもDebian 9 stretchベースとなりました。
自分の頭の中の整理のためまとめています。私は基本的にWindowsユーザーなので記事内容に間違えがあるかもしれません。

インターフェースの名前の規則が変わった

WiFiを使ったホットスポット化のスクリプトを作っていました。
関連記事:外出時にRaspberry Pi 3を起動すると自動的にホットスポットになるスクリプトを作りました(RPi3_Switchable_HOTSPOT)
この設定には"/etc/network/interfaces"ファイルをいじっていました。
ネットワークインターフェース名の命名規則が変わった事に対応しなくてはなりません。
New method for naming network interfaces
"The installer and newly installed systems will use a new standard naming scheme for network interfaces instead of eth0, eth1, etc. "
Predictable Network Interface Names ということでインターフェース名の与え方が変わって行くようです。
そして今回USB接続のインターフェース名が変わりました。

なんで変わったの?

"Predictable" 予測可能という事らしいのですが、何が問題で変わって行くのでしょうか?
今までは有線ネットワークにはeth0,eth1,...などの名前がついていました。物理インターフェースが一つしかないコンピュータならばほぼeh0という名前が付きます。物理インターフェースが2つある場合はどうでしょうか?eth0とeth1という名前が付くのですが、どちらの物理インターフェースがeth0になるかシステムを動かさないと判りませんでした。しかも、毎回同じか?という疑念もあります。
特に問題になるのがUSB接続のインターフェースが当たり前になった点です。同じネットワークUSBドングルを異なるUSBポートにつなぐとeth0だったものがeth1になったりします。
もちろん明示的に名前を割り当てる方法もありましたが。

何に困ってるの?

問題点に関しては良くわかります。ルーターにしたい場合など、どちらのポートがWANでどちらがLANなのか、時々逆になってますでは話になりません。

ですが今回のRaspbianで実装さた名前は物理インターフェースのMACアドレスを使っている点が困るのです。
試しに表示してみます。
$ ls /sys/class/net
enxaabbcc001122  lo  wlan0
無線インターフェースはwlan0のままです。USB接続ではないからですね。WiFi USBドングルを付けると新しい名前になるようです。
enxaabbcc001122が有線インターフェースです。aabbcc001122がMACアドレスになります。Raspberry Piでは有線LANはUSBインターフェースでSoCと接続されています。MACアドレスを使っているため通常は同じ名前のものは存在しません。これで一意にインターフェースを特定できます。

しかしこれは一意的過ぎて困っています。複数のコンピュータの初期化などにスクリプトを使う事があるでしょう。今まではそのスクリプトにeth0と書いておけば良かったのですが、今回のバージョンに合わせるには事前に個々のコンピュータのMACアドレスを調べスクリプトでMACアドレスに沿ったインターフェース名を使うようにしなくてはなりません。
もちろんスクリプト内でインターフェース名を探すようにできます。ですがこれでは今までと同じです。今までもインターフェースを特定したければ事前にインターフェースの名前がどう与えられたか調べます。
結局、名前が変わったことによるメリットは何もありません。

"/etc/network/interfaces"ファイルの記述にも困ります。あまりにも固有すぎるインターフェース名のため、汎用的なファイルになりません。物理インターフェースとの関係が強まってしまい設定の階層分けがめちゃくちゃになってます。物理インターフェースと関係ない記述が出来なくては本来の機能を発揮しないのではないでしょうか。

1台のコンピュータだけを設定する場合はメリットがあるでしょう。名前を決め打ちすれば簡単確実に物理インターフェースを指定できます。

どうしたら良いか?

みなさん悩んでいるようでフォーラムも賑やかでした。
[Solved] Raspbian stretch - how do I restore original Ethernet names
ここにもあるように、新しい命名規則を使わないようにする設定も当然できます。
Raspbianの場合はこうするようです。
Yoramro Fri Aug 18, 2017 4:59 am
"I can confirm that adding net.ifnames=0 at /boot/cmdline.txt restores behavior to the previous one. "
/boot/cmdline.txtファイルに"net.ifnames=0"と書き加えれば良いようです。

ある程度汎用的なスクリプトを作りたいと思うと、旧式の名前と新しい名前の両方を考慮したスクリプトにしなくてはなりません。
となると自動的に新しい名前に対応する事になりますが・・・動作検証の手間が増えます。

先ほどのフォーラムでもいろいろ対応が議論されています。
私がやろうかと思っていたインターフェースにエイリアス名を付けられれば・・・仮想インターフェースを作っちゃう場合はこんな風にやるようです。
Heater Thu Aug 17, 2017 5:41 pm
"Not sure if this helps but one can add a virtual Ethernet interfaces on top of an existing hardware interface.
$ ip link add link enb827eb351305 name eth0 type macvlan
After that any script using eth0 should (might) work."
ですが元のインターフェース名を特定できません。どうしたら良いでしょうか。というのが次の課題です。
物理インターフェースがUSBポートのどこにつながっているかを調べて特定するくらいしか思いつきません。オンボードのインターフェースなら有効な手段かと思います。しかし、USB接続のインターフェースとその目的をスクリプトで判断するのは困難です。

結局、名前を変えたメリットが何も無いのです。

あとがき

今回の変更は初心者に一番影響が出るでしょう。ネットワーク周りの設定の仕方を調べても、ほぼ全てが使えなくなりました。途方に暮れる事は間違いありません。そしてこれから、旧式に設定し直しましょう、という記事が増えていくことでしょう。

この問題は置いておいてWindowsな初心者がLinuxの使い方を調べるなら1年以内の結果に絞った方が良いと思います。Linuxはディストリビューションとバージョンが異なれば全く別のものとして読む気構えが必要です。似て非なるものの情報が多すぎます。
Microsoftに文句を言って問い合わせればいいWindowsとの大きな違いです。
閑話休題

Windowsな私はできるだけ新しい仕様に合わせたいのですが、今回のインターフェース名にどう対応して良いかわかりません。スクリプトがとても書きにくい。

もう1層、物理インターフェースとインターフェース名を関連付ける仕組みが必要ですね。udevでやれる事なんでしょうけど、多種多様なスクリプトが勝手に書き換えて良い所ではありませんし、すぐに整合が取れなくなります。
少なくともMACアドレスという固有な名前でなければ楽なんですけど。抽象化するのがソフトウエアの良いところなのに台無しです。ID_NET_NAME_MACではなくID_NET_NAME_SLOTならもう少しやりやすいのに。あれ?そうすると想定される名前が増えるだけで良いことないですね。今後インターフェース周りのスクリプトは書けないですよ。
エイリアス名を勝手に付けるのが当面の解決策でしょうか?

ちなみにTinkerOSでは旧式の名前のままのようです。

個人の環境なら何でもありなので、とりあえずWiFiホットスポット化を試みているのですが・・・ネットワークの起動すらできないという体たらくです。
今回の名前に限らず初期設定の流儀も変わってるはずなのでどうなったか調べるのが大変です。

コメント

最近のコメント

Threaded Recent Comments will be here.