Проблема связана с этой старой темой (отмечена как решенная): G [РЕШЕНО] Пост в теме 'Console is using SPICE instead of noVNC' 1 июня 2025 г. Извините за воскрешение этой старой темы, но проблема никуда не делась. У меня свежая установка Proxmox (v8.4.1). Я создал виртуальную машину Windows 11, она работала отлично. Я потратил некоторое время на тестирование и сравнение различных вариантов оборудования отображения (Standard VGA, VirtIO-GPU, VirGL-GPU и т.д.). Все они работали исправно, и кнопка консоли открывалась в VNC. Затем я решил попробовать Spice. Это работало не очень хорошо, и мне это не понравилось, поэтому я откатил конфигурацию, удалив все оборудование SPICE (VGA, usb, audio). Но теперь основная кнопка консоли все равно пытается открыться с Spice, когда выбраны VirtIO-GPU или VirGL-GPU... Gustavo Neves Как я объяснял там, кнопка консоли по умолчанию пытается открыться с virt-viewer/spice, когда выбран "VirtIO-GPU" или "VirGL GPU" (или очевидно, SPICE). При использовании Standard VGA или VMware, кнопка консоли по умолчанию открывается в NoVNC. Предложенным решением было вручную задать консольный просмотрщик по умолчанию в меню Datacenter, но мне не нравится это решение, потому что оно, по сути, отключает автоматический выбор просмотрщиков, заставляя использовать ТОЛЬКО выбранный просмотрщик во всех ВМ, CT и т.д. Я бы предпочел сохранить стандартный (и автоматический) просмотрщик. Таким образом я могу иметь NoVNC для Windows ВМ и xterm.js для Linux CT, когда я нажимаю на Консоль (или даже Spice, если я использую это в ВМ). После нескольких часов копания в коде Proxmox, мне кажется, удалось найти проблему. API в /nodes/{node}/qemu/{vm-id}/status/current имеет "особую" проверку для $vga->{type} =~ /^virtio/, что заставляет его возвращать spice=1 при использовании VirtIO GPU. Вот строка, в которой находится ошибка: Затем я отредактировал файл /usr/share/perl5/PVE/API2/Qemu.pm в своей инстанции, удалив проверку virtio. Итак, из этого Perl: if ($conf->{vga}) {
my $vga = PVE::QemuServer::parse_vga($conf->{vga});
my $spice = defined($vga->{type}) && $vga->{type} =~ /^virtio/;
$spice ||= PVE::QemuServer::vga_conf_has_spice($conf->{vga});
$status->{spice} = 1 if $spice;
$status->{clipboard} = $vga->{clipboard};
} На это Perl: if ($conf->{vga}) {
my $vga = PVE::QemuServer::parse_vga($conf->{vga});
#my $spice = defined($vga->{type}) && $vga->{type} =~ /^virtio/;
#$spice ||= PVE::QemuServer::vga_conf_has_spice($conf->{vga});
my $spice = PVE::QemuServer::vga_conf_has_spice($conf->{vga});
$status->{spice} = 1 if $spice;
$status->{clipboard} = $vga->{clipboard};
} Затем мы перезагружаем некоторые сервисы, чтобы изменения вступили в силу Код: systemctl restart pvedaemon.service pveproxy.service И вот оно. Работает. Простое sed-команда для изменения файла (используйте на свой страх и риск, НЕ используйте это на производственных серверах) Bash: sed -i.bak -e 's/my $spice = defined($vga->{type}) \&\& $vga->{type} =~ \/^virtio\/;/g' -e 's/$spice ||= PVE::QemuServer::vga_conf_has_spice($conf->{vga});/\#$spice ||= PVE::QemuServer::vga_conf_has_spice($conf->{vga});\n my $spice = PVE::QemuServer::vga_conf_has_spice($conf->{vga});/g' /usr/share/perl5/PVE/API2/Qemu.pm Проверьте изменения Код: # diff /usr/share/perl5/PVE/API2/Qemu.pm /usr/share/perl5/PVE/API2/Qemu.pm.bak
3092,3094c3092,3093
< #my $spice = defined($vga->{type}) && $vga->{type} =~ /^virtio/;
< #$spice ||= PVE::QemuServer::vga_conf_has_spice($conf->{vga});
< my $spice = PVE::QemuServer::vga_conf_has_spice($conf->{vga});
---
> my $spice = defined($vga->{type}) && $vga->{type} =~ /^virtio/;
> $spice ||= PVE::QemuServer::vga_conf_has_spice($conf->{vga}); Я не уверен, зачем нужна эта проверка. Есть ли причина использовать SPICE в качестве просмотра по умолчанию для оборудования VirtIO-GPU? Интересно, может ли кто-нибудь прояснить этот вопрос. Кроме того, стоит ли открыть тикет? Или этого поста будет достаточно, чтобы изменения достигли команды разработчиков?
my $vga = PVE::QemuServer::parse_vga($conf->{vga});
my $spice = defined($vga->{type}) && $vga->{type} =~ /^virtio/;
$spice ||= PVE::QemuServer::vga_conf_has_spice($conf->{vga});
$status->{spice} = 1 if $spice;
$status->{clipboard} = $vga->{clipboard};
} На это Perl: if ($conf->{vga}) {
my $vga = PVE::QemuServer::parse_vga($conf->{vga});
#my $spice = defined($vga->{type}) && $vga->{type} =~ /^virtio/;
#$spice ||= PVE::QemuServer::vga_conf_has_spice($conf->{vga});
my $spice = PVE::QemuServer::vga_conf_has_spice($conf->{vga});
$status->{spice} = 1 if $spice;
$status->{clipboard} = $vga->{clipboard};
} Затем мы перезагружаем некоторые сервисы, чтобы изменения вступили в силу Код: systemctl restart pvedaemon.service pveproxy.service И вот оно. Работает. Простое sed-команда для изменения файла (используйте на свой страх и риск, НЕ используйте это на производственных серверах) Bash: sed -i.bak -e 's/my $spice = defined($vga->{type}) \&\& $vga->{type} =~ \/^virtio\/;/g' -e 's/$spice ||= PVE::QemuServer::vga_conf_has_spice($conf->{vga});/\#$spice ||= PVE::QemuServer::vga_conf_has_spice($conf->{vga});\n my $spice = PVE::QemuServer::vga_conf_has_spice($conf->{vga});/g' /usr/share/perl5/PVE/API2/Qemu.pm Проверьте изменения Код: # diff /usr/share/perl5/PVE/API2/Qemu.pm /usr/share/perl5/PVE/API2/Qemu.pm.bak
3092,3094c3092,3093
< #my $spice = defined($vga->{type}) && $vga->{type} =~ /^virtio/;
< #$spice ||= PVE::QemuServer::vga_conf_has_spice($conf->{vga});
< my $spice = PVE::QemuServer::vga_conf_has_spice($conf->{vga});
---
> my $spice = defined($vga->{type}) && $vga->{type} =~ /^virtio/;
> $spice ||= PVE::QemuServer::vga_conf_has_spice($conf->{vga}); Я не уверен, зачем нужна эта проверка. Есть ли причина использовать SPICE в качестве просмотра по умолчанию для оборудования VirtIO-GPU? Интересно, может ли кто-нибудь прояснить этот вопрос. Кроме того, стоит ли открыть тикет? Или этого поста будет достаточно, чтобы изменения достигли команды разработчиков?
