Поэтапное обновление Proxmox VE 7.1 → 7.4 → 8.4 → 9.2 с предварительным резервным копированием VM.
В этой статье я описываю реальное обновление одиночного узла Proxmox VE: с
pve-manager 7.1-7 и Debian 11 Bullseye до pve-manager 9.2.11 и Debian 13 Trixie.Я не перепрыгивал через основные версии. Маршрут был таким:
PVE 7.1 → последняя PVE 7.4 → последняя PVE 8.4 → PVE 9.2
Это не универсальный набор команд для бездумного копирования. В статье я показываю, почему перед каждым шагом проверял пакеты, загрузчик, хранилища и виртуальные машины, а также поясняю ответы на вопросы установщика именно для моей конфигурации.
Важно: большое обновление гипервизора всегда может закончиться потерей доступа к узлу или необходимостью восстановления. Наличие бэкапа VM/CT не отменяет резервную копию конфигурации хоста, физическую или удалённую консоль и заранее подготовленное окно простоя.
1. Что было в начале и что получилось в конце
Исходная система была давно не обновлявшимся одиночным сервером:
- Proxmox VE:
7.1-7; - Debian:
11 (bullseye); - запущенное ядро:
5.13.19-2-pve; - кластер отсутствовал;
- корневая файловая система: ext4 на
/dev/mapper/pve-root; - хранилища: локальный каталог
localи LVM-thinlocal-lvm; - загрузка: Legacy BIOS с GRUB, не UEFI;
- ZFS-пул отсутствовал;
- гиперконвергентный Ceph отсутствовал;
- LXC-контейнеров не было;
- на узле находились пять QEMU/KVM-машин;
- репозиторий Proxmox:
pve-no-subscription.
Границы применимости: это сценарий одиночного узла без Corosync/HA, ZFS-пула, Ceph-хранилища, LXC, сторонних DKMS-модулей, GPU/HBA passthrough и SAN/multipath. Для любой из этих технологий к описанным проверкам нужно добавить профильный раздел официального руководства. Особенно нельзя переносить мои ответы по
lvm.conf на узел с SAN или пользовательскими LVM-фильтрами.Финальное состояние после обновления и очистки:
Код:
7.0.14-14-pve
pve-manager/9.2.11/f6997e698c7933ea (running kernel: 7.0.14-14-pve)
UNIT LOAD ACTIVE SUB DESCRIPTION
0 loaded units listed.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Операционная система стала Debian 13 Trixie, все хранилища остались активными, проверка
pve8to9 --full завершилась без предупреждений и ошибок, а все виртуальные машины загрузились штатно.2. Почему я не обновлял 7.1 сразу до 9.2
Proxmox VE тесно связан с базовой версией Debian:
- PVE 7 работает на Debian 11 Bullseye;
- PVE 8 работает на Debian 12 Bookworm;
- PVE 9 работает на Debian 13 Trixie.
Поэтому переход на две основные версии за один запуск APT был бы неподдерживаемым и слишком рискованным. Я разбил работу на самостоятельные этапы и после каждого этапа получал полностью рабочую промежуточную систему:
- обновил PVE 7.1 до последнего состояния ветки 7.4;
- загрузился в рекомендованное для перехода ядро 5.15;
- запустил
pve7to8 --fullи добился нулевого числа ошибок; - обновил Bullseye/PVE 7 до Bookworm/PVE 8;
- загрузился в ядро PVE 8 версии 6.8 и повторил проверки;
- подготовил PVE 8 к переходу через
pve8to9 --full; - обновил Bookworm/PVE 8 до Trixie/PVE 9;
- загрузился в ядро 7.0 и только после проверки VM занялся очисткой.
Главный принцип: после смены основной версии я не продолжал следующий этап, пока сервер не загружался в новое ядро,
dpkg --audit не был пустым, системные службы не были исправны, а хранилища не отображались как active.3. Что я подготовил до первого изменения
3.1. Резервные копии виртуальных машин
Все VM я заранее скопировал на отдельный Proxmox Backup Server. Важно, что PBS находился вне обновляемого системного диска. Локальный бэкап на том же физическом сервере не защищает от повреждения диска, таблицы разделов, LVM или ошибки загрузчика.
Я убедился, что задачи резервного копирования завершились успешно и что в PBS видны актуальные снимки. Для действительно критичных машин желательно дополнительно проверить восстановление хотя бы одной VM в изолированной среде: существование файла бэкапа ещё не доказывает возможность восстановления.
Перед каждым переходом основной версии я остановил все гостевые системы:
Код:
qm list
pct list
В моём случае вывод
qm list показывал пять остановленных VM, а pct list был пустым. Работающий гость не всегда технически блокирует обновление, но на одиночном узле он увеличивает риск повреждения данных при неожиданной перезагрузке и усложняет диагностику.3.2. Отдельная копия конфигурации хоста
Бэкап VM не содержит всю конфигурацию самого гипервизора. Поэтому отдельно я сохранил как минимум:
/etc/pve— конфигурации VM, хранилищ, пользователей, заданий и самого узла;/etc/network/interfaces— сетевые мосты и адреса;/etc/hostsи/etc/hostname;/etc/apt/sources.listи/etc/apt/sources.list.d;/etc/default/grubи связанные настройки загрузчика;/etc/lvm, если LVM настраивался вручную;- сведения о дисках, разделах, LVM и загрузочном режиме.
Для копии источников пакетов я использовал отдельный каталог с датой:
Код:
mkdir -p /root/pve-upgrade-20260831
cp -a /etc/apt/sources.list /etc/apt/sources.list.d \
/root/pve-upgrade-20260831/
Примечание: копию каталога
/etc/pve лучше делать штатным архивированием с сохранением прав и отдельно от VM-бэкапов. Если узел перестанет загружаться, эти файлы сильно ускорят ручное восстановление сети, хранилищ и конфигураций гостей.3.3. Доступ к серверу на случай потери сети
Обновление меняет ядро, systemd, OpenSSH, сетевые библиотеки, GRUB и множество базовых пакетов. Поэтому одной SSH-сессии недостаточно. До начала работ я предусмотрел доступ через физическую консоль, IPMI/iKVM или другой независимый канал.
Во время обновления я не закрывал текущую SSH-сессию. Если установщик перезапускает
sshd, существующее соединение обычно сохраняется, но это не заменяет аварийную консоль.4. Первичная инвентаризация узла
Сначала я не менял ничего, а собрал фактическое состояние системы:
Код:
pveversion -v
cat /etc/os-release
pvecm status
pvesm status
df -h / /boot
findmnt /
findmnt /boot
grep -RhsE '^[[:space:]]*(deb |Types:|URIs:|Suites:|Components:|Enabled:)' \
/etc/apt/sources.list /etc/apt/sources.list.d 2>/dev/null
ceph --version 2>/dev/null
zpool status -x 2>/dev/null
proxmox-boot-tool status
apt-mark showhold
dpkg --audit
Ключевые строки исходного
pveversion -v:
Код:
proxmox-ve: 7.1-1 (running kernel: 5.13.19-2-pve)
pve-manager: 7.1-7 (running version: 7.1-7/df5740ad)
pve-kernel-5.13.19-2-pve: 5.13.19-4
pve-qemu-kvm: 6.1.0-3
qemu-server: 7.1-4
zfsutils-linux: 2.1.1-pve3
Операционная система:
Код:
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
VERSION_ID="11"
VERSION_CODENAME=bullseye
4.1. Сообщение pvecm status не было ошибкой узла
Команда вернула:
Код:
Error: Corosync config '/etc/pve/corosync.conf' does not exist - is this node part of a cluster?
Для одиночного сервера это ожидаемый результат.
pvecm status проверяет состояние кластера Corosync, а кластер на этом узле никогда не создавался. Отсутствие /etc/pve/corosync.conf в такой конфигурации не требовало «исправления» и тем более создания фиктивного cluster-конфига.4.2. Проверка хранилищ и свободного места
Исходно оба хранилища были активны:
Код:
Name Type Status Total Used Available %
local dir active 98497780 56978568 36469664 57.85%
local-lvm lvmthin active 795107328 162758470 632348857 20.47%
На корневом томе было около 35 ГБ свободного места:
Код:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/pve-root 94G 55G 35G 61% /
findmnt показал ext4 на LVM:
Код:
TARGET SOURCE FSTYPE OPTIONS
/ /dev/mapper/pve-root ext4 rw,relatime,errors=remount-ro
Отдельный
/boot не был смонтирован: файлы ядра и initramfs находились в каталоге /boot корневой файловой системы. Это важно при оценке свободного места: отдельный маленький boot-раздел мог бы переполниться от нескольких старых ядер, но в моей схеме такого раздела не было.4.3. Ceph-пакеты не означали наличие Ceph-кластера
Команда показала клиент Ceph Octopus:
Код:
ceph version 15.2.15 (...) octopus (stable)
Однако в
pvesm status не было Ceph-хранилищ, а последующие штатные проверки писали no hyper-converged ceph setup detected. Следовательно, отдельная процедура обновления Ceph-кластера здесь не требовалась. Наличие ceph-fuse или других клиентских библиотек само по себе не делает узел участником Ceph.4.4. Почему ошибка proxmox-boot-tool была ожидаемой
Я проверил режим загрузки:
Код:
if [ -d /sys/firmware/efi ]; then echo UEFI; else echo BIOS; fi
Результат:
Код:
BIOS
А
proxmox-boot-tool status ответил:
Код:
E: /etc/kernel/proxmox-boot-uuids does not exist.
Это не означало поломку загрузчика. Узел стартовал в Legacy BIOS через обычный GRUB, а
proxmox-boot-tool не управлял EFI System Partition. В дальнейшем успех загрузки я проверял по файлам ядра, содержимому /boot/grub/grub.cfg и сообщению об установке GRUB на системный диск.4.5. Что ещё было важно в исходной диагностике
apt-mark showholdне показал удерживаемых пакетов;dpkg --auditбыл пустым — незавершённых установок не было;zpool status -xничего не вывел — ZFS-пул отсутствовал;- места на корневом томе хватало для одновременного хранения старых и новых ядер;
- источники APT указывали только на Bullseye, но был включён недоступный без подписки
pve-enterprise.
5. Этап первый: обновление PVE 7.1 до последней PVE 7.4
Сначала я остался в рамках Debian 11 Bullseye и довёл установленную ветку PVE 7 до финального состояния. Именно такую систему затем должен проверять
pve7to8.5.1. Переключение с enterprise на pve-no-subscription
Исходно присутствовал репозиторий:
Код:
deb https://enterprise.proxmox.com/debian/pve bullseye pve-enterprise
Подписки на узле не было, поэтому enterprise-репозиторий я отключил, сохранив файл для истории, и добавил официальный публичный репозиторий:
Код:
if [ -f /etc/apt/sources.list.d/pve-enterprise.list ]; then
mv /etc/apt/sources.list.d/pve-enterprise.list \
/etc/apt/sources.list.d/pve-enterprise.list.disabled
fi
printf '%s\n' \
'deb http://download.proxmox.com/debian/pve bullseye pve-no-subscription' \
> /etc/apt/sources.list.d/pve-no-subscription.list
Затем проверил все активные строки:
Код:
grep -RnsE '^[[:space:]]*deb ' \
/etc/apt/sources.list /etc/apt/sources.list.d
Почему я не оставил оба репозитория: смешивать
pve-enterprise и pve-no-subscription без причины не нужно. Без действующей подписки enterprise даёт ошибку авторизации, а дублирующие источники усложняют понимание того, откуда пришёл пакет.5.2. Обновление индексов и обязательная симуляция
Код:
apt update
apt-get -s dist-upgrade
Симуляция показала примерно следующий итог:
Код:
268 upgraded, 24 newly installed, 1 to remove
Единственным удаляемым служебным пакетом был старый
pve-kernel-helper, но одновременно устанавливался его актуальный преемник proxmox-kernel-helper. Метапакет proxmox-ve обновлялся и не удалялся.Перед реальным запуском я проверил именно эти признаки:
proxmox-veостаётся установленным;pve-managerобновляется;- устанавливается новое ядро PVE;
- не удаляются QEMU, LVM-thin, GRUB и сетевые пакеты, необходимые этому узлу;
- список удалений объясним заменой пакетов, а не конфликтом репозиториев.
После этого запустил реальное обновление:
Код:
apt dist-upgrade
5.3. Контроль до перезагрузки
После завершения установки версия менеджера уже была 7.4, но работало старое ядро — это нормальное промежуточное состояние:
Код:
pve-manager/7.4-20/5d6e3351 (running kernel: 5.13.19-2-pve)
Пакеты нового ядра присутствовали:
Код:
ii proxmox-kernel-helper 7.4-1
ii proxmox-ve 7.4-1
ii pve-kernel-5.15.158-2-pve 5.15.158-2
ii pve-manager 7.4-20
Я отдельно убедился, что файлы ядра и initramfs существуют:
Код:
ls -lh \
/boot/vmlinuz-5.15.158-2-pve \
/boot/initrd.img-5.15.158-2-pve
Фактический результат:
Код:
-rw-r--r-- 1 root root 59M /boot/initrd.img-5.15.158-2-pve
-rw-r--r-- 1 root root 11M /boot/vmlinuz-5.15.158-2-pve
Также проверил GRUB:
Код:
grep -F '5.15.158-2-pve' /boot/grub/grub.cfg | head -n 5
В конфигурации присутствовали строки загрузки нового ядра и initrd. Только после этого я перезагрузил узел:
Код:
reboot
5.4. Проверка PVE 7.4 после перезагрузки
Код:
uname -r
pveversion
dpkg --audit
systemctl --failed --no-pager
pvesm status
qm list
pct list
pve7to8 --full
Новое ядро действительно стало запущенным:
Код:
5.15.158-2-pve
pve-manager/7.4-20/5d6e3351 (running kernel: 5.15.158-2-pve)
Гости были остановлены, оба хранилища оставались активными, повреждённых пакетов и failed units не было. Главный итог штатной проверки:
Код:
= SUMMARY =
TOTAL: 30
PASSED: 24
SKIPPED: 6
WARNINGS: 0
FAILURES: 0
Контрольная точка № 1 пройдена: система работала на последней PVE 7.4 и подходящем ядре 5.15, а
pve7to8 --full не нашёл ни предупреждений, ни ошибок.6. Этап второй: переход с PVE 7.4/Bullseye на PVE 8.4/Bookworm
Этот шаг одновременно обновлял Proxmox VE 7 до Proxmox VE 8 и Debian 11 до Debian 12. Поэтому я ещё раз убедился, что VM остановлены, PBS-бэкапы доступны, а проверка
pve7to8 --full чистая.6.1. Повторная копия репозиториев
Перед заменой Bullseye на Bookworm я сделал отдельную точку возврата только для APT-конфигурации:
Код:
mkdir -p /root/pve-upgrade-20260831/before-pve8
cp -a /etc/apt/sources.list \
/root/pve-upgrade-20260831/before-pve8/
cp -a /etc/apt/sources.list.d \
/root/pve-upgrade-20260831/before-pve8/
Это не заменяет бэкап сервера. Такая копия нужна, чтобы быстро сравнить старые и новые источники, если
apt update покажет смешение релизов или дубль репозитория.6.2. Репозитории Debian 12 Bookworm и PVE 8
Для Debian я записал:
Код:
cat > /etc/apt/sources.list <<'EOF'
deb http://ftp.ru.debian.org/debian bookworm main contrib non-free-firmware
deb http://ftp.ru.debian.org/debian bookworm-updates main contrib non-free-firmware
deb http://security.debian.org/debian-security bookworm-security main contrib non-free-firmware
EOF
Для Proxmox VE:
Код:
printf '%s\n' \
'deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription' \
> /etc/apt/sources.list.d/pve-no-subscription.list
Компонент
non-free-firmware появился в Debian 12 как отдельный раздел. Позже именно из него установился пакет микрокода процессора.После редактирования я просмотрел все найденные строки и убедился, что Bullseye остался только в архивных файлах с суффиксами
.disabled или .dpkg-dist. APT их не считает активными источниками:
Код:
grep -RnsE '^[[:space:]]*deb ' \
/etc/apt/sources.list /etc/apt/sources.list.d
apt update
apt-cache policy proxmox-ve pve-manager
APT показал кандидатов:
Код:
proxmox-ve: 8.4.0
pve-manager: 8.4.21
Если после смены источников APT предлагает пакет из Bullseye и одновременно из Bookworm, продолжать нельзя. Сначала нужно найти старую активную строку в
/etc/apt/sources.list.d, сторонний репозиторий или неверный pinning.6.3. Симуляция перехода на PVE 8
Сначала я снова запустил только расчёт транзакции и одновременно сохранил его полный вывод:
Код:
apt-get -s dist-upgrade | tee \
/root/pve-upgrade-20260831/pve8-dry-run.txt
В длинном выводе я проверял не каждую библиотеку, а критичные условия:
- кандидат
proxmox-ve— версия 8.4, метапакет не удаляется; pve-manager,qemu-serverи пакеты хранилищ обновляются;- устанавливается ядро PVE 8 серии 6.8;
- нет неожиданного удаления сетевого стека, GRUB или пакетов LVM;
- все пакеты приходят из Bookworm и официального Proxmox-репозитория.
После проверки выполнил:
Код:
apt dist-upgrade
7. Как я отвечал на вопросы установщика при переходе на PVE 8
Большое обновление не прошло полностью автоматически. Именно эти окна чаще всего вызывают сомнения, поэтому ниже — не только выбранные ответы, но и логика.
7.1. Экран apt-listchanges с длинным текстом NEWS
В терминале открылся просмотр изменений пакетов, например
adduser. Внизу экрана стояло двоеточие, а установка выглядела остановившейся.Это был пейджер, а не зависание. Я прочитал важные изменения и нажал:
Код:
q
После выхода установка продолжилась.
7.2. Файл /etc/issue — я выбрал N
Установщик спросил:
Код:
Configuration file '/etc/issue'
==> Modified (by you or by a script) since installation.
==> Package distributor has shipped an updated version.
*** issue (Y/I/N/O/D/Z) [default=N] ?
Я нажал Enter, то есть оставил
N — текущую версию файла./etc/issue содержит локальный баннер входа и не влияет на загрузку ядра, сеть, LVM или работу VM. На PVE он нередко отличается от шаблона Debian. Сохранить действующий вариант в этой ситуации безопасно.7.3. Автоматически перезапускать службы после обновления libc6
Появился диалог:
Смысл вопроса: после замены libc, libpam или libssl запущенные процессы продолжают использовать старые библиотеки. Их желательно перезапустить, но рестарт отдельных сервисов может кратковременно прервать обслуживание.
На одиночном узле в запланированном окне обслуживания я разрешил штатный перезапуск необходимых служб. Следующее окно предложило список:
Код:
postfix ssh cron
Я оставил его без изменений и подтвердил. Текущая SSH-сессия при штатном рестарте
sshd обычно не закрывается, однако именно поэтому до обновления нужен независимый консольный доступ.7.4. Файл /etc/lvm/lvm.conf — в этой конфигурации я выбрал Y
Запрос выглядел так:
Код:
Configuration file '/etc/lvm/lvm.conf'
==> Modified (by you or by a script) since installation.
==> Package distributor has shipped an updated version.
*** lvm.conf (Y/I/N/O/D/Z) [default=N] ?
На моём узле был стандартный локальный LVM/LVM-thin без пользовательских фильтров для SAN, multipath, iSCSI или необычных устройств. Поэтому я выбрал
Y — установил актуальную версию сопровождающего пакета. Скрипты Proxmox затем добавили требуемый global_filter.Этот ответ нельзя механически повторять на любом сервере. Если в
lvm.conf есть собственные filter, global_filter, устройства SAN, multipath, кластерный LVM или другое ручное изменение, сначала нужно нажать D, сохранить различия и перенести нужные параметры в новую версию. Потеря LVM-фильтра может привести к обнаружению нежелательных устройств или проблемам с томами.7.5. Удалённый pve-enterprise.list — я выбрал N
Установщик увидел, что файл из пакета ранее был удалён:
Код:
Configuration file '/etc/apt/sources.list.d/pve-enterprise.list'
==> Deleted (by you or by a script) since installation.
==> Package distributor has shipped an updated version.
*** pve-enterprise.list (Y/I/N/O/D/Z) [default=N] ?
Подписки не было, и уже использовался
pve-no-subscription, поэтому я оставил файл удалённым: N или просто Enter.Если бы я выбрал
Y, enterprise-репозиторий вернулся бы, а apt update снова начал бы сообщать об отсутствии подписки.7.6. Универсальное правило для conffile-вопросов
Обозначения dpkg:
YилиI— заменить текущий файл версией сопровождающего пакета;NилиO— сохранить установленный сейчас файл;D— показать различия;Z— открыть shell для дополнительного исследования.
Для
/etc/issue и намеренно удалённого enterprise-репозитория выбор был очевиден. Для сети, SSH, GRUB, LVM, PAM, хранилищ и других критичных конфигураций правильное действие — сначала D, а не угадывание по чужой инструкции.8. Проверка PVE 8 до первой перезагрузки
После завершения APT новая пользовательская часть уже была установлена, но ядро оставалось старым:
Код:
pve-manager/8.4.21 (running kernel: 5.15.158-2-pve)
Это ожидаемо: ядро не меняется у работающей системы без перезагрузки. Я проверил:
Код:
pveversion
dpkg --audit
systemctl --failed --no-pager
ls -lh /boot/vmlinuz-6.8.12-43-pve \
/boot/initrd.img-6.8.12-43-pve
grep -F '6.8.12-43-pve' /boot/grub/grub.cfg | head
pve7to8 --full
В журнале установки GRUB также было успешное завершение для платформы
i386-pc и системного диска /dev/sda. Это согласовывалось с ранее установленным режимом Legacy BIOS.До перезагрузки
pve7to8 показывал два ожидаемых предупреждения:- запущено старое ядро 5.15, хотя новое 6.8 уже установлено;
- LXCFS пока работает с FUSE2, потому что процесс запущен со старого окружения.
Ошибок
FAILURES не было. Оба предупреждения должны исчезнуть после загрузки нового ядра и запуска новых служб.Я перезагрузил сервер:
Код:
reboot
8.1. Проверка после загрузки PVE 8
Код:
uname -r
cat /etc/os-release
pveversion
dpkg --audit
systemctl --failed --no-pager
pvesm status
pve7to8 --full
Результат:
Код:
6.8.12-43-pve
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
pve-manager/8.4.21 (running kernel: 6.8.12-43-pve)
Штатный чекер завершился чисто:
Код:
= SUMMARY =
TOTAL: 30
PASSED: 25
SKIPPED: 5
WARNINGS: 0
FAILURES: 0
Контрольная точка № 2 пройдена: сервер работал на Debian 12, PVE 8.4 и ядре 6.8. Старые ядра 5.x я пока не удалял: до полного завершения перехода они оставались дополнительным вариантом загрузки.
9. Подготовка PVE 8.4 к обновлению до PVE 9
Перед следующим изменением репозиториев я снова выполнил полную штатную проверку:
Код:
pve8to9 --full
Проверка обнаружила одно исправимое предупреждение: для Intel CPU отсутствовал пакет
intel-microcode. Поскольку non-free-firmware уже присутствовал в Bookworm-репозиториях, я установил его обычным способом:
Код:
apt update
apt install intel-microcode
dpkg -l intel-microcode
pve8to9 --full
Вместе с микрокодом установился вспомогательный
iucode-tool. Повторная проверка показала:
Код:
= SUMMARY =
TOTAL: 42
PASSED: 33
SKIPPED: 7
WARNINGS: 0
FAILURES: 0
Новый микрокод гарантированно применяется после перезагрузки. В нашем случае следующая перезагрузка всё равно входила в план перехода на ядро PVE 9.
9.1. NOTICE об autoactivation на local-lvm
Чекер сообщил:
Код:
NOTICE: storage 'local-lvm' has guest volumes with autoactivation enabled
NOTICE: Starting with PVE 9, autoactivation will be disabled for new
LVM/LVM-thin guest volumes. This system has some volumes that still have
autoactivation enabled. All volumes with autoactivations reside on local
storage, where this normally does not cause any issues.
И предложил команду:
Код:
/usr/share/pve-manager/migrations/pve-lvm-disable-autoactivation
Я её не запускал. Сам чекер уточнил, что все затронутые тома находятся на локальном хранилище, где это обычно не вызывает проблем. Это был
NOTICE, а не WARN и не FAIL. Менять активацию существующих томов непосредственно перед крупным обновлением без практической необходимости было бы лишним вмешательством.9.2. Отключение audit-сокета на время перехода
Перед большим обновлением до PVE 9 я применил рекомендацию руководства, чтобы системный журнал не переполнялся потоком audit-сообщений во время замены systemd и связанных компонентов:
Код:
systemctl disable --now systemd-journald-audit.socket
Это не удаляет журналы и не отключает обычный systemd-journal. Команда выключает приём audit-сообщений через конкретный сокет. Если на сервере развёрнут обязательный аудит по требованиям безопасности, такой шаг сначала нужно согласовать со своей политикой журналирования.
10. Этап третий: репозитории Debian 13 Trixie и PVE 9
Для PVE 9 я перешёл на современный формат Deb822 с расширением
.sources. Старые активные строки Bookworm я закомментировал или отключил, а не оставил рядом с Trixie.10.1. Debian 13 в /etc/apt/sources.list.d/debian.sources
Код:
Types: deb
URIs: http://ftp.ru.debian.org/debian
Suites: trixie trixie-updates
Components: main contrib non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Types: deb
URIs: http://security.debian.org/debian-security
Suites: trixie-security
Components: main contrib non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
10.2. PVE 9 no-subscription в /etc/apt/sources.list.d/proxmox.sources
Код:
Types: deb
URIs: http://download.proxmox.com/debian/pve
Suites: trixie
Components: pve-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
После этого я проверил все источники, включая Deb822-поля:
Код:
grep -RhsE '^[[:space:]]*(deb |Types:|URIs:|Suites:|Components:|Enabled:)' \
/etc/apt/sources.list /etc/apt/sources.list.d 2>/dev/null
apt update
apt-cache policy proxmox-ve pve-manager
Кандидаты были правильными:
Код:
proxmox-ve:
Installed: 8.4.0
Candidate: 9.2.0
pve-manager:
Candidate: 9.2.11
10.3. Симуляция крупной транзакции PVE 9
Код:
apt-get -s dist-upgrade
Итог был внушительным:
Код:
616 upgraded, 199 newly installed, 54 to remove and 0 not upgraded.
Большой список удаляемых пакетов на переходе Debian 12 → 13 сам по себе не означает катастрофу. Debian 13 переводит многие библиотеки на ABI с суффиксом
t64. В симуляции старые библиотеки удалялись вместе с установкой их новых замен, например:libarchive13→libarchive13t64;libcurl4→libcurl4t64;libssl3→libssl3t64;libgnutls30→libgnutls30t64;libzfs4linux→libzfs7linux;- Python 3.11 → Python 3.13;
- Perl 5.36 → Perl 5.40.
Ключевая проверка была иной:
proxmox-ve не удалялся, а обновлялся до 9.2; pve-manager обновлялся; устанавливались proxmox-default-kernel, ядро 7.0.14-14-pve и остальные пакеты PVE 9.Стоп-сигнал: если симуляция предлагает удалить
proxmox-ve без установки его новой версии, удалить pve-manager либо оставить сотни пакетов not upgraded, реальный dist-upgrade запускать нельзя. Обычно это означает неправильные или смешанные репозитории.После проверки выполнил:
Код:
apt dist-upgrade
11. Вопросы установщика при переходе на PVE 9
На этом этапе снова появились интерактивные экраны. Я не запускал обновление в фоне и не отключал вопросы
DEBIAN_FRONTEND=noninteractive: при междистрибутивном переходе безопаснее видеть конфликтующие конфигурационные файлы.11.1. Новости OpenSSH 10 — это не ошибка
apt-listchanges показал большой текст об OpenSSH 9.8, 9.9 и 10.0. Среди значимых изменений были удаление DSA, изменение набора Diffie-Hellman KEX по умолчанию и более строгая обработка некоторых директив Match.Я проверил, что не использую старые DSA-ключи и экзотические пользовательские
KexAlgorithms/Match exec, после чего вышел из просмотрщика клавишей:
Код:
q
Это только закрыло NEWS и продолжило установку. Нажатие
q не отменяет обновление OpenSSH.Для старой инфраструктуры: если к PVE подключаются очень старые SSH-клиенты или используются вручную заданные алгоритмы, совместимость нужно проверить до обновления. Не следует возвращать слабые алгоритмы глобально без необходимости.
11.2. /etc/issue — снова N
Запрос был тем же:
Код:
Configuration file '/etc/issue'
==> Modified (by you or by a script) since installation.
==> Package distributor has shipped an updated version.
*** issue (Y/I/N/O/D/Z) [default=N] ?
Я снова нажал Enter и сохранил действующий файл.
11.3. /etc/lvm/lvm.conf — снова Y, но только после оценки конфигурации
Узел по-прежнему использовал стандартный локальный
local-lvm без пользовательских LVM-фильтров и внешнего SAN. Поэтому я установил новую версию сопровождающего пакета ответом Y.Для другого сервера этот выбор может быть неверным. Если файл изменён администратором, правильная последовательность такая:
- нажать
Dи изучить diff; - отдельно сохранить текущую версию;
- понять назначение каждой пользовательской строки;
- принять новую версию и вернуть нужные параметры либо оставить старую и вручную перенести обязательные изменения нового релиза;
- после установки проверить
pvs,vgs,lvsиpvesm status.
11.4. Что делать, если снова появляется pve-enterprise.list
Для узла без подписки я сохранял enterprise-файл отключённым:
N. После завершения обновления обязательно проверил, что активен только Trixie pve-no-subscription.11.5. Почему я не давал один ответ на все остальные файлы
Для неизвестного изменённого файла выбор по умолчанию не считается автоматически правильным. Особенно опасны:
/etc/network/interfaces— можно потерять сетевой доступ;/etc/ssh/sshd_config— можно потерять SSH;/etc/default/grub— можно изменить параметры загрузки или IOMMU;/etc/lvm/lvm.conf— можно повлиять на обнаружение томов;- конфигурации PAM, multipath, NFS, iSCSI и сторонних драйверов.
В таких окнах я сначала использую
D. Если различия неочевидны, лучше приостановить решение в shell через Z, чем продолжать наугад.12. PVE 9 установлен, но перезагрузка ещё не выполнена
После завершения APT я выполнил:
Код:
pveversion -v
dpkg --audit
systemctl --failed --no-pager
pve8to9 --full
ls -lh /boot/vmlinuz-7.*-pve /boot/initrd.img-7.*-pve
grep -E 'vmlinuz-7\.0|Linux 7\.0' /boot/grub/grub.cfg | head -n 10
Пакеты уже были новыми, а запущенное ядро — ещё от PVE 8:
Код:
proxmox-ve: 9.2.0 (running kernel: 6.8.12-43-pve)
pve-manager: 9.2.11 (running version: 9.2.11/f6997e698c7933ea)
proxmox-kernel-helper: 9.2.0
Новое ядро действительно находилось в
/boot:
Код:
-rw-r--r-- 1 root root 84M /boot/initrd.img-7.0.14-14-pve
-rw-r--r-- 1 root root 16M /boot/vmlinuz-7.0.14-14-pve
В
/boot/grub/grub.cfg присутствовали обычная и recovery-записи для 7.0.14-14-pve. dpkg --audit ничего не вывел, то есть пакетная транзакция завершилась.12.1. Почему pve8to9 показывал два предупреждения
До перезагрузки итог выглядел так:
Код:
= SUMMARY =
TOTAL: 41
PASSED: 30
SKIPPED: 7
WARNINGS: 2
FAILURES: 0
Первое предупреждение было ожидаемым:
Код:
WARN: a suitable kernel (proxmox-kernel-7.0) is installed,
but an unsuitable (6.8.12-43-pve) is booted, missing reboot?!
Второе было связано с NTP: после замены пакета
chrony.service отображался как failed. Это не затрагивало диски, сеть управления, хранилища или создание initramfs, а пакетная система была целой. Новое ядро и GRUB были проверены, поэтому плановая перезагрузка была обоснована. После неё Chrony запустился штатно.Это не правило «любую failed-службу лечит reboot». Если failed unit относится к сети, LVM, файловой системе, GRUB, multipath, pve-cluster или хранилищу, сначала нужно выяснить причину. В нашем случае единственной failed-службой был сервис синхронизации времени после его пакетной замены.
Я перезагрузил узел:
Код:
reboot
13. Итоговая проверка после загрузки PVE 9
После возврата узла в сеть я не запускал VM немедленно, а сначала проверил основу:
Код:
uname -r
cat /etc/os-release
pveversion
dpkg --audit
systemctl --failed --no-pager
systemctl is-active chrony
chronyc tracking
pvesm status
pve8to9 --full
Система загрузилась именно в новое ядро и новый Debian:
Код:
7.0.14-14-pve
PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
VERSION_ID="13"
VERSION="13 (trixie)"
VERSION_CODENAME=trixie
DEBIAN_VERSION_FULL=13.6
pve-manager/9.2.11/f6997e698c7933ea (running kernel: 7.0.14-14-pve)
systemctl --failed вернул:
Код:
UNIT LOAD ACTIVE SUB DESCRIPTION
0 loaded units listed.
Chrony был активен,
chronyc tracking показывал нормальную синхронизацию, Stratum 3, Leap status: Normal и малое смещение. Оба хранилища были доступны:
Код:
Name Type Status Total (KiB) Used (KiB) Available (KiB) %
local dir active 98497780 61099280 32348952 62.03%
local-lvm lvmthin active 795107328 167529114 627578213 21.07%
Финальный штатный чекер:
Код:
= SUMMARY =
TOTAL: 41
PASSED: 32
SKIPPED: 7
WARNINGS: 0
FAILURES: 0
Сообщение об autoactivation
local-lvm осталось уровнем NOTICE, а не предупреждением. Также чекер упомянул восемь старых файлов истории RRD. Это не влияло на работу VM или хранилищ, поэтому в рамках обновления я ничего с ними не удалял.Контрольная точка № 3 пройдена: Debian 13, PVE 9.2 и ядро 7.0 работали совместно; пакетная база, службы, время и хранилища были исправны.
14. Запуск виртуальных машин и предупреждение UEFI 2023
После проверки хоста я запускал VM по одной и контролировал консоль, сеть и прикладные службы. Все машины заработали, но одна Windows 11 VM получила предупреждение:
Код:
WARN: EFI disk without 'ms-cert=2023k' option, suggesting that not all UEFI 2023
certificates from Microsoft are enrolled yet.
The UEFI 2011 certificates expire in June 2026! The new certificates are required
for secure boot update for Windows and common Linux distributions.
Use 'Disk Action > Enroll Updated Certificates' in the UI or, while the VM is
shut down, run 'qm enroll-efi-keys 104' to enroll the new certificates.
For Windows with BitLocker, run the following command inside Powershell:
manage-bde -protectors -disable <drive>
for each drive with BitLocker before proceeding with enrollment.
swtpm_setup: Not overwriting existing state file.
TASK WARNINGS: 1
14.1. Что означало предупреждение
У VM уже был EFI-диск с более старым набором Microsoft Secure Boot certificates. PVE 9 проверяет наличие нового набора 2023 года и предлагает зачислить его в переменные OVMF. Это не означало повреждение Windows, EFI-диска или виртуального TPM.
Строка:
Код:
swtpm_setup: Not overwriting existing state file.
тоже не была ошибкой. Proxmox обнаружил существующее состояние виртуального TPM и корректно отказался перезаписывать его. Удалять TPM state или создавать новый TPM из-за этой строки нельзя: для Windows с BitLocker это могло бы привести к запросу recovery key или потере доступа при отсутствии ключа восстановления.
14.2. Почему нужно учесть BitLocker
BitLocker может привязывать автоматическую разблокировку системного тома к измерениям Secure Boot и TPM. Изменение сертификатов EFI меняет доверенное загрузочное состояние. Если заранее не приостановить защиту, при следующем старте Windows может запросить 48-значный recovery key.
Сначала в Windows от имени администратора я проверил состояние:
Код:
manage-bde -status
Я также убедился, что ключ восстановления сохранён вне этой VM. Для каждого тома с включённой защитой приостановил protectors. Для системного тома пример был таким:
Код:
manage-bde -protectors -disable C:
Затем Windows была полностью выключена, а не переведена в suspend/hibernate. На хосте я проверил состояние VM:
Код:
qm status 104
Ожидаемый ответ:
Код:
status: stopped
После этого зачислил новые ключи:
Код:
qm enroll-efi-keys 104
То же действие доступно в веб-интерфейсе: у EFI Disk выбрать Disk Action → Enroll Updated Certificates. Я использовал только один из способов, а не оба подряд.
Проверка конфигурации:
Код:
qm config 104 | grep '^efidisk0:'
В параметрах EFI-диска должна появиться опция:
Код:
ms-cert=2023k
Затем:
Код:
qm start 104
После успешной загрузки Windows я снова проверил BitLocker и возобновил защиту, если она оставалась приостановленной:
Код:
manage-bde -protectors -enable C:
manage-bde -status
Если защищены другие тома, операции
-disable и -enable выполняются для каждого из них. После этой процедуры предупреждение исчезло, а Windows 11 загрузилась штатно.Никогда не удаляйте EFI Disk или TPM State как «быстрое исправление» этого предупреждения. Сначала сохраните BitLocker recovery key, приостановите protectors, выключите VM и используйте штатный
qm enroll-efi-keys.15. Безопасная очистка после успешного обновления
Я начал очистку только после выполнения четырёх условий:
- хост несколько раз штатно загрузился в ядро PVE 9;
- все VM были проверены и работали;
pve8to9 --fullпоказывалWARNINGS: 0иFAILURES: 0;- PBS-бэкапы и сохранённые конфигурации всё ещё были доступны.
15.1. Сначала я проверил, какое ядро реально загружено
Код:
uname -r
grep '^GRUB_DEFAULT=' /etc/default/grub
grub-editenv list
proxmox-boot-tool kernel list 2>&1
dpkg -l | grep -E '^ii (proxmox-ve|proxmox-default-kernel|proxmox-kernel|pve-kernel)'
Результат:
Код:
7.0.14-14-pve
GRUB_DEFAULT=0
Manually selected kernels:
None.
Automatically selected kernels:
6.8.12-43-pve
7.0.14-14-pve
GRUB_DEFAULT=0 означал загрузку первой записи меню, grub-editenv list не показывал сохранённого старого выбора, вручную закреплённых ядер не было. Текущим оставалось 7.0, а 6.8 сохранялось как рабочее резервное ядро от PVE 8.Установленные новые пакеты:
Код:
ii proxmox-default-kernel 2.1.0
ii proxmox-kernel-6.8 6.8.12-43
ii proxmox-kernel-6.8.12-43-pve-signed 6.8.12-43
ii proxmox-kernel-7.0 7.0.14-14
ii proxmox-kernel-7.0.14-14-pve-signed 7.0.14-14
ii proxmox-kernel-helper 9.2.0
ii proxmox-ve 9.2.0
15.2. Удаление только старых ядер 5.13 и 5.15
Я не начинал с
autoremove и не удалял пакеты по маске. Сначала явно перечислил только заведомо старые ядра и выполнил симуляцию:
Код:
apt-get -s purge \
pve-kernel-5.13 \
pve-kernel-5.15 \
pve-kernel-5.13.19-2-pve \
pve-kernel-5.13.19-6-pve \
pve-kernel-5.15.158-2-pve
APT предложил удалить ровно пять указанных пакетов:
Код:
The following packages will be REMOVED:
pve-kernel-5.13*
pve-kernel-5.13.19-2-pve*
pve-kernel-5.13.19-6-pve*
pve-kernel-5.15*
pve-kernel-5.15.158-2-pve*
0 upgraded, 0 newly installed, 5 to remove and 0 not upgraded.
В списке не было:
proxmox-ve;proxmox-default-kernel;- текущего ядра
7.0.14-14-pve; - резервного ядра
6.8.12-43-pve; - GRUB или пакетов управления загрузкой.
Только после этого выполнил реальное удаление:
Код:
apt purge \
pve-kernel-5.13 \
pve-kernel-5.15 \
pve-kernel-5.13.19-2-pve \
pve-kernel-5.13.19-6-pve \
pve-kernel-5.15.158-2-pve
После удаления ещё раз проверил текущее ядро, пакетную базу, GRUB и список выбранных ядер:
Код:
uname -r
dpkg --audit
systemctl --failed --no-pager
proxmox-boot-tool kernel list
dpkg -l | grep -E '^ii (proxmox-ve|proxmox-default-kernel|proxmox-kernel|pve-kernel)'
grep -E 'Linux (7\.0\.14-14|6\.8\.12-43)-pve' \
/boot/grub/grub.cfg | head -n 10
df -h /
Оба нужных ядра оставались в GRUB.
15.3. Почему я не использовал proxmox-boot-tool clean для удаления ядер
proxmox-boot-tool синхронизирует загрузочные разделы и управляет выбором ядер в соответствующих схемах загрузки. Это не замена штатному удалению установленных Debian-пакетов ядра. Пакеты следует удалять через APT, чтобы корректно отработали зависимости, post-removal scripts, генерация initramfs и обновление GRUB.На этом сервере дополнительно использовался Legacy BIOS, а не EFI-managed boot, поэтому ручной вызов
proxmox-boot-tool clean для удаления старых пакетов был бы особенно бессмысленным.15.4. Симуляция autoremove
После явного удаления старых ядер я посмотрел, что APT считает больше не нужным:
Код:
apt-get -s autoremove --purge
Он предложил 30 пакетов, оставшихся в основном от Debian 12:
Код:
gcc-12-base
libboost-context1.74.0
libboost-filesystem1.74.0
libboost-iostreams1.74.0
libboost-program-options1.74.0
libboost-thread1.74.0
libcbor0.8
libdrm-nouveau2
libdrm-radeon1
libfile-find-rule-perl
libflac12
libfmt9
libicu72
libjs-sencha-touch
libldap-2.5-0
libllvm15
libnumber-compare-perl
libperl5.36
libpython3.11
libpython3.11-minimal
libpython3.11-stdlib
libsubid4
libtext-glob-perl
libxcb-dri2-0
perl-modules-5.36
python3.11
python3.11-minimal
sgml-base
telnet
usrmerge
В списке не было пакетов PVE, текущего или резервного ядра, LVM, GRUB и сетевого стека. Поэтому выполнил:
Код:
apt autoremove --purge
Почему сначала обязательна симуляция: набор автоматически установленных пакетов индивидуален. На другом сервере APT может предложить удалить DKMS-модуль, драйвер HBA/NIC, библиотеку стороннего backup agent или пакет, который администратор когда-то установил как зависимость. В таком случае нужный пакет сначала следует пометить как установленный вручную через
apt-mark manual имя-пакета и повторить симуляцию.15.5. Финальный контроль после очистки
Код:
uname -r
pveversion
dpkg --audit
systemctl --failed --no-pager
pvesm status
apt-get -s autoremove --purge
df -h /
Фактический итог:
Код:
7.0.14-14-pve
pve-manager/9.2.11/f6997e698c7933ea (running kernel: 7.0.14-14-pve)
UNIT LOAD ACTIVE SUB DESCRIPTION
0 loaded units listed.
Name Type Status
local dir active
local-lvm lvmthin active
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/pve-root 94G 57G 33G 64% /
После этой очистки дополнительная перезагрузка не требовалась: работающее ядро 7.0 не удалялось и конфигурация GRUB уже содержала обе нужные записи. Тем не менее при следующем плановом рестарте следует ещё раз убедиться, что узел загружается штатно.
16. Вопросы, которые возникли по ходу обновления
Зачем нужен бэкап VM, если обновление обычно проходит штатно?
Потому что обновлялся не один пакет, а две основные версии Proxmox и две версии Debian, включая ядро, QEMU, LVM, systemd, OpenSSH и GRUB. Бэкап на PBS превращает необратимую потерю VM в процедуру восстановления. При этом он не отменяет копию конфигурации хоста и аварийный консольный доступ.
Почему бэкап должен быть на PBS, NFS или внешнем носителе?
Копия на том же физическом диске зависит от того же контроллера, LVM и загрузочной системы. Если проблема затронет локальное хранилище или сам сервер, такой бэкап может стать недоступен одновременно с VM.
Нормально ли использовать pve-no-subscription?
Репозиторий доступен без ключа и содержит тот же функционал, но его пакеты проходят менее длительную проверку, чем enterprise. Proxmox рекомендует enterprise для производственных систем. В этой установке подписки не было, поэтому я осознанно использовал
pve-no-subscription, не смешивая его с pve-enterprise. Для критичного production-узла следует отдельно оценить подписку и требования к поддержке.Можно ли было перескочить с PVE 7.1 сразу на PVE 9?
Нет. Поддерживаемая логика — сначала довести текущую ветку до последнего 7.4, затем выполнить официальный переход 7 → 8, полностью проверить PVE 8 и только потом выполнять переход 8 → 9. Каждый переход меняет базовый Debian и имеет собственный checker и набор известных изменений.
Почему после установки новой версии pveversion показывал старое ядро?
Пакеты нового ядра уже лежали на диске, но Linux не подменяет запущенное ядро на ходу. До
reboot это нормальное состояние. Опасно другое: перезагружаться, не проверив наличие нового vmlinuz, initrd.img и записи GRUB.Почему apt update было недостаточно?
apt update только загружает индексы репозиториев. Само обновление пакетов выполняет apt dist-upgrade или эквивалентный apt full-upgrade, который умеет устанавливать и удалять пакеты для разрешения изменившихся зависимостей.Почему перед реальным dist-upgrade запускался apt-get -s?
Флаг
-s выполняет симуляцию без изменения системы. Именно на этом этапе можно увидеть удаление метапакета proxmox-ve, смешанные репозитории или отсутствие нового ядра и остановиться до причинения вреда.Опасно ли число «54 packages will be removed» при переходе на Debian 13?
Число без контекста ничего не решает. В нашем случае большая часть старых библиотек заменялась вариантами
t64, а Python, Perl и ZFS переходили на новые ABI. Безопасность подтверждалась парными установками замен, сохранением proxmox-ve и установкой ядра PVE 9. Если замены нет или удаляется метапакет PVE, продолжать нельзя.Почему для /etc/issue выбиралось N, а для lvm.conf — Y?
/etc/issue был локальным баннером, который безопасно сохранить. lvm.conf на этом конкретном узле был стандартным и не содержал важных пользовательских фильтров, поэтому была принята актуальная версия пакета. Эти ответы отражают назначение файлов и фактическую конфигурацию, а не универсальное правило «везде нажимать N» или «везде нажимать Y».Нужно ли беспокоиться из-за перезапуска ssh при обновлении libc?
Штатный рестарт
sshd обычно не разрывает уже установленное соединение, но новая сессия может не открыться из-за ошибки конфигурации или сети. Поэтому я сохранил текущую SSH-сессию и заранее предусмотрел IPMI/локальную консоль.Почему сообщение об отсутствии corosync.conf было нормальным?
Потому что узел standalone. Файл
/etc/pve/corosync.conf появляется у участника кластера. Создавать его только ради успешного pvecm status нельзя.Почему установленный ceph-fuse не потребовал обновления Ceph-кластера?
Потому что Ceph-кластера и Ceph-хранилища на узле не было. Клиентские пакеты могли быть установлены как зависимости или остаться от прежней конфигурации. Решение принималось по фактическому
pvesm status и результату штатного checker, а не только по наличию пакета.Почему proxmox-boot-tool status сообщил об отсутствующем файле?
Сервер загружался в Legacy BIOS через GRUB. Файл
/etc/kernel/proxmox-boot-uuids нужен для систем, где proxmox-boot-tool управляет синхронизацией загрузочных разделов. В нашей схеме отсутствие файла ожидаемо.Нужно ли было исправлять NOTICE об LVM autoactivation?
Нет, не в рамках этого обновления. Checker прямо сообщил, что все затронутые тома находятся на локальном storage и обычно не вызывают проблем. Я не стал менять поведение существующих LVM-томов в тот же момент, когда менялись ОС и PVE.
Почему после установки PVE 9 временно упал chrony?
Служба оказалась в failed-состоянии после замены базовых пакетов, но пакетная транзакция завершилась, сеть и хранилища работали, новое ядро и GRUB были готовы. После штатной перезагрузки Chrony запустился и синхронизировал время. Важно, что я не проигнорировал сообщение, а проверил службу повторно после загрузки.
Почему старое ядро 6.8 оставлено, а 5.13 и 5.15 удалены?
Ядро 6.8 было последним проверенным рабочим ядром предыдущей основной версии и служило разумным fallback. Ядра 5.x относились к PVE 7, занимали место и уже не были нужны после успешной работы PVE 9. Хранить одно актуальное резервное ядро полезно; хранить все ядра за несколько поколений — нет.
Что означало swtpm_setup: Not overwriting existing state file?
У VM уже существовало состояние виртуального TPM, и инструмент не стал его перезаписывать. Это защитное поведение, а не повод удалить TPM. Для BitLocker существующий TPM state особенно важен.
Почему перед Enroll Updated Certificates нужно приостановить BitLocker?
Изменение EFI Secure Boot certificates может изменить TPM measurements. Без приостановки protectors Windows способна перейти в BitLocker Recovery. Я заранее сохранил recovery key, выполнил
manage-bde -protectors -disable, обновил сертификаты только на выключенной VM, затем загрузил Windows и вернул защиту.17. Мой короткий контрольный список для повторения
- Проверить поддерживаемый маршрут обновления в официальной документации.
- Создать свежие проверяемые бэкапы всех VM/CT на внешнем storage/PBS.
- Сохранить конфигурацию хоста и текущие APT sources.
- Обеспечить IPMI/iKVM/физическую консоль.
- Остановить гостей и проверить
qm list/pct list. - Проверить
pveversion -v,dpkg --audit,apt-mark showhold. - Проверить storage, свободное место, тип корневой ФС и режим загрузки.
- Выявить ZFS, Ceph, DKMS, passthrough, multipath и сторонние репозитории.
- Довести текущую ветку PVE до последнего пакетного состояния.
- Запустить соответствующий checker с
--full. - Исправить все
FAILURESи понять каждоеWARNING. - Сохранить текущие репозитории.
- Заменить только нужный codename Debian и PVE.
- Проверить источники через
grep, затем выполнитьapt update. - Проверить кандидатов через
apt-cache policy. - Выполнить
apt-get -s dist-upgrade. - Убедиться, что
proxmox-veобновляется, а не удаляется. - Выполнить реальный
apt dist-upgradeв интерактивной консоли. - Проверить
dpkg --audit, новый kernel/initrd и запись GRUB. - Перезагрузиться.
- Проверить запущенное ядро, службы, storage, NTP и checker.
- Запускать VM по одной и проверять не только статус, но и ОС/сеть/сервисы.
- Для UEFI 2023 сначала защитить BitLocker recovery path, затем использовать
qm enroll-efi-keys. - Не удалять старые ядра до проверки всех VM.
- Оставить текущее ядро и одно проверенное fallback-ядро.
- Перед
purgeиautoremoveвсегда запускать симуляцию. - Финально проверить
dpkg --audit, failed units, storage и отсутствие ожидающих APT-операций.
18. Что делать, если этап пошёл не по плану
- APT хочет удалить proxmox-ve: ответить
n, не подтверждать транзакцию, проверить codename и все активные репозитории. - dpkg завершился с ошибкой: не перезагружаться вслепую; сохранить полный вывод, выполнить
dpkg --audit, проверить место и конкретный failed package. - Нет нового ядра или записи GRUB: не перезагружаться; проверить установку kernel package, создание initramfs и вывод
update-grub. - После reboot пропала сеть: использовать IPMI/локальную консоль, проверить имена интерфейсов и
/etc/network/interfaces. - local-lvm не active: не запускать VM; проверить
pvs,vgs,lvs,lvm.confи журнал LVM. - Windows просит BitLocker recovery key: использовать заранее сохранённый ключ; не удалять EFI/TPM state и не пытаться «починить» VM созданием нового TPM.
- Новое ядро не загружается: выбрать в Advanced options последнее проверенное ядро 6.8, загрузить узел и исследовать initramfs, драйверы и GRUB.
- Хост невозможно быстро восстановить: установить чистый поддерживаемый PVE, восстановить сеть/storage и вернуть VM из PBS. Именно ради этого бэкапы проверяются до обновления.
19. Итог
Я начал с PVE 7.1-7, Debian 11 и ядра 5.13, а закончил на PVE 9.2.11, Debian 13 и ядре 7.0.14-14. Само выполнение
apt dist-upgrade было не самой сложной частью. Безопасность дали контрольные точки:- внешние бэкапы VM на PBS и отдельная копия конфигурации хоста;
- никаких прыжков через основные версии;
- штатные
pve7to8иpve8to9; - проверка APT-транзакции до её выполнения;
- осознанные ответы на каждый conffile-вопрос;
- проверка kernel, initrd и GRUB до каждого reboot;
- проверка служб, времени и хранилищ после каждого reboot;
- запуск VM до удаления старых пакетов;
- сохранение ядра 6.8 как fallback;
- двухэтапная очистка: сначала симуляция, потом удаление.
В результате все виртуальные машины сохранились, предупреждение по UEFI 2023 для Windows 11 было устранено штатно, пакетная система осталась чистой, а на корневом разделе сохранилось около 33 ГБ свободного места.
20. Официальные материалы
- Proxmox VE: Upgrade from 7 to 8
- Proxmox VE: Upgrade from 8 to 9
- Proxmox VE Package Repositories
- Proxmox VE Host Bootloader
- Proxmox VE Administration Guide
- Официальный анонс Proxmox VE 9.2
- Microsoft Learn: manage-bde
- Microsoft Learn: manage-bde protectors
Версии пакетов и номера ядер в этой статье — фактический результат конкретного обновления на 31 августа 2026 года. При повторении позднее номера минорных версий могут отличаться. Маршрут, официальные инструкции и результаты checker нужно сверять заново непосредственно перед работами.