How-to boot Proxmox system without starting its VMs

Как загрузить Proxmox-систему без запуска ее виртуалок

Применительно к Debian-based установке

За запуск VMs отвечает systemd’s pve-manager, который запускается в multi-user.target:

% sudo systemctl cat pve-manager.service | sed -ne '/\[Install/,$ p'
[Install]
WantedBy=multi-user.target

В пр-цпе, по логике вещей, достаточно просто запретить этот unit. При попытке сделать это, однако, выясняется, что это просто не работает:

% sudo systemctl disable pve-manager.service
Synchronizing state for pve-manager.service with sysvinit using update-rc.d...
Executing /usr/sbin/update-rc.d pve-manager defaults
insserv: Service pveproxy has to be enabled to start service pve-manager
insserv: Service qemu-server has to be enabled to start service pve-manager
insserv: Service pvestatd has to be enabled to start service pve-manager
insserv: exiting now!
update-rc.d: error: insserv rejected the script header
*** Error in `systemctl': double free or corruption (fasttop): 0x00005577b8f55b00 ***

В другом варианте, можно задействовать механизм target’ов, который позволяет сгруппировать набор запускаемых сервисов.

Если посмотреть какой target выполнения используется в Proxmox по-умолчанию, то можно удивиться:

% sudo systemctl get-default
graphical.target

— этот уровень по-смыслу скорее подходит для desktop’а пользователей, нежели сервера. Но это, даже, отчасти, облегчает решение: можно перенастроить pve-manager на запуск на уровне graphical.target, и при необходимости, загрузить систему только до multi-user.target.

Требуемую перенастройку можно сделать так:

systemctl cat pve-manager.service показывает размещение unit-файла:

% sudo systemctl cat pve-manager.service | head -n3
# /lib/systemd/system/pve-manager.service
[Unit]
Description=PVE VM Manager

Внизу, в секции Install, WantedBy нужно заменить на graphical.target. Для того, чтобы systemd подхватил изменения (внутри у него используются symlink’и):

% sudo systemctl reenable pve-manager.service

Загрузку в multi-user.target можно выполнить либо разово, указав systemd.unit=multi-user.target в перечне параметров загрузки системы, либо задать его по-умолчанию:

% sudo systemctl set-default multi-user.target

Если затем потребуется разово перейти в graphical.target, запустив, таким образом, виртуалки:

% sudo systemctl isolate graphical.target