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 или на сайте в контактах.

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

  1. Время идет а проблема остается...
    Уже несколько дней бьюсь с драйверами Realtek и Proxmox VE 8.2.
    При попытке установить proxmox на китайский миник, возникла проблема с сетевой картой, она просто не определяется.
    Эта статья была самой понятной и подходящей, но выполнить установку драйвера не получается.
    Затык, как мне кажется, в отсутствии linux-headers для версии 6.8.4-2-pve (результат uname -r), пробовал ставить те которые были и (linux-headers-6.8.12-common_6.8.12-1_all.deb). Подходящий пакет для 6.8.4 не знаю где взять...
    При запуске скрипта выдает ошибку: No such file or directory.
    Так же удалось выяснить, что /lib/ теперь симлинк на usr/lib/ может и в этом дело (замена путей в скрипте не дала результатов).
    В общении с линуксом опыта очень мало, что делать уже и не знаю. Сетевой usb карты под рукой нет. Может с прошествием лет появились более простые решения???

    • Попробуйте сделать всё то, что описано в статье, а headers возьмите те, что есть в репозитории Proxmox. Поищите их так:
      apt search pve-headers
      И установите:
      apt install pve-headers-6.2
      У вас версия может быть другая.

      • Начал с нуля:
        Поставил debian+mint, при этом wifi определяется. Обновил headers, поставил скрипт, lan есть.
        Установил ядро ProxM (по инструкции с сайта Proxmox), сеть отпала, обновил headers от proxmox, запустил скрипт, lan есть
        Установил Install the Proxmox VE packages, сеть отпала, скрипт не выполняется:
        Check old driver and unload it.
        rmmod r8168
        Build the module and install
        Skipping BTF generation for /home/nmed/driver/R81/r8168-8.054.00/src/r8168.ko due to unavailability of vmlinux
        Warning: modules_install: missing 'System.map' file. Skipping depmod.
        DEPMOD 6.8.12-4-pve
        load module r8168
        Updating initramfs. Please wait.
        update-initramfs: Generating /boot/initrd.img-6.8.12-4-pve
        Running hook script 'zz-proxmox-boot'..
        Re-executing '/etc/kernel/postinst.d/zz-proxmox-boot' in new private mount namespace..
        No /etc/kernel/proxmox-boot-uuids found, skipping ESP sync.
        Completed.

        Установка пакета r8168-dkms так же не проходит.
        Установить r8168 из deb не получается просит dkms версии 3.0.11 но ее нет в репозитории.

        • Оставил попытки на сборке debian+mint
          Но выход найден)!:
          1. Установил голый proxmox - лан сети нет (при установке определяется только wifi)
          2. С диска proxmox установил proxmox-headers-6.8.12-4-pve_6.8.12-4_amd64.deb. При этом указал в /etc/apt/sources.list : deb file:/mnt/ bookworm pve (иначе берется не та директория с диска и нужных deb-ов не находит).
          3. С диска debian-12.8.0-amd64-DVD-1.iso поставил build-essential
          4. Применил скрипт r8168-8.054.00 - чуда не произошло, но и ошибок как прежде не было.
          5. Стал разбираться дальше с сетевыми подключениями. По статье https://umnoe-gelezo.ru/2021/05/438/ (Proxmox. Нет сети после обновления сетевой карты):
          Проверяем карты dmesg | grep eth
          Выключаем интерфейс на время настройки:
          ip link set dev *** down
          Меняем интерфейс в /etc/network/interfaces
          После изменения запускаем сетевой интерфейс:
          ip link set dev *** up
          Перезапускаемся и радуемся! сесть есть!

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

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

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

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

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

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

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

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