Raspbian stretchでは/etc/network/interfacesファイルを使わない方が良いようだ

raspberry pi 3
Raspbian stretchでホットスポット化の設定をしています。
stretchになってからのネットワーク周りの動作が判ってきました。dhcpcdサービスが鍵でした。
/etc/network/interfacesファイルの書き方によってはdhcpcdサービスの起動が失敗し動作がおかしくなります。/etc/network/interfacesファイルは使わずに/etc/network/interfaces.dディレクトリを使えば良いようです。


Raspbian stretchでのネットワークの動作がjessieとは変わったようで設定に手こずっています。
見た目で一番影響があるのはインターフェース名が変わったことです。MACアドレスをインターフェース名に使うため設定ファイルの使いまわしができません。
前回の記事 Raspbian stretchのネットワークインターフェースの初期化過程を調べてみる
で動作を追いました。

この時はネットワークの初期設定にavahi-daemonが使われているのではないかと書きましたが、より直接的なものはdhcpcdだと判りました。名前がややこしいですがDHCPのクライアントデーモンです。

dhcpcdサービスがネットワークを動かしてくれる

dhcpcdはDHCPのクライアントとして動きます。これが無ければネットワークアドレスをルータから取得する事が出来なくなります。またWiFi認証を行うWPA_supplicantにも関わっているようです。dhcpcdが動いていなければWiFiのIPアドレスをルータから取得する事もできなければWiFi認証を行う事もできません。dhcpcdが止まるとデスクトップ画面のタスクバーにあるWiFi表示も動かなくなります。

dhcpcdとは別に、インターフェースの設定を/etc/network/interfacesファイルで行う事ができます。このファイルとdhcpcdの設定が競合した場合の動作がはっきりせず混乱してしまいます。フォーラムを見ていても区別がついていない感じで、なぜ動かないか、なぜ動くのか、が分からなくなります。

dhcpcdが動かなくなる

/etc/network/interfacesにDHCPが関係する記述をすると、dhcpcdの起動は失敗するようです。journalctl | grep dhcpcd でメッセージを確認すると
Not running dhcpcd because /etc/network/interfaces
こんなメッセージが残っていました。

まだ勘違いなどあるかもしれませんが、
例えば/etc/network/interfacesファイルに
iface eth0 inet dhcp
と書いてあるとします。
eth0のアドレスをDHCPサーバから取得する設定です。これはdhcpcdと競合します。この記述があるとdhcpcdサービスは起動に失敗します。そしてdhcpcdではないdhcpクライアントサービスによってアドレスが取得されるようです。
同様にstatic IPアドレスを指定してもdhcpcdは動かないでしょう。
手動でdhcpcdサービスを動かすと動きだしてしまうので最初は何が何だか分かりませんでした。

どうしたら良いのか?

/etc/network/interfacesファイルを使わないというのが一つの手です。静的IPアドレスを取得する程度ならdhcpcdの設定ファイル/etc/dhcpcd.conf をいじった方が良いでしょう。
ですが、より複雑なネットワーク設定をしたい場合は/etc/network/interfacesを使いたいです。

/etc/network/interfaces.d ディレクトリを使う

回避策の一つとして/etc/network/interfaces.dディレクトリを使うことができるようです。jessieのころから/etc/network/interfacesファイルに
source-directory /etc/network/interfaces.d
と書いてありました。具体的な使い方がどこで説明されているかわからないのですが、このディレクトリへinterfacesファイルへ記述するのと同じ内容のファイルを置いておけば良いようです。

つまり、/etc/network/interfacesファイルは何も変更せず、/etc/network/interfaces.dに設定を記述したファイルを置きます。ファイル名に拡張子をつけなければ読み込むようです。複数のファイルに分割して書けるようです。

このディレクトリでの記述にDHCP関連の設定が有ってもdhcpcdは起動します。

あとがき

dhcpcdがネットワークの重要な役割を担っている事がわかってきました。そして、dhcpcdが簡単に動作を停止してしまう事もわかりました。

/etc/network/interfacesの記述が自由にできないと複雑なネットワーク設定をどう書いて良いのか分からず困ってしまうと思いました。/etc/network/interfaces.dディレクトリに設定ファイルを置いておけば今までの設定がほぼそのまま使える事も判りました。

これでやっとホットスポット化のスクリプトが書けそうです。
関連記事:Raspberry Pi 3とUSB 3Gモデムでワイヤレスホットスポットを作る

コメント

  1. Signal Flag "Z" 様 お名前が見当たらず失礼します。

    ラズパイのAP化の記事はかなりWeb上でありいろいろ試していたのですが
    HomeWiFiの切り替えができるものはなく、困っていましたが貴兄の
    ものと出会い大変喜んでいます。
    用途は小生Excel,AccessのVBAの個人レッスンをしており出先でフロントエンドとDB接続をするためです。たいていの受講者は単体のExcel、Accessにプログラムを書いてそれを共有フォルダに入れ使いまわしています。メンテナンス性や動作の機敏さからするとあまり良い方法ではないと思っています。
    いままではDB側をUSBメモリなどに入れてお見せしているのですが説得力がありません。"RPi3_Switchable_HOTSPOT"はインストールしたばかりでこれからです。少なくとも"ifup/dwon"で切り替えできることは大変ありがたいことを
    確認しました。HomeWiFiが使えないとupdateやupgradeができないので困っていました。
    ありがとうございました。
    淸水(しみず)

    返信削除
    返信
    1. 清水様、コメントありがとうございます。お役に立てれば幸いです。
      専用機に仕立てる方法が多く、不満に思ってスクリプトを作りました。設定が少し複雑なので、独自に設定をいじった後だとスクリプトでは対処できないでしょう。何をしているかはできるだけ記事に書いたつもりですが、複数記事に分散した状態なのでわかりずらいかもしれません。
      stretch対応のこちらもご覧ください。
      https://signal-flag-z.blogspot.com/2017/09/raspbian-stretch-hotspot.html

      削除
  2. こちらこそありがとうございました。
    ここまで作るのは大変な知識と時間が必要だったと思います。
    小生今年で67歳の老人でBBS時代の通信スクリプトを作るのに
    苦労した覚えがあります。CPも通信も遅かったので細切れの
    スクリプトを書いてダミーのテキストファイルの作成、削除を
    トリガーにして処理していたことを思い出します。
    一つ質問があります。[HOTSPOT] [HOME]の切り替え時に
    [HOTSPOT]の[Ifup]したところで「内部処理エラー」のメッセージが
    でます。(処理はWindows10のリモートデスクトップで)
    でも結果はHOTSPOTにつないでみると問題なくつながっています。
    大きな問題ではありませんので時間がある時検討してみてください。
    作って頂いたスクリプトで念願の「モバイルファイルサーバー」の
    実現が叶いそうです。
    大変ありがとうございました。

    淸水(しみず)

    返信削除

コメントを投稿

最近のコメント

Threaded Recent Comments will be here.