Proxmox VE: Mehrfach per Spice mit einer VM konsole verbinden (Multi-Client Feature)

Ich stand vor der Aufgabenstellung, dass ich eine VDI mit der OpenSource Virtualisierungs-Lösung Proxmox VE aufbauen sollte. Mit dieser Lösung sollten Supporter und Developer im Team arbeiten können um Probleme zu lösen.

Nun ist es leider so, dass Spice nicht Multi-Client fähig ist und somit nur auf einem PC eine Spice-Konsole geöffnet werden kann. Wenn eine zweite Konsole geöffnet wird schließt sich die erste einfach. Natürlich eher unpraktisch um gemeinsam auf einer VM zu arbeiten. Aber zum Glück habe ich dafür eine Lösung gefunden. Auf der Website von Spice *klick* findet sich in den Future Features ein Hinweis auf eine solche Funktion. Diese ist leider noch nicht stabil. Aber es lässt sich durch das setzen einer Variable einfach aktivieren. Auf der Seite sind einige Beispiele genannt, doch leider funktioniert das so einfach nicht bei Proxmox VE.

Ich habe mich also auf die Suche gemacht und die Lösung ist eigentlich recht einfach. Wir brauchen nur eine Zeile Code hinzufügen:

local $ENV{SPICE_DEBUG_ALLOW_MC} = "1";

Diese Zeile muss in der Datei /usr/share/perl5/PVE/Tools.pm eingefügt sein. Da sich die Zeilennummer bei einem Update von Proxmox VE bzw. seinen Komponenten immer ein wenig ändern kann, hier einfach ein Ausschnitt aus der Datei:

    319         eval {
    320             local $ENV{LC_ALL} = $lang;
    321
    322             # suppress LVM warnings like: "File descriptor 3 left open";
    323             local $ENV{LVM_SUPPRESS_FD_WARNINGS} = "1";
    324             local $ENV{SPICE_DEBUG_ALLOW_MC} = "1";
    325
    326             $pid = open3($writer, $reader, $error, @$cmd) || die $!;
    327
    328             # if we pipe fron STDIN, open3 closes STDIN, so we we
    329             # a perl warning "Filehandle STDIN reopened as GENXYZ .. "
    330             # as soon as we open a new file.
    331             # to avoid that we open /dev/null
    332             if (!ref($writer) && !defined(fileno(STDIN))) {
    333                 POSIX::close(0);
    334                 open(STDIN, "</dev/null");
    335             }
    336         };

man beachte Zeile 324 in meinem Beispiel.

Im Anschluss muss noch der pvedaemon neugestartet werden.

systemctl restart pvedaemon

Aber ACHTUNG: dieses Feature ist wirklich noch etwas Buggy. Ich hab es jetzt schon länger im produktiven Einsatz, aber es kann durchaus zu Problemen kommen, wenn zum Beispiel die Größe der Konsole öfter geändert wird. Auch die Zwischenablage macht nicht immer was Sie soll. Es ist also durchaus noch Verbesserungspotential vorhanden.

Bei einem Update kann es übrigens passieren, dass die Änderung wieder überschrieben wird. Vor allem wenn sich die pve Komponenten aktualisieren. Also sollte man nach einem Update kurz prüfen ob es noch funktioniert.