Proxmox and SR-IOV support for Intel GPU and Mellanox network adapter

  • Enable VT-d(Intel Virtualization Technology for Directed I/O), for IOMMU(Input Output Memory Management Unit) services, and SR-IOV (Single Root IO Virtualization), a technology that allows a physical PCIe device to present itself multiple times through the PCIe bus, in motherboard BIOS in Chipset, e.g. ASRock Z790 Riptide WiFi & Mini PC with Intel Alder Lake-N i3-N305.

  • Enable SR-IOV for Mellonax network adapter e.g. Mellanox ConnectX-4 MCX455A-ECAT PCIe x16 3.0 100GBe VPI EDR IB in the same motherboard BIOS.

  • SR-IOV is default enabled for Intel 82599ES 10G optical ports network card.

  • Add Proxmox No Subscription by running Proxmox VE Helper-Scripts https://community-scripts.github.io/ProxmoxVE/scripts:

1
2
3
4
root@pve:~# cat /etc/apt/sources.list
deb http://deb.debian.org/debian bookworm main contrib
deb http://deb.debian.org/debian bookworm-updates main contrib
deb http://security.debian.org/debian-security bookworm-security main contrib

and run packages update:

1
root@pve:~# apt update

and install all build tools:

1
root@pve:~# apt install build-* dkms git sysfsutils intel-gpu-tools mokutil -y
  • Set/Pin Proxmox kernel version:
1
2
3
4
5
6
7
8
root@pve:~# proxmox-boot-tool kernel pin 6.8.4-2-pve
Setting '6.8.4-2-pve' as grub default entry and running update-grub.
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-6.8.4-2-pve
Found initrd image: /boot/initrd.img-6.8.4-2-pve
Found memtest86+ 64bit EFI image: /boot/memtest86+x64.efi
Adding boot menu entry for UEFI Firmware Settings ...
done

and verify Proxmox kernal version:

1
2
3
4
5
6
7
8
9
root@pve:~# proxmox-boot-tool kernel list
Manually selected kernels:
None.

Automatically selected kernels:
6.8.4-2-pve

Pinned kernel:
6.8.4-2-pve
  • Install Proxmox kernel headers source code package:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@pve:~# uname -r
6.8.4-2-pve

root@pve:~# apt install proxmox-headers-$(uname -r)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
proxmox-headers-6.8.4-2-pve
0 upgraded, 1 newly installed, 0 to remove and 39 not upgraded.
Need to get 13.7 MB of archives.
After this operation, 97.0 MB of additional disk space will be used.
Get:1 http://download.proxmox.com/debian/pve bookworm/pve-no-subscription amd64 proxmox-headers-6.8.4-2-pve amd64 6.8.4-2 [13.7 MB]
Fetched 13.7 MB in 1s (23.8 MB/s)
Selecting previously unselected package proxmox-headers-6.8.4-2-pve.
(Reading database ... 70448 files and directories currently installed.)
Preparing to unpack .../proxmox-headers-6.8.4-2-pve_6.8.4-2_amd64.deb ...
Unpacking proxmox-headers-6.8.4-2-pve (6.8.4-2) ...
Setting up proxmox-headers-6.8.4-2-pve (6.8.4-2) ...

Upgrade Linux Kernel i915 firmware to the latest version:

1
2
3
4
5
6
7
8
9
root@pve:~# mkdir firmware && cd firmware

root@pve:~/firmware# wget -r -nd -e robots=no -A '*.bin' --accept-regex '/plain/' https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree/i915/
--2025-05-18 13:41:09-- https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree/i915/
Resolving git.kernel.org (git.kernel.org)... 172.236.150.65
Connecting to git.kernel.org (git.kernel.org)|172.236.150.65|:443... connected.
...

root@pve:~/firmware# mv *.bin /lib/firmware/i915/
  • Download Linux i915 driver with SR-IOV support for Linux kernel:
1
root@pve:~# git clone https://github.com/strongtz/i915-sriov-dkms

and change into the cloned repository and run:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@pve:~/i915-sriov-dkms# cat dkms.conf
PACKAGE_NAME="i915-sriov-dkms"
PACKAGE_VERSION="2024.07.24"

BUILT_MODULE_NAME[0]="i915"
DEST_MODULE_LOCATION[0]=/updates
MAKE[0]="make -C ${kernel_source_dir} M=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build"

BUILT_MODULE_NAME[1]="kvmgt"
DEST_MODULE_LOCATION[1]=/updates
CLEAN="make -C ${kernel_source_dir} M=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build clean"

AUTOINSTALL=yes
BUILD_EXCLUSIVE_KERNEL="^6\.([8-9]|1[0-5])"

root@pve:~/i915-sriov-dkms# dkms add .
Creating symlink /var/lib/dkms/i915-sriov-dkms/2024.07.24/source -> /usr/src/i915-sriov-dkms-2024.07.24

and build, install i915-sriov-dkms Linux kernel module:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
root@pve:~/i915-sriov-dkms# GUCFIRMWARE_MINOR=13 dkms install -m $(grep PACKAGE_NAME= dkms.conf | awk -F'"' '{print $2}') -v $(grep PACKAGE_VERSION= dkms.conf | awk -F'"' '{print $2}') --force --kernelsourcedir /usr/src/linux-headers-$(uname -r)
Sign command: /lib/modules/6.8.4-2-pve/build/scripts/sign-file
Signing key: /var/lib/dkms/mok.key
Public certificate (MOK): /var/lib/dkms/mok.pub
Certificate or key are missing, generating self signed certificate for MOK...

Building module:
Cleaning build area...
make -j20 KERNELRELEASE=6.8.4-2-pve -C /lib/modules/6.8.4-2-pve/build M=/var/lib/dkms/i915-sriov-dkms/2024.07.24/build.......
Signing module /var/lib/dkms/i915-sriov-dkms/2024.07.24/build/i915.ko
Cleaning build area...

i915.ko:
Running module version sanity check.
- Original module
- Installation
- Installing to /lib/modules/6.8.4-2-pve/updates/dkms/
depmod...

Download i915-sriov-dkms deb release package:

1
root@pve:~# wget -O /tmp/i915-sriov-dkms_2026.02.09_amd64.deb "https://github.com/strongtz/i915-sriov-dkms/releases/download/2026.02.09/i915-sriov-dkms_2026.02.09_amd64.deb"

Install the deb package with dpkg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
root@pve:~# dpkg -i /tmp/i915-sriov-dkms_2026.02.09_amd64.deb
Selecting previously unselected package i915-sriov-dkms.
(Reading database ... 97011 files and directories currently installed.)
Preparing to unpack .../i915-sriov-dkms_2026.02.09_amd64.deb ...
Unpacking i915-sriov-dkms (2026.02.09) ...
Setting up i915-sriov-dkms (2026.02.09) ...
Removing old i915-sriov-dkms/2026.02.09 DKMS files...
Deleting module i915-sriov-dkms/2026.02.09 completely from the DKMS tree.
Loading new i915-sriov-dkms/2026.02.09 DKMS files...
Building for 6.17.9-1-pve

Building initial module i915-sriov-dkms/2026.02.09 for 6.17.9-1-pve
Sign command: /lib/modules/6.17.9-1-pve/build/scripts/sign-file
Signing key: /var/lib/dkms/mok.key
Public certificate (MOK): /var/lib/dkms/mok.pub
Certificate or key are missing, generating self signed certificate for MOK...

Building module(s)....................................................... done.
Signing module /var/lib/dkms/i915-sriov-dkms/2026.02.09/build/compat/intel_sriov_compat.ko
Signing module /var/lib/dkms/i915-sriov-dkms/2026.02.09/build/drivers/gpu/drm/i915/i915.ko
Signing module /var/lib/dkms/i915-sriov-dkms/2026.02.09/build/drivers/gpu/drm/i915/kvmgt.ko
Signing module /var/lib/dkms/i915-sriov-dkms/2026.02.09/build/drivers/gpu/drm/xe/xe.ko
Installing /lib/modules/6.17.9-1-pve/updates/dkms/intel_sriov_compat.ko
Found pre-existing /lib/modules/6.17.9-1-pve/kernel/drivers/gpu/drm/i915/i915.ko, archiving for uninstallation
Installing /lib/modules/6.17.9-1-pve/updates/dkms/i915.ko
Found pre-existing /lib/modules/6.17.9-1-pve/kernel/drivers/gpu/drm/i915/kvmgt.ko, archiving for uninstallation
Installing /lib/modules/6.17.9-1-pve/updates/dkms/kvmgt.ko
Found pre-existing /lib/modules/6.17.9-1-pve/kernel/drivers/gpu/drm/xe/xe.ko, archiving for uninstallation
Installing /lib/modules/6.17.9-1-pve/updates/dkms/xe.ko
Running depmod... done.
update-initramfs: Generating /boot/initrd.img-6.17.9-1-pve
Running hook script 'zz-proxmox-boot'..
Re-executing '/etc/kernel/postinst.d/zz-proxmox-boot' in new private mount namespace..
No /etc/kernel/proxmox-boot-uuids found, skipping ESP sync.
update-initramfs: Generating /boot/initrd.img-6.17.2-1-pve
Running hook script 'zz-proxmox-boot'..
Re-executing '/etc/kernel/postinst.d/zz-proxmox-boot' in new private mount namespace..
No /etc/kernel/proxmox-boot-uuids found, skipping ESP sync.

and enable i915-sriov-dkms module with upto maximum 7 VFS (Virtual File System) in Linux kernel:

1
2
root@pve:~# cat /etc/default/grub | grep GRUB_CMDLINE_LINUX_DEFAULT
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=7 module_blacklist=xe"

enable SR-IOV Configuration:

1
root@pve:~# echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 7" >> /etc/sysfs.conf
1
2
3
4
5
6
7
8
root@pve:~# update-grub

root@pve:~# update-initramfs -u -k all
update-initramfs: Generating /boot/initrd.img-6.8.4-2-pve
Running hook script 'zz-proxmox-boot'..
Re-executing '/etc/kernel/postinst.d/zz-proxmox-boot' in new private mount namespace..
No /etc/kernel/proxmox-boot-uuids found, skipping ESP sync.
...
  • Reboot Proxmox:
1
2
3
4
5
6
root@pve:~# lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Raptor Lake-S GT1 [UHD Graphics 770] (rev 04)
00:02.1 VGA compatible controller: Intel Corporation Raptor Lake-S GT1 [UHD Graphics 770] (rev 04)
...
00:02.6 VGA compatible controller: Intel Corporation Raptor Lake-S GT1 [UHD Graphics 770] (rev 04)
00:02.7 VGA compatible controller: Intel Corporation Raptor Lake-S GT1 [UHD Graphics 770] (rev 04)

First VGA 00:02.0 is the REAL GPU. Other 7 are Virtual ones.

Verify IOMMU has been enabled:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
root@pve:~# dmesg | grep -i iommu
[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-6.8.4-2-pve root=/dev/mapper/pve-root ro quiet intel_iommu=on i915.enable_guc=3 i915.max_vfs=7
[ 0.036486] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-6.8.4-2-pve root=/dev/mapper/pve-root ro quiet intel_iommu=on i915.enable_guc=3 i915.max_vfs=7
[ 0.036515] DMAR: IOMMU enabled
[ 0.090320] DMAR-IR: IOAPIC id 2 under DRHD base 0xfed91000 IOMMU 1
[ 0.244292] pci 0000:00:02.0: DMAR: Skip IOMMU disabling for graphics
[ 0.270125] iommu: Default domain type: Translated
[ 0.270125] iommu: DMA domain TLB invalidation policy: lazy mode
[ 0.303735] DMAR: IOMMU feature fl1gp_support inconsistent
[ 0.303735] DMAR: IOMMU feature pgsel_inv inconsistent
[ 0.303736] DMAR: IOMMU feature nwfs inconsistent
[ 0.303736] DMAR: IOMMU feature dit inconsistent
[ 0.303737] DMAR: IOMMU feature sc_support inconsistent
[ 0.303737] DMAR: IOMMU feature dev_iotlb_support inconsistent
[ 0.304175] pci 0000:00:02.0: Adding to iommu group 0
[ 0.304544] pci 0000:00:00.0: Adding to iommu group 1
...
[ 0.304866] pci 0000:0b:00.0: Adding to iommu group 28
[ 4.659395] pci 0000:00:02.1: DMAR: Skip IOMMU disabling for graphics
...
[ 4.679192] pci 0000:00:02.7: DMAR: Skip IOMMU disabling for graphics
[ 4.679221] pci 0000:00:02.7: Adding to iommu group 35

Verify i915-sriov-dkms module has been loaded:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
root@pve:~# dmesg | grep i915
[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-6.8.12-10-pve root=/dev/mapper/pve-root ro quiet intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=7
[ 0.054188] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-6.8.12-10-pve root=/dev/mapper/pve-root ro quiet intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=7
use xe.force_probe='46d0' and i915.force_probe='!46d0'
[ 3.593393] i915: module verification failed: signature and/or required key missing - tainting kernel
[ 4.270741] i915: You are using the i915-sriov-dkms module, a ported version of the i915 module with SR-IOV support.
[ 4.270743] i915: Please file any bug report at https://github.com/strongtz/i915-sriov-dkms/issues/new.
[ 4.270745] i915: Module Homepage: https://github.com/strongtz/i915-sriov-dkms
[ 4.271143] i915 0000:00:02.0: [drm] Found ALDERLAKE_P/ADL-N (device ID 46d0) display version 13.00 stepping D0
[ 4.271176] i915 0000:00:02.0: Running in SR-IOV PF mode
[ 4.271727] i915 0000:00:02.0: [drm] VT-d active for gfx access
[ 4.364169] i915 0000:00:02.0: vgaarb: deactivate vga console
[ 4.364247] i915 0000:00:02.0: [drm] Using Transparent Hugepages
[ 4.364664] i915 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=io+mem:owns=io+mem
[ 4.366914] i915 0000:00:02.0: [drm] Finished loading DMC firmware i915/adlp_dmc.bin (v2.20)
[ 4.371743] i915 0000:00:02.0: [drm] GT0: GuC firmware i915/tgl_guc_70.bin version 70.36.0
[ 4.371750] i915 0000:00:02.0: [drm] GT0: HuC firmware i915/tgl_huc.bin version 7.9.3
[ 4.375760] i915 0000:00:02.0: [drm] GT0: HuC: authenticated for all workloads
[ 4.376242] i915 0000:00:02.0: [drm] GT0: GUC: submission enabled
[ 4.376244] i915 0000:00:02.0: [drm] GT0: GUC: SLPC enabled
[ 4.376617] i915 0000:00:02.0: [drm] GT0: GUC: RC enabled
[ 4.378631] mei_pxp 0000:00:16.0-fbf6fcf1-96cf-4e2e-a6a6-1bab8cbe36b1: bound 0000:00:02.0 (ops i915_pxp_tee_component_ops [i915])
[ 4.378826] i915 0000:00:02.0: [drm] Protected Xe Path (PXP) protected content support initialized
[ 4.378831] mei_hdcp 0000:00:16.0-b638ab7e-94e2-4ea2-a552-d1c54b627f04: bound 0000:00:02.0 (ops i915_hdcp_ops [i915])
[ 4.444295] [drm] Initialized i915 1.6.0 20230929 for 0000:00:02.0 on minor 1
[ 4.508802] snd_hda_intel 0000:00:1f.3: bound 0000:00:02.0 (ops i915_audio_component_bind_ops [i915])
[ 4.514543] fbcon: i915drmfb (fb0) is primary device
[ 4.514649] i915 [CRTC:80:pipe A] fastset requirement not met in dpll_hw_state
[ 4.514652] i915 expected:
[ 4.514653] i915 dpll_hw_state: cfgcr0: 0x1001d0, cfgcr1: 0x88, div0: 0x0, mg_refclkin_ctl: 0x0, hg_clktop2_coreclkctl1: 0x0, mg_clktop2_hsclkctl: 0x0, mg_pll_div0: 0x0, mg_pll_div2: 0x0, mg_pll_lf: 0x0, mg_pll_frac_lock: 0x0, mg_pll_ssc: 0x0, mg_pll_bias: 0x0, mg_pll_tdc_coldst_bias: 0x0
[ 4.514655] i915 found:
[ 4.514655] i915 dpll_hw_state: cfgcr0: 0x1001d0, cfgcr1: 0x488, div0: 0x0, mg_refclkin_ctl: 0x0, hg_clktop2_coreclkctl1: 0x0, mg_clktop2_hsclkctl: 0x0, mg_pll_div0: 0x0, mg_pll_div2: 0x0, mg_pll_lf: 0x0, mg_pll_frac_lock: 0x0, mg_pll_ssc: 0x0, mg_pll_bias: 0x0, mg_pll_tdc_coldst_bias: 0x0
[ 4.514658] i915 [CRTC:80:pipe A] fastset requirement not met in infoframes.enable (expected 0x00000010, found 0x00000071)
[ 4.683734] i915 0000:00:02.0: [drm] fb0: i915drmfb frame buffer device
[ 4.688842] i915 display info: display version: 13
[ 4.688854] i915 display info: display stepping: D0
[ 4.688859] i915 display info: cursor_needs_physical: no
[ 4.688862] i915 display info: has_cdclk_crawl: yes
[ 4.688866] i915 display info: has_cdclk_squash: no
[ 4.688869] i915 display info: has_ddi: yes
[ 4.688872] i915 display info: has_dp_mst: yes
[ 4.688874] i915 display info: has_dsb: yes
[ 4.688877] i915 display info: has_fpga_dbg: yes
[ 4.688880] i915 display info: has_gmch: no
[ 4.688883] i915 display info: has_hotplug: yes
[ 4.688885] i915 display info: has_hti: no
[ 4.688887] i915 display info: has_ipc: yes
[ 4.688887] i915 display info: has_overlay: no
[ 4.688888] i915 display info: has_psr: yes
[ 4.688889] i915 display info: has_psr_hw_tracking: no
[ 4.688889] i915 display info: overlay_needs_physical: no
[ 4.688890] i915 display info: supports_tv: no
[ 4.688891] i915 display info: has_hdcp: yes
[ 4.688891] i915 display info: has_dmc: yes
[ 4.688892] i915 display info: has_dsc: yes
[ 4.688892] i915 display info: rawclk rate: 19200 kHz
[ 4.688948] i915 0000:00:02.0: 7 VFs could be associated with this PF
[ 5.506941] i915 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=none:owns=io+mem
use xe.force_probe='46d0' and i915.force_probe='!46d0'
[ 5.507018] i915 0000:00:02.1: enabling device (0000 -> 0002)
[ 5.507040] i915 0000:00:02.1: [drm] Found ALDERLAKE_P/ADL-N (device ID 46d0) display version 13.00 stepping D0
[ 5.507068] i915 0000:00:02.1: Running in SR-IOV VF mode
[ 5.507652] i915 0000:00:02.1: [drm] GT0: GUC: interface version 0.1.17.0
[ 5.508623] i915 0000:00:02.1: [drm] VT-d active for gfx access
[ 5.508669] i915 0000:00:02.1: [drm] Using Transparent Hugepages
[ 5.508928] i915 0000:00:02.1: [drm] GT0: GUC: interface version 0.1.17.0
[ 5.509427] i915 0000:00:02.1: [drm] GT0: GUC: interface version 0.1.17.0
[ 5.510115] i915 0000:00:02.1: GuC firmware PRELOADED version 0.0 submission:SR-IOV VF
[ 5.510119] i915 0000:00:02.1: HuC firmware PRELOADED
[ 5.513190] i915 0000:00:02.1: [drm] Protected Xe Path (PXP) protected content support initialized
[ 5.513196] i915 0000:00:02.1: [drm] PMU not supported for this GPU.
[ 5.513354] [drm] Initialized i915 1.6.0 20230929 for 0000:00:02.1 on minor 0
[ 5.513653] i915 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=none,decodes=none:owns=io+mem
[ 5.513656] i915 0000:00:02.1: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=none:owns=none
use xe.force_probe='46d0' and i915.force_probe='!46d0'
...
[ 5.537903] i915 0000:00:02.7: enabling device (0000 -> 0002)
[ 5.537918] i915 0000:00:02.7: [drm] Found ALDERLAKE_P/ADL-N (device ID 46d0) display version 13.00 stepping D0
[ 5.537942] i915 0000:00:02.7: Running in SR-IOV VF mode
[ 5.538115] i915 0000:00:02.7: [drm] GT0: GUC: interface version 0.1.17.0
[ 5.538625] i915 0000:00:02.7: [drm] VT-d active for gfx access
[ 5.538648] i915 0000:00:02.7: [drm] Using Transparent Hugepages
[ 5.538763] i915 0000:00:02.7: [drm] GT0: GUC: interface version 0.1.17.0
[ 5.539078] i915 0000:00:02.7: [drm] GT0: GUC: interface version 0.1.17.0
[ 5.539419] i915 0000:00:02.7: GuC firmware PRELOADED version 0.0 submission:SR-IOV VF
[ 5.539422] i915 0000:00:02.7: HuC firmware PRELOADED
[ 5.541114] i915 0000:00:02.7: [drm] Protected Xe Path (PXP) protected content support initialized
[ 5.541119] i915 0000:00:02.7: [drm] PMU not supported for this GPU.
[ 5.541217] [drm] Initialized i915 1.6.0 20230929 for 0000:00:02.7 on minor 7
[ 5.541403] i915 0000:00:02.0: Enabled 7 VFs
  • Enable Virtual GPU for Windows 11 VM in Proxmox

Add a PCI device for Windows 11 VM, and choose one Virtual GPU:

Proxmox - Windows 11, PCI device

Enable Primary GPU and PCI Express in options:

Proxmox - Windows 11, Primary GPU and PCI Express

Choose none in Display and host in Processors options for Windows 11 VM:

Proxmox - Windows 11, Display

Proxmox - Windows 11, Display none

Start Windows 11 VM, login with Microsoft Remote Desktop https://apps.microsoft.com/detail/9wzdncrfj3ps and a Virtual GPU is available now. Run Task Manager and check CPU and GPU load:

Proxmox - Windows 11, Performance

  • Enable Virtual GPU for Ubuntu VM in Proxmox

Ubuntu version 22.04.4 for desktop.

Add a PCI device for Ubuntu VM, and choose one Virtual GPU; Enable Primary GPU and PCI Express in options; Choose none in Display and host in Processors options:

Proxmox - Ubuntu

Setup remote desktop connection to Ubuntu:

1
2
3
4
5
root@nucleus:~# apt install ubuntu-desktop

root@nucleus:~# apt install xrdp

root@nucleus:~# systemctl enable xrdp

Proxmox - Remote Desktop

  • Fix Remote Desktop audio over HDMI issue with the script, enable the sound redirection:
1
terrence@nucleus:~$ ./xrdp-installer-1.5.1.sh -s

then reboot VM.

Proxmox - Ubuntu Remote Desktop

Now Audio device becomes xrdp input / output.

  • Windows Server 2022

Windows Server 2022 is similar to Windows 11 setup in Proxmox. A few issues like GPU:

Proxmox - Windows Server 2022, GPU

just disable GPU then enable it, it will work correctly.

And no sound after installation, but can enable Windows Audio Service and choose Remote Audio:

Proxmox - Windows Server 2022, Sound

then audio over HDMI to remote desktop can work.

In addition, can setup User Auto Logon after Windows Server 2022 startup. And check Windows license by running:

1
PS C:\Users\Administrator> slmgr -dlv

Now can remote desktop access Ubuntu, Windows 11 and Windows Server 2022 VMs both run in Proxmox:

Proxmox - Ubuntu and Windows

References

The solution making old Intel 10Gbps network adapter work in Windows 11

Buy some old Intel 10Gbps network adapter, X520, X540 … from AliExpress https://aliexpress.com/, and install old Intel network adapter driver for Windows 10 and make it working in Windows 11. The example is install version 25.0 Intel network adapter driver, https://www.intel.com/content/www/us/en/download/18293/29648/intel-network-adapter-driver-for-windows-10.html, to get it to work in Windows 11:

How to enable SMB Multichannel in Windows 11

Network adapter requires to support RSS (Receive Side Scaling).

RSS (Receive Side Scaling)

  • Open PowerShell as administrator in Windows 11, run and enable SMB Multichannel (should be enabled by default):
1
2
3
4
5
6
PS C:\> Set-SmbClientConfiguration -EnableMultiChannel $true

Confirm
Are you sure you want to perform this action?
Performing operation 'Modify' on Target 'SMB Client Configuration'.
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):

Check network interfaces which show “RSS capable = True“:

1
2
3
4
5
6
7
8
PS C:\> Get-SmbClientNetworkInterface

Interface Index RSS Capable RDMA Capable Speed IpAddresses Friendly Name
--------------- ----------- ------------ ----- ----------- -------------
17 True False 20 Gbps {} X710-1-WFP Native MAC Layer LightWeight Filter-0000
8 False False 10 Gbps {} X710-1
13 False False 10 Gbps {} X710-2
26 True False 20 Gbps {fe80::923a:90de:dedd:ef44, 192.168.0.98} NIC-Team
  • Verify there are any active SMB connections:
1
2
3
4
5
PS C:\> Get-SmbConnection

ServerName ShareName UserName Credential Dialect NumOpens
---------- --------- -------- ---------- ------- --------
Synology NAS Drive RIPTIDE\terrence MicrosoftAccount\terrence.miao@mail.net 3.1.1 2
  • Copy a large file to a SMB device, e.g., Synology NAS which also has SMB Multichannel enabled, then verify the SMB Multichannel is working:
1
2
3
4
5
6
7
PS C:\> Get-SmbMultichannelConnection -IncludeNotSelected

Server Name Selected Client IP Server IP Client Interface Index Server Interface Index Client RSS Capable Client RDMA Capable
----------- -------- --------- --------- ---------------------- ---------------------- ------------------ -------------------
Synology True 192.168.0.98 192.168.0.112 26 5 False False
Synology False 192.168.0.98 192.168.0.34 26 4 False False
Synology False 192.168.0.98 192.168.196.140 26 7 False False

192.168.0.98 is Windows 11 network address, after Network Teaming; 192.168.0.112 and 192.168.0.34 are Synology NAS network addresses.

With and without multichannel

References

How to upgrade Synology NAS network from 1Gbps to 2.5Gbps

Synology NAS DS920+ with two 1Gbps ethernet adapters. There is an affordable and easy upgrading its gigabytes network path to 2.5Gbps.

Login Synology NAS Admin UI and run Control Panel -> Network -> Network Interface

Installation before

  • Get a USB 3.0 Ethernet Adapter 2.5Gbps with Realtek RTL8156 / RTL8156B / RTL8156BG chipset, e.g., UGREEN 2.5Gbps USB-C Ethernet Adapter:

UGREEN 2.5Gbps USB-C Ethernet Adapter

  • Find out the architecture name of CPU in NAS. For example, Synology DS920+ is equipped with Intel Celeron J4125 CPU. The architecture name of this processor is Geminilake.

  • Go to driver releases site https://github.com/bb-qq/r8152/releases and download the latest version e.g. r8152-geminilake-2.17.1-1_7.2.spk, Synology DSM 7.2 and above, use packages with the suffix _7.2.

  • Login Synology Admin UI, then go to Package Center -> Manual Install and choose a driver package downloaded from above step.

Package installation

Installation warning

Installation confirmation

  • The installation will fail at the very first time.

Installation failed

  • Then ssh into the NAS, and run the following command:
1
$ sudo install -m 4755 -o root -D /var/packages/r8152/target/r8152/spk_su /opt/sbin/spk_su

and also enable multiple identical USB devices, which SAME products have the SAME serial number:

1
$ sudo bash /var/packages/r8152/scripts/install-udev-rules

Installation fix

1
2
3
4
$ sudo bash /var/packages/r8152/scripts/install-udev-rules
Updating Hardware Database Index...
UDEV rules have been installed to /usr/lib/udev/rules.d
lrwxrwxrwx 1 root root 50 May 24 17:13 /usr/lib/udev/rules.d/51-usb-r8152-net.rules -> /var/packages/r8152/scripts/51-usb-r8152-net.rules

and continue / retry the installation .

  • Reboot NAS.

  • Login Synology Admin UI, Package Center -> Installed -> RTL8152/RTL8153 driver and check new installed Realtek network adapter driver is running:

Running

  • Control Panel -> Network -> Network Interface and check the new network interface LAN 3 and Lan 4 have been turned on, with MTU / jumbo frame enabled 9000:

New network interface

Bind the USB network adapter and run iperf3 network performance test:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ iperf3 -c 192.168.0.244 -B 192.168.0.229
Connecting to host 192.168.0.244, port 5201
[ 5] local 192.168.0.229 port 46171 connected to 192.168.0.244 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 281 MBytes 2.36 Gbits/sec 0 450 KBytes
[ 5] 1.00-2.00 sec 281 MBytes 2.35 Gbits/sec 0 450 KBytes
[ 5] 2.00-3.00 sec 280 MBytes 2.35 Gbits/sec 0 450 KBytes
[ 5] 3.00-4.00 sec 281 MBytes 2.35 Gbits/sec 0 450 KBytes
[ 5] 4.00-5.00 sec 281 MBytes 2.35 Gbits/sec 0 450 KBytes
[ 5] 5.00-6.00 sec 281 MBytes 2.35 Gbits/sec 0 450 KBytes
[ 5] 6.00-7.00 sec 281 MBytes 2.35 Gbits/sec 0 450 KBytes
[ 5] 7.00-8.00 sec 280 MBytes 2.35 Gbits/sec 0 450 KBytes
[ 5] 8.00-9.00 sec 281 MBytes 2.36 Gbits/sec 0 450 KBytes
[ 5] 9.00-10.00 sec 281 MBytes 2.36 Gbits/sec 0 670 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 2.74 GBytes 2.35 Gbits/sec 0 sender
[ 5] 0.00-10.05 sec 2.74 GBytes 2.34 Gbits/sec receiver

iperf Done.

References

How to team network (link aggregation) in Windows 11

Intel Ethernet Converged Network Adapter X710, with two 10Gbps ports. This allows to team the two ports together for link aggregation.

  • Install Optional Features Server Manager in Windows 11

Server Manager

  • Open and run Windows Powershell as administrator, then run:
1
PS C:\> New-NetSwitchTeam -Name "NIC-Team" -TeamMembers "X710-1","X710-2"

Network Connections

A new network interface created, with combined speed 20Gbps.

Network Status

Network Details

To remove network team, run:

1
PS C:\> Remove-NetSwitchTeam -Name "NIC-Team"

Step by step root OnePlus 5T

OnePlus 5T, first announced in Nov 2017. 7 years later, has been upgraded to Android 10.0.1, still robust and fast.

NOTE: Before you take on this brave journey, make sure backup all important files on the phone at first!

About phone

  • In Settings -> System -> Developer options, enable Advanced reboot, OEM unlocking, USB Debugging

Developer options

1
2
3
4
5
$ adb devices
List of devices attached
9b26c76 device

$ adb reboot bootloader
  • Wait for phone to reboot till phone in the Bootloader mode, then run:
1
$ fastboot flashing unlock
  • ON the phone will ask to confirm “UNLOCK THE BOOTLOADER”. After UNLOCK, your phone WILL BE RESET, like a factory hard reset. ALL APPS AND DATA ARE GONE. Android system will be reinstalled.

  • Go to OnePlus Smartphone Software Update site and download the latest version of OnePlus 5T update on Windows, https://oneplus.net/in/support/softwareupdate

  • Unzip OnePlus 5T update on Widnows

  • On the phone Settings, search for USB Preferences, select USE USB FOR File transfer

USB Preferences

  • On Windows, in File Explorer, copy OnePlus5TOxygen_43_OTA_069_all_2010292144_76910d123e3940e5/boot.img file to ONEPLUS A5010 -> Internal shared storage -> Download directory on the phone

  • On the phone, download and install latest version Magisk, https://github.com/topjohnwu/Magisk

  • Run Magisk, select Magisk Install, https://topjohnwu.github.io/Magisk/install.html

  • Select and patch boot.img file under /Download directory

Magisk

Magisk select and patch

Magisk patch boot.img

  • A patched file magisk_patched-27000_nplRf successfully generated. On Windows, in File Explorer, copy it to local directory

  • On Windows, run:

1
$ fastboot flash boot magisk_patched-27000_nplRf.img

NOTE: Always patch boot image on the SAME device where you run Magisk.

Now OnePlus 5T has been officially ROOTED!

NOTE: NO need to install TWRP (Team Win Recovery Project), https://twrp.me, a customised recovery application for Android devices on OnePlus 5T.

OpenSSH Server for Windows

Want to run OpenSSH Server on Windows e.g. Windows 10. From Windows 10, it natively supports OpenSSH.

NOTE: The beta and nightly build of OpenSSH Server for Windows have a lot of runtime issues.

Check OpenSSH installation:

1
2
3
4
5
6
7
PS C:\ProgramData\ssh> Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

Name : OpenSSH.Client~~~~0.0.1.0
State : Installed

Name : OpenSSH.Server~~~~0.0.1.0
State : NotPresent

Install the missing OpenSSH Server:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
PS C:\ProgramData\ssh> Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
>>

Path :
Online : True
RestartNeeded : False


PS C:\ProgramData\ssh> Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

Name : OpenSSH.Client~~~~0.0.1.0
State : Installed

Name : OpenSSH.Server~~~~0.0.1.0
State : Installed

Check OpenSSH for Windows version, check Windows Operating System version:

1
2
3
4
5
PS C:\ProgramData\ssh> ((Get-Item (Get-Command sshd).Source).VersionInfo.FileVersion)
8.1.0.1

PS C:\ProgramData\ssh> ((Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion\" -Name ProductName).ProductName)
Windows 10 Enterprise

Check Windows Domain information:

1
2
3
4
5
6
7
8
9
10
11
12
PS C:\ProgramData\ssh> dsregcmd /status

+----------------------------------------------------------------------+
| Device State |
+----------------------------------------------------------------------+

AzureAdJoined : YES
EnterpriseJoined : NO
DomainJoined : YES
DomainName : CORP
Device Name : WINDOWS.corp.paradise.local
...

Check OpenSSH Server for Windows run as a service:

OpenSSH SSH Server service

Make sure OpenSSH SSH Server firewall inbound rule allows ALL profiles:

OpenSSH SSH Server firewall inbound rule

The default C:\ProgramData\ssh\sshd_config file doesn’t work for Windows Domain users authentication, and does’t support .ssh\authorized_keys public key authentication. Error lookup_principal_name: User principal name lokup failed for user ‘corp\darling’ in OpenSSH Server C:\ProgramData\ssh\logs\ssd log file. A work around solution is to comment out lines:

1
2
#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

A complete sshd_config example file:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options override the
# default value.

#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

#HostKey __PROGRAMDATA__/ssh/ssh_host_rsa_key
#HostKey __PROGRAMDATA__/ssh/ssh_host_dsa_key
#HostKey __PROGRAMDATA__/ssh/ssh_host_ecdsa_key
#HostKey __PROGRAMDATA__/ssh/ssh_host_ed25519_key

# Ciphers and keying
#RekeyLimit default none

# Logging
SyslogFacility LOCAL0
LogLevel DEBUG3

# Authentication:

#LoginGraceTime 2m
#PermitRootLogin prohibit-password
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

#PubkeyAuthentication yes

# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile .ssh/authorized_keys

#AuthorizedPrincipalsFile none

# For this to work you will also need host keys in %programData%/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no

# GSSAPI options
#GSSAPIAuthentication no

#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
#PermitTTY yes
#PrintMotd yes
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
#PermitUserEnvironment no
#ClientAliveInterval 0
#ClientAliveCountMax 3
#UseDNS no
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none

# no default banner path
#Banner none

# override default of no subsystems
Subsystem sftp sftp-server.exe

# Example of overriding settings on a per-user basis
#Match User anoncvs
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server

#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

Now run ssh client and log on SSH Server:

1
2
3
4
5
$ sshpass -f ~/.ssh/windows.passwd ssh -l darling windows.local
Microsoft Windows [Version 10.0.19044.2965]
(c) Microsoft Corporation. All rights reserved.

corp\darling@WINDOWS C:\Users\darling>

References

Setup Socks/Socks5 proxy and git repo via proxy

Host windows.local has VPN connection which is granted with git repository.

  • Setup Socks/Socks5 proxy
1
2
3
$ ssh-copy-id -i id_rsa.pub darling@windows.local

$ ssh -D 3128 -q -C -N -f darling@windows.local
  • -q: quiet mode, don’t output anything locally
  • -C: compress data in the tunnel, save bandwidth
  • -N: do not execute remote commands, useful for just forwarding ports
  • -f: keep it running in the background

If PasswordAuthentication is enforced, and pubilc key authentication in SSH Server is not supported, try:

1
$ sshpass -f ~/.ssh/windows.passwd ssh -D 3128 -q -C -N -f darling@windows.local
  • Configure git with Sock/Socks5 proxy
1
2
3
4
5
6
7
8
9
$ git config http.proxy 'socks5://localhost:3128'

$ cat .git/config
[user]
name = Terrence Miao
email = terrence.miao@paradise.net
signingkey = EBCEB936
[http]
proxy = socks5://localhost:3128

Then can access git repository via proxy both on command line and in UI client.

Setup ssh ProxyCommand/proxyJump on multiple jump hosts

NOTE: Some SSH Server doesn’t allow public key authentication. Then sshpass is a friend here for you.

Install sshpass in MacOS:

1
$ brew install esolitos/ipa/sshpass

Test sshpass:

1
$ ssh -oProxyCommand="sshpass -f ~/.ssh/windows.passwd ssh -W %h:%p jumphost" -l darling jumphost-npe.paradise.net

Setup .ssh/config file:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
## Keeping SSH Sessions Alive
Host *
ServerAliveInterval 15

Host jumphost.mac
Hostname mac.local
IdentityFile ~/.ssh/id_rsa
User darling

Host jumphost.windows
Hostname windows.local
IdentityFile ~/.ssh/id_rsa
User darling

Host jumphost-npe
Hostname jumphost-npe.paradise.net
User darling
IdentityFile ~/.ssh/id_rsa
ProxyCommand sshpass -f ~/.ssh/windows.passwd ssh -W %h:%p jumphost.windows
IdentitiesOnly yes
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
ServerAliveInterval 60
ServerAliveCountMax 5

## DEVELOPMENT hosts in AWS
Host ip-10-212-*.ap-southeast-2.compute.internal
ProxyCommand ssh -W %h:%p jumphost-npe
IdentityFile ~/.ssh/dev-stack.pem

## PTEST hosts in AWS
Host ip-10-213-*.ap-southeast-2.compute.internal
ProxyCommand ssh -W %h:%p jumphost-npe
IdentityFile ~/.ssh/test-stack.pem

## STEST hosts in AWS
Host ip-10-214-*.ap-southeast-2.compute.internal
ProxyCommand ssh -W %h:%p jumphost-npe
IdentityFile ~/.ssh/test-stack.pem

Host jumphost-prod
HostName jumphost-prod.paradise.net
User darling
IdentityFile ~/.ssh/id_rsa.prod
ProxyCommand sshpass -f ~/.ssh/windows.passwd ssh -W %h:%p jumphost.windows
IdentitiesOnly yes
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
ServerAliveInterval 60
ServerAliveCountMax 5

## PROD hosts in AWS
Host ip-10-208-*.ap-southeast-2.compute.internal
ProxyCommand ssh -W %h:%p jumphost-prod
IdentityFile ~/.ssh/prod-ddc-stack.pem

## SSH over Session Manager
host i-* mi-*
ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"