In deze post laat ik je zien hoe je in Windows 10 over ssh verbindt naar je KVM met virt-manager (Virtual Machine Manager). Hiervoor heb je ook Windows Subsystem for Linux (WSL) nodig, want de Windows versie van virt-manager kan geen connectie over ssh maken. Sad but true. Om één en ander aan elkaar te breien heb je ook een X-server voor Windows nodig, en het gebruik van ssh keys maakt het geheel makkelijker omdat je niet steeds je wachtwoord hoeft in te voeren.

Vanuit WSL je KVM VM’s beheren met virt-manager over een beveiligde ssh-verbinding (qemu+ssh://).

Het gebruik van ssh keys is vaak verplicht zodat je op een veilige manier verbinding maakt met externe servers (services) die onder jouw beheer vallen. Maar wat als je vanuit Windows een VM moet beheren die wordt gehost op KVM, en ssh key authenticatie verplicht is? Libvirt biedt geen QEMU met SSH (qemu+ssh://) ondersteuning in Windows met virt-manager. Dus moet je wat anders verzinnen.

KVM staat voor Kernel-based Virtual Machine, dus een “KVM virtuele machine” is eigenlijk dubbelop.

KVM (for Kernel-based Virtual Machine) is a full virtualization solution for Linux on x86 hardware containing virtualization extensions (Intel VT or AMD-V). It consists of a loadable kernel module, kvm.ko, that provides the core virtualization infrastructure and a processor specific module, kvm-intel.ko or kvm-amd.ko.

Using KVM, one can run multiple virtual machines running unmodified Linux or Windows images. Each virtual machine has private virtualized hardware: a network card, disk, graphics adapter, etc.

KVM is open source software. The kernel component of KVM is included in mainline Linux, as of 2.6.20. The userspace component of KVM is included in mainline QEMU, as of 1.3.

https://www.linux-kvm.org/page/Main_Page

Als je KVM vanuit Windows 10 met Virtual Machine Manager (virt-manager) wilt beheren, dan is een Cygwin of Xming omgeving natuurlijk een mogelijkheid. Maar hé, Windows heeft tegenwoordig ook Linux-ondersteuning aan boord in de vorm van Windows Subsystem for Linux of WSL. Ik schreef al eerder over hoe je een Access-database converteert naar MySQL in WSL. Handig hè?!

Benodigde software

Je hebt nodig:

  • OpenSSH Client (PowerShell: Add-WindowsCapability -Online -Name OpenSSH.Client*) – Zie mijn Engelstalige how-to Manually install OpenSSH in Windows Server hoe je eenvoudig OpenSSH installeert in Windows 10 en Server.
  • ssh keys via ssh-keygen.exe, kies voor het type ed25519 en zet je key over naar je externe servers. Windows OpenSSH kent geen ssh-copy-id dus moet je zelf de key kopiëren
  • Windows Subsystem for Linux (PowerShell: Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux) en ik gebruik Ubuntu:
    Invoke-WebRequest -Uri https://aka.ms/wsl-ubuntu-1804 -OutFile Ubuntu.appx -UseBasicParsing
    Add-AppxPackage .\Ubuntu.appx
  • VcXsrv Windows X Server
  • virt-manager (in WSL) inclusief alle packages.

Installeer VcXsrv, en als je het start kun je gewoon de standaard instellingen geselecteerd laten.

VcXsrv is een open-source display server voor Microsoft Windows. Het stelt een Windows gebruiker in staat GUI programma’s uit te voeren die ontwikkeld zijn voor het X Window systeem van Linux.

In Bash moet je de lokale X server configureren.

  • voer het volgende commando uit:
    echo "export DISPLAY=localhost:0.0" >> ~/.bashrc
  • om dit te activeren, herstart Bash of voer het volgende commando uit:
    . ~/.bashrc

Je kunt nu een grafisch Linuxprogramma testen in Windows, zoals xeyes:
sudo apt-get install x11-apps && xeyes

Xeyes in Windows 10 via VcXserv X Server

Oké, we hebben het nu voor elkaar gekregen dat we grafische Linuxprogamma’s kunnen starten in Windows via een alternatieve X Server.

WSL2 update voor X server

Omdat WSL2 van een andere virtualisatietechnologie gebruikmaakt moet je je WSL2 display iets anders configureren. De WSL2-instantie draait namelijk gevirtualiseerd in een Hyper-V omgeving en heeft daardoor een eigen IP-adres. Je kunt het IP-adres uit /etc/resolv.conf gebruiken:

grep nameserver /etc/resolv.conf | awk '{print $2}'

Stel dat het resultaat 172.25.32.1 is, dan voer je het volgende commando in Bash uit:

echo "export DISPLAY=172.25.32.1:0.0" >> ~/.bashrc

En als tweede moet je VcXsrv starten met Access Control uitgeschakeld, zodat externe verbindingen van clients worden geaccepteerd:

Disable Access Control in VcXsrv

Of gebruik hiervoor de parameter -ac. Let er ook op dat je Windows Defender Firewall with Advanced Security de verbinding toestaat. Je kunt een regel aanmaken om inkomend verkeer op poort 6000 door te laten, of je kunt desnoods de firewall uitschakelen voor de virtuele WSL adapter:

Set-NetFirewallProfile -DisabledInterfaceAliases "vEthernet (WSL)"

Ssh keys delen tussen Windows en WSL

Sharing SSH keys between Windows and WSL 2

Voor het gemak (nou ja… tot je een chmod foutje maakt) kun je je ssh keys delen tussen Windows en WSL. Gebruik je Windows omgeving voor het maken van de ssh key(s), en die kun je dan ook in WSL/Linux gebruiken. Hiervoor moet je je DrvFs mount aanpassen met metadata, of extra informatie, zodat Linuxpermissies aan een bestanden kunnen worden toegevoegd als metadata.

Hiermee kan een bestand zowel Linux én Windows read/write/execute permissie bits hebben. Neat! :) Maak het bestand /etc/wsl.conf en plaats hierin:

[automount]
enabled = true
root = /mnt/
options = "metadata,umask=22,fmask=11"
mountFsTab = false

Je vindt meer informatie hierover in de blogposts Unix permissions on WSL NTFS mount en Automatically Configuring WSL. Nadat je dit bestand hebt aangemaakt moet je uitloggen uit WSL (en eventueel de service LxssManager herstarten). Als je WSL weer start kun je het mount point verifiëren met mount -l. Dat ziet er ongeveer zo uit:

$ mount -l
rootfs on / type lxfs (rw,noatime)
none on /dev type tmpfs (rw,noatime,mode=755)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,noatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,noatime)
devpts on /dev/pts type devpts (rw,nosuid,noexec,noatime,gid=5,mode=620)
none on /run type tmpfs (rw,nosuid,noexec,noatime,mode=755)
none on /run/lock type tmpfs (rw,nosuid,nodev,noexec,noatime)
none on /run/shm type tmpfs (rw,nosuid,nodev,noatime)
none on /run/user type tmpfs (rw,nosuid,nodev,noexec,noatime,mode=755)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime)
cgroup on /sys/fs/cgroup type tmpfs (rw,relatime,mode=755)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,relatime,devices)
C:\ on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000,umask=22,fmask=11,metadata,case=off)

Nu heb je alleen nog geen ssh keys tot je beschikking in WSL. Dat kun je gelukkig snel oplossen met een symbolic link:

ln -s /mnt/c/Users/janreilink/.ssh/ ~/.ssh

Het is uiteraard belangrijk dat ~/.ssh nog niet bestaat. Als je dan verbinding maakt kun je de foutmelding setsockopt IPV6_TCLASS 16: Operation not permitted negeren (bron).

Fijn, nu werkt ssh key authenticatie ook. Omdat je virt-manager (Virtual Machine Manager) hierboven al hebt geïnstalleerd kun je die nu ook proberen.

Virt-manager draaien in Windows 10 via WSL en een VcXserv X Server

Als alles hierboven goed is gegaan kun je nu Virtual Machine Manager starten en draaien in Windows 10, via WSL en een open source X Server VcXserv. Helemaal perfect zal het niet zijn, maar dat geeft niet. Het doel is dat het werkbaar is.

Je kunt nu in Bash uitvoeren:

virt-manager -c 'qemu+ssh://kvm-test.example.com/system'

en na een korte tijd zal het Virtual Machine Manager venster openen.

Virtual Machine Manager in Windows 10

Je kunt nu je normale beheerwerkzaamheden op KVM virtuele machines uitvoeren vanaf je Windows werkstation.

Met de ondersteuning van WSLg in Windows 10 is bovenstaande een beetje achterhaald. Je hebt geen VcXserv meer nodig en kunt virt-manager starten vanuit een Windows Terminal (link 2). Toch laat ik bovenstaande ongemoeid ter leering ende vermeack. Wil je weten hoe je virt-manager, WSL 2, qemu+ssh gebruikt in Windows 11?
Connect to a KVM host through an ssh tunnel and arbitrary port in Windows 11 and WSL 2

Leave a Comment

Comments

No comments yet. Why don’t you start the discussion?

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *