Введение
Linux r8169 драйвер для сетевых чипов Realtek не всегда работает корректно в ядре 4.16 и более ранних версиях. Могут случаться тайм-ауты, частые смены состояний link up/link down, проблемы с производительностью и даже крах системы.
Одно из решений — это использование официального драйвера Realtek r8168 (вместо r8169). Его можно установить из сторонних репозиториев или скомпилировать самостоятельно. Также можно обновить ядро до версии 4.17+.
Эта статья описывает, как установить сетевой драйвер.
Вариант А - Использование kmod-r8168 из elrepo.org
ELRepo — это RPM репозиторий пакетов для Enterprise Linux. ELRepo поддерживает Red Hat Enterprise Linux и её ответвления (CentOS, Scientific Linux и другие). Это самый простой способ получить r8168 драйвер для стандартных ядер.
ПРИМЕЧАНИЕ: Если используется особенное ядро: как Virtuozzo, OpenVZ или что-то подобное, то ПРИДЁТСЯ скомпилировать модуль самостоятельно!
Импорт публичного ключа:
rpm --import http://elrepo.org/RPM-GPG-KEY-elrepo.org
Установка ELRepo для RHEL 6, CentOS 6 или SL 6:
rpm -Uhv http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
Для RHEL 7, CentOS 7 или SL 7:
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
Установка kmod-r8168 Realtek r8168 драйвера:
yum --enablerepo=elrepo install kmod-r8168
Новый драйвер будет использован системой после перезагрузки. Он остаётся активным даже после обновления ядра.
Вариант Б - Установка из исходного кода
Шар 1 - Необходимые условия
Пожалуйста, убедитесь, что у вас работает самая последняя версия ядра с помощью команд yum
или apt-get
и перезагрузки сервера.
CentOS
Для замены драйвера в CentOS должны быть установлены пакеты kernel
, kernel-devel
и kernel-headers
, а также компилятор
:
yum install gcc gcc-c++ kernel-devel kernel-headers
Debian/Ubuntu
В Debian/Ubuntu название пакета заголовочных файлов зависит от выбранного ядра. Это может быть, например linux-headers-generic
или linux-headers-server
. Все остальные необходимые для сборки пакеты будут уставлены вместе пакетом build-essentials
:
aptitude install build-essential linux-headers-`uname -r`
Proxmox
В Proxmox заголовочные файлы расположены в пакете pve-headers
aptitude install pve-headers-`uname -r`
Шаг 2 - Получение исходного кода
cd /tmp
wget http://mirror.hetzner.de/tools/Realtek/drivers/r8168-8.046.00.tar.bz2
tar xf r8168-8.046.00.tar.bz2
Шаг 3 - Компиляция драйвера
В пакете содержится скрипт autorun.sh
, компилирующий драйвер и заменяющий используемый в настоящий момент драйвер r8169. При замене драйвера прерывается сетевое соединение — запускайте скрипт в сессии screen, чтобы выполнение скрипта гарантированно не прервалось. Также, чтобы убедиться в том, что модуль компилируется, можно вручную выполнить команду make modules
.
cd r8168-8.046.00
make modules
или
make all
Если make modules
не выдаёт ошибок, то можно заменить драйвер. В этом случае сетевое соединение будет прервано и драйвер r8169 отключится!
screen
cd r8168-8.046.00
./autorun.sh
Если вы не хотите прерывать работу системы или же хотите лишь временно отключить драйвер r8169, то можно скомпилировать драйвер, как это показано ниже.
Шаг 4 - Активирование нового драйвера
CentOS
Необходимо изменить драйвер для eth0
. Для этого в файла /etc/modprobe.conf
строка
alias eth0 r8169
должна быть заменена на
alias eth0 r8168
Для активирования нового драйвера создаём простой shell-скрипт, который выполняет необходимые действия.
echo "rmmod r8169" > /tmp/r8168
echo "depmod -a" >> /tmp/r8168
echo "modprobe r8168" >> /tmp/r8168
echo "service network restart" >> /tmp/r8168
echo "service ipaliases restart" >> /tmp/r8168
Запускаем скрипт:
sh /tmp/r8168
Через несколько секунд сервер должен вернуться в онлайн уже с новым сетевым драйвером. После этого можно удалить рабочую директорию:
rm -rf /root/r8168
Debian/Ubuntu
После установки драйвера обновите зависимости модуля.
depmod -a
Сначала сетевой драйвер r8169 необходимо занести в blacklist, чтобы предотвратить его загрузку ядром. Примечание Если на сервере установлены дополнительные сетевые интерфейсы, то модуль заносить в blacklist не надо.
Ubuntu/Debian 6.0 (Squeeze):
echo "blacklist r8169" >> /etc/modprobe.d/blacklist.conf
Далее надо указать, что драйвер должен быть включен в initrd. В случае если в сервере установлены дополнительные сетевые карты, это обеспечит загрузку модуля r8168 до загрузки r8169.
echo "r8168" >> /etc/initramfs-tools/modules
После этого надо пересоздать initrd.
update-initramfs -v -t -u
Теперь можно перезагрузить сервер.
После обновления ядра драйвер, возможно, придётся скомпилировать заново.
Вывод
Любой из двух способов, показанных здесь, должен устранить проблемы с сетевым чипом Realtek.