docs: review GPU and Coral guides in all seven translations

This commit is contained in:
Jonatan
2026-10-17 15:08:53 +02:00
parent ce1a3de719
commit 5210fc415a
54 changed files with 6780 additions and 905 deletions
@@ -149,96 +149,6 @@ export default async function GpuVmPassthroughPage({
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("howRuns.heading")}</h2>
<p className="mb-4 text-gray-800 leading-relaxed">{t("howRuns.body")}</p>
<pre className="bg-gray-100 text-gray-800 p-4 rounded-md overflow-x-auto text-sm my-4 border border-gray-200 leading-snug">
{`┌─────────────────────────────────────────────┐
│ PHASE 1 — Gather info, validate, confirm │
│ (nothing touched yet) │
└──────────────────┬──────────────────────────┘
▼
┌────────────┴────────────┐
▼ ▼
lspci detects IOMMU enabled?
GPUs (Intel/AMD/ ├─ No → offer to add
NVIDIA) │ intel_iommu=on /
│ │ amd_iommu=on
▼ └─ Yes → continue
User selects GPU
│
▼
Pre-flight checks
├─ Not in SR-IOV
├─ Not D3cold (AMD)
├─ Has FLR or equivalent reset
├─ Not on the block-list (Intel Arc, Apollo Lake)
├─ Warn if single-GPU host
└─ Resolve IOMMU group
│
▼
User selects VM
│
▼
VM is q35? ── No → abort
│
Yes
▼
GPU already assigned elsewhere?
│
├─ To LXC → menu: keep + disable onboot
│ OR remove GPU lines + keep onboot
├─ To other VM (running) → abort
├─ To other VM (stopped) → menu: keep + disable onboot
│ OR remove GPU lines + keep onboot
│ (fast-path: already vfio-pci → no
│ host reconfig, no reboot needed)
└─ Free → continue
│
▼
Audio companion
├─ Has .1 sibling? (dGPU: NVIDIA/AMD HDMI)
│ → auto-include (never used by host)
└─ No .1 sibling? (Intel iGPU, split audio)
→ checklist of host audio controllers,
default = none (user opts in)
│
▼
Show confirmation summary
(GPU + IOMMU siblings + audio + target VM)
│
┌─────── Cancel OR Confirm ────┐
▼ ▼
exit, nothing ┌─────────────┴──────────────┐
was changed │ PHASE 2 — Apply changes │
└─────────────┬──────────────┘
▼
Host:
├─ /etc/modules (vfio_*)
├─ /etc/modprobe.d/vfio.conf (ids=... disable_vga=1)
├─ /etc/modprobe.d/blacklist.conf (vendor drivers only)
├─ kernel cmdline (IOMMU if missing)
├─ NVIDIA: per-BDF udev rule at
│ 10-proxmenux-vfio-bind.rules
│ + BDF state at vfio-bind.bdfs
│ (blacklist nvidia only when
│ every NVIDIA GPU is in VFIO)
├─ AMD: dump ROM → vbios_<vendor>_<device>.bin
└─ update-initramfs -u -k all
+ proxmox-boot-tool refresh
VM config (qm set <vmid>):
├─ hostpci0 = GPU (x-vga=1 unless Intel iGPU)
├─ hostpci1..n = IOMMU group siblings
├─ hostpci<last> = audio function(s)
├─ vga = std
└─ NVIDIA: cpu=host,hidden=1
args=... hv_vendor_id=NV43FIX
│
▼
┌───────────────┴───────────────┐
│ PHASE 3 — Summary + reboot │
└───────────────────────────────┘
Show what changed. If host config
touched → prompt reboot.`}
</pre>
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("walkthrough.heading")}</h2>
@@ -394,18 +304,17 @@ args: -cpu 'host,+kvm_pv_unhalt,+kvm_pv_eoi,hv_vendor_id=NV43FIX,kvm=off'`}
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("verification.heading")}</h2>
<CopyableCode
code={`# After reboot, confirm the GPU is bound to vfio-pci (not to the vendor driver)
lspci -nnk -d <vendor:device>
# Expect: "Kernel driver in use: vfio-pci"
code={`# Replace PCI_ADDRESS and VMID with the actual values.
# Verify the exact PCI address, especially with identical GPU models.
lspci -nnk -s PCI_ADDRESS
# Expected driver: vfio-pci
# Start the VM and watch for successful binding
qm start <vmid>
journalctl -u qemu-server@<vmid>.service -f
# Inside the guest, drivers install normally and the GPU works as if it were physical.
# NVIDIA: verify with nvidia-smi inside the VM.
# AMD: verify with Windows Device Manager / DXDiag.
# Intel: verify display output / intel_gpu_top inside the VM.`}
qm config VMID
qm start VMID
qm status VMID
# Inspect the start task in Proxmox Tasks if startup fails.
# Inside the guest, install a compatible GPU driver and test the application.
# NVIDIA: nvidia-smi; AMD/Intel: the guest driver and application diagnostics.`}
className="my-4"
/>
@@ -428,17 +337,14 @@ journalctl -u qemu-server@<vmid>.service -f
</Callout>
<CopyableCode
code={`# Rescue — remove passthrough
# Remove hostpciN lines from the VM config
sed -i '/^hostpci[0-9]*:/d' /etc/pve/qemu-server/<vmid>.conf
# Unblacklist the host driver
rm -f /etc/modprobe.d/blacklist.conf /etc/modprobe.d/vfio.conf
# (if NVIDIA was involved)
mv /etc/udev/rules.d/70-nvidia.rules.proxmenux-disabled /etc/udev/rules.d/70-nvidia.rules 2>/dev/null
update-initramfs -u -k all
reboot`}
code={`# Inspect from a recovered Proxmox host; replace the placeholders.
qm config VMID
lspci -nnk -s PCI_ADDRESS
cat /etc/proxmenux/vfio-bind.bdfs 2>/dev/null
# Review the affected PCI assignments and driver-binding configuration.
# Do not remove entire shared blacklist.conf or vfio.conf files.
# Use ProxMenux Switch GPU Mode to return a GPU to the host driver.
# Review its affected guests and follow the indicated reboot procedure.`}
className="my-4"
/>
@@ -449,26 +355,13 @@ reboot`}
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("revert.heading")}</h2>
<p className="mb-4 text-gray-800 leading-relaxed">{t("revert.intro")}</p>
<CopyableCode
code={`# Remove hostpci lines from the VM
qm set <vmid> --delete hostpci0
# (repeat for hostpci1, hostpci2, ... if multiple were added)
# ─── OPTIONAL — not required ──────────────────────────────────────
# The steps above already free the VM from the GPU. The lines below
# are only needed if you also want the host to use the GPU again
# (e.g. for LXC sharing or host-side transcoding). Skip this block
# if you simply want to stop passing the GPU to the VM.
# ──────────────────────────────────────────────────────────────────
# Release the GPU back to the host driver:
rm -f /etc/modprobe.d/vfio.conf
rm -f /etc/modprobe.d/blacklist.conf # careful — this file may have other blacklists
# NVIDIA only — re-enable the udev rule + drop the all-NVIDIA-in-VFIO blacklist (if present)
mv /etc/udev/rules.d/70-nvidia.rules.proxmenux-disabled /etc/udev/rules.d/70-nvidia.rules 2>/dev/null
rm -f /etc/modprobe.d/proxmenux-nvidia-vfio-blacklist.conf
update-initramfs -u -k all
reboot`}
code={`# Replace VMID. Inspect the actual assignment index first.
qm config VMID
# With the VM stopped, remove ONLY the intended entry (hostpci0 is an example).
qm set VMID --delete hostpci0
qm config VMID
# Repeat only for the associated PCI entries you intend to remove.
# This does not change the host's VFIO/native-driver binding.`}
className="my-4"
/>
@@ -146,88 +146,6 @@ export default async function AddGpuToLxcPage({
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("howRuns.heading")}</h2>
<p className="mb-4 text-gray-800 leading-relaxed">{t("howRuns.body")}</p>
<pre className="bg-gray-100 text-gray-800 p-4 rounded-md overflow-x-auto text-sm my-4 border border-gray-200 leading-snug">
{`┌─────────────────────────────────────────────┐
│ PHASE 1 — Detect, select, validate │
│ (nothing touched yet) │
└──────────────────┬──────────────────────────┘
▼
lspci detects Intel / AMD / NVIDIA GPU(s)
(NVIDIA: also check nvidia module loaded +
nvidia-smi, capture host driver version)
│
▼
User picks LXC container from the list
│
▼
User selects which GPU(s) to add
(checklist; auto-selects if only one)
│
▼
Pre-flight checks
├─ Not in SR-IOV (VF / active PF) → block
├─ Bound to vfio-pci? → offer Switch Mode, exit
└─ Already configured in this CT? → filter out
(skip duplicates, warn if partial)
│
┌─────── Cancel OR Confirm ────┐
▼ ▼
Exit, nothing ┌──────────────────┴──────────────────┐
was changed │ PHASE 2 — Configure + install │
└──────────────────┬──────────────────┘
▼
Stop container (if running)
│
▼
Write LXC config (/etc/pve/lxc/<ctid>.conf):
├─ Intel / AMD iGPU:
│ dev<N>: /dev/dri/card* gid=video
│ dev<N>: /dev/dri/renderD* gid=render
├─ AMD with ROCm (if /dev/kfd):
│ dev<N>: /dev/kfd gid=render
└─ NVIDIA:
dev<N>: /dev/nvidia0..N
dev<N>: /dev/nvidiactl · nvidia-uvm*
dev<N>: /dev/nvidia-modeset
dev<N>: /dev/nvidia-caps/* (if exists)
│
▼
Install GPU guard hookscript
(same one used by VM passthrough, if
available — prevents conflicts on start/stop)
│
▼
Start container + wait for readiness
(pct exec — true, up to ~30 s)
│
▼
Install userspace drivers inside CT
(distro auto-detected)
├─ Intel → apk/pacman/apt
│ (intel-media-driver,
│ libva-utils, opencl-icd)
├─ AMD → Mesa VA drivers
│ (mesa-va-drivers, libva)
└─ NVIDIA →
├─ Alpine: apk add nvidia-utils
├─ Arch: pacman -S nvidia-utils
└─ Debian/Ubuntu/others:
host .run is pre-extracted, packed,
pct push'd into the container, run
with --no-kernel-modules --no-dkms
│
▼
Align GIDs in /etc/group inside CT
(video=44, render=104 to match host)
│
▼
Restore container state
(stop if it was stopped before)
│
▼
Show summary + nvidia-smi output
(if NVIDIA) + log path`}
</pre>
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("walkthrough.heading")}</h2>
@@ -166,20 +166,6 @@ export default async function InstallCoralTPUHostPage({
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("howRuns.heading")}</h2>
<p className="mb-4 text-gray-800 leading-relaxed">{t("howRuns.body")}</p>
<pre className="bg-gray-100 text-gray-800 p-4 rounded-md overflow-x-auto text-sm my-4 border border-gray-200 leading-snug">
{`Detect Coral hardware
│
├─ PCIe / M.2 detected ──► build gasket + apex with DKMS
│ └─ reboot recommended
│
├─ USB detected ─────────► install libedgetpu runtime
│ └─ no reboot required
│
└─ no PCIe / M.2 detected
├─ no legacy gasket-dkms state ─► no PCIe changes
└─ legacy gasket-dkms state ────► offer optional cleanup
└─ USB runtime untouched`}
</pre>
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("walkthrough.heading")}</h2>
@@ -362,6 +348,7 @@ rm -rf gasket-driver
git clone --depth=1 https://github.com/feranick/gasket-driver.git
# Stage under /usr/src for DKMS
mkdir -p /usr/src/gasket-1.0
cp -a /tmp/gasket-driver/src/. /usr/src/gasket-1.0/
# Tell DKMS what it is
@@ -138,102 +138,7 @@ export default async function NvidiaHostPage({
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("howRuns.heading")}</h2>
<p className="mb-4 text-gray-800 leading-relaxed">{t("howRuns.body")}</p>
<pre className="bg-gray-100 text-gray-800 p-4 rounded-md overflow-x-auto text-sm my-4 border border-gray-200 leading-snug">
{`┌─────────────────────────────────────────────┐
│ PHASE 1 — Detect, validate, pick version │
│ (nothing touched yet) │
└──────────────────┬──────────────────────────┘
▼
┌────────────┴────────────┐
▼ ▼
lspci detects GPU bound to
NVIDIA GPU(s) vfio-pci? ──→ Abort
│ │ (remove VM
│ No passthrough first)
▼
nvidia-smi: driver already installed?
│
├─ No → continue (fresh install)
└─ Yes → ask: Reinstall/Update OR Remove
│
├─ Remove → complete uninstall
│ + reboot prompt
└─ Reinstall → continue
│
▼
Show install overview
(GPU list + current driver +
LXC containers with NVIDIA passthrough)
│
▼
Kernel-compat filter:
├─ Kernel 6.17+ → driver 580.82.07+
├─ Kernel 6.8–16 → driver 550+
├─ Kernel 6.2–7 → driver 535+
└─ Kernel 5.15+ → driver 470+
│
▼
User picks version (or "Latest")
│
┌─────── Cancel OR Confirm ────┐
▼ ▼
Exit, nothing ┌─────────────┴──────────────┐
was changed │ PHASE 2 — Install driver │
└─────────────┬──────────────┘
▼
Prepare host:
├─ Install pve-headers-$(uname -r)
├─ Install build-essential + dkms
├─ Blacklist nouveau + unload
│ └ /etc/modprobe.d/nouveau-blacklist.conf
├─ Write modules-load config
│ └ /etc/modules-load.d/nvidia-vfio.conf
├─ Stop/disable nvidia services
└─ Unload residual nvidia modules
If different version already present:
└─ clean uninstall first (apt purge,
remove DKMS entries)
│
▼
Download NVIDIA .run installer
to /opt/nvidia (validate size +
executable signature)
│
▼
Run installer with --dkms
--disable-nouveau --no-nouveau-check
│
▼
Install udev rules
└─ /etc/udev/rules.d/70-nvidia.rules
+ clone NVIDIA/nvidia-persistenced
│
▼
update-initramfs -u -k all
│
▼
nvidia-smi — verify driver loaded
│
┌───────────────┴───────────────┐
│ PHASE 3 — Optional extras │
└───────────────┬───────────────┘
▼
LXC containers with NVIDIA?
├─ Yes → offer driver propagation
│ (Alpine: apk · Arch: pacman ·
│ Debian/others: extract .run)
└─ No → skip
│
▼
keylase/nvidia-patch (NVENC limit)?
├─ Yes → clone + apply
└─ No → skip
│
▼
Reboot prompt — required to finalize
nouveau blacklist + load new module`}
</pre>
<Steps>
<Steps.Step title={t("walkthrough.detect.title")}>
@@ -282,7 +187,7 @@ export default async function NvidiaHostPage({
<p className="mb-3 text-gray-800">{t.rich("walkthrough.download.body", { code })}</p>
<CopyableCode
code={`# What ProxMenux runs under the hood (you don't have to type this):
sh NVIDIA-Linux-x86_64-<version>.run \\
sh NVIDIA-Linux-x86_64-VERSION.run \\
--no-questions \\
--ui=none \\
--disable-nouveau \\
@@ -336,29 +336,12 @@ export default async function SwitchGpuModePage({
{t.rich("manual.intro", { strong, code })}
</p>
<CopyableCode
code={`# Drop the vendor:device from vfio.conf — keep other GPUs intact
sed -i 's/10de:2204,//; s/,10de:2204//; s/=10de:2204 /=/' /etc/modprobe.d/vfio.conf
code={`# Inspect this example GPU; replace the ID with your card
lspci -nnk -d 10de:2204
# Remove the NVIDIA hard-blacklist and nouveau blacklist
sed -i '/^blacklist nouveau$/d; /^blacklist nvidia$/d; /^blacklist nvidia_drm$/d; /^blacklist nvidia_modeset$/d; /^blacklist nvidia_uvm$/d; /^blacklist nvidiafb$/d' /etc/modprobe.d/blacklist.conf
rm -f /etc/modprobe.d/nvidia-blacklist.conf
# Re-enable NVIDIA udev rule + modules-load config (if disabled by VM-mode switch)
[ -f /etc/udev/rules.d/70-nvidia.rules.proxmenux-disabled-vfio ] && \\
mv /etc/udev/rules.d/70-nvidia.rules.proxmenux-disabled-vfio \\
/etc/udev/rules.d/70-nvidia.rules
[ -f /etc/modules-load.d/nvidia-vfio.conf.proxmenux-disabled-vfio ] && \\
mv /etc/modules-load.d/nvidia-vfio.conf.proxmenux-disabled-vfio \\
/etc/modules-load.d/nvidia-vfio.conf
# Clean up the VM config — precise BDF regex, no substring collisions
# (replace 0000:01:00 with your GPU's slot)
sed -E -i '/^hostpci[0-9]+:[[:space:]]*(0000:)?01:00\\.[0-7]([,[:space:]]|$)/d' \\
/etc/pve/qemu-server/<vmid>.conf
# Rebuild initramfs and reboot
update-initramfs -u -k all
reboot`}
# Inspect the persistent per-BDF NVIDIA policy
cat /etc/proxmenux/vfio-bind.bdfs
cat /etc/udev/rules.d/10-proxmenux-vfio-bind.rules`}
className="my-4"
/>
@@ -366,28 +349,12 @@ reboot`}
{t.rich("manual.lxcToVm", { strong })}
</p>
<CopyableCode
code={`# Add the vendor:device to vfio.conf (create the line if missing)
grep -q '^options vfio-pci ids=' /etc/modprobe.d/vfio.conf && \\
sed -i '/^options vfio-pci ids=/ s/$/,10de:2204/' /etc/modprobe.d/vfio.conf || \\
echo 'options vfio-pci ids=10de:2204 disable_vga=1' >> /etc/modprobe.d/vfio.conf
code={`# Replace this example PCI address with your selected GPU
lspci -nnk -s 0000:01:00.0
readlink /sys/bus/pci/devices/0000:01:00.0/iommu_group
# Blacklist the native driver so vfio-pci can claim the card
cat >> /etc/modprobe.d/blacklist.conf <<'EOF'
blacklist nouveau
blacklist nvidia
blacklist nvidia_drm
blacklist nvidia_modeset
blacklist nvidia_uvm
blacklist nvidiafb
options nouveau modeset=0
EOF
# Make sure vfio-pci loads at boot
grep -q '^vfio-pci$' /etc/modules || echo 'vfio-pci' >> /etc/modules
# Rebuild initramfs and reboot
update-initramfs -u -k all
reboot`}
# List all group members and review them before assignment
find /sys/kernel/iommu_groups/ -type l | sort -V`}
className="my-4"
/>
@@ -397,17 +364,13 @@ reboot`}
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("verification.heading")}</h2>
<CopyableCode
code={`# Confirm the GPU is bound to the driver you expect
lspci -nnk -d <vendor:device>
# Expected (LXC mode): "Kernel driver in use: nvidia" (or amdgpu, i915)
# Expected (VM mode): "Kernel driver in use: vfio-pci"
code={`# Inspect the selected PCI address (replace this example)
lspci -nnk -s 0000:01:00.0
# LXC mode: the supported native driver should own the card
# VM mode: vfio-pci should own the card
# LXC mode — is the host tool happy?
nvidia-smi # if NVIDIA
intel_gpu_top # if Intel iGPU
# VM mode — ready to be claimed by a VM start
lsmod | grep vfio`}
# NVIDIA userspace/module consistency check
nvidia-smi`}
className="my-4"
/>
@@ -421,9 +384,10 @@ lsmod | grep vfio`}
{t.rich("troubleshoot.vmFailBody", { code, em })}
</Callout>
<CopyableCode
code={`# Delete every hostpci line for the GPU slot
sed -E -i '/^hostpci[0-9]+:[[:space:]]*(0000:)?<slot>\\.[0-7]([,[:space:]]|$)/d' \\
/etc/pve/qemu-server/<vmid>.conf`}
code={`# Inspect the VM configuration; replace VMID with the numeric ID
qm config VMID
# With the VM stopped, remove only the obsolete PCI assignment
# in the Proxmox Hardware panel, after identifying its hostpci entry`}
className="my-4"
/>