Назад | Перейти на главную страницу

ifconfig не сообщает адрес, назначенный DHCP

Я обновляю ядро ​​для устройства и столкнулся с изменением работы DHCP. Ближе к концу моего загрузочного скрипта я проверяю, есть ли у меня уже назначенный DHCP адрес, а если нет, я назначаю самостоятельно:

ifconfig eth0 169.254.1.1 up

Затем, когда DHCP наконец получает мне адрес, он назначает его eth0. И, на самом деле, это действительно происходит: если я могу выяснить адрес устройства, я могу поговорить с ним по этому адресу, назначенному DHCP.

Однако ifconfig продолжает показывать адрес 169.254.1.1.

Это новое поведение, которое я наблюдаю с dhcpcd 5.2.12 и linux 3.2.9.

Как я могу самостоятельно назначить адрес в случае отсутствия DHCP-сервера, позволить DHCP переопределить это назначение, когда он появляется, и впоследствии, как я могу узнать свой назначенный DHCP адрес?

root@appliance:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:22:4D:4F:B3:69  
          inet addr:169.254.1.1  Bcast:169.254.255.255  Mask:255.255.0.0
          inet6 addr: fe80::222:4dff:fe4f:b369/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2686 errors:0 dropped:1 overruns:0 frame:0
          TX packets:589 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:403995 (394.5 Kb)  TX bytes:73691 (71.9 Kb)
          Interrupt:20 Memory:fa200000-fa220000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:10 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:985 (985.0 b)  TX bytes:985 (985.0 b)

root@appliance:~# grep dhcp /var/log/messages
Jul 18 16:03:55 (none) dhcpcd[2330]: version 5.2.12 starting
Jul 18 16:03:56 (none) dhcpcd[2330]: eth0: waiting for carrier
Jul 18 16:03:57 (none) dhcpcd[2330]: eth0: carrier acquired
Jul 18 16:03:57 (none) dhcpcd[2330]: eth0: broadcasting for a lease
Jul 18 16:03:57 (none) dhcpcd[2330]: eth0: offered 10.10.0.177 from 10.10.0.1
Jul 18 16:03:57 (none) dhcpcd[2330]: eth0: acknowledged 10.10.0.177 from 10.10.0.1
Jul 18 16:03:57 (none) dhcpcd[2330]: eth0: checking for 10.10.0.177
Jul 18 16:04:02 (none) dhcpcd[2330]: eth0: leased 10.10.0.177 for 86400 seconds
Jul 18 16:04:02 (none) dhcpcd[2330]: forked to background, child pid 2868

Я нашел достойный обходной путь. Вместо того, чтобы настраивать eth0 на фиксированный IP-адрес, я создал виртуальный сетевой интерфейс, который будет действовать как резерв. Отсюда:

ifconfig eth0:0 169.254.1.1 up

Если DHCP-сервера нет, я могу разговаривать с устройством, используя адрес 169.254, а если есть DHCP-сервер, он назначается eth0, и я могу увидеть его с помощью ifconfig!

Вся идея RFC3927 заключается в том, что адрес не должен иметь состояния. Таким образом, предполагается, что клиенты DHCP случайным образом генерируют два последних октета адреса и впоследствии проверяют уникальность указанного адреса через ARP. Статическая установка значения (например, 169.254.1.1) не дает этой цели. Позвольте dhcpcd (или любому другому клиенту, который вы используете) выполнить свою работу, и он может решить вашу проблему.