Bagaimana saya bisa memulai DHCP3-server nanti, sehingga menunggu antarmuka jembatan untuk diinisialisasi sebelum memuat?

8

Saya memiliki server Ubuntu 10,04 saat ini setup dengan server dhcp3 serta antarmuka yang dijembatani (br0) untuk digunakan dengan mesin virtual. Masalah yang saya miliki adalah ketika server reboot, server dhcp3 gagal memuat karena keterlambatan tambahan yang disebabkan oleh memunculkan antarmuka bridged.

Pada dasarnya br0 tidak memiliki alamat IP untuk digunakan dengan DHCP3-Server hingga akhir siklus boot, jauh setelah server DHCP3 berusaha memuat.

Setelah server boot saya dapat menjalankan '/etc/init.d/dhcp3-server start' tanpa masalah.

Apakah ada cara saya dapat: - Memaksa dhcp3-server untuk menunggu sampai antarmuka telah dimuat sebelum mencoba memuat? - Mulai dhcp3-server setelah semuanya dimuat?

pengguna2009
sumber

Jawaban:

9

Salah satu solusinya adalah memberi tahu dhcp-server untuk tidak memulai secara otomatis dan kemudian menambahkan dua baris berikut ke /etc/network/interfacesfile Anda untuk Anda menjembatani definisi

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

Jadi akhirnya akan terlihat seperti ini

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

Dengan cara ini manajemen jaringan (ifup / ifdown, BUKAN network-manager) akan memulai server DHCP setelah membuka jembatan, dan mematikannya sebelum melepaskan jembatan.

LassePoulsen
sumber
Saya telah menguji kedua jawaban dan solusi post-up / pre-down ini jauh lebih bersih dan ramah upgrade. Terima kasih banyak atas saran bagusnya! Saya mencari tinggi dan rendah untuk solusi sederhana seperti ini
user2009
Kesenangan saya;) selalu menyenangkan untuk dihargai.
LassePoulsen
2

Anda dapat memodifikasi /etc/init.d/dhcp3-serverskrip startup untuk menunggu alamat IP tersedia br0. Misalnya: (Peringatan: kode yang belum diuji!)

# 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 

Cuplikan harus masuk ke skrip startup, di dalam case ... start)bagian, sebelum startup daemon DHCP3. Tentu saja, Anda harus menyetel waktu tunggu dan jumlah upaya untuk mencocokkan lingkungan Anda (berapa lama yang diperlukan untuk br0 untuk mendapatkan alamat IP?)

Riccardo Murri
sumber
Ini jelas di jalur yang benar. Saya menempatkan ini segera setelah "case" $ 1 "di awal)" di "/etc/init.d/dhcp3-server" namun kondisi "/ sbin / ifconfig br0 | fgrep -q" addr: "" tampaknya berhasil walaupun tanpa antarmuka jembatan online. Mengetik "/ sbin / ifconfig br0 | fgrep -q" addr: "" di terminal tidak menghasilkan keluaran.
user2009
Juga meskipun sepele dua 'log_warning_msg' di akhir skrip akan menunjukkan terlepas dari keberhasilan dan kegagalan. apakah mereka akan lebih baik di dalam log dengan pernyataan gaya if (max_attempts = n) untuk menampilkan pesan-pesan ini dengan benar saat gagal?
user2009
Antarmuka jembatan normal juga membutuhkan tambahan 5 - 10 detik setelah antarmuka dibuka, cukup lama agar server dhcp3 gagal.
user2009
@ user2009 Mengenai grep -qgaris: 1. Saya pikir pertandingan gagal karena jembatan memperoleh alamat IPv6 segera setelah terserah. Jika Anda hanya tertarik pada alamat IPv4, cukup ganti grepbaris dengan grep -q 'inet addr:'(sudah dilakukan di atas); jika tidak, ekspresi reguler yang lebih kompleks perlu ditemukan, yang cocok dengan semua alamat IP akhir yang mungkin dari jembatan Anda. 2. -qOpsi ini menekan output (seperti > /dev/null)
Riccardo Murri
@ user2009 terima kasih atas komentarnya log_warning_msg; Saya pikir saya telah memperbaikinya sesuai dengan saran Anda
Riccardo Murri