Arch Linux dhcpdが起動時に起動しない - サブネット宣言が見つかりません

Arch Linux dhcpdが起動時に起動しない - サブネット宣言が見つかりません

Arch LinuxでDHCPサーバーを実行したいのですが、問題が発生しました。 dhcpdの起動に問題があります。ログイン後に手動で実行すると正常に起動します。sudo systemctl start [email protected]

私は最新バージョンのArch Linux(4.7.0-1)を実行しており、Arch Network Wikiに沿ってこれを設定しました。

私の設定

  • dhcpcd 無効
  • 私はsystemd-networkdを使用して固定IP(アクティブ化)を実行します。設定は(/etc/systemd/network/wired.network)です。

    [Match]
    Name=eth0
    
    [Network]
    Address=10.0.0.2/24
    Gateway=10.0.0.1
    
    • 私は/etc/dhcpd.confとても簡単です。

      option domain-name-servers 10.0.0.2;   
      option subnet-mask 255.255.255.0;   
      option routers 10.0.0.0.1;   
      subnet 10.0.0.0 netmask 255.255.255.0 {
          range 10.0.0.5 10.0.0.50;   
      }
      
  • システムサービスファイル()を生成し、以下を使用して有効にしました。/etc/systemd/system/[email protected]systemctl enable [email protected]

    [Unit]
    Description=IPv4 DHCP server on %I
    Wants=network.target
    After=network-pre.target
    Before=network.target
    
    [Service]
    Type=forking
    PIDFile=/run/dhcpd4.pid
    ExecStart=/usr/bin/dhcpd -4 -q -pf /run/dhcpd4.pid %I
    KillSignal=SIGINT
    
    [Install]
    WantedBy=multi-user.target
    

再起動すると、起動時(実行時journalctl -xe)エラーメッセージが表示されます。

 No subnet declaration for eth0 (no IPv4 addresses).
 ** Ignoring requests on eth0....

その後、実行すると問題なくすべてがうまく動作します。systemctl start [email protected]

多くのインターネット検索がありましたが、この問題に対する解決策が見つかりませんでした。ファイル(dhcpd.conf[email protected]およびwired.network)をハードコーディングされたインターフェイスに調整し、追加のDHCPステートメントを追加し、デバイスの要件を変更するなどの操作を試しましたが、何も機能しないようです。

答え1

dhcpdをeth0に限定してみましたか?それ以外の場合は、標準のシステムサービスファイルを単に使用できますdhcpd4.service

それでは、変えて試してみてください。

After=network-pre.target
Before=network.target

到着

After=network.target

これはにも規定されている。標準dhcpd4.service。 dhcpdにはアクティブなインターフェイスが必要なようです。起動すると保証されません。今後 network.target

答え2

私の質問に対する答えを見つけました!問題は、ネットワークの起動/設定時に起動プロセスがDHCPサービスを開始しようとするため、DHCPがバインドする作業インターフェイスを見つけることができないことです。これがすぐに開始dhcpdサービスを手動で実行すると常に機能しますが、起動時には機能しない理由です。

この記事で答えの手がかりを見つけました。Arch Linuxのdhcp - rasp-pi。ユーザーは、ユニットファイルで再起動ステートメントを使用してサービスが開始されるまで、6秒ごとにサービスを再試行しました。 - この一時的な解決策は私にも効果がありました。

systemdのウェブサイトを見つめました。特別な目標ページでこのリンクを見つけてください。ネットワーク接続後のサービスの実行。このページの提案に基づいて、次のように調整しました。

  • 内部に[Eメール保護]私が削除、Before=...変更、変更したユニットファイルAfterAfter=network-online.targetWantsWants=network-online.target
  • systemd-networkd-wait-online.service起動時に起動も有効になりました。

これで起動時に実行されます!ただし、推奨事項ページには、有効にするとsystemd-networkd-wait-online.service起動時間が遅くなり、90秒を短縮できることが示されています(正しく読んだ場合)。私の場合、ブート時間が1〜2秒ほど増加しただけでした。

関連情報