На днях собирал для тестового кластера Proxmox ноду в виде неттопа со встроенной сетевой картой RealTek. На удивление, она не заработала ни в Proxmox, ни в чистой Debian. Пришлось разбираться, в чем тут дело. Давно не сталкивался с подобными сетевыми проблемами. Когда на сервере нет сети, ты как без рук. Ничего установить или обновить нельзя, репозитории недоступны. Приходится через флешку что-то копировать и устанавливать.
Научиться настраивать 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 гб оперативной памяти.
Далее я установил поверх 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.
Здравствуйте. Поясните, ибо не шарю: что вы сейчас сделали: скомпилировали модуль ядра, он же драйвер для сетевухи или что-то другое?
Если я сам всё правильно понял, то да. Скомпилировал модуль ядра на основе скачанного драйвера, взамен стандартного, который был в ядре.
Я раньше думал, что для этого нужно компилировать новое ядро. Довольное долгое занятие, вот благодаря этому видео:
https://www.youtube.com/watch?v=1Yc-u5IyufI&t=4461s&ab_channel=SpecialistTV
А оно оказывает вон как :).
Спасибо
Есть такая штука dkms называется. Посмотрите в её сторону. Смысл в том, что при переустановке ядра, подобное, вручную собранное, система пересобирает сама и устанавливает тоже сама. Исходники естественно нужны.
Спасибо, посмотрю. Очень актуально.
Как вариант можно было подключить проверенный USB-LAN Adapter (например, Lenovo или TP-Link - в Linux определяются), и либо с ним все и оставить, либо с ним доустановить с меньшими мучениями нужный драйвер для существующей сетевушки.
Хотя если бы вы пошли таким путем, то не получилось бы этой статьи потом :)
Это первое, что в голову пришло. Но не было под рукой такого устройства.
А что на счет работоспособности такой связки после выхода новой версии драйвера RTL8111/8168/8411 и apt upgrade?
Драйвер ставится вручную, так что apt ugrade к обновлению самого драйвера никакого отношения иметь не будет. А вот после обновления ядра, если я правильно понимаю, надо будет заново в него установить драйвер, который я сохранил на самом сервере. Надо не забывать это делать.