R8169 rtl_rxtx_empty_cond == 0 (loop: 42, delay: 100)

На днях собирал для тестового кластера Proxmox ноду в виде неттопа со встроенной сетевой картой RealTek. На удивление, она не заработала ни в Proxmox, ни в чистой Debian. Пришлось разбираться, в чем тут дело. Давно не сталкивался с подобными сетевыми проблемами. Когда на сервере нет сети, ты как без рук. Ничего установить или обновить нельзя, репозитории недоступны. Приходится через флешку что-то копировать и устанавливать.

Углубленный онлайн-курс по MikroTik

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Полностью ошибка выглядела примерно так:

[01448.532276] r8169 0000:09:00.0 enp3s0: rtl_rxtx_empty_cond == 0 (loop: 42, delay: 100).
[01458.532277] r8169 0000:09:00.0 enp3s0: rtl_rxtx_empty_cond == 0 (loop: 42, delay: 100).
[01468.532278] r8169 0000:09:00.0 enp3s0: rtl_rxtx_empty_cond == 0 (loop: 42, delay: 100).
[01478.532279] r8169 0000:09:00.0 enp3s0: rtl_rxtx_empty_cond == 0 (loop: 42, delay: 100).

Её было видно как в системном логе, так и на консоли сервера. Сеть не работала вообще. Меня это смутило, потому что во время работы инсталлятора Proxmox, проблем не было. Установщик получил по dhcp ip адрес на этой сетевой карте. А когда загрузилась система, сеть уже не работала.

Для проверки я установил чистый Debian 11. Ни установщик, ни сама система сеть не видели через сетевой интерфейс RealTek. Точная модель моей сетевой карты - RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller. Я немного погуглил и быстро нашёл причину ошибки. Стандартный драйвер Linux r8169 не поддерживает мою сетевую карту. Надо его отключать и вручную устанавливать другой - https://github.com/mtorromeo/r8168/releases. Звучит несложно, когда у тебя работает сеть. А вот когда её нет, все процессы усложняются.

Итак, нам надо передать на сервер исходники драйвера, которые можно скачать по ссылке выше. Нужен файл r8168-8.049.02.tar.gz. Версия может быть другой на момент вашего прочтения статьи. Я скачал файл, перекинул его на сервер и понял, что не смогу собрать, так как нужны некоторые пакеты и исходники ядра. Когда есть сеть, ты просто ставишь всё, что нужно, из репозитория. А когда ничего нет, ничего не получатся.

Для установки драйвера RealTek в Debian, необходимы следующие пакеты:

  • build-essential
  • linux-headers-`uname -r`

У первого будут какие-то зависимости. Сейчас уже точно не помню, какие именно. Так сети у нас нет, а вручную собирать пакеты со всеми зависимостями хлопотно, то я взял полный DVD-1 от Debian и подключил его в качестве репозитория. Для этого надо смонтировать флешку, куда записан этот DVD, в какую-то директорию, например /mnt. В /etc/apt/sources.list добавляем строку, закомментировав все остальные.

deb [trusted=yes] file:/mnt bullseye main

После этого обновляем кэш репозиториев и устанавливаем нужные пакеты:

# apt update
# apt install build-essential linux-headers-`uname -r`

Так как я устанавливал систему с этого же диска, у меня версия linux-headers в системе и на диске совпали. Если это не так, то deb пакет нужной версии исходников ядра вам придётся скачать и закинуть на сервер вручную.

После того, как установили нужные пакеты, копируем туда же скачанные драйвера. Распаковываем их и запускаем установку:

# tar -xzvf r8168-8.049.02.tar.gz
# cd r8168-8.049.02
# ./autorun.sh

Делать всё нужно с правами root. Скрипт сам автоматически соберет новый драйвер, отключит старый и загрузит новый. Вам останется только заблокировать загрузку оригинального драйвера при старте системы, добавив его в blacklist:

# echo "blacklist r8169" >> /etc/modprobe.d/blacklist.conf

В завершении перезагрузил nettop и сеть заработала. Я получил миниатюрный тестовый сервер с процессором i5 и 16 гб оперативной памяти.

R8169 rtl_rxtx_empty_cond == 0

Далее я установил поверх Proxmox и сеть снова отвалилась с описанной в заголовке ошибкой. Это не удивительно, так как у Proxmox свое ядро. Необходимо еще раз установить драйвер RealTek в это ядро. Так как у нас почти все настроено, необходимо только установить ядро нужной версии. Посмотрите, какое установлено сейчас:

# uname -r
5.11.22-4-pve

Возьмите установочный диск с proxmox и смонтируйте его в /mnt. В директории /mnt/dists/bullseye/pve/binary-amd64/ будет пакет с исходниками ядра - pve-headers-5.11.22-4-pve_5.11.22-8_amd64.deb. Установите его:

# dpkg -i pve-headers-5.11.22-4-pve_5.11.22-8_amd64.deb

После этого заново соберите и установите драйвер, как я это сделал ранее для Debian. Для Ubuntu инструкция будет такой же один в один, только локальный репозиторий нужно будет подключать с диска Ubuntu.

Онлайн-курс по устройству компьютерных сетей.

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

9 комментариев

  1. Здравствуйте. Поясните, ибо не шарю: что вы сейчас сделали: скомпилировали модуль ядра, он же драйвер для сетевухи или что-то другое?

  2. Есть такая штука dkms называется. Посмотрите в её сторону. Смысл в том, что при переустановке ядра, подобное, вручную собранное, система пересобирает сама и устанавливает тоже сама. Исходники естественно нужны.

  3. Как вариант можно было подключить проверенный USB-LAN Adapter (например, Lenovo или TP-Link - в Linux определяются), и либо с ним все и оставить, либо с ним доустановить с меньшими мучениями нужный драйвер для существующей сетевушки.
    Хотя если бы вы пошли таким путем, то не получилось бы этой статьи потом :)

  4. А что на счет работоспособности такой связки после выхода новой версии драйвера RTL8111/8168/8411 и apt upgrade?

    • Драйвер ставится вручную, так что apt ugrade к обновлению самого драйвера никакого отношения иметь не будет. А вот после обновления ядра, если я правильно понимаю, надо будет заново в него установить драйвер, который я сохранил на самом сервере. Надо не забывать это делать.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar