Вопрос или проблема
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
.
Вот несколько рекомендаций для исправления ситуации:
-
Увеличьте время ожидания перед попыткой запуска
udhcpc
:
Вы можете увеличить количество попыток, которыеudhcpc
делает, прежде чем сдаться, чтобы компенсировать время, необходимое для инициализации интерфейса.Откройте файл сетевых настроек, который используется вашей системой (например,
/etc/network/interfaces
), и добавьте следующую строку в соответствующий блок для вашего интерфейса (например,eth0
):iface eth0 inet dhcp udhcpc_opts -t 10 # Установите максимальное количество попыток на 10 # Остальные параметры конфигурации
-
Проверьте порядок инициализации интерфейса в скриптах RC:
Убедитесь, что ваша сетевая конфигурация запускается после полной инициализации всех необходимых системных служб. Проверьте скрипты, которые используются в/etc/init.d/rcS
, чтобы убедиться, что вы вызываетеudhcpc
в правильный момент, когда интерфейс уже активен.Возможно, вам нужно вручную вызвать команды
ifup
для вашего интерфейса перед запускомudhcpc
, что даст дополнительные гарантии, что интерфейс готов к работе. - Добавьте вывод для отладки:
Вы можете добавить еще несколько команд вывода в ваш скрипт, чтобы следить за тем, когда именно начинается процесс конфигурации сети и что происходит с сетевым интерфейсом. Это может помочь вам более точно определить, где происходят задержки или сбои.
Если после выполнения этих шагов проблема не исчезнет, вам может понадобиться рассмотреть логи, которые генерируются udhcpc
, чтобы понять, какие конкретно ошибки возникают в процессе обращения к серверу DHCP. Данная информация поможет вам в дальнейшей диагностике и исправлении проблемы.
Надеюсь, эти рекомендации помогут вам решить проблему с получением IP-адреса в процессе загрузки вашей системы на базе Linux, созданной с помощью Buildroot. Если вы нуждаетесь в дополнительной помощи, не стесняйтесь задавать вопросы.