Апгрейд Proxmox на Hetzner

На днях на один из поддерживаемых мной гипервизоров на 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, в котором и будут проводиться все работы.

  1. Восстанавливаем конфиг /etc/network/interfaces
  2. Заходим в 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
  3. Качаем исходники драйвера 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/
  4. Правим скрипты сборки: так как у нас chroot, то uname -r будет возвращать версию хостовой системы. Чтобы всё скомпилировалось, нужно заменить конструкции типа $(shell uname -r) в Makefile’ах и Autorun.sh на явное указание ядра проксмокса (а точнее, версии ядра, под которую будем собирать). Её можно найти в /lib/modules, выглядит как 4.4.16-1-pve, далее именно эту версию я буду указывать в качестве примера.
  5. Ставим пакеты, необходимые для сборки и screen для шага 10
    aptitude install screen build-essential pve-headers-4.4.16-1-pve
  6. Собираем
    make all
  7. Далее я открыл screen и запустил ./autorun.sh, а через какое-то время хардово ребутнул сервер. Да, так делать плохо, нужно было выйти из чрута и руками положить модуль куда надо, распарсив самостоятельно скрипт, но мне очень хотелось спать :) Дальнейшие шаги 8-12 я проделал чтобы убедиться, что всё нормально работает, однако следует рассматривать их как правильное решение при первой установке модуля; а в пункте 7 в этом случае достаточно просто скопировать собранный модуль в
    /lib/modules/4.4.16-1-pve/kernel/drivers/net/ethernet/realtek/
  8. Опять Rescue и шаг 2
  9. Выполняем обновление модулей (везде, где можно, явно указываем версию ядра, у нас chroot, не забыли?)
    depmod -a 4.4.16-1-pve
  10. Блокируем загрузку старого драйвера
    echo "blacklist r8169" >> /etc/modprobe.d/blacklist.conf
  11. Добавляем загрузку нового модуля
    echo "r8168" >> /etc/initramfs-tools/modules
  12. Пересобираем 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
  13. Пляски с сетью на этом закончились. Кидаем контейнеры на их место в /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»

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