udhcpc: нет арендной ставки, сбой при загрузке на встроенном Linux, созданном с помощью Buildroot

Вопрос или проблема

udhcpc: нет арендной ставки, сбой при загрузке на встроенном Linux, созданном с помощью Buildroot

Отзывчивость сервиса Linux udhcpc (родной DHCP по отношению к сервису /etc/init.d/S40network, который вызывает ip up и udhcpc) различается до и после входа в систему на командной строке.

Когда udhcpc вызывается через /etc/init.d/rcS (последовательность загрузки), он не назначает IP-адрес:

udhcpc: no lease, failing

Однако после входа в систему с учетной записью root, S40network restart очень быстро предоставляет IP-адрес через udhcpc.

Файл /etc/inittab нормальный и базовый:

# /etc/inittab
#
# Copyright (C) 2001 Erik Andersen <[email protected]>
#
# Обратите внимание: BusyBox init не поддерживает уровни выполнения. Поле уровней выполнения
# полностью игнорируется BusyBox init. Если вам нужны уровни выполнения, используйте
# sysvinit.
#
# Формат для каждой записи: <id>:<уровни выполнения>:<действие>:<процесс>
#
# id        == tty для выполнения, или пустое для /dev/console
# уровни выполнения == игнорируются
# действие    == одно из sysinit, respawn, askfirst, wait и once
# процесс   == программа для запуска

# Запуск системы
::sysinit:/bin/mount -t proc proc /proc
::sysinit:/bin/mount -o remount,rw /
::sysinit:/bin/mkdir -p /dev/pts
::sysinit:/bin/mkdir -p /dev/shm
::sysinit:/bin/mount -a
::sysinit:/bin/hostname -F /etc/hostname
# теперь выполняем любые rc-скрипты
::sysinit:/etc/init.d/rcS

# Поместить getty на последовательный порт
ttyPS0::respawn:/sbin/getty -L  ttyPS0 0 vt100 # GENERIC_SERIAL

# Действия для тройного сигнала
#::ctrlaltdel:/sbin/reboot

# Действия перед перезагрузкой
::shutdown:/etc/init.d/rcK
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r

Как мы можем это объяснить?

У меня была та же проблема, что и у вас: она не проходила во время загрузки, но работала нормально, если ее вызывать вручную после этого. Проверяя различные журналы, я понял, что udhcpc инициализировался, пока интерфейсы поднимались, и поэтому первые несколько запросов на обнаружение на самом деле не отправлялись через интерфейс.

В идеале я бы сделал так, чтобы udhcpc не запускался, пока интерфейс не станет стабильным, но поскольку я не знал, как это сделать, я просто увеличил количество попыток, которые делает udhcpc. Обычно он получает IP после 4-5 попыток, но я увеличил предел до 10 попыток, чтобы покрыть любые крайние случаи.

Добавьте вторую строку ниже в /etc/network/interfaces

iface eth0 inet dhcp
  udhcpc_opts -t 10 # устанавливает максимальное количество попыток в 10
  # остальная часть параметров конфигурации

Ответ или решение

Проблема, с которой вы столкнулись, связана с тем, что DHCP-клиент udhcpc инициализируется слишком рано в процессе загрузки, когда сетевой интерфейс еще не готов принимать пакеты. В результате udhcpc не может получить IP-адрес и завершается с сообщением "udhcpc: no lease, failing". Однако после загрузки системы и успешного входа в систему вручную udhcpc может корректно настроить сетевой интерфейс, так как к тому времени интерфейс уже полностью инициализирован.

Решение вашей проблемы включает несколько шагов. Во-первых, важно убедиться, что udhcpc запускается только после того, как сетевой интерфейс полностью инициализирован и готов к работе. Это можно сделать, изменив порядок выполнения скриптов и выставив задержку перед запуском udhcpc.

Вот несколько рекомендаций для исправления ситуации:

  1. Увеличьте время ожидания перед попыткой запуска udhcpc:
    Вы можете увеличить количество попыток, которые udhcpc делает, прежде чем сдаться, чтобы компенсировать время, необходимое для инициализации интерфейса.

    Откройте файл сетевых настроек, который используется вашей системой (например, /etc/network/interfaces), и добавьте следующую строку в соответствующий блок для вашего интерфейса (например, eth0):

    iface eth0 inet dhcp
     udhcpc_opts -t 10  # Установите максимальное количество попыток на 10
     # Остальные параметры конфигурации
  2. Проверьте порядок инициализации интерфейса в скриптах RC:
    Убедитесь, что ваша сетевая конфигурация запускается после полной инициализации всех необходимых системных служб. Проверьте скрипты, которые используются в /etc/init.d/rcS, чтобы убедиться, что вы вызываете udhcpc в правильный момент, когда интерфейс уже активен.

    Возможно, вам нужно вручную вызвать команды ifup для вашего интерфейса перед запуском udhcpc, что даст дополнительные гарантии, что интерфейс готов к работе.

  3. Добавьте вывод для отладки:
    Вы можете добавить еще несколько команд вывода в ваш скрипт, чтобы следить за тем, когда именно начинается процесс конфигурации сети и что происходит с сетевым интерфейсом. Это может помочь вам более точно определить, где происходят задержки или сбои.

Если после выполнения этих шагов проблема не исчезнет, вам может понадобиться рассмотреть логи, которые генерируются udhcpc, чтобы понять, какие конкретно ошибки возникают в процессе обращения к серверу DHCP. Данная информация поможет вам в дальнейшей диагностике и исправлении проблемы.

Надеюсь, эти рекомендации помогут вам решить проблему с получением IP-адреса в процессе загрузки вашей системы на базе Linux, созданной с помощью Buildroot. Если вы нуждаетесь в дополнительной помощи, не стесняйтесь задавать вопросы.

Оцените материал
Добавить комментарий

Капча загружается...