DHCP3サーバーを後で起動して、ブリッジインターフェイスが初期化されるのを待ってからロードする方法を教えてください。


8

現在、仮想マシンで使用するために、dhcp3-serverとブリッジインターフェイス(br0)でセットアップされたUbuntu 10.04サーバーがあります。私が抱えている問題は、サーバーが再起動すると、ブリッジされたインターフェースを起動することによって引き起こされる余分な遅延のために、dhcp3-serverがロードに失敗することです。

基本的に、br0は、DHCP3-serverがロードを試みた後、ブートサイクルの後半までDHCP3-Serverで使用するIPアドレスを持ちません。

サーバーが起動したら、問題なく「/etc/init.d/dhcp3-server start」を実行できます。

私ができる方法はありますか?-ロードしようとする前に、インターフェイスがロードされるまでdhcp3-serverを強制的に待機させますか?-他のすべてがロードされた後でdhcp3-serverを起動しますか?

回答:


9

1つの解決策は、dhcp-serverに自動的に起動しないように指示し、次の2行を/etc/network/interfacesファイルに追加してブリッジ定義を定義することです。

post-up /etc/init.d/dhcp3-server start
pre-down /etc/init.d/dhcp3-server stop

結局こんな感じになってしまいます

iface br0 inet static
    bridge_ports eth0 eth1
    address 192.168.1.2
    broadcast 192.168.1.255
    netmask 255.255.255.0
    gateway 192.168.1.1
    post-up /etc/init.d/dhcp3-server start
    pre-down /etc/init.d/dhcp3-server stop

このように、ネットワーク管理(ifup / ifdown、not network-manager)は、ブリッジを起動した後にDHCPサーバーを起動し、ブリッジを削除する前にシャットダウンします。


私は両方の答えをテストしましたが、このポストアップ/プレダウンソリューションははるかにクリーンでアップグレードに適しています。素晴らしい提案をありがとう!私はこのような単純な解決策を求めて高低を検索しました
user2009

私の喜び;)感謝するのはいつも素晴らしいことです。
LassePoulsen 2010

2

/etc/init.d/dhcp3-server起動スクリプトを変更して、でIPアドレスが利用可能になるのを待つことができますbr0。たとえば:(警告:テストされていないコード!)

# wait 5 secs between br0-ready tests
wait_time_between_probes=5
# maximum number of attempts (i.e., timeout)
max_attempts=10

log_progress_msg "Waiting for br0 to get an IP address"
for n in $(seq 1 $max_attempts); do
  if /sbin/ifconfig br0 | egrep -q "inet addr:" ; then
    # IP address ready on br0, exit loop
    break
  else
    sleep $wait_time_between_probes
  fi
done
if [ "$n" = "$max_attempts" ]; then
    log_warning_msg "Maximum number of attempts reached, but br0 has no IP address yet" 
    log_warning_msg "Continuing anyway but DHCP3 server might not start correctly"
fi 

スニペットはcase ... start)、DHCP3デーモンを起動する前に、パーツ内の起動スクリプトに挿入する必要があります。もちろん、環境に合わせて待機時間と試行回数を調整する必要があります(br0がIPアドレスを取得するのにどのくらい時間がかかりますか?)


これは間違いなく正しい方向に進んでいます。「/etc/init.d/dhcp3-server」の「case "$ 1" in start)」の直後にこれを配置しましたが、条件「/ sbin / ifconfig br0 | fgrep -q "addr:"」がなくても成功するようですブリッジインターフェースをオンラインにします。端末に「/ sbin / ifconfig br0 | fgrep -q "addr:"」と入力しても出力されません。
user2009

また、些細なことですが、スクリプトの最後にある2つの「log_warning_msg」は、成功と失敗に関係なく表示されます。失敗時にこれらのメッセージを正しく表示するために、if(max_attempts = n)スタイルのステートメントを使用して、ログ内のほうがよいでしょうか?
user2009

また、通常のブリッジインターフェースは、インターフェースがロードされてからdhcp3-serverに障害が発生するのに十分な時間だけ、さらに5〜10秒かかります。
user2009

@ user2009次のgrep -q行について:1.ブリッジは、起動するとすぐにIPv6アドレスを取得するため、一致しないと思います。IPv4アドレスのみに関心がある場合は、grep行をgrep -q 'inet addr:'(上記で既に)置き換えてください。それ以外の場合は、ブリッジのすべての可能な最終 IPアドレスと一致する、より複雑な正規表現を見つける必要があります。2. -qオプションは出力を抑制します(と同様> /dev/null
Riccardo Murri

@ user2009へのコメントありがとうございlog_warning_msgます。私はあなたの提案に従ってそれを修正したと思います
Riccardo Murri
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.