На машине работает SuSE 11.2. Я настроил его для подключения с использованием DHCP с помощью графического сетевого интерфейса YaST2.
Когда я dhcpcd -k eth0
а потом dhcpcd eth0
потом почти мгновенно получаю аренду и все хорошо. Однако если я ifdown eth0
а потом ifup eth0
Я не получаю IP-адрес около 20 секунд. Анализ потока сетевых пакетов показывает, что в сценарии ifdown / up запрос DHCP передается успешно, но ответа не приходит.
РЕДАКТИРОВАТЬ: То же самое происходит во время загрузки. Широковещательный пакет отправляется до того, как ссылка становится активной.
/ var / log / messages показывает следующее:
6 декабря 14:21:50 olm ifup: устройство eth0: Broadcom Corporation NetXtreme BCM5721 Gigabit Ethernet PCI Express (rev 21)
6 декабря 14:21:51 ядро olm: [3389.717366] tg3 0000: 02: 00.0: PME # отключено
6 декабря 14:21:51 ядро olm: [3389.936570] ADDRCONF (NETDEV_UP): eth0: ссылка не готова
6 декабря 14:21:51 olm ifup-dhcp: запуск клиента DHCP4 на eth0
6 декабря 14:21:51 olm dhcpcd [11807]: eth0: запуск dhcpcd 3.2.3
6 декабря 14:21:51 olm dhcpcd [11807]: eth0: аппаратный адрес = 00: 10: 18: 30: 60: 3c
6 декабря 14:21:51 olm dhcpcd [11807]: eth0: трансляция в аренду
6 декабря 14:21:51 olm ifup-dhcp:.
6 декабря 14:21:53 ядро olm: [3392.126437] tg3: eth0: Канал работает на скорости 1000 Мбит / с, полный дуплекс.
6 декабря, 14:21:53 ядро olm: [3392.126441] tg3: eth0: Управление потоком включено для TX и включено для RX.
6 декабря 14:21:53 ядро olm: [3392.127000] ADDRCONF (NETDEV_CHANGE): eth0: ссылка становится готовой
6 декабря 14:21:54 olm ifup-dhcp:.
6 декабря 14:21:55 olm avahi-daemon [3414]: Регистрация новой записи адреса для fe80 :: 210: 18ff: fe30: 603c на eth0. *.
6 декабря 14:21:57 olm ifup-dhcp:.
6 декабря 14:21:59 olm ifup-dhcp:
6 декабря 14:21:59 olm ifup-dhcp: eth0 DHCP4 продолжает работать в фоновом режиме
6 декабря, 14:22:04 ядро olm: [3403.004015] eth0: маршрутизаторы IPv6 отсутствуют
6 декабря, 14:22:11 olm dhcpcd [11807]: eth0: истекло время ожидания
6 декабря 14:22:11 olm dhcpcd [11807]: eth0: пытается использовать старую аренду в `/var/lib/dhcpcd/dhcpcd-eth0.info '
6 декабря 14:22:11 olm dhcpcd [11807]: eth0: добавление IP-адреса 172.26.59.123/26
6 декабря, 14:22:11 olm dhcpcd [11807]: eth0: добавление маршрута по умолчанию через метрику 172.26.59.65 0
Особо следует отметить, что dhcpcd транслирует аренду до того, как ссылка eth0 станет готова. Он никогда не получает ответа, потому что трансляция никуда не делась.
Итак, мой вопрос: почему ifup-dhcp запускает процесс DHCP до того, как ссылка будет готова? и как заставить его нормально ждать?
Я выяснил причину, по которой он запрашивает аренду, прежде чем ссылка будет готова. Это потому, что ifup-dhcp пытается дождаться готовности интерфейса перед вызовом dhcpcd, но использует функцию is_iface_up
который определен в /etc/sysconfig/network/scripts/functions
, и эта функция проверяет только, что eth0 существуют перед возвратом положительного результата.
Я также нашел (немного) более долгосрочное решение. ifup-dhcp ожидает положительного результата от is_iface_up, а затем ожидает дополнительное количество секунд, как определено DHCLIENT_SLEEP, которое можно найти в / etc / sysconfig / network / dhcp. Установив DHCLIENT_SLEEP = "3", интерфейс теперь успевает подготовиться перед вызовом dhcpcd, несмотря на то, что is_iface_up возвращается слишком рано. Это также с меньшей вероятностью будет заторможено обновлениями.
Если ящик находится в сети с связующим деревом, это может быть задержкой для активации ссылки. Это не должно быть проблемой во время перезагрузки, но будет для операции остановки / запуска. Вы всегда можете уснуть в сценарии ifup, но на самом деле это просто хакер. Другой вариант - написать некоторую логику в сценарии ifup для проверки статуса ссылки перед вызовом dhcp. Ссылку можно проверить с помощью ethtool. Или вы можете просто увеличить тайм-аут клиента DHCP. Изменение сценария ifup может быть перезаписано обновлениями.