Дано: есть некая довольно старая железяка, работающая домашним роутером у одного человека. В этой железяке торчат три сетевухи, все они работают через драйвер r8169:
00:0a.0 Ethernet controller: D-Link System Inc DGE-528T Gigabit Ethernet Adapter (rev 10)
00:0b.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8169 Gigabit Ethernet (rev 10)
00:0c.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8169 Gigabit Ethernet (rev 10)
Есть дебиан, с ядрами 2.6.26-486, 2.6.26-2-openvz-486 и 2.6.32-5-486 (из unstable). На всех этих ядрах воспроизводится один и тот же баг, проявляющийся в следующем:
- После некоторого аптайма, при попытке поднять опущенный интерфейс, вылезает пасквиль
и нифига не поднимается. Если вместо ip li se dev ethX up использовать сыплющий песком ifconfig, песня меняется незначительно:
RTNETLINK answers: Cannot allocate memory
SIOCSIFFLAGS: Cannot allocate memory
- Аналогичный эффект проявляется сразу после загрузки, если при загрузке была автоматически запущена fsck для ext3 на /. Сеть в этом случае не поднимается вообще, ни один интерфейс.
При этом свободной памяти более чем достаточно:
total used free shared buffers cached
Mem: 249 237 12 0 69 136
-/+ buffers/cache: 30 218
Swap: 972 0 972
Особо дотошные люди могут изучить ругательства dmesg по этому поводу.
По результатам гугления сложилось впечатление, что это застарелый и никого не беспокоящий баг ядра. Уж кто-кто, а r8169 всегда изобиловал багами. Впрочем, в RHEL, ради разнообразия, их иногда фиксят, чего не скажешь о мейнстриме. Хотя наиболее эффективным решением в сложившейся ситуации мне представляется закатывание туда опенка, в котором к ядреным багам относятся без особого почтения. Однако меня еще не покинула надежда, что проблему можно решить шаманством с sysctl et cetera. Идеи?