На днях на один из поддерживаемых мной гипервизоров на Proxmox устанавливались обновления, и из-за проблемного драйвера r8169 перестала работать сеть, в логах было что-то типа:
device eth0 entered promiscuous mode
Как выяснилось, это проблемы именно пресловутого реалетковского драйвера, и было решено собирать драйвер r8168, а заодно и переустановить Proxmox, так как апгрейд через пару релизов обещал ещё больший геморрой с разбором получившихся косяков. Поставить стоковый образ через LARA на ZFS было плохой идеей, так как хетцнеровский образ Linux восстановления не умеет в ZFS, а опять общаться с FreeBSD мне было влом. Все команды от рута, проставлять решётки в начале строк мне тоже влом :)
Бэкап
Что нужно забэкапить (используются только KVM-контейнеры):
VPS Part
Конфиг: /var/lib/pve-cluster/config.db
Данные /var/lib/vz/images/*
Linux Part
Конфиг: /etc/network/interfaces
Скрипты: /root/*.sh
Переустановка ОС
Список дисков
Disk /dev/sda: 3000 GB (=> 2794 GiB)
Disk /dev/sdb: 3000 GB (=> 2794 GiB)
Disk /dev/sdc: 2000 GB (=> 1863 GiB)
Из первых двух собирается RAID1, третий монтируется в /mnt/backup
Оптимальная на мой взгляд разбивка без LVM выглядит так:
PART /boot ext3 512M PART / ext4 40G PART swap swap 6G PART /var/lib/vz ext4 all
Восстановление сети
После установки грузимся в хетцнеровское фирменное Rescue, в котором и будут проводиться все работы.
- Восстанавливаем конфиг /etc/network/interfaces
- Заходим в chroot и переходим в /tmp:
mkdir /media/prox mount /dev/md1 /media/prox/ mount /dev/md0 /media/prox/boot/ mount /dev/md3 /media/prox/var/lib/vz cd /media/prox/ mount -t proc proc proc/ mount --rbind /sys sys/ mount --rbind /dev dev/ mount --rbind /run run/ chroot /media/prox/ /bin/bash cd /tmp
- Качаем исходники драйвера r8168, официальный сайт тут: http://www.realtek.com.tw/Downloads/downloadsView.aspx?Langid=1&PNid=13&PFid=5&Level=5&Conn=4&DownTypeID=3&GetDown=false, после того, как скачали на компьютер, извлекаем ссылку и заливаем на сервер:
wget http://12244.wpc.azureedge.net/8012244/drivers/rtdrivers/cn/nic/0005-r8168-8.042.00.tar.bz2 tar -xzf 0005-r8168-8.042.00.tar.bz2 cd /tmp/r8168-8.042.00/
- Правим скрипты сборки: так как у нас chroot, то uname -r будет возвращать версию хостовой системы. Чтобы всё скомпилировалось, нужно заменить конструкции типа $(shell uname -r) в Makefile’ах и Autorun.sh на явное указание ядра проксмокса (а точнее, версии ядра, под которую будем собирать). Её можно найти в /lib/modules, выглядит как 4.4.16-1-pve, далее именно эту версию я буду указывать в качестве примера.
- Ставим пакеты, необходимые для сборки и screen для шага 10
aptitude install screen build-essential pve-headers-4.4.16-1-pve
- Собираем
make all
- Далее я открыл screen и запустил ./autorun.sh, а через какое-то время хардово ребутнул сервер. Да, так делать плохо, нужно было выйти из чрута и руками положить модуль куда надо, распарсив самостоятельно скрипт, но мне очень хотелось спать :) Дальнейшие шаги 8-12 я проделал чтобы убедиться, что всё нормально работает, однако следует рассматривать их как правильное решение при первой установке модуля; а в пункте 7 в этом случае достаточно просто скопировать собранный модуль в
/lib/modules/4.4.16-1-pve/kernel/drivers/net/ethernet/realtek/
- Опять Rescue и шаг 2
- Выполняем обновление модулей (везде, где можно, явно указываем версию ядра, у нас chroot, не забыли?)
depmod -a 4.4.16-1-pve
- Блокируем загрузку старого драйвера
echo "blacklist r8169" >> /etc/modprobe.d/blacklist.conf
- Добавляем загрузку нового модуля
echo "r8168" >> /etc/initramfs-tools/modules
- Пересобираем Initramfs
update-initramfs -v -u -k 4.4.16-1-pve
Если всё получилось верно, то при выполнении будет строчка:
Adding module /lib/modules/4.4.16-1-pve/kernel/drivers/net/ethernet/realtek/r8168.ko
- Пляски с сетью на этом закончились. Кидаем контейнеры на их место в /var/lib/vz/images, config.db в /var/lib/pve-cluster, правим /etc/network/interfaces, включаем форвардинг командой
sysctl -w net.ipv4.ip_forward=1
а также возвращаем в /etc/fstab строчку
/dev/sdc1 /mnt/backup ext4 defaults 0 0
Эксплуатация
Вообще говоря, пакет r8168-dkms вполне себе существует, но он в ветке sid, и я лучше буду выполнять эту работу руками при обновлении ядра :)
Собственно, после установки обновлений ядра нужно будет повторять шаги 3, 5, 6, 7, убрав оттуда жёсткую привязку к версии ядра и используя стандартные скрипты из поставки драйвера.
wget http://12244.wpc.azureedge.net/8012244/drivers/rtdrivers/cn/nic/0005-r8168-8.042.00.tar.bz2 tar -xzf 0005-r8168-8.042.00.tar.bz2 cd /tmp/r8168-8.042.00/ aptitude install pve-headers-$(uname -r) make all ./autorun.sh
Но это всё работает при нахождении за локальной консолью и на обновлённом ядре (после перезагрузки, с лежащей сетью), а на удалённом сервере нужно делать так:
aptitude install pve-headers-4.4.44-1-pve wget http://12244.wpc.azureedge.net/8012244/drivers/rtdrivers/cn/nic/0009-r8168-8.044.02.tar.bz2 tar -jxf 0009-r8168-8.044.02.tar.bz2 cd r8168-8.044.02/ sed -i 's/\$(shell uname -r)/4.4.44-1-pve/g' src/Makefile make all
Убеждаемся, что у нас появился актуальный драйвер:
ls -lah /lib/modules/4.4.44-1-pve/kernel/drivers/net/ethernet/realtek | grep r8168.ko
И добавляем его в загрузочный образ (вообще, по идее достаточно update-initramfs -u -k 4.4.44-1-pve, но это так, на всякий случай)
depmod 4.4.44-1-pve update-initramfs -u -k all
Использовано:
https://forum.proxmox.com/threads/cannot-access-etc-pve-transport-endpoint-not-connected.7528/
https://wiki.hetzner.de/index.php/Installation_des_r8168-Treibers/ru#Proxmox
и многочисленные запросы в гугле вида «r8169 debian»