4

Эта проблема

Мой компьютер подключен к сети, где требуется dhcp. Итак, моя конфигурация сети в /etc/rc.conf выглядит так

interface=eth0
address=
netmask=
broadcast=
gateway=

Мои демоны

DAEMONS=(!hwclock syslog-ng network netfs crond ntpd)

С этой конфигурацией Arch долго зависает при загрузке в "сети" (все равно он говорит «[готово]», но после загрузки у меня нет соединения). Я обнаружил два обходных пути:

Обходной путь 1

  • удалить network от демонов
  • запустите mii-tool --reset eth0 и dhcpcd eth0 после загрузки (каким-то образом это не работает при размещении этих команд в /etc/rc.local .

Тогда dhcp работает очень быстро (из-за сброса !). Перед выполнением первой команды ip link show eth0 имеет "NO CARRIER" в выводе. Впоследствии это не так. (Также mii-tool сначала показывает "нет связи", затем eth0: 10 Mbit, half duplex, link ok .

Обходной путь 2

  • Изменить конфигурацию сети на

    interface=eth0
    address=x.y.z.21
    netmask=255.255.255.0
    broadcast=xxx.y.z.255
    gateway=x.y.z.254
    

    тогда как x, y, z создают специфические адреса сети (хотя используется dhcp, я получаю статический ip).

  • Добавьте команды mii-tool --reset eth0 и dhcpcd eth0 в /etc/rc.local

Теперь сеть запускается быстро при загрузке (хотя я не знаю, успешно ли), команды в /etc/rc.local выполняются и после входа в систему соединение в порядке.

Что делать?

Таким образом, проблема, кажется, в том, что dhcpcd застревает в "ожидании носителя" или что-то еще.

Я не люблю обходной путь, потому что некоторые демоны нуждаются в сети (хотя они, кажется, запускаются). Что я могу сделать, чтобы eth0 готов к загрузке dhcp? Или есть другая проблема?

1 ответ1

1

Вы не можете подготовить eth0 до завершения DHCP, при условии, что вам нужен DHCP. Я подозреваю, что вы действительно хотите, чтобы компьютер завершил процесс загрузки, не дожидаясь его, и настройки сети продолжались в фоновом режиме. Например, это позволит вам быстро войти в систему, и, как правило, настройка сети будет выполнена к тому времени, когда вам это нужно. Чтобы сделать это, вместо того, чтобы сценарии инициализации сами пытались выполнить DHCP, вы должны заставить их запустить демон, который динамически заботится о конфигурации сети, включая DHCP.

Что касается наблюдения за сетевыми службами в зависимости от сети, им обычно не требуется больше, чем настраиваемый интерфейс обратной связи, при условии, что они привязаны к 0.0.0.0 вместо какого-либо определенного локального адреса. (демоны обычно делают это по умолчанию, поэтому он должен работать, если вы не заставили их привязываться к какому-либо конкретному адресу)

В целях фоновой конфигурации сети я рекомендую свой язык программирования NCD, который позволяет программировать конфигурацию сети на специальном языке. Вот простой скрипт NCD (/etc/ncd.conf), который будет выполнять DHCP на eth0:

process lan {
    # Set device.
    var("eth0") dev;

    # Wait for device, set it up, and wait for network cable.
    net.backend.waitdevice(dev);
    net.up(dev);
    net.backend.waitlink(dev);

    # DHCP configuration.
    # net.ipv4.dhcp() will block here until it obtaines an IP address.
    # Note that it will only obtain the IP address, and *not* assign it;
    # we do that with a separate command below.
    net.ipv4.dhcp(dev) dhcp;

    # Check IP address - make sure it's not local.
    # If you have other reserved subnets around, check for those too.
    ip_in_network(dhcp.addr, "127.0.0.0", "8") test_local;
    ifnot(test_local);

    # Assign IP address, as obtained by DHCP.
    net.ipv4.addr(dev, dhcp.addr, dhcp.prefix);

    # Add default route, as obtained by DHCP.
    net.ipv4.route("0.0.0.0", "0", dhcp.gateway, "20", dev);

    # Configure DNS servers, as obtained by DHCP.
    net.dns(dhcp.dns_servers, "20");
}

Чтобы использовать это, отключите network демон и вместо этого используйте демон badvpn-ncd . При запуске демон NCD будет заботиться о конфигурации вашей сети в фоновом режиме. Кроме того, вы можете протестировать его из терминала напрямую, используя программу badvpn-ncd . Вы можете установить NCD из AUR .

Если ваши демоны действительно зависят от работоспособности сетевых интерфейсов, вы можете запустить демоны в соответствующее время из NCD с помощью команды daemon() , не используя их сценарии инициализации (недоступно в стабильной версии).

Некоторыми альтернативами NCD являются netcfg и ifplugd. Хотя они могут использовать файлы конфигурации сети Arch, они чрезвычайно ограничены по сравнению с NCD.

РЕДАКТИРОВАТЬ: Кажется, я пропустил, что ваша система имеет проблемы с обнаружением ссылки. Для проверки попробуйте загрузиться без какой-либо автоматической настройки интерфейса, не eth0 . Затем войдите и попробуйте:

ip link set dev eth0 up

Предполагая, что сетевой кабель подключен, соединение должно быстро установиться, и флаг NO CARRIER исчезнет. Если это не так, это, вероятно, проблема с вашим оборудованием (или драйверами).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .