mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-11-01 10:22:08 +00:00
Merge pull request #482 from jcastro/docs/review-hardware
docs: review GPU and Coral guides in all seven translations
This commit is contained in:
@@ -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"
|
||||
/>
|
||||
|
||||
|
||||
@@ -0,0 +1,120 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Coral TPU zu LXC hinzufügen | ProxMenux-Dokumentation",
|
||||
"description": "Google Coral TPU per USB oder M.2 / PCIe in einem Proxmox-LXC nutzen. ProxMenux konfiguriert Geräte, Berechtigungen und Einhängepunkte, startet den Container und installiert die Edge-TPU-Laufzeit auf unterstützten Distributionen."
|
||||
},
|
||||
"header": {
|
||||
"title": "Coral TPU zu LXC hinzufügen",
|
||||
"description": "Coral USB Accelerator oder M.2 / Mini-PCIe in einem LXC nutzen. ProxMenux übernimmt Container-Konfiguration und Edge-TPU-Laufzeit. Diese Option betrifft nur die TPU; für Quick Sync, VA-API oder NVENC führen Sie zusätzlich GPU zu LXC hinzufügen aus.",
|
||||
"section": "Hardware: GPUs und Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Funktionsweise",
|
||||
"body": "Schreibt die Konfiguration für <strong>USB Accelerator</strong>, <strong>M.2 / PCIe Coral</strong> oder beide in <code>/etc/pve/lxc/<ctid>.conf</code>. Startet den Container und installiert Googles <code>libedgetpu</code>-Laufzeit. GPU-Zugriff wird getrennt über <lxcGpuLink>GPU zu LXC hinzufügen</lxcGpuLink> eingerichtet."
|
||||
},
|
||||
"whenUse": {
|
||||
"heading": "Anwendungsfälle",
|
||||
"body": "Für <frigateLink>Frigate</frigateLink> oder andere kompatible Linux-Erkennungssoftware im LXC. Coral übernimmt unterstützte ML-Inferenz statt der CPU. Die Leistung hängt von Modell und Hardware ab; Videodekodierung und weitere Aufgaben benötigen weiterhin Ressourcen."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Vorbereitung",
|
||||
"drivers": "<strong>Das Coral-Gerät auf dem Host vorbereiten</strong>. M.2 / PCIe benötigt den geladenen Host-Treiber, USB den Gerätezugriff mit passenden Berechtigungen. Siehe <hostLink>Coral TPU auf dem Host installieren</hostLink>. Das Skript installiert die Anwendungslaufzeit in Debian/Ubuntu-Containern; andere Distributionen müssen sie separat bereitstellen.",
|
||||
"driversCheck": "ls /dev/apex_* 2>/dev/null ; lsusb | grep -E '1a6e:089a|18d1:9302'",
|
||||
"container": "<strong>Vorhandener LXC-Container</strong>, vorzugsweise auf Basis von <strong>Debian / Ubuntu</strong>: Die Installation nutzt <code>apt-get</code>. <strong>Container anderer Distributionen</strong> können den <strong>reinen Passthrough-Modus</strong> nutzen, der die APT-Installation von <code>libedgetpu</code> überspringt. Geeignet, wenn die Anwendung die Laufzeit bereits mitbringt, etwa das Frigate-Docker-Image.",
|
||||
"downtime": "<strong>Kurze Ausfallzeit einplanen</strong>. Das Skript stoppt den Container für die Konfiguration und startet ihn zur Laufzeitinstallation. Für diese Änderungen ist kein Host-Neustart nötig."
|
||||
},
|
||||
"hostPrep": {
|
||||
"title": "Host muss zuerst vorbereitet werden",
|
||||
"body": "M.2 / PCIe benötigt <code>gasket</code>/<code>apex</code> auf dem Host und einen funktionierenden Geräteknoten. USB benötigt das angeschlossene Gerät und Berechtigungen; die App muss nicht auf dem Host laufen. <code>libedgetpu</code> muss am Ausführungsort der App vorhanden sein. Reihenfolge: <strong>Host vorbereiten → LXC-Gerätezugriff → App einrichten</strong>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Skript ausführen",
|
||||
"body": "Öffnen Sie in ProxMenux <strong>Hardware: GPUs und Coral-TPU → Coral TPU zu LXC hinzufügen</strong>.",
|
||||
"imageAlt": "Menüpunkt Coral TPU zu LXC hinzufügen im Hardware-Menü"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Ablauf des Skripts",
|
||||
"body": "Wählen Sie den Container. Das Skript richtet USB-Zugriff auch ohne angeschlossene USB-Coral ein und ergänzt M.2 / PCIe bei erkannter Hardware."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Schritt für Schritt",
|
||||
"pick": {
|
||||
"title": "LXC-Container auswählen",
|
||||
"body": "Die Auswahl zeigt geeignete Container aus <code>pct list</code>; OCI-Container werden ausgeblendet und über Apps im OCI-Manager verwaltet. Wählen Sie einen laufenden oder gestoppten Container. Das Skript stoppt ihn bei Bedarf, konfiguriert ihn und startet die Laufzeitinstallation."
|
||||
},
|
||||
"gpuHint": {
|
||||
"title": "Optionaler Hinweis zum GPU-Zugriff",
|
||||
"body": "Wird eine GPU erkannt, die für diesen Container nicht konfiguriert ist, empfiehlt ein Dialog <lxcGpuLink>GPU zu LXC hinzufügen</lxcGpuLink> für die Hardware-Videodekodierung, etwa Quick Sync, VA-API oder NVENC. Er fragt, ob nur mit Coral fortgefahren werden soll: Ja setzt die TPU-Einrichtung fort, Nein beendet den Ablauf, damit Sie zuerst die GPU konfigurieren können."
|
||||
},
|
||||
"usb": {
|
||||
"title": "USB-Zugriff im LXC konfigurieren",
|
||||
"body": "Erstellt auf dem Host eine udev-Regel für <code>/dev/coral</code> und bindet den <strong>gesamten</strong> Baum <code>/dev/bus/usb</code> in den Container ein. Diese Konfiguration wird auch ohne angeschlossene USB-Coral geschrieben und stellt mehr als nur dieses Gerät bereit.",
|
||||
"whyTitle": "Warum /dev/bus/usb statt /dev/coral?",
|
||||
"whyBody": "Der USB-Pfad, etwa <code>/dev/bus/usb/001/005</code>, ändert sich beim Umstecken. Ältere Versionen banden den Link <code>/dev/coral</code> ein und konnten dadurch einen veralteten Pfad behalten. Der gesamte USB-Baum macht den aktuellen Geräteknoten sichtbar. Die Anwendung muss es gegebenenfalls erneut öffnen."
|
||||
},
|
||||
"pcie": {
|
||||
"title": "M.2-/PCIe-Zugriff im LXC konfigurieren",
|
||||
"body1": "Bei erkannter M.2-/PCIe-Coral und vorhandenem <code>/dev/apex_0</code> nutzt das Skript die Proxmox-API <code>dev</code> für cgroup2-Berechtigungen in privilegierten und unprivilegierten LXC:",
|
||||
"body2": "Wenn nach <hostLink>Coral auf dem Host installieren</hostLink> kein <code>/dev/apex_0</code> vorhanden ist, schreibt das Skript einen Bind-Mount mit <code>create=file</code> und, nur wenn die Apex-Major-Nummer in <code>/proc/devices</code> aufgeführt ist, eine klassische cgroup2-Regel. Keines von beiden erzeugt ein funktionsfähiges Gerät:",
|
||||
"rebootTitle": "Starten Sie den Host zuerst neu, wenn Sie gerade Coral-Treiber installiert haben",
|
||||
"rebootBody": "Der Ersatz-Mount lädt den Host-Treiber <code>apex</code> nicht. Laden Sie ihn oder starten Sie nach der Installation neu und prüfen Sie das Gerät. Führen Sie das Skript danach erneut für den modernen Geräteeintrag aus und starten Sie den Container neu."
|
||||
},
|
||||
"drivers": {
|
||||
"title": "LXC starten und Coral-Laufzeit installieren",
|
||||
"body": "Startet den Container und wartet bis zu 15 Sekunden auf den Status running. Anschließend führt es den Installer über <code>pct exec</code> im Container aus. Dieser:",
|
||||
"items": [
|
||||
"Führt <code>apt-get update</code> aus.",
|
||||
"Installiert die Voraussetzungen für das Coral-Repository: <code>gnupg</code>, <code>curl</code>, <code>ca-certificates</code>.",
|
||||
"Importiert Googles Coral GPG-Schlüssel in <code>/etc/apt/keyrings/coral-edgetpu.gpg</code> (moderner Pfad, wie er vom Host-Installationsprogramm verwendet wird) und fügt das <code>coral-edgetpu-stable</code> APT-Repository mit <code>signed-by=</code> hinzu.",
|
||||
"Installiert standardmäßig <code>libedgetpu1-std</code>. Bei erkannter M.2-Coral stehen <code>libedgetpu1-std</code> und <code>libedgetpu1-max</code> zur Wahl. Die Paketauswahl richtet die Erkennung in der Anwendung nicht automatisch ein."
|
||||
],
|
||||
"noIgpuTitle": "Warum werden hier keine iGPU-Treiber installiert?",
|
||||
"noIgpuBody": "Früher installierte es zusätzlich <code>va-driver-all</code>, <code>intel-opencl-icd</code> und weitere Intel-Pakete für Quick Sync neben Coral. Das führte zu verwirrenden Fehlern bei reiner Coral-Nutzung. Die iGPU richtet nun <lxcGpuLink>GPU zu LXC hinzufügen</lxcGpuLink> ein; führen Sie dies für Hardware-Videodekodierung zuerst aus.",
|
||||
"debianTitle": "Andere Distributionen: nur Gerätezugriff",
|
||||
"debianBody": "Nutzt <code>apt-get</code> unter Debian/Ubuntu. Bei <strong>Alpine, Arch, RHEL oder SUSE</strong>, erkannt über <code>/etc/os-release</code>, stehen <em>nur Gerätezugriff einrichten</em> und <em>abbrechen</em> zur Wahl. Ersteres schreibt <code>/etc/pve/lxc/<ctid>.conf</code>, ohne <code>libedgetpu</code> zu installieren. Bringt die App die Laufzeit mit, wie Frigate Docker, genügt dieser Modus. Sonst installieren Sie <code>libedgetpu</code> nach <coralLink>Googles offizieller Anleitung</coralLink>."
|
||||
},
|
||||
"summary": {
|
||||
"title": "Zusammenfassung",
|
||||
"body": "Am Ende zeigt eine Checkliste Coral USB und M.2 mit ✓ oder ⚠ je nach Hardware-Erkennung. Der Container läuft weiter, damit Sie Frigate, CodeProject.AI oder Ihre Anwendung konfigurieren können."
|
||||
}
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Manuelle Vorgehensweise",
|
||||
"body": "Wenn Sie genau sehen möchten, was in die LXC-Konfiguration geht, oder es von Hand anwenden:",
|
||||
"usbHeading": "USB Coral",
|
||||
"pcieHeading": "M.2 / PCIe Coral",
|
||||
"runtimeHeading": "Im Container: Coral-Laufzeit"
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Überprüfung",
|
||||
"body": "Öffnen Sie eine Shell im Container und prüfen Sie, ob Coral sichtbar ist:"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Fehlerbehebung",
|
||||
"apexTitle": "LXC gestartet, aber /dev/apex_0 fehlt",
|
||||
"apexBody": "Prüfen Sie zuerst den Host-Treiber: <code>lsmod | grep apex</code>. Falls nicht geladen, versuchen Sie <code>modprobe apex</code> oder starten nach der Treiberinstallation neu. Sobald <code>/dev/apex_0</code> auf dem Host existiert, prüfen Sie den LXC-Geräteeintrag (führen Sie das Skript erneut aus, wenn nur die Ersatzeinträge geschrieben wurden) und starten den Container mit <code>pct stop <ctid> && pct start <ctid></code> neu.",
|
||||
"replugTitle": "USB-Coral verschwindet nach Anschluss an einen anderen Port",
|
||||
"replugBody": "Prüfen Sie, ob der LXC <code>/dev/bus/usb</code> statt des Links <code>/dev/coral</code> einbindet. Die Konfiguration sollte <code>lxc.mount.entry: /dev/bus/usb dev/bus/usb ...</code> enthalten und nicht direkt von <code>/dev/coral</code> abhängen. Führen Sie bei alten Konfigurationen das Skript erneut aus.",
|
||||
"alpineTitle": "Alpine / Arch / RHEL / SUSE: Laufzeit nicht installiert",
|
||||
"alpineBody": "Im <em>reinen Passthrough-Modus</em> wird das Gerät konfiguriert, aber <code>libedgetpu</code> nicht installiert. Nutzen Sie ein kompatibles Community-Paket oder bauen Sie aus dem Quellcode; prüfen Sie vor Befehlen wie Alpines <code>apk add</code> die Paketverfügbarkeit. Frigate kann die Laufzeit mitbringen. Bei Docker im LXC zusätzlich M.2 mit <code>--device /dev/apex_0:/dev/apex_0</code> durchreichen oder den USB-Baum in Docker einbinden; der LXC-Mount allein reicht nicht.",
|
||||
"frigateTitle": "Frigate meldet „Coral EdgeTPU detected but not available“",
|
||||
"frigateBody": "Prüfen Sie Laufzeit, Gerätesichtbarkeit und Lese-/Schreibrechte des tatsächlichen App-Prozesses. Bei USB Berechtigungen und gegebenenfalls <code>plugdev</code>-Mitgliedschaft prüfen. Bei M.2 <code>/dev/apex_0</code> mit <code>ls -l /dev/apex_0</code> prüfen. Ein Name wie <code>apex</code> in <code>/etc/group</code> genügt nicht: Numerische GIDs und LXC-Zuordnungen müssen stimmen. Prüfen Sie auch eine Belegung durch andere Prozesse; wechseln Sie nicht zuerst in den privilegierten Modus.",
|
||||
"logsTitle": "Überprüfen Sie sowohl Host- als auch Containerprotokolle",
|
||||
"logsBody": "Auf dem Host Gerätemeldungen mit <code>journalctl -k | grep -i -e apex -e gasket -e usb</code> prüfen. Im LXC die App-Protokolle lesen; bei verschachteltem Docker <code>docker logs <container></code> nutzen. Ursachen können Berechtigungen, fehlende Laufzeit, USB-Verbindung oder ein anderer TPU-Prozess sein."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Verwandte Themen",
|
||||
"items": [
|
||||
{
|
||||
"label": "Coral TPU auf dem Host installieren",
|
||||
"href": "/docs/hardware/install-coral-tpu-host",
|
||||
"tail": " — Voraussetzung für M.2-/PCIe-Coral-Karten vor der Nutzung im CT."
|
||||
},
|
||||
{
|
||||
"label": "GPU zu LXC hinzufügen",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — GPU-Zugriff, der bei Frigate häufig mit Coral kombiniert wird."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "GPU zu VM hinzufügen | ProxMenux-Dokumentation",
|
||||
"description": "Physische GPU einer Proxmox-VM zuweisen. ProxMenux prüft IOMMU, konfiguriert VFIO und VM-Geräte und erkennt Konflikte mit anderen VMs oder LXC."
|
||||
},
|
||||
"header": {
|
||||
"title": "GPU zu VM hinzufügen (Passthrough)",
|
||||
"description": "Erkennt Intel-, AMD- oder NVIDIA-GPUs und bereitet direkten VM-Zugriff vor. Prüft IOMMU und zugehörige Geräte, konfiguriert VFIO und VM und wendet Kompatibilitätsregeln an. Alle betroffenen Geräte prüfen.",
|
||||
"section": "Hardware: GPUs und Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Funktionsweise",
|
||||
"body": "Automatisiert Host- und <code>hostpci</code>-Schritte der <pveLink>Proxmox-PCI-Passthrough-Dokumentation</pveLink>. Prüft Zuweisungen in <em>anderen</em> Gästen und bietet Konfliktlösungen. Garantiert keine Unterstützung jeder GPU, Resetmethode oder jedes Gasttreibers."
|
||||
},
|
||||
"who": {
|
||||
"heading": "Für wen ist das?",
|
||||
"body": "Für direkten GPU-Zugriff einer <strong>virtuellen Maschine</strong> über VFIO. Solange die GPU an VFIO gebunden ist, kann der Host-Treiber sie auch bei gestoppter VM nicht nutzen. Für <em>LXC</em>-Freigabe siehe <lxcLink>GPU zu LXC hinzufügen</lxcLink>."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Vorbereitung",
|
||||
"gpu": "Physisch installierte <strong>kompatible GPU</strong>. Das Skript erkennt Intel, AMD und NVIDIA mit <code>lspci</code>.",
|
||||
"gpuCheck": "lspci | grep -iE 'VGA|3D|Display'",
|
||||
"iommu": "<strong>IOMMU-Unterstützung</strong> in Hardware und gegebenenfalls Firmware nötig (Intel VT-d oder AMD-Vi). Prüft das laufende System und kann Linux-Bootparameter setzen; ändert kein BIOS/UEFI und beweist bei inaktivem IOMMU keinen Firmwarefehler.",
|
||||
"q35": "Dieser Assistent verlangt <strong>q35</strong> und lehnt <code>i440fx</code> ab. Maschinentyp und BIOS/UEFI-Firmware sind getrennte Einstellungen. Chipsetwechsel bestehender VMs muss geplant werden und erfolgt nicht automatisch.",
|
||||
"q35Check": "qm config VMID | grep machine",
|
||||
"moreGpus": "<strong>Zweite GPU oder alternativen Zugang</strong> über SSH, IPMI oder seriell vorbereiten. Die Haupt-GPU-Zuweisung kann die lokale Anzeige abschalten. Bei <em>NVIDIA</em> kann eine Karte außerhalb der betroffenen IOMMU-Gruppe auf dem Host bleiben.",
|
||||
"nvidiaInstalled": "Nach <nvidiaLink>NVIDIA-Treiberinstallation auf dem Host</nvidiaLink> werden ausgewählte Funktionen für <code>vfio-pci</code> statt <code>nvidia</code> reserviert. Das Modul <code>nvidia</code> kann für <strong>andere</strong> Karten außerhalb der betroffenen IOMMU-Gruppe verfügbar bleiben. Mit <code>nvidia-smi</code> prüfen."
|
||||
},
|
||||
"pickOne": {
|
||||
"title": "Exklusive VM-Zuweisung oder LXC-Freigabe",
|
||||
"body": "Ein GPU, der an <code>vfio-pci</code> für den VM-Durchgang gebunden ist, kann nicht gleichzeitig vom Host oder einem LXC verwendet werden. Wenn Sie zwei GPUs haben, können Sie jedem Pfad eine widmen. Wenn Sie nur eine haben, wählen Sie:",
|
||||
"vmItem": "<strong>VM:</strong> direkter, exklusiver Zugriff für diese VM.",
|
||||
"lxcItem": "<strong>LXC (<lxcLink>GPU zu LXC hinzufügen</lxcLink>):</strong> teilt das Gerät über den nativen Treiber mit Host und anderen Containern."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Installationsprogramm ausführen",
|
||||
"body": "Öffnen Sie ProxMenux und wählen Sie <strong>Hardware: GPUs und Coral-TPU → GPU zu VM hinzufügen</strong>.",
|
||||
"imageAlt": "Menüeintrag zum Hinzufügen einer GPU zur VM"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Ablauf des Skripts",
|
||||
"body": "Erkennung und Auswahl gehen den Hauptänderungen voraus; eine Zusammenfassung bestätigt den Plan. IOMMU-Aktivierung hat zuvor eine eigene Bestätigung und kann bereits Bootdateien ändern. Spätere Audiobereinigung kann ebenfalls eine Auswahl verlangen."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Schritt für Schritt",
|
||||
"detect": {
|
||||
"title": "GPUs erkennen und IOMMU überprüfen",
|
||||
"body": "Betrachtet IOMMU nur dann als aktiv, wenn der laufende Kernel <code>intel_iommu=on</code> oder <code>amd_iommu=on</code> hat und IOMMU-Gruppen existieren. Ist der Parameter bereits für den nächsten Start gespeichert, wird im Modus „Neustart ausstehend“ fortgefahren; andernfalls kann ein separat bestätigter Schritt ihn mit <code>iommu=pt</code> ergänzen. Die Heuristik für die Bootdatei nutzt <code>/etc/kernel/cmdline</code>, wenn dort ein ZFS-Root-Marker wie <code>root=ZFS=</code> vorhanden ist, sonst <code>/etc/default/grub</code>. Diese Heuristik ist kein Nachweis des tatsächlichen Bootloaders. Neu konfiguriertes IOMMU wird nach dem Neustart aktiv; prüfen Sie danach die tatsächlichen Gruppen.",
|
||||
"tipTitle": "Nachinstallation bereits eingerichtet?",
|
||||
"tipBody": "Bei bereits konfiguriertem und aktivem <postLink>VFIO-IOMMU-Support</postLink> besteht die Prüfung. Eine Einstellung für den nächsten Start allein beweist keinen aktiven Zustand.",
|
||||
"imageAlt": "Liste der erkannten GPUs mit Hersteller- und PCI-Adresse"
|
||||
},
|
||||
"preflight": {
|
||||
"title": "GPU auswählen und Vorabprüfungen ausführen",
|
||||
"intro": "Sobald Sie den GPU ausgewählt haben, führt das Skript eine Reihe von Überprüfungen aus, die jeden weiteren Fortschritt blockieren können:",
|
||||
"items": [
|
||||
"<strong>SR-IOV-Prüfung.</strong> Verweigert VFs und PFs mit aktiven VFs, da dieser Ablauf vollständige Geräte statt SR-IOV einrichtet. SR-IOV auf unterstützter Hardware separat konfigurieren.",
|
||||
"<strong>Nur eine GPU.</strong> Die lokale Konsole kann durch VFIO ihre Ausgabe verlieren. Zuvor SSH- oder Webzugriff von einem anderen Rechner prüfen.",
|
||||
"<strong>AMD-Reset-Richtlinie.</strong> Liest <code>/sys/bus/pci/devices/<pci>/reset_method</code>. APU oder dedizierte Karte ohne FLR wird <em>durch die Assistentenrichtlinie blockiert</em>; unbekannter Untertyp ohne FLR verlangt Bestätigung. Dies beweist keine generelle technische Unmöglichkeit.",
|
||||
"<strong>D3cold-Zustand.</strong> AMD-Karten mit gemeldetem <code>D3cold</code> werden wegen möglicher Aktivierungsfehler blockiert. Stromversorgung und Firmware prüfen.",
|
||||
"<strong>Analyse der IOMMU-Gruppe.</strong> Liest <code>/sys/kernel/iommu_groups/</code> und nimmt <em>alle Nicht-Brücken-Geräte</em> in den VM-Plan auf, möglicherweise auch Netzwerk- oder Speichercontroller. Enthält die Gruppe Geräte aus einem anderen Slot, listet das Skript sie vor der Zusammenfassung auf; prüfen Sie, dass der Host keines davon benötigt. Steht der IOMMU-Neustart noch aus, sind die tatsächlichen Gruppen nicht verfügbar und der Plan enthält zunächst nur die gewählte GPU-Funktion; prüfen Sie die Isolation nach dem Neustart."
|
||||
],
|
||||
"audioIntro": "<strong>Zugehöriges Audio.</strong> Zwei Fälle je nach Controllerposition:",
|
||||
"audioDgpu": "<strong>Dedizierte GPU:</strong> HDMI-Audio liegt oft auf Funktion <code>.1</code> desselben PCI-Slots und wird bei Erkennung aufgenommen. Nutzt der Host es bisher, verliert er durch die VM-Reservierung den Zugriff.",
|
||||
"audioIgpu": "<strong>Ohne Audiofunktion <code>.1</code>:</strong> kann Audio auf einem anderen Gerät wie <code>00:1f.3</code> liegen. Controller mit Treibern wie <code>snd_hda_intel</code> werden gelistet. Standardmäßig <strong>keiner</strong> ausgewählt; nur benötigte wählen."
|
||||
},
|
||||
"pickVm": {
|
||||
"title": "Ziel-VM auswählen",
|
||||
"body": "VM aus der Liste wählen. Der Assistent verlangt q35 und verwendet vorhandene GPU-Einträge soweit möglich weiter. BIOS/UEFI ist eine separate Einstellung, kein Maschinentyp. Chipset und Bootmodus werden nicht automatisch geändert.",
|
||||
"imageAlt": "VM-Auswahl nach Name, ID und Status"
|
||||
},
|
||||
"switchMode": {
|
||||
"title": "Vorhandene Zuweisungen behandeln",
|
||||
"intro": "Das Skript scannt jede VM-Konfiguration und jede LXC-Konfiguration auf dem Host, der nach dem von Ihnen ausgewählten GPU sucht. Drei mögliche Ergebnisse:",
|
||||
"items": [
|
||||
"<strong>GPU verfügbar.</strong> Fortfahren ohne alte Zuweisung zu entfernen.",
|
||||
"<strong>Anderer VM zugewiesen.</strong> Quell-VM zuerst stoppen. Entweder <em>Einträge behalten und Autostart deaktivieren</em> oder <em>Einträge entfernen und Autostart behalten</em>. Bei bestehendem <code>vfio-pci</code> ohne nötige Hoständerungen kann VM→VM ohne Host-Neustart erfolgen.",
|
||||
"<strong>Von LXC genutzte GPU.</strong> Bei normalen Containern wählen Sie <em>GPU-Konfiguration behalten und Autostart deaktivieren</em> oder <em>GPU-Gerätekonfiguration entfernen und Autostart behalten</em>. Das Entfernen löscht die <code>devN</code>-Einträge und bei AMD/Intel auch alte <code>/dev/dri</code>-Regeln <code>lxc.mount.entry</code> und <code>lxc.cgroup2.devices.allow</code>. OCI-Container behalten ihre Konfiguration und werden mit deaktiviertem Autostart gestoppt; entfernen Sie ihre GPU über OCI manager Apps. Die Konflikterkennung erfolgt nach GPU-Gerätefamilie und kann weitere Karten dieser Familie erfassen."
|
||||
],
|
||||
"imageAlt": "Dialogangebot zum Entfernen des GPU aus einem LXC, bevor es dem VM zugewiesen wird",
|
||||
"smartTitle": "Zugehöriges Audio beim Entfernen prüfen",
|
||||
"smartBody": "Danach kann eine Liste <strong>möglicherweise nicht mehr benötigter Audiogeräte</strong> erscheinen. Weiter benötigte abwählen. Beispielsweise bleibt <code>02:00.1</code>, während <code>00:1f.3</code> zur Entfernung angeboten wird. Die Auswahl bestimmt die Entfernung; keine universelle Audio-/Bildzuordnung ist garantiert."
|
||||
},
|
||||
"audioPick": {
|
||||
"title": "Ohne .1-Audio benötigte Controller auswählen",
|
||||
"body": "Dies gilt nur für Intel iGPU und ähnliche Split-Audio-Setups. Eine Checkliste zeigt jeden PCI-Audiocontroller auf dem Host (mit Ausnahme eines bereits in der IOMMU-Gruppe von GPU) mit seinem aktuellen Treiber. Wählen Sie die gewünschten aus - oder keine, wenn der VM kein Audio von der Host-Hardware benötigt.",
|
||||
"imageAlt": "Checklistendialog mit jedem Host-PCI-Audiocontroller (BDF + Treiber), wenn der GPU kein .1-Geschwister-Audio hat",
|
||||
"warnTitle": "Kein vom Host benötigtes Audio auswählen",
|
||||
"warnBody": "Audiozuweisung kann dem Host den Zugriff nehmen; derselbe Controller kann nicht gleichzeitig einer anderen laufenden VM gehören. Unnötiges Audio nicht wählen und Zuweisungen prüfen. Der Konsolenpiep kommt nicht zwingend von PCI-Audio."
|
||||
},
|
||||
"summary": {
|
||||
"title": "Überprüfung der Bestätigungszusammenfassung",
|
||||
"body": "Prüfen Sie den endgültigen Host- und VM-Plan und brechen Sie bei Fehlern ab. Er zeigt die IOMMU-Gruppe und die Anzahl ihrer Geräte; Mitglieder aus einem anderen Slot werden im vorherigen Schritt aufgelistet. Der Abbruch verhindert die Hauptänderungen, macht aber eine zuvor separat bestätigte Änderung der IOMMU-Bootkonfiguration nicht rückgängig.",
|
||||
"imageAlt": "Übersicht geplanter Änderungen an Host und VM"
|
||||
},
|
||||
"hostApply": {
|
||||
"title": "Host Änderungen werden angewendet",
|
||||
"intro": "Die Anwendung ändert Host und VM. Zugehörige Audiobereinigung kann weiterhin eine Auswahl verlangen. Mögliche Hoständerungen:",
|
||||
"items": [
|
||||
"<code>/etc/modules</code> — fügt <code>vfio</code>, <code>vfio_iommu_type1</code>, <code>vfio_pci</code> hinzu (plus <code>vfio_virqfd</code> auf Kernen < 6.2).",
|
||||
"<code>/etc/modprobe.d/vfio.conf</code> — AMD/Intel: <code>options vfio-pci ids=<vendor:device,...> disable_vga=1</code>. NVIDIA: <code>softdep nvidia pre: vfio-pci</code> (<code>_drm</code>/<code>_modeset</code>/<code>_uvm</code>); die eigentliche Bindung erfolgt pro BDF. AMD ergänzt die Ladereihenfolge <code>softdep</code>: <code>vfio-pci</code> → <code>radeon</code>/<code>amdgpu</code>.",
|
||||
"Schreibt <code>/etc/modprobe.d/iommu_unsafe_interrupts.conf</code> und <code>kvm.conf</code> mit <code>allow_unsafe_interrupts=1</code> und <code>ignore_msrs=1</code>. Kompatibilitätseinstellungen des Skripts, keine allgemeinen Windows/macOS-Anforderungen; unsichere Interrupts schwächen den Interrupt-Remapping-Schutz.",
|
||||
"<code>/etc/modprobe.d/blacklist.conf</code>: NVIDIA — <code>nouveau</code>/<code>lbm-nouveau</code>; AMD — <code>radeon</code> + <code>amdgpu</code>; Intel — <code>i915</code>. Diese herstellerweiten Regeln können andere Karten mit demselben Treiber betreffen. Das Modul <code>nvidia</code> wird <strong>nur</strong> über <code>/etc/modprobe.d/proxmenux-nvidia-vfio-blacklist.conf</code> blockiert, wenn <em>alle</em> NVIDIA-Karten für VFIO erfasst sind.",
|
||||
"<code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> + <code>/etc/proxmenux/vfio-bind.bdfs</code> — <strong>Nur NVIDIA.</strong> Setzt <code>ATTR'{'driver_override'}'=\"vfio-pci\"</code> bei PCI ADD für erfasste BDFs einschließlich betroffener IOMMU-Gruppenfunktionen. Außerhalb kann <code>nvidia</code> erhalten bleiben. BDF-Regeln teilen keine Hardware-IOMMU-Gruppe.",
|
||||
"<strong>Nur AMD.</strong> Versucht, das ROM aus <code>/sys/bus/pci/.../rom</code> oder ACPI VFCT nach <code>/usr/share/kvm/vbios_<vendor>_<device>.bin</code> zu sichern. Bei Erfolg nutzt die VM <code>romfile=</code>. Ein gültiger Dump garantiert keine erfolgreiche GPU-Initialisierung.",
|
||||
"<strong>Nur NVIDIA.</strong> Stoppt und deaktiviert <code>nvidia-persistenced</code>, <code>nvidia-powerd</code>, <code>nvidia-fabricmanager</code> nur, wenn alle NVIDIA-Karten VFIO zugeordnet sind. Im Mischbetrieb bleiben Dienste und <code>nvidia</code> für native Karten erhalten.",
|
||||
"<code>update-initramfs -u -k all</code> — läuft nur, wenn einer der oben genannten tatsächlich geändert."
|
||||
]
|
||||
},
|
||||
"vmApply": {
|
||||
"title": "VM config wird über qm set angewendet",
|
||||
"body": "Die VM-Konfiguration bei <code>/etc/pve/qemu-server/<vmid>.conf</code> wird über <code>qm set</code> aktualisiert (nie direkt über <code>sed</code>):",
|
||||
"after1": "Setzt <code>x-vga=1</code> für AMD und NVIDIA, <strong>nicht</strong> Intel. Dies ist die Skriptrichtlinie und kein Beleg, dass jeder Intel-iGPU Firmware fehlt oder das Flag immer Hänger verursacht.",
|
||||
"after2": "Zusätzliche <code>hostpciN</code>-Leitungen werden angehängt, wenn die IOMMU-Gruppe des GPU andere Geräte enthält, die Sie zusammen übergeben müssen."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Bei erforderlicher Hoständerung neu starten",
|
||||
"body": "Neustarthinweise bei Boot- oder Treiberänderungen befolgen und aktive GPU-Bindung vor VM-Start prüfen. Gespeicherte Konfiguration beweist keine aktive Anwendung. VM→VM mit korrektem VFIO kann ohne Host-Neustart erfolgen.",
|
||||
"imageAlt": "Zusammenfassungsbildschirm zeigt, was geändert wurde, gefolgt von einer Neustartaufforderung"
|
||||
}
|
||||
},
|
||||
"vendors": {
|
||||
"heading": "Herstellerspezifische Hinweise",
|
||||
"nvidiaHeading": "NVIDIA",
|
||||
"nvidiaBody": "Behält einen älteren <em>Code-43</em>-Workaround: <code>hidden=1</code>, ID <code>NV43FIX</code> in <code>args</code> und <code>kvm=off</code>. Kein allgemeines Erfordernis aktueller GeForce-Treiber: NVIDIA aktivierte Windows-VM-Passthrough ab R465. Der Fehler kann andere Ursachen haben; Kombination prüfen.",
|
||||
"nvidiaMultiHeading": "Multi-GPU NVIDIA Unterstützung",
|
||||
"nvidiaMultiBody": "Gemischte NVIDIA-Nutzung <strong>pro BDF</strong>. Erfasst Funktionen für <code>vfio-pci</code> nach Adresse statt nur <code>vendor:device</code>. Außerhalb betroffener Gruppen kann <code>nvidia</code> bleiben; mit <code>nvidia-smi</code> prüfen. Karten derselben Gruppe werden dadurch nicht isoliert.",
|
||||
"amdHeading": "AMD",
|
||||
"amdBody": "Manche AMD-GPUs lassen sich nach VM-Stopp nicht zurücksetzen. Der Assistent prüft gemeldete Fähigkeiten, nicht alle realen Zyklen. <vendorResetLink>vendor-reset</vendorResetLink> unterstützt begrenzte Geräte, kompatible Kernel und frühes Laden; wird nicht installiert. <em>RadeonResetBugFix</em> unter Windows ist ebenfalls hardwareabhängig, keine allgemeine Lösung.",
|
||||
"intelHeading": "Intel iGPU",
|
||||
"intelBody": "Vollständiges Intel-iGPU-Passthrough und SR-IOV sind getrennte Abläufe. Dieser Assistent reserviert das Gerät für eine VM ohne <code>x-vga=1</code>. <sriovLink>i915-sriov-dkms</sriovLink> verlangt unterstützte Hardware/Kernel; „UHD 630+“ ist keine Kompatibilitätsregel. Alternativen Host-Zugang planen."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Überprüfung"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Fehlerbehebung",
|
||||
"code43Title": "Code 43 in Windows (NVIDIA)",
|
||||
"code43Body": "Code 43 beweist keinen KVM-Versteckfehler. <code>qm config VMID | grep -E \"cpu|args\"</code> mit echter VMID prüfen, ebenso <code>hidden=1</code> und <code>hv_vendor_id=NV43FIX</code>. Auch Gasttreiber, Firmware und Zuweisung prüfen. Erneutes Ausführen kann bei vorhandener Zuweisung sofort enden.",
|
||||
"amdResetTitle": "AMD GPU funktioniert einmal, schlägt beim Neustart von VM fehl",
|
||||
"amdResetBody": "Resetfehler sind eine mögliche Ursache. Host-Neustart oder Aus-/Einschalten kann vorübergehend helfen. Unterstützung und frühes Laden von <code>vendor-reset</code> prüfen; <code>softdep amdgpu pre: vendor-reset</code> allein garantiert kein Laden vor VFIO. Auch <em>RadeonResetBugFix</em> unter Windows benötigt kompatible Hardware.",
|
||||
"stuckBootTitle": "VM hängengebliebenes Booten / GPU nicht erkannt",
|
||||
"stuckBootBody": "Reale Adresse mit <code>lspci -nnk -s PCI_ADDRESS</code> prüfen; erwartet <code>Kernel driver in use: vfio-pci</code>. PCI_ADDRESS ersetzen. Bei nativem Treiber Bindungspolitik prüfen, nicht nur <code>/etc/modprobe.d/blacklist.conf</code>; NVIDIA nutzt BDF-Status. <code>dmesg | grep vfio</code> lesen. Nach Korrektur <code>update-initramfs -u -k all</code> und Neustartplan befolgen.",
|
||||
"darkTitle": "Host-Konsole wird nach dem Neustart dunkel und ich kann SSH nicht in",
|
||||
"darkBody": "Schwarzes Bild bedeutet nicht, dass der Host ausgefallen ist. Bei SSH-Ausfall Netzwerk und Controller in der IOMMU-Gruppe prüfen. Über IPMI, seriell oder Rettungsumgebung zugreifen; <code>/etc/pve/qemu-server/<vmid>.conf</code> prüfen und nur relevante Zuweisungen/Bindungen zurücknehmen. Keine fremde Konfiguration löschen.",
|
||||
"logTitle": "Überprüfen Sie das Installationsprotokoll",
|
||||
"logBody": "Jeder Durchlauf schreibt <code>/tmp/add_gpu_vm.log</code>. Bei Hilfsanfragen beifügen."
|
||||
},
|
||||
"revert": {
|
||||
"heading": "Änderungen manuell zurücknehmen",
|
||||
"intro": "VM stoppen und nur relevante PCI-Zuweisungen unter Hardware oder mit dem gezeigten Index entfernen. Das gibt die GPU noch nicht dem nativen Host-Treiber zurück. Dafür GPU-Modus wechseln verwenden und betroffene Gäste vor Bestätigung prüfen."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Verwandte Themen",
|
||||
"items": [
|
||||
{
|
||||
"label": "Installieren Sie NVIDIA Treiber (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — Host-Treiber für nativ verbleibende Karten vorbereiten; eine VFIO-GPU kann ihn nicht gleichzeitig nutzen."
|
||||
},
|
||||
{
|
||||
"label": "GPU zu LXC hinzufügen",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": "Alternatives Modell: Teilen Sie den GPU mit mehreren Containern, anstatt ihn einem VM zu widmen."
|
||||
},
|
||||
{
|
||||
"label": "GPU-Modus wechseln (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — dieselbe GPU zwischen Freigabe und exklusiver Zuweisung wechseln."
|
||||
},
|
||||
{
|
||||
"label": "GPU Durchgangsbefehle",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — lspci, IOMMU-Prüfung und Referenz zu qm set hostpci."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,185 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "GPU zu LXC hinzufügen | ProxMenux-Dokumentation",
|
||||
"description": "Intel-, AMD- oder NVIDIA-GPU mit LXC teilen. ProxMenux richtet Geräte, Gruppen und Bibliotheken passend zur Distribution ein; die App muss Beschleunigung unterstützen und entsprechend eingerichtet sein."
|
||||
},
|
||||
"header": {
|
||||
"title": "GPU zu LXC hinzufügen",
|
||||
"description": "GPU-Zugriff über Host-Geräteknoten mit LXC teilen. Der Treiber bleibt auf dem Host; Anwendungen brauchen kompatible Bibliotheken und eigene Einstellungen.",
|
||||
"section": "Hardware: GPUs und Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Funktionsweise",
|
||||
"body": "Fügt <code>dev<N></code>-Einträge zu <code>/etc/pve/lxc/<ctid>.conf</code> für passende <code>/dev/dri/*</code>-, <code>/dev/kfd</code>- oder <code>/dev/nvidia*</code>-Knoten hinzu. Startet den Container, installiert Userspace-Pakete für dessen Distribution und gleicht bei Intel/AMD die Gruppen <code>video</code> und <code>render</code> ab. Die Anwendungsbeschleunigung erfordert weiterhin kompatible Hardware, Bibliotheken und App-Einstellungen."
|
||||
},
|
||||
"compare": {
|
||||
"heading": "LXC-Freigabe und VM-Passthrough im Vergleich",
|
||||
"intro": "LXC teilt den Kernel und kann die GPU zwischen Host und Containern <em>teilen</em>. Bei <vmLink>vollständigem VM-Passthrough</vmLink> gehört das Gerät exklusiv zur VM und steht dem Host-Treiber nicht zur Verfügung.",
|
||||
"headerFeature": "Merkmal",
|
||||
"headerLxc": "LXC (diese Seite)",
|
||||
"headerVm": "VM",
|
||||
"rows": [
|
||||
{
|
||||
"feature": "Kann der Host die GPU weiter nutzen?",
|
||||
"lxc": "Ja",
|
||||
"vm": "Nein — ausschließlich für VM"
|
||||
},
|
||||
{
|
||||
"feature": "Mehrere Container teilen sich einen GPU?",
|
||||
"lxc": "Ja",
|
||||
"vm": "Nein"
|
||||
},
|
||||
{
|
||||
"feature": "Benötigt IOMMU / VFIO auf dem Host?",
|
||||
"lxc": "Nein",
|
||||
"vm": "Ja"
|
||||
},
|
||||
{
|
||||
"feature": "Reboot erforderlich?",
|
||||
"lxc": "Normalerweise nein (neustarten Sie einfach den CT)",
|
||||
"vm": "Bei Änderungen am Host-Treiber oder IOMMU; nicht bei jeder Zuweisung"
|
||||
},
|
||||
{
|
||||
"feature": "Gastbetriebssysteme",
|
||||
"lxc": "Nur Linux (LXC ist nur Linux)",
|
||||
"vm": "Unterstütztes Gastsystem mit kompatiblem GPU-Treiber"
|
||||
}
|
||||
]
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Vorbereitung",
|
||||
"gpu": "<strong>GPU auf dem Host</strong> von Intel, AMD oder NVIDIA, erkannt mit <code>lspci</code>.",
|
||||
"gpuCheck": "lspci | grep -iE 'VGA|3D|Display'",
|
||||
"vfio": "<strong>Die GPU darf nicht an vfio-pci gebunden sein.</strong> Sie benötigt den nativen Host-Treiber. Bei VM-Zuweisung bietet das Skript <switchLink>GPU-Modus wechseln</switchLink> an.",
|
||||
"nvidia": "<strong>Für NVIDIA:</strong> zuerst den Host-Treiber installieren. Die Containerbibliotheken müssen zur Version passen. Siehe <nvidiaLink>NVIDIA-Treiber auf dem Host installieren</nvidiaLink>.",
|
||||
"nvidiaCheck": "nvidia-smi",
|
||||
"container": "<strong>Vorhandener LXC-Container.</strong> Das Skript erstellt keinen. Beide Modi werden unterstützt; <strong>privilegiert</strong> ist nicht grundsätzlich nötig. Geräteeinträge und numerische App-Gruppenrechte müssen passen."
|
||||
},
|
||||
"unpriv": {
|
||||
"title": "Unterstützt privilegierte und unprivilegierte Container",
|
||||
"body": "Das Skript schreibt <code>dev<N></code>-Einträge in die LXC-Konfiguration und richtet auf unprivilegierten Containern die <code>video</code>- und <code>render</code>-GIDs zwischen Host und Container so aus, dass die GPU-Geräteknoten von innen erreichbar sind, ohne dass Sie <code>lxc.idmap</code> von Hand bearbeiten müssen."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Installationsprogramm ausführen",
|
||||
"body": "Öffnen Sie ProxMenux und wählen Sie <strong>Hardware: GPUs und Coral-TPU → GPU zu LXC hinzufügen</strong>.",
|
||||
"imageAlt": "Menüeintrag zum Hinzufügen einer GPU zu LXC"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Ablauf des Skripts",
|
||||
"body": "Container und GPU-Familien auswählen und Prüfungen durchlaufen. Danach wird der Container ohne weitere Abschlussbestätigung gestoppt und geändert. Optionale VFIO-Bereinigung wird separat bestätigt und kann den Host vorher ändern."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Schritt für Schritt",
|
||||
"detect": {
|
||||
"title": "Host-GPUs erkennen",
|
||||
"body": "Sucht GPU-Controller mit <code>lspci</code>. Prüft für NVIDIA das Modul <code>nvidia</code> und <code>nvidia-smi</code>; die erkannte Version bestimmt den <code>.run</code>-Installer für den Container.",
|
||||
"tipTitle": "NVIDIA nicht bereit?",
|
||||
"tipBody": "Wenn Modul oder NVIDIA-Funktion auf dem Host fehlen, zuerst <nvidiaLink>NVIDIA-Treiber auf dem Host installieren</nvidiaLink> und den Treiber prüfen."
|
||||
},
|
||||
"pickCt": {
|
||||
"title": "LXC-Container auswählen",
|
||||
"body": "Listet geeignete LXC-Container mit ID und Name; OCI-Container sind ausgeschlossen und nutzen für Geräte OCI manager Apps. Der Container wird gestoppt, falls er läuft, zur Treiberinstallation gestartet und normalerweise in seinen ursprünglichen Zustand (laufend/gestoppt) zurückversetzt.",
|
||||
"imageAlt": "Auswahl eines vorhandenen LXC-Containers"
|
||||
},
|
||||
"selectGpu": {
|
||||
"title": "GPU-Familien auswählen",
|
||||
"body": "Die Liste wählt Herstellerfamilien, kein isoliertes PCI-Gerät. Intel/AMD fügen die vorgesehenen DRI-Knoten hinzu; NVIDIA seine verfügbaren Geräteknoten, möglicherweise für mehrere Karten. Eine einzelne Familie wird automatisch gewählt. Ergebnis besonders bei mehreren GPUs prüfen.",
|
||||
"imageAlt": "Liste erkannter GPU-Familien mit Name und PCI-Adresse"
|
||||
},
|
||||
"preflight": {
|
||||
"title": "Vorabprüfungen",
|
||||
"imageAlt": "Angebot zum Moduswechsel einer an vfio-pci gebundenen GPU",
|
||||
"intro": "Drei Prüfungen können den Ablauf stoppen oder umleiten:",
|
||||
"items": [
|
||||
"<strong>SR-IOV-Prüfung.</strong> Der Assistent blockiert eine VF oder PF mit aktiven VFs. Das liegt an seiner breiten Geräteauswahl und ist kein generelles LXC-Verbot. Solche Geräte separat konfigurieren.",
|
||||
"<strong>An vfio-pci gebunden.</strong> Der native Treiber kann keine <code>/dev/dri/*</code>- oder <code>/dev/nvidia*</code>-Geräte anlegen. <switchLink>GPU-Modus wechseln</switchLink> wird angeboten; Neustarthinweise befolgen und erneut starten.",
|
||||
"<strong>Bereits eingerichtet.</strong> Sind alle Geräte vorhanden, beendet das Skript sich ohne Bibliotheks-Neuinstallation. Fehlende ausgewählte Familien werden weiter bearbeitet."
|
||||
]
|
||||
},
|
||||
"applyConfig": {
|
||||
"title": "Anwenden der LXC-Konfigurationsänderungen",
|
||||
"body1": "Stoppt den Container, falls er läuft, und bearbeitet <code>/etc/pve/lxc/<ctid>.conf</code>. Nummerierte <code>dev<N></code>-Einträge enthalten die Host-GID von <code>video</code> oder <code>render</code>. Vorhandene <code>lxc.mount.entry</code>-Bind-Zeilen für <code>/dev/dri</code> werden durch <code>dev:</code>-Einträge ersetzt; prüfen Sie die resultierende Konfiguration und die Rechte.",
|
||||
"body2": "Beispiel nach Intel + NVIDIA auf demselben Container:"
|
||||
},
|
||||
"installDrivers": {
|
||||
"title": "Starten Sie den Container und installieren Sie Treiber im Inneren",
|
||||
"body": "Startet den Container und wartet bis zu etwa 30 Sekunden auf <code>pct exec</code>. Erkennt die Distribution aus <code>/etc/os-release</code> und installiert passende Pakete.",
|
||||
"headerDistro": "Distribution",
|
||||
"headerInt": "Intel / AMD",
|
||||
"headerNvidia": "NVIDIA",
|
||||
"rows": [
|
||||
{
|
||||
"distro": "Alpine",
|
||||
"intel": "apk add mesa-va-gallium intel-media-driver libva-utils",
|
||||
"nvidia": "apk add nvidia-utils"
|
||||
},
|
||||
{
|
||||
"distro": "Arch / Manjaro",
|
||||
"intel": "pacman -Sy intel-media-driver mesa libva-utils",
|
||||
"nvidia": "pacman -Sy nvidia-utils"
|
||||
}
|
||||
],
|
||||
"debianDistro": "Debian / Ubuntu / andere",
|
||||
"debianIntel": "apt-get install va-driver-all intel-opencl-icd vainfo",
|
||||
"debianNvidia": "<code>.run</code> auf dem Host entpacken → <code>pct push</code> → mit <code>--no-kernel-modules --no-dkms</code> installieren.",
|
||||
"whyTitle": "Warum Debian den NVIDIA-.run-Installer nutzt",
|
||||
"whyBody": "Repository-Pakete passen möglicherweise nicht zum Host. Bibliotheken <strong>müssen zum geladenen Host-Modul passen</strong>, etwa für <code>nvidia-smi</code>. Debian/glibc nutzt den zwischengespeicherten <code>.run</code>-Installer der Host-Version, entpackt und archiviert ihn auf dem Host, überträgt mit <code>pct push</code> und installiert mit <code>--no-kernel-modules --no-dkms</code>. Alpine und Arch nutzen Repository-Pakete; Versionen prüfen."
|
||||
},
|
||||
"alignGids": {
|
||||
"title": "GIDs ausrichten und Zustand wiederherstellen",
|
||||
"body1": "Liest bei Intel/AMD die Host-GIDs von <code>video</code> und <code>render</code>, wobei 44/104 nur als Ersatzwerte dienen, und passt dann <code>/etc/group</code> im Container entsprechend an; reine NVIDIA-Durchläufe überspringen diesen Schritt. Einträge wie <code>video:44</code> und <code>render:104</code> sind Beispiele, keine universellen IDs. Prüfen Sie die App-Mitgliedschaft und die wirksamen Geräterechte.",
|
||||
"body2": "Bei normalem Abschluss wird ein ursprünglich gestoppter Container erneut gestoppt; ein laufender bleibt aktiv. Bei Start- oder Installationsfehlern Endzustand und Protokoll prüfen."
|
||||
}
|
||||
},
|
||||
"vendors": {
|
||||
"heading": "Herstellerspezifische Hinweise",
|
||||
"intelHeading": "Intel iGPU",
|
||||
"intelBody": "Intel-Medienbeschleunigung, einschließlich <em>Quick Sync</em>, hängt von GPU-Generation, Codecs und App-Einstellungen ab. Das Skript teilt diejenigen von <code>/dev/dri/card0</code>, <code>card1</code>, <code>renderD128</code> und <code>renderD129</code>, die vorhanden sind; andere Knotennummern werden nicht hinzugefügt. Der Host muss sie bereits über seinen nativen Treiber bereitstellen, etwa <code>i915</code>.",
|
||||
"amdHeading": "AMD",
|
||||
"amdBody": "AMD nutzt DRI für Mesa/VA-API. Vorhandenes <code>/dev/kfd</code> wird ebenfalls geteilt. ROCm/OpenCL benötigt unterstützte Hardware und passende Bibliotheken; die Gerätefreigabe installiert keinen vollständigen ROCm-Stack.",
|
||||
"nvidiaHeading": "NVIDIA",
|
||||
"nvidiaBody": "Teilt verfügbare <code>/dev/nvidia*</code>-Geräte. <strong>Passende Treiberversionen</strong> sind für <code>nvidia-smi</code> entscheidend. Debian/glibc nutzt den <code>.run</code>-Installer der Host-Version, Alpine/Arch Repository-Pakete. Unter 2048 MiB konfiguriertem RAM bietet der Debian-Pfad eine vorübergehende Erhöhung mit Wiederherstellung; benötigt außerdem 1500 MiB freien Plattenplatz.",
|
||||
"updateTitle": "Nach Host-NVIDIA-Update Containerbibliotheken prüfen",
|
||||
"updateBody": "Alte Bibliotheken können in <code>nvidia-smi</code> Versionsfehler verursachen. Der <nvidiaLink>NVIDIA-Host-Installer</nvidiaLink> bietet Containerupdates. Erneutes Hinzufügen kann bei vorhandenen Geräten sofort enden und garantiert kein Bibliotheksupdate. Versionen prüfen und passende Pakete oder Userspace-Installation aktualisieren."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Überprüfung",
|
||||
"body": "Im Container prüfen, ob die GPU sichtbar und nutzbar ist."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Fehlerbehebung",
|
||||
"mismatchTitle": "nvidia-smi: Failed to initialize NVML: Driver/library version mismatch",
|
||||
"mismatchBody": "Bibliotheken passen nicht zum geladenen Host-Modul. Versionen prüfen und Container-Userspace aktualisieren. Der zwischengespeicherte <code>.run</code>-Installer gilt für Debian/glibc; bei vorhandenen Geräteeinträgen kann das Hinzufügen vorher enden.",
|
||||
"denyTitle": "Genehmigung verweigert auf /dev/dri/renderD128 im Container",
|
||||
"denyBody": "Geräteeintrag und numerische Rechte der Gruppe <code>render</code> prüfen; App-Benutzer muss zu <code>render</code> gehören. Falls verfügbar, mit <code>usermod -aG render <user></code> zu <code>render</code> hinzufügen; Platzhalter durch Kontonamen ersetzen. Sitzung neu starten. Privilegmoduswechsel ist keine allgemeine Lösung.",
|
||||
"vainfoTitle": "vainfo sagt: VA-API Version 1.xx; konnte nicht initialisiert werden",
|
||||
"vainfoBody": "Gerätezugriff und VA-API-Treiber prüfen. Paketnamen hängen von der Distribution ab: etwa <code>intel-media-driver</code> für unterstützte neuere Intel-GPUs, <code>i965-va-driver</code> für ältere und <code>mesa-va-drivers</code> für AMD. Die Meldung allein beweist kein fehlendes Paket.",
|
||||
"logTitle": "Installationsprotokoll",
|
||||
"logBody": "Jeder Durchlauf schreibt <code>/tmp/add_gpu_lxc.log</code> auf dem Host. Bei Hilfsanfragen beifügen."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Verwandte Themen",
|
||||
"items": [
|
||||
{
|
||||
"label": "Installieren Sie NVIDIA Treiber (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — Host-Treiber vor der NVIDIA-Freigabe installieren."
|
||||
},
|
||||
{
|
||||
"label": "GPU zu VM hinzufügen (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — Alternative für eine exklusiv zugewiesene VM-GPU."
|
||||
},
|
||||
{
|
||||
"label": "GPU-Modus wechseln (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — GPU zwischen LXC-Freigabe und VM-Zuweisung wechseln."
|
||||
},
|
||||
{
|
||||
"label": "GPU Durchgangsbefehle",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": "Schnellreferenz für verwandte Shell-Befehle."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,203 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Coral TPU auf dem Host installieren | ProxMenux-Dokumentation",
|
||||
"description": "Installiert Coral-Komponenten auf Proxmox VE nach erkannter Hardware: gasket/apex mit DKMS für M.2 / Mini-PCIe und libedgetpu1-std für USB. Bei beiden Gerätetypen werden beide Abläufe ausgeführt."
|
||||
},
|
||||
"header": {
|
||||
"title": "Coral TPU auf dem Host installieren",
|
||||
"description": "Proxmox-Host für Coral und spätere LXC-Nutzung vorbereiten. Erkennt M.2 / Mini-PCIe, USB oder beide und führt passende Abläufe aus: DKMS-Module für PCIe und Google-Edge-TPU-Laufzeit für USB.",
|
||||
"section": "Hardware: GPUs und Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Funktionsweise",
|
||||
"body": "Ein <strong>gemeinsamer Installer mit Hardware-Erkennung</strong>. PCIe nutzt <code>gasket</code> und <code>apex</code> mit DKMS; spätere Builds brauchen kompatible Quellen und Headers. USB nutzt <code>libedgetpu1-std</code>. Bei beiden Gerätetypen laufen beide Pfade. Die USB-Laufzeit gehört zum Ausführungsort der App; für reine LXC-Nutzung ist sie auf dem Host nicht grundsätzlich nötig."
|
||||
},
|
||||
"which": {
|
||||
"heading": "Welche Coral habe ich?",
|
||||
"body": "PCIe- und USB-Modelle unterscheiden sich in Bauform und Anforderungen. Das Skript unterstützt beide; identifizieren Sie Ihr Gerät vor dem Start.",
|
||||
"headerForm": "Formfaktor",
|
||||
"headerDetect": "Detektion",
|
||||
"headerInstall": "Art der Installation",
|
||||
"headerReboot": "Neu starten?",
|
||||
"pcieForm": "M.2 / Mini-PCIe",
|
||||
"pcieFormSub": "(M.2-Karten gibt es mit einer oder zwei Edge TPUs)",
|
||||
"pcieDetect": "PCI-Herstellerkennung <code>1ac1</code>",
|
||||
"pcieInstall": "Kernel-Modul (gasket + apex) über DKMS",
|
||||
"pcieReboot": "Ja",
|
||||
"usbForm": "USB-Beschleuniger",
|
||||
"usbFormSub": "(kleiner Kunststoff-Dongle)",
|
||||
"usbDetect": "USB <code>1a6e:089a</code> (unprogrammiert) / <code>18d1:9302</code> (programmiert)",
|
||||
"usbInstall": "Userspace-Laufzeit <code>libedgetpu1-std</code> aus Googles APT-Repository",
|
||||
"usbReboot": "Nein"
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Vorbereitung",
|
||||
"coral": "<strong>Angeschlossene Coral TPU</strong> (M.2, Mini-PCIe oder USB) für die Installation. Ohne erkannte Hardware kann das Skript vorhandene Komponenten bereinigen oder entfernen, installiert aber keinen neuen Hardwarepfad.",
|
||||
"coralCheck": "lspci -d 1ac1: ; lsusb | grep -E '1a6e:089a|18d1:9302'",
|
||||
"internet": "<strong>Internetzugang</strong> auf dem Host zum Klonen des PCIe-Treibers von GitHub oder zum Herunterladen von <code>libedgetpu1-std</code> aus Googles APT-Repository für USB.",
|
||||
"headers": "<strong>Über APT verfügbare Kernel-Header</strong>: <code>proxmox-headers-$(uname -r)</code>. Nur für PCIe/M.2 nötig; das Skript installiert sie.",
|
||||
"reboot": "<strong>Neustart für PCIe einplanen</strong>. Das Skript versucht, die gebauten Module zu laden; ein Neustart prüft auch das automatische Laden."
|
||||
},
|
||||
"hostPrepTip": {
|
||||
"title": "Dies bereitet nur den Host vor",
|
||||
"body": "Bereitet den Host für den <em>Gerätezugriff</em> vor; Anwendungen werden weder eingerichtet noch getestet. Um Coral etwa mit Frigate zu <em>nutzen</em>, folgen Sie <lxcLink>Coral TPU zu einem LXC hinzufügen</lxcLink>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Installationsprogramm ausführen",
|
||||
"body": "Öffnen Sie ProxMenux auf dem Host und wählen Sie <strong>Hardware: GPUs und Coral-TPU → Coral TPU auf dem Host installieren/aktualisieren</strong>.",
|
||||
"imageAlt": "Menüeintrag zur Installation oder Aktualisierung von Coral TPU auf dem Host"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Ablauf des Skripts",
|
||||
"body": "Zuerst werden Hardware und Installationsplan ermittelt. Die Installation erfordert eine Bestätigung."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Schritt für Schritt",
|
||||
"detect": {
|
||||
"title": "Hardwareerkennung",
|
||||
"body": "Sucht in <code>/sys/bus/pci/devices/*/vendor</code> nach Hersteller <code>0x1ac1</code> und erkennt USB-Geräte mit <code>lsusb</code>. Es gibt <strong>zwei</strong> USB-IDs, abhängig vom Firmwarezustand:",
|
||||
"items": [
|
||||
"<code>1a6e:089a</code> — Global Unichip, <em>unprogrammiert</em>, bevor die Laufzeit die Firmware lädt.",
|
||||
"<code>18d1:9302</code> — Google, <em>programmiert</em>, nach dem Laden der Firmware."
|
||||
],
|
||||
"outro": "Ohne erkannte Coral und vorhandene Installation endet das Skript mit einem Hinweis. Vorhandene Komponenten können weiterhin das Bereinigungs- oder Entfernungsmenü auslösen."
|
||||
},
|
||||
"prompt": {
|
||||
"title": "Installationsbestätigung",
|
||||
"body": "Vor der Installation zeigt ein Dialog Geräte und geplante Komponenten. Abbrechen überspringt die Installation. Die optionale Altbereinigung hat zuvor eine eigene Bestätigung.",
|
||||
"imageAlt": "Übersicht erkannter Coral-Geräte und Installationsschritte"
|
||||
},
|
||||
"pcie": {
|
||||
"title": "PCIe: Kernelmodule gasket und apex über DKMS",
|
||||
"body": "Läuft nur bei erkannter PCIe-/M.2-Coral. Die Module werden für den aktuell laufenden Host-Kernel gebaut.",
|
||||
"items": [
|
||||
"<strong>Bereinigung.</strong> Ein vorhandenes <code>gasket-dkms</code>-Paket wird vor dem Neubau entfernt; befindet es sich in einem fehlerhaften Paketstatus, erzwingt das Skript dessen Entfernung und Purge.",
|
||||
"<strong>Build-Abhängigkeiten:</strong> <code>git</code>, <code>dkms</code>, <code>build-essential</code>, <code>proxmox-headers-$(uname -r)</code>."
|
||||
],
|
||||
"cloneIntro": "<strong>Treiberquellen klonen.</strong> Bevorzugt <feranickLink>feranick/gasket-driver</feranickLink>, ersatzweise <googleLink>google/gasket-driver</googleLink>. Ein erfolgreicher Build setzt Kernelkompatibilität voraus. Die Google-Quellen erhalten folgende versionsabhängige Patches:",
|
||||
"kernelPatches": [
|
||||
"Ab Kernel 6.5 ersetzt der Fallback-Patch <code>no_llseek</code> durch <code>noop_llseek</code>.",
|
||||
"Ab Kernel 6.13: Argument von <code>MODULE_IMPORT_NS(DMA_BUF)</code> in ein Zeichenkettenliteral umwandeln."
|
||||
],
|
||||
"afterItems": [
|
||||
"<strong>Quellen nach <code>/usr/src/gasket-1.0/</code> kopieren,</strong> <code>dkms.conf</code> erzeugen und mit <code>dkms add</code> registrieren.",
|
||||
"<strong>Bauen und installieren:</strong> <code>dkms build</code>, danach <code>dkms install</code>. Bei Fehlern zeigt das Skript die letzten 50 Zeilen von <code>make.log</code>, sofern vorhanden.",
|
||||
"<strong>Gruppe <code>apex</code> und udev-Regeln erstellen</strong> (<code>/etc/udev/rules.d/99-coral-apex.rules</code>), um <code>/dev/apex_*</code> der Gruppe zuzuordnen.",
|
||||
"<strong>Module zu laden versuchen:</strong> <code>modprobe gasket</code> und <code>modprobe apex</code>."
|
||||
],
|
||||
"imageAlt": "DKMS-Build und Laden der gasket/apex-Module"
|
||||
},
|
||||
"usb": {
|
||||
"title": "USB: Edge-TPU-Laufzeit von Google",
|
||||
"body": "Läuft nur, wenn ein USB-Beschleuniger erkannt wurde. Viel einfacher:",
|
||||
"items": [
|
||||
"<strong>Googles GPG-Schlüssel hinzufügen</strong>: <code>/etc/apt/keyrings/coral-edgetpu.gpg</code>.",
|
||||
"<strong>APT-Repository hinzufügen</strong> in <code>/etc/apt/sources.list.d/coral-edgetpu.list</code>; <code>signed-by=</code> beschränkt die Prüfung auf dessen Schlüsselbund. Dies ist einzeilige .list-Syntax, keine deb822-.sources-Syntax.",
|
||||
"<strong><code>libedgetpu1-std</code> installieren</strong>, die Edge-TPU-Laufzeit mit Standardleistung.",
|
||||
"<strong>udev neu laden</strong> und die Paketregeln auf das USB-Gerät anwenden."
|
||||
],
|
||||
"stdTitle": "Warum libedgetpu1-std und nicht libedgetpu1-max?",
|
||||
"stdBody": "Das Paket <code>max</code> aktiviert den maximal unterstützten Takt mit höherer Leistung, Stromaufnahme und Wärme. Vor dem Wechsel Kühlung und Betriebsbedingungen prüfen. Die Pakete schließen sich gegenseitig aus; wechseln mit <code>apt install libedgetpu1-max</code>."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Optionaler Neustart nach PCIe-Installation",
|
||||
"body": "Nach PCIe wird ein Neustart angeboten. <code>modprobe</code> wurde versucht; prüfen Sie geladene Module und <code>/dev/apex_0</code> mit Gruppe <code>apex</code>. Ein geplanter Neustart prüft automatisches Laden. Bei reiner USB-Installation wird kein Host-Neustart angeboten.",
|
||||
"imageAlt": "Zusammenfassung und Neustartangebot nach PCIe-Installation"
|
||||
}
|
||||
},
|
||||
"legacyCleanup": {
|
||||
"heading": "Altes gasket-dkms auf reinen USB-Hosts bereinigen",
|
||||
"intro": "Wenn <strong>keine PCIe-/M.2-Coral erkannt wird</strong>, aber eine alte <code>gasket-dkms</code>-Installation existiert, wird eine optionale Bereinigung angeboten. Sie erfordert eine Bestätigung.",
|
||||
"items": [
|
||||
"Bei erkannter PCIe-/M.2-Coral wird stattdessen der normale DKMS-Neubau verwendet; diese Bereinigung wird nicht angeboten.",
|
||||
"Entfernt <code>gasket-dkms</code>, alte gasket-DKMS-Einträge und Quellen und repariert ausstehende <code>dpkg</code>-/APT-Vorgänge.",
|
||||
"Die USB-Pakete <code>libedgetpu1-std</code> und <code>libedgetpu1-max</code> bleiben erhalten, sodass die USB-Coral ihre Laufzeit behält.",
|
||||
"Das Skript überprüft, ob das Legacy-Paket verschwunden ist und dass das Paketmanagement gesund ist, bevor der Erfolg gemeldet wird."
|
||||
],
|
||||
"warningTitle": "Bestätigen Sie zuerst die Hardware",
|
||||
"warningBody": "Wenn eine erwartete PCIe-/M.2-Coral fehlt, Bereinigung abbrechen und Karte, Steckplatz sowie Firmware prüfen."
|
||||
},
|
||||
"reinstallUninstall": {
|
||||
"heading": "Neuinstallieren oder Deinstallieren",
|
||||
"intro": "Bei erkannter PCIe-Installation mit <code>gasket-dkms</code>, USB mit <code>libedgetpu1-std</code>/<code>libedgetpu1-max</code> oder beiden erscheint ein Aktionsmenü.",
|
||||
"imageAlt": "Menü zum Neuinstallieren, Aktualisieren oder Entfernen von Coral",
|
||||
"imageCaption": "Das Menü erscheint bei vorhandenen Komponenten: gasket-DKMS-Eintrag, Paket <code>libedgetpu1-*</code> oder Geräte <code>/dev/apex_*</code>.",
|
||||
"reinstallHeading": "Neuinstallation / Update",
|
||||
"reinstallBody": "Führt die normale Installation aus: Neubau nach Kernelwechsel oder Aktualisierung von <code>libedgetpu1-*</code> aus Googles Repository. Bereinigt zuvor alten DKMS-Status, damit ein fehlgeschlagener Versuch den Build nicht blockiert.",
|
||||
"uninstallHeading": "Deinstallieren – Was entfernt wird",
|
||||
"uninstallIntro": "Erfordert eine Bestätigung. LXC-Apps mit <code>/dev/apex_*</code> können während der Entfernung oder nach dem nächsten Neustart den Zugriff verlieren. Ablauf:",
|
||||
"uninstallItems": [
|
||||
"Versucht, <code>apex</code> und <code>gasket</code> zu entladen; aktive Nutzung kann dies verhindern.",
|
||||
"Entfernt jeden DKMS-registrierten <code>gasket/<version></code>-Eintrag, damit die Module nicht bei der nächsten Kernel-Installation zurückkommen.",
|
||||
"Entfernt <code>gasket-dkms</code>, <code>libedgetpu1-std</code> und <code>libedgetpu1-max</code> vollständig und führt <code>apt-get autoremove --purge</code> aus.",
|
||||
"Löscht <code>/etc/udev/rules.d/99-coral-apex.rules</code> und stellt die Standardgruppe in <code>60-gasket-dkms.rules</code> wieder her, falls vorhanden.",
|
||||
"Prüft die zusätzlichen Mitglieder von <code>apex</code>. <strong>Bei leerer Liste</strong> wird die Gruppe zu entfernen versucht, sonst bleibt <code>apex</code> mit Mitgliederhinweis erhalten. Benutzer mit dieser primären Gruppe werden nicht vollständig geprüft.",
|
||||
"Entfernt die Repository-Liste <code>/etc/apt/sources.list.d/coral-edgetpu.list</code>, die alte <code>coral-cloud.list</code> und alte Schlüsselbunde namens <code>coral-edgetpu-archive-keyring.gpg</code>. Der aktuelle Schlüsselbund unter <code>/etc/apt/keyrings/coral-edgetpu.gpg</code> wird durch diesen Ablauf nicht entfernt.",
|
||||
"Bietet einen Neustart <strong>nur bei zuvor installiertem PCIe-Pfad</strong> an, um noch aktive Module zu entladen. Reine USB-Entfernung braucht keinen Neustart."
|
||||
],
|
||||
"lxcWarnTitle": "LXC Container mit apex Passthrough",
|
||||
"lxcWarnBody": "Das Entfernen der Host-Komponenten kann den LXC-Gerätezugriff unterbrechen. Wartung einplanen, wenn kompatible Anwendungen wie Frigate diese Coral benötigen."
|
||||
},
|
||||
"updates": {
|
||||
"heading": "Update-Benachrichtigungen",
|
||||
"intro": "ProxMenux erfasst installierte Coral-Komponenten und prüft PCIe/M.2 und USB getrennt. Sind beide vorhanden, nutzt jede Variante ihre eigene Versionsquelle:",
|
||||
"headerVariant": "Variante",
|
||||
"headerTracked": "Erfasste Version",
|
||||
"headerUpstream": "Versionsquelle",
|
||||
"pcieVariant": "PCIe / M.2",
|
||||
"pcieTracked": "Zuerst das nach erfolgreicher Installation erfasste Release-Tag, dann die Version eines intakten <code>gasket-dkms</code>-Pakets, ersatzweise die DKMS-Modulversion. Diese allein gibt den Patchstand des Forks nicht an.",
|
||||
"pcieUpstream": "Neuestes GitHub-Tag von <code>feranick/gasket-driver</code>; sieben Tage Cache und Vergleich der Buildnummer.",
|
||||
"usbVariant": "USB",
|
||||
"usbTracked": "<code>libedgetpu1-std</code> oder <code>libedgetpu1-max</code> apt Version",
|
||||
"usbUpstream": "Lokaler <code>apt-cache policy</code>-Kandidat (Google Coral apt repo)",
|
||||
"outro": "Bei einer neueren Version sendet Monitor <code>coral_driver_update_available</code> über aktivierte Kanäle. Der Hinweis führt zum Installer: <strong>Neu installieren / aktualisieren</strong> auswählen.",
|
||||
"antiTitle": "Keine wiederholten Hinweise",
|
||||
"antiBody": "Ein Hinweis je Variante bei neuer verfügbarer Version. Keine Wiederholung bei jeder täglichen Prüfung; erst eine weitere Version löst den nächsten Hinweis aus.",
|
||||
"rebootTitle": "PCIe-Updates: Neustart einplanen",
|
||||
"rebootBody": "Ein neu gebautes PCIe-Modul muss geladen werden; ein geplanter Neustart prüft auch automatisches Laden. Das USB-Bibliotheksupdate braucht keinen Host-Neustart, aber Anwendungen mit der alten Bibliothek müssen gegebenenfalls neu starten."
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Manuelle Vorgehensweise",
|
||||
"intro": "Diese Befehle zeigen die wichtigsten Schritte beider Pfade zum Nachlesen oder manuellen Ausführen.",
|
||||
"pcieHeading": "PCIe / M.2 (gasket + apex über DKMS)",
|
||||
"usbHeading": "USB (libedgetpu-Laufzeit)"
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Überprüfung",
|
||||
"pcieHeading": "PCIe / M.2",
|
||||
"usbHeading": "USB"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Fehlerbehebung",
|
||||
"dkmsFailTitle": "DKMS-Build schlägt nach Kernelupdate fehl",
|
||||
"dkmsFailBody": "Fehlende Header sind eine mögliche Ursache. <code>proxmox-headers-$(uname -r)</code> mit <code>dpkg -l proxmox-headers-$(uname -r)</code> prüfen und gegebenenfalls installieren. Im Buildprotokoll nach Quellcode-/Kernelproblemen suchen. Erneutes Ausführen ruft <code>cleanup_broken_gasket_dkms</code> auf, garantiert aber keine Kernelkompatibilität.",
|
||||
"apexMissTitle": "/dev/apex_0 fehlt nach dem Neustart",
|
||||
"apexMissBody": "PCIe-Erkennung und Modul für den laufenden Kernel prüfen. <code>modprobe apex</code> versuchen und <code>dmesg | grep -iE \"apex|gasket\"</code> prüfen. Build-, Lade- oder Steckplatz-/Firmwareprobleme können das Gerät verhindern.",
|
||||
"lxcMissTitle": "Host sieht /dev/apex_0, LXC jedoch nicht",
|
||||
"lxcMissBody": "Ein sichtbarer Geräteknoten beweist noch keine Funktion. Erst Host-Zugriff, dann LXC-Mount, cgroup-Regeln und numerische UID/GID-Rechte prüfen. Siehe <lxcLink>Coral TPU zu einem LXC hinzufügen</lxcLink>.",
|
||||
"usbUnreachTitle": "USB Accelerator erkannt, aber Frigate / TFLite kann es nicht erreichen",
|
||||
"usbUnreachBody": "Regeln von <code>libedgetpu1-std</code> und Rechte mit <code>ls -l /dev/bus/usb/*/*</code> prüfen. Gemappte App-Benutzer/-Gruppen brauchen Lese-/Schreibzugriff; root als Eigentümer allein ist kein Fehler. Nach Regeländerungen <code>udevadm control --reload-rules && udevadm trigger</code> ausführen und bei Bedarf neu verbinden.",
|
||||
"logTitle": "Installationsprotokoll",
|
||||
"logBody": "Jeder Lauf schreibt <code>/tmp/coral_install.log</code>. Bei DKMS-Fehlern werden, sofern vorhanden, die letzten 50 Zeilen von <code>/var/lib/dkms/gasket/1.0/build/make.log</code> ergänzt. Das Protokoll bei Supportanfragen beifügen."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Verwandte Themen",
|
||||
"items": [
|
||||
{
|
||||
"label": "Coral TPU zu LXC hinzufügen",
|
||||
"href": "/docs/hardware/coral-tpu-lxc",
|
||||
"tail": " — Coral vom Host einem Container mit kompatibler App bereitstellen."
|
||||
},
|
||||
{
|
||||
"label": "Installieren Sie NVIDIA Treiber (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": "— die gleiche Idee für NVIDIA GPUs."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor — Register Hardware",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — das Coral-Fenster zeigt Treiber, Module, Geräte und Laufzeitstatus sowie Temperatur bei vorhandenem unterstütztem Sensor."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,175 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "NVIDIA auf dem Host installieren | ProxMenux-Dokumentation",
|
||||
"description": "Proprietäre NVIDIA-Treiber mit ProxMenux auf Proxmox VE installieren: GPU-Filterung, Build- und DKMS-Prüfungen, Persistenzdienst, optionaler NVENC-Patch und Bibliotheksaktualisierung in LXC."
|
||||
},
|
||||
"header": {
|
||||
"title": "NVIDIA-Treiber auf dem Host installieren",
|
||||
"description": "NVIDIA auf dem Proxmox-VE-Host installieren. Filtert gepflegte Zweige nach GPU-PCI-ID, prüft den Build, nutzt DKMS, verwaltet nouveau und installiert den Persistenzdienst. Kann außerdem Bibliotheken in LXC mit NVIDIA-Zugriff aktualisieren.",
|
||||
"section": "Hardware: GPUs und Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Funktionsweise",
|
||||
"body": "ProxMenux erkennt die GPU und bietet gepflegte NVIDIA-Zweige an, die ihre PCI-ID aufführen. Es sperrt <code>nouveau</code>, lädt den offiziellen <code>.run</code>-Installer, nutzt DKMS, installiert <code>nvidia-persistenced</code>, udev-Regeln und das NVIDIA Container Toolkit und bietet einen optionalen NVENC-Patch an. Build-Prüfungen beziehen sich auf den laufenden Kernel; erfolgreiche Kompilierung garantiert nicht, dass jede App funktioniert. Vorhandenen NVIDIA-LXC wird eine Aktualisierung der Userspace-Bibliotheken angeboten, versionsgleich außer unter Arch."
|
||||
},
|
||||
"who": {
|
||||
"heading": "Für wen ist das?",
|
||||
"body": "Für GPU-beschleunigte Video- oder Rechenanwendungen wie Plex, Jellyfin, Frigate, Immich oder Stable Diffusion <strong>in LXC</strong> zuerst den NVIDIA-Treiber auf dem Proxmox-<em>Host</em> installieren. Die direkte Zuweisung an eine <strong>VM</strong> nutzt den separaten VFIO-Ablauf."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Vorbereitung",
|
||||
"gpu": "<strong>Eine NVIDIA-GPU</strong> im Host. Sie wird automatisch erkannt; AMD und Intel werden hier nicht verwaltet.",
|
||||
"gpuCheck": "lspci | grep -i nvidia",
|
||||
"notVm": "Die GPU <strong>darf nicht per VFIO für eine VM reserviert sein</strong>. Der Installer verweigert diesen Fall, um die Zuweisung nicht zu beeinträchtigen.",
|
||||
"internet": "Internetzugang auf dem Host. Der Installer lädt den Treiber von <code>download.nvidia.com</code> herunter und klont optional <code>nvidia-persistenced</code> und <code>nvidia-patch</code> von GitHub.",
|
||||
"space": "Platz in <code>/opt/nvidia</code> für <code>.run</code> und RAM für die Kompilierung einplanen. Der Nicht-Arch-LXC-Pfad prüft auf 1500 MiB freien Platz und kann bei geringerem RAM eine temporäre Erhöhung auf 2048 MiB anfragen; danach wird das alte Limit wiederhergestellt. Host-Neustart einplanen."
|
||||
},
|
||||
"vmWarn": {
|
||||
"title": "GPU für VM reserviert? Hier stoppen",
|
||||
"body": "Ist ein NVIDIA-Gerät an <code>vfio-pci</code> gebunden, beendet sich der Installer auch bei gestoppter VM. Eine Reservierung bedeutet nicht zwingend aktive VM-Nutzung. Planen Sie die Rückkehr zum Host-Treiber und entfernen Sie alte VM-/VFIO-Zuweisungen vor Neustart und Installation."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Ausführen des Installateurs",
|
||||
"body": "Öffnen Sie <strong>Hardware Graphics → NVIDIA GPU Driver Installer</strong> in ProxMenux. Das Menü hängt davon ab, ob bereits ein Treiber aktiv ist.",
|
||||
"imageAlt": "Hardware-Menü mit markiertem NVIDIA-Installer"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Ablauf des Skripts",
|
||||
"body": "Erkennt Geräte, wählt eine Version und installiert. Vor der Übersicht kann eine separat bestätigte VFIO-Bereinigung erfolgen. Repository-/Header-Vorbereitung und Download gehen dem Treiberaustausch voraus; nicht alle Änderungen beginnen erst nach einer einzigen Abschlussbestätigung."
|
||||
},
|
||||
"walkthrough": {
|
||||
"detect": {
|
||||
"title": "GPU Erkennung und Übersicht",
|
||||
"body1": "Zeigt NVIDIA-Grafikcontroller, Treiberstatus oder <em>„Kein NVIDIA-Treiber installiert“</em> sowie LXC mit konfiguriertem NVIDIA-Zugriff und deren Treiberversion.",
|
||||
"body2": "GPU sowie Host-/Container-Versionen prüfen. Bei unerwarteter Auswahl in der Übersicht abbrechen; eine zuvor separat bestätigte VFIO-Bereinigung wurde bereits angewendet.",
|
||||
"imageAlt": "Installationsübersicht mit GPUs, Treiberstatus und NVIDIA-LXC"
|
||||
},
|
||||
"version": {
|
||||
"title": "Wählen Sie die Treiberversion",
|
||||
"body1": "Filtert Versionen von <code>nvidia.com</code>, die <strong>die GPU-PCI-ID in der Liste unterstützter Chips enthalten</strong>, und sortiert Beta-/Entwicklerversionen heuristisch aus. <em><Version> — Empfohlen</em> bevorzugt den neuesten Stand des installierten Zweigs, danach den Production Branch und zuletzt die höchste unterstützte Versionsnummer.",
|
||||
"body2": "Ist der Treiber als mit keylase gepatcht erfasst, beschränkt die Auswahl sich auf die NVENC-Patch-Tabelle. <em>Neu installieren / aktualisieren</em> enthält weiterhin Bestätigungen und Patch-Abfragen; Ergebnis prüfen.",
|
||||
"whyTitle": "Wie die Kernel-Kompatibilität validiert wird",
|
||||
"whyBody": "Filtert nach gepflegten Zweigen und GPU-PCI-Unterstützung statt einer festen Kernel-/Treiber-Matrix. Ein Vorab-Build prüft den laufenden Kernel. Bestätigtes Scheitern führt zur Auswahl zurück; ein nicht verfügbarer Vorabtest kann nur warnen und fortfahren. Abschließende Installation und Laufzeitprüfung bleiben nötig.",
|
||||
"imageAlt": "Auswahl GPU-kompatibler Zweige mit Empfehlung oben"
|
||||
},
|
||||
"uninstall": {
|
||||
"title": "Vorhandenen Treiber vor Neuinstallation entfernen",
|
||||
"body": "Nach Download und Prüfung des gewählten Installers wird der vorhandene Treiber entfernt. Stoppt NVIDIA-Dienste, entlädt Module, entfernt DKMS-Einträge und bereinigt <code>nvidia-*</code> / <code>libnvidia-*</code> / <code>cuda-*</code>. Gilt auch bei bestätigter Neuinstallation derselben Version."
|
||||
},
|
||||
"prepare": {
|
||||
"title": "System vorbereiten",
|
||||
"body": "Während der Vorbereitung führt das Skript Folgendes aus:",
|
||||
"items": [
|
||||
"Prüft Paketquellen vor Entfernung oder Installation. Ohne Abonnement und mit ausschließlich Enterprise-Repository fragt es nach dem Wechsel zu no-subscription; bei Ablehnung stoppt die Installation.",
|
||||
"Installiert <code>pve-headers-$(uname -r)</code> (oder <code>proxmox-headers-$(uname -r)</code>), <code>build-essential</code> und <code>dkms</code>.",
|
||||
"Erstellt die von ProxMenux verwaltete Datei <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code> mit <code>blacklist nouveau</code> und <code>options nouveau modeset=0</code>. Erfasst eine zusätzlich eingefügte Zeile in <code>blacklist.conf</code> und versucht, nouveau zu entladen.",
|
||||
"Schreibt <code>/etc/modules-load.d/nvidia-vfio.conf</code> mit <code>nvidia</code> und <code>nvidia_uvm</code>, so dass die Module beim Booten früh geladen werden."
|
||||
]
|
||||
},
|
||||
"download": {
|
||||
"title": "Download und Ausführen des NVIDIA-Installationsprogramms",
|
||||
"body": "Lädt <code>NVIDIA-Linux-x86_64-<version>.run</code> nach <code>/opt/nvidia</code> und prüft Dateigröße und ausführbaren Dateityp. Das ist keine kryptografische Signaturprüfung. Registriert DKMS für Neubauten bei Kerneländerungen; kompatibler Quellcode und Kernel bleiben nötig.",
|
||||
"imageAlt": "Download-Fortschritt und DKMS-Build des NVIDIA-Installers"
|
||||
},
|
||||
"persist": {
|
||||
"title": "Persistenzdienst und Udev-Regeln",
|
||||
"body": "Installiert <persistLink>nvidia-persistenced</persistLink> und schreibt <code>/etc/udev/rules.d/70-nvidia.rules</code> zur Erstellung von <code>/dev/nvidia*</code> beim Start. Das hilft, LXC-Zugriffe vor Bereitstellung der Gerätedateien zu vermeiden."
|
||||
},
|
||||
"nvenc": {
|
||||
"title": "Optional: NVENC-Patch anwenden",
|
||||
"body": "NVENC-Sitzungsgrenzen hängen von GPU und Treiber ab. <patchLink>keylase/nvidia-patch</patchLink> kann die Treibergrenze für unterstützte Versionen entfernen. Wählen Sie <strong>Ja</strong>, wenn Sie diese Encoding-Änderung benötigen und Ihre Version unterstützt wird. Dekodierung und Hardwarekapazität werden dadurch nicht verbessert.",
|
||||
"supportTitle": "Patch-Unterstützung prüfen",
|
||||
"supportBody": "Exakte Version in der <patchTableLink>Patch-Tabelle</patchTableLink> prüfen. Fehlt sie, den Treiber ungepatcht nutzen oder eine andere gepflegte Version wählen, die GPU, Kernel und Patch unterstützt; nicht allein nach Nähe in der Liste auswählen."
|
||||
},
|
||||
"propagate": {
|
||||
"title": "Optional: NVIDIA-Bibliotheken in LXC aktualisieren",
|
||||
"body1": "Bietet passende Treiberbibliotheken für erkannte LXC an. Sie und das Host-Modul <strong>müssen übereinstimmende Versionen haben</strong>; andernfalls kann <code>nvidia-smi</code> „version mismatch“ melden.",
|
||||
"body2": "Debian / Ubuntu und andere glibc-Container erhalten den entpackten <code>.run</code>-Installer mit <code>--no-kernel-modules --no-dkms --no-install-compat32-libs</code>; RAM kann vorübergehend auf 2 GiB erhöht und danach zurückgesetzt werden. <strong>Arch, Manjaro und EndeavourOS</strong> nutzen <code>pacman -Syu nvidia-utils</code> aus ihren Paketquellen, ohne Bindung an die Host-Version: Ergebnis prüfen. <strong>Alpine</strong> erhält entpackte <code>.run</code>-Dateien per <code>pct push</code>, installiert <code>gcompat</code> und <code>binutils</code> mit <code>apk</code> und erstellt SONAME-Links per <code>readelf</code>. Funktion prüfen; die Kompatibilitätsschicht garantiert nicht alle Bibliotheken auf musl.",
|
||||
"imageAlt": "Dialog mit NVIDIA-LXC und Versionen zur Bestätigung des Updates"
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Neustart",
|
||||
"body": "Nach der Treiberinstallation erstellt das Skript <code>initramfs</code> für alle Kernel neu; sein letzter Schritt bietet einen Neustart an. <strong>Diesen Neustart einplanen</strong>, um die dauerhafte Modul- und nouveau-Konfiguration bei einem frischen Start zu prüfen, auch wenn der neue Treiber vor dem Neustart bereits antwortet."
|
||||
}
|
||||
},
|
||||
"reinstallUninstall": {
|
||||
"heading": "Neuinstallieren oder Deinstallieren",
|
||||
"intro": "Sind <code>nvidia</code> geladen und eine Version über <code>nvidia-smi</code> verfügbar, erscheint ein Aktionsmenü. Das erkennt einen aktiven Treiber; installierte Dateien können auch ohne geladenes Modul vorhanden sein.",
|
||||
"imageAlt": "Das Aktionsmenü NVIDIA wird angeboten, wenn ein Treiber bereits installiert ist – zwei Möglichkeiten: Treiber neu installieren / aktualisieren oder den Treiber NVIDIA vollständig deinstallieren",
|
||||
"imageCaption": "Das Aktionsmenü erscheint nur, wenn ein NVIDIA-Treiber derzeit auf dem Host aktiv ist.",
|
||||
"reinstallHeading": "Neuinstallation / Update",
|
||||
"reinstallBody": "Wählt eine Version, bereitet Paketquellen/Headers vor, lädt herunter und prüft den Build vor dem Treiberaustausch. Ermöglicht Updates innerhalb eines gepflegten Zweigs oder einen unterstützten Zweigwechsel. Danach erscheinen erneut Abfragen zu LXC-Bibliotheken und NVENC-Patch.",
|
||||
"uninstallHeading": "Deinstallieren – Was entfernt wird",
|
||||
"uninstallIntro": "Nach einer Ja/Nein-Bestätigung werden folgende Komponenten entfernt:",
|
||||
"uninstallItems": [
|
||||
"Stoppt und deaktiviert <code>nvidia-persistenced</code> und <code>nvidia-powerd</code>, versucht, <code>nvidia_uvm</code>, <code>nvidia_drm</code>, <code>nvidia_modeset</code> und <code>nvidia</code> zu entladen, und führt dann <code>nvidia-uninstall --silent</code> für die <code>.run</code>-Installation aus. Von NVIDIA abhängige LXC-Workloads sind betroffen; aktive Clients können das Entladen verhindern.",
|
||||
"Führt <code>apt purge</code> auf <code>nvidia-*</code>, <code>libnvidia-*</code>, <code>cuda-*</code> und <code>libcudnn*</code> aus, entfernt den DKMS-Quellbaum sowie die Ordner <code>nvidia-persistenced</code> und <code>nvidia-patch</code> unter <code>/opt/nvidia</code>.",
|
||||
"Entfernt die Module-Load Config (<code>/etc/modules-load.d/nvidia-vfio.conf</code>) und die Nouveau Blacklist-Einträge von ProxMenux. Legacy zweizeilige ProxMenux-Blacklist-Dateien werden migriert und entfernt; modifizierte oder nicht verwandte Administratordateien bleiben erhalten.",
|
||||
"Entfernt <code>/etc/udev/rules.d/70-nvidia.rules</code> und setzt den NVENC-Status im verwalteten Installationsverzeichnis auf <em>removed</em>; es gibt keine separate Statusdatei.",
|
||||
"Erstellt <code>initramfs</code> für alle Kernel neu, führt passend zur Bootkonfiguration <code>proxmox-boot-tool refresh</code> aus und fragt nach einem Neustart."
|
||||
],
|
||||
"lxcWarnTitle": "LXC mit NVIDIA-Zugriff",
|
||||
"lxcWarnBody": "Das Entfernen des Host-Treibers unterbricht NVIDIA-abhängige LXC-Anwendungen, auch wenn ihre Bibliotheken installiert bleiben. Wartungszeit für Frigate, Plex, Jellyfin, Ollama und andere GPU-Apps einplanen."
|
||||
},
|
||||
"updates": {
|
||||
"heading": "Update-Benachrichtigungen",
|
||||
"body": "Der installierte NVIDIA-Treiber wird im Verzeichnis der von ProxMenux verwalteten Installationen erfasst. Beim Start und alle 24 Stunden vergleicht der Monitor die unter <code>download.nvidia.com/XFree86/Linux-x86_64/</code> verfügbaren Versionen mit der von <code>nvidia-smi</code> gemeldeten Version. Er benachrichtigt nur, wenn im installierten Versionszweig ein neueres Wartungsrelease verfügbar ist.",
|
||||
"kindsHeading": "Update-Meldung",
|
||||
"kindsItems": [
|
||||
"<strong>Wartungsupdate im gleichen Zweig.</strong> Beispiel: installiert 580.65.06 → verfügbar 580.105.08. Monitor leitet daraus keine Kernel-Kompatibilität anderer Zweige ab."
|
||||
],
|
||||
"antiTitle": "Wiederholte Meldungen vermeiden",
|
||||
"antiBody": "Eine Meldung pro neuer Version statt bei jeder täglichen Prüfung. Ohne neuere Version im installierten Zweig bleibt die Meldung aus.",
|
||||
"applyTitle": "Anwendung der Aktualisierung",
|
||||
"applyBody": "Monitor meldet Updates ohne automatische Installation. Im Installer <strong>Neu installieren / aktualisieren</strong> und eine unterstützte Version wählen, dann Build und Installation abschließen. Der Ablauf endet mit einer Neustartabfrage; Neustart einplanen und danach Host sowie LXC-Bibliotheken prüfen."
|
||||
},
|
||||
"verify": {
|
||||
"heading": "Installation überprüfen",
|
||||
"intro": "Nach dem Host-Neustart per SSH oder Proxmox-Shell anmelden und ausführen:",
|
||||
"after": "GPU und erwartete Treiberversion prüfen. Prozesse können bereits erscheinen, wenn Host-Dienste oder automatisch gestartete Container die GPU nutzen. Danach den Persistenzdienst prüfen:",
|
||||
"imageAlt": "Ausgabe von nvidia-smi auf dem Host mit der erkannten GPU und der installierten Treiberversion"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Fehlerbehebung",
|
||||
"smiFailTitle": "nvidia-smi meldet „NVIDIA-SMI has failed“",
|
||||
"smiFailBody": "Mögliche Ursachen sind <strong>nouveau</strong>, <strong>fehlende oder unpassende Kernel-Header</strong>, inkompatibler Treiberquellcode oder andere Ladefehler. <code>lsmod | grep nouveau</code>, <code>dmesg | grep -i nvidia</code> und Installer-/DKMS-Protokolle prüfen. Bei fehlerhafter nouveau-Regel zuerst <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code> prüfen, dann <code>update-initramfs -u -k all</code> und Neustart. Nicht jeder Buildfehler betrifft Headers.",
|
||||
"lxcMissTitle": "LXC Container kann GPU nach dem Host-Update nicht sehen",
|
||||
"lxcMissBody": "Vor Neuinstallation Host-Geräte, LXC-Berechtigungen und Bibliotheksversion prüfen. Bei Versionskonflikten passende Userspace-Treiber über den unterstützten Distributionsweg installieren; auf glibc mit <code>--no-kernel-modules</code>. Bibliotheksinstallation repariert keine fehlenden Mounts oder Berechtigungen.",
|
||||
"logTitle": "Überprüfen Sie das Installationsprotokoll",
|
||||
"logBody": "Die Installation protokolliert in <code>/tmp/nvidia_install.log</code>. Bei Fehlern Download, DKMS-Build und Dienste prüfen. Fügen Sie das Protokoll dem GitHub-Fehlerbericht bei."
|
||||
},
|
||||
"manualSteps": {
|
||||
"heading": "Suchen Sie die manuellen Schritte?",
|
||||
"body": "Unter <guideLink>Anleitungen → NVIDIA</guideLink> stehen manuelle Grundlagen mit <code>wget</code> und <code>./NVIDIA-Linux-...run</code>. Sie erklären Komponenten, bilden den Installer aber nicht exakt ab. Der gepflegte ProxMenux-Ablauf bietet GPU-Filterung, Build-Prüfung, LXC-Updates und VFIO-Prüfungen."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Verwandte Themen",
|
||||
"items": [
|
||||
{
|
||||
"label": "GPU zu VM hinzufügen (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — NVIDIA direkt per VFIO einer VM zuweisen."
|
||||
},
|
||||
{
|
||||
"label": "GPU zu LXC hinzufügen",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — NVIDIA mit einem oder mehreren Containern teilen."
|
||||
},
|
||||
{
|
||||
"label": "GPU-Modus wechseln (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — zwischen VM-Passthrough und gemeinsamer LXC-Nutzung wechseln."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor — Register Hardware",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — GPU-Dialog zum Öffnen dieses Installers und zur Live-Überwachung."
|
||||
},
|
||||
{
|
||||
"label": "Befehle für GPU-Passthrough",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": "— lspci / dmesg / IOMMU / nvidia-smi-Referenz."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,172 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "GPU-Modus wechseln (VM ↔ LXC) | ProxMenux-Dokumentation",
|
||||
"description": "GPU zwischen VFIO für VMs und nativem Treiber für LXC umschalten. ProxMenux erkennt den Treiber, fragt nach dem Umgang mit betroffenen Gästen, entfernt zugehörige Audiozuweisungen und erstellt bei Host-Konfigurationsänderungen initramfs neu."
|
||||
},
|
||||
"header": {
|
||||
"title": "GPU-Modus wechseln (VM ↔ LXC)",
|
||||
"description": "Zugewiesene GPU zwischen VM-Passthrough und LXC-Nutzung umschalten. ProxMenux verwaltet Treiberbindung, VFIO, Module und initramfs und fragt nach dem Umgang mit betroffenen Gästen. Prüfen Sie die Auswahl und nach dem Neustart die Konfiguration.",
|
||||
"section": "Hardware: GPUs und Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Funktionsweise",
|
||||
"body": "Mit <code>vfio-pci</code> ist die GPU für eine VM reserviert. Mit nativem Treiber <em>(i915 / amdgpu / nvidia)</em> können Host und LXC sie teilen. <strong>GPU-Modus wechseln</strong> verwaltet <code>vfio.conf</code>, Treibersperren und Gastzuweisungen und meldet verbleibende Verweise."
|
||||
},
|
||||
"graphics": {
|
||||
"lxcTitle": "Bereit für LXC-Container",
|
||||
"lxcDesc": "Nativer Treiber aktiv",
|
||||
"vmTitle": "Bereit für VM-Passthrough",
|
||||
"vmDesc": "VFIO-PCI-Treiber aktiv"
|
||||
},
|
||||
"when": {
|
||||
"heading": "Wann sollte ich das verwenden?",
|
||||
"intro": "Verwenden Sie dies, wenn die GPU <strong>bereits zugewiesen</strong> ist und anders genutzt werden soll:",
|
||||
"headerSituation": "Lage",
|
||||
"headerUse": "Nutzen Sie diese Seite?",
|
||||
"rows": [
|
||||
{
|
||||
"situation": "GPU frei und noch nie zugewiesen: einer VM zuweisen.",
|
||||
"useRich": "Nein — <vmLink>GPU zu VM hinzufügen</vmLink> verwenden"
|
||||
},
|
||||
{
|
||||
"situation": "GPU frei und noch nie zugewiesen: einem LXC zuweisen.",
|
||||
"useRich": "Nein — <lxcLink>GPU zu LXC hinzufügen</lxcLink> verwenden"
|
||||
},
|
||||
{
|
||||
"situationRich": "Die GPU ist einer VM über <code>vfio-pci</code> zugewiesen; ich möchte sie stattdessen in einem LXC nutzen.",
|
||||
"useRich": "<strong>Ja — diese Seite.</strong>"
|
||||
},
|
||||
{
|
||||
"situation": "Die GPU wird mit einem LXC geteilt; ich möchte sie exklusiv einer VM zuweisen.",
|
||||
"useRich": "<strong>Ja — diese Seite.</strong>"
|
||||
},
|
||||
{
|
||||
"situation": "Ich möchte alle Gastzuweisungen dieser GPU entfernen.",
|
||||
"use": "Der LXC-Modus gibt die GPU an den Host-Treiber zurück; die VM-Konfliktrichtlinie kann hostpci-Einträge entfernen, LXC-Geräteeinträge müssen jedoch separat entfernt werden. Die GPU bleibt dabei an einen Treiber gebunden."
|
||||
}
|
||||
]
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Vorbereitung",
|
||||
"assigned": "<strong>Bereits zugewiesene GPU</strong> in einer VM über VFIO oder in einem LXC. Für die erste Zuweisung GPU zu VM / LXC hinzufügen verwenden.",
|
||||
"iommu": "<strong>IOMMU muss auf dem Host aktiv sein</strong> beim Wechsel <em>in</em> den VM-Modus. Firmware-Einstellungen und Kernel-Unterstützung sind beide entscheidend. Fehlt <code>intel_iommu=on</code> oder <code>amd_iommu=on</code> im laufenden Kernel, fügt das Skript es mit <code>iommu=pt</code> zu <code>/etc/kernel/cmdline</code> (ZFS-Root-Marker) oder <code>/etc/default/grub</code> hinzu und führt dann <code>proxmox-boot-tool refresh</code> oder <code>update-grub</code> aus. Prüfen Sie eventuelle Warnungen und starten Sie bei Aufforderung neu.",
|
||||
"iommuCheck": "dmesg | grep -i 'IOMMU enabled' | head -1",
|
||||
"reboot": "<strong>Neustart einplanen.</strong> Dauerhafte Treiber- und Bootänderungen können ein neues initramfs und einen Neustart erfordern. Das Skript fragt am Ende danach.",
|
||||
"knowList": "<strong>Betroffene VMs und LXC kennen.</strong> Das Skript erkennt Verweise und fragt nach dem Umgang mit jedem Gast; eine bekannte Liste erleichtert die Prüfung."
|
||||
},
|
||||
"blocklist": {
|
||||
"title": "Nicht alle GPUs können sicher an einen VM übergeben werden",
|
||||
"body": "Das Skript sperrt den VM-Modus für die Geräte-IDs <code>8086:5a84</code> und <code>8086:5a85</code> gemäß seiner Kompatibilitätsrichtlinie. Passt eine gewählte GPU, bricht es den Wechsel in den VM-Modus ab und kehrt zur GPU-Auswahl zurück oder beendet sich, wenn es die einzige GPU ist. Diese Sperrliste verhindert nicht den Wechsel <em>in</em> den LXC-Modus; andere Prüfungen können weiterhin gelten."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Skript ausführen",
|
||||
"body": "Öffnen Sie <strong>Hardware: GPUs und Coral-TPU → GPU-Modus wechseln (VM ↔ LXC)</strong> in ProxMenux.",
|
||||
"imageAlt": "Menüpunkt GPU-Modus wechseln (VM ↔ LXC) im Hardware-Menü"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Ablauf des Skripts",
|
||||
"body": "GPU-Auswahl und Richtung werden vor dem Hauptwechsel geprüft. Eine separate Bereinigung veralteter VFIO-Einträge kann schon vorher fragen; betroffene Gäste haben eigene Konfliktdialoge. Jede Bestätigung lesen: Nicht alle Änderungen sind durch eine einzige Abschlussbestätigung abgedeckt."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Schritt für Schritt",
|
||||
"detect": {
|
||||
"title": "GPUs und aktuellen Treiber erkennen",
|
||||
"body": "Erfasst VGA-, 3D- und Display-Controller des Hosts und prüft <code>/sys/bus/pci/devices/*/driver</code>. Zeigt Name, PCI-Adresse und aktuellen Treiber jeder GPU zur Erkennung des Modus.",
|
||||
"imageAlt": "GPU Checkliste mit jedem erkannten GPU mit seinem aktuellen Treiber (vfio-pci / nvidia / amdgpu / i915) und PCI-Slot"
|
||||
},
|
||||
"pickGpu": {
|
||||
"title": "GPUs zum Umschalten auswählen",
|
||||
"body": "Eine GPU wird automatisch gewählt. Bei mehreren können Sie mehrere markieren, sofern alle im <em>gleichen</em> Modus sind. Bei gemischten Modi müssen Sie die Auswahl eingrenzen.",
|
||||
"tipTitle": "Mehrere GPUs gemeinsam umschalten",
|
||||
"tipBody": "Beispiel: drei NVIDIA-GPUs in den VM-Modus schalten, danach die iGPU in den LXC-Modus zurückgeben. Zwei Durchläufe mit jeweils gemeinsamem Ziel statt einzelner Aufrufe pro Karte."
|
||||
},
|
||||
"direction": {
|
||||
"title": "Überprüfung der vorgeschlagenen Richtung",
|
||||
"intro": "Basierend auf dem aktuellen Modus schlägt das Skript das Gegenteil als Ziel vor:",
|
||||
"items": [
|
||||
"<strong>VM → LXC:</strong> Entfernt die Bindung an <code>vfio-pci</code>, damit der native Treiber (<code>nvidia</code>, <code>amdgpu</code>, <code>i915</code>) die GPU nutzen kann. Bei NVIDIA werden die betreffenden BDF-Einträge aus <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> für den nächsten Start entfernt.",
|
||||
"<strong>LXC → VM:</strong> bereitet die Bindung an <code>vfio-pci</code> vor. AMD / Intel sperren den nativen Treiber und nutzen <code>options vfio-pci ids=…</code>. Bei NVIDIA wird <code>nvidia</code> nur dann global gesperrt, wenn jede NVIDIA-GPU des Hosts in VFIO ist; andernfalls setzen Regeln pro BDF <code>driver_override=vfio-pci</code> für die Geräte der betroffenen IOMMU-Gruppen, und NVIDIA-GPUs außerhalb dieser Gruppen behalten <code>nvidia</code>. Prüfen Sie vor dem Wechsel alle Gruppenmitglieder."
|
||||
],
|
||||
"outro": "Bestätigen Sie die Richtung oder brechen Sie ab."
|
||||
},
|
||||
"conflict": {
|
||||
"title": "Umgang mit betroffenen VMs und LXC",
|
||||
"body": "Prüft <code>/etc/pve/lxc/*.conf</code> auf Geräteverweise nach Treiberfamilie und <code>/etc/pve/qemu-server/*.conf</code> auf PCI-Zuweisungen. Die LXC-Erkennung ordnet nicht jede Karte exakt per BDF zu. Prüfen Sie die erkannten Gäste und wählen Sie den Umgang mit jedem:",
|
||||
"headerPolicy": "Richtlinie",
|
||||
"headerEffect": "Wirkung",
|
||||
"headerWhen": "Wann zu wählen",
|
||||
"keepPolicy": "Konfiguration behalten, Autostart deaktivieren",
|
||||
"keepEffect": "<code>pct set CTID -onboot 0</code> oder <code>qm set VMID -onboot 0</code>. Die GPU-Einträge bleiben erhalten.",
|
||||
"keepWhen": "Wenn der Gast nach Rückkehr zum ursprünglichen GPU-Modus wieder genutzt werden soll. Konservative Standardwahl.",
|
||||
"removePolicy": "GPU aus config entfernen",
|
||||
"removeEffect": "Entfernt die erkannten <code>hostpci</code>- / <code>dev</code>-Einträge und unterstützte ältere Verweise.",
|
||||
"removeWhen": "Wenn der Gast ohne GPU arbeiten soll. Zuerst App-Einstellungen prüfen: CPU-Ersatzbetrieb hängt von der Anwendung ab; das Entfernen des Geräts konfiguriert sie nicht automatisch um.",
|
||||
"imageAlt": "Dialog zum Umgang mit betroffenen VMs oder LXC"
|
||||
},
|
||||
"audio": {
|
||||
"title": "Zugehörige Audiozuweisungen beim Verlassen des VM-Modus entfernen",
|
||||
"body1": "Viele dedizierte NVIDIA-/AMD-GPUs bieten HDMI-Audio als Funktion <code>.1</code> desselben Slots; weitere Audiogeräte können zugewiesen sein. Nach Entfernen der GPU können veraltete Audioeinträge vom Typ <code>hostpci</code> bleiben. Prüfen Sie, welche Zuweisungen erhalten bleiben sollen.",
|
||||
"body2": "Erkennt die Audio-BDF-Adressen und zeigt eine Auswahlliste zum Entfernen. Zugehörige Vendor:Device-IDs werden nur aus <code>/etc/modprobe.d/vfio.conf</code> entfernt, wenn keine andere VM sie nutzt."
|
||||
},
|
||||
"apply": {
|
||||
"title": "Änderungen an Host und Gästen anwenden",
|
||||
"body": "Sobald Sie bestätigen, schreibt das Skript die hostseitigen Änderungen - <code>vfio.conf</code>, Blacklist, Module und (für NVIDIA) die Per-BDF-Udev-Regel bei <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> plus den BDF-Status bei <code>/etc/proxmenux/vfio-bind.bdfs</code>. Es wendet auch die gewählte Konfliktpolitik auf jeden betroffenen VM/LXC an. Wenn sich die Host-Konfiguration tatsächlich geändert hat, läuft <code>update-initramfs -u -k all</code> gefolgt von <code>proxmox-boot-tool refresh</code>; ansonsten werden beide übersprungen."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Neustart",
|
||||
"body": "Starten Sie den Host neu, um die neue dauerhafte Bindung anzuwenden. Sie können dies verschieben, müssen aber vor dem Start des Zielgasts den aktiven Treiber prüfen: Bis zum Neustart kann noch der vorherige aktiv sein.",
|
||||
"imageAlt": "Zusammenfassungsdialog, der auflistet, was sich geändert hat, gefolgt von der Neustartaufforderung"
|
||||
}
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Manuelle Prüfung",
|
||||
"intro": "Prüfen Sie vor <strong>VM → LXC</strong> Treiber und BDF-Richtlinie. Das NVIDIA-Beispiel nutzt <code>10de:2204</code>; passen Sie es an Ihre Karte an. Die Befehle lesen den Zustand; das Skript verwaltet außerdem Gäste und IOMMU-Gruppenmitglieder.",
|
||||
"lxcToVm": "Vor <strong>LXC → VM</strong> PCI-Adresse und IOMMU-Gruppe prüfen. Ersetzen Sie die Beispieladresse und prüfen Sie vor der Zuweisung alle Gruppenmitglieder.",
|
||||
"oneVmTitle": "Eine physische VFIO-GPU kann nur eine VM gleichzeitig nutzen",
|
||||
"oneVmBody": "Das Setzen mehrerer <code>hostpci</code>-Einträge mit demselben PCI-Slot in zwei VMs ist eine gültige Konfiguration, aber nur eine der VMs kann mit dem GPU beginnen - die zweite wird fehlschlagen. Beim ProxMenux-Konfliktpolitikschritt geht es genau darum, diese Falle zu vermeiden."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Überprüfung nach dem Neustart"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Fehlerbehebung",
|
||||
"stillVfioTitle": "GPU zeigt immer noch vfio-pci nach dem Umschalten auf LXC Modus",
|
||||
"stillVfioBody": "Ein geladenes VFIO-Modul zeigt nicht, welcher Treiber diese GPU besitzt. Kartenbindung sowie Abschluss von <code>update-initramfs</code> und Neustart prüfen. <code>lsmod | grep vfio</code> listet nur Module. Bei AMD / Intel <code>vfio.conf</code> prüfen; bei NVIDIA <code>/etc/proxmenux/vfio-bind.bdfs</code> und <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code>. Alte Richtlinien vor <code>update-initramfs -u -k all</code> und Neustart korrigieren.",
|
||||
"vmFailTitle": "VM startet nach Wechsel der GPU in den LXC-Modus nicht",
|
||||
"vmFailBody": "Prüfen Sie verbliebene veraltete <code>hostpci</code>-Verweise. Die Richtlinie <em>GPU aus Konfiguration entfernen</em> kann sie beim geplanten Wechsel entfernen. Prüfen Sie vor erneutem Skriptaufruf die Richtung, um den Modus nicht versehentlich umzukehren. Alternativ die alte Zuweisung in Proxmox bei gestoppter VM entfernen.",
|
||||
"smiFailTitle": "nvidia-smi meldet „Driver/library version mismatch“ nach Rückkehr zu LXC",
|
||||
"smiFailBody": "Vergleichen Sie das geladene NVIDIA-Modul mit installierten Bibliotheken, auch in LXC. Versionen zuerst abgleichen: Ein Neustart lädt das installierte Modul, repariert aber keine unpassenden Pakete. Neuladen mit <code>modprobe -r nvidia</code> und <code>modprobe nvidia</code> erfordert gestoppte GPU-Clients und kann bei genutzten abhängigen Modulen scheitern.",
|
||||
"logTitle": "Ausführungsprotokoll",
|
||||
"logBody": "Jeder Aufruf schreibt in <code>/tmp/proxmenux_gpu_switch_mode.log</code> auf dem Host. Fügen Sie das Protokoll Ihrer GitHub-Hilfeanfrage bei."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Verwandte Themen",
|
||||
"items": [
|
||||
{
|
||||
"label": "GPU zu VM hinzufügen (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — erstmalige Einrichtung des VM-Modus."
|
||||
},
|
||||
{
|
||||
"label": "GPU zu LXC hinzufügen",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — erstmalige Einrichtung des LXC-Modus."
|
||||
},
|
||||
{
|
||||
"label": "Installieren Sie NVIDIA Treiber (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": "— erforderlich für den LXC-Modus auf NVIDIA-GPUs."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor — Register Hardware",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — Bereich Grafikkarten mit aktuellem Modus und Umschaltfunktion."
|
||||
},
|
||||
{
|
||||
"label": "Befehle für GPU-Passthrough",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — kurze Befehlsreferenz."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -14,18 +14,18 @@
|
||||
},
|
||||
"whenUse": {
|
||||
"heading": "When to use this",
|
||||
"body": "Typical use case: running <frigateLink>Frigate</frigateLink>, Agent DVR, Blue Iris + CodeProject.AI, or any other object-detection app inside an LXC and wanting the Coral TPU to do the ML inference instead of the CPU. With Coral, inference latency drops from ~100 ms to ~5 ms per frame and CPU load stays near zero."
|
||||
"body": "Use this for <frigateLink>Frigate</frigateLink> or another compatible Linux detection app in LXC. Coral runs supported ML inference instead of the CPU. Performance depends on the model and hardware; video decoding and other application work still consume resources."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Before you start",
|
||||
"drivers": "<strong>Coral drivers already installed on the host</strong>. This script does not install them; it only configures passthrough to the container. Run <hostLink>Install Coral TPU on the Host</hostLink> first if you haven't.",
|
||||
"drivers": "<strong>Prepare the Coral device on the host</strong>. M.2 / PCIe needs the host driver loaded; USB needs device access and suitable permissions. See <hostLink>Install Coral TPU on the Host</hostLink>. The script installs the app runtime in Debian/Ubuntu containers; other distributions must provide it separately.",
|
||||
"driversCheck": "ls /dev/apex_* 2>/dev/null ; lsusb | grep -E '1a6e:089a|18d1:9302'",
|
||||
"container": "<strong>An existing LXC container</strong>, ideally running a <strong>Debian / Ubuntu</strong>-based distro — the in-container runtime install uses <code>apt-get</code>. <strong>Non-Debian containers</strong> (Alpine, Arch, RHEL, SUSE…) are still supported in <strong>passthrough-only mode</strong>: the script detects the distro and offers a prompt to skip the <code>libedgetpu</code> APT install while still writing the device passthrough config — useful for app containers that bundle the runtime themselves (e.g. the Frigate Docker image).",
|
||||
"downtime": "<strong>Be OK with a brief downtime</strong> of the container. The script stops it to apply config changes, then starts it back up to install drivers inside. No host reboot needed."
|
||||
},
|
||||
"hostPrep": {
|
||||
"title": "Host must be prepared first",
|
||||
"body": "If you run this script before installing Coral drivers on the host (the <code>gasket</code>/<code>apex</code> kernel module for M.2, the <code>libedgetpu</code> runtime for USB), the LXC config is still written but the container won't find the device at runtime. Order matters: <strong>host install → LXC passthrough → in-container app</strong>."
|
||||
"body": "M.2 / PCIe needs the host <code>gasket</code>/<code>apex</code> driver and a working device node. USB needs the connected device and permissions; it does not require the host to run the app. The <code>libedgetpu</code> runtime must be available where the app runs. Follow <strong>host preparation → LXC device access → app setup</strong>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Running the script",
|
||||
@@ -34,39 +34,39 @@
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "How the script runs",
|
||||
"body": "One decision upfront (which container?), then the script handles USB and PCIe paths independently based on what it finds on the host. If both are present, both get passed."
|
||||
"body": "Choose the target container. The script configures USB access even if no USB Coral is currently connected, then adds M.2 / PCIe access when the corresponding hardware is detected."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Walking through the flow",
|
||||
"pick": {
|
||||
"title": "Pick the LXC container",
|
||||
"body": "A dialog shows every LXC on the host (from <code>pct list</code>). Pick the one that should get the Coral. Running or stopped, it doesn't matter — the script handles both (stops it briefly to write config, then starts it back up to install drivers)."
|
||||
"body": "The picker lists eligible containers from <code>pct list</code>; OCI-image containers are hidden and managed through OCI manager Apps. Choose the target, running or stopped. The script stops it if needed, writes configuration and starts it for runtime installation."
|
||||
},
|
||||
"gpuHint": {
|
||||
"title": "GPU passthrough suggestion (optional)",
|
||||
"body": "If the host has a GPU (Intel iGPU, AMD, NVIDIA) and the chosen container does NOT have GPU passthrough configured, the script shows a one-time dialog suggesting you run <lxcGpuLink>Add GPU to LXC</lxcGpuLink> first. Coral is most often paired with hardware video decode (Quick Sync, VA-API, NVENC) for apps like Frigate. You can say yes (exits, run the GPU script, then come back) or no (continues with TPU-only setup)."
|
||||
"body": "If a GPU is detected but not configured for this container, a dialog recommends <lxcGpuLink>Add GPU to LXC</lxcGpuLink> for hardware video decoding, such as Quick Sync, VA-API or NVENC. It asks whether to continue with Coral only: Yes continues TPU setup; No exits so you can configure the GPU first."
|
||||
},
|
||||
"usb": {
|
||||
"title": "Write LXC config — USB path",
|
||||
"body": "If a USB Accelerator is present, the script does two things: (1) writes a udev rule on the host so the device gets a stable name <code>/dev/coral</code> whatever USB port it's in, and (2) bind-mounts the <strong>whole</strong> <code>/dev/bus/usb</code> tree into the container.",
|
||||
"body": "The script creates a host udev rule for the <code>/dev/coral</code> symlink and bind-mounts the <strong>whole</strong> <code>/dev/bus/usb</code> tree into the container. This USB configuration is written even when no Coral USB is currently connected; it exposes more than just that one device.",
|
||||
"whyTitle": "Why mount /dev/bus/usb instead of /dev/coral?",
|
||||
"whyBody": "The USB device node path (e.g. <code>/dev/bus/usb/001/005</code>) changes when you replug the accelerator into a different port. Earlier versions of the script bind-mounted the <code>/dev/coral</code> symlink, which pointed at an old path and broke. Mounting the whole USB tree means the container sees whatever the current path is, so a replug just works."
|
||||
"whyBody": "USB node paths such as <code>/dev/bus/usb/001/005</code> change on reconnect. Older versions bind-mounted the <code>/dev/coral</code> symlink and could retain a stale path. Mounting the whole USB tree makes the current device node visible; the app may still need to reopen it."
|
||||
},
|
||||
"pcie": {
|
||||
"title": "Write LXC config — M.2 / PCIe path",
|
||||
"body1": "If a M.2 / PCIe Coral is present on the host and <code>/dev/apex_0</code> exists (the apex kernel module is loaded), the script uses the modern Proxmox <code>dev</code> API which handles cgroup2 permissions automatically for both privileged and unprivileged containers:",
|
||||
"body2": "If the host hasn't booted yet with the apex module loaded (you just ran <hostLink>Install Coral on Host</hostLink> and haven't rebooted), <code>/dev/apex_0</code> doesn't exist yet. The script falls back to classic cgroup2 + bind mount with <code>create=file</code> so the entries are valid even when the device hasn't materialised:",
|
||||
"body2": "If <code>/dev/apex_0</code> is absent after <hostLink>Install Coral on Host</hostLink>, the script writes a bind mount with <code>create=file</code> and, only when the apex major number is listed in <code>/proc/devices</code>, a classic cgroup2 rule. Neither creates a working device:",
|
||||
"rebootTitle": "Reboot the host first if you just installed Coral drivers",
|
||||
"rebootBody": "The fallback cgroup2 + mount will be written, but the device only actually exists after a host reboot loads the <code>apex</code> module. If you haven't rebooted, reboot now before starting the container."
|
||||
"rebootBody": "The fallback mount does not load the host <code>apex</code> driver. Load the driver, or reboot after installation, and verify the host device exists. Re-run the script once the device is ready to apply the modern device entry, then restart the container."
|
||||
},
|
||||
"drivers": {
|
||||
"title": "Start the container + install Coral runtime inside",
|
||||
"body": "Config changes in Proxmox LXC take effect on the next start — so the script starts the container, waits up to 15 seconds for <code>pct exec</code> to respond, then drops a bash script inside that:",
|
||||
"body": "The script starts the container and waits up to 15 seconds for its running status, then uses <code>pct exec</code> to run the runtime installer inside. The installer:",
|
||||
"items": [
|
||||
"Runs <code>apt-get update</code>.",
|
||||
"Installs the Coral repository prerequisites: <code>gnupg</code>, <code>curl</code>, <code>ca-certificates</code>.",
|
||||
"Imports Google's Coral GPG key to <code>/etc/apt/keyrings/coral-edgetpu.gpg</code> (modern path, same as the host installer uses) and adds the <code>coral-edgetpu-stable</code> APT repository with <code>signed-by=</code>.",
|
||||
"Installs the latest <code>libedgetpu1-std</code> (default). If you have a M.2 Coral, you'll be prompted to pick between <code>libedgetpu1-std</code> (standard) and <code>libedgetpu1-max</code> (max performance, runs hotter)."
|
||||
"Installs <code>libedgetpu1-std</code> by default. When an M.2 Coral is detected, the script offers a choice of <code>libedgetpu1-std</code> or <code>libedgetpu1-max</code>. The choice of runtime package does not itself configure application detection settings."
|
||||
],
|
||||
"noIgpuTitle": "Why no iGPU drivers here?",
|
||||
"noIgpuBody": "Earlier versions of this script also installed Intel <code>va-driver-all</code>, <code>intel-opencl-icd</code> and friends so the same container could do Quick Sync video decode alongside Coral inference. That doubled-up responsibility caused confusing failures when the user only wanted Coral. The iGPU side is now the exclusive job of <lxcGpuLink>Add GPU to LXC</lxcGpuLink> — run it first if you also want hardware video decode in the container.",
|
||||
@@ -92,15 +92,15 @@
|
||||
"troubleshoot": {
|
||||
"heading": "Troubleshooting",
|
||||
"apexTitle": "Container started but /dev/apex_0 missing inside",
|
||||
"apexBody": "Host apex module isn't loaded. On the host: <code>lsmod | grep apex</code> — if empty, run <code>modprobe apex</code>, or reboot if you just installed Coral drivers. Once the host has <code>/dev/apex_0</code>, restart the container: <code>pct stop <ctid> && pct start <ctid></code>.",
|
||||
"apexBody": "Check the host driver first: <code>lsmod | grep apex</code>. If missing, try <code>modprobe apex</code> or reboot after driver installation. Once <code>/dev/apex_0</code> exists on the host, verify the LXC device entry (re-run the script if only the fallback entries were written) and restart the container with <code>pct stop <ctid> && pct start <ctid></code>.",
|
||||
"replugTitle": "USB Coral disappears after replug in a different port",
|
||||
"replugBody": "This is exactly why the script mounts <code>/dev/bus/usb</code> instead of the <code>/dev/coral</code> symlink. If you're hitting this, check your LXC config has <code>lxc.mount.entry: /dev/bus/usb dev/bus/usb ...</code> and not a reference to <code>/dev/coral</code> directly. Old configs from earlier script versions may need updating — re-run the script on the same container and the config gets refreshed.",
|
||||
"alpineTitle": "Alpine / Arch / RHEL / SUSE container — runtime not installed",
|
||||
"alpineBody": "If you chose <em>passthrough-only mode</em> when the script prompted, the LXC config is written and the Coral device is visible inside the container, but the <code>libedgetpu</code> runtime is not installed. That's by design: Google's APT repo only ships for Debian/Ubuntu. Install the runtime manually with your distro's package manager (Alpine: <code>apk add</code>; Arch: AUR; RHEL/SUSE: build from source) following Google's official guide, or run an app container that bundles the runtime — the Frigate Docker image is the canonical example: just expose the device with <code>--device /dev/apex_0:/dev/apex_0</code> (M.2) or the USB bind mount the script already wrote (USB).",
|
||||
"alpineBody": "In <em>passthrough-only mode</em>, device configuration is written but <code>libedgetpu</code> is not installed. Use a compatible community package or build from source; check availability before using a package command such as Alpine <code>apk add</code>. An app image such as Frigate can bundle the runtime. With nested Docker, also forward the M.2 device using <code>--device /dev/apex_0:/dev/apex_0</code>, or mount the USB tree into that Docker container; the LXC mount alone does not forward it into Docker.",
|
||||
"frigateTitle": "Frigate says 'Coral EdgeTPU detected but not available'",
|
||||
"frigateBody": "Almost always a permissions issue inside the container. Frigate runs as root by default; check the root user is in the <code>plugdev</code> group inside the container (for USB), and that the process can read <code>/dev/apex_0</code> (for M.2). <code>ls -l /dev/apex_0</code> from inside the container should show group <code>apex</code> — if not, add the GID alignment to <code>/etc/group</code> or switch the container to privileged mode.",
|
||||
"frigateBody": "Check runtime availability, device visibility and read/write access for the actual app process. For USB, inspect permissions and any <code>plugdev</code> membership. For M.2, inspect <code>/dev/apex_0</code> with <code>ls -l /dev/apex_0</code>. A group name such as <code>apex</code> in <code>/etc/group</code> is not enough: numeric GIDs and LXC mappings must match. Also check whether another process already claims the TPU; do not switch to privileged mode as the first fix.",
|
||||
"logsTitle": "Check both host and container logs",
|
||||
"logsBody": "On the host: <code>journalctl -u pvedaemon | grep -i coral</code>. Inside the container: check the app logs (Frigate: <code>/config/logs/</code>, CodeProject.AI: its own log directory). The classic error pattern is \"Coral detected, runtime loaded, but inference engine can't claim it\" — that's permissions 9 out of 10 times."
|
||||
"logsBody": "On the host, inspect kernel device messages with <code>journalctl -k | grep -i -e apex -e gasket -e usb</code>. Inside the container, inspect the app logs; for nested Docker use <code>docker logs <container></code>. Permissions, missing runtime, USB connectivity or another process claiming the TPU can all cause failures."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Related",
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
},
|
||||
"intro": {
|
||||
"title": "What this does",
|
||||
"body": "Everything the <pveLink>official Proxmox PCI passthrough wiki</pveLink> walks you through manually — IOMMU enablement, VFIO modules, driver blacklisting, vendor ID discovery, <code>hostpci</code> setup, ROM dumps on AMD, KVM hiding on NVIDIA — done in one run with sanity checks at every step. The script is also aware of the <em>other</em> things on your host: if the same GPU is already assigned to an LXC or another VM, it offers to migrate cleanly instead of silently breaking the existing setup."
|
||||
"body": "Automates the relevant host and <code>hostpci</code> configuration steps described in the <pveLink>Proxmox PCI passthrough documentation</pveLink>. It checks assignments in <em>other</em> guests and offers conflict-handling choices. These checks do not guarantee support for every GPU, reset method or guest driver."
|
||||
},
|
||||
"who": {
|
||||
"heading": "Who is this for?",
|
||||
@@ -20,11 +20,11 @@
|
||||
"title": "Before you start",
|
||||
"gpu": "<strong>A supported GPU</strong> physically installed. The script detects Intel, AMD and NVIDIA via <code>lspci</code>.",
|
||||
"gpuCheck": "lspci | grep -iE 'VGA|3D|Display'",
|
||||
"iommu": "<strong>IOMMU virtualization</strong> available in BIOS/UEFI (Intel VT-d or AMD-Vi). If it's off at the firmware level, no amount of Linux config fixes it — you have to enable it in the BIOS first. The script detects this and offers to enable it on the OS side.",
|
||||
"q35": "The target VM uses <strong>q35</strong> machine type. Older <code>i440fx</code> does not reliably support PCIe passthrough and the script will refuse to proceed.",
|
||||
"q35Check": "qm config '<'vmid'>' | grep machine",
|
||||
"iommu": "<strong>IOMMU support</strong> must be available in hardware and enabled in firmware where required (Intel VT-d or AMD-Vi). The script checks the running system and can configure Linux boot parameters; it cannot change BIOS/UEFI settings or prove that every inactive IOMMU is disabled in firmware.",
|
||||
"q35": "This assistant requires the <strong>q35</strong> machine type and refuses <code>i440fx</code>. Machine type is separate from BIOS/UEFI firmware; changing an existing VM chipset requires planning and is not performed automatically.",
|
||||
"q35Check": "qm config VMID | grep machine",
|
||||
"moreGpus": "Preferably <strong>more than one GPU</strong> in the host, or console access on another output (IPMI, KVM-over-IP, serial). Once you pass the only GPU to a VM, the host console goes dark. With two NVIDIA GPUs you can pass one to a VM and keep the other on the host — the script handles this per-BDF (see <em>NVIDIA</em> in the vendor notes below).",
|
||||
"nvidiaInstalled": "If you're on a Proxmox that already installed the NVIDIA driver via <nvidiaLink>NVIDIA Drivers on the Host</nvidiaLink>: the GPU you pass to the VM gets unbound from the host <code>nvidia</code> driver and rebound to <code>vfio-pci</code>. The <code>nvidia</code> module stays loaded so any <strong>other</strong> NVIDIA GPU you have on the host keeps working with <code>nvidia-smi</code>."
|
||||
"nvidiaInstalled": "If you installed <nvidiaLink>NVIDIA Drivers on the Host</nvidiaLink>, selected functions are reserved for <code>vfio-pci</code> rather than <code>nvidia</code>. The <code>nvidia</code> module can remain available for <strong>other</strong> cards outside the affected IOMMU group; verify them with <code>nvidia-smi</code>."
|
||||
},
|
||||
"pickOne": {
|
||||
"title": "VM passthrough vs LXC sharing — pick one per GPU",
|
||||
@@ -39,34 +39,34 @@
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "How the script runs",
|
||||
"body": "The flow has three phases with clear separation between \"collecting information and decisions\" and \"actually applying changes\". Until the final confirmation, nothing on your host or VM has been touched."
|
||||
"body": "Detection and selection precede the main host/VM changes and a final summary confirms that plan. Enabling IOMMU has its own earlier confirmation and can already edit the boot configuration. Later associated-audio cleanup may also ask for a choice."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Walking through the flow",
|
||||
"detect": {
|
||||
"title": "Detect GPUs and check IOMMU",
|
||||
"body": "The script lists every GPU it finds. If IOMMU isn't already enabled in the running kernel cmdline, you'll get a yes/no prompt to append <code>intel_iommu=on</code> (or <code>amd_iommu=on</code>) + <code>iommu=pt</code> to the right boot file. Selection is based on the bootloader: <code>/etc/kernel/cmdline</code> when the host boots via systemd-boot (detected by the presence of <code>root=ZFS=</code> in that file, the default on ProxmoxVE-installed ZFS-on-root systems), otherwise <code>/etc/default/grub</code>. If you accept and the kernel cmdline changes, the script flags that a reboot will be needed at the end.",
|
||||
"body": "Treats IOMMU as active only when the running kernel has <code>intel_iommu=on</code> or <code>amd_iommu=on</code> and IOMMU groups exist. If the parameter is already saved for the next boot, it continues in pending-reboot mode; otherwise a separately confirmed step can add it with <code>iommu=pt</code>. Its boot-file heuristic uses <code>/etc/kernel/cmdline</code> when a ZFS-root marker such as <code>root=ZFS=</code> exists there; otherwise it uses <code>/etc/default/grub</code>. That heuristic is not proof of the actual bootloader. Newly configured IOMMU takes effect after reboot; inspect the real groups afterwards.",
|
||||
"tipTitle": "Already ran post-install?",
|
||||
"tipBody": "If you previously enabled <postLink>VFIO IOMMU support</postLink> from the post-install scripts, IOMMU is already on and this step silently passes. Good.",
|
||||
"tipBody": "If <postLink>VFIO IOMMU support</postLink> was previously configured and is active in the running kernel, this check passes. A saved next-boot setting alone does not prove it is active.",
|
||||
"imageAlt": "List of detected GPUs with vendor and PCI address"
|
||||
},
|
||||
"preflight": {
|
||||
"title": "Pick a GPU and run pre-flight checks",
|
||||
"intro": "Once you pick the GPU, the script runs a series of checks that can each block further progress:",
|
||||
"items": [
|
||||
"<strong>Not in SR-IOV.</strong> If the device is a Virtual Function or a Physical Function with active VFs, passthrough would clash with SR-IOV usage. Blocked.",
|
||||
"<strong>SR-IOV guard.</strong> This assistant refuses VFs and PFs with active VFs because its full-device workflow is not an SR-IOV configuration flow. SR-IOV passthrough must be configured separately on supported hardware.",
|
||||
"<strong>Single-GPU warning.</strong> If this is the only GPU in the host, you get a scary dialog reminding you that after reboot the console goes dark — make sure you have SSH or web-UI access from another machine.",
|
||||
"<strong>AMD reset method.</strong> AMD GPUs have a long history of not resetting cleanly between VM stops and starts. The script checks <code>/sys/bus/pci/devices/<pci>/reset_method</code>: if the card is an APU without FLR it <em>blocks</em> (practically unusable); a dedicated AMD card without FLR is also blocked; anything with an unknown reset mode warns but lets you continue with explicit override.",
|
||||
"<strong>AMD reset policy.</strong> Reads <code>/sys/bus/pci/devices/<pci>/reset_method</code>. An APU or dedicated card without FLR is <em>blocked by this assistant’s policy</em>; an unknown subtype without FLR requires an explicit override. This does not establish universal hardware impossibility.",
|
||||
"<strong>Not in D3cold.</strong> Some AMD cards report <code>D3cold</code> power state while idle, which makes them invisible during VM startup. Blocked until you wake the GPU.",
|
||||
"<strong>IOMMU group analysis.</strong> Reads <code>/sys/kernel/iommu_groups/</code> to find every non-bridge device in the GPU's group. <em>All of them</em> will be passed to the VM together — if your motherboard groups the GPU with a network card, the network card goes too."
|
||||
"<strong>IOMMU group analysis.</strong> Reads <code>/sys/kernel/iommu_groups/</code> and includes <em>all non-bridge members</em> in the VM plan, possibly network or storage controllers. When the group contains devices from another slot, the script lists them before the summary; check that the host does not need any of them. If IOMMU is pending reboot, real groups are unavailable and the plan initially contains only the selected GPU function; verify isolation after reboot."
|
||||
],
|
||||
"audioIntro": "<strong>Audio companion.</strong> Two paths, depending on where the audio lives:",
|
||||
"audioDgpu": "<strong>Discrete GPU (NVIDIA / AMD):</strong> HDMI audio sits on the same card as function <code>.1</code> of the GPU's PCI slot. Auto-included. This audio device was never used by the host, so no one loses anything.",
|
||||
"audioDgpu": "<strong>Discrete GPU:</strong> HDMI audio often occupies function <code>.1</code> of the same PCI slot and is automatically included when detected. If the host was using that audio device, it loses access when the device is reserved for the VM.",
|
||||
"audioIgpu": "<strong>Intel iGPU (or any GPU without a <code>.1</code> sibling):</strong> the HDMI / analog audio lives on the chipset at a different slot (<code>00:1f.3</code> typically). The script scans the host, lists every PCI audio controller with its current driver (<code>snd_hda_intel</code>, etc.), and asks you which one(s) to pass through. Default is <strong>none</strong> — you explicitly opt in."
|
||||
},
|
||||
"pickVm": {
|
||||
"title": "Pick the target VM",
|
||||
"body": "You're shown the list of VMs on the host and pick one. The script checks the VM is q35 — BIOS/i440fx machine types are refused because PCIe passthrough on them is unreliable. If you have a q35 VM with the GPU already assigned (partially or fully), the existing entry is reused instead of being duplicated.",
|
||||
"body": "Choose a VM from the list. The assistant requires q35 and reuses existing GPU entries where possible. BIOS/UEFI firmware is a separate setting, not a machine type; this check does not automatically change the installed guest’s chipset or boot mode.",
|
||||
"imageAlt": "VM list with name, ID and status shown as a picker"
|
||||
},
|
||||
"switchMode": {
|
||||
@@ -75,34 +75,34 @@
|
||||
"items": [
|
||||
"<strong>GPU is free.</strong> Nothing to do, continue.",
|
||||
"<strong>GPU is in a different VM.</strong> If the source VM is currently running, the script aborts — two VMs can't share an exclusive VFIO assignment, and the source VM has to be stopped first. If the source VM is stopped, you get two options: <em>Keep GPU in the source VM's config but disable Start on boot</em>, or <em>Remove the GPU lines from the source VM's config and keep Start on boot</em>. A fast-path also exists: if the GPU is already bound to <code>vfio-pci</code> and the source VM is a plain VM→VM swap, no host reconfiguration is done and no reboot is needed.",
|
||||
"<strong>GPU is in an LXC (shared mode).</strong> You get two options on a menu: <em>Keep GPU in the LXC config but disable Start on boot</em>, or <em>Remove the GPU lines from the LXC config (<code>lxc.cgroup2.devices.allow</code> / <code>lxc.mount.entry</code>) and keep Start on boot</em>. Either way the LXC won't see the GPU after the switch, and the VM will — this is the \"switch mode\" mechanic that gives this menu entry its secondary label."
|
||||
"<strong>GPU used by LXC.</strong> For ordinary containers, choose <em>keep the GPU configuration and disable Start on boot</em> or <em>remove GPU device configuration and keep Start on boot</em>. Removal deletes the <code>devN</code> entries and, for AMD/Intel, also legacy <code>/dev/dri</code> <code>lxc.mount.entry</code> and <code>lxc.cgroup2.devices.allow</code> rules. OCI containers retain their configuration and are stopped with Start on boot disabled; remove their GPU through OCI manager Apps. Conflict detection is by GPU device family and may include other cards of that family."
|
||||
],
|
||||
"imageAlt": "Dialog offering to remove the GPU from an LXC before assigning it to the VM",
|
||||
"smartTitle": "Audio siblings are cleaned up smartly too",
|
||||
"smartBody": "If the source VM had extra audio devices attached alongside the GPU, the script removes <strong>only the ones that are now orphan</strong> — i.e. audio entries whose display sibling is also being removed. Audio tied to a different GPU that stays in the VM is kept untouched. This matters when you detach an Intel iGPU (which shares chipset audio) from a VM that also has a discrete NVIDIA / AMD card still passed through: the dGPU's HDMI audio (<code>02:00.1</code>) stays, the chipset audio (<code>00:1f.3</code>) leaves."
|
||||
"smartBody": "After removing GPU assignments from the source VM, the script can offer a checklist of <strong>potentially orphaned audio devices</strong>. Review it and uncheck anything the source still needs. For example, dedicated-card audio at <code>02:00.1</code> may remain while chipset audio at <code>00:1f.3</code> is offered for removal. The checklist, not a universal display/audio pairing guarantee, determines the extra removals."
|
||||
},
|
||||
"audioPick": {
|
||||
"title": "(If no .1 sibling) Pick which audio controllers to include",
|
||||
"body": "Only happens for Intel iGPU and similar split-audio setups. A checklist shows every PCI audio controller on the host (excluding any already in the GPU's IOMMU group), labelled with its current driver. Select the ones you want — or none, if the VM doesn't need audio from the host hardware.",
|
||||
"imageAlt": "Checklist dialog with every host PCI audio controller (BDF + driver) when the GPU has no .1 sibling audio",
|
||||
"warnTitle": "Don't tick audio the host relies on",
|
||||
"warnBody": "If the host currently uses an audio controller for anything — for example, the Proxmox shell beeping, or a VM you've already passed it to — ticking it here means the host (and any other VM sharing it) loses access after reboot. When in doubt, leave this empty and you can always re-run the script later to add audio if needed."
|
||||
"warnBody": "Assigning an audio controller to the VM can remove host access; it cannot simultaneously belong to another running VM. Leave optional audio unselected when unnecessary, and verify ownership before moving it. PCI audio is not necessarily the source of the host console beep."
|
||||
},
|
||||
"summary": {
|
||||
"title": "Review the confirmation summary",
|
||||
"body": "A final dialog shows exactly what's about to change on the host and in the VM. This is the last off ramp — if anything looks wrong (an extra device in the IOMMU group you didn't expect, the wrong GPU, the wrong VM), cancel here and nothing has been touched yet.",
|
||||
"body": "Review the final host and VM plan and cancel if it is wrong. It shows the IOMMU group and its device count; members from another slot are listed in the previous step. Cancelling stops the main changes; it does not undo an earlier separately confirmed IOMMU boot-configuration change.",
|
||||
"imageAlt": "Summary dialog listing host changes (VFIO/blacklist files) and VM config changes (hostpci lines) before applying"
|
||||
},
|
||||
"hostApply": {
|
||||
"title": "Host changes are applied",
|
||||
"intro": "Phase 2 runs non-interactively. Host-side the script can touch:",
|
||||
"intro": "The apply phase performs the host and VM changes. Associated-audio cleanup may still prompt for a selection. Host changes can include:",
|
||||
"items": [
|
||||
"<code>/etc/modules</code> — adds <code>vfio</code>, <code>vfio_iommu_type1</code>, <code>vfio_pci</code> (plus <code>vfio_virqfd</code> on kernels < 6.2).",
|
||||
"<code>/etc/modprobe.d/vfio.conf</code> — for AMD / Intel, sets <code>options vfio-pci ids=<vendor:device,...> disable_vga=1</code> so VFIO claims the GPU early at boot. For NVIDIA the file only adds <code>softdep nvidia pre: vfio-pci</code> (plus <code>_drm</code>/<code>_modeset</code>/<code>_uvm</code>) — actual binding is per-BDF via the udev rule below. On AMD, also adds <code>softdep</code> lines forcing <code>vfio-pci</code> to load before <code>radeon</code> / <code>amdgpu</code>.",
|
||||
"<code>/etc/modprobe.d/iommu_unsafe_interrupts.conf</code> and <code>kvm.conf</code> — sensible workarounds that most Windows / macOS VMs need (<code>allow_unsafe_interrupts=1</code>, <code>ignore_msrs=1</code>).",
|
||||
"<code>/etc/modprobe.d/blacklist.conf</code> — blacklists only the open-source drivers for the selected vendor (<code>nouveau</code>/<code>lbm-nouveau</code> for NVIDIA; <code>radeon</code>+<code>amdgpu</code> for AMD; <code>i915</code> for Intel), so drivers for other vendors on the same host stay loaded. The proprietary <code>nvidia</code> module is <strong>only</strong> blacklisted (via a separate <code>/etc/modprobe.d/proxmenux-nvidia-vfio-blacklist.conf</code>) once <em>every</em> NVIDIA GPU on the host has been switched to VFIO — until that point it stays loaded so any NVIDIA card you keep on the host keeps working.",
|
||||
"<code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> + <code>/etc/proxmenux/vfio-bind.bdfs</code> — <strong>NVIDIA only</strong>. Per-BDF binding state. The udev rule applies <code>ATTR'{'driver_override'}'=\"vfio-pci\"</code> at the PCI ADD event for each tracked Bus:Device.Function, so only the GPU(s) you've explicitly passed go to VFIO. This is what makes multi-GPU NVIDIA work — your other NVIDIA cards keep their <code>nvidia</code> driver and stay usable on the host.",
|
||||
"<strong>AMD only.</strong> Dumps the GPU ROM from sysfs (<code>/sys/bus/pci/.../rom</code>) or the ACPI VFCT table to <code>/usr/share/kvm/vbios_<card>.bin</code>. The VM references it via <code>romfile=</code> so cards that misreport their own VBIOS still initialise correctly.",
|
||||
"Writes <code>/etc/modprobe.d/iommu_unsafe_interrupts.conf</code> and <code>kvm.conf</code> with <code>allow_unsafe_interrupts=1</code> and <code>ignore_msrs=1</code>. These are compatibility settings applied by the script, not universal Windows/macOS requirements; unsafe interrupts relax interrupt-remapping protection.",
|
||||
"<code>/etc/modprobe.d/blacklist.conf</code>: NVIDIA — <code>nouveau</code>/<code>lbm-nouveau</code>; AMD — <code>radeon</code> + <code>amdgpu</code>; Intel — <code>i915</code>. These vendor-wide entries may affect other cards using the same driver. The proprietary <code>nvidia</code> module is blocked <strong>only</strong> through <code>/etc/modprobe.d/proxmenux-nvidia-vfio-blacklist.conf</code> when <em>all</em> host NVIDIA cards are tracked for VFIO.",
|
||||
"<code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> + <code>/etc/proxmenux/vfio-bind.bdfs</code> — <strong>NVIDIA only.</strong> The udev rule sets <code>ATTR'{'driver_override'}'=\"vfio-pci\"</code> at PCI ADD for tracked BDFs, including affected IOMMU-group functions. Cards outside those groups can retain the <code>nvidia</code> driver. Per-BDF policy does not split a hardware IOMMU group.",
|
||||
"<strong>AMD only.</strong> Attempts a ROM dump from <code>/sys/bus/pci/.../rom</code> or ACPI VFCT into <code>/usr/share/kvm/vbios_<vendor>_<device>.bin</code>. If successful, the VM uses <code>romfile=</code>. A valid dump does not guarantee successful GPU initialization.",
|
||||
"<strong>NVIDIA only.</strong> Host NVIDIA services (<code>nvidia-persistenced</code>, <code>nvidia-powerd</code>, <code>nvidia-fabricmanager</code>) are stopped and disabled only when every NVIDIA GPU is assigned to VFIO. With a mixed host they remain active, together with the <code>nvidia</code> module, for the GPU(s) that stay native.",
|
||||
"<code>update-initramfs -u -k all</code> — only runs if any of the above actually changed."
|
||||
]
|
||||
@@ -110,25 +110,25 @@
|
||||
"vmApply": {
|
||||
"title": "VM config is applied via qm set",
|
||||
"body": "The VM config at <code>/etc/pve/qemu-server/<vmid>.conf</code> is updated via <code>qm set</code> (never by direct <code>sed</code>):",
|
||||
"after1": "A <code>x-vga=1</code> flag is added for every vendor <strong>except</strong> Intel iGPU — Intel integrated GPUs don't have dedicated VRAM for a pre-boot console, so that flag causes hangs.",
|
||||
"after1": "The script adds <code>x-vga=1</code> for AMD and NVIDIA, <strong>not</strong> Intel. This describes its configuration policy; it does not establish that every Intel iGPU lacks firmware or that the flag universally causes hangs.",
|
||||
"after2": "Additional <code>hostpciN</code> lines are appended if the GPU's IOMMU group contains other devices you need to pass together."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Reboot if host config was touched",
|
||||
"body": "If Phase 2 changed anything at the kernel-module / cmdline / blacklist level, you'll be prompted to reboot. Reboot is mandatory before starting the VM — otherwise the GPU is still held by the host driver and VFIO can't claim it.",
|
||||
"body": "Follow the reboot prompt when host boot or driver settings change, and verify the GPU’s active binding before starting the VM. Saved configuration does not prove it is active. A VM-to-VM reassignment with the correct VFIO state can avoid a host reboot.",
|
||||
"imageAlt": "Summary screen showing what was changed, followed by a reboot prompt"
|
||||
}
|
||||
},
|
||||
"vendors": {
|
||||
"heading": "Vendor-specific notes",
|
||||
"nvidiaHeading": "NVIDIA",
|
||||
"nvidiaBody": "NVIDIA consumer drivers detect that they're running in a VM and refuse to initialise with the infamous <em>\"Code 43\"</em> error. ProxMenux's workaround: hide KVM from the guest (<code>hidden=1</code>), set a spoofed hypervisor vendor ID <code>NV43FIX</code> in the <code>args</code> line, and pass <code>kvm=off</code>. This has worked reliably on GeForce drivers for years. On datacenter / Tesla / Quadro cards this isn't needed — those drivers are licensed for virtualisation.",
|
||||
"nvidiaBody": "The script retains a legacy <em>Code 43</em> workaround: <code>hidden=1</code>, vendor ID <code>NV43FIX</code> in <code>args</code>, and <code>kvm=off</code>. It is not a universal requirement for current GeForce drivers: NVIDIA enabled Windows-VM passthrough support in R465. Code 43 can have other causes; verify the actual GPU and driver combination.",
|
||||
"nvidiaMultiHeading": "Multi-GPU NVIDIA support",
|
||||
"nvidiaMultiBody": "Hosts with two or more NVIDIA GPUs are first-class. You can pass one card to a VM and keep the other(s) on the host for <code>nvidia-smi</code>, LXC GPU sharing, or any host-side workload. ProxMenux binds VFIO <strong>per-BDF</strong> (Bus:Device.Function) via a udev rule rather than globally blacklisting the <code>nvidia</code> module — so each card's destination is independent of the others, even when both GPUs are the same model and share the same <code>vendor:device</code> ID. The host nvidia driver stays loaded; only the specific BDFs you select get redirected to <code>vfio-pci</code>.",
|
||||
"nvidiaMultiBody": "Mixed NVIDIA use is supported <strong>per BDF</strong>. Functions assigned to <code>vfio-pci</code> are tracked by PCI address, not merely a shared <code>vendor:device</code> ID. Cards outside the affected IOMMU groups can keep <code>nvidia</code> and be checked with <code>nvidia-smi</code>. Two cards in the same group are not independently isolated by this policy.",
|
||||
"amdHeading": "AMD",
|
||||
"amdBody": "The \"AMD reset bug\" means some cards crash when the VM stops and can't re-initialise without a host reboot. ProxMenux pre-screens for this by reading the PCI reset method, but cannot fix it after the fact. If you hit it, the community fix is the <vendorResetLink>vendor-reset</vendorResetLink> kernel module. The script doesn't install it automatically — the module is a DKMS build you add yourself if you see reset failures. Also on Windows guests, the <em>RadeonResetBugFix</em> service is the common userspace workaround.",
|
||||
"amdBody": "Some AMD GPUs fail to reset after a VM stops. The assistant checks reported capabilities, not every real restart cycle. <vendorResetLink>vendor-reset</vendorResetLink> supports a limited device list and requires compatible kernel support and early loading; the script does not install it. The Windows <em>RadeonResetBugFix</em> project is another hardware-dependent workaround, not a guaranteed fix for all AMD GPUs.",
|
||||
"intelHeading": "Intel iGPU",
|
||||
"intelBody": "Intel iGPU passthrough is flaky but possible on UHD 630+ generations with <sriovLink>i915-sriov-dkms</sriovLink> for SR-IOV. For a single \"give the iGPU to one VM\" case, the script binds it exactly like a dedicated GPU, but skips <code>x-vga=1</code> (iGPUs don't carry a pre-boot VBIOS). You'll lose host console output — plan accordingly."
|
||||
"intelBody": "Full Intel iGPU passthrough and SR-IOV are separate workflows. This assistant reserves the full device for one VM and omits <code>x-vga=1</code>. <sriovLink>i915-sriov-dkms</sriovLink> applies only to supported SR-IOV hardware/kernel combinations; a “UHD 630+” label is not a compatibility rule. Plan alternate host-console access."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verification"
|
||||
@@ -136,19 +136,19 @@
|
||||
"troubleshoot": {
|
||||
"heading": "Troubleshooting",
|
||||
"code43Title": "Code 43 in Windows (NVIDIA)",
|
||||
"code43Body": "The KVM hiding args didn't apply. Check <code>qm config <vmid> | grep -E \"cpu|args\"</code> — you should see <code>hidden=1</code> and <code>hv_vendor_id=NV43FIX</code>. If missing, re-run the script and re-select the same VM.",
|
||||
"code43Body": "Code 43 is not proof of failed KVM hiding. Inspect <code>qm config VMID | grep -E \"cpu|args\"</code> (replace VMID) for the script’s <code>hidden=1</code> and <code>hv_vendor_id=NV43FIX</code> settings, but also check the guest driver, GPU firmware and assignment. Re-running may exit early if the GPU is already assigned.",
|
||||
"amdResetTitle": "AMD GPU works once, fails on VM restart",
|
||||
"amdResetBody": "The AMD reset bug. Solutions (in order): (1) reboot the host — GPU will be usable again for one more VM cycle; (2) install the <code>vendor-reset</code> DKMS module and add <code>softdep amdgpu pre: vendor-reset</code>; (3) inside Windows, install the <em>RadeonResetBugFix</em> service.",
|
||||
"amdResetBody": "A reset failure is one possible cause. A host reboot or power cycle may restore the device temporarily. Check whether <code>vendor-reset</code> supports this exact GPU and kernel and load it early as its documentation requires; <code>softdep amdgpu pre: vendor-reset</code> alone does not guarantee early loading before VFIO. The Windows <em>RadeonResetBugFix</em> workaround also requires a compatible GPU.",
|
||||
"stuckBootTitle": "VM stuck booting / GPU not detected",
|
||||
"stuckBootBody": "Confirm VFIO actually holds the GPU on boot: <code>lspci -nnk -d vendor:device</code> must show <code>Kernel driver in use: vfio-pci</code>. If it still shows the vendor driver, the blacklist didn't take effect — check <code>/etc/modprobe.d/blacklist.conf</code> and <code>dmesg | grep vfio</code>, and regenerate initramfs: <code>update-initramfs -u -k all</code> then reboot.",
|
||||
"stuckBootBody": "Inspect the selected PCI address with <code>lspci -nnk -s PCI_ADDRESS</code>; expect <code>Kernel driver in use: vfio-pci</code>. Replace PCI_ADDRESS with the real BDF. If the native driver remains, inspect the appropriate binding policy, not only <code>/etc/modprobe.d/blacklist.conf</code>; NVIDIA also uses per-BDF state. Read <code>dmesg | grep vfio</code>. After correcting persistent configuration, rebuild with <code>update-initramfs -u -k all</code> and follow the reboot plan.",
|
||||
"darkTitle": "Host console goes dark after reboot and I can't SSH in",
|
||||
"darkBody": "You passed the primary GPU through before having alternate access. Boot into a recovery shell (rescue ISO, IPMI), remove the lines from the VM config (<code>/etc/pve/qemu-server/<vmid>.conf</code>), and remove the vfio options:",
|
||||
"darkBody": "A dark display does not prove the host is down. If SSH also fails, check network connectivity and whether a network/storage controller was included in the IOMMU group. Recover through IPMI, serial or a recovery environment; inspect the VM config <code>/etc/pve/qemu-server/<vmid>.conf</code> and only revert the relevant assignments and host binding rules. Do not delete unrelated blacklist or VFIO configuration.",
|
||||
"logTitle": "Check the install log",
|
||||
"logBody": "Every run writes to <code>/tmp/add_gpu_vm.log</code>. Attach it when asking for help on GitHub."
|
||||
},
|
||||
"revert": {
|
||||
"heading": "Reverting manually",
|
||||
"intro": "There isn't a dedicated \"remove GPU from VM\" shortcut in ProxMenux today. To detach cleanly:"
|
||||
"intro": "Stop the VM and remove only its relevant PCI assignments in Proxmox Hardware, or with the explicit index shown below. Detaching from the VM does not return the device to a native host driver. Use Switch GPU Mode for that separate transition and inspect the affected guests before confirming."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Related",
|
||||
@@ -156,7 +156,7 @@
|
||||
{
|
||||
"label": "Install NVIDIA Drivers (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — install drivers on the host first if you also want the GPU usable from there."
|
||||
"tail": " — prepare host-driver access for cards kept native; a card bound to VFIO cannot be used by the host driver simultaneously."
|
||||
},
|
||||
{
|
||||
"label": "Add GPU to LXC",
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
},
|
||||
"intro": {
|
||||
"title": "What this does",
|
||||
"body": "Adds <code>dev<N></code> entries to the LXC config (<code>/etc/pve/lxc/<ctid>.conf</code>) so the container sees <code>/dev/dri/*</code>, <code>/dev/kfd</code> or <code>/dev/nvidia*</code> — whichever applies to your GPU. Then it boots the container, detects the distro inside, and installs the matching userspace drivers (Mesa, intel-media-driver, NVIDIA runtime…) so apps like Plex, Jellyfin or Frigate actually use the GPU for transcoding. GIDs (<code>video</code>, <code>render</code>) are aligned between host and container so permissions match."
|
||||
"body": "Adds <code>dev<N></code> entries to <code>/etc/pve/lxc/<ctid>.conf</code> for applicable <code>/dev/dri/*</code>, <code>/dev/kfd</code> or <code>/dev/nvidia*</code> nodes. It starts the container, installs userspace packages for its distribution and, for Intel/AMD, aligns the <code>video</code> and <code>render</code> groups. Application acceleration still requires compatible hardware, libraries and app configuration."
|
||||
},
|
||||
"compare": {
|
||||
"heading": "LXC sharing vs VM passthrough",
|
||||
@@ -37,12 +37,12 @@
|
||||
{
|
||||
"feature": "Reboot required?",
|
||||
"lxc": "Usually no (just restart the CT)",
|
||||
"vm": "Yes, always"
|
||||
"vm": "When host driver or IOMMU setup changes; not for every VM assignment"
|
||||
},
|
||||
{
|
||||
"feature": "Supports running any OS?",
|
||||
"feature": "Guest operating systems",
|
||||
"lxc": "Only Linux (LXC is Linux-only)",
|
||||
"vm": "Windows, macOS, any Linux"
|
||||
"vm": "Supported guest OS with a compatible GPU driver"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -53,7 +53,7 @@
|
||||
"vfio": "<strong>The GPU is NOT bound to vfio-pci.</strong> If the GPU is currently assigned to a VM via passthrough, it's invisible to the host kernel driver and the LXC can't use it. The script detects this and offers to run <switchLink>Switch GPU Mode</switchLink> for you.",
|
||||
"nvidia": "<strong>For NVIDIA only:</strong> the NVIDIA host driver must already be installed — ProxMenux needs to match the container's userspace libs to the host version. If you haven't done it yet, run <nvidiaLink>Install NVIDIA Drivers on the Host</nvidiaLink> first.",
|
||||
"nvidiaCheck": "nvidia-smi",
|
||||
"container": "<strong>An existing LXC container.</strong> The script operates on a container you already created — it doesn't create one. The container should ideally be <strong>privileged</strong> (unprivileged works but needs UID/GID mapping which the script does not configure)."
|
||||
"container": "<strong>An existing LXC container.</strong> The script does not create one. Both privilege modes are supported; a <strong>privileged</strong> container is not universally required. Device entries and the application’s numeric group permissions still need to match."
|
||||
},
|
||||
"unpriv": {
|
||||
"title": "Works on both privileged and unprivileged containers",
|
||||
@@ -66,7 +66,7 @@
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "How the script runs",
|
||||
"body": "Two phases: all the decisions upfront, then all the changes in one go. Nothing on your container is touched until you confirm."
|
||||
"body": "Select the container and GPU families, then pass the checks. Processing then stops the container and changes its configuration; there is no additional final confirmation. Optional VFIO cleanup has its own confirmation and can change the host earlier."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Walking through the flow",
|
||||
@@ -78,12 +78,12 @@
|
||||
},
|
||||
"pickCt": {
|
||||
"title": "Pick an LXC container",
|
||||
"body": "You'll see a list of every LXC on the host with its ID and name. Pick the one that should get the GPU. The container can be running or stopped — the script handles both (stops it briefly during config, restarts it, and leaves it in its original state at the end).",
|
||||
"body": "Lists eligible LXC containers by ID and name; OCI containers are excluded and use OCI manager Apps for devices. The container is stopped if running, started for driver installation and normally returned to its original running/stopped state.",
|
||||
"imageAlt": "Dialog listing existing LXC containers to choose from"
|
||||
},
|
||||
"selectGpu": {
|
||||
"title": "Select the GPU(s) to add",
|
||||
"body": "If more than one GPU is present, you get a checklist. You can add multiple to the same container (e.g. an Intel iGPU for Quick Sync + an AMD dGPU for ROCm). If only one GPU is detected, it's auto-selected.",
|
||||
"body": "The checklist selects detected vendor families, not an isolated PCI device. Intel/AMD add the visible DRI nodes used by the script; NVIDIA adds its available device nodes, potentially covering multiple cards. One detected family is selected automatically. Verify the resulting device list, particularly on multi-GPU hosts.",
|
||||
"imageAlt": "Checklist showing detected GPUs (Intel / AMD / NVIDIA) with vendor and PCI address"
|
||||
},
|
||||
"preflight": {
|
||||
@@ -91,14 +91,14 @@
|
||||
"imageAlt": "Dialog offering to run Switch GPU Mode when the selected GPU is still bound to vfio-pci for VM passthrough",
|
||||
"intro": "Three checks, any of which can block or redirect you:",
|
||||
"items": [
|
||||
"<strong>SR-IOV.</strong> If the selected GPU is a Virtual Function (VF) or a Physical Function with active VFs, LXC passthrough doesn't apply — the device is managed by the SR-IOV driver. Blocked.",
|
||||
"<strong>SR-IOV guard.</strong> This assistant blocks a selected VF or PF with active VFs. That is a limitation of its broad device selection, not a universal prohibition on SR-IOV with LXC; configure those devices separately.",
|
||||
"<strong>Bound to vfio-pci.</strong> If the GPU is currently held by VFIO for VM passthrough, the host kernel can't create <code>/dev/dri/*</code> or <code>/dev/nvidia*</code> nodes for it. The script offers to run <switchLink>Switch GPU Mode</switchLink> which undoes the VFIO binding; you'll likely need a reboot before re-running Add GPU to LXC.",
|
||||
"<strong>Already configured.</strong> If the container already has every dev node for the selected GPU, the script says so and exits cleanly. If it's partially configured, it continues with only the missing pieces."
|
||||
]
|
||||
},
|
||||
"applyConfig": {
|
||||
"title": "Apply the LXC config changes",
|
||||
"body1": "The script stops the container, edits <code>/etc/pve/lxc/<ctid>.conf</code>, and adds <code>dev<N></code> entries with the right GIDs for the selected GPUs. Using <code>dev:</code> entries (over the older <code>lxc.mount.entry</code> lines) is the modern Proxmox way — group permissions are set at config parse time instead of at mount time.",
|
||||
"body1": "Stops the container if running and edits <code>/etc/pve/lxc/<ctid>.conf</code>. Numbered <code>dev<N></code> entries carry the host <code>video</code> or <code>render</code> GID. Existing <code>lxc.mount.entry</code> bind lines for <code>/dev/dri</code> are replaced by <code>dev:</code> entries; inspect the resulting configuration and permissions.",
|
||||
"body2": "Example after Intel + NVIDIA on the same container:"
|
||||
},
|
||||
"installDrivers": {
|
||||
@@ -123,24 +123,24 @@
|
||||
"debianIntel": "apt-get install va-driver-all intel-opencl-icd vainfo",
|
||||
"debianNvidia": "extract host <code>.run</code> → <code>pct push</code> → run with <code>--no-kernel-modules --no-dkms</code>",
|
||||
"whyTitle": "Why the NVIDIA .run dance on Debian",
|
||||
"whyBody": "Debian / Ubuntu don't ship NVIDIA packages with a version granular enough to match the host driver byte-for-byte. The userspace libs inside the container <strong>must match the kernel module version</strong> loaded on the host, or <code>nvidia-smi</code> fails with a version mismatch. ProxMenux solves this by using the exact same <code>.run</code> installer that was used for the host — extracted, tarred, pushed into the container with <code>pct push</code>, and run with <code>--no-kernel-modules --no-dkms</code> so only the userspace is touched."
|
||||
"whyBody": "Repository packages may not match the host driver. Container libraries <strong>must match the loaded host module</strong> for NVML tools such as <code>nvidia-smi</code>. The Debian/glibc path uses the cached host-version <code>.run</code> installer, extracts and packs it on the host, transfers it with <code>pct push</code> and installs with <code>--no-kernel-modules --no-dkms</code>. Alpine and Arch use repository packages, whose versions still need checking."
|
||||
},
|
||||
"alignGids": {
|
||||
"title": "Align GIDs and restore state",
|
||||
"body1": "Device files on the host are owned by group <code>video</code> (GID 44) or <code>render</code> (GID 104). The container's distro may ship different GID numbers for those groups, which would make the GPU nodes unreachable from inside. The script rewrites <code>/etc/group</code> in the container so <code>video:44</code> and <code>render:104</code> match exactly.",
|
||||
"body2": "Finally, it restores the container to its original state — if it was stopped when you started, it gets stopped again. If it was running, it stays running."
|
||||
"body1": "For Intel/AMD, reads the host GIDs for <code>video</code> and <code>render</code>, using 44/104 only as fallbacks, then edits <code>/etc/group</code> inside the container to match; NVIDIA-only runs skip this step. Entries such as <code>video:44</code> and <code>render:104</code> are examples, not universal IDs. Verify app membership and effective device permissions.",
|
||||
"body2": "On the normal completion path, a container that was initially stopped is stopped again; one that was running stays running. If startup or installation fails, verify its final state and the log."
|
||||
}
|
||||
},
|
||||
"vendors": {
|
||||
"heading": "Vendor-specific notes",
|
||||
"intelHeading": "Intel iGPU",
|
||||
"intelBody": "Most common path — great for Plex / Jellyfin / Frigate hardware transcoding via <em>Quick Sync</em>. The container gets <code>/dev/dri/card0</code> (legacy) and <code>/dev/dri/renderD128</code> (modern render-only node — what apps actually use). No host-side changes needed; the <code>i915</code> driver on the host already created the nodes.",
|
||||
"intelBody": "Intel media acceleration, including <em>Quick Sync</em>, depends on GPU generation, codecs and app configuration. The script shares whichever of <code>/dev/dri/card0</code>, <code>card1</code>, <code>renderD128</code> and <code>renderD129</code> exist; other node numbers are not added. The host must already provide them through its native driver, for example <code>i915</code>.",
|
||||
"amdHeading": "AMD",
|
||||
"amdBody": "Same DRI nodes as Intel for graphics / VA-API. If <code>/dev/kfd</code> exists on the host (AMD compute / ROCm kernel support), the script also adds it so containers can do OpenCL / ROCm workloads. Mesa VA drivers cover the video decode side.",
|
||||
"amdBody": "AMD uses DRI nodes for Mesa/VA-API. If the host exposes <code>/dev/kfd</code>, the script also shares it. ROCm/OpenCL workloads still require supported hardware and compatible userspace packages; sharing the device does not install a complete ROCm stack.",
|
||||
"nvidiaHeading": "NVIDIA",
|
||||
"nvidiaBody": "Adds every <code>/dev/nvidia*</code> node the host exposes. The critical piece is <strong>driver-version matching</strong>: host module version and container userspace lib version must be identical, otherwise <code>nvidia-smi</code> inside the container fails. ProxMenux captures the host version at detection time and uses the same <code>.run</code> file to install the container userspace. For Debian containers the install bumps container memory to 2 GB temporarily (installer needs ~1.5 GB free to extract) and restores it afterwards.",
|
||||
"updateTitle": "After you update the host NVIDIA driver, re-run this script",
|
||||
"updateBody": "When you upgrade the NVIDIA driver on the host, the container's userspace libs stay on the old version and <code>nvidia-smi</code> inside the container breaks. ProxMenux's <nvidiaLink>NVIDIA host installer</nvidiaLink> detects containers with NVIDIA passthrough and offers to update them automatically — but if you skipped that prompt, just run Add GPU to LXC again on the same container and it'll refresh the userspace."
|
||||
"nvidiaBody": "Shares available <code>/dev/nvidia*</code> nodes. <strong>Driver-version matching</strong> remains essential for <code>nvidia-smi</code>. Debian/glibc uses the cached host-version <code>.run</code>; Alpine/Arch use repository packages. If the Debian path finds less than 2048 MiB configured RAM, it offers a temporary increase and later restores it; it also requires at least 1500 MiB of free disk space.",
|
||||
"updateTitle": "After a host NVIDIA update, check container library versions",
|
||||
"updateBody": "Old container libraries can make <code>nvidia-smi</code> report a mismatch. The <nvidiaLink>NVIDIA host installer</nvidiaLink> offers container updates. Re-running Add GPU to LXC may exit when its device entries already exist, so it is not a guaranteed library-refresh command. Check the installed versions and update the appropriate container packages or userspace installer."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verification",
|
||||
@@ -149,11 +149,11 @@
|
||||
"troubleshoot": {
|
||||
"heading": "Troubleshooting",
|
||||
"mismatchTitle": "nvidia-smi: Failed to initialize NVML: Driver/library version mismatch",
|
||||
"mismatchBody": "Container userspace version ≠ host module version. Run Add GPU to LXC again on that container — the script extracts the current host <code>.run</code> and re-installs userspace matching.",
|
||||
"mismatchBody": "Container libraries do not match the loaded host module. Inspect versions and update the container userspace appropriately. The cached <code>.run</code> supports the Debian/glibc path, but Add GPU to LXC can exit early when all device entries already exist.",
|
||||
"denyTitle": "Permission denied on /dev/dri/renderD128 inside the container",
|
||||
"denyBody": "Usually one of: (1) container is unprivileged without UID/GID mapping to host <code>render</code> group; (2) the user inside the container isn't in the <code>render</code> group. Fix: add the user to <code>render</code> inside the container (<code>usermod -aG render <user></code>), or switch to privileged mode if the workload is trusted.",
|
||||
"denyBody": "Check the device entry and numeric <code>render</code> group permissions, then whether the app user belongs to <code>render</code>. Where available, add that user to <code>render</code> with <code>usermod -aG render <user></code>, replacing the placeholder with the actual account. Restart the application session to apply membership; changing privilege mode is not a general permissions fix.",
|
||||
"vainfoTitle": "vainfo says: VA-API version 1.xx; failed to initialize",
|
||||
"vainfoBody": "The VA-API runtime is there but no suitable driver was installed. On Intel, install <code>intel-media-driver</code> (newer gens) or <code>i965-va-driver</code> (older gens). On AMD, <code>mesa-va-drivers</code>. Re-run the script if in doubt.",
|
||||
"vainfoBody": "Check device access and the selected VA-API driver. Package names vary by distribution: examples include <code>intel-media-driver</code> for supported newer Intel GPUs, <code>i965-va-driver</code> for supported older ones, and <code>mesa-va-drivers</code> for AMD. The message alone does not prove a missing package.",
|
||||
"logTitle": "Install log",
|
||||
"logBody": "Every run writes to <code>/tmp/add_gpu_lxc.log</code> on the host. Include it when asking for help on GitHub."
|
||||
},
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
},
|
||||
"intro": {
|
||||
"title": "What this does",
|
||||
"body": "The Coral installer is <strong>unified and hardware-aware</strong>: you run one menu option and it figures out what you actually have. M.2 / Mini-PCIe cards need kernel modules (<code>gasket</code> + <code>apex</code>) built with DKMS so they survive kernel upgrades. USB Accelerators just need the Google Edge TPU runtime (<code>libedgetpu1-std</code>) from Google's own APT repository. Both types plugged in? Both paths run in sequence."
|
||||
"body": "A <strong>single hardware-aware installer</strong> selects the detected device paths. PCIe uses <code>gasket</code> and <code>apex</code> modules with DKMS; future rebuilds still need compatible driver sources and kernel headers. USB uses the <code>libedgetpu1-std</code> userspace runtime. If both types are detected, both paths run. USB runtime must be available where the app runs; a host runtime is not inherently required for an app running only inside LXC."
|
||||
},
|
||||
"which": {
|
||||
"heading": "Which Coral do I have?",
|
||||
@@ -20,7 +20,7 @@
|
||||
"headerInstall": "Install type",
|
||||
"headerReboot": "Reboot?",
|
||||
"pcieForm": "M.2 / Mini-PCIe",
|
||||
"pcieFormSub": "(dual-edge TPU on an M.2 card)",
|
||||
"pcieFormSub": "(M.2 cards include single- and dual-Edge-TPU variants)",
|
||||
"pcieDetect": "PCI vendor <code>1ac1</code>",
|
||||
"pcieInstall": "Kernel module (gasket + apex) via DKMS",
|
||||
"pcieReboot": "Yes",
|
||||
@@ -32,15 +32,15 @@
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Before you start",
|
||||
"coral": "<strong>A Coral TPU plugged into the host</strong> (M.2, Mini-PCIe or USB). No Coral means no install — the script just tells you nothing was detected and exits.",
|
||||
"coral": "<strong>A connected Coral TPU</strong> (M.2, Mini-PCIe or USB) is required for installation. Without detected hardware, the script can still offer cleanup or removal of an existing installation; it will not install a new hardware path.",
|
||||
"coralCheck": "lspci -d 1ac1: ; lsusb | grep -E '1a6e:089a|18d1:9302'",
|
||||
"internet": "<strong>Internet access</strong> on the host — for PCIe the DKMS path clones a GitHub repo, for USB it adds a Google APT repo and downloads the <code>libedgetpu1-std</code> package.",
|
||||
"headers": "<strong>Kernel headers available via APT</strong>. On Proxmox this means <code>proxmox-headers-$(uname -r)</code> must be installable — needed only for the PCIe/M.2 path, but the script fetches it automatically so you don't have to.",
|
||||
"reboot": "<strong>Be OK with a reboot</strong> if you have PCIe hardware. The kernel module is built and loaded at the end, but a fresh boot is the clean way to confirm it comes up on its own."
|
||||
"reboot": "<strong>Plan a reboot</strong> for PCIe hardware. The script attempts to load the built modules; a planned restart also verifies that they load automatically."
|
||||
},
|
||||
"hostPrepTip": {
|
||||
"title": "This only prepares the host",
|
||||
"body": "Installing Coral here makes the host <em>ready</em> — the TPU is visible to the host kernel and can be handed to an LXC. To actually <em>use</em> it from a container (Frigate, DeepStack, etc.), the next step is <lxcLink>Add Coral TPU to an LXC</lxcLink>."
|
||||
"body": "This prepares the host for <em>device access</em>; it does not configure or test an application. To <em>use</em> Coral in a compatible container application such as Frigate, continue with <lxcLink>Add Coral TPU to an LXC</lxcLink>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Running the installer",
|
||||
@@ -60,28 +60,28 @@
|
||||
"<code>1a6e:089a</code> — Global Unichip, <em>unprogrammed</em> state (before the Edge TPU runtime talks to it the first time).",
|
||||
"<code>18d1:9302</code> — Google, <em>programmed</em> state (after the runtime loads firmware onto it)."
|
||||
],
|
||||
"outro": "If neither is found, you get an informative dialog and the script exits cleanly — no partial changes on the host."
|
||||
"outro": "If no Coral is detected and no installation exists, the script exits with an explanatory dialog. Existing components can still trigger the cleanup or removal menu."
|
||||
},
|
||||
"prompt": {
|
||||
"title": "Pre-install prompt",
|
||||
"body": "Before touching anything, a single dialog summarises what was detected and what will be installed. You can cancel here without any side effects.",
|
||||
"body": "Before the installation steps, a dialog lists detected devices and the planned components. Cancel to skip installation. Optional legacy cleanup has its own earlier confirmation.",
|
||||
"imageAlt": "Pre-install dialog showing detected Coral hardware (M.2/PCIe count + USB count) and the list of steps the installer will run"
|
||||
},
|
||||
"pcie": {
|
||||
"title": "PCIe path — gasket + apex kernel modules via DKMS",
|
||||
"body": "Only runs if the script found a PCIe / M.2 Coral. It's the heavier of the two paths because it's compiling a kernel module for your exact running kernel.",
|
||||
"items": [
|
||||
"<strong>Cleanup.</strong> If a previous <code>gasket-dkms</code> install left dpkg in a broken state (typical after a PVE 9 kernel upgrade where DKMS autoinstall failed silently), force-purge it.",
|
||||
"<strong>Cleanup.</strong> Any existing <code>gasket-dkms</code> package is removed before rebuilding; if it is in a broken package state, the script forces its removal and purge.",
|
||||
"<strong>Install build deps:</strong> <code>git</code>, <code>dkms</code>, <code>build-essential</code>, <code>proxmox-headers-$(uname -r)</code>."
|
||||
],
|
||||
"cloneIntro": "<strong>Clone the driver source.</strong> Prefers the <feranickLink>feranick/gasket-driver</feranickLink> community fork (actively maintained, kernel 6.12+ ready). Falls back to <googleLink>google/gasket-driver</googleLink> if feranick is unreachable, applying kernel-specific patches:",
|
||||
"cloneIntro": "<strong>Clone the driver source.</strong> Prefers <feranickLink>feranick/gasket-driver</feranickLink>, falling back to <googleLink>google/gasket-driver</googleLink> if unavailable. A successful build still depends on kernel compatibility. The Google fallback receives these version-dependent patches:",
|
||||
"kernelPatches": [
|
||||
"Kernel 6.5+ : <code>no_llseek</code> removed upstream → <code>noop_llseek</code> substitution",
|
||||
"For kernel 6.5+, the fallback patch replaces <code>no_llseek</code> with <code>noop_llseek</code>.",
|
||||
"Kernel 6.13+ : <code>MODULE_IMPORT_NS(DMA_BUF)</code> requires string literal"
|
||||
],
|
||||
"afterItems": [
|
||||
"<strong>Stage sources under <code>/usr/src/gasket-1.0/</code>,</strong> generate <code>dkms.conf</code>, register with <code>dkms add</code>.",
|
||||
"<strong>Build + install:</strong> <code>dkms build</code> then <code>dkms install</code>. If anything fails, the last 50 lines of <code>make.log</code> print to the terminal so you see the real error — no hunting in log files.",
|
||||
"<strong>Build and install:</strong> <code>dkms build</code> followed by <code>dkms install</code>. On failure, the script displays the last 50 lines of <code>make.log</code> if that file is available.",
|
||||
"<strong>Create the <code>apex</code> group + udev rules</strong> (<code>/etc/udev/rules.d/99-coral-apex.rules</code>) so <code>/dev/apex_*</code> nodes get the right group on the next boot.",
|
||||
"<strong>Load the modules:</strong> <code>modprobe gasket</code> + <code>modprobe apex</code>."
|
||||
],
|
||||
@@ -92,16 +92,16 @@
|
||||
"body": "Only runs if a USB Accelerator was detected. Much simpler:",
|
||||
"items": [
|
||||
"<strong>Add Google's GPG key</strong> to <code>/etc/apt/keyrings/coral-edgetpu.gpg</code>.",
|
||||
"<strong>Add the APT repository</strong> to <code>/etc/apt/sources.list.d/coral-edgetpu.list</code> with <code>signed-by=</code> pointing at the keyring (modern, non-deprecated format).",
|
||||
"<strong>Add the APT repository</strong> in <code>/etc/apt/sources.list.d/coral-edgetpu.list</code>, with <code>signed-by=</code> restricting verification to its keyring. This is one-line .list syntax, not deb822 .sources syntax.",
|
||||
"<strong>Install <code>libedgetpu1-std</code></strong> — the standard-performance Edge TPU runtime.",
|
||||
"<strong>Reload udev</strong> so the rules shipped with the package apply to the USB device without having to unplug/replug."
|
||||
],
|
||||
"stdTitle": "Why libedgetpu1-std and not libedgetpu1-max?",
|
||||
"stdBody": "The <code>max</code> variant overclocks the Coral and runs hotter. Fine for desktop use with airflow; not recommended inside small NUC / Mini-PC builds or passively cooled Proxmox hosts. If you really want it, install by hand afterwards: <code>apt install libedgetpu1-max</code>."
|
||||
"stdBody": "The <code>max</code> package enables the maximum supported clock frequency, increasing performance, power use and heat compared with the standard runtime. Check the accelerator’s cooling and operating conditions before switching. The packages are mutually exclusive; install the alternative with <code>apt install libedgetpu1-max</code>."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Reboot prompt (only if PCIe ran)",
|
||||
"body": "If the PCIe path ran, the script offers a reboot. The modules were <code>modprobe</code>'d already so in theory you can skip the reboot — but a clean boot is the right way to verify the module comes up on its own and <code>/dev/apex_0</code> appears with group <code>apex</code>. For USB-only installs, no reboot is suggested (the runtime and udev rules are active immediately).",
|
||||
"body": "After the PCIe path, the script offers a reboot. It has attempted <code>modprobe</code>, but verify that the modules load and <code>/dev/apex_0</code> appears with group <code>apex</code>. A planned reboot also checks automatic loading. USB-only installation does not prompt for a host reboot.",
|
||||
"imageAlt": "Final summary + reboot prompt after a PCIe install"
|
||||
}
|
||||
},
|
||||
@@ -125,18 +125,18 @@
|
||||
"reinstallHeading": "Reinstall / update",
|
||||
"reinstallBody": "Continues with the normal install flow — useful after a kernel upgrade if the DKMS rebuild didn't happen automatically, or to lift the runtime to a newer <code>libedgetpu1-*</code> from the Google Coral apt repo. The previous DKMS state is cleaned up first so a half-installed package from a failed earlier attempt doesn't block the new build.",
|
||||
"uninstallHeading": "Uninstall — what gets removed",
|
||||
"uninstallIntro": "Confirms with a yes/no dialog before doing anything (LXC containers with apex passthrough will lose access to <code>/dev/apex_*</code> after the next reboot — the warning makes that clear). Then it performs a full, idempotent rollback:",
|
||||
"uninstallIntro": "Requires confirmation before removal. LXC applications using <code>/dev/apex_*</code> may lose access during removal or after the next reboot. The removal sequence is:",
|
||||
"uninstallItems": [
|
||||
"Unloads the <code>apex</code> and <code>gasket</code> kernel modules.",
|
||||
"Attempts to unload <code>apex</code> and <code>gasket</code>; active users can prevent module removal.",
|
||||
"Removes every DKMS-registered <code>gasket/<version></code> entry so the modules don't come back on the next kernel install.",
|
||||
"Purges the <code>gasket-dkms</code>, <code>libedgetpu1-std</code> and <code>libedgetpu1-max</code> apt packages, then runs <code>apt-get autoremove --purge</code>.",
|
||||
"Deletes the udev rule <code>/etc/udev/rules.d/99-coral-apex.rules</code> ProxMenux wrote; restores the upstream <code>60-gasket-dkms.rules</code> group to its default if it's still present.",
|
||||
"Removes the <code>apex</code> system group <strong>only if no users still belong to it</strong> — if you mapped a custom user into <code>apex</code> for an LXC passthrough, the group is left in place and a warning prints the current members.",
|
||||
"Cleans the Google Coral apt repository entry and keyring (<code>/etc/apt/sources.list.d/coral-edgetpu.list</code> + <code>coral-edgetpu-archive-keyring.gpg</code>).",
|
||||
"Checks the supplementary member list of <code>apex</code>. <strong>If that list is empty</strong>, it attempts group removal; otherwise it retains <code>apex</code> and lists its members. This is not a complete check of primary-group users.",
|
||||
"Removes the repository list <code>/etc/apt/sources.list.d/coral-edgetpu.list</code>, the legacy <code>coral-cloud.list</code> and old keyrings named <code>coral-edgetpu-archive-keyring.gpg</code>. The current keyring at <code>/etc/apt/keyrings/coral-edgetpu.gpg</code> is not removed by this sequence.",
|
||||
"Prompts for a reboot at the end <strong>only if the PCIe path was installed</strong> — the cleanest way to flush the kernel modules. USB-only uninstalls don't need one."
|
||||
],
|
||||
"lxcWarnTitle": "LXC containers with apex passthrough",
|
||||
"lxcWarnBody": "Uninstalling on the host invalidates the device path mapped into any LXC container configured for apex passthrough. Plan the operation during a maintenance window if Frigate / DeepStack / similar workloads depend on it."
|
||||
"lxcWarnBody": "Removing the host components can break LXC device access. Schedule maintenance if compatible applications such as Frigate depend on this Coral."
|
||||
},
|
||||
"updates": {
|
||||
"heading": "Update notifications",
|
||||
@@ -145,7 +145,7 @@
|
||||
"headerTracked": "Tracked version",
|
||||
"headerUpstream": "Upstream source",
|
||||
"pcieVariant": "PCIe / M.2",
|
||||
"pcieTracked": "<code>gasket-dkms</code> Debian version (or the DKMS-registered version if the package was force-removed)",
|
||||
"pcieTracked": "Recorded release tag from the successful installation, then a healthy <code>gasket-dkms</code> package version, with the DKMS module version as fallback. The bare DKMS version does not identify the fork’s patch level.",
|
||||
"pcieUpstream": "Latest tag of <code>feranick/gasket-driver</code> on GitHub (7-day cache, build-number comparison)",
|
||||
"usbVariant": "USB",
|
||||
"usbTracked": "<code>libedgetpu1-std</code> or <code>libedgetpu1-max</code> apt version",
|
||||
@@ -153,8 +153,8 @@
|
||||
"outro": "When a newer version is detected the Monitor fires a <code>coral_driver_update_available</code> notification on every enabled channel (Telegram, Discord, Gotify, ntfy, email, webhook). The notification points back at the same installer entry — pick <strong>Reinstall / update</strong> from the action menu above to apply it.",
|
||||
"antiTitle": "Anti-cascade by design",
|
||||
"antiBody": "One notification per variant, only when the upstream version actually changes — never on every 24h scan. If you ignore an update it doesn't re-ping you until a newer release lands.",
|
||||
"rebootTitle": "Reboot is only needed for the PCIe path",
|
||||
"rebootBody": "The gasket DKMS rebuild loads new kernel modules — that needs a reboot to be active. The USB runtime upgrade is a user-space library swap, no reboot required."
|
||||
"rebootTitle": "PCIe updates: plan a reboot",
|
||||
"rebootBody": "A rebuilt PCIe module must be loaded before it takes effect; a planned reboot also verifies automatic loading. A USB userspace-library upgrade needs no host reboot, but applications using the old library may need a restart."
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Manual equivalent",
|
||||
@@ -170,13 +170,13 @@
|
||||
"troubleshoot": {
|
||||
"heading": "Troubleshooting",
|
||||
"dkmsFailTitle": "DKMS build fails after a kernel upgrade",
|
||||
"dkmsFailBody": "Most common cause on PVE 9: the running kernel bumped but <code>proxmox-headers-$(uname -r)</code> isn't installed for it yet. Check with <code>dpkg -l proxmox-headers-$(uname -r)</code>. Install the missing headers and re-run the script — ProxMenux's <code>cleanup_broken_gasket_dkms</code> step handles any leftover half-configured package state.",
|
||||
"dkmsFailBody": "Missing headers are one possible cause. Verify <code>proxmox-headers-$(uname -r)</code> with <code>dpkg -l proxmox-headers-$(uname -r)</code>. Install them if missing, then inspect the build log for source/kernel incompatibility. Re-running invokes <code>cleanup_broken_gasket_dkms</code>, but cleanup cannot guarantee compatibility with every kernel.",
|
||||
"apexMissTitle": "/dev/apex_0 missing after reboot",
|
||||
"apexMissBody": "The module isn't loaded. Try <code>modprobe apex</code> by hand. If that errors, check <code>dmesg | grep -iE \"apex|gasket\"</code> for the real failure — common culprits are kernel version mismatch (DKMS was built for a different kernel than the one you booted) or a firmware upgrade that disabled the PCIe slot the Coral is in.",
|
||||
"apexMissBody": "Check whether the PCIe device is detected and the module matches the running kernel. Try <code>modprobe apex</code> and inspect <code>dmesg | grep -iE \"apex|gasket\"</code>. Build failures, module loading or slot/firmware configuration can prevent device creation.",
|
||||
"lxcMissTitle": "Can see /dev/apex_0 but LXC can't",
|
||||
"lxcMissBody": "Host is fine. Problem is passthrough config — see <lxcLink>Add Coral TPU to an LXC</lxcLink>.",
|
||||
"lxcMissBody": "A visible host node alone does not prove the device works. Verify host access, then the LXC mount, cgroup rules and numeric user/group permissions. See <lxcLink>Add Coral TPU to an LXC</lxcLink>.",
|
||||
"usbUnreachTitle": "USB Accelerator detected but Frigate / TFLite can't reach it",
|
||||
"usbUnreachBody": "Check the udev rules shipped with <code>libedgetpu1-std</code> took effect: <code>ls -l /dev/bus/usb/*/*</code>. The device should NOT be owned by root:root with mode 0600 — if it is, run <code>udevadm control --reload-rules && udevadm trigger</code> on the host, unplug the USB Coral, wait 3 seconds and plug it back in.",
|
||||
"usbUnreachBody": "Check the rules supplied by <code>libedgetpu1-std</code> and inspect permissions with <code>ls -l /dev/bus/usb/*/*</code>. The application’s mapped user/group needs read/write access; root ownership alone is not an error. After changing rules, run <code>udevadm control --reload-rules && udevadm trigger</code> and reconnect the device if needed.",
|
||||
"logTitle": "Install log",
|
||||
"logBody": "Every run writes to <code>/tmp/coral_install.log</code> on the host. If the DKMS build dies, the script also appends the last 50 lines of <code>/var/lib/dkms/gasket/1.0/build/make.log</code> to that log — attach it when asking for help on GitHub."
|
||||
},
|
||||
@@ -196,7 +196,7 @@
|
||||
{
|
||||
"label": "ProxMenux Monitor — Hardware tab",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — the Coral modal that surfaces driver, modules, device nodes, runtime status and live temperature once the host install is done."
|
||||
"tail": " — the Coral panel shows driver, modules, device nodes and runtime status, plus temperature when a supported sensor exposes it."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -10,11 +10,11 @@
|
||||
},
|
||||
"intro": {
|
||||
"title": "What this does",
|
||||
"body": "ProxMenux automates the whole NVIDIA driver lifecycle on the host: detects your GPU, offers maintained NVIDIA branches that list its PCI Device ID, blacklists <code>nouveau</code>, downloads and runs the official NVIDIA <code>.run</code> installer with DKMS, installs the <code>nvidia-persistenced</code> service and udev rules, and offers to apply the optional NVENC patch. The DKMS build is the final compatibility check against the running kernel. If you already have LXC containers with NVIDIA passthrough, it can update their userspace libraries to match the host."
|
||||
"body": "ProxMenux detects the GPU and offers maintained NVIDIA branches listing its PCI ID. It blacklists <code>nouveau</code>, downloads the official <code>.run</code> installer, uses DKMS, installs <code>nvidia-persistenced</code>, udev rules and the NVIDIA Container Toolkit, and offers an optional NVENC patch. Build checks assess the running kernel; successful compilation does not guarantee every app works. Existing NVIDIA LXCs are offered a userspace library update, version-matched except on Arch."
|
||||
},
|
||||
"who": {
|
||||
"heading": "Who is this for?",
|
||||
"body": "If you have an NVIDIA GPU and you want to use it for hardware-accelerated transcoding in Plex, Jellyfin, Frigate, Immich, Stable Diffusion or any other app running <strong>inside an LXC container</strong>, you need to install the driver on the Proxmox <em>host</em> first. This page covers that host-side install. Passing the GPU to a <strong>virtual machine (VM)</strong> uses a different flow (VFIO passthrough) and is documented separately."
|
||||
"body": "For GPU-accelerated video or compute apps such as Plex, Jellyfin, Frigate, Immich or Stable Diffusion <strong>inside LXC</strong>, install the supported NVIDIA driver on the Proxmox <em>host</em> first. Assigning a GPU directly to a <strong>VM</strong> uses the separate VFIO workflow."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Before you start",
|
||||
@@ -22,11 +22,11 @@
|
||||
"gpuCheck": "lspci | grep -i nvidia",
|
||||
"notVm": "The GPU <strong>is not currently assigned to a VM via VFIO passthrough</strong>. If it is, the script will refuse to install the host driver to avoid breaking the passthrough config.",
|
||||
"internet": "Internet access on the host. The installer downloads the driver from <code>download.nvidia.com</code> and, optionally, clones <code>nvidia-persistenced</code> and <code>nvidia-patch</code> from GitHub.",
|
||||
"space": "Some free space in <code>/opt/nvidia</code> for the <code>.run</code> installer plus the RAM used during the build. When propagating to LXCs on non-Arch distros, each container needs at least 1.5 GB free; ProxMenux temporarily raises container RAM to 2 GB and restores it after. A reboot is required at the end of the host install."
|
||||
"space": "Allow disk space in <code>/opt/nvidia</code> for the <code>.run</code> installer and RAM for compilation. The non-Arch LXC update path checks for 1500 MiB free and can request a temporary increase to 2048 MiB RAM if lower, restoring the prior limit afterwards. Plan for the host reboot prompt."
|
||||
},
|
||||
"vmWarn": {
|
||||
"title": "GPU assigned to a VM? Stop here",
|
||||
"body": "If the GPU is currently bound to <code>vfio-pci</code> (i.e. it is being passed through to a VM), installing the host driver can break the passthrough and destabilise the system. ProxMenux detects this and aborts. Remove the GPU from the VM passthrough configuration and reboot before running this script."
|
||||
"body": "If any NVIDIA device is bound to <code>vfio-pci</code>, this installer aborts, including when the VM is stopped. A reserved device is not necessarily in active use by a VM. Plan the return to host-driver mode and remove obsolete VM and VFIO assignments before rebooting and installing."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Running the installer",
|
||||
@@ -35,30 +35,30 @@
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "How the script runs",
|
||||
"body": "The installer goes through three phases with clear separation between \"collecting information and validating\" and \"actually touching the host\". Until the final confirmation, nothing has been changed."
|
||||
"body": "The workflow detects devices, selects a release and performs installation. A separately confirmed stale-VFIO cleanup can occur before the overview. Repository/header preparation and downloading also precede replacement of the existing driver, so there is no single final confirmation after which all changes begin."
|
||||
},
|
||||
"walkthrough": {
|
||||
"detect": {
|
||||
"title": "GPU detection and overview",
|
||||
"body1": "The script scans the PCI bus and shows every NVIDIA video controller it finds, the current driver status (or <em>\"No NVIDIA driver installed\"</em>), and any LXC container that already has NVIDIA passthrough configured (driver version inside each one).",
|
||||
"body2": "Review the overview carefully. If the detected GPU is not what you expect, or if a container's version already matches the host, you can cancel here without side effects.",
|
||||
"body2": "Review the detected GPU and host/container versions before proceeding. Cancel at the overview if the selection is unexpected; any separately confirmed earlier VFIO cleanup has already taken place.",
|
||||
"imageAlt": "Pre-install overview showing detected GPUs, current driver status and LXC containers with NVIDIA passthrough"
|
||||
},
|
||||
"version": {
|
||||
"title": "Choose the driver version",
|
||||
"body1": "ProxMenux fetches the list of available drivers from NVIDIA and narrows the picker to versions that <strong>list your GPU's PCI Device ID in the supported chips table</strong> of the corresponding branch on <code>nvidia.com</code>. Additional heuristics discard developer / beta CDN drops that would otherwise appear at the top. The first entry is labelled <em><version> — Recommended</em>: it prefers the head of the branch of the driver already installed on the host (bugfix in place), otherwise the head of the current Production Branch, otherwise the highest supported numeric.",
|
||||
"body2": "If the currently installed driver was patched via keylase (NVENC), the picker auto-narrows to versions still covered by the patch table, so applying <em>Reinstall / update</em> without losing the patch is one click.",
|
||||
"body2": "When the installed driver is tracked as NVENC-patched through keylase, the picker narrows to versions listed in the patch table. The <em>Reinstall / update</em> workflow still includes confirmation and patch prompts; check the final patch result.",
|
||||
"whyTitle": "How kernel compatibility is validated",
|
||||
"whyBody": "The version list is filtered by NVIDIA branch maintenance and GPU PCI support, not by a hard-coded kernel/driver matrix. After selection, DKMS builds the module against the running kernel. A failed build stops the installation from being treated as valid; choose another maintained branch if NVIDIA has not adapted that release to your kernel.",
|
||||
"whyBody": "The list uses maintained branches and GPU PCI support, rather than a fixed kernel/driver matrix. A pre-build check tests the selected release against the running kernel. A confirmed build failure returns to selection; an unavailable pre-check can produce a warning and continue. Final installation and runtime checks still matter.",
|
||||
"imageAlt": "Driver version selector with GPU-supported NVIDIA branches and the Recommended entry on top"
|
||||
},
|
||||
"uninstall": {
|
||||
"title": "Clean uninstall (only if reinstalling)",
|
||||
"body": "If a driver is already present and you picked a different version, ProxMenux stops the NVIDIA services, unloads the kernel modules, removes DKMS entries and purges <code>nvidia-*</code> / <code>libnvidia-*</code> / <code>cuda-*</code> packages before touching the new installer. This avoids the classic mixed-version mess."
|
||||
"body": "After downloading and checking the selected installer, an existing driver is removed before replacement. ProxMenux stops NVIDIA services, unloads modules, removes DKMS entries and purges <code>nvidia-*</code> / <code>libnvidia-*</code> / <code>cuda-*</code> packages. This also applies to a confirmed reinstall of the same version."
|
||||
},
|
||||
"prepare": {
|
||||
"title": "Prepare the system",
|
||||
"body": "Behind a single confirmation, the script:",
|
||||
"body": "During preparation, the script:",
|
||||
"items": [
|
||||
"Checks the repositories of the host before anything is removed or installed: a host with no active subscription and only the Enterprise repository is asked before switching to no-subscription, and the installation stops when the switch is declined.",
|
||||
"Installs <code>pve-headers-$(uname -r)</code> (or <code>proxmox-headers-$(uname -r)</code>), <code>build-essential</code> and <code>dkms</code>.",
|
||||
@@ -68,7 +68,7 @@
|
||||
},
|
||||
"download": {
|
||||
"title": "Download and run the NVIDIA installer",
|
||||
"body": "The installer downloads the <code>NVIDIA-Linux-x86_64-<version>.run</code> file into <code>/opt/nvidia</code>, validates it (size + executable signature, not just HTTP 200), then runs it with DKMS so the kernel module rebuilds automatically across kernel upgrades.",
|
||||
"body": "Downloads <code>NVIDIA-Linux-x86_64-<version>.run</code> into <code>/opt/nvidia</code>, checking file size and executable type. These are file-format checks, not cryptographic signature verification. The installer registers DKMS for rebuilds on kernel changes; source and kernel compatibility are still required.",
|
||||
"imageAlt": "Download progress followed by the NVIDIA installer running its DKMS build"
|
||||
},
|
||||
"persist": {
|
||||
@@ -77,39 +77,39 @@
|
||||
},
|
||||
"nvenc": {
|
||||
"title": "Optional: apply the NVENC patch",
|
||||
"body": "Consumer NVIDIA GPUs (GeForce line) limit the number of simultaneous NVENC encoding sessions. The community <patchLink>keylase/nvidia-patch</patchLink> removes that restriction. If you plan to use the GPU for Plex / Jellyfin / Frigate with many concurrent streams, answer <strong>Yes</strong> when prompted.",
|
||||
"body": "NVENC session limits depend on GPU and driver. The community <patchLink>keylase/nvidia-patch</patchLink> can remove the driver session limit for supported versions. Choose <strong>Yes</strong> only if you need that encoding change and your version is supported. This does not accelerate decoding or remove hardware capacity limits.",
|
||||
"supportTitle": "Check patch support for your driver",
|
||||
"supportBody": "The patch does not cover every driver version. Before relying on it in production, verify your version is listed in the <patchTableLink>patch table</patchTableLink>. If it isn't supported yet, pick a nearby older driver that is."
|
||||
"supportBody": "Check your exact release in the <patchTableLink>patch table</patchTableLink>. If it is missing, keep an unpatched driver or select another maintained release that supports your GPU and kernel as well as the patch; do not choose an older release solely because it is nearby in the list."
|
||||
},
|
||||
"propagate": {
|
||||
"title": "Optional: propagate the driver to LXC containers",
|
||||
"body1": "If the overview screen listed containers with NVIDIA passthrough, ProxMenux now offers to update the userspace libraries inside each one to match the host. Host kernel module and container userspace <strong>must be the exact same version</strong> — otherwise <code>nvidia-smi</code> inside the container will fail with a \"version mismatch\" error.",
|
||||
"body2": "The update is distro-aware. For Debian / Ubuntu and other glibc distros, the same <code>.run</code> installer (with <code>--no-kernel-modules --no-dkms --no-install-compat32-libs</code>) is pushed into the container and executed; container RAM is temporarily raised to 2 GB if lower and restored after. For <strong>Arch, Manjaro and EndeavourOS</strong> the update is a <code>pacman -Syu nvidia-utils</code> pinned to the host's driver branch. <strong>Alpine</strong> uses a different path — the <code>.run</code> is extracted on the host, only the userspace libraries are packaged as a tarball and pushed with <code>pct push</code>, then <code>gcompat</code> + <code>binutils</code> shims are installed via <code>apk</code> and SONAME symlinks are recreated with <code>readelf</code> so the glibc-linked libraries load correctly on musl.",
|
||||
"body2": "Debian / Ubuntu and other glibc containers receive the extracted <code>.run</code> installer with <code>--no-kernel-modules --no-dkms --no-install-compat32-libs</code>; RAM can temporarily increase to 2 GiB and is restored afterwards. <strong>Arch, Manjaro and EndeavourOS</strong> use <code>pacman -Syu nvidia-utils</code> from configured repositories, without pinning to the host version: verify the result. <strong>Alpine</strong> receives the extracted <code>.run</code> payload through <code>pct push</code>, installs <code>gcompat</code> and <code>binutils</code> with <code>apk</code>, and builds SONAME links using <code>readelf</code>. Check runtime functionality; compatibility shims do not guarantee every driver library works on musl.",
|
||||
"imageAlt": "Prompt listing LXCs with NVIDIA passthrough and current driver version, with Yes/No to update them all"
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Reboot",
|
||||
"body": "Finally, the script rebuilds <code>initramfs</code> for all kernels and offers to reboot. A reboot <strong>is required</strong>: the nouveau blacklist and the new kernel module only take effect after restart."
|
||||
"body": "After the driver installation, the script rebuilds <code>initramfs</code> for all kernels; its last step offers a reboot. <strong>Plan that restart</strong> to verify the persistent module and nouveau configuration on a fresh boot, even when the new driver already responds before reboot."
|
||||
}
|
||||
},
|
||||
"reinstallUninstall": {
|
||||
"heading": "Reinstall or uninstall",
|
||||
"intro": "When the installer detects that the <code>nvidia</code> kernel module is currently loaded and <code>nvidia-smi</code> returns a version, it doesn't silently re-install on top. Instead it shows an action menu so you can choose what to do. (Binaries present on disk but the module not loaded do not count as installed — the module has to be live.)",
|
||||
"intro": "If <code>nvidia</code> is loaded and <code>nvidia-smi</code> returns a version, an action menu appears. This identifies an active driver for the menu; driver files can still be installed even when the module is not loaded.",
|
||||
"imageAlt": "NVIDIA action menu offered when a driver is already installed — two choices: Reinstall / update driver, or Uninstall the NVIDIA driver completely",
|
||||
"imageCaption": "The action menu only appears when an NVIDIA driver is currently active on the host.",
|
||||
"reinstallHeading": "Reinstall / update",
|
||||
"reinstallBody": "Continues with the normal install flow but, before downloading anything, runs a clean removal of the current driver (apt purge + DKMS entries dropped + leftover modules unloaded). This is the safe path to apply a newer same-branch version, choose another maintained branch when needed, or recover from a half-broken state. The LXC propagation and NVENC patch prompts re-run at the end.",
|
||||
"reinstallBody": "Continues through release selection, repository/header preparation, download and pre-build checking before removing the old driver and installing the new one. It can update within a maintained branch or select another supported branch. LXC library and NVENC patch prompts appear again afterwards.",
|
||||
"uninstallHeading": "Uninstall — what gets removed",
|
||||
"uninstallIntro": "Confirms with a yes/no dialog first. Then performs a full, idempotent rollback:",
|
||||
"uninstallIntro": "After a yes/no confirmation, the uninstall removes the following driver components:",
|
||||
"uninstallItems": [
|
||||
"Runs <code>nvidia-uninstall --silent</code> first (the counterpart to the <code>.run</code> installer), then stops and disables <code>nvidia-persistenced</code> and <code>nvidia-powerd</code>, and unloads the kernel modules (<code>nvidia_uvm</code>, <code>nvidia_drm</code>, <code>nvidia_modeset</code>, <code>nvidia</code>) — any LXC container with NVIDIA passthrough will be cleanly cut off.",
|
||||
"Runs <code>apt purge</code> on <code>nvidia-*</code>, <code>libnvidia-*</code>, <code>cuda-*</code> and <code>libcudnn*</code>, removes the DKMS source tree and the <code>/opt/nvidia</code> .run installer cache.",
|
||||
"Stops and disables <code>nvidia-persistenced</code> and <code>nvidia-powerd</code>, attempts to unload <code>nvidia_uvm</code>, <code>nvidia_drm</code>, <code>nvidia_modeset</code> and <code>nvidia</code>, then runs <code>nvidia-uninstall --silent</code> for the <code>.run</code> installation. NVIDIA-dependent LXC workloads are affected; active clients can prevent unloading.",
|
||||
"Runs <code>apt purge</code> on <code>nvidia-*</code>, <code>libnvidia-*</code>, <code>cuda-*</code> and <code>libcudnn*</code>, removes the DKMS source tree and the <code>nvidia-persistenced</code> and <code>nvidia-patch</code> folders under <code>/opt/nvidia</code>.",
|
||||
"Removes the modules-load config (<code>/etc/modules-load.d/nvidia-vfio.conf</code>) and the nouveau blacklist entries owned by ProxMenux. Legacy two-line ProxMenux blacklist files are migrated and removed too; modified or unrelated administrator files are preserved.",
|
||||
"Removes the udev rules (<code>/etc/udev/rules.d/70-nvidia.rules</code>) and clears the NVENC patch state (a field in the ProxMenux managed-installs registry, set to <em>removed</em> — no separate file to delete).",
|
||||
"Rebuilds <code>initramfs</code> for all kernels, runs <code>proxmox-boot-tool refresh</code> on systemd-boot hosts, and prompts for a reboot to finalise."
|
||||
],
|
||||
"lxcWarnTitle": "LXC containers with NVIDIA passthrough",
|
||||
"lxcWarnBody": "Removing the host driver invalidates the device paths and CUDA libraries mapped into any LXC with NVIDIA passthrough. Plan the operation during a maintenance window if Frigate / Plex / Jellyfin / Ollama (or anything else) depends on it."
|
||||
"lxcWarnBody": "Removing the host driver interrupts NVIDIA-dependent LXC workloads, even when their userspace libraries remain installed. Schedule maintenance for Frigate, Plex, Jellyfin, Ollama or other apps that use the GPU."
|
||||
},
|
||||
"updates": {
|
||||
"heading": "Update notifications",
|
||||
@@ -121,26 +121,26 @@
|
||||
"antiTitle": "Anti-cascade by design",
|
||||
"antiBody": "One notification per distinct upstream version, never on every 24h scan. If no newer release exists in the installed branch, the tracker stays quiet.",
|
||||
"applyTitle": "Applying the update",
|
||||
"applyBody": "The Monitor doesn't auto-apply driver updates — reinstalling the NVIDIA driver always needs a reboot. Open the same installer entry described above, pick <strong>Reinstall / update</strong>, and the new version is downloaded, the DKMS module rebuilt against the running kernel, and the reboot prompted at the end."
|
||||
"applyBody": "Monitor reports updates without installing them automatically. Open the installer and choose <strong>Reinstall / update</strong>, select a supported version, and complete its build and installation steps. The workflow ends with a reboot prompt; plan the restart and verify the host and LXC libraries afterwards."
|
||||
},
|
||||
"verify": {
|
||||
"heading": "Verifying the install",
|
||||
"intro": "Once the host is back up, log in over SSH or the Proxmox shell and run:",
|
||||
"after": "You should see your GPU listed, the driver version on the top border, and no processes yet (nothing is using the GPU at this point). Then check the persistence service:",
|
||||
"after": "Check that your GPU and the expected driver version appear. Processes may already be listed if host services or autostarted containers use the GPU. Then check the persistence service:",
|
||||
"imageAlt": "Output of nvidia-smi on the host showing the detected GPU and installed driver version"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Troubleshooting",
|
||||
"smiFailTitle": "`nvidia-smi` says 'NVIDIA-SMI has failed'",
|
||||
"smiFailBody": "Almost always a <strong>nouveau</strong> still loaded or a <strong>kernel header mismatch</strong>. After reboot, run <code>lsmod | grep nouveau</code> — if it returns anything, check <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code>, rebuild initramfs with <code>update-initramfs -u -k all</code>, and reboot. If nouveau is gone, check <code>dmesg | grep -i nvidia</code> — DKMS build errors usually mean the headers do not match the running kernel.",
|
||||
"smiFailBody": "Possible causes include <strong>nouveau</strong> claiming the GPU, <strong>missing or mismatched kernel headers</strong>, incompatible driver sources or other module-load errors. Inspect <code>lsmod | grep nouveau</code> and <code>dmesg | grep -i nvidia</code>, plus the installer/DKMS logs. If nouveau policy needs fixing, check <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code> before rebuilding with <code>update-initramfs -u -k all</code> and rebooting. Do not assume every build error is a header mismatch.",
|
||||
"lxcMissTitle": "LXC container can't see the GPU after host update",
|
||||
"lxcMissBody": "The container's userspace libraries are stuck at the previous driver version. Either re-run the NVIDIA installer and accept the LXC propagation prompt, or install the same driver version manually inside the container with <code>--no-kernel-modules</code>.",
|
||||
"lxcMissBody": "Check host device nodes, LXC permissions and the driver-library version before reinstalling. A version mismatch can require the matching userspace driver inside the LXC, using the supported distro path; on glibc systems the installer uses <code>--no-kernel-modules</code>. Reinstalling libraries will not repair missing device mounts or permissions.",
|
||||
"logTitle": "Check the install log",
|
||||
"logBody": "Every install writes to <code>/tmp/nvidia_install.log</code>. If something fails silently, that file has the full output (downloads, DKMS build, service installs). Attach it when reporting issues on GitHub."
|
||||
},
|
||||
"manualSteps": {
|
||||
"heading": "Looking for the manual steps?",
|
||||
"body": "The original community guide — installing everything by hand with <code>wget</code> and <code>./NVIDIA-Linux-...run</code> — is still available as a reference under <guideLink>Guides → NVIDIA</guideLink>. It's useful if you want to understand every command the ProxMenux installer runs, or if you're troubleshooting an unusual setup. For day-to-day installs, use ProxMenux — it's the path that keeps receiving fixes (kernel compatibility, LXC propagation, VFIO safety checks)."
|
||||
"body": "See <guideLink>Guides → NVIDIA</guideLink> for manual background, including <code>wget</code> and <code>./NVIDIA-Linux-...run</code>. It explains the components but is not an exact transcript of the automated installer. Use the maintained ProxMenux workflow for its GPU filtering, build checks, LXC updates and VFIO checks."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Related",
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
},
|
||||
"header": {
|
||||
"title": "Switch GPU Mode (VM ↔ LXC)",
|
||||
"description": "Reassign a GPU that's already in use — flip it from VM passthrough to LXC sharing or the other way round. ProxMenux handles all the host-side binding changes (vfio.conf, driver blacklist, modules, initramfs) and offers a clean policy for every VM or LXC currently using the GPU, so the switch doesn't leave broken config behind.",
|
||||
"description": "Move an assigned GPU between VM passthrough and LXC sharing. ProxMenux manages the host driver binding, VFIO configuration, module settings and initramfs, and asks how to handle affected guests. Review those choices and verify the resulting configuration after reboot.",
|
||||
"section": "Hardware: GPUs and Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
@@ -42,21 +42,21 @@
|
||||
},
|
||||
{
|
||||
"situation": "I just want to completely unbind a GPU from everything.",
|
||||
"use": "Yes — pick the LXC-mode target and then detach manually."
|
||||
"use": "LXC mode restores host-driver ownership; the VM conflict policy can remove hostpci entries, but LXC device entries must be removed separately. This does not leave the GPU unbound from every driver."
|
||||
}
|
||||
]
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Before you start",
|
||||
"assigned": "<strong>A GPU already assigned</strong> — either in a VM via VFIO or attached to at least one LXC. If you haven't assigned it yet, start from Add GPU to VM / LXC instead.",
|
||||
"iommu": "<strong>IOMMU enabled on the host</strong> — only strictly required when switching <em>to</em> VM mode, but worth having on either way. If the kernel param is missing the script auto-adds <code>intel_iommu=on iommu=pt</code> or <code>amd_iommu=on</code> to the boot command line (via <code>proxmox-boot-tool refresh</code> on systemd-boot or <code>update-grub</code> on GRUB) and includes it in the reboot prompt at the end.",
|
||||
"iommu": "<strong>IOMMU must be active on the host</strong> when switching <em>to</em> VM mode. Firmware settings and kernel support both matter. If <code>intel_iommu=on</code> or <code>amd_iommu=on</code> is missing from the running kernel, the script adds it with <code>iommu=pt</code> to <code>/etc/kernel/cmdline</code> (ZFS-root marker) or <code>/etc/default/grub</code>, then runs <code>proxmox-boot-tool refresh</code> or <code>update-grub</code>. Check any warnings and reboot when prompted.",
|
||||
"iommuCheck": "dmesg | grep -i 'IOMMU enabled' | head -1",
|
||||
"reboot": "<strong>Be OK with a reboot.</strong> Switching GPU bindings at the kernel level means the host regenerates initramfs and you reboot to apply. The script prompts at the end.",
|
||||
"reboot": "<strong>Plan for a reboot.</strong> Persistent driver and boot changes may require rebuilding initramfs and rebooting. The script presents a reboot prompt at the end.",
|
||||
"knowList": "<strong>Know which VMs / LXCs are using the GPU.</strong> The script will find them and ask what to do with each, but it's faster if you already know the list."
|
||||
},
|
||||
"blocklist": {
|
||||
"title": "Not all GPUs are safe to pass to a VM",
|
||||
"body": "A small blocklist of GPU IDs is refused for VM mode due to known passthrough instability (e.g. Intel Arc A770 <code>8086:5a84</code> / <code>8086:5a85</code>). If the selected GPU matches, the script explains why and exits. Switching <em>to</em> LXC mode is always allowed."
|
||||
"body": "The script blocks VM mode for device IDs <code>8086:5a84</code> and <code>8086:5a85</code> under its compatibility policy. If a selected GPU matches, it stops the VM-mode switch and returns to GPU selection, or exits when it is the only GPU. This blocklist does not prevent switching <em>to</em> LXC mode; other checks can still apply."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Running the script",
|
||||
@@ -65,7 +65,7 @@
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "How the script runs",
|
||||
"body": "Two phases as usual: everything is collected and validated first, nothing is applied until you confirm at the end."
|
||||
"body": "GPU selection and direction are reviewed before the main switch. A separate stale-VFIO cleanup can ask for confirmation earlier, and affected guests have their own conflict prompts. Read each confirmation: there is not one final confirmation covering every possible change."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Walking through the flow",
|
||||
@@ -85,27 +85,27 @@
|
||||
"intro": "Based on the current mode, the script proposes the opposite as target:",
|
||||
"items": [
|
||||
"<strong>VM → LXC:</strong> unbind from <code>vfio-pci</code>, let the native driver (<code>nvidia</code>, <code>amdgpu</code>, <code>i915</code>) reclaim the card so LXCs can share it. On NVIDIA, the per-BDF entry is removed from <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> so the nvidia module reclaims the GPU after reboot.",
|
||||
"<strong>LXC → VM:</strong> bind to <code>vfio-pci</code> so the card is free for VFIO passthrough to a single VM. On AMD / Intel this means blacklisting the native driver and setting <code>options vfio-pci ids=…</code>. On NVIDIA the <code>nvidia</code> module is <strong>not</strong> blacklisted — instead a per-BDF udev rule applies <code>driver_override=vfio-pci</code> only to the GPUs you select, so other NVIDIA GPUs on the host keep their <code>nvidia</code> driver."
|
||||
"<strong>LXC → VM:</strong> prepares <code>vfio-pci</code> ownership. AMD / Intel use native-driver blacklisting and <code>options vfio-pci ids=…</code>. For NVIDIA, <code>nvidia</code> is globally blacklisted only when every host NVIDIA GPU is in VFIO; otherwise per-BDF rules set <code>driver_override=vfio-pci</code> for the affected IOMMU-group devices, and NVIDIA GPUs outside those groups keep <code>nvidia</code>. Review every group member before switching."
|
||||
],
|
||||
"outro": "Confirm the direction or cancel."
|
||||
},
|
||||
"conflict": {
|
||||
"title": "Conflict policy per affected workload",
|
||||
"body": "The script scans every <code>/etc/pve/lxc/*.conf</code> and <code>/etc/pve/qemu-server/*.conf</code> looking for references to the GPU's PCI slot. For each affected workload you pick a policy:",
|
||||
"body": "The script checks <code>/etc/pve/lxc/*.conf</code> for GPU-device references by driver family, and <code>/etc/pve/qemu-server/*.conf</code> for PCI assignments. LXC detection is not a precise per-card BDF match. Review the detected guests and choose how to handle each:",
|
||||
"headerPolicy": "Policy",
|
||||
"headerEffect": "Effect",
|
||||
"headerWhen": "When to pick",
|
||||
"keepPolicy": "Keep config, disable onboot",
|
||||
"keepEffect": "<code>pct set -onboot 0</code> (or <code>qm set</code>). GPU lines stay in the config.",
|
||||
"keepEffect": "<code>pct set CTID -onboot 0</code> (or <code>qm set VMID -onboot 0</code>). GPU entries stay in the configuration.",
|
||||
"keepWhen": "You plan to come back to this VM/LXC once the GPU is back in its original mode. Safe default.",
|
||||
"removePolicy": "Remove GPU from config",
|
||||
"removeEffect": "<code>hostpci</code> / <code>dev</code> lines for this GPU's slot are sed'd out.",
|
||||
"removeWhen": "The VM/LXC will keep running without the GPU (CPU-only transcoding, etc.). Clean workflow.",
|
||||
"removeEffect": "Removes identified <code>hostpci</code> / <code>dev</code> entries and supported legacy device references.",
|
||||
"removeWhen": "Choose this if the guest should operate without the GPU. Check its application settings first: CPU fallback is application-dependent, and removing the device does not automatically reconfigure the app.",
|
||||
"imageAlt": "Dialog asking per-VM / per-LXC conflict policy when switching a GPU that's currently assigned"
|
||||
},
|
||||
"audio": {
|
||||
"title": "Orphan audio cleanup (only when leaving VM mode)",
|
||||
"body1": "dGPUs (NVIDIA / AMD) ship with an HDMI audio function at <code>.1</code> of the same slot, and sometimes extra audio controllers are attached alongside the GPU. When the GPU leaves the VM, those audio lines become orphans — the VM has <code>hostpci</code> entries pointing to audio devices that aren't going with the GPU.",
|
||||
"body1": "Many dedicated NVIDIA / AMD GPUs expose HDMI audio at function <code>.1</code> of the same slot; additional audio devices may also have been assigned. Removing the GPU can leave obsolete <code>hostpci</code> audio entries in the VM. Review which devices should remain assigned.",
|
||||
"body2": "The script discovers them (precise BDF match, no substring false-positives) and shows a checklist so you can remove them cleanly. It also cleans their vendor:device IDs from <code>/etc/modprobe.d/vfio.conf</code> — but only if no other VM still uses those audio IDs."
|
||||
},
|
||||
"apply": {
|
||||
@@ -119,9 +119,9 @@
|
||||
}
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Manual equivalent",
|
||||
"intro": "If you want to understand exactly what the script does (or troubleshoot one of the steps by hand), these are the raw operations for <strong>VM → LXC</strong> on an NVIDIA card with vendor:device <code>10de:2204</code>:",
|
||||
"lxcToVm": "And for <strong>LXC → VM</strong>:",
|
||||
"heading": "Manual inspection",
|
||||
"intro": "Before a <strong>VM → LXC</strong> switch, inspect the driver and existing per-BDF policy. This NVIDIA example uses vendor:device <code>10de:2204</code>; adapt it to your card. These commands inspect state; the script also manages affected guests and IOMMU-group members.",
|
||||
"lxcToVm": "Before <strong>LXC → VM</strong>, inspect the selected PCI address and its IOMMU group. Replace the example address with yours and review all group members before assigning devices.",
|
||||
"oneVmTitle": "Only one VM can use a given vfio-pci GPU at a time",
|
||||
"oneVmBody": "Putting multiple <code>hostpci</code> entries with the same PCI slot in two VMs is valid config but only one of the VMs can start with the GPU — the second one will fail. The ProxMenux conflict policy step is exactly about avoiding this trap."
|
||||
},
|
||||
@@ -131,11 +131,11 @@
|
||||
"troubleshoot": {
|
||||
"heading": "Troubleshooting",
|
||||
"stillVfioTitle": "GPU still shows vfio-pci after switching to LXC mode",
|
||||
"stillVfioBody": "<code>update-initramfs</code> didn't run (or the reboot didn't actually happen). Check <code>lsmod | grep vfio</code> — if vfio-pci is loaded, rerun <code>update-initramfs -u -k all</code> and reboot. For AMD/Intel: verify <code>vfio.conf</code> no longer contains the GPU's vendor:device ID. For NVIDIA: verify the BDF is no longer in <code>/etc/proxmenux/vfio-bind.bdfs</code> and that <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> doesn't list it.",
|
||||
"stillVfioBody": "A loaded VFIO module does not prove which driver owns this GPU. Check the card binding and whether <code>update-initramfs</code> and the reboot completed. <code>lsmod | grep vfio</code> only lists modules. For AMD / Intel inspect <code>vfio.conf</code>; for NVIDIA inspect <code>/etc/proxmenux/vfio-bind.bdfs</code> and <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code>. Correct stale policy before running <code>update-initramfs -u -k all</code> and rebooting.",
|
||||
"vmFailTitle": "A VM won't start after switching a GPU to LXC mode",
|
||||
"vmFailBody": "The VM still has <code>hostpci</code> entries pointing to a GPU it can't claim. Run the script again and pick the <em>Remove GPU from config</em> policy, or clean the config by hand:",
|
||||
"vmFailBody": "Check whether the VM still has obsolete <code>hostpci</code> references. The <em>Remove GPU from config</em> policy can remove them during the intended switch; inspect the proposed direction before rerunning the script so you do not reverse the mode unintentionally. Alternatively, remove the obsolete assignment in Proxmox with the VM stopped.",
|
||||
"smiFailTitle": "nvidia-smi fails with 'Driver/library version mismatch' after going back to LXC",
|
||||
"smiFailBody": "Host NVIDIA modules didn't reload cleanly. <code>modprobe -r nvidia</code> then <code>modprobe nvidia</code>. If that fails, reboot — a full reboot always clears residual state from the vfio binding.",
|
||||
"smiFailBody": "Compare the loaded host NVIDIA module with the installed userspace libraries, including those in LXCs. Align versions first; a reboot loads the installed module but cannot repair mismatched library packages. Reloading with <code>modprobe -r nvidia</code> and <code>modprobe nvidia</code> requires stopped GPU clients and may fail while dependent modules are in use.",
|
||||
"logTitle": "Install log",
|
||||
"logBody": "Every run writes to <code>/tmp/proxmenux_gpu_switch_mode.log</code> on the host. Attach it when asking for help on GitHub."
|
||||
},
|
||||
|
||||
@@ -1,81 +1,81 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Añadir Coral TPU a LXC | ProxMenux Documentation",
|
||||
"description": "Pasa una Google Coral TPU (USB o M.2 / PCIe) a un contenedor LXC de Proxmox. ProxMenux escribe las entradas correctas de dev / cgroup / mount para cada variante, arranca el contenedor e instala el runtime de Edge TPU dentro para que apps como Frigate puedan usar el acelerador."
|
||||
"title": "Añadir Coral TPU a LXC | Documentación de ProxMenux",
|
||||
"description": "Comparte una Google Coral TPU USB o M.2 / PCIe con un contenedor LXC de Proxmox. ProxMenux configura dispositivos, permisos y montajes, arranca el contenedor e instala el runtime Edge TPU en distribuciones compatibles."
|
||||
},
|
||||
"header": {
|
||||
"title": "Añadir Coral TPU a LXC",
|
||||
"description": "Comparte una Google Coral TPU (USB Accelerator o M.2 / Mini-PCIe) con un contenedor LXC de Proxmox. ProxMenux se encarga de la config del LXC y de la instalación del runtime Edge TPU dentro del contenedor. Coral es solo TPU: para compartir GPU / iGPU (Quick Sync, VA-API, NVENC) en el mismo contenedor, ejecuta Añadir GPU a LXC por separado.",
|
||||
"section": "Hardware: GPUs y Coral-TPU"
|
||||
"description": "Comparte una Coral USB Accelerator o M.2 / Mini-PCIe con un LXC. ProxMenux configura el contenedor y el runtime Edge TPU. Esta opción solo gestiona la TPU: para Quick Sync, VA-API o NVENC, ejecuta también Añadir GPU a LXC.",
|
||||
"section": "Hardware: GPU y Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace esto",
|
||||
"body": "Escribe la config de passthrough en <code>/etc/pve/lxc/<ctid>.conf</code> — entradas distintas dependiendo de si el host tiene un <strong>USB Accelerator</strong>, una <strong>Coral M.2 / PCIe</strong>, o ambos. Luego arranca el contenedor e instala el último runtime <code>libedgetpu</code> de Google dentro de él. El passthrough de iGPU / GPU lo gestiona un script aparte (<lxcGpuLink>Añadir GPU a LXC</lxcGpuLink>) — este se centra en la TPU."
|
||||
"title": "Qué hace",
|
||||
"body": "Escribe la configuración en <code>/etc/pve/lxc/<ctid>.conf</code> para <strong>USB Accelerator</strong>, <strong>Coral M.2 / PCIe</strong> o ambos. Arranca el contenedor e instala el runtime <code>libedgetpu</code> de Google. La GPU se gestiona por separado en <lxcGpuLink>Añadir GPU a LXC</lxcGpuLink>."
|
||||
},
|
||||
"whenUse": {
|
||||
"heading": "Cuándo usar esto",
|
||||
"body": "Caso de uso típico: ejecutar <frigateLink>Frigate</frigateLink>, Agent DVR, Blue Iris + CodeProject.AI o cualquier otra app de detección de objetos dentro de un LXC y querer que la Coral TPU haga la inferencia ML en lugar de la CPU. Con Coral, la latencia de inferencia baja de ~100 ms a ~5 ms por frame y la carga de CPU se mantiene cerca de cero."
|
||||
"heading": "Cuándo usarlo",
|
||||
"body": "Úsalo con <frigateLink>Frigate</frigateLink> u otra aplicación Linux compatible en LXC. Coral ejecuta la inferencia compatible en lugar de la CPU. El rendimiento depende del modelo y el hardware; la decodificación y el resto de la aplicación siguen consumiendo recursos."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de empezar",
|
||||
"drivers": "<strong>Drivers de Coral ya instalados en el host</strong>. Este script no los instala; solo configura el passthrough al contenedor. Ejecuta <hostLink>Install Coral TPU on the Host</hostLink> primero si no lo has hecho.",
|
||||
"drivers": "<strong>Prepara la Coral en el host</strong>. M.2 / PCIe necesita el controlador cargado; USB, acceso al dispositivo y permisos adecuados. Consulta <hostLink>Instalar Coral TPU en el host</hostLink>. El script instala el runtime de la aplicación en contenedores Debian/Ubuntu; en otras distribuciones hay que instalarlo aparte.",
|
||||
"driversCheck": "ls /dev/apex_* 2>/dev/null ; lsusb | grep -E '1a6e:089a|18d1:9302'",
|
||||
"container": "<strong>Un contenedor LXC existente</strong>, idealmente con una distro basada en <strong>Debian / Ubuntu</strong> — la instalación del runtime dentro del contenedor usa <code>apt-get</code>. Los <strong>contenedores no-Debian</strong> (Alpine, Arch, RHEL, SUSE…) siguen estando soportados en <strong>modo passthrough-only</strong>: el script detecta la distro y ofrece un prompt para saltarse la instalación APT de <code>libedgetpu</code> mientras escribe la config de passthrough del dispositivo — útil para contenedores de aplicación que ya incluyen el runtime (p.ej. la imagen Docker de Frigate).",
|
||||
"downtime": "<strong>Asume una breve interrupción</strong> del contenedor. El script lo para para aplicar los cambios de config y lo arranca de nuevo para instalar los drivers dentro. No hace falta reiniciar el host."
|
||||
"container": "<strong>Un LXC existente</strong>, preferiblemente basado en <strong>Debian / Ubuntu</strong>: la instalación usa <code>apt-get</code>. Los <strong>contenedores de otras distribuciones</strong> pueden usar el <strong>modo de solo acceso al dispositivo</strong>, que omite la instalación APT de <code>libedgetpu</code>. Resulta útil si la aplicación ya incluye ese runtime, como la imagen Docker de Frigate.",
|
||||
"downtime": "<strong>Prepara una breve interrupción</strong> del contenedor. El script lo detiene para cambiar la configuración y lo arranca para instalar el runtime. No necesita reiniciar el host para estos cambios."
|
||||
},
|
||||
"hostPrep": {
|
||||
"title": "El host debe estar preparado primero",
|
||||
"body": "Si ejecutas este script antes de instalar los drivers de Coral en el host (el módulo de kernel <code>gasket</code>/<code>apex</code> para M.2, el runtime <code>libedgetpu</code> para USB), la config del LXC se escribe igualmente pero el contenedor no encontrará el dispositivo en tiempo de ejecución. El orden importa: <strong>instalación en el host → passthrough al LXC → app dentro del contenedor</strong>."
|
||||
"body": "M.2 / PCIe necesita <code>gasket</code>/<code>apex</code> en el host y un dispositivo funcional. USB necesita conexión y permisos; la aplicación no tiene que ejecutarse en el host. El runtime <code>libedgetpu</code> debe estar donde se ejecute la app. Sigue el orden <strong>preparar host → acceso desde LXC → configurar app</strong>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Ejecutar el script",
|
||||
"body": "Abre ProxMenux en el host, ve a <strong>Hardware: GPUs and Coral-TPU → Add Coral TPU to LXC</strong>.",
|
||||
"imageAlt": "Entrada del menú 'Add Coral TPU to LXC' dentro de Hardware: GPUs and Coral-TPU"
|
||||
"body": "En ProxMenux, abre <strong>Hardware: GPU y Coral-TPU → Añadir Coral TPU a LXC</strong>.",
|
||||
"imageAlt": "Opción Añadir Coral TPU a LXC en el menú de hardware"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "Una decisión por adelantado (¿qué contenedor?), luego el script gestiona los caminos USB y PCIe de forma independiente según lo que encuentre en el host. Si ambos están presentes, ambos se pasan."
|
||||
"heading": "Cómo funciona el script",
|
||||
"body": "Elige el contenedor. El script configura el acceso USB aunque no haya una Coral USB conectada y añade M.2 / PCIe cuando detecta ese hardware."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Recorriendo el flujo",
|
||||
"heading": "Proceso paso a paso",
|
||||
"pick": {
|
||||
"title": "Elige el contenedor LXC",
|
||||
"body": "Un diálogo muestra cada LXC del host (desde <code>pct list</code>). Elige el que debería recibir la Coral. En ejecución o parado, da igual — el script gestiona ambos casos (lo para brevemente para escribir la config y luego lo arranca de nuevo para instalar los drivers)."
|
||||
"body": "El selector muestra los contenedores compatibles de <code>pct list</code>; los OCI se ocultan y se gestionan desde Apps del gestor OCI. Elige uno, esté arrancado o parado. El script lo detiene si hace falta, configura y lo arranca para instalar el runtime."
|
||||
},
|
||||
"gpuHint": {
|
||||
"title": "Sugerencia de passthrough de GPU (opcional)",
|
||||
"body": "Si el host tiene una GPU (Intel iGPU, AMD, NVIDIA) y el contenedor elegido NO tiene passthrough de GPU configurado, el script muestra un diálogo único sugiriendo que ejecutes <lxcGpuLink>Añadir GPU a LXC</lxcGpuLink> primero. La Coral suele combinarse con decodificación de vídeo por hardware (Quick Sync, VA-API, NVENC) para apps como Frigate. Puedes decir sí (sale, ejecutas el script de GPU y vuelves) o no (continúa con el setup solo de TPU)."
|
||||
"title": "Sugerencia opcional de acceso a GPU",
|
||||
"body": "Si detecta GPU pero no está configurada para el contenedor, recomienda <lxcGpuLink>Añadir GPU a LXC</lxcGpuLink> para decodificación de vídeo (Quick Sync, VA-API o NVENC). Pregunta si quieres continuar solo con Coral: Sí continúa; No sale para que configures antes la GPU."
|
||||
},
|
||||
"usb": {
|
||||
"title": "Escribir la config del LXC — ruta USB",
|
||||
"body": "Si hay un USB Accelerator presente, el script hace dos cosas: (1) escribe una regla udev en el host para que el dispositivo tenga un nombre estable <code>/dev/coral</code> independientemente del puerto USB en el que esté, y (2) hace bind-mount del árbol <strong>completo</strong> <code>/dev/bus/usb</code> dentro del contenedor.",
|
||||
"title": "Configurar el acceso USB del LXC",
|
||||
"body": "Crea una regla udev en el host para <code>/dev/coral</code> y monta el árbol <strong>completo</strong> <code>/dev/bus/usb</code> en el contenedor. Lo configura aunque no haya una Coral USB conectada; expone más dispositivos que solo la Coral.",
|
||||
"whyTitle": "¿Por qué montar /dev/bus/usb en lugar de /dev/coral?",
|
||||
"whyBody": "La ruta del nodo del dispositivo USB (p. ej. <code>/dev/bus/usb/001/005</code>) cambia cuando reconectas el acelerador a otro puerto. Versiones anteriores del script hacían bind-mount del symlink <code>/dev/coral</code>, que apuntaba a una ruta vieja y se rompía. Montar el árbol USB completo significa que el contenedor ve la ruta actual sea cual sea, así que reconectar simplemente funciona."
|
||||
"whyBody": "La ruta USB, por ejemplo <code>/dev/bus/usb/001/005</code>, cambia al reconectar el acelerador. Las versiones antiguas montaban el enlace <code>/dev/coral</code> y podían conservar una ruta obsoleta. Montar todo el árbol USB permite ver el nodo actual. Puede que la aplicación tenga que volver a abrirlo."
|
||||
},
|
||||
"pcie": {
|
||||
"title": "Escribir la config del LXC — ruta M.2 / PCIe",
|
||||
"body1": "Si hay una Coral M.2 / PCIe presente en el host y <code>/dev/apex_0</code> existe (el módulo de kernel apex está cargado), el script usa la API moderna <code>dev</code> de Proxmox que gestiona los permisos de cgroup2 automáticamente tanto para contenedores privilegiados como unprivileged:",
|
||||
"body2": "Si el host aún no ha arrancado con el módulo apex cargado (acabas de ejecutar <hostLink>Install Coral on Host</hostLink> y no has reiniciado), <code>/dev/apex_0</code> aún no existe. El script recurre al cgroup2 + bind mount clásico con <code>create=file</code> para que las entradas sean válidas incluso cuando el dispositivo no se ha materializado:",
|
||||
"title": "Configurar el acceso M.2 / PCIe del LXC",
|
||||
"body1": "Si detecta una Coral M.2 / PCIe y existe <code>/dev/apex_0</code>, usa la API <code>dev</code> de Proxmox para gestionar cgroup2 tanto en LXC privilegiados como sin privilegios:",
|
||||
"body2": "Si acabas de ejecutar <hostLink>Instalar Coral en el host</hostLink> y aún no existe <code>/dev/apex_0</code>, escribe un montaje con <code>create=file</code> y, solo si el número mayor de apex aparece en <code>/proc/devices</code>, una regla clásica cgroup2. Ninguno de los dos crea un dispositivo funcional:",
|
||||
"rebootTitle": "Reinicia el host primero si acabas de instalar los drivers de Coral",
|
||||
"rebootBody": "El fallback de cgroup2 + mount se escribirá, pero el dispositivo solo existe realmente después de un reinicio del host que cargue el módulo <code>apex</code>. Si no has reiniciado, reinicia ahora antes de arrancar el contenedor."
|
||||
"rebootBody": "El montaje alternativo no carga <code>apex</code> en el host. Carga el controlador o reinicia tras instalarlo y comprueba el dispositivo. Cuando esté listo, ejecuta otra vez el script para aplicar la entrada moderna y reinicia el contenedor."
|
||||
},
|
||||
"drivers": {
|
||||
"title": "Arrancar el contenedor + instalar el runtime de Coral dentro",
|
||||
"body": "Los cambios de config en LXC de Proxmox surten efecto en el siguiente arranque — así que el script arranca el contenedor, espera hasta 15 segundos a que <code>pct exec</code> responda y luego deja un bash script dentro que:",
|
||||
"title": "Arrancar el LXC e instalar el runtime de Coral",
|
||||
"body": "Arranca el contenedor, espera hasta 15 segundos a que su estado sea «running» y usa <code>pct exec</code> para ejecutar el instalador dentro. Este instalador:",
|
||||
"items": [
|
||||
"Ejecuta <code>apt-get update</code>.",
|
||||
"Instala los prerequisitos del repositorio Coral: <code>gnupg</code>, <code>curl</code>, <code>ca-certificates</code>.",
|
||||
"Instala los requisitos del repositorio Coral: <code>gnupg</code>, <code>curl</code> y <code>ca-certificates</code>.",
|
||||
"Importa la clave GPG de Coral de Google en <code>/etc/apt/keyrings/coral-edgetpu.gpg</code> (ruta moderna, la misma que usa el instalador del host) y añade el repositorio APT <code>coral-edgetpu-stable</code> con <code>signed-by=</code>.",
|
||||
"Instala el último <code>libedgetpu1-std</code> (por defecto). Si tienes una Coral M.2, se te preguntará entre <code>libedgetpu1-std</code> (estándar) y <code>libedgetpu1-max</code> (máximo rendimiento, calienta más)."
|
||||
"Instala <code>libedgetpu1-std</code> por defecto. Si detecta Coral M.2, ofrece <code>libedgetpu1-std</code> o <code>libedgetpu1-max</code>. Elegir el paquete no configura por sí solo la detección de la aplicación."
|
||||
],
|
||||
"noIgpuTitle": "¿Por qué no hay drivers de iGPU aquí?",
|
||||
"noIgpuBody": "Versiones anteriores de este script también instalaban Intel <code>va-driver-all</code>, <code>intel-opencl-icd</code> y compañía para que el mismo contenedor pudiera hacer decode de vídeo Quick Sync junto a la inferencia de Coral. Esa doble responsabilidad causaba fallos confusos cuando el usuario solo quería Coral. El lado iGPU es ahora trabajo exclusivo de <lxcGpuLink>Añadir GPU a LXC</lxcGpuLink> — ejecútalo primero si también quieres decode de vídeo por hardware en el contenedor.",
|
||||
"debianTitle": "Contenedores no-Debian — modo passthrough-only",
|
||||
"debianBody": "La instalación del runtime dentro del contenedor usa <code>apt-get</code>, que solo viene con distros de la familia Debian/Ubuntu. En contenedores <strong>Alpine, Arch, RHEL o SUSE</strong> el script detecta la distro vía <code>/etc/os-release</code> y muestra un prompt de confirmación: <em>continuar en modo passthrough-only</em> (escribe la config del dispositivo en <code>/etc/pve/lxc/<ctid>.conf</code> y se salta la instalación APT de <code>libedgetpu</code>) o <em>cancelar</em>. Passthrough-only es la opción correcta si el contenedor de aplicación que va a usar Coral ya incluye el runtime — el ejemplo canónico es la imagen Docker de Frigate. Si no, sigue la <coralLink>guía oficial</coralLink> de Google para instalar <code>libedgetpu</code> manualmente después de que el script haya escrito la config del LXC."
|
||||
"noIgpuBody": "Antes también instalaba <code>va-driver-all</code>, <code>intel-opencl-icd</code> y otros paquetes Intel para combinar Quick Sync y Coral. Esa mezcla provocaba fallos confusos cuando solo se quería Coral. Ahora la iGPU se configura con <lxcGpuLink>Añadir GPU a LXC</lxcGpuLink>; ejecútalo primero si necesitas decodificación de vídeo por hardware.",
|
||||
"debianTitle": "Otras distribuciones: solo acceso al dispositivo",
|
||||
"debianBody": "Instala con <code>apt-get</code> en Debian/Ubuntu. En <strong>Alpine, Arch, RHEL o SUSE</strong>, detectados mediante <code>/etc/os-release</code>, ofrece <em>continuar solo con el acceso al dispositivo</em>: configura <code>/etc/pve/lxc/<ctid>.conf</code> sin instalar <code>libedgetpu</code>; o <em>cancelar</em>. Si la app ya incluye el runtime, como Frigate Docker, basta ese modo. Si no, instala <code>libedgetpu</code> siguiendo la <coralLink>guía oficial de Google</coralLink>."
|
||||
},
|
||||
"summary": {
|
||||
"title": "Resumen",
|
||||
"body": "El script imprime una checklist al final resumiendo qué se habilitó (Coral USB, Coral M.2) con marcas ✓ o ⚠ según si el hardware se detectó realmente. El contenedor sigue en ejecución — puedes saltar directamente a la config de Frigate / CodeProject.AI / tu app."
|
||||
"body": "Al terminar muestra Coral USB y M.2 con ✓ o ⚠ según la detección del hardware. El contenedor queda arrancado para configurar Frigate, CodeProject.AI o tu aplicación."
|
||||
}
|
||||
},
|
||||
"manual": {
|
||||
@@ -83,37 +83,37 @@
|
||||
"body": "Si quieres ver exactamente qué va en la config del LXC, o aplicarlo a mano:",
|
||||
"usbHeading": "Coral USB",
|
||||
"pcieHeading": "Coral M.2 / PCIe",
|
||||
"runtimeHeading": "Dentro del contenedor — runtime de Coral"
|
||||
"runtimeHeading": "Dentro del contenedor: runtime de Coral"
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verificación",
|
||||
"body": "Entra en el contenedor y comprueba que la Coral es visible:"
|
||||
"body": "Entra en el contenedor y comprueba que Coral es visible:"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"apexTitle": "El contenedor arrancó pero /dev/apex_0 no está dentro",
|
||||
"apexBody": "El módulo apex del host no está cargado. En el host: <code>lsmod | grep apex</code> — si está vacío, ejecuta <code>modprobe apex</code>, o reinicia si acabas de instalar los drivers de Coral. Una vez el host tenga <code>/dev/apex_0</code>, reinicia el contenedor: <code>pct stop <ctid> && pct start <ctid></code>.",
|
||||
"replugTitle": "La Coral USB desaparece al reconectarla en otro puerto",
|
||||
"replugBody": "Justo por eso el script monta <code>/dev/bus/usb</code> en lugar del symlink <code>/dev/coral</code>. Si te pasa esto, comprueba que tu config del LXC tiene <code>lxc.mount.entry: /dev/bus/usb dev/bus/usb ...</code> y no una referencia directa a <code>/dev/coral</code>. Las configs viejas de versiones anteriores del script pueden necesitar actualizarse — vuelve a ejecutar el script sobre el mismo contenedor y la config se refresca.",
|
||||
"alpineTitle": "Contenedor Alpine / Arch / RHEL / SUSE — runtime no instalado",
|
||||
"alpineBody": "Si elegiste <em>modo passthrough-only</em> cuando el script lo preguntó, la config del LXC se escribió y el dispositivo Coral es visible dentro del contenedor, pero el runtime <code>libedgetpu</code> no está instalado. Es así por diseño: el repo APT de Google solo se publica para Debian/Ubuntu. Instala el runtime manualmente con el gestor de paquetes de tu distro (Alpine: <code>apk add</code>; Arch: AUR; RHEL/SUSE: compilar desde fuente) siguiendo la guía oficial de Google, o usa un contenedor de aplicación que incluya el runtime — la imagen Docker de Frigate es el ejemplo canónico: solo expone el dispositivo con <code>--device /dev/apex_0:/dev/apex_0</code> (M.2) o el bind mount USB que el script ya escribió (USB).",
|
||||
"frigateTitle": "Frigate dice 'Coral EdgeTPU detected but not available'",
|
||||
"frigateBody": "Casi siempre es un problema de permisos dentro del contenedor. Frigate corre como root por defecto; comprueba que el usuario root está en el grupo <code>plugdev</code> dentro del contenedor (para USB), y que el proceso puede leer <code>/dev/apex_0</code> (para M.2). <code>ls -l /dev/apex_0</code> desde dentro del contenedor debería mostrar el grupo <code>apex</code> — si no, añade el alineamiento de GID a <code>/etc/group</code> o cambia el contenedor a modo privilegiado.",
|
||||
"apexTitle": "El LXC arranca pero falta /dev/apex_0",
|
||||
"apexBody": "Comprueba el controlador del host: <code>lsmod | grep apex</code>. Si falta, prueba <code>modprobe apex</code> o reinicia tras instalarlo. Cuando exista <code>/dev/apex_0</code> en el host, verifica la configuración del LXC (vuelve a ejecutar el script si solo se escribieron las entradas alternativas) y reinícialo con <code>pct stop <ctid> && pct start <ctid></code>.",
|
||||
"replugTitle": "Coral USB desaparece al conectarla a otro puerto",
|
||||
"replugBody": "Comprueba que el LXC monta <code>/dev/bus/usb</code> y no el enlace <code>/dev/coral</code>. La configuración debe incluir <code>lxc.mount.entry: /dev/bus/usb dev/bus/usb ...</code>, sin depender directamente de <code>/dev/coral</code>. Vuelve a ejecutar el script si conservas una configuración antigua.",
|
||||
"alpineTitle": "Alpine / Arch / RHEL / SUSE: runtime sin instalar",
|
||||
"alpineBody": "El <em>modo de solo acceso al dispositivo</em> configura LXC sin instalar <code>libedgetpu</code>. Usa un paquete compatible o compila desde fuente; comprueba su disponibilidad antes de usar, por ejemplo, <code>apk add</code> en Alpine. Frigate puede incluir el runtime. Si usas Docker dentro del LXC, pasa también M.2 con <code>--device /dev/apex_0:/dev/apex_0</code> o monta USB dentro de Docker: el montaje LXC no basta.",
|
||||
"frigateTitle": "Frigate muestra «Coral EdgeTPU detected but not available»",
|
||||
"frigateBody": "Comprueba runtime, visibilidad y permisos de lectura/escritura del proceso real. En USB revisa permisos y, si procede, el grupo <code>plugdev</code>. En M.2 inspecciona <code>/dev/apex_0</code> con <code>ls -l /dev/apex_0</code>. Un nombre como <code>apex</code> en <code>/etc/group</code> no basta: deben coincidir GID numéricos y mapeos LXC. Comprueba también si otro proceso ocupa la TPU; no cambies a privilegiado como primera solución.",
|
||||
"logsTitle": "Revisa los logs del host y del contenedor",
|
||||
"logsBody": "En el host: <code>journalctl -u pvedaemon | grep -i coral</code>. Dentro del contenedor: revisa los logs de la app (Frigate: <code>/config/logs/</code>, CodeProject.AI: su propio directorio de logs). El patrón clásico de error es \"Coral detected, runtime loaded, but inference engine can't claim it\" — eso son permisos 9 de cada 10 veces."
|
||||
"logsBody": "En el host revisa los mensajes del kernel con <code>journalctl -k | grep -i -e apex -e gasket -e usb</code>. Dentro del LXC revisa los registros de la app; con Docker anidado usa <code>docker logs <container></code>. Pueden fallar permisos, runtime, conexión USB o la disponibilidad de la TPU si otro proceso la ocupa."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Instalar Coral TPU (Host)",
|
||||
"label": "Instalar Coral TPU en el host",
|
||||
"href": "/docs/hardware/install-coral-tpu-host",
|
||||
"tail": " — prerequisito necesario para tarjetas Coral M.2 / PCIe antes de pasarlas a un CT."
|
||||
"tail": " — requisito previo para usar una Coral M.2 / PCIe en un CT."
|
||||
},
|
||||
{
|
||||
"label": "Añadir GPU a LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — el mismo patrón para GPUs (a menudo emparejado con una Coral TPU en setups de Frigate)."
|
||||
"tail": " — acceso a GPU, que suele combinarse con Coral en Frigate."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,134 +1,134 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Añadir GPU a VM (Passthrough) | ProxMenux Documentation",
|
||||
"description": "Pasa una GPU Intel, AMD o NVIDIA a una VM Proxmox con rendimiento cercano al nativo. ProxMenux gestiona la preparación del host (módulos VFIO, blacklist de drivers, cmdline del kernel), la configuración de la VM (hostpci, función de audio, hermanos del grupo IOMMU), workarounds específicos del fabricante (Code 43 de NVIDIA, reset bug de AMD, dump de ROM) y conflictos de switch-mode con LXCs."
|
||||
"title": "Añadir GPU a VM | Documentación de ProxMenux",
|
||||
"description": "Asigna una GPU física a una VM de Proxmox. ProxMenux revisa IOMMU, configura VFIO y dispositivos de la VM y detecta conflictos con otras VM o LXC."
|
||||
},
|
||||
"header": {
|
||||
"title": "Añadir GPU a VM (Passthrough)",
|
||||
"description": "Dale una de tus GPUs a una máquina virtual con rendimiento cercano al nativo. ProxMenux detecta Intel / AMD / NVIDIA, valida IOMMU, analiza el grupo IOMMU de la GPU para pasar cada dispositivo hermano junto, configura VFIO en el host, escribe las líneas hostpci correctas en la config de la VM y aplica fixes específicos del fabricante cuando hace falta.",
|
||||
"section": "Hardware: GPUs y Coral-TPU"
|
||||
"description": "Detecta GPU Intel, AMD o NVIDIA y prepara acceso directo desde una VM. Revisa IOMMU y los dispositivos asociados, configura VFIO y la VM y aplica sus reglas de compatibilidad. Comprueba siempre todos los dispositivos afectados.",
|
||||
"section": "Hardware: GPU y Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace esto",
|
||||
"body": "Todo lo que la <pveLink>wiki oficial de Proxmox de PCI passthrough</pveLink> te explica paso a paso manualmente — habilitar IOMMU, módulos VFIO, blacklisting de drivers, descubrimiento de vendor ID, setup de <code>hostpci</code>, dump de ROM en AMD, ocultación de KVM en NVIDIA — hecho en una sola ejecución con comprobaciones de cordura en cada paso. El script también es consciente de las <em>otras</em> cosas en tu host: si la misma GPU ya está asignada a un LXC u otra VM, te ofrece migrar limpiamente en lugar de romper silenciosamente el setup existente."
|
||||
"title": "Qué hace",
|
||||
"body": "Automatiza la configuración del host y <code>hostpci</code> descrita en la <pveLink>documentación de passthrough PCI de Proxmox</pveLink>. Comprueba asignaciones en <em>otros</em> invitados y ofrece resolver conflictos. No garantiza compatibilidad con cualquier GPU, método de reinicio o controlador invitado."
|
||||
},
|
||||
"who": {
|
||||
"heading": "¿Para quién es esto?",
|
||||
"body": "Tienes una GPU física en tu host Proxmox y quieres que una <strong>máquina virtual</strong> (Windows gaming, macOS, un nodo headless de cómputo en GPU, un media server en VM) la use directamente. Pasar una GPU a una VM no es lo mismo que pasarla a un LXC — las VMs necesitan que el kernel trate la GPU como dispositivo VFIO (en esencia \"el host no la tocará\"), lo que significa que el host no puede usar esa GPU para nada más mientras la VM esté en ejecución. Para transcoding / cómputo en <em>LXC</em>, usa <lxcLink>Añadir GPU a LXC</lxcLink> — comparte la GPU y no necesita VFIO."
|
||||
"body": "Para que una <strong>máquina virtual</strong> use directamente una GPU mediante VFIO. Mientras esté vinculada a VFIO, el controlador del host no puede usarla, aunque la VM esté parada. Para compartirla con <em>LXC</em>, usa <lxcLink>Añadir GPU a LXC</lxcLink>."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de empezar",
|
||||
"gpu": "<strong>Una GPU soportada</strong> instalada físicamente. El script detecta Intel, AMD y NVIDIA vía <code>lspci</code>.",
|
||||
"gpu": "<strong>GPU compatible</strong> instalada físicamente. El script detecta Intel, AMD y NVIDIA con <code>lspci</code>.",
|
||||
"gpuCheck": "lspci | grep -iE 'VGA|3D|Display'",
|
||||
"iommu": "<strong>Virtualización IOMMU</strong> disponible en BIOS/UEFI (Intel VT-d o AMD-Vi). Si está apagada a nivel de firmware, ninguna config de Linux lo arregla — tienes que habilitarla primero en la BIOS. El script detecta esto y se ofrece a habilitarlo en el lado del SO.",
|
||||
"q35": "La VM destino usa machine type <strong>q35</strong>. El antiguo <code>i440fx</code> no soporta de forma fiable el passthrough PCIe y el script se negará a continuar.",
|
||||
"q35Check": "qm config '<'vmid'>' | grep machine",
|
||||
"moreGpus": "Preferiblemente <strong>más de una GPU</strong> en el host, o acceso por consola en otra salida (IPMI, KVM-over-IP, serie). Una vez pases la única GPU a una VM, la consola del host se queda a oscuras. Con dos GPUs NVIDIA puedes pasar una a una VM y mantener la otra en el host — el script gestiona esto por BDF (ver <em>NVIDIA</em> en las notas del fabricante más abajo).",
|
||||
"nvidiaInstalled": "Si estás en un Proxmox que ya instaló el driver de NVIDIA vía <nvidiaLink>NVIDIA Drivers en el host</nvidiaLink>: la GPU que pases a la VM se desvincula del driver <code>nvidia</code> del host y se vincula a <code>vfio-pci</code>. El módulo <code>nvidia</code> sigue cargado, así que cualquier <strong>otra</strong> GPU NVIDIA que tengas en el host sigue funcionando con <code>nvidia-smi</code>."
|
||||
"iommu": "<strong>Soporte IOMMU</strong> en hardware y firmware cuando lo requiera (Intel VT-d o AMD-Vi). Comprueba el sistema y puede añadir parámetros Linux; no cambia BIOS/UEFI ni demuestra que un IOMMU inactivo esté desactivado en firmware.",
|
||||
"q35": "Este asistente exige tipo de máquina <strong>q35</strong> y rechaza <code>i440fx</code>. El chipset es independiente de BIOS/UEFI; cambiarlo en una VM existente requiere planificación y no se hace automáticamente.",
|
||||
"q35Check": "qm config VMID | grep machine",
|
||||
"moreGpus": "Prepara <strong>otra GPU o acceso alternativo</strong> mediante SSH, IPMI o serie. La consola puede perder imagen al reservar la GPU principal. En <em>NVIDIA</em>, otra tarjeta fuera del grupo IOMMU afectado puede seguir en el host.",
|
||||
"nvidiaInstalled": "Con <nvidiaLink>NVIDIA instalado en el host</nvidiaLink>, las funciones elegidas se reservan para <code>vfio-pci</code>, no para <code>nvidia</code>. El módulo <code>nvidia</code> puede seguir disponible para <strong>otras</strong> tarjetas fuera del grupo IOMMU afectado. Verifícalas con <code>nvidia-smi</code>."
|
||||
},
|
||||
"pickOne": {
|
||||
"title": "Passthrough a VM vs compartición con LXC — elige uno por GPU",
|
||||
"title": "Asignación exclusiva a VM o compartición LXC",
|
||||
"body": "Una GPU vinculada a <code>vfio-pci</code> para passthrough a VM no puede usarla simultáneamente el host ni un LXC. Si tienes dos GPUs, puedes dedicar una a cada ruta. Si solo tienes una, elige:",
|
||||
"vmItem": "<strong>Ruta VM (esta página):</strong> acceso completo al hardware, pero exclusivo para la VM dueña de la GPU mientras esté en ejecución.",
|
||||
"lxcItem": "<strong>Ruta LXC (<lxcLink>Añadir GPU a LXC</lxcLink>):</strong> compartida con el host y otros contenedores, ideal para transcoding, sin magia VFIO."
|
||||
"vmItem": "<strong>VM:</strong> acceso directo y exclusivo para esa VM.",
|
||||
"lxcItem": "<strong>LXC (<lxcLink>Añadir GPU a LXC</lxcLink>):</strong> comparte el dispositivo con host y otros contenedores mediante el controlador nativo."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Ejecutar el instalador",
|
||||
"body": "Abre ProxMenux en el host, ve a <strong>Hardware: GPUs and Coral-TPU → Add GPU to VM</strong>.",
|
||||
"imageAlt": "Entrada del menú 'Add GPU to VM' dentro de Hardware: GPUs and Coral-TPU"
|
||||
"body": "Abre ProxMenux y ve a <strong>Hardware: GPU y Coral-TPU → Añadir GPU a VM</strong>.",
|
||||
"imageAlt": "Opción del menú para añadir GPU a VM"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "El flujo tiene tres fases con separación clara entre \"recopilar información y decisiones\" y \"aplicar cambios realmente\". Hasta la confirmación final, no se ha tocado nada en tu host ni en la VM."
|
||||
"heading": "Cómo funciona el script",
|
||||
"body": "Detecta y selecciona antes de aplicar los cambios principales y confirma el plan en un resumen final. Activar IOMMU tiene una confirmación anterior y puede modificar ya el arranque. La limpieza posterior de audio asociado también puede pedir una elección."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Recorriendo el flujo",
|
||||
"heading": "Proceso paso a paso",
|
||||
"detect": {
|
||||
"title": "Detectar GPUs y comprobar IOMMU",
|
||||
"body": "El script lista cada GPU que encuentra. Si IOMMU no está ya habilitado en la cmdline del kernel en ejecución, recibirás un prompt sí/no para añadir <code>intel_iommu=on</code> (o <code>amd_iommu=on</code>) + <code>iommu=pt</code> al archivo de arranque correcto. La selección depende del bootloader: <code>/etc/kernel/cmdline</code> cuando el host arranca con systemd-boot (se detecta por la presencia de <code>root=ZFS=</code> en ese fichero, lo habitual en instalaciones de Proxmox VE sobre ZFS-on-root), o <code>/etc/default/grub</code> en el resto. Si aceptas y la cmdline cambia, el script marca que hará falta un reinicio al final.",
|
||||
"tipTitle": "¿Ya ejecutaste post-instalación?",
|
||||
"tipBody": "Si habilitaste anteriormente <postLink>soporte VFIO IOMMU</postLink> desde los scripts post-instalación, IOMMU ya está activo y este paso pasa silenciosamente. Bien.",
|
||||
"body": "Considera IOMMU activo solo si el kernel en ejecución tiene <code>intel_iommu=on</code> o <code>amd_iommu=on</code> y existen grupos IOMMU. Si el parámetro ya está guardado para el próximo arranque, continúa en modo pendiente de reinicio; si no, con confirmación aparte puede añadirlo con <code>iommu=pt</code>. Elige <code>/etc/kernel/cmdline</code> si encuentra una marca ZFS como <code>root=ZFS=</code>; si no, <code>/etc/default/grub</code>. Es una heurística, no una prueba del cargador. Reinicia para activar el cambio y revisa los grupos reales.",
|
||||
"tipTitle": "¿Ya configuraste la postinstalación?",
|
||||
"tipBody": "Si el <postLink>soporte VFIO IOMMU</postLink> ya está configurado y activo en el kernel, supera la comprobación. Guardarlo para el próximo arranque no prueba que esté activo ahora.",
|
||||
"imageAlt": "Lista de GPUs detectadas con fabricante y dirección PCI"
|
||||
},
|
||||
"preflight": {
|
||||
"title": "Elegir una GPU y ejecutar las comprobaciones previas",
|
||||
"title": "Elegir GPU y ejecutar comprobaciones previas",
|
||||
"intro": "Una vez eliges la GPU, el script ejecuta una serie de comprobaciones que pueden bloquear el progreso:",
|
||||
"items": [
|
||||
"<strong>No en SR-IOV.</strong> Si el dispositivo es una Virtual Function o una Physical Function con VFs activas, el passthrough chocaría con el uso de SR-IOV. Bloqueado.",
|
||||
"<strong>Aviso de GPU única.</strong> Si esta es la única GPU del host, recibirás un diálogo de aviso recordándote que después del reinicio la consola se queda a oscuras — asegúrate de tener acceso SSH o por la UI web desde otra máquina.",
|
||||
"<strong>Método de reset AMD.</strong> Las GPUs AMD tienen un largo historial de no resetear limpiamente entre paradas y arranques de VM. El script comprueba <code>/sys/bus/pci/devices/<pci>/reset_method</code>: si la tarjeta es una APU sin FLR <em>bloquea</em> (prácticamente inutilizable); una tarjeta AMD dedicada sin FLR también se bloquea; cualquier cosa con un modo de reset desconocido avisa pero te deja continuar con override explícito.",
|
||||
"<strong>No en D3cold.</strong> Algunas tarjetas AMD reportan estado de energía <code>D3cold</code> en reposo, lo que las hace invisibles durante el arranque de la VM. Bloqueado hasta que despiertes la GPU.",
|
||||
"<strong>Análisis del grupo IOMMU.</strong> Lee <code>/sys/kernel/iommu_groups/</code> para encontrar cada dispositivo no-bridge del grupo de la GPU. <em>Todos ellos</em> se pasarán a la VM juntos — si tu placa base agrupa la GPU con una tarjeta de red, la tarjeta de red va también."
|
||||
"<strong>Protección SR-IOV.</strong> Rechaza VF y PF con VF activas porque configura dispositivos completos, no SR-IOV. Configura SR-IOV por separado con hardware compatible.",
|
||||
"<strong>Una sola GPU.</strong> La consola local puede perder su salida al reservarla para VFIO. Comprueba antes el acceso SSH o web desde otro equipo.",
|
||||
"<strong>Política de reinicio AMD.</strong> Lee <code>/sys/bus/pci/devices/<pci>/reset_method</code>. Una APU o dedicada sin FLR queda <em>bloqueada por la política del asistente</em>; un subtipo desconocido sin FLR exige confirmación. No demuestra que sea imposible en todo entorno.",
|
||||
"<strong>Estado D3cold.</strong> El asistente bloquea tarjetas AMD que indican <code>D3cold</code> por riesgo de fallo al activarlas. Revisa alimentación y firmware antes de continuar.",
|
||||
"<strong>Grupo IOMMU.</strong> Lee <code>/sys/kernel/iommu_groups/</code> e incluye <em>todos los miembros que no sean puentes</em>, incluso controladores de red o discos. Si el grupo contiene dispositivos de otro slot, el script los muestra antes del resumen; comprueba que el host no necesite ninguno. Si falta reiniciar para activar IOMMU, solo puede planificar inicialmente la función GPU; comprueba el aislamiento después."
|
||||
],
|
||||
"audioIntro": "<strong>Audio compañero.</strong> Dos rutas, según dónde viva el audio:",
|
||||
"audioDgpu": "<strong>GPU discreta (NVIDIA / AMD):</strong> el audio HDMI está en la misma tarjeta como función <code>.1</code> del slot PCI de la GPU. Incluido automáticamente. Este dispositivo de audio nunca lo usó el host, así que nadie pierde nada.",
|
||||
"audioIgpu": "<strong>iGPU Intel (o cualquier GPU sin hermano <code>.1</code>):</strong> el audio HDMI / analógico vive en el chipset en un slot distinto (<code>00:1f.3</code> normalmente). El script escanea el host, lista cada controlador de audio PCI con su driver actual (<code>snd_hda_intel</code>, etc.) y te pregunta cuál(es) pasar. Por defecto <strong>ninguno</strong> — tienes que aceptarlo explícitamente."
|
||||
"audioIntro": "<strong>Audio asociado.</strong> Dos casos según dónde esté el controlador:",
|
||||
"audioDgpu": "<strong>GPU dedicada:</strong> el audio HDMI suele ocupar la función <code>.1</code> del mismo slot y se incluye al detectarlo. Si el host lo usaba, pierde acceso al reservarlo para la VM.",
|
||||
"audioIgpu": "<strong>Sin función de audio <code>.1</code>:</strong> puede estar en otro dispositivo, como <code>00:1f.3</code>. Lista controladores y sus drivers, por ejemplo <code>snd_hda_intel</code>. Por defecto no selecciona <strong>ninguno</strong>; elige solo los necesarios."
|
||||
},
|
||||
"pickVm": {
|
||||
"title": "Elegir la VM destino",
|
||||
"body": "Se te muestra la lista de VMs del host y eliges una. El script comprueba que la VM es q35 — los machine types BIOS/i440fx se rechazan porque el passthrough PCIe en ellos no es fiable. Si tienes una VM q35 con la GPU ya asignada (parcial o completamente), la entrada existente se reutiliza en lugar de duplicarse.",
|
||||
"imageAlt": "Lista de VMs con nombre, ID y estado mostrada como selector"
|
||||
"title": "Elige la VM destino",
|
||||
"body": "Elige la VM de la lista. Exige q35 y reutiliza entradas GPU existentes cuando puede. BIOS/UEFI es una opción distinta, no un tipo de máquina. No cambia automáticamente el chipset ni el arranque del invitado instalado.",
|
||||
"imageAlt": "Selección de VM por nombre, ID y estado"
|
||||
},
|
||||
"switchMode": {
|
||||
"title": "Switch mode — gestionar que la GPU ya esté en otro sitio",
|
||||
"title": "Resolver asignaciones existentes",
|
||||
"intro": "El script escanea cada config de VM y cada config de LXC en el host buscando la GPU que elegiste. Tres resultados posibles:",
|
||||
"items": [
|
||||
"<strong>La GPU está libre.</strong> Nada que hacer, continúa.",
|
||||
"<strong>La GPU está en otra VM.</strong> Si la VM origen está en ejecución, el script aborta — dos VMs no pueden compartir una asignación VFIO exclusiva y la VM origen ha de pararse antes. Si la VM origen está parada, aparece un menú con dos opciones: <em>Mantener la GPU en la config de la VM origen pero desactivar Arranque al inicio</em>, o <em>Eliminar las líneas de la GPU de la config de la VM origen y mantener Arranque al inicio</em>. También existe un camino rápido: si la GPU ya está vinculada a <code>vfio-pci</code> y es un simple traspaso VM→VM, no se reconfigura el host y no hace falta reinicio.",
|
||||
"<strong>La GPU está en un LXC (modo compartido).</strong> Aparece un menú con dos opciones: <em>Mantener la GPU en la config del LXC pero desactivar Arranque al inicio</em>, o <em>Eliminar las líneas de la GPU de la config del LXC (<code>lxc.cgroup2.devices.allow</code> / <code>lxc.mount.entry</code>) y mantener Arranque al inicio</em>. En ambos casos, el LXC dejará de ver la GPU tras el switch, y la VM la verá — esta es la mecánica de \"switch mode\" que le da a esta entrada de menú su etiqueta secundaria."
|
||||
"<strong>GPU disponible.</strong> Continúa sin retirar asignaciones.",
|
||||
"<strong>Asignada a otra VM.</strong> Detén primero la VM origen. Puedes <em>conservar sus entradas y desactivar el arranque automático</em> o <em>retirarlas conservando el arranque automático</em>. Si ya usa <code>vfio-pci</code> y no requiere cambios del host, el traspaso VM→VM puede evitar reiniciar el host.",
|
||||
"<strong>Usada por LXC.</strong> En contenedores normales elige <em>conservar configuración y desactivar arranque automático</em> o <em>eliminar la configuración de la GPU y conservar arranque automático</em>. Esta opción elimina las entradas <code>devN</code> y, en AMD/Intel, también las reglas antiguas <code>lxc.mount.entry</code> de <code>/dev/dri</code> y <code>lxc.cgroup2.devices.allow</code>. OCI conserva la configuración y se detiene sin arranque automático; elimina su GPU desde Apps del gestor OCI. La detección por familia puede afectar a otras tarjetas similares."
|
||||
],
|
||||
"imageAlt": "Diálogo que ofrece quitar la GPU de un LXC antes de asignarla a la VM",
|
||||
"smartTitle": "Los hermanos de audio también se limpian con inteligencia",
|
||||
"smartBody": "Si la VM origen tenía dispositivos de audio extra adjuntos junto a la GPU, el script quita <strong>solo los que ahora son huérfanos</strong> — es decir, entradas de audio cuyo hermano de display también se está quitando. El audio vinculado a otra GPU que se queda en la VM se deja intacto. Esto importa cuando desadjuntas una iGPU Intel (que comparte el audio del chipset) de una VM que también tiene una tarjeta dedicada NVIDIA / AMD aún pasada: el audio HDMI de la dGPU (<code>02:00.1</code>) se queda, el audio del chipset (<code>00:1f.3</code>) se va."
|
||||
"imageAlt": "Diálogo que ofrece eliminar la GPU de un LXC antes de asignarla a la VM",
|
||||
"smartTitle": "Revisión de audio asociado al retirar la GPU",
|
||||
"smartBody": "Después ofrece una lista de <strong>audio posiblemente sin uso</strong> en la VM origen. Desmarca lo que aún necesite. Por ejemplo, puede conservar <code>02:00.1</code> y ofrecer retirar <code>00:1f.3</code>. La lista decide qué audio adicional se elimina; no garantiza toda asociación entre pantalla y audio."
|
||||
},
|
||||
"audioPick": {
|
||||
"title": "(Si no hay hermano .1) Elegir qué controladores de audio incluir",
|
||||
"title": "Si no hay audio .1, selecciona los controladores que necesites",
|
||||
"body": "Solo ocurre para iGPUs Intel y setups similares con audio separado. Una checklist muestra cada controlador de audio PCI del host (excluyendo cualquiera ya en el grupo IOMMU de la GPU), etiquetado con su driver actual. Selecciona los que quieras — o ninguno, si la VM no necesita audio del hardware del host.",
|
||||
"imageAlt": "Diálogo checklist con cada controlador de audio PCI del host (BDF + driver) cuando la GPU no tiene audio hermano .1",
|
||||
"warnTitle": "No marques audio del que depende el host",
|
||||
"warnBody": "Si el host usa actualmente un controlador de audio para algo — por ejemplo, el beep del shell de Proxmox o una VM a la que ya lo has pasado — marcarlo aquí significa que el host (y cualquier otra VM que lo comparta) pierde acceso después del reinicio. Ante la duda, déjalo vacío y siempre puedes volver a ejecutar el script más tarde para añadir audio si hace falta."
|
||||
"warnTitle": "No selecciones audio que necesita el host",
|
||||
"warnBody": "Asignar audio puede dejar al host sin acceso; tampoco puede pertenecer a otra VM activa a la vez. Deja audio opcional sin seleccionar si no lo necesitas y revisa sus asignaciones. El pitido de consola no procede necesariamente del audio PCI."
|
||||
},
|
||||
"summary": {
|
||||
"title": "Revisar el resumen de confirmación",
|
||||
"body": "Un diálogo final muestra exactamente qué está a punto de cambiar en el host y en la VM. Esta es la última salida — si algo se ve mal (un dispositivo extra en el grupo IOMMU que no esperabas, la GPU equivocada, la VM equivocada), cancela aquí y aún no se ha tocado nada.",
|
||||
"imageAlt": "Diálogo de resumen listando los cambios del host (archivos VFIO/blacklist) y los cambios de config de la VM (líneas hostpci) antes de aplicar"
|
||||
"body": "Revisa el plan final y cancela si no es correcto. Muestra el grupo IOMMU y su número de dispositivos; los miembros de otro slot aparecen en el paso anterior. Cancelar detiene los cambios principales, pero no revierte una activación de IOMMU confirmada anteriormente.",
|
||||
"imageAlt": "Resumen de cambios previstos en host y VM"
|
||||
},
|
||||
"hostApply": {
|
||||
"title": "Se aplican los cambios del host",
|
||||
"intro": "La Fase 2 se ejecuta de forma no interactiva. En el lado del host el script puede tocar:",
|
||||
"intro": "La fase de aplicación cambia host y VM. La limpieza de audio asociado aún puede pedir una elección. Puede modificar:",
|
||||
"items": [
|
||||
"<code>/etc/modules</code> — añade <code>vfio</code>, <code>vfio_iommu_type1</code>, <code>vfio_pci</code> (más <code>vfio_virqfd</code> en kernels < 6.2).",
|
||||
"<code>/etc/modprobe.d/vfio.conf</code> — para AMD / Intel, define <code>options vfio-pci ids=<vendor:device,...> disable_vga=1</code> para que VFIO reclame la GPU pronto en el arranque. Para NVIDIA el archivo solo añade <code>softdep nvidia pre: vfio-pci</code> (más <code>_drm</code>/<code>_modeset</code>/<code>_uvm</code>) — el binding real es por BDF vía la regla udev de abajo. En AMD, también añade líneas <code>softdep</code> forzando que <code>vfio-pci</code> cargue antes de <code>radeon</code> / <code>amdgpu</code>.",
|
||||
"<code>/etc/modprobe.d/iommu_unsafe_interrupts.conf</code> y <code>kvm.conf</code> — workarounds sensatos que la mayoría de VMs Windows / macOS necesitan (<code>allow_unsafe_interrupts=1</code>, <code>ignore_msrs=1</code>).",
|
||||
"<code>/etc/modprobe.d/blacklist.conf</code> — solo pone en blacklist los drivers open-source del vendor seleccionado (<code>nouveau</code>/<code>lbm-nouveau</code> para NVIDIA; <code>radeon</code>+<code>amdgpu</code> para AMD; <code>i915</code> para Intel), así los drivers de otros vendors en el mismo host siguen cargados. El módulo propietario <code>nvidia</code> <strong>solo</strong> se pone en blacklist (mediante un fichero aparte, <code>/etc/modprobe.d/proxmenux-nvidia-vfio-blacklist.conf</code>) una vez que <em>todas</em> las GPUs NVIDIA del host han pasado a VFIO — hasta entonces sigue cargado para que cualquier NVIDIA que mantengas en el host siga funcionando.",
|
||||
"<code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> + <code>/etc/proxmenux/vfio-bind.bdfs</code> — <strong>solo NVIDIA</strong>. Estado de binding por BDF. La regla udev aplica <code>ATTR'{'driver_override'}'=\"vfio-pci\"</code> en el evento PCI ADD para cada Bus:Device.Function rastreado, así que solo las GPUs que has pasado explícitamente van a VFIO. Esto es lo que hace que NVIDIA multi-GPU funcione — tus otras tarjetas NVIDIA mantienen su driver <code>nvidia</code> y siguen siendo usables en el host.",
|
||||
"<strong>Solo AMD.</strong> Vuelca la ROM de la GPU desde sysfs (<code>/sys/bus/pci/.../rom</code>) o la tabla ACPI VFCT a <code>/usr/share/kvm/vbios_<card>.bin</code>. La VM la referencia vía <code>romfile=</code> para que las tarjetas que mal-reportan su propia VBIOS aún inicialicen correctamente.",
|
||||
"<strong>Solo NVIDIA.</strong> Los servicios NVIDIA del host (<code>nvidia-persistenced</code>, <code>nvidia-powerd</code>, <code>nvidia-fabricmanager</code>) solo se detienen y deshabilitan cuando todas las GPU NVIDIA están asignadas a VFIO. En un host mixto permanecen activos, junto con el módulo <code>nvidia</code>, para las GPU que continúan en modo nativo.",
|
||||
"<code>/etc/modprobe.d/vfio.conf</code> — AMD/Intel: <code>options vfio-pci ids=<vendor:device,...> disable_vga=1</code>. NVIDIA: <code>softdep nvidia pre: vfio-pci</code> (<code>_drm</code>/<code>_modeset</code>/<code>_uvm</code>); la asignación real es por BDF. AMD añade orden de carga <code>softdep</code>: <code>vfio-pci</code> → <code>radeon</code>/<code>amdgpu</code>.",
|
||||
"Escribe <code>/etc/modprobe.d/iommu_unsafe_interrupts.conf</code> y <code>kvm.conf</code> con <code>allow_unsafe_interrupts=1</code> e <code>ignore_msrs=1</code>. Son ajustes del script, no requisitos universales de Windows/macOS; permitir interrupciones inseguras reduce esa protección.",
|
||||
"<code>/etc/modprobe.d/blacklist.conf</code>: NVIDIA — <code>nouveau</code>/<code>lbm-nouveau</code>; AMD — <code>radeon</code> + <code>amdgpu</code>; Intel — <code>i915</code>. Estas reglas por fabricante pueden afectar a otras tarjetas con el mismo controlador. El módulo <code>nvidia</code> se bloquea <strong>solo</strong> mediante <code>/etc/modprobe.d/proxmenux-nvidia-vfio-blacklist.conf</code> cuando <em>todas</em> las NVIDIA del host están reservadas a VFIO.",
|
||||
"<code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> + <code>/etc/proxmenux/vfio-bind.bdfs</code> — <strong>Solo NVIDIA.</strong> Aplica <code>ATTR'{'driver_override'}'=\"vfio-pci\"</code> al evento PCI ADD de BDF registrados, incluidas funciones del grupo IOMMU afectado. Fuera de esos grupos puede conservarse <code>nvidia</code>. La política por BDF no divide grupos IOMMU.",
|
||||
"<strong>Solo AMD.</strong> Intenta extraer ROM de <code>/sys/bus/pci/.../rom</code> o ACPI VFCT a <code>/usr/share/kvm/vbios_<vendor>_<device>.bin</code>. Si funciona, usa <code>romfile=</code>. Una ROM válida no garantiza que la GPU se inicialice.",
|
||||
"<strong>Solo NVIDIA.</strong> Detiene y deshabilita <code>nvidia-persistenced</code>, <code>nvidia-powerd</code>, <code>nvidia-fabricmanager</code> solo cuando todas las NVIDIA están reservadas para VFIO. En uso mixto conserva los servicios y <code>nvidia</code> para las tarjetas nativas.",
|
||||
"<code>update-initramfs -u -k all</code> — solo se ejecuta si algo de lo de arriba ha cambiado realmente."
|
||||
]
|
||||
},
|
||||
"vmApply": {
|
||||
"title": "La config de la VM se aplica vía qm set",
|
||||
"body": "La config de la VM en <code>/etc/pve/qemu-server/<vmid>.conf</code> se actualiza vía <code>qm set</code> (nunca por <code>sed</code> directo):",
|
||||
"after1": "Se añade un flag <code>x-vga=1</code> para cada fabricante <strong>excepto</strong> iGPU Intel — las GPUs integradas Intel no tienen VRAM dedicada para una consola pre-arranque, así que ese flag causa hangs.",
|
||||
"after1": "Añade <code>x-vga=1</code> para AMD y NVIDIA, <strong>no</strong> para Intel. Es la política del script; no demuestra que todas las iGPU Intel carezcan de firmware o que ese ajuste siempre provoque bloqueos.",
|
||||
"after2": "Se añaden líneas <code>hostpciN</code> adicionales si el grupo IOMMU de la GPU contiene otros dispositivos que necesitas pasar juntos."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Reiniciar si se tocó la config del host",
|
||||
"body": "Si la Fase 2 cambió algo a nivel de módulo de kernel / cmdline / blacklist, se te pedirá reiniciar. El reinicio es obligatorio antes de arrancar la VM — si no la GPU sigue retenida por el driver del host y VFIO no puede reclamarla.",
|
||||
"title": "Reinicia si lo requiere el cambio del host",
|
||||
"body": "Sigue el aviso de reinicio si cambia arranque o controladores y comprueba la vinculación activa antes de iniciar la VM. Guardar configuración no prueba que esté aplicada. Un traspaso VM→VM con VFIO correcto puede evitar reiniciar el host.",
|
||||
"imageAlt": "Pantalla de resumen mostrando qué se cambió, seguida de un prompt de reinicio"
|
||||
}
|
||||
},
|
||||
"vendors": {
|
||||
"heading": "Notas específicas del fabricante",
|
||||
"heading": "Notas por fabricante",
|
||||
"nvidiaHeading": "NVIDIA",
|
||||
"nvidiaBody": "Los drivers de consumo de NVIDIA detectan que están corriendo en una VM y se niegan a inicializar con el infame error <em>\"Code 43\"</em>. El workaround de ProxMenux: ocultar KVM al guest (<code>hidden=1</code>), poner un hypervisor vendor ID falseado <code>NV43FIX</code> en la línea <code>args</code> y pasar <code>kvm=off</code>. Esto ha funcionado de forma fiable en drivers GeForce durante años. En tarjetas datacenter / Tesla / Quadro esto no hace falta — esos drivers están licenciados para virtualización.",
|
||||
"nvidiaBody": "Conserva un ajuste heredado para <em>Code 43</em>: <code>hidden=1</code>, ID <code>NV43FIX</code> en <code>args</code> y <code>kvm=off</code>. No es requisito universal de GeForce actuales: NVIDIA añadió soporte de passthrough Windows en R465. El error puede tener otras causas; verifica GPU y controlador.",
|
||||
"nvidiaMultiHeading": "Soporte NVIDIA multi-GPU",
|
||||
"nvidiaMultiBody": "Los hosts con dos o más GPUs NVIDIA son de primera clase. Puedes pasar una tarjeta a una VM y mantener la(s) otra(s) en el host para <code>nvidia-smi</code>, compartición de GPU con LXC o cualquier carga del lado del host. ProxMenux vincula VFIO <strong>por BDF</strong> (Bus:Device.Function) vía una regla udev en lugar de poner en blacklist globalmente el módulo <code>nvidia</code> — así el destino de cada tarjeta es independiente de las otras, incluso cuando ambas GPUs son del mismo modelo y comparten el mismo ID <code>vendor:device</code>. El driver nvidia del host sigue cargado; solo los BDFs específicos que selecciones se redirigen a <code>vfio-pci</code>.",
|
||||
"nvidiaMultiBody": "Admite uso mixto NVIDIA <strong>por BDF</strong>. Registra funciones de <code>vfio-pci</code> por dirección, no solo por ID <code>vendor:device</code>. Fuera de los grupos afectados pueden conservar <code>nvidia</code>; compruébalas con <code>nvidia-smi</code>. No aísla dos tarjetas del mismo grupo.",
|
||||
"amdHeading": "AMD",
|
||||
"amdBody": "El \"AMD reset bug\" significa que algunas tarjetas crashean cuando la VM para y no pueden re-inicializarse sin un reinicio del host. ProxMenux pre-criba para esto leyendo el método de reset PCI, pero no puede arreglarlo después. Si lo encuentras, el fix de la comunidad es el módulo de kernel <vendorResetLink>vendor-reset</vendorResetLink>. El script no lo instala automáticamente — el módulo es una build DKMS que añades tú si ves fallos de reset. También en guests Windows, el servicio <em>RadeonResetBugFix</em> es el workaround común a nivel userspace.",
|
||||
"amdBody": "Algunas AMD fallan al reiniciar tras parar una VM. El asistente comprueba capacidades declaradas, no todos los ciclos reales. <vendorResetLink>vendor-reset</vendorResetLink> admite una lista limitada y exige kernel compatible y carga temprana; no lo instala. <em>RadeonResetBugFix</em> en Windows también depende del hardware, sin garantía universal.",
|
||||
"intelHeading": "iGPU Intel",
|
||||
"intelBody": "El passthrough de iGPU Intel es inestable pero posible en generaciones UHD 630+ con <sriovLink>i915-sriov-dkms</sriovLink> para SR-IOV. Para un caso simple de \"darle la iGPU a una VM\", el script la vincula exactamente como una GPU dedicada, pero se salta <code>x-vga=1</code> (las iGPUs no llevan una VBIOS pre-arranque). Perderás la salida de consola del host — planifícalo en consecuencia."
|
||||
"intelBody": "Asignar toda la iGPU Intel y usar SR-IOV son procesos distintos. Este asistente reserva el dispositivo para una VM y omite <code>x-vga=1</code>. <sriovLink>i915-sriov-dkms</sriovLink> requiere hardware y kernel compatibles; «UHD 630+» no es una regla válida. Prevé acceso alternativo al host."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verificación"
|
||||
@@ -136,19 +136,19 @@
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"code43Title": "Code 43 en Windows (NVIDIA)",
|
||||
"code43Body": "Los args de ocultación de KVM no se aplicaron. Comprueba <code>qm config <vmid> | grep -E \"cpu|args\"</code> — deberías ver <code>hidden=1</code> y <code>hv_vendor_id=NV43FIX</code>. Si faltan, vuelve a ejecutar el script y reselecciona la misma VM.",
|
||||
"code43Body": "Code 43 no prueba un fallo de ocultación. Consulta <code>qm config VMID | grep -E \"cpu|args\"</code> sustituyendo VMID y revisa <code>hidden=1</code> y <code>hv_vendor_id=NV43FIX</code>. Comprueba también controlador invitado, firmware y asignación. Repetir el script puede salir si ya está asignada.",
|
||||
"amdResetTitle": "La GPU AMD funciona una vez, falla al reiniciar la VM",
|
||||
"amdResetBody": "El AMD reset bug. Soluciones (en orden): (1) reiniciar el host — la GPU será usable de nuevo para un ciclo más de VM; (2) instalar el módulo DKMS <code>vendor-reset</code> y añadir <code>softdep amdgpu pre: vendor-reset</code>; (3) dentro de Windows, instalar el servicio <em>RadeonResetBugFix</em>.",
|
||||
"amdResetBody": "Una causa posible es el fallo de reinicio de la GPU. Reiniciar o apagar el host puede recuperarla temporalmente. Comprueba soporte de <code>vendor-reset</code> y carga temprana; <code>softdep amdgpu pre: vendor-reset</code> no garantiza por sí solo cargar antes de VFIO. <em>RadeonResetBugFix</em> en Windows también requiere GPU compatible.",
|
||||
"stuckBootTitle": "VM colgada arrancando / GPU no detectada",
|
||||
"stuckBootBody": "Confirma que VFIO realmente retiene la GPU al arrancar: <code>lspci -nnk -d vendor:device</code> debe mostrar <code>Kernel driver in use: vfio-pci</code>. Si aún muestra el driver del fabricante, el blacklist no surtió efecto — revisa <code>/etc/modprobe.d/blacklist.conf</code> y <code>dmesg | grep vfio</code>, y regenera initramfs: <code>update-initramfs -u -k all</code> y luego reinicia.",
|
||||
"stuckBootBody": "Consulta la dirección real con <code>lspci -nnk -s PCI_ADDRESS</code>; espera <code>Kernel driver in use: vfio-pci</code>. Sustituye PCI_ADDRESS. Si sigue el driver nativo, revisa su política de vinculación, no solo <code>/etc/modprobe.d/blacklist.conf</code>; NVIDIA usa estado por BDF. Consulta <code>dmesg | grep vfio</code>. Tras corregir configuración, ejecuta <code>update-initramfs -u -k all</code> y sigue el plan de reinicio.",
|
||||
"darkTitle": "La consola del host se queda a oscuras tras reiniciar y no puedo entrar por SSH",
|
||||
"darkBody": "Pasaste la GPU primaria sin tener acceso alternativo. Arranca en un recovery shell (ISO de rescate, IPMI), quita las líneas de la config de la VM (<code>/etc/pve/qemu-server/<vmid>.conf</code>) y quita las opciones vfio:",
|
||||
"darkBody": "Una pantalla negra no prueba que el host esté caído. Si falla SSH, revisa red y controladores incluidos en el grupo IOMMU. Recupera acceso por IPMI, serie o entorno de rescate; revisa <code>/etc/pve/qemu-server/<vmid>.conf</code> y revierte solo asignaciones y reglas relacionadas. No borres configuración ajena.",
|
||||
"logTitle": "Revisa el log de instalación",
|
||||
"logBody": "Cada ejecución escribe en <code>/tmp/add_gpu_vm.log</code>. Adjúntalo cuando pidas ayuda en GitHub."
|
||||
"logBody": "Cada ejecución escribe <code>/tmp/add_gpu_vm.log</code>. Adjunta el registro al pedir ayuda."
|
||||
},
|
||||
"revert": {
|
||||
"heading": "Revertir manualmente",
|
||||
"intro": "Hoy no hay un atajo dedicado de \"quitar GPU de la VM\" en ProxMenux. Para desadjuntar limpiamente:"
|
||||
"heading": "Deshacer cambios manualmente",
|
||||
"intro": "Detén la VM y retira solo sus asignaciones PCI correspondientes desde Hardware o mediante el índice explícito del ejemplo. Eliminarla de la VM no devuelve la GPU al controlador del host. Para eso usa Cambiar modo de GPU y revisa los invitados afectados antes de confirmar."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
@@ -156,7 +156,7 @@
|
||||
{
|
||||
"label": "Instalar drivers NVIDIA (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — instala los drivers en el host primero si también quieres la GPU usable desde ahí."
|
||||
"tail": " — prepara el controlador para tarjetas que sigan en el host; una GPU en VFIO no puede usarlo a la vez."
|
||||
},
|
||||
{
|
||||
"label": "Añadir GPU a LXC",
|
||||
@@ -164,9 +164,9 @@
|
||||
"tail": " — modelo alternativo: comparte la GPU con varios contenedores en lugar de dedicarla a una VM."
|
||||
},
|
||||
{
|
||||
"label": "Switch GPU Mode (VM ↔ LXC)",
|
||||
"label": "Cambiar modo de GPU (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — cambia la misma GPU entre modos sin rehacer todo el cableado."
|
||||
"tail": " — cambia la misma GPU entre uso compartido y asignación exclusiva."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de GPU Passthrough",
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Añadir GPU a LXC | ProxMenux Documentation",
|
||||
"description": "Comparte una GPU Intel, AMD o NVIDIA con un contenedor LXC para transcoding acelerado por hardware (Plex / Jellyfin / Frigate), cargas OpenCL / CUDA y aceleración de vídeo Mesa. ProxMenux gestiona los nodos de dispositivo, la alineación de GIDs y la instalación de drivers específica por distro dentro del contenedor."
|
||||
"title": "Añadir GPU a LXC | Documentación de ProxMenux",
|
||||
"description": "Comparte GPU Intel, AMD o NVIDIA con LXC. ProxMenux configura dispositivos, grupos y bibliotecas según la distribución; la aplicación debe admitir y tener configurada la aceleración."
|
||||
},
|
||||
"header": {
|
||||
"title": "Añadir GPU a LXC",
|
||||
"description": "Comparte una o varias GPUs con un contenedor LXC de Proxmox. El host sigue usando la GPU con normalidad — el contenedor solo recibe acceso a través de los nodos de dispositivo. Funciona con iGPUs Intel (Quick Sync / VA-API), tarjetas AMD (Mesa / ROCm) y NVIDIA (CUDA / NVENC).",
|
||||
"section": "Hardware: GPUs y Coral-TPU"
|
||||
"description": "Comparte acceso a GPU con LXC mediante dispositivos del host. El controlador sigue en el host; las aplicaciones usan bibliotecas compatibles y requieren su propia configuración.",
|
||||
"section": "Hardware: GPU y Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace esto",
|
||||
"body": "Añade entradas <code>dev<N></code> a la config del LXC (<code>/etc/pve/lxc/<ctid>.conf</code>) para que el contenedor vea <code>/dev/dri/*</code>, <code>/dev/kfd</code> o <code>/dev/nvidia*</code> — lo que aplique a tu GPU. Luego arranca el contenedor, detecta la distro de dentro e instala los drivers de userspace correspondientes (Mesa, intel-media-driver, runtime NVIDIA…) para que apps como Plex, Jellyfin o Frigate usen realmente la GPU para transcoding. Los GIDs (<code>video</code>, <code>render</code>) se alinean entre host y contenedor para que los permisos coincidan."
|
||||
"title": "Qué hace",
|
||||
"body": "Añade entradas <code>dev<N></code> a <code>/etc/pve/lxc/<ctid>.conf</code> para los dispositivos <code>/dev/dri/*</code>, <code>/dev/kfd</code> o <code>/dev/nvidia*</code> que correspondan. Arranca el LXC, instala paquetes según la distribución y, en Intel/AMD, alinea los grupos <code>video</code> y <code>render</code>. La aceleración requiere hardware y bibliotecas compatibles y configurar la app."
|
||||
},
|
||||
"compare": {
|
||||
"heading": "Compartición LXC vs passthrough a VM",
|
||||
"intro": "Los contenedores LXC comparten el kernel del host, así que pueden <em>compartir</em> la GPU del host sin apropiársela. Esa es una gran diferencia con las VMs: con <vmLink>passthrough a VM</vmLink> la GPU es exclusiva de una VM y el host no puede usarla. Con LXC, varios contenedores más el host pueden usar a la vez la misma GPU.",
|
||||
"heading": "Compartir con LXC frente a asignar a una VM",
|
||||
"intro": "LXC comparte el kernel y puede <em>compartir</em> la GPU entre host y contenedores. Con <vmLink>passthrough completo a una VM</vmLink>, el dispositivo se dedica a esa VM y deja de estar disponible para el controlador del host.",
|
||||
"headerFeature": "Característica",
|
||||
"headerLxc": "LXC (esta página)",
|
||||
"headerVm": "VM",
|
||||
@@ -37,74 +37,74 @@
|
||||
{
|
||||
"feature": "¿Hace falta reiniciar?",
|
||||
"lxc": "Normalmente no (solo reiniciar el CT)",
|
||||
"vm": "Sí, siempre"
|
||||
"vm": "Al cambiar controlador o IOMMU del host; no con cada asignación"
|
||||
},
|
||||
{
|
||||
"feature": "¿Soporta correr cualquier SO?",
|
||||
"feature": "Sistemas operativos invitados",
|
||||
"lxc": "Solo Linux (LXC es solo Linux)",
|
||||
"vm": "Windows, macOS, cualquier Linux"
|
||||
"vm": "SO invitado admitido con controlador GPU compatible"
|
||||
}
|
||||
]
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de empezar",
|
||||
"gpu": "<strong>Una GPU en el host</strong> — iGPU Intel, dGPU o APU AMD, o una tarjeta NVIDIA. El script autodetecta los tres vía <code>lspci</code>.",
|
||||
"gpu": "<strong>GPU en el host</strong> Intel, AMD o NVIDIA, detectada mediante <code>lspci</code>.",
|
||||
"gpuCheck": "lspci | grep -iE 'VGA|3D|Display'",
|
||||
"vfio": "<strong>La GPU NO está vinculada a vfio-pci.</strong> Si la GPU está actualmente asignada a una VM vía passthrough, es invisible para el driver del kernel del host y el LXC no puede usarla. El script detecta esto y se ofrece a ejecutar <switchLink>Switch GPU Mode</switchLink> por ti.",
|
||||
"nvidia": "<strong>Solo para NVIDIA:</strong> el driver NVIDIA del host debe estar ya instalado — ProxMenux necesita hacer coincidir las libs userspace del contenedor con la versión del host. Si aún no lo has hecho, ejecuta <nvidiaLink>Instalar drivers NVIDIA en el host</nvidiaLink> primero.",
|
||||
"vfio": "<strong>La GPU no debe estar vinculada a vfio-pci.</strong> Necesita el controlador nativo del host. Si está asignada a una VM, el script ofrece <switchLink>Cambiar modo de GPU</switchLink>.",
|
||||
"nvidia": "<strong>Para NVIDIA:</strong> instala primero el controlador en el host. Las bibliotecas del contenedor deben ser compatibles con su versión. Usa <nvidiaLink>Instalar controladores NVIDIA en el host</nvidiaLink>.",
|
||||
"nvidiaCheck": "nvidia-smi",
|
||||
"container": "<strong>Un contenedor LXC existente.</strong> El script opera sobre un contenedor que ya creaste — no crea uno. El contenedor debería idealmente ser <strong>privilegiado</strong> (unprivileged funciona pero necesita mapeo UID/GID que el script no configura)."
|
||||
"container": "<strong>Un LXC existente.</strong> El script no lo crea. Admite ambos modos; no requiere siempre un contenedor <strong>privilegiado</strong>. Deben coincidir los dispositivos y permisos numéricos de la aplicación."
|
||||
},
|
||||
"unpriv": {
|
||||
"title": "Funciona en contenedores privilegiados y unprivileged",
|
||||
"title": "Admite contenedores privilegiados y sin privilegios",
|
||||
"body": "El script escribe entradas <code>dev<N></code> en la config del LXC y, en contenedores unprivileged, alinea los GIDs de <code>video</code> y <code>render</code> entre host y contenedor para que los nodos de la GPU sean accesibles desde dentro sin tener que tocar manualmente <code>lxc.idmap</code>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Ejecutar el instalador",
|
||||
"body": "Abre ProxMenux en el host, ve a <strong>Hardware: GPUs and Coral-TPU → Add GPU to LXC</strong>.",
|
||||
"imageAlt": "Entrada del menú 'Add GPU to LXC' dentro de Hardware: GPUs and Coral-TPU"
|
||||
"body": "Abre ProxMenux y ve a <strong>Hardware: GPU y Coral-TPU → Añadir GPU a LXC</strong>.",
|
||||
"imageAlt": "Opción del menú para añadir GPU a LXC"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "Dos fases: todas las decisiones por adelantado, luego todos los cambios de una vez. No se toca nada en tu contenedor hasta que confirmas."
|
||||
"heading": "Cómo funciona el script",
|
||||
"body": "Selecciona contenedor y familias de GPU y supera las comprobaciones. Después detiene el LXC y cambia su configuración, sin confirmación final adicional. La limpieza opcional de VFIO se confirma aparte y puede modificar antes el host."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Recorriendo el flujo",
|
||||
"heading": "Proceso paso a paso",
|
||||
"detect": {
|
||||
"title": "Detectar GPUs del host",
|
||||
"body": "El script escanea <code>lspci</code> buscando controladoras VGA / 3D / Display que coincidan con Intel, AMD o NVIDIA. Para NVIDIA también verifica que el módulo de kernel <code>nvidia</code> esté cargado y que <code>nvidia-smi</code> funcione — la versión del driver del host que reporta se usará para elegir el instalador <code>.run</code> correcto para el contenedor.",
|
||||
"body": "Busca controladoras GPU con <code>lspci</code>. Para NVIDIA comprueba el módulo <code>nvidia</code> y <code>nvidia-smi</code>; usa la versión detectada para elegir el <code>.run</code> del contenedor.",
|
||||
"tipTitle": "¿NVIDIA no está listo?",
|
||||
"tipBody": "Si NVIDIA se detecta pero el módulo no está cargado, el script no ofrecerá la ruta NVIDIA. Ejecuta <nvidiaLink>Instalar drivers NVIDIA en el host</nvidiaLink> primero (y reinicia), luego vuelve."
|
||||
"tipBody": "Si falta el módulo o no funciona NVIDIA en el host, usa primero <nvidiaLink>Instalar controladores NVIDIA en el host</nvidiaLink> y verifica el controlador antes de volver."
|
||||
},
|
||||
"pickCt": {
|
||||
"title": "Elige un contenedor LXC",
|
||||
"body": "Verás una lista de cada LXC del host con su ID y nombre. Elige el que debería recibir la GPU. El contenedor puede estar en ejecución o parado — el script gestiona ambos casos (lo para brevemente durante la config, lo reinicia y lo deja en su estado original al final).",
|
||||
"imageAlt": "Diálogo listando los contenedores LXC existentes para elegir"
|
||||
"body": "Lista los LXC admitidos por ID y nombre. Excluye OCI: sus dispositivos se gestionan en Apps del gestor OCI. Detiene el LXC si está en marcha, lo arranca para instalar y normalmente recupera su estado inicial.",
|
||||
"imageAlt": "Selección de un contenedor LXC existente"
|
||||
},
|
||||
"selectGpu": {
|
||||
"title": "Selecciona la(s) GPU(s) a añadir",
|
||||
"body": "Si hay más de una GPU presente, recibes una checklist. Puedes añadir varias al mismo contenedor (p. ej., una iGPU Intel para Quick Sync + una dGPU AMD para ROCm). Si solo se detecta una GPU, se autoselecciona.",
|
||||
"imageAlt": "Checklist mostrando las GPUs detectadas (Intel / AMD / NVIDIA) con fabricante y dirección PCI"
|
||||
"title": "Selecciona las familias de GPU",
|
||||
"body": "Selecciona familias por fabricante, no un dispositivo PCI aislado. Intel/AMD añaden los nodos DRI previstos; NVIDIA añade sus dispositivos disponibles, que pueden corresponder a varias tarjetas. Una sola familia se selecciona automáticamente. Revisa la lista final, sobre todo con varias GPU.",
|
||||
"imageAlt": "Lista de familias GPU detectadas con nombre y dirección PCI"
|
||||
},
|
||||
"preflight": {
|
||||
"title": "Comprobaciones previas",
|
||||
"imageAlt": "Diálogo que ofrece ejecutar Switch GPU Mode cuando la GPU seleccionada sigue vinculada a vfio-pci para passthrough a VM",
|
||||
"imageAlt": "Oferta para cambiar el modo de una GPU vinculada a vfio-pci",
|
||||
"intro": "Tres comprobaciones, cualquiera de las cuales puede bloquearte o redirigirte:",
|
||||
"items": [
|
||||
"<strong>SR-IOV.</strong> Si la GPU seleccionada es una Virtual Function (VF) o una Physical Function con VFs activas, el passthrough a LXC no aplica — el dispositivo lo gestiona el driver SR-IOV. Bloqueado.",
|
||||
"<strong>Vinculada a vfio-pci.</strong> Si la GPU está actualmente retenida por VFIO para passthrough a VM, el kernel del host no puede crear nodos <code>/dev/dri/*</code> o <code>/dev/nvidia*</code> para ella. El script se ofrece a ejecutar <switchLink>Switch GPU Mode</switchLink> que deshace el binding VFIO; probablemente necesitarás un reinicio antes de volver a ejecutar Añadir GPU a LXC.",
|
||||
"<strong>Ya configurada.</strong> Si el contenedor ya tiene todos los nodos de dispositivo para la GPU seleccionada, el script lo dice y sale limpiamente. Si está parcialmente configurada, continúa solo con las piezas que faltan."
|
||||
"<strong>Protección SR-IOV.</strong> El asistente bloquea una VF o PF con VF activas. Es una limitación de su selección amplia de dispositivos, no una prohibición universal en LXC. Configura esos dispositivos por separado.",
|
||||
"<strong>Vinculada a vfio-pci.</strong> El controlador nativo no puede crear <code>/dev/dri/*</code> o <code>/dev/nvidia*</code>. Ofrece <switchLink>Cambiar modo de GPU</switchLink>; sigue las indicaciones de reinicio y vuelve después.",
|
||||
"<strong>Ya configurada.</strong> Si están todos los dispositivos, sale sin reinstalar bibliotecas. Si solo falta alguna familia seleccionada, continúa con ella."
|
||||
]
|
||||
},
|
||||
"applyConfig": {
|
||||
"title": "Aplica los cambios de config del LXC",
|
||||
"body1": "El script para el contenedor, edita <code>/etc/pve/lxc/<ctid>.conf</code> y añade entradas <code>dev<N></code> con los GIDs correctos para las GPUs seleccionadas. Usar entradas <code>dev:</code> (en lugar de las viejas líneas <code>lxc.mount.entry</code>) es la forma moderna de Proxmox — los permisos de grupo se aplican en tiempo de parseo de la config en lugar de en tiempo de mount.",
|
||||
"body1": "Detiene el LXC si está en marcha y edita <code>/etc/pve/lxc/<ctid>.conf</code>. Las entradas <code>dev<N></code> llevan el GID <code>video</code> o <code>render</code> del host. Sustituye las líneas <code>lxc.mount.entry</code> de <code>/dev/dri</code> por entradas <code>dev:</code>. Revisa configuración y permisos resultantes.",
|
||||
"body2": "Ejemplo después de Intel + NVIDIA en el mismo contenedor:"
|
||||
},
|
||||
"installDrivers": {
|
||||
"title": "Arranca el contenedor e instala los drivers dentro",
|
||||
"body": "Una vez escrita la config, el script arranca el contenedor, espera hasta ~30 segundos a que <code>pct exec</code> responda y luego detecta la distro del contenedor desde <code>/etc/os-release</code>. En base a eso, instala los paquetes userspace correctos.",
|
||||
"headerDistro": "Distro",
|
||||
"body": "Arranca el contenedor y espera hasta unos 30 segundos a que responda <code>pct exec</code>. Detecta la distribución con <code>/etc/os-release</code> e instala los paquetes correspondientes.",
|
||||
"headerDistro": "Distribución",
|
||||
"headerInt": "Intel / AMD",
|
||||
"headerNvidia": "NVIDIA",
|
||||
"rows": [
|
||||
@@ -121,41 +121,41 @@
|
||||
],
|
||||
"debianDistro": "Debian / Ubuntu / otras",
|
||||
"debianIntel": "apt-get install va-driver-all intel-opencl-icd vainfo",
|
||||
"debianNvidia": "extraer el <code>.run</code> del host → <code>pct push</code> → ejecutar con <code>--no-kernel-modules --no-dkms</code>",
|
||||
"whyTitle": "Por qué el baile del .run de NVIDIA en Debian",
|
||||
"whyBody": "Debian / Ubuntu no traen paquetes NVIDIA con una versión lo bastante granular como para coincidir con el driver del host byte por byte. Las libs userspace dentro del contenedor <strong>deben coincidir con la versión del módulo de kernel</strong> cargado en el host, o <code>nvidia-smi</code> falla con un version mismatch. ProxMenux lo resuelve usando exactamente el mismo instalador <code>.run</code> que se usó para el host — extraído, tarred, enviado al contenedor con <code>pct push</code> y ejecutado con <code>--no-kernel-modules --no-dkms</code> para que solo se toque el userspace."
|
||||
"debianNvidia": "Extrae <code>.run</code> en el host → <code>pct push</code> → instala con <code>--no-kernel-modules --no-dkms</code>.",
|
||||
"whyTitle": "Por qué usa el instalador NVIDIA .run en Debian",
|
||||
"whyBody": "Los paquetes del repositorio pueden no coincidir con el host. Las bibliotecas <strong>deben coincidir con el módulo cargado</strong> para herramientas NVML como <code>nvidia-smi</code>. En Debian/glibc extrae y comprime en el host el <code>.run</code> de esa versión, lo transfiere con <code>pct push</code> e instala con <code>--no-kernel-modules --no-dkms</code>. Alpine y Arch usan paquetes: verifica sus versiones."
|
||||
},
|
||||
"alignGids": {
|
||||
"title": "Alinear GIDs y restaurar el estado",
|
||||
"body1": "Los archivos de dispositivo en el host pertenecen al grupo <code>video</code> (GID 44) o <code>render</code> (GID 104). La distro del contenedor puede traer números de GID distintos para esos grupos, lo que haría que los nodos de la GPU fueran inalcanzables desde dentro. El script reescribe <code>/etc/group</code> en el contenedor para que <code>video:44</code> y <code>render:104</code> coincidan exactamente.",
|
||||
"body2": "Finalmente, restaura el contenedor a su estado original — si estaba parado cuando empezaste, se vuelve a parar. Si estaba en ejecución, se queda en ejecución."
|
||||
"body1": "En Intel/AMD, lee los GID del host para <code>video</code> y <code>render</code>; usa 44/104 solo como alternativa. Ajusta <code>/etc/group</code> dentro del LXC; si solo hay NVIDIA, omite este paso. <code>video:44</code> y <code>render:104</code> son ejemplos, no valores universales. Verifica grupos de la app y permisos efectivos.",
|
||||
"body2": "Al completar normalmente, vuelve a detener el LXC si inicialmente estaba parado; si estaba funcionando, lo deja activo. Ante un fallo de arranque o instalación, revisa el estado final y el registro."
|
||||
}
|
||||
},
|
||||
"vendors": {
|
||||
"heading": "Notas específicas del fabricante",
|
||||
"heading": "Notas por fabricante",
|
||||
"intelHeading": "iGPU Intel",
|
||||
"intelBody": "La ruta más común — ideal para transcoding por hardware de Plex / Jellyfin / Frigate vía <em>Quick Sync</em>. El contenedor recibe <code>/dev/dri/card0</code> (legacy) y <code>/dev/dri/renderD128</code> (nodo render-only moderno — lo que las apps usan realmente). No hace falta cambios del lado del host; el driver <code>i915</code> del host ya creó los nodos.",
|
||||
"intelBody": "La aceleración Intel, incluido <em>Quick Sync</em>, depende de generación, códecs y configuración de la app. Comparte los nodos que existan entre <code>/dev/dri/card0</code>, <code>card1</code>, <code>renderD128</code> y <code>renderD129</code>; no añade otros números. Debe crearlos antes el controlador nativo del host, como <code>i915</code>.",
|
||||
"amdHeading": "AMD",
|
||||
"amdBody": "Los mismos nodos DRI que Intel para gráficos / VA-API. Si <code>/dev/kfd</code> existe en el host (soporte de cómputo AMD / kernel ROCm), el script también lo añade para que los contenedores puedan hacer cargas OpenCL / ROCm. Los drivers VA de Mesa cubren el lado de decodificación de vídeo.",
|
||||
"amdBody": "AMD usa DRI para Mesa/VA-API. Si existe <code>/dev/kfd</code> en el host, lo comparte también. ROCm/OpenCL requiere hardware y paquetes compatibles; compartir el dispositivo no instala toda la pila ROCm.",
|
||||
"nvidiaHeading": "NVIDIA",
|
||||
"nvidiaBody": "Añade cada nodo <code>/dev/nvidia*</code> que el host expone. La pieza crítica es <strong>el matching de versión de driver</strong>: la versión del módulo del host y la versión de la lib userspace del contenedor deben ser idénticas, si no <code>nvidia-smi</code> dentro del contenedor falla. ProxMenux captura la versión del host en tiempo de detección y usa el mismo archivo <code>.run</code> para instalar el userspace del contenedor. Para contenedores Debian, la instalación sube la memoria del contenedor a 2 GB temporalmente (el instalador necesita ~1.5 GB libres para extraer) y la restaura después.",
|
||||
"updateTitle": "Después de actualizar el driver NVIDIA del host, vuelve a ejecutar este script",
|
||||
"updateBody": "Cuando actualizas el driver NVIDIA en el host, las libs userspace del contenedor se quedan en la versión vieja y <code>nvidia-smi</code> dentro del contenedor se rompe. El <nvidiaLink>instalador NVIDIA host</nvidiaLink> de ProxMenux detecta los contenedores con passthrough NVIDIA y se ofrece a actualizarlos automáticamente — pero si te saltaste ese prompt, simplemente ejecuta Añadir GPU a LXC otra vez sobre el mismo contenedor y refrescará el userspace."
|
||||
"nvidiaBody": "Comparte <code>/dev/nvidia*</code> disponibles. <strong>Coincidir la versión del controlador</strong> es esencial para <code>nvidia-smi</code>. Debian/glibc usa el <code>.run</code> de la versión del host; Alpine/Arch, repositorios. Con menos de 2048 MiB de RAM configurada, la ruta Debian ofrece aumentarla temporalmente y restaurarla; exige 1500 MiB libres en disco.",
|
||||
"updateTitle": "Tras actualizar NVIDIA en el host, comprueba las bibliotecas LXC",
|
||||
"updateBody": "Bibliotecas antiguas pueden provocar incompatibilidad en <code>nvidia-smi</code>. El <nvidiaLink>instalador NVIDIA del host</nvidiaLink> ofrece actualizar LXC. Repetir Añadir GPU a LXC puede salir si ya existen los dispositivos: no garantiza actualizar bibliotecas. Verifica versiones y actualiza paquetes o el instalador de usuario apropiado."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verificación",
|
||||
"body": "Después de que el script termine, entra en el contenedor y comprueba que la GPU es visible:"
|
||||
"body": "Entra en el contenedor y verifica que ve la GPU y puede utilizarla."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"mismatchTitle": "nvidia-smi: Failed to initialize NVML: Driver/library version mismatch",
|
||||
"mismatchBody": "La versión userspace del contenedor ≠ la versión del módulo del host. Ejecuta Añadir GPU a LXC otra vez sobre ese contenedor — el script extrae el <code>.run</code> actual del host y reinstala el userspace haciéndolo coincidir.",
|
||||
"mismatchBody": "Las bibliotecas no coinciden con el módulo activo. Verifica versiones y actualiza el espacio de usuario del LXC. El <code>.run</code> almacenado sirve para Debian/glibc, pero Añadir GPU a LXC puede salir si ya están todos los dispositivos.",
|
||||
"denyTitle": "Permission denied en /dev/dri/renderD128 dentro del contenedor",
|
||||
"denyBody": "Normalmente uno de: (1) el contenedor es unprivileged sin mapeo UID/GID al grupo <code>render</code> del host; (2) el usuario dentro del contenedor no está en el grupo <code>render</code>. Fix: añade el usuario a <code>render</code> dentro del contenedor (<code>usermod -aG render <user></code>), o pasa a modo privilegiado si la carga es de confianza.",
|
||||
"denyBody": "Revisa dispositivo y permisos numéricos de <code>render</code>; comprueba que el usuario de la app pertenezca a <code>render</code>. Si está disponible, añádelo a <code>render</code> con <code>usermod -aG render <user></code>, sustituyendo el marcador por la cuenta real. Reinicia su sesión. Cambiar privilegios no es una solución general.",
|
||||
"vainfoTitle": "vainfo dice: VA-API version 1.xx; failed to initialize",
|
||||
"vainfoBody": "El runtime de VA-API está, pero no se instaló ningún driver adecuado. En Intel, instala <code>intel-media-driver</code> (gens nuevas) o <code>i965-va-driver</code> (gens viejas). En AMD, <code>mesa-va-drivers</code>. Vuelve a ejecutar el script en caso de duda.",
|
||||
"logTitle": "Log de instalación",
|
||||
"logBody": "Cada ejecución escribe en <code>/tmp/add_gpu_lxc.log</code> en el host. Inclúyelo cuando pidas ayuda en GitHub."
|
||||
"vainfoBody": "Comprueba acceso y controlador VA-API. Los paquetes varían por distribución: ejemplos son <code>intel-media-driver</code> para Intel modernas compatibles, <code>i965-va-driver</code> para antiguas compatibles y <code>mesa-va-drivers</code> para AMD. El mensaje no prueba por sí solo que falte un paquete.",
|
||||
"logTitle": "Registro de instalación",
|
||||
"logBody": "Cada ejecución escribe <code>/tmp/add_gpu_lxc.log</code> en el host. Adjunta el registro al pedir ayuda."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
@@ -163,17 +163,17 @@
|
||||
{
|
||||
"label": "Instalar drivers NVIDIA (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — prerequisito necesario para GPUs NVIDIA antes de pasarlas a un contenedor."
|
||||
"tail": " — instala primero el controlador del host para compartir NVIDIA."
|
||||
},
|
||||
{
|
||||
"label": "Añadir GPU a VM (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — modelo alternativo cuando necesitas la GPU dedicada a una sola VM."
|
||||
"tail": " — alternativa para dedicar una GPU a una VM."
|
||||
},
|
||||
{
|
||||
"label": "Switch GPU Mode (VM ↔ LXC)",
|
||||
"label": "Cambiar modo de GPU (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — alterna la misma GPU entre compartición LXC y passthrough a VM."
|
||||
"tail": " — cambia la GPU entre compartir con LXC y asignar a VM."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de GPU Passthrough",
|
||||
|
||||
@@ -1,164 +1,164 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Instalar Coral TPU en el host | ProxMenux Documentation",
|
||||
"description": "Instala los drivers de Google Coral TPU en un host Proxmox VE. ProxMenux autodetecta si tienes M.2 / Mini-PCIe o el USB Accelerator (o ambos) y ejecuta solo la ruta de instalación que aplica — módulos de kernel gasket/apex vía DKMS para PCIe, runtime libedgetpu1-std para USB."
|
||||
"title": "Instalar Coral TPU en el host | Documentación de ProxMenux",
|
||||
"description": "Instala componentes Coral en Proxmox VE según el hardware detectado: módulos gasket/apex con DKMS para M.2 / Mini-PCIe y runtime libedgetpu1-std para USB. Si detecta ambos, ejecuta los dos procesos."
|
||||
},
|
||||
"header": {
|
||||
"title": "Instalar Coral TPU en el host",
|
||||
"description": "Prepara el host Proxmox para que más adelante se pueda pasar una Coral TPU a un contenedor LXC. ProxMenux autodetecta si tienes una tarjeta M.2 / Mini-PCIe, un USB Accelerator, o ambos, y ejecuta solo la ruta de instalación que aplica — build del módulo de kernel vía DKMS para PCIe, runtime Edge TPU de Google para USB.",
|
||||
"section": "Hardware: GPUs y Coral-TPU"
|
||||
"description": "Prepara el host Proxmox para usar Coral y compartirla con LXC. Detecta M.2 / Mini-PCIe, USB o ambos y ejecuta el proceso correspondiente: módulos DKMS para PCIe y runtime Google Edge TPU para USB.",
|
||||
"section": "Hardware: GPU y Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace esto",
|
||||
"body": "El instalador de Coral es <strong>unificado y consciente del hardware</strong>: ejecutas una opción del menú y averigua qué tienes realmente. Las tarjetas M.2 / Mini-PCIe necesitan módulos de kernel (<code>gasket</code> + <code>apex</code>) construidos con DKMS para que sobrevivan a las actualizaciones de kernel. Los USB Accelerators solo necesitan el runtime Edge TPU de Google (<code>libedgetpu1-std</code>) desde el propio repositorio APT de Google. ¿Ambos tipos enchufados? Ambas rutas se ejecutan en secuencia."
|
||||
"title": "Qué hace",
|
||||
"body": "Un <strong>instalador único que detecta el hardware</strong>. PCIe usa <code>gasket</code> y <code>apex</code> con DKMS; futuras compilaciones requieren fuentes y cabeceras compatibles. USB usa <code>libedgetpu1-std</code>. Si detecta ambos, ejecuta ambos procesos. El runtime USB debe estar donde corre la app; si solo corre en LXC, no es obligatorio tenerlo también en el host."
|
||||
},
|
||||
"which": {
|
||||
"heading": "¿Qué Coral tengo?",
|
||||
"body": "Los dos tipos de dispositivos Coral que puedes enchufar en un host Proxmox se ven muy diferentes y la instalación del lado del host también es muy diferente. El script gestiona ambos, pero conviene saber qué tienes antes de ejecutar nada:",
|
||||
"body": "Los modelos PCIe y USB tienen formatos y requisitos distintos. El script gestiona ambos; identifica tu dispositivo antes de ejecutarlo.",
|
||||
"headerForm": "Factor de forma",
|
||||
"headerDetect": "Detección",
|
||||
"headerInstall": "Tipo de instalación",
|
||||
"headerReboot": "¿Reiniciar?",
|
||||
"pcieForm": "M.2 / Mini-PCIe",
|
||||
"pcieFormSub": "(TPU dual-edge en una tarjeta M.2)",
|
||||
"pcieDetect": "PCI vendor <code>1ac1</code>",
|
||||
"pcieFormSub": "(hay tarjetas M.2 con una o dos Edge TPU)",
|
||||
"pcieDetect": "ID de fabricante PCI <code>1ac1</code>",
|
||||
"pcieInstall": "Módulo de kernel (gasket + apex) vía DKMS",
|
||||
"pcieReboot": "Sí",
|
||||
"usbForm": "USB Accelerator",
|
||||
"usbForm": "Acelerador USB",
|
||||
"usbFormSub": "(pequeño dongle de plástico)",
|
||||
"usbDetect": "USB <code>1a6e:089a</code> (sin programar) / <code>18d1:9302</code> (programado)",
|
||||
"usbInstall": "Runtime userspace (<code>libedgetpu1-std</code>) desde el repo APT de Google",
|
||||
"usbInstall": "Runtime <code>libedgetpu1-std</code> del repositorio APT de Google",
|
||||
"usbReboot": "No"
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de empezar",
|
||||
"coral": "<strong>Una Coral TPU enchufada en el host</strong> (M.2, Mini-PCIe o USB). Sin Coral no hay instalación — el script simplemente te dice que no se detectó nada y sale.",
|
||||
"coral": "<strong>Una Coral conectada</strong> (M.2, Mini-PCIe o USB) para instalar. Sin hardware detectado puede ofrecer limpiar o desinstalar componentes existentes, pero no instala una nueva ruta de hardware.",
|
||||
"coralCheck": "lspci -d 1ac1: ; lsusb | grep -E '1a6e:089a|18d1:9302'",
|
||||
"internet": "<strong>Acceso a internet</strong> en el host — para PCIe la ruta DKMS clona un repo de GitHub, para USB añade un repo APT de Google y descarga el paquete <code>libedgetpu1-std</code>.",
|
||||
"headers": "<strong>Headers del kernel disponibles vía APT</strong>. En Proxmox esto significa que <code>proxmox-headers-$(uname -r)</code> debe ser instalable — solo necesario para la ruta PCIe/M.2, pero el script lo trae automáticamente para que tú no tengas que hacerlo.",
|
||||
"reboot": "<strong>Asume un reinicio</strong> si tienes hardware PCIe. El módulo de kernel se construye y se carga al final, pero un arranque limpio es la forma limpia de confirmar que sale por sí solo."
|
||||
"internet": "<strong>Acceso a Internet</strong> en el host para clonar el controlador PCIe de GitHub o descargar <code>libedgetpu1-std</code> del repositorio APT de Google para USB.",
|
||||
"headers": "<strong>Cabeceras del kernel disponibles en APT</strong>: <code>proxmox-headers-$(uname -r)</code>. Solo las necesita PCIe/M.2; el script las instala.",
|
||||
"reboot": "<strong>Planifica un reinicio</strong> para PCIe. El script intenta cargar los módulos compilados; reiniciar permite comprobar que se cargan automáticamente."
|
||||
},
|
||||
"hostPrepTip": {
|
||||
"title": "Esto solo prepara el host",
|
||||
"body": "Instalar Coral aquí deja el host <em>listo</em> — la TPU es visible para el kernel del host y se puede entregar a un LXC. Para <em>usarla</em> realmente desde un contenedor (Frigate, DeepStack, etc.), el siguiente paso es <lxcLink>Añadir Coral TPU a un LXC</lxcLink>."
|
||||
"body": "Prepara el host para <em>acceder al dispositivo</em>; no configura ni prueba la aplicación. Para <em>usar</em> Coral en una app compatible como Frigate, continúa con <lxcLink>Añadir Coral TPU a un LXC</lxcLink>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Ejecutar el instalador",
|
||||
"body": "Abre ProxMenux en el host, ve a <strong>Hardware: GPUs and Coral-TPU → Install/Update Coral TPU on Host</strong>.",
|
||||
"imageAlt": "Entrada del menú 'Install/Update Coral TPU on Host' dentro de Hardware: GPUs and Coral-TPU"
|
||||
"body": "Abre ProxMenux en el host y ve a <strong>Hardware: GPU y Coral-TPU → Instalar/actualizar Coral TPU en el host</strong>.",
|
||||
"imageAlt": "Opción del menú para instalar o actualizar Coral TPU en el host"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "El hardware se detecta primero, así que el plan de instalación se adapta a tu setup real. No se instala nada hasta que confirmas."
|
||||
"heading": "Cómo funciona el script",
|
||||
"body": "Primero detecta el hardware y prepara el plan correspondiente. La instalación requiere confirmación."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Recorriendo el flujo",
|
||||
"heading": "Proceso paso a paso",
|
||||
"detect": {
|
||||
"title": "Detección de hardware",
|
||||
"body": "El script lee <code>/sys/bus/pci/devices/*/vendor</code> buscando <code>0x1ac1</code> (Global Unichip Corp., el fabricante del silicio de los chips Coral TPU) y ejecuta <code>lsusb</code> buscando los IDs del USB Accelerator. El dispositivo USB tiene <strong>dos</strong> IDs según si su firmware ya se ha cargado:",
|
||||
"body": "Busca el fabricante <code>0x1ac1</code> en <code>/sys/bus/pci/devices/*/vendor</code> y usa <code>lsusb</code> para detectar USB. Hay <strong>dos</strong> ID USB, según se haya cargado el firmware:",
|
||||
"items": [
|
||||
"<code>1a6e:089a</code> — Global Unichip, estado <em>sin programar</em> (antes de que el runtime Edge TPU le hable por primera vez).",
|
||||
"<code>18d1:9302</code> — Google, estado <em>programado</em> (después de que el runtime le cargue firmware)."
|
||||
"<code>1a6e:089a</code> — Global Unichip, estado <em>sin programar</em>, antes de que el runtime cargue el firmware.",
|
||||
"<code>18d1:9302</code> — Google, estado <em>programado</em>, tras cargar el firmware."
|
||||
],
|
||||
"outro": "Si no se encuentra ninguno, recibes un diálogo informativo y el script sale limpiamente — sin cambios parciales en el host."
|
||||
"outro": "Si no detecta Coral ni una instalación previa, muestra un aviso y sale. Si hay componentes existentes, puede ofrecer limpiarlos o desinstalarlos."
|
||||
},
|
||||
"prompt": {
|
||||
"title": "Prompt previo a la instalación",
|
||||
"body": "Antes de tocar nada, un único diálogo resume lo que se detectó y lo que se instalará. Puedes cancelar aquí sin ningún efecto secundario.",
|
||||
"imageAlt": "Diálogo previo a la instalación mostrando el hardware Coral detectado (cuenta de M.2/PCIe + cuenta de USB) y la lista de pasos que ejecutará el instalador"
|
||||
"title": "Confirmación de la instalación",
|
||||
"body": "Antes de instalar, un diálogo resume los dispositivos y componentes previstos. Cancelar omite la instalación. La limpieza opcional de componentes antiguos tiene una confirmación anterior independiente.",
|
||||
"imageAlt": "Resumen de dispositivos Coral y pasos de instalación"
|
||||
},
|
||||
"pcie": {
|
||||
"title": "Ruta PCIe — módulos de kernel gasket + apex vía DKMS",
|
||||
"body": "Solo se ejecuta si el script encontró una Coral PCIe / M.2. Es la más pesada de las dos rutas porque está compilando un módulo de kernel para tu kernel en ejecución exacto.",
|
||||
"title": "PCIe: módulos gasket y apex mediante DKMS",
|
||||
"body": "Solo se ejecuta si detecta una Coral PCIe/M.2. Compila módulos para el kernel que está ejecutando el host.",
|
||||
"items": [
|
||||
"<strong>Limpieza.</strong> Si una instalación anterior de <code>gasket-dkms</code> dejó dpkg en un estado roto (típico tras una actualización de kernel PVE 9 donde el autoinstall de DKMS falló silenciosamente), force-purge.",
|
||||
"<strong>Instalar dependencias de build:</strong> <code>git</code>, <code>dkms</code>, <code>build-essential</code>, <code>proxmox-headers-$(uname -r)</code>."
|
||||
"<strong>Limpieza.</strong> Elimina cualquier paquete <code>gasket-dkms</code> existente antes de compilar; si está en mal estado, fuerza su eliminación y lo purga.",
|
||||
"<strong>Dependencias de compilación:</strong> <code>git</code>, <code>dkms</code>, <code>build-essential</code>, <code>proxmox-headers-$(uname -r)</code>."
|
||||
],
|
||||
"cloneIntro": "<strong>Clonar el código del driver.</strong> Prefiere el fork de la comunidad <feranickLink>feranick/gasket-driver</feranickLink> (mantenimiento activo, listo para kernel 6.12+). Recurre a <googleLink>google/gasket-driver</googleLink> si feranick no es accesible, aplicando parches específicos del kernel:",
|
||||
"cloneIntro": "<strong>Clona el controlador.</strong> Prefiere <feranickLink>feranick/gasket-driver</feranickLink> y recurre a <googleLink>google/gasket-driver</googleLink> si no está disponible. Compilar requiere compatibilidad con el kernel. Al código de Google le aplica estos parches según la versión:",
|
||||
"kernelPatches": [
|
||||
"Kernel 6.5+ : <code>no_llseek</code> eliminado en upstream → sustitución por <code>noop_llseek</code>",
|
||||
"Kernel 6.13+ : <code>MODULE_IMPORT_NS(DMA_BUF)</code> requiere literal de string"
|
||||
"Para kernel 6.5 o superior, sustituye <code>no_llseek</code> por <code>noop_llseek</code> en el código alternativo.",
|
||||
"Kernel 6.13 o superior: convierte el argumento de <code>MODULE_IMPORT_NS(DMA_BUF)</code> en una cadena literal."
|
||||
],
|
||||
"afterItems": [
|
||||
"<strong>Stage del código en <code>/usr/src/gasket-1.0/</code>,</strong> generar <code>dkms.conf</code>, registrar con <code>dkms add</code>.",
|
||||
"<strong>Build + install:</strong> <code>dkms build</code> y luego <code>dkms install</code>. Si algo falla, las últimas 50 líneas de <code>make.log</code> se imprimen en el terminal para que veas el error real — sin tener que cazar en archivos de log.",
|
||||
"<strong>Crear el grupo <code>apex</code> + reglas udev</strong> (<code>/etc/udev/rules.d/99-coral-apex.rules</code>) para que los nodos <code>/dev/apex_*</code> tengan el grupo correcto en el siguiente arranque.",
|
||||
"<strong>Cargar los módulos:</strong> <code>modprobe gasket</code> + <code>modprobe apex</code>."
|
||||
"<strong>Copia las fuentes a <code>/usr/src/gasket-1.0/</code>,</strong> genera <code>dkms.conf</code> y las registra con <code>dkms add</code>.",
|
||||
"<strong>Compila e instala:</strong> <code>dkms build</code> y después <code>dkms install</code>. Si falla, muestra las últimas 50 líneas de <code>make.log</code> si existe.",
|
||||
"<strong>Crea el grupo <code>apex</code> y reglas udev</strong> (<code>/etc/udev/rules.d/99-coral-apex.rules</code>) para asignar el grupo a <code>/dev/apex_*</code>.",
|
||||
"<strong>Intenta cargar los módulos:</strong> <code>modprobe gasket</code> y <code>modprobe apex</code>."
|
||||
],
|
||||
"imageAlt": "Progreso de build DKMS + salida de carga de módulo para los módulos de kernel gasket/apex"
|
||||
"imageAlt": "Compilación DKMS y carga de módulos gasket/apex"
|
||||
},
|
||||
"usb": {
|
||||
"title": "Ruta USB — runtime Edge TPU de Google",
|
||||
"title": "USB: runtime Edge TPU de Google",
|
||||
"body": "Solo se ejecuta si se detectó un USB Accelerator. Mucho más simple:",
|
||||
"items": [
|
||||
"<strong>Añadir la clave GPG de Google</strong> a <code>/etc/apt/keyrings/coral-edgetpu.gpg</code>.",
|
||||
"<strong>Añadir el repositorio APT</strong> a <code>/etc/apt/sources.list.d/coral-edgetpu.list</code> con <code>signed-by=</code> apuntando al keyring (formato moderno, no deprecado).",
|
||||
"<strong>Instalar <code>libedgetpu1-std</code></strong> — el runtime Edge TPU de rendimiento estándar.",
|
||||
"<strong>Recargar udev</strong> para que las reglas que vienen con el paquete apliquen al dispositivo USB sin tener que desenchufar/reenchufar."
|
||||
"<strong>Añade la clave GPG de Google</strong> a <code>/etc/apt/keyrings/coral-edgetpu.gpg</code>.",
|
||||
"<strong>Añade el repositorio APT</strong> en <code>/etc/apt/sources.list.d/coral-edgetpu.list</code>; <code>signed-by=</code> limita la verificación a su llavero. Usa sintaxis .list de una línea, no .sources de deb822.",
|
||||
"<strong>Instala <code>libedgetpu1-std</code></strong>, el runtime Edge TPU de rendimiento estándar.",
|
||||
"<strong>Recarga udev</strong> y activa las reglas del paquete sobre el dispositivo USB."
|
||||
],
|
||||
"stdTitle": "¿Por qué libedgetpu1-std y no libedgetpu1-max?",
|
||||
"stdBody": "La variante <code>max</code> overclockea la Coral y calienta más. Está bien para uso de desktop con ventilación; no recomendado en builds NUC / Mini-PC pequeños o hosts Proxmox refrigerados pasivamente. Si realmente la quieres, instálala a mano después: <code>apt install libedgetpu1-max</code>."
|
||||
"stdBody": "El paquete <code>max</code> activa la máxima frecuencia admitida, con más rendimiento, consumo y calor. Comprueba la refrigeración y condiciones del acelerador antes de cambiar. Los paquetes son excluyentes; cambia con <code>apt install libedgetpu1-max</code>."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Prompt de reinicio (solo si se ejecutó PCIe)",
|
||||
"body": "Si la ruta PCIe se ejecutó, el script ofrece un reinicio. Los módulos ya se <code>modprobe</code>'aron así que en teoría puedes saltarte el reinicio — pero un arranque limpio es la forma correcta de verificar que el módulo sale por sí solo y que <code>/dev/apex_0</code> aparece con grupo <code>apex</code>. Para instalaciones solo USB, no se sugiere reinicio (el runtime y las reglas udev están activos inmediatamente).",
|
||||
"imageAlt": "Resumen final + prompt de reinicio después de una instalación PCIe"
|
||||
"title": "Reinicio opcional tras la instalación PCIe",
|
||||
"body": "Tras PCIe ofrece reiniciar. Ya ha intentado <code>modprobe</code>, pero comprueba que carga los módulos y que <code>/dev/apex_0</code> aparece con grupo <code>apex</code>. Un reinicio planificado verifica la carga automática. Con solo USB no pide reiniciar el host.",
|
||||
"imageAlt": "Resumen y propuesta de reinicio tras instalar PCIe"
|
||||
}
|
||||
},
|
||||
"legacyCleanup": {
|
||||
"heading": "Limpieza de gasket-dkms antiguo en hosts con Coral USB",
|
||||
"intro": "Si el host <strong>no tiene ninguna Coral PCIe / M.2 detectada</strong>, pero conserva una instalación anterior de <code>gasket-dkms</code>, ProxMenux identifica ese estado por separado y ofrece una limpieza opcional. No se elimina nada sin confirmación.",
|
||||
"heading": "Limpiar gasket-dkms antiguo en hosts que solo usan USB",
|
||||
"intro": "Si <strong>no detecta Coral PCIe/M.2</strong> pero existe una instalación anterior de <code>gasket-dkms</code>, ofrece una limpieza opcional. Requiere confirmación.",
|
||||
"items": [
|
||||
"Si hay una Coral PCIe / M.2 presente, esta limpieza nunca se ofrece; se utiliza la ruta normal de reconstrucción DKMS.",
|
||||
"La limpieza purga <code>gasket-dkms</code>, elimina registros DKMS y árboles de código gasket residuales, y repara cualquier estado pendiente de <code>dpkg</code> o APT.",
|
||||
"Los paquetes del runtime USB <code>libedgetpu1-std</code> y <code>libedgetpu1-max</code> no se modifican, por lo que una Coral USB conserva su runtime.",
|
||||
"Si detecta una Coral PCIe/M.2, usa la ruta normal de recompilación DKMS y no ofrece esta limpieza.",
|
||||
"Purga <code>gasket-dkms</code>, elimina registros DKMS y fuentes obsoletas de gasket y repara el estado pendiente de <code>dpkg</code>/APT.",
|
||||
"Conserva los paquetes USB <code>libedgetpu1-std</code> y <code>libedgetpu1-max</code>, por lo que la Coral USB mantiene su runtime.",
|
||||
"Antes de indicar que ha terminado correctamente, el script verifica que el paquete antiguo ya no existe y que el gestor de paquetes está en buen estado."
|
||||
],
|
||||
"warningTitle": "Confirma primero el hardware",
|
||||
"warningBody": "Si puede haber una Coral PCIe / M.2 instalada pero no está siendo detectada, cancela la limpieza y comprueba la tarjeta, la ranura y la configuración del firmware antes de continuar."
|
||||
"warningBody": "Si esperabas una Coral PCIe/M.2 y no aparece, cancela la limpieza y revisa tarjeta, slot y firmware."
|
||||
},
|
||||
"reinstallUninstall": {
|
||||
"heading": "Reinstalar o desinstalar",
|
||||
"intro": "Ejecutar el instalador en un host donde Coral ya está instalada (PCIe vía <code>gasket-dkms</code>, USB vía <code>libedgetpu1-std</code>/<code>libedgetpu1-max</code>, o ambos) ya no cae directamente en otra instalación fresca. En su lugar, ProxMenux detecta el setup existente y muestra un menú de acciones para que decidas qué hacer.",
|
||||
"imageAlt": "Menú de acciones de Coral con dos opciones — Reinstalar / actualizar drivers Coral, o Desinstalar drivers y configuración Coral — mostrado cuando el instalador detecta una instalación previa de Coral en el host",
|
||||
"imageCaption": "El menú de acciones solo aparece cuando al menos un componente de Coral está ya instalado (entrada DKMS de gasket, paquete <code>libedgetpu1-*</code> o nodos de dispositivo <code>/dev/apex_*</code> en vivo).",
|
||||
"intro": "Si detecta una instalación PCIe con <code>gasket-dkms</code>, USB con <code>libedgetpu1-std</code>/<code>libedgetpu1-max</code> o ambas, muestra un menú para elegir la acción.",
|
||||
"imageAlt": "Menú para reinstalar, actualizar o desinstalar Coral",
|
||||
"imageCaption": "El menú aparece si existe algún componente: un registro DKMS gasket, un paquete <code>libedgetpu1-*</code> o dispositivos <code>/dev/apex_*</code>.",
|
||||
"reinstallHeading": "Reinstalar / actualizar",
|
||||
"reinstallBody": "Continúa con el flujo normal de instalación — útil después de una actualización de kernel si la rebuild DKMS no ocurrió automáticamente, o para elevar el runtime a un <code>libedgetpu1-*</code> más nuevo del repo apt de Google Coral. Primero se limpia el estado DKMS anterior para que un paquete medio instalado de un intento previo fallido no bloquee el nuevo build.",
|
||||
"reinstallBody": "Ejecuta la instalación normal: recompila tras cambiar de kernel o actualiza <code>libedgetpu1-*</code> desde Google. Antes limpia el estado DKMS anterior para evitar que una instalación fallida bloquee la compilación.",
|
||||
"uninstallHeading": "Desinstalar — qué se elimina",
|
||||
"uninstallIntro": "Confirma con un diálogo sí/no antes de hacer nada (los contenedores LXC con passthrough de apex perderán acceso a <code>/dev/apex_*</code> después del siguiente reinicio — el aviso lo deja claro). Luego ejecuta un rollback completo e idempotente:",
|
||||
"uninstallIntro": "Requiere confirmación. Las apps LXC que usan <code>/dev/apex_*</code> pueden perder acceso durante la desinstalación o tras reiniciar. El proceso es:",
|
||||
"uninstallItems": [
|
||||
"Descarga los módulos de kernel <code>apex</code> y <code>gasket</code>.",
|
||||
"Quita cada entrada <code>gasket/<version></code> registrada en DKMS para que los módulos no vuelvan en la siguiente instalación de kernel.",
|
||||
"Purga los paquetes apt <code>gasket-dkms</code>, <code>libedgetpu1-std</code> y <code>libedgetpu1-max</code>, luego ejecuta <code>apt-get autoremove --purge</code>.",
|
||||
"Borra la regla udev <code>/etc/udev/rules.d/99-coral-apex.rules</code> que escribió ProxMenux; restaura el grupo de la regla upstream <code>60-gasket-dkms.rules</code> a su default si sigue presente.",
|
||||
"Elimina el grupo de sistema <code>apex</code> <strong>solo si ya no hay usuarios en él</strong> — si mapeaste un usuario custom a <code>apex</code> para un passthrough a LXC, el grupo se deja en su sitio y un aviso imprime los miembros actuales.",
|
||||
"Limpia la entrada del repositorio apt de Google Coral y el keyring (<code>/etc/apt/sources.list.d/coral-edgetpu.list</code> + <code>coral-edgetpu-archive-keyring.gpg</code>).",
|
||||
"Pide reiniciar al final <strong>solo si se instaló la ruta PCIe</strong> — la forma más limpia de descargar los módulos del kernel. Las desinstalaciones solo USB no lo necesitan."
|
||||
"Intenta descargar <code>apex</code> y <code>gasket</code>; si están en uso pueden permanecer cargados.",
|
||||
"Elimina cada entrada <code>gasket/<version></code> registrada en DKMS para que los módulos no vuelvan en la siguiente instalación de kernel.",
|
||||
"Purga <code>gasket-dkms</code>, <code>libedgetpu1-std</code> y <code>libedgetpu1-max</code> y ejecuta <code>apt-get autoremove --purge</code>.",
|
||||
"Elimina <code>/etc/udev/rules.d/99-coral-apex.rules</code> y restaura el grupo predeterminado de <code>60-gasket-dkms.rules</code> si aún existe.",
|
||||
"Consulta los miembros secundarios de <code>apex</code>. <strong>Si la lista está vacía</strong>, intenta eliminar el grupo; si no, conserva <code>apex</code> y muestra sus miembros. No comprueba por completo los usuarios que lo tienen como grupo principal.",
|
||||
"Elimina la lista del repositorio <code>/etc/apt/sources.list.d/coral-edgetpu.list</code>, la antigua <code>coral-cloud.list</code> y los llaveros antiguos llamados <code>coral-edgetpu-archive-keyring.gpg</code>. Este proceso no elimina el llavero actual <code>/etc/apt/keyrings/coral-edgetpu.gpg</code>.",
|
||||
"Ofrece reiniciar <strong>solo si estaba instalado PCIe</strong> para descargar los módulos que sigan activos. Desinstalar solo USB no requiere reinicio."
|
||||
],
|
||||
"lxcWarnTitle": "Contenedores LXC con passthrough de apex",
|
||||
"lxcWarnBody": "Desinstalar en el host invalida la ruta de dispositivo mapeada a cualquier contenedor LXC configurado para passthrough de apex. Planifica la operación en una ventana de mantenimiento si Frigate / DeepStack / cargas similares dependen de ello."
|
||||
"lxcWarnBody": "Desinstalar los componentes del host puede romper el acceso desde LXC. Planifica mantenimiento si aplicaciones compatibles como Frigate dependen de esta Coral."
|
||||
},
|
||||
"updates": {
|
||||
"heading": "Notificaciones de actualización",
|
||||
"intro": "ProxMenux ahora rastrea los componentes Coral instalados en su registro de instalaciones gestionadas. Ambas variantes se siguen de forma independiente — un host con dispositivos Coral M.2 y USB recibe dos streams de actualización, cada uno con su propia fuente upstream:",
|
||||
"heading": "Avisos de actualización",
|
||||
"intro": "ProxMenux registra los componentes Coral instalados y comprueba PCIe/M.2 y USB por separado. Si tienes ambos, cada variante usa su propia fuente de versiones:",
|
||||
"headerVariant": "Variante",
|
||||
"headerTracked": "Versión rastreada",
|
||||
"headerUpstream": "Fuente upstream",
|
||||
"headerTracked": "Versión registrada",
|
||||
"headerUpstream": "Fuente de versiones",
|
||||
"pcieVariant": "PCIe / M.2",
|
||||
"pcieTracked": "Versión Debian de <code>gasket-dkms</code> (o la versión registrada en DKMS si el paquete se quitó a la fuerza)",
|
||||
"pcieUpstream": "Último tag de <code>feranick/gasket-driver</code> en GitHub (caché de 7 días, comparación por número de build)",
|
||||
"pcieTracked": "Primero la etiqueta registrada tras instalar; después la versión de <code>gasket-dkms</code> si el paquete está bien; como alternativa, la versión DKMS. Esta última no identifica los parches del fork.",
|
||||
"pcieUpstream": "Última etiqueta de <code>feranick/gasket-driver</code> en GitHub; caché de siete días y comparación del número de compilación.",
|
||||
"usbVariant": "USB",
|
||||
"usbTracked": "Versión apt de <code>libedgetpu1-std</code> o <code>libedgetpu1-max</code>",
|
||||
"usbUpstream": "Candidato local de <code>apt-cache policy</code> (repo apt de Google Coral)",
|
||||
"outro": "Cuando se detecta una versión más nueva el Monitor dispara una notificación <code>coral_driver_update_available</code> en cada canal habilitado (Telegram, Discord, Gotify, ntfy, email, webhook). La notificación apunta de vuelta a la misma entrada del instalador — elige <strong>Reinstall / update</strong> del menú de acciones de arriba para aplicarla.",
|
||||
"antiTitle": "Anti-cascada por diseño",
|
||||
"antiBody": "Una notificación por variante, solo cuando la versión upstream cambia realmente — nunca en cada escaneo de 24h. Si ignoras una actualización no te vuelve a pingar hasta que llegue una release más nueva.",
|
||||
"rebootTitle": "El reinicio solo hace falta para la ruta PCIe",
|
||||
"rebootBody": "La rebuild DKMS de gasket carga nuevos módulos de kernel — eso necesita un reinicio para estar activo. La actualización del runtime USB es un swap de librería userspace, sin reinicio."
|
||||
"outro": "Si detecta una versión nueva, Monitor emite <code>coral_driver_update_available</code> por los canales habilitados. El aviso lleva al instalador: elige <strong>Reinstalar / actualizar</strong> para aplicarla.",
|
||||
"antiTitle": "Sin avisos repetidos",
|
||||
"antiBody": "Un aviso por variante cuando cambia la versión disponible. No lo repite en cada revisión diaria; vuelve a avisar cuando aparece una versión posterior.",
|
||||
"rebootTitle": "Actualizaciones PCIe: planifica un reinicio",
|
||||
"rebootBody": "El módulo PCIe recompilado debe cargarse para usarlo; reiniciar comprueba también su carga automática. Actualizar la biblioteca USB no requiere reiniciar el host, pero puede requerir reiniciar las apps que usaban la anterior."
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalente manual",
|
||||
"intro": "Si quieres saber qué pasa bajo el capó, o rehacer un paso individual a mano, los comandos crudos por ruta se ven así.",
|
||||
"intro": "Estos comandos muestran los pasos principales de cada ruta para consultarlos o ejecutarlos manualmente.",
|
||||
"pcieHeading": "PCIe / M.2 (gasket + apex vía DKMS)",
|
||||
"usbHeading": "USB (runtime libedgetpu)"
|
||||
},
|
||||
@@ -169,16 +169,16 @@
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"dkmsFailTitle": "La build DKMS falla después de una actualización de kernel",
|
||||
"dkmsFailBody": "Causa más común en PVE 9: el kernel en ejecución subió pero <code>proxmox-headers-$(uname -r)</code> aún no está instalado para él. Comprueba con <code>dpkg -l proxmox-headers-$(uname -r)</code>. Instala los headers que faltan y vuelve a ejecutar el script — el paso <code>cleanup_broken_gasket_dkms</code> de ProxMenux gestiona cualquier estado residual de paquete medio configurado.",
|
||||
"dkmsFailTitle": "Falla la compilación DKMS tras actualizar el kernel",
|
||||
"dkmsFailBody": "Una causa posible son cabeceras ausentes. Comprueba <code>proxmox-headers-$(uname -r)</code> con <code>dpkg -l proxmox-headers-$(uname -r)</code>. Instálalas si faltan y revisa incompatibilidades en el registro. Al repetir ejecuta <code>cleanup_broken_gasket_dkms</code>, pero limpiar no garantiza compatibilidad con cualquier kernel.",
|
||||
"apexMissTitle": "/dev/apex_0 no está después del reinicio",
|
||||
"apexMissBody": "El módulo no está cargado. Prueba <code>modprobe apex</code> a mano. Si eso da error, comprueba <code>dmesg | grep -iE \"apex|gasket\"</code> para el fallo real — culpables comunes son version mismatch del kernel (DKMS se construyó para un kernel distinto del que arrancaste) o una actualización de firmware que deshabilitó el slot PCIe en el que está la Coral.",
|
||||
"lxcMissTitle": "Puedo ver /dev/apex_0 pero el LXC no",
|
||||
"lxcMissBody": "El host está bien. El problema es la config de passthrough — consulta <lxcLink>Añadir Coral TPU a un LXC</lxcLink>.",
|
||||
"apexMissBody": "Comprueba la detección PCIe y que el módulo corresponda al kernel activo. Prueba <code>modprobe apex</code> y consulta <code>dmesg | grep -iE \"apex|gasket\"</code>. Fallos de compilación, carga o configuración de slot/firmware pueden impedir crear el dispositivo.",
|
||||
"lxcMissTitle": "El host ve /dev/apex_0, pero el LXC no",
|
||||
"lxcMissBody": "Ver el nodo no prueba que funcione. Verifica acceso en el host, montaje LXC, reglas cgroup y permisos de UID/GID. Consulta <lxcLink>Añadir Coral TPU a un LXC</lxcLink>.",
|
||||
"usbUnreachTitle": "USB Accelerator detectado pero Frigate / TFLite no llega a él",
|
||||
"usbUnreachBody": "Comprueba que las reglas udev que vienen con <code>libedgetpu1-std</code> surtieron efecto: <code>ls -l /dev/bus/usb/*/*</code>. El dispositivo NO debería ser propiedad de root:root con modo 0600 — si lo es, ejecuta <code>udevadm control --reload-rules && udevadm trigger</code> en el host, desenchufa la Coral USB, espera 3 segundos y vuelve a enchufarla.",
|
||||
"logTitle": "Log de instalación",
|
||||
"logBody": "Cada ejecución escribe en <code>/tmp/coral_install.log</code> en el host. Si la build DKMS muere, el script también añade las últimas 50 líneas de <code>/var/lib/dkms/gasket/1.0/build/make.log</code> a ese log — adjúntalo cuando pidas ayuda en GitHub."
|
||||
"usbUnreachBody": "Revisa las reglas de <code>libedgetpu1-std</code> y permisos con <code>ls -l /dev/bus/usb/*/*</code>. El UID/GID de la app debe tener lectura y escritura; ser propiedad de root no basta para diagnosticar el fallo. Tras cambiar reglas, ejecuta <code>udevadm control --reload-rules && udevadm trigger</code> y reconecta si hace falta.",
|
||||
"logTitle": "Registro de instalación",
|
||||
"logBody": "Cada ejecución escribe <code>/tmp/coral_install.log</code>. Si falla DKMS y existe el registro, añade sus últimas 50 líneas desde <code>/var/lib/dkms/gasket/1.0/build/make.log</code>. Adjunta el registro al pedir ayuda."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
@@ -186,7 +186,7 @@
|
||||
{
|
||||
"label": "Añadir Coral TPU a LXC",
|
||||
"href": "/docs/hardware/coral-tpu-lxc",
|
||||
"tail": " — pasar el dispositivo Coral del host a un contenedor (Frigate, CodeProject.AI…)."
|
||||
"tail": " — pasar Coral del host a un contenedor con una app compatible."
|
||||
},
|
||||
{
|
||||
"label": "Instalar drivers NVIDIA (Host)",
|
||||
@@ -196,7 +196,7 @@
|
||||
{
|
||||
"label": "ProxMenux Monitor — pestaña Hardware",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — el modal de Coral que muestra driver, módulos, nodos de dispositivo, estado del runtime y temperatura en vivo una vez hecha la instalación en el host."
|
||||
"tail": " — el panel Coral muestra controlador, módulos, dispositivos y runtime; también temperatura si hay un sensor compatible."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,146 +1,146 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Instalar drivers NVIDIA en el host | ProxMenux Documentation",
|
||||
"description": "Instala y configura los drivers propietarios NVIDIA en un host Proxmox VE usando ProxMenux. Cubre filtrado por GPU, validación DKMS, servicio de persistencia, parche NVENC opcional y propagación automática a LXC."
|
||||
"title": "Instalar NVIDIA en el host | Documentación de ProxMenux",
|
||||
"description": "Instala controladores propietarios NVIDIA en Proxmox VE con ProxMenux: filtrado por GPU, comprobaciones de compilación y DKMS, persistencia, parche NVENC opcional y actualización de bibliotecas en LXC."
|
||||
},
|
||||
"header": {
|
||||
"title": "Instalar drivers NVIDIA en el host",
|
||||
"description": "Instala el driver propietario NVIDIA en un host Proxmox VE usando ProxMenux. El instalador filtra las ramas mantenidas por el PCI ID de la GPU, valida la versión elegida mediante DKMS, gestiona nouveau, instala el servicio de persistencia y puede propagar el driver a contenedores LXC con passthrough NVIDIA.",
|
||||
"section": "Hardware: GPUs y Coral-TPU"
|
||||
"description": "Instala NVIDIA en el host Proxmox VE. Filtra las ramas mantenidas según el ID PCI de la GPU, comprueba la compilación, usa DKMS, gestiona nouveau e instala persistencia. También puede actualizar bibliotecas de LXC con acceso NVIDIA.",
|
||||
"section": "Hardware: GPU y Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace esto",
|
||||
"body": "ProxMenux automatiza todo el ciclo de vida del driver NVIDIA en el host: detecta tu GPU, ofrece ramas mantenidas por NVIDIA que incluyen su PCI Device ID, pone <code>nouveau</code> en blacklist, descarga y ejecuta el instalador oficial <code>.run</code> con DKMS, instala <code>nvidia-persistenced</code> y las reglas udev, y ofrece aplicar el parche NVENC opcional. La compilación DKMS es la validación final frente al kernel en ejecución. Si ya tienes contenedores LXC con passthrough NVIDIA, puede actualizar sus librerías de espacio de usuario para que coincidan con el host."
|
||||
"title": "Qué hace",
|
||||
"body": "Detecta la GPU y ofrece ramas mantenidas que incluyen su ID PCI. Bloquea <code>nouveau</code>, descarga el instalador oficial <code>.run</code>, usa DKMS, instala <code>nvidia-persistenced</code>, reglas udev y NVIDIA Container Toolkit, con parche NVENC opcional. Las comprobaciones de compilación evalúan el kernel actual; compilar no garantiza que todas las apps funcionen. Ofrece actualizar las bibliotecas de los LXC NVIDIA existentes, con la misma versión salvo en Arch."
|
||||
},
|
||||
"who": {
|
||||
"heading": "¿Para quién es esto?",
|
||||
"body": "Si tienes una GPU NVIDIA y quieres usarla para transcoding acelerado por hardware en Plex, Jellyfin, Frigate, Immich, Stable Diffusion o cualquier otra app corriendo <strong>dentro de un contenedor LXC</strong>, necesitas instalar el driver en el <em>host</em> Proxmox primero. Esta página cubre esa instalación en el lado del host. Pasar la GPU a una <strong>máquina virtual (VM)</strong> usa un flujo distinto (passthrough VFIO) y se documenta aparte."
|
||||
"body": "Para vídeo o cálculo acelerado en Plex, Jellyfin, Frigate, Immich o Stable Diffusion <strong>dentro de LXC</strong>, instala primero NVIDIA en el <em>host</em> Proxmox. Asignar la GPU directamente a una <strong>VM</strong> usa el procedimiento VFIO."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de empezar",
|
||||
"gpu": "<strong>Una GPU NVIDIA</strong> instalada físicamente en el host. El script la autodetecta; las GPUs AMD e Intel no se gestionan aquí.",
|
||||
"gpu": "<strong>Una GPU NVIDIA</strong> instalada en el host. Se detecta automáticamente; esta opción no gestiona AMD ni Intel.",
|
||||
"gpuCheck": "lspci | grep -i nvidia",
|
||||
"notVm": "La GPU <strong>no está asignada actualmente a una VM vía passthrough VFIO</strong>. Si lo está, el script se negará a instalar el driver del host para evitar romper la config de passthrough.",
|
||||
"notVm": "La GPU <strong>no debe estar reservada para VM mediante VFIO</strong>. El instalador rechaza esa situación para evitar interferir en la asignación.",
|
||||
"internet": "Acceso a internet en el host. El instalador descarga el driver desde <code>download.nvidia.com</code> y, opcionalmente, clona <code>nvidia-persistenced</code> y <code>nvidia-patch</code> desde GitHub.",
|
||||
"space": "Algo de espacio libre en <code>/opt/nvidia</code> para el instalador <code>.run</code> más la RAM usada durante el build. Al propagar a LXCs con distros no-Arch, cada contenedor necesita al menos 1.5 GB libres; ProxMenux eleva temporalmente la RAM del contenedor a 2 GB y la restaura al terminar. Se necesita reiniciar al final de la instalación del host."
|
||||
"space": "Reserva espacio en <code>/opt/nvidia</code> para <code>.run</code> y RAM para compilar. La actualización LXC no-Arch comprueba 1500 MiB libres y puede solicitar subir temporalmente a 2048 MiB de RAM si tiene menos; después restaura el límite anterior. Planifica el reinicio del host."
|
||||
},
|
||||
"vmWarn": {
|
||||
"title": "¿GPU asignada a una VM? Para aquí",
|
||||
"body": "Si la GPU está actualmente vinculada a <code>vfio-pci</code> (es decir, se está pasando a una VM), instalar el driver del host puede romper el passthrough y desestabilizar el sistema. ProxMenux detecta esto y aborta. Quita la GPU de la configuración de passthrough de la VM y reinicia antes de ejecutar este script."
|
||||
"title": "¿GPU reservada para VM? Detente aquí",
|
||||
"body": "Si algún dispositivo NVIDIA está vinculado a <code>vfio-pci</code>, el instalador sale aunque la VM esté parada. Estar reservado no implica que una VM lo esté usando. Planifica el regreso al controlador del host y retira asignaciones VM y VFIO obsoletas antes de reiniciar e instalar."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Ejecutar el instalador",
|
||||
"body": "Abre ProxMenux en el host, ve a <strong>Hardware Graphics → NVIDIA GPU Driver Installer</strong>. Lo que verás depende de si ya hay un driver presente.",
|
||||
"imageAlt": "Menú Hardware Graphics con la entrada NVIDIA GPU Driver Installer resaltada"
|
||||
"body": "Abre <strong>Hardware Graphics → NVIDIA GPU Driver Installer</strong> en ProxMenux. El menú depende de si ya hay un controlador activo.",
|
||||
"imageAlt": "Menú de hardware con el instalador NVIDIA resaltado"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "El instalador pasa por tres fases con separación clara entre \"recopilar información y validar\" y \"tocar realmente el host\". Hasta la confirmación final, no se ha cambiado nada."
|
||||
"heading": "Cómo funciona el script",
|
||||
"body": "Detecta dispositivos, elige versión e instala. Antes del resumen puede ofrecer limpiar VFIO antiguo con confirmación propia. La preparación de repositorios/cabeceras y la descarga preceden a sustituir el controlador; no todos los cambios empiezan tras una única confirmación final."
|
||||
},
|
||||
"walkthrough": {
|
||||
"detect": {
|
||||
"title": "Detección de GPU y resumen",
|
||||
"body1": "El script escanea el bus PCI y muestra cada controladora de vídeo NVIDIA que encuentra, el estado actual del driver (o <em>\"No NVIDIA driver installed\"</em>) y cualquier contenedor LXC que ya tenga passthrough NVIDIA configurado (versión del driver dentro de cada uno).",
|
||||
"body2": "Revisa el resumen cuidadosamente. Si la GPU detectada no es la que esperas, o si la versión de un contenedor ya coincide con la del host, puedes cancelar aquí sin efectos secundarios.",
|
||||
"imageAlt": "Resumen previo a la instalación mostrando las GPUs detectadas, el estado actual del driver y los contenedores LXC con passthrough NVIDIA"
|
||||
"body1": "Muestra las controladoras de vídeo NVIDIA, el estado del controlador o <em>«No NVIDIA driver installed»</em> y los LXC con acceso NVIDIA configurado, con su versión interna.",
|
||||
"body2": "Revisa GPU y versiones del host y contenedores. Cancela en el resumen si algo no coincide con lo esperado; una limpieza VFIO confirmada antes ya se habrá aplicado.",
|
||||
"imageAlt": "Resumen previo con GPU, controlador y LXC configurados para NVIDIA"
|
||||
},
|
||||
"version": {
|
||||
"title": "Elegir la versión del driver",
|
||||
"body1": "ProxMenux obtiene la lista de drivers disponibles de NVIDIA y acota el selector a las versiones que <strong>listan el PCI Device ID de tu GPU en la tabla de chips soportados</strong> de la rama correspondiente en <code>nvidia.com</code>. Una serie de heurísticas descartan además las builds developer / beta del CDN que aparecerían al principio. La primera entrada se etiqueta como <em><versión> — Recommended</em>: prefiere la cabeza de la rama del driver ya instalado en el host (bugfix in place), en su defecto la cabeza de la Production Branch actual, y en último caso el número más alto entre los filtrados.",
|
||||
"body2": "Si el driver actualmente instalado fue parcheado con keylase (NVENC), el selector se acota automáticamente a versiones aún cubiertas por la tabla de parches, para que aplicar <em>Reinstalar / actualizar</em> sin perder el parche sea un click.",
|
||||
"body1": "Filtra las versiones de <code>nvidia.com</code> que <strong>incluyen el ID PCI de la GPU en la tabla de chips compatibles</strong> y descarta versiones beta/desarrollo mediante heurísticas. <em><versión> — Recomendada</em> prioriza la última de la rama instalada; después Production Branch y, por último, la versión compatible de número más alto.",
|
||||
"body2": "Si consta como parcheado por keylase, el selector limita las versiones a la tabla NVENC. <em>Reinstalar / actualizar</em> mantiene las confirmaciones y la opción de parche; comprueba el resultado final.",
|
||||
"whyTitle": "Cómo se valida la compatibilidad con el kernel",
|
||||
"whyBody": "La lista se filtra por el mantenimiento de la rama NVIDIA y el soporte del PCI ID de la GPU, no mediante una matriz fija de kernel y driver. Después de elegir, DKMS compila el módulo contra el kernel en ejecución. Si la compilación falla, la instalación no se considera válida; elige otra rama mantenida si NVIDIA todavía no ha adaptado esa versión a tu kernel.",
|
||||
"imageAlt": "Selector de versiones con ramas NVIDIA compatibles con la GPU y la opción recomendada en primer lugar"
|
||||
"whyBody": "Filtra por ramas mantenidas e ID PCI, sin una matriz fija de kernel/controlador. Una prueba previa intenta compilar para el kernel actual. Si confirma incompatibilidad, vuelve al selector; si no puede comprobarla, puede avisar y continuar. La instalación y las pruebas de funcionamiento siguen siendo necesarias.",
|
||||
"imageAlt": "Selector de ramas compatibles con la GPU y recomendación al principio"
|
||||
},
|
||||
"uninstall": {
|
||||
"title": "Desinstalación limpia (solo si reinstalas)",
|
||||
"body": "Si ya hay un driver presente y elegiste una versión distinta, ProxMenux para los servicios NVIDIA, descarga los módulos de kernel, quita las entradas DKMS y purga los paquetes <code>nvidia-*</code> / <code>libnvidia-*</code> / <code>cuda-*</code> antes de tocar el nuevo instalador. Esto evita el clásico desastre de versiones mezcladas."
|
||||
"title": "Retirar el controlador anterior al reinstalar",
|
||||
"body": "Tras descargar y comprobar el instalador elegido, retira el controlador anterior antes de sustituirlo. Detiene servicios NVIDIA, descarga módulos, elimina entradas DKMS y purga <code>nvidia-*</code> / <code>libnvidia-*</code> / <code>cuda-*</code>. También se aplica al reinstalar la misma versión con confirmación."
|
||||
},
|
||||
"prepare": {
|
||||
"title": "Preparar el sistema",
|
||||
"body": "Tras una única confirmación, el script:",
|
||||
"body": "Durante la preparación, el script:",
|
||||
"items": [
|
||||
"Comprueba los repositorios del host antes de eliminar o instalar nada: en un host sin suscripción activa y solo con el repositorio Enterprise se pregunta antes de cambiar a sin suscripción, y la instalación se detiene cuando el cambio se rechaza.",
|
||||
"Comprueba repositorios antes de eliminar o instalar componentes. Si no hay suscripción y solo está Enterprise, pide permiso para usar no-subscription; si rechazas el cambio, detiene la instalación.",
|
||||
"Instala <code>pve-headers-$(uname -r)</code> (o <code>proxmox-headers-$(uname -r)</code>), <code>build-essential</code> y <code>dkms</code>.",
|
||||
"Crea el archivo propiedad de ProxMenux <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code> con <code>blacklist nouveau</code> y <code>options nouveau modeset=0</code>, registra si añadió la línea complementaria a <code>blacklist.conf</code> e intenta descargar el módulo inmediatamente.",
|
||||
"Crea <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code>, gestionado por ProxMenux, con <code>blacklist nouveau</code> y <code>options nouveau modeset=0</code>. Registra si añadió la línea complementaria a <code>blacklist.conf</code> e intenta descargar nouveau.",
|
||||
"Escribe <code>/etc/modules-load.d/nvidia-vfio.conf</code> con <code>nvidia</code> y <code>nvidia_uvm</code> para que los módulos se carguen pronto en el arranque."
|
||||
]
|
||||
},
|
||||
"download": {
|
||||
"title": "Descargar y ejecutar el instalador NVIDIA",
|
||||
"body": "El instalador descarga el archivo <code>NVIDIA-Linux-x86_64-<version>.run</code> en <code>/opt/nvidia</code>, lo valida (tamaño + firma de ejecutable, no solo HTTP 200), y luego lo ejecuta con DKMS para que el módulo de kernel se reconstruya automáticamente con las actualizaciones de kernel.",
|
||||
"imageAlt": "Progreso de descarga seguido del instalador NVIDIA ejecutando su build DKMS"
|
||||
"body": "Descarga <code>NVIDIA-Linux-x86_64-<version>.run</code> a <code>/opt/nvidia</code> y comprueba tamaño y tipo ejecutable. Son comprobaciones de formato, no de firma criptográfica. Registra DKMS para recompilar al cambiar el kernel; sigue necesitando fuentes y kernel compatibles.",
|
||||
"imageAlt": "Progreso de descarga y compilación DKMS del instalador NVIDIA"
|
||||
},
|
||||
"persist": {
|
||||
"title": "Servicio de persistencia y reglas udev",
|
||||
"body": "ProxMenux luego instala <persistLink>nvidia-persistenced</persistLink> y escribe reglas udev en <code>/etc/udev/rules.d/70-nvidia.rules</code> para que los nodos de dispositivo <code>/dev/nvidia*</code> aparezcan de forma fiable en el arranque. Sin esto, el passthrough LXC puede tener carreras al arranque del contenedor y acabar con un contenedor que no ve la GPU."
|
||||
"body": "Instala <persistLink>nvidia-persistenced</persistLink> y escribe <code>/etc/udev/rules.d/70-nvidia.rules</code> para crear dispositivos <code>/dev/nvidia*</code> al arrancar. Así evita que un LXC intente acceder a la GPU antes de que existan los dispositivos."
|
||||
},
|
||||
"nvenc": {
|
||||
"title": "Opcional: aplicar el parche NVENC",
|
||||
"body": "Las GPUs NVIDIA de consumo (línea GeForce) limitan el número de sesiones simultáneas de codificación NVENC. El <patchLink>keylase/nvidia-patch</patchLink> de la comunidad elimina esa restricción. Si planeas usar la GPU para Plex / Jellyfin / Frigate con muchos streams concurrentes, responde <strong>Sí</strong> cuando se pregunte.",
|
||||
"supportTitle": "Comprueba el soporte del parche para tu driver",
|
||||
"supportBody": "El parche no cubre todas las versiones de driver. Antes de depender de él en producción, verifica que tu versión esté listada en la <patchTableLink>tabla de parches</patchTableLink>. Si aún no está soportada, elige un driver cercano más antiguo que sí lo esté."
|
||||
"body": "El límite de sesiones NVENC depende de GPU y controlador. <patchLink>keylase/nvidia-patch</patchLink> puede retirar el límite del controlador en versiones compatibles. Elige <strong>Sí</strong> si necesitas ese cambio de codificación y tu versión está soportada. No acelera la decodificación ni elimina los límites físicos.",
|
||||
"supportTitle": "Comprobar compatibilidad del parche",
|
||||
"supportBody": "Busca la versión exacta en la <patchTableLink>tabla de parches</patchTableLink>. Si falta, usa el controlador sin parche o elige otra versión mantenida compatible con GPU, kernel y parche; no elijas una anterior solo por estar cerca en la lista."
|
||||
},
|
||||
"propagate": {
|
||||
"title": "Opcional: propagar el driver a los contenedores LXC",
|
||||
"body1": "Si la pantalla de resumen listó contenedores con passthrough NVIDIA, ProxMenux ahora se ofrece a actualizar las librerías userspace dentro de cada uno para que coincidan con el host. El módulo de kernel del host y el userspace del contenedor <strong>deben ser exactamente la misma versión</strong> — si no <code>nvidia-smi</code> dentro del contenedor fallará con un error \"version mismatch\".",
|
||||
"body2": "La actualización es consciente de la distro. Para Debian / Ubuntu y otras distros glibc, el mismo instalador <code>.run</code> (con <code>--no-kernel-modules --no-dkms --no-install-compat32-libs</code>) se copia al contenedor y se ejecuta; la RAM del contenedor se eleva temporalmente a 2 GB si es menor y se restaura al terminar. Para <strong>Arch, Manjaro y EndeavourOS</strong> la actualización es un <code>pacman -Syu nvidia-utils</code> pineado a la rama del driver del host. <strong>Alpine</strong> usa un camino distinto — se extrae el <code>.run</code> en el host, solo las librerías userspace se empaquetan como tarball y se envían con <code>pct push</code>, luego se instalan los shims <code>gcompat</code> + <code>binutils</code> vía <code>apk</code> y se recrean los symlinks SONAME con <code>readelf</code> para que las librerías glibc-linked carguen correctamente sobre musl.",
|
||||
"imageAlt": "Prompt listando los LXCs con passthrough NVIDIA y la versión actual del driver, con Sí/No para actualizarlos todos"
|
||||
"title": "Opcional: actualizar bibliotecas NVIDIA en LXC",
|
||||
"body1": "Ofrece actualizar las bibliotecas del controlador en los LXC detectados. Estas y el módulo del host <strong>deben tener versiones coincidentes</strong>; si no, <code>nvidia-smi</code> puede mostrar «version mismatch».",
|
||||
"body2": "Debian / Ubuntu y otros contenedores glibc reciben el instalador <code>.run</code> extraído con <code>--no-kernel-modules --no-dkms --no-install-compat32-libs</code>; puede aumentar temporalmente la RAM a 2 GiB y luego restaurarla. <strong>Arch, Manjaro y EndeavourOS</strong> usan <code>pacman -Syu nvidia-utils</code> de sus repositorios, sin fijar la versión del host: comprueba el resultado. <strong>Alpine</strong> recibe el contenido <code>.run</code> extraído mediante <code>pct push</code>, instala <code>gcompat</code> y <code>binutils</code> con <code>apk</code> y crea enlaces SONAME con <code>readelf</code>. Verifica el funcionamiento: la compatibilidad glibc no garantiza todas las bibliotecas sobre musl.",
|
||||
"imageAlt": "Diálogo con los LXC NVIDIA y su versión para confirmar la actualización"
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Reiniciar",
|
||||
"body": "Finalmente, el script reconstruye <code>initramfs</code> para todos los kernels y ofrece reiniciar. Reiniciar <strong>es obligatorio</strong>: el blacklist de nouveau y el nuevo módulo de kernel solo surten efecto tras el reinicio."
|
||||
"body": "Tras instalar el controlador, regenera <code>initramfs</code> para todos los kernels; el último paso ofrece reiniciar. <strong>Planifica ese reinicio</strong> para verificar módulos y bloqueo de nouveau en un arranque limpio, aunque el controlador ya responda antes."
|
||||
}
|
||||
},
|
||||
"reinstallUninstall": {
|
||||
"heading": "Reinstalar o desinstalar",
|
||||
"intro": "Cuando el instalador detecta que el módulo de kernel <code>nvidia</code> está cargado actualmente y <code>nvidia-smi</code> devuelve una versión, no reinstala silenciosamente encima. En lugar de eso muestra un menú de acciones para que elijas qué hacer. (Los binarios presentes en disco pero el módulo no cargado no cuentan como instalados — el módulo tiene que estar activo.)",
|
||||
"intro": "Si el módulo <code>nvidia</code> está cargado y <code>nvidia-smi</code> devuelve una versión, muestra un menú de acciones. Este criterio detecta un controlador activo; puede haber archivos instalados aunque el módulo no esté cargado.",
|
||||
"imageAlt": "Menú de acciones NVIDIA ofrecido cuando ya hay un driver instalado — dos opciones: Reinstalar / actualizar driver, o Desinstalar el driver NVIDIA completamente",
|
||||
"imageCaption": "El menú de acciones solo aparece cuando hay un driver NVIDIA activo actualmente en el host.",
|
||||
"reinstallHeading": "Reinstalar / actualizar",
|
||||
"reinstallBody": "Continúa con el flujo normal de instalación pero, antes de descargar nada, ejecuta una eliminación limpia del driver actual (apt purge + entradas DKMS eliminadas + módulos residuales descargados). Es la ruta segura para aplicar una versión más nueva de la misma rama, elegir otra rama mantenida cuando sea necesario o recuperarse de un estado incompleto. Al final vuelven a mostrarse las opciones de propagación LXC y del parche NVENC.",
|
||||
"reinstallBody": "Elige versión, prepara repositorios/cabeceras, descarga y prueba la compilación antes de retirar el controlador anterior e instalar el nuevo. Permite actualizar dentro de una rama mantenida o elegir otra compatible. Después vuelven las opciones de bibliotecas LXC y parche NVENC.",
|
||||
"uninstallHeading": "Desinstalar — qué se elimina",
|
||||
"uninstallIntro": "Confirma primero con un diálogo sí/no. Luego ejecuta un rollback completo e idempotente:",
|
||||
"uninstallIntro": "Tras confirmar con Sí/No, desinstala estos componentes:",
|
||||
"uninstallItems": [
|
||||
"Ejecuta primero <code>nvidia-uninstall --silent</code> (el reverso del instalador <code>.run</code>), luego para y deshabilita <code>nvidia-persistenced</code> y <code>nvidia-powerd</code>, y descarga los módulos de kernel (<code>nvidia_uvm</code>, <code>nvidia_drm</code>, <code>nvidia_modeset</code>, <code>nvidia</code>) — cualquier contenedor LXC con passthrough NVIDIA será cortado limpiamente.",
|
||||
"Ejecuta <code>apt purge</code> sobre <code>nvidia-*</code>, <code>libnvidia-*</code>, <code>cuda-*</code> y <code>libcudnn*</code>, quita el árbol fuente DKMS y la caché del instalador .run de <code>/opt/nvidia</code>.",
|
||||
"Quita la configuración de carga de módulos (<code>/etc/modules-load.d/nvidia-vfio.conf</code>) y las entradas de blacklist de nouveau creadas por ProxMenux. También migra y elimina los archivos antiguos de ProxMenux con las dos líneas conocidas; conserva los archivos modificados o ajenos del administrador.",
|
||||
"Quita las reglas udev (<code>/etc/udev/rules.d/70-nvidia.rules</code>) y limpia el estado del parche NVENC (un campo del registro de instalaciones gestionadas de ProxMenux, marcado como <em>removed</em> — no hay fichero aparte que borrar).",
|
||||
"Reconstruye <code>initramfs</code> para todos los kernels, ejecuta <code>proxmox-boot-tool refresh</code> en hosts con systemd-boot, y pide reiniciar para finalizar."
|
||||
"Detiene y desactiva <code>nvidia-persistenced</code> y <code>nvidia-powerd</code>, intenta descargar <code>nvidia_uvm</code>, <code>nvidia_drm</code>, <code>nvidia_modeset</code> y <code>nvidia</code> y después ejecuta <code>nvidia-uninstall --silent</code> para la instalación <code>.run</code>. Afecta a las apps LXC que usan NVIDIA; clientes activos pueden impedir la descarga.",
|
||||
"Ejecuta <code>apt purge</code> sobre <code>nvidia-*</code>, <code>libnvidia-*</code>, <code>cuda-*</code> y <code>libcudnn*</code>, elimina el árbol fuente DKMS y las carpetas <code>nvidia-persistenced</code> y <code>nvidia-patch</code> de <code>/opt/nvidia</code>.",
|
||||
"Elimina la configuración de carga de módulos (<code>/etc/modules-load.d/nvidia-vfio.conf</code>) y las entradas de blacklist de nouveau creadas por ProxMenux. También migra y elimina los archivos antiguos de ProxMenux con las dos líneas conocidas; conserva los archivos modificados o ajenos del administrador.",
|
||||
"Retira <code>/etc/udev/rules.d/70-nvidia.rules</code> y marca el estado NVENC como <em>removed</em> en el registro de instalaciones gestionadas; no hay un archivo de estado separado.",
|
||||
"Regenera <code>initramfs</code> para todos los kernels, ejecuta <code>proxmox-boot-tool refresh</code> según la configuración de arranque y solicita reiniciar."
|
||||
],
|
||||
"lxcWarnTitle": "Contenedores LXC con passthrough NVIDIA",
|
||||
"lxcWarnBody": "Quitar el driver del host invalida las rutas de dispositivo y las librerías CUDA mapeadas a cualquier LXC con passthrough NVIDIA. Planifica la operación en una ventana de mantenimiento si Frigate / Plex / Jellyfin / Ollama (o cualquier otra cosa) depende de ello."
|
||||
"lxcWarnTitle": "LXC con acceso a NVIDIA",
|
||||
"lxcWarnBody": "Retirar el controlador del host interrumpe las apps LXC que usan NVIDIA, aunque conserven sus bibliotecas. Programa mantenimiento para Frigate, Plex, Jellyfin, Ollama y otras apps que dependan de la GPU."
|
||||
},
|
||||
"updates": {
|
||||
"heading": "Notificaciones de actualización",
|
||||
"heading": "Avisos de actualizaciones",
|
||||
"body": "El driver NVIDIA instalado se rastrea en el registro de instalaciones gestionadas de ProxMenux. En el arranque y cada 24 horas, el Monitor compara el listado de <code>download.nvidia.com/XFree86/Linux-x86_64/</code> con la versión que devuelve <code>nvidia-smi</code> y solo avisa cuando existe una versión de mantenimiento más nueva en la rama instalada.",
|
||||
"kindsHeading": "Mensaje de actualización",
|
||||
"kindsItems": [
|
||||
"<strong>Mantenimiento de la misma rama.</strong> Una versión más reciente dentro de la rama instalada (por ejemplo, 580.65.06 instalada → 580.105.08 disponible). El Monitor no deduce compatibilidad entre ramas y kernels."
|
||||
"<strong>Mantenimiento dentro de la rama.</strong> Por ejemplo, 580.65.06 instalada → 580.105.08 disponible. Monitor no deduce compatibilidad de kernel entre ramas."
|
||||
],
|
||||
"antiTitle": "Anti-cascada por diseño",
|
||||
"antiBody": "Una notificación por cada versión nueva distinta, nunca en cada comprobación de 24 horas. Si no hay una versión más reciente en la rama instalada, el seguimiento permanece silencioso.",
|
||||
"antiTitle": "Evitar avisos repetidos",
|
||||
"antiBody": "Un aviso por cada versión nueva, no en cada comprobación diaria. Si no hay una más reciente en la rama instalada, no notifica.",
|
||||
"applyTitle": "Aplicar la actualización",
|
||||
"applyBody": "El Monitor no autoaplica actualizaciones de driver — reinstalar el driver NVIDIA siempre necesita un reinicio. Abre la misma entrada del instalador descrita arriba, elige <strong>Reinstall / update</strong> y la nueva versión se descarga, el módulo DKMS se reconstruye contra el kernel en ejecución y se pide el reinicio al final."
|
||||
"applyBody": "Monitor avisa sin instalar automáticamente. Abre el instalador, elige <strong>Reinstalar / actualizar</strong> y una versión compatible, y completa compilación e instalación. Termina con una solicitud de reinicio; planifícalo y verifica después host y bibliotecas LXC."
|
||||
},
|
||||
"verify": {
|
||||
"heading": "Verificar la instalación",
|
||||
"intro": "Una vez el host esté arriba de nuevo, entra por SSH o por la shell de Proxmox y ejecuta:",
|
||||
"after": "Deberías ver tu GPU listada, la versión del driver en el borde superior y ningún proceso aún (nada está usando la GPU en este punto). Luego comprueba el servicio de persistencia:",
|
||||
"intro": "Tras reiniciar el host, entra por SSH o desde la consola Proxmox y ejecuta:",
|
||||
"after": "Comprueba que aparecen la GPU y la versión esperada. Puede haber procesos si servicios del host o contenedores arrancados automáticamente ya usan la GPU. Después comprueba la persistencia:",
|
||||
"imageAlt": "Salida de nvidia-smi en el host mostrando la GPU detectada y la versión del driver instalada"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"smiFailTitle": "`nvidia-smi` dice 'NVIDIA-SMI has failed'",
|
||||
"smiFailBody": "Casi siempre se debe a que <strong>nouveau</strong> sigue cargado o a que las <strong>cabeceras no coinciden con el kernel</strong>. Tras reiniciar, ejecuta <code>lsmod | grep nouveau</code>. Si devuelve algo, comprueba <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code>, reconstruye initramfs con <code>update-initramfs -u -k all</code> y reinicia. Si nouveau no aparece, revisa <code>dmesg | grep -i nvidia</code>; los errores de DKMS suelen indicar que faltan las cabeceras del kernel en ejecución.",
|
||||
"smiFailTitle": "nvidia-smi muestra «NVIDIA-SMI has failed»",
|
||||
"smiFailBody": "Puede deberse a <strong>nouveau</strong>, <strong>cabeceras ausentes o incompatibles</strong>, fuentes del controlador incompatibles u otros errores de carga. Revisa <code>lsmod | grep nouveau</code>, <code>dmesg | grep -i nvidia</code> y los registros del instalador/DKMS. Si hay que corregir nouveau, revisa <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code> antes de <code>update-initramfs -u -k all</code> y reiniciar. No todo fallo de compilación es de cabeceras.",
|
||||
"lxcMissTitle": "El contenedor LXC no ve la GPU tras actualizar el host",
|
||||
"lxcMissBody": "Las librerías userspace del contenedor están atascadas en la versión anterior del driver. O vuelves a ejecutar el instalador NVIDIA y aceptas el prompt de propagación LXC, o instalas la misma versión del driver manualmente dentro del contenedor con <code>--no-kernel-modules</code>.",
|
||||
"lxcMissBody": "Revisa dispositivos del host, permisos LXC y versión de bibliotecas antes de reinstalar. Si no coinciden, instala el controlador de usuario correspondiente mediante el método compatible con la distribución; en glibc usa <code>--no-kernel-modules</code>. Reinstalar bibliotecas no corrige montajes o permisos ausentes.",
|
||||
"logTitle": "Revisa el log de instalación",
|
||||
"logBody": "Cada instalación escribe en <code>/tmp/nvidia_install.log</code>. Si algo falla silenciosamente, ese archivo tiene la salida completa (descargas, build DKMS, instalaciones de servicio). Adjúntalo cuando reportes issues en GitHub."
|
||||
"logBody": "La instalación escribe en <code>/tmp/nvidia_install.log</code>. Revisa descargas, compilación DKMS y servicios si falla. Adjunta el registro al comunicar el problema en GitHub."
|
||||
},
|
||||
"manualSteps": {
|
||||
"heading": "¿Buscas los pasos manuales?",
|
||||
"body": "La guía original de la comunidad — instalar todo a mano con <code>wget</code> y <code>./NVIDIA-Linux-...run</code> — sigue disponible como referencia en <guideLink>Guides → NVIDIA</guideLink>. Es útil si quieres entender cada comando que ejecuta el instalador de ProxMenux, o si estás depurando un setup inusual. Para instalaciones del día a día, usa ProxMenux — es la ruta que sigue recibiendo fixes (compatibilidad de kernel, propagación a LXC, comprobaciones de seguridad VFIO)."
|
||||
"body": "Consulta <guideLink>Guías → NVIDIA</guideLink> para los pasos manuales, incluidos <code>wget</code> y <code>./NVIDIA-Linux-...run</code>. Explica los componentes, pero no reproduce exactamente el instalador. El proceso mantenido de ProxMenux añade filtrado GPU, comprobación de compilación, actualizaciones LXC y controles VFIO."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
@@ -148,25 +148,25 @@
|
||||
{
|
||||
"label": "Añadir GPU a VM (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — pasar la GPU NVIDIA a una VM (modelo de binding distinto al de LXC)."
|
||||
"tail": " — asignar NVIDIA directamente a una VM mediante VFIO."
|
||||
},
|
||||
{
|
||||
"label": "Añadir GPU a LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — compartir la GPU NVIDIA con uno o más contenedores."
|
||||
"tail": " — compartir NVIDIA con uno o varios contenedores."
|
||||
},
|
||||
{
|
||||
"label": "Switch GPU Mode (VM ↔ LXC)",
|
||||
"label": "Cambiar modo GPU (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — alternar la misma GPU entre modos passthrough (VM) y compartido (LXC)."
|
||||
"tail": " — alternar entre acceso directo a VM y uso compartido en LXC."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor — pestaña Hardware",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — el modal de GPU que dispara este instalador en un click, más monitorización en vivo una vez hecho."
|
||||
"tail": " — ventana GPU que abre este instalador y muestra estadísticas en tiempo real."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de GPU Passthrough",
|
||||
"label": "Comandos de asignación directa de GPU",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — referencia de lspci / dmesg / IOMMU / nvidia-smi."
|
||||
}
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Switch GPU Mode (VM ↔ LXC) | ProxMenux Documentation",
|
||||
"description": "Mueve una GPU ya asignada entre modo VM (vfio-pci) y modo LXC (driver nativo) en un host Proxmox. ProxMenux detecta el binding actual, pide políticas de conflicto por workload, gestiona la limpieza de audio huérfano y reconstruye initramfs solo cuando hace falta."
|
||||
"title": "Cambiar modo GPU (VM ↔ LXC) | Documentación de ProxMenux",
|
||||
"description": "Cambia una GPU entre VFIO para VM y controlador nativo para LXC. ProxMenux detecta el controlador, pregunta cómo resolver asignaciones en conflicto, retira audio asociado y regenera initramfs si cambia la configuración del host."
|
||||
},
|
||||
"header": {
|
||||
"title": "Switch GPU Mode (VM ↔ LXC)",
|
||||
"description": "Reasigna una GPU que ya está en uso — cambia de passthrough a VM a compartición con LXC o al revés. ProxMenux gestiona todos los cambios de binding del lado del host (vfio.conf, blacklist de drivers, módulos, initramfs) y ofrece una política limpia para cada VM o LXC que use la GPU actualmente, para que el cambio no deje config rota detrás.",
|
||||
"section": "Hardware: GPUs y Coral-TPU"
|
||||
"title": "Cambiar modo GPU (VM ↔ LXC)",
|
||||
"description": "Cambia una GPU asignada entre acceso directo a VM y uso compartido en LXC. ProxMenux gestiona controlador, VFIO, módulos e initramfs y pregunta cómo tratar los invitados afectados. Revisa las opciones y verifica el resultado tras reiniciar.",
|
||||
"section": "Hardware: GPU y Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace esto",
|
||||
"body": "Una GPU en un host Proxmox vive en uno de dos modos: vinculada a <code>vfio-pci</code> (reservada para una VM) o vinculada a su driver nativo <em>(i915 / amdgpu / nvidia)</em> para que el host + los LXCs puedan compartirla. <strong>Switch GPU Mode</strong> alterna entre esos dos sin que tengas que editar <code>vfio.conf</code> a mano, gestionar blacklists o recordar qué líneas de VM / LXC apuntan a la tarjeta. También te avisa limpiamente si un workload aún referencia la GPU para que no acabes con una VM rota en el arranque."
|
||||
"title": "Qué hace",
|
||||
"body": "Con <code>vfio-pci</code>, la GPU se reserva para una VM. Con el controlador nativo <em>(i915 / amdgpu / nvidia)</em>, pueden compartirla el host y los LXC. <strong>Cambiar modo GPU</strong> gestiona <code>vfio.conf</code>, módulos bloqueados y referencias en invitados, y avisa de asignaciones pendientes."
|
||||
},
|
||||
"graphics": {
|
||||
"lxcTitle": "Listo para contenedores LXC",
|
||||
@@ -20,16 +20,16 @@
|
||||
},
|
||||
"when": {
|
||||
"heading": "¿Cuándo debería usar esto?",
|
||||
"intro": "Usa este script cuando una GPU está <strong>ya asignada</strong> y quieres moverla:",
|
||||
"intro": "Úsalo si la GPU <strong>ya está asignada</strong> y quieres cambiar su uso:",
|
||||
"headerSituation": "Situación",
|
||||
"headerUse": "¿Usar esta página?",
|
||||
"rows": [
|
||||
{
|
||||
"situation": "La GPU está libre — nunca asignada. Quieres dársela a una VM.",
|
||||
"situation": "GPU libre, nunca asignada: quiero usarla en una VM.",
|
||||
"useRich": "No — usa <vmLink>Añadir GPU a VM</vmLink>"
|
||||
},
|
||||
{
|
||||
"situation": "La GPU está libre — nunca asignada. Quieres dársela a un LXC.",
|
||||
"situation": "GPU libre, nunca asignada: quiero usarla en un LXC.",
|
||||
"useRich": "No — usa <lxcLink>Añadir GPU a LXC</lxcLink>"
|
||||
},
|
||||
{
|
||||
@@ -41,88 +41,88 @@
|
||||
"useRich": "<strong>Sí — esta página.</strong>"
|
||||
},
|
||||
{
|
||||
"situation": "Solo quiero desvincular completamente una GPU de todo.",
|
||||
"use": "Sí — elige el destino LXC y luego desadjunta manualmente."
|
||||
"situation": "Quiero retirar todas las asignaciones de esta GPU.",
|
||||
"use": "El modo LXC devuelve la GPU al controlador del host; la política de conflictos de VM puede eliminar las entradas hostpci, pero las entradas de dispositivo de los LXC hay que eliminarlas aparte. No deja la GPU sin controlador."
|
||||
}
|
||||
]
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de empezar",
|
||||
"assigned": "<strong>Una GPU ya asignada</strong> — o bien en una VM vía VFIO o adjuntada al menos a un LXC. Si aún no la has asignado, empieza desde Añadir GPU a VM / LXC en su lugar.",
|
||||
"iommu": "<strong>IOMMU habilitado en el host</strong> — solo estrictamente necesario al cambiar <em>a</em> modo VM, pero vale la pena tenerlo en cualquier caso. Si falta el parámetro del kernel, el script lo añade automáticamente al command line de arranque (<code>intel_iommu=on iommu=pt</code> o <code>amd_iommu=on</code>, vía <code>proxmox-boot-tool refresh</code> en systemd-boot o <code>update-grub</code> en GRUB) y lo incluye en el aviso de reinicio final.",
|
||||
"assigned": "<strong>Una GPU ya asignada</strong> a una VM por VFIO o a un LXC. Para la primera asignación, usa Añadir GPU a VM / LXC.",
|
||||
"iommu": "<strong>IOMMU debe estar activo en el host</strong> al pasar <em>a</em> modo VM. Depende del firmware y del kernel. Si al kernel en ejecución le falta <code>intel_iommu=on</code> o <code>amd_iommu=on</code>, el script lo añade con <code>iommu=pt</code> a <code>/etc/kernel/cmdline</code> (marca de raíz ZFS) o a <code>/etc/default/grub</code> y ejecuta <code>proxmox-boot-tool refresh</code> o <code>update-grub</code>. Revisa los avisos y reinicia cuando lo solicite.",
|
||||
"iommuCheck": "dmesg | grep -i 'IOMMU enabled' | head -1",
|
||||
"reboot": "<strong>Asume un reinicio.</strong> Cambiar bindings de GPU a nivel de kernel significa que el host regenera initramfs y reinicias para aplicar. El script lo pide al final.",
|
||||
"knowList": "<strong>Saber qué VMs / LXCs están usando la GPU.</strong> El script las encontrará y preguntará qué hacer con cada una, pero es más rápido si ya conoces la lista."
|
||||
"reboot": "<strong>Planifica un reinicio.</strong> Los cambios persistentes de controlador y arranque pueden requerir regenerar initramfs y reiniciar. El script muestra la solicitud al terminar.",
|
||||
"knowList": "<strong>Identifica las VM y LXC que usan la GPU.</strong> El script detecta referencias y pregunta qué hacer con cada invitado; conocerlos facilita revisar la selección."
|
||||
},
|
||||
"blocklist": {
|
||||
"title": "No todas las GPUs son seguras para pasar a una VM",
|
||||
"body": "Una pequeña blocklist de IDs de GPU se rechaza para modo VM por inestabilidad conocida de passthrough (p. ej. Intel Arc A770 <code>8086:5a84</code> / <code>8086:5a85</code>). Si la GPU seleccionada coincide, el script explica por qué y sale. Cambiar <em>a</em> modo LXC siempre se permite."
|
||||
"body": "El script bloquea el modo VM para los ID <code>8086:5a84</code> y <code>8086:5a85</code> por su política de compatibilidad. Si coincide la GPU elegida, detiene el cambio a modo VM y vuelve a la selección de GPU, o sale si es la única GPU. Esta lista no impide pasar <em>a</em> LXC, aunque siguen aplicándose otras comprobaciones."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Ejecutar el script",
|
||||
"body": "Abre ProxMenux en el host, ve a <strong>Hardware: GPUs and Coral-TPU → Switch GPU Mode (VM ↔ LXC)</strong>.",
|
||||
"imageAlt": "Entrada del menú 'Switch GPU Mode (VM ↔ LXC)' dentro de Hardware: GPUs and Coral-TPU"
|
||||
"body": "Abre <strong>Hardware: GPU y Coral-TPU → Cambiar modo GPU (VM ↔ LXC)</strong> en ProxMenux.",
|
||||
"imageAlt": "Opción Cambiar modo GPU (VM ↔ LXC) en el menú de hardware"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "Dos fases como siempre: todo se recopila y valida primero, no se aplica nada hasta que confirmas al final."
|
||||
"heading": "Cómo funciona el script",
|
||||
"body": "Revisas GPU y dirección antes del cambio principal. Una limpieza separada de VFIO antiguo puede pedir confirmación antes, y los invitados tienen sus propios diálogos de conflicto. Lee cada confirmación: no hay una única confirmación final para todos los cambios."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Recorriendo el flujo",
|
||||
"heading": "Proceso paso a paso",
|
||||
"detect": {
|
||||
"title": "Detectar las GPUs y su binding actual",
|
||||
"body": "El script escanea cada controladora VGA / 3D / Display del host e inspecciona <code>/sys/bus/pci/devices/*/driver</code> para encontrar el driver de kernel actual. Verás cada GPU etiquetada con su nombre, slot PCI y binding de driver actual — así puedes ver de un vistazo en qué modo está.",
|
||||
"title": "Detectar GPU y controlador actual",
|
||||
"body": "Examina las controladoras VGA, 3D y Display del host y consulta <code>/sys/bus/pci/devices/*/driver</code>. Muestra nombre, dirección PCI y controlador actual de cada GPU para identificar su modo.",
|
||||
"imageAlt": "Checklist de GPU mostrando cada GPU detectada con su driver actual (vfio-pci / nvidia / amdgpu / i915) y slot PCI"
|
||||
},
|
||||
"pickGpu": {
|
||||
"title": "Elegir la(s) GPU(s) a cambiar",
|
||||
"body": "Una GPU → autoseleccionada. Varias GPUs → checklist. Puedes marcar varias, pero todas deben estar en el <em>mismo</em> modo actual — si no el script no puede elegir un modo destino para el batch y recibes un aviso de \"modo mixto\" pidiéndote que reduzcas la selección.",
|
||||
"tipTitle": "Cambios en batch",
|
||||
"tipBody": "Útil cuando estás reconstruyendo un host: \"Las tres NVIDIA van a modo VM, luego la iGPU vuelve a LXC.\" Dos ejecuciones, cada una con destino uniforme, mucha menos fricción que una a una."
|
||||
"title": "Elegir las GPU que cambiar",
|
||||
"body": "Si hay una GPU, se selecciona sola. Si hay varias, puedes marcar más de una, pero deben estar en el <em>mismo</em> modo. Si mezclas modos, pide reducir la selección.",
|
||||
"tipTitle": "Cambiar varias GPU a la vez",
|
||||
"tipBody": "Por ejemplo: pasar tres NVIDIA a modo VM y luego devolver la iGPU a LXC. Son dos ejecuciones, cada una con un destino común, en lugar de cambiar cada tarjeta por separado."
|
||||
},
|
||||
"direction": {
|
||||
"title": "Revisar la dirección propuesta",
|
||||
"intro": "Según el modo actual, el script propone el opuesto como destino:",
|
||||
"items": [
|
||||
"<strong>VM → LXC:</strong> desvincular de <code>vfio-pci</code>, dejar que el driver nativo (<code>nvidia</code>, <code>amdgpu</code>, <code>i915</code>) reclame la tarjeta para que los LXCs puedan compartirla. En NVIDIA, la entrada por BDF se quita de <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> para que el módulo nvidia reclame la GPU tras reiniciar.",
|
||||
"<strong>LXC → VM:</strong> vincular a <code>vfio-pci</code> para que la tarjeta esté libre para passthrough VFIO a una sola VM. En AMD / Intel esto significa poner el driver nativo en blacklist y definir <code>options vfio-pci ids=…</code>. En NVIDIA el módulo <code>nvidia</code> <strong>no</strong> se pone en blacklist — en su lugar una regla udev por BDF aplica <code>driver_override=vfio-pci</code> solo a las GPUs que selecciones, para que otras GPUs NVIDIA del host mantengan su driver <code>nvidia</code>."
|
||||
"<strong>VM → LXC:</strong> retira la asignación a <code>vfio-pci</code> para que el controlador nativo (<code>nvidia</code>, <code>amdgpu</code>, <code>i915</code>) pueda usar la GPU. En NVIDIA elimina las entradas BDF correspondientes de <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> para el próximo arranque.",
|
||||
"<strong>LXC → VM:</strong> prepara la asignación a <code>vfio-pci</code>. AMD / Intel bloquea el controlador nativo y usa <code>options vfio-pci ids=…</code>. En NVIDIA, <code>nvidia</code> solo se bloquea globalmente si todas las GPU NVIDIA del host están en VFIO; si no, las reglas BDF aplican <code>driver_override=vfio-pci</code> a los dispositivos de los grupos IOMMU afectados y las GPU NVIDIA externas a esos grupos conservan <code>nvidia</code>. Revisa cada miembro del grupo."
|
||||
],
|
||||
"outro": "Confirma la dirección o cancela."
|
||||
},
|
||||
"conflict": {
|
||||
"title": "Política de conflicto por workload afectado",
|
||||
"body": "El script escanea cada <code>/etc/pve/lxc/*.conf</code> y <code>/etc/pve/qemu-server/*.conf</code> buscando referencias al slot PCI de la GPU. Por cada workload afectado eliges una política:",
|
||||
"title": "Cómo tratar cada VM o LXC afectado",
|
||||
"body": "Revisa <code>/etc/pve/lxc/*.conf</code> por dispositivos según la familia del controlador y <code>/etc/pve/qemu-server/*.conf</code> por asignaciones PCI. En LXC no identifica cada tarjeta por BDF exacto. Revisa los invitados detectados y elige qué hacer con cada uno:",
|
||||
"headerPolicy": "Política",
|
||||
"headerEffect": "Efecto",
|
||||
"headerWhen": "Cuándo elegirla",
|
||||
"keepPolicy": "Mantener config, deshabilitar onboot",
|
||||
"keepEffect": "<code>pct set -onboot 0</code> (o <code>qm set</code>). Las líneas de GPU se quedan en la config.",
|
||||
"keepWhen": "Planeas volver a esta VM/LXC una vez la GPU esté de vuelta en su modo original. Default seguro.",
|
||||
"removePolicy": "Quitar GPU de la config",
|
||||
"removeEffect": "Las líneas <code>hostpci</code> / <code>dev</code> del slot de esta GPU se quitan con sed.",
|
||||
"removeWhen": "La VM/LXC seguirá funcionando sin la GPU (transcoding solo por CPU, etc.). Workflow limpio.",
|
||||
"imageAlt": "Diálogo preguntando la política de conflicto por VM / por LXC al cambiar una GPU que está actualmente asignada"
|
||||
"keepPolicy": "Conservar configuración y desactivar arranque automático",
|
||||
"keepEffect": "<code>pct set CTID -onboot 0</code> o <code>qm set VMID -onboot 0</code>. Conserva las entradas de GPU.",
|
||||
"keepWhen": "Si piensas reutilizar el invitado cuando la GPU vuelva al modo anterior. Opción predeterminada conservadora.",
|
||||
"removePolicy": "Eliminar la GPU de la configuración",
|
||||
"removeEffect": "Retira las entradas <code>hostpci</code> / <code>dev</code> identificadas y las referencias antiguas compatibles.",
|
||||
"removeWhen": "Elígelo si el invitado debe funcionar sin GPU. Revisa antes la aplicación: el uso alternativo de CPU depende de ella y retirar el dispositivo no la reconfigura automáticamente.",
|
||||
"imageAlt": "Diálogo para elegir qué hacer con cada VM o LXC afectado"
|
||||
},
|
||||
"audio": {
|
||||
"title": "Limpieza de audio huérfano (solo al salir del modo VM)",
|
||||
"body1": "Las dGPUs (NVIDIA / AMD) traen una función de audio HDMI en <code>.1</code> del mismo slot, y a veces se adjuntan controladores de audio extra junto a la GPU. Cuando la GPU deja la VM, esas líneas de audio quedan huérfanas — la VM tiene entradas <code>hostpci</code> apuntando a dispositivos de audio que no van con la GPU.",
|
||||
"body2": "El script las descubre (match BDF preciso, sin falsos positivos por substring) y muestra una checklist para que puedas quitarlas limpiamente. También limpia sus IDs vendor:device de <code>/etc/modprobe.d/vfio.conf</code> — pero solo si ninguna otra VM sigue usando esos IDs de audio."
|
||||
"title": "Retirar asignaciones de audio asociadas al salir de VM",
|
||||
"body1": "Muchas GPU NVIDIA / AMD tienen audio HDMI en la función <code>.1</code> del mismo slot; también puede haber audio adicional asignado. Al retirar la GPU pueden quedar entradas <code>hostpci</code> de audio obsoletas. Revisa qué dispositivos deben conservarse.",
|
||||
"body2": "Identifica las direcciones BDF de audio y muestra una lista para elegir qué retirar. También elimina sus ID vendor:device de <code>/etc/modprobe.d/vfio.conf</code>, solo si ninguna otra VM los usa."
|
||||
},
|
||||
"apply": {
|
||||
"title": "Aplicar cambios del host + workloads",
|
||||
"title": "Aplicar cambios al host y a los invitados",
|
||||
"body": "Tras confirmar, el script escribe los cambios en el host: <code>vfio.conf</code>, la lista de módulos bloqueados, los módulos y, para NVIDIA, la regla udev por BDF en <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> y el estado BDF en <code>/etc/proxmenux/vfio-bind.bdfs</code>. También aplica la política de conflictos elegida a cada VM/LXC afectado. Si la configuración del host ha cambiado, ejecuta <code>update-initramfs -u -k all</code> y después <code>proxmox-boot-tool refresh</code>; si no ha cambiado, omite ambos comandos."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Reiniciar",
|
||||
"body": "El nuevo binding de GPU solo surte efecto tras reiniciar. El script te lo pide; puedes reiniciar ahora o luego, pero no arranques la VM/LXC destino hasta que el host haya reiniciado — si no la GPU sigue retenida por el driver anterior.",
|
||||
"body": "Reinicia el host para aplicar la nueva asignación persistente. Puedes posponerlo, pero verifica el controlador activo antes de arrancar el invitado destino: hasta el reinicio puede seguir usando el anterior.",
|
||||
"imageAlt": "Diálogo de resumen listando qué cambió, seguido del prompt de reinicio"
|
||||
}
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalente manual",
|
||||
"intro": "Si quieres entender exactamente qué hace el script (o depurar uno de los pasos a mano), estas son las operaciones crudas para <strong>VM → LXC</strong> en una tarjeta NVIDIA con vendor:device <code>10de:2204</code>:",
|
||||
"lxcToVm": "Y para <strong>LXC → VM</strong>:",
|
||||
"oneVmTitle": "Solo una VM puede usar una GPU vfio-pci dada a la vez",
|
||||
"heading": "Inspección manual",
|
||||
"intro": "Antes de pasar de <strong>VM → LXC</strong>, revisa el controlador y la política BDF. Este ejemplo NVIDIA usa <code>10de:2204</code>; adáptalo a tu tarjeta. Los comandos consultan el estado; el script también gestiona invitados y miembros del grupo IOMMU.",
|
||||
"lxcToVm": "Antes de <strong>LXC → VM</strong>, consulta la dirección PCI y su grupo IOMMU. Sustituye la dirección del ejemplo y revisa todos los miembros antes de asignar dispositivos.",
|
||||
"oneVmTitle": "Una GPU física asignada por VFIO solo puede usarla una VM a la vez",
|
||||
"oneVmBody": "Poner varias entradas <code>hostpci</code> con el mismo slot PCI en dos VMs es config válida pero solo una de las VMs puede arrancar con la GPU — la segunda fallará. El paso de política de conflicto de ProxMenux trata exactamente de evitar esta trampa."
|
||||
},
|
||||
"verification": {
|
||||
@@ -131,13 +131,13 @@
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"stillVfioTitle": "La GPU sigue mostrando vfio-pci tras cambiar a modo LXC",
|
||||
"stillVfioBody": "<code>update-initramfs</code> no se ejecutó (o el reinicio no llegó a pasar realmente). Comprueba <code>lsmod | grep vfio</code> — si vfio-pci está cargado, vuelve a ejecutar <code>update-initramfs -u -k all</code> y reinicia. Para AMD/Intel: verifica que <code>vfio.conf</code> ya no contiene el ID vendor:device de la GPU. Para NVIDIA: verifica que el BDF ya no está en <code>/etc/proxmenux/vfio-bind.bdfs</code> y que <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> no lo lista.",
|
||||
"vmFailTitle": "Una VM no arranca tras cambiar una GPU a modo LXC",
|
||||
"vmFailBody": "La VM aún tiene entradas <code>hostpci</code> apuntando a una GPU que no puede reclamar. Vuelve a ejecutar el script y elige la política <em>Quitar GPU de la config</em>, o limpia la config a mano:",
|
||||
"smiFailTitle": "nvidia-smi falla con 'Driver/library version mismatch' tras volver a LXC",
|
||||
"smiFailBody": "Los módulos NVIDIA del host no se recargaron limpiamente. <code>modprobe -r nvidia</code> y luego <code>modprobe nvidia</code>. Si eso falla, reinicia — un reinicio completo siempre limpia el estado residual del binding vfio.",
|
||||
"logTitle": "Log de instalación",
|
||||
"logBody": "Cada ejecución escribe en <code>/tmp/proxmenux_gpu_switch_mode.log</code> en el host. Adjúntalo cuando pidas ayuda en GitHub."
|
||||
"stillVfioBody": "Un módulo VFIO cargado no demuestra qué controlador usa esta GPU. Revisa la tarjeta y si finalizaron <code>update-initramfs</code> y el reinicio. <code>lsmod | grep vfio</code> solo lista módulos. En AMD / Intel revisa <code>vfio.conf</code>; en NVIDIA, <code>/etc/proxmenux/vfio-bind.bdfs</code> y <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code>. Corrige las reglas antiguas antes de ejecutar <code>update-initramfs -u -k all</code> y reiniciar.",
|
||||
"vmFailTitle": "Una VM no arranca tras pasar la GPU a LXC",
|
||||
"vmFailBody": "Comprueba si conserva referencias <code>hostpci</code> obsoletas. La política <em>Eliminar la GPU de la configuración</em> puede retirarlas durante el cambio previsto; revisa la dirección antes de repetir el script para no invertir el modo por error. También puedes retirar la asignación en Proxmox con la VM parada.",
|
||||
"smiFailTitle": "nvidia-smi muestra «Driver/library version mismatch» al volver a LXC",
|
||||
"smiFailBody": "Compara el módulo NVIDIA cargado con las bibliotecas instaladas, también en LXC. Iguala versiones: reiniciar carga el módulo instalado, pero no corrige paquetes incompatibles. Recargar con <code>modprobe -r nvidia</code> y <code>modprobe nvidia</code> requiere detener los clientes GPU y puede fallar si hay módulos dependientes en uso.",
|
||||
"logTitle": "Registro de ejecución",
|
||||
"logBody": "Cada ejecución escribe en <code>/tmp/proxmenux_gpu_switch_mode.log</code> del host. Adjunta el registro al pedir ayuda en GitHub."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
@@ -145,12 +145,12 @@
|
||||
{
|
||||
"label": "Añadir GPU a VM (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — setup inicial del modo VM."
|
||||
"tail": " — primera configuración del modo VM."
|
||||
},
|
||||
{
|
||||
"label": "Añadir GPU a LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — setup inicial del modo LXC."
|
||||
"tail": " — primera configuración del modo LXC."
|
||||
},
|
||||
{
|
||||
"label": "Instalar drivers NVIDIA (Host)",
|
||||
@@ -160,10 +160,10 @@
|
||||
{
|
||||
"label": "ProxMenux Monitor — pestaña Hardware",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — la sección Graphics Cards donde cada GPU muestra su modo actual y expone el control inline para cambiarlo."
|
||||
"tail": " — sección Tarjetas gráficas, con el modo actual y el control para cambiarlo."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de GPU Passthrough",
|
||||
"label": "Comandos de asignación directa de GPU",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — referencia rápida de comandos."
|
||||
}
|
||||
|
||||
@@ -0,0 +1,120 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Ajouter un Coral TPU à LXC | Documentation ProxMenux",
|
||||
"description": "Partagez un Google Coral TPU USB ou M.2 / PCIe avec un LXC Proxmox. ProxMenux configure périphériques, droits et montages, démarre le conteneur et installe l’environnement Edge TPU sur les distributions compatibles."
|
||||
},
|
||||
"header": {
|
||||
"title": "Ajouter un Coral TPU à LXC",
|
||||
"description": "Partagez un Coral USB Accelerator ou M.2 / Mini-PCIe avec un LXC. ProxMenux configure le conteneur et l’environnement Edge TPU. Cette option concerne uniquement le TPU ; pour Quick Sync, VA-API ou NVENC, utilisez aussi Ajouter un GPU à LXC.",
|
||||
"section": "Matériel : GPU et Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Fonctionnement",
|
||||
"body": "Écrit la configuration dans <code>/etc/pve/lxc/<ctid>.conf</code> pour <strong>USB Accelerator</strong>, <strong>Coral M.2 / PCIe</strong> ou les deux. Démarre le conteneur et installe <code>libedgetpu</code> de Google. Le GPU se configure séparément avec <lxcGpuLink>Ajouter un GPU à LXC</lxcGpuLink>."
|
||||
},
|
||||
"whenUse": {
|
||||
"heading": "Quand l’utiliser",
|
||||
"body": "Pour <frigateLink>Frigate</frigateLink> ou une autre application Linux compatible en LXC. Coral exécute l’inférence ML prise en charge à la place du CPU. Les performances dépendent du modèle et du matériel ; le décodage vidéo et les autres tâches consomment toujours des ressources."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Avant de commencer",
|
||||
"drivers": "<strong>Préparez le périphérique Coral sur l’hôte</strong>. M.2 / PCIe nécessite le pilote hôte chargé ; USB nécessite l’accès au périphérique et les droits adaptés. Voir <hostLink>Installer Coral TPU sur l’hôte</hostLink>. Le script installe l’environnement d’exécution de l’application dans les conteneurs Debian/Ubuntu ; les autres distributions doivent le fournir séparément.",
|
||||
"driversCheck": "ls /dev/apex_* 2>/dev/null ; lsusb | grep -E '1a6e:089a|18d1:9302'",
|
||||
"container": "<strong>Un LXC existant</strong>, idéalement basé sur <strong>Debian / Ubuntu</strong> : l’installation utilise <code>apt-get</code>. Les <strong>conteneurs d’autres distributions</strong> peuvent choisir le <strong>mode passthrough uniquement</strong>, sans installation APT de <code>libedgetpu</code>. Utile si l’application inclut déjà cet environnement, comme l’image Docker Frigate.",
|
||||
"downtime": "<strong>Prévoyez une courte interruption</strong> du conteneur. Le script l’arrête pour modifier sa configuration puis le démarre pour installer l’environnement d’exécution. Ces modifications ne nécessitent pas de redémarrage de l’hôte."
|
||||
},
|
||||
"hostPrep": {
|
||||
"title": "L'hôte doit être préparé en premier",
|
||||
"body": "M.2 / PCIe nécessite <code>gasket</code>/<code>apex</code> sur l’hôte et un périphérique fonctionnel. USB nécessite le périphérique connecté et les droits ; l’application ne doit pas nécessairement tourner sur l’hôte. <code>libedgetpu</code> doit être disponible là où elle s’exécute. Ordre : <strong>préparer l’hôte → accès LXC → configurer l’application</strong>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Exécuter le script",
|
||||
"body": "Dans ProxMenux, ouvrez <strong>Matériel : GPU et Coral-TPU → Ajouter un Coral TPU à LXC</strong>.",
|
||||
"imageAlt": "Option Ajouter un Coral TPU à LXC dans le menu matériel"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Déroulement du script",
|
||||
"body": "Choisissez le conteneur. Le script configure l’accès USB même sans Coral USB connecté, puis ajoute M.2 / PCIe si ce matériel est détecté."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Étapes de la procédure",
|
||||
"pick": {
|
||||
"title": "Choisir le conteneur LXC",
|
||||
"body": "Le sélecteur affiche les conteneurs admissibles de <code>pct list</code> ; les conteneurs OCI sont masqués et gérés dans Apps du gestionnaire OCI. Choisissez-en un, démarré ou arrêté. Le script l’arrête si nécessaire, le configure puis le démarre pour installer l’environnement d’exécution."
|
||||
},
|
||||
"gpuHint": {
|
||||
"title": "Suggestion facultative pour l’accès GPU",
|
||||
"body": "Si un GPU est détecté mais non configuré pour ce conteneur, un dialogue recommande <lxcGpuLink>Ajouter un GPU à LXC</lxcGpuLink> pour le décodage vidéo matériel, par exemple Quick Sync, VA-API ou NVENC. Il demande s’il faut continuer avec Coral uniquement : Oui poursuit la configuration du TPU ; Non quitte pour vous permettre de configurer d’abord le GPU."
|
||||
},
|
||||
"usb": {
|
||||
"title": "Configurer l’accès USB du LXC",
|
||||
"body": "Crée une règle udev hôte pour <code>/dev/coral</code> et monte l’arborescence <strong>entière</strong> <code>/dev/bus/usb</code> dans le conteneur. La configuration est écrite même sans Coral USB connecté et expose d’autres périphériques que le Coral.",
|
||||
"whyTitle": "Pourquoi monter /dev/bus/usb au lieu de /dev/coral ?",
|
||||
"whyBody": "Le chemin USB, par exemple <code>/dev/bus/usb/001/005</code>, change après reconnexion. Les anciennes versions montaient le lien <code>/dev/coral</code> et pouvaient conserver un chemin périmé. Monter toute l’arborescence USB rend le nœud actuel visible. L’application peut encore devoir le rouvrir."
|
||||
},
|
||||
"pcie": {
|
||||
"title": "Configurer l’accès M.2 / PCIe du LXC",
|
||||
"body1": "Si un Coral M.2 / PCIe est détecté et que <code>/dev/apex_0</code> existe, le script utilise l’API Proxmox <code>dev</code> pour gérer cgroup2 dans les LXC privilégiés et non privilégiés :",
|
||||
"body2": "Si <code>/dev/apex_0</code> est absent après <hostLink>Installer Coral sur l’hôte</hostLink>, le script écrit un montage bind avec <code>create=file</code> et, uniquement lorsque le numéro majeur apex figure dans <code>/proc/devices</code>, une règle cgroup2 classique. Aucun des deux ne crée un périphérique fonctionnel :",
|
||||
"rebootTitle": "Redémarrez l'hôte d'abord si vous venez d'installer des pilotes Coral",
|
||||
"rebootBody": "Le montage de secours ne charge pas <code>apex</code> sur l’hôte. Chargez le pilote ou redémarrez après installation, puis vérifiez le périphérique. Relancez ensuite le script pour appliquer l’entrée moderne et redémarrez le conteneur."
|
||||
},
|
||||
"drivers": {
|
||||
"title": "Démarrer le LXC et installer l’environnement Coral",
|
||||
"body": "Démarre le conteneur et attend jusqu’à 15 secondes son état running, puis utilise <code>pct exec</code> pour lancer l’installation à l’intérieur. L’installateur :",
|
||||
"items": [
|
||||
"Exécute <code>apt-get update</code>.",
|
||||
"Installe les prérequis du dépôt Coral : <code>gnupg</code>, <code>curl</code>, <code>ca-certificates</code>.",
|
||||
"Importe la clé GPG Coral de Google sur <code>/etc/apt/keyrings/coral-edgetpu.gpg</code> (chemin moderne, comme l'installateur hôte utilise) et ajoute le dépôt APT <code>coral-edgetpu-stable</code> avec <code>signed-by=</code>.",
|
||||
"Installe <code>libedgetpu1-std</code> par défaut. Si un Coral M.2 est détecté, propose <code>libedgetpu1-std</code> ou <code>libedgetpu1-max</code>. Ce choix ne configure pas à lui seul la détection dans l’application."
|
||||
],
|
||||
"noIgpuTitle": "Pourquoi pas de pilotes iGPU ici ?",
|
||||
"noIgpuBody": "Auparavant, il installait aussi <code>va-driver-all</code>, <code>intel-opencl-icd</code> et d’autres paquets Intel pour associer Quick Sync à Coral. Ce mélange causait des erreurs lorsqu’on souhaitait uniquement Coral. L’iGPU se configure désormais avec <lxcGpuLink>Ajouter un GPU à LXC</lxcGpuLink> ; utilisez-le d’abord pour le décodage vidéo matériel.",
|
||||
"debianTitle": "Autres distributions : accès au périphérique uniquement",
|
||||
"debianBody": "Utilise <code>apt-get</code> sous Debian/Ubuntu. Pour <strong>Alpine, Arch, RHEL ou SUSE</strong>, détectés via <code>/etc/os-release</code>, propose <em>continuer avec le seul accès matériel</em> ou <em>annuler</em>. Le premier choix configure <code>/etc/pve/lxc/<ctid>.conf</code> sans installer <code>libedgetpu</code>. Ce mode convient si l’application inclut déjà cet environnement, comme Frigate Docker. Sinon, installez <code>libedgetpu</code> selon le <coralLink>guide officiel Google</coralLink>."
|
||||
},
|
||||
"summary": {
|
||||
"title": "Résumé",
|
||||
"body": "À la fin, une liste affiche Coral USB et M.2 avec ✓ ou ⚠ selon la détection matérielle. Le conteneur reste démarré pour configurer Frigate, CodeProject.AI ou votre application."
|
||||
}
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Procédure manuelle équivalente",
|
||||
"body": "Si vous voulez voir exactement ce qui va dans la config LXC, ou l'appliquer à la main:",
|
||||
"usbHeading": "USB Coral",
|
||||
"pcieHeading": "M.2 / PCIe Coral",
|
||||
"runtimeHeading": "Dans le conteneur : environnement Coral"
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Vérification",
|
||||
"body": "Ouvrez un shell dans le conteneur et vérifiez que Coral est visible :"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Dépannage",
|
||||
"apexTitle": "LXC démarré, mais /dev/apex_0 absent",
|
||||
"apexBody": "Vérifiez d’abord le pilote hôte : <code>lsmod | grep apex</code>. S’il manque, essayez <code>modprobe apex</code> ou redémarrez après l’installation du pilote. Une fois <code>/dev/apex_0</code> présent sur l’hôte, vérifiez l’entrée de périphérique LXC (relancez le script si seules les entrées de secours ont été écrites) puis redémarrez le conteneur avec <code>pct stop <ctid> && pct start <ctid></code>.",
|
||||
"replugTitle": "Coral USB disparaît après reconnexion sur un autre port",
|
||||
"replugBody": "Vérifiez que le LXC monte <code>/dev/bus/usb</code> plutôt que le lien <code>/dev/coral</code>. Sa configuration doit contenir <code>lxc.mount.entry: /dev/bus/usb dev/bus/usb ...</code> sans dépendre directement de <code>/dev/coral</code>. Relancez le script si la configuration est ancienne.",
|
||||
"alpineTitle": "Alpine / Arch / RHEL / SUSE : environnement non installé",
|
||||
"alpineBody": "Le <em>mode passthrough uniquement</em> configure le périphérique sans installer <code>libedgetpu</code>. Utilisez un paquet compatible ou compilez les sources ; vérifiez sa disponibilité avant une commande comme <code>apk add</code> sous Alpine. Frigate peut inclure cet environnement. Avec Docker dans le LXC, transmettez aussi M.2 via <code>--device /dev/apex_0:/dev/apex_0</code> ou montez USB dans Docker ; le montage LXC seul ne suffit pas.",
|
||||
"frigateTitle": "Frigate affiche « Coral EdgeTPU detected but not available »",
|
||||
"frigateBody": "Vérifiez environnement, visibilité et droits de lecture/écriture du processus réel. Pour USB, examinez les droits et l’éventuel groupe <code>plugdev</code>. Pour M.2, inspectez <code>/dev/apex_0</code> avec <code>ls -l /dev/apex_0</code>. Un nom comme <code>apex</code> dans <code>/etc/group</code> ne suffit pas : GID numériques et correspondances LXC doivent coïncider. Vérifiez aussi si un autre processus utilise déjà le TPU ; ne passez pas d’abord en mode privilégié.",
|
||||
"logsTitle": "Vérifier les journaux de l'hôte et du conteneur",
|
||||
"logsBody": "Sur l’hôte, examinez les messages noyau avec <code>journalctl -k | grep -i -e apex -e gasket -e usb</code>. Dans le LXC, consultez les journaux applicatifs ; avec Docker imbriqué, utilisez <code>docker logs <container></code>. Droits, environnement absent, connexion USB ou autre processus utilisant le TPU peuvent provoquer l’échec."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Voir aussi",
|
||||
"items": [
|
||||
{
|
||||
"label": "Installer Coral TPU sur l’hôte",
|
||||
"href": "/docs/hardware/install-coral-tpu-host",
|
||||
"tail": " — préalable nécessaire pour utiliser une carte Coral M.2 / PCIe dans un CT."
|
||||
},
|
||||
{
|
||||
"label": "Ajouter un GPU à LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — accès GPU, souvent associé à Coral dans Frigate."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Ajouter un GPU à une VM | Documentation ProxMenux",
|
||||
"description": "Attribuez un GPU physique à une VM Proxmox. ProxMenux vérifie IOMMU, configure VFIO et les périphériques VM et détecte les conflits avec d’autres VM ou LXC."
|
||||
},
|
||||
"header": {
|
||||
"title": "Ajouter un GPU à une VM (passthrough)",
|
||||
"description": "Détecte les GPU Intel, AMD ou NVIDIA pour l’accès direct depuis une VM. Vérifie IOMMU et les périphériques associés, configure VFIO et la VM et applique ses règles de compatibilité. Vérifiez tous les périphériques concernés.",
|
||||
"section": "Matériel : GPU et Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Fonctionnement",
|
||||
"body": "Automatise la configuration hôte et <code>hostpci</code> décrite dans la <pveLink>documentation PCI passthrough Proxmox</pveLink>. Vérifie les attributions aux <em>autres</em> invités et propose de résoudre les conflits. Ne garantit pas toute combinaison GPU, réinitialisation et pilote invité."
|
||||
},
|
||||
"who": {
|
||||
"heading": "C'est pour qui ?",
|
||||
"body": "Pour qu’une <strong>machine virtuelle</strong> utilise directement un GPU via VFIO. Tant qu’il est lié à VFIO, le pilote hôte ne peut pas l’utiliser, même VM arrêtée. Pour le partager avec <em>LXC</em>, utilisez <lxcLink>Ajouter un GPU à LXC</lxcLink>."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Avant de commencer",
|
||||
"gpu": "<strong>GPU compatible</strong> physiquement installé. Le script détecte Intel, AMD et NVIDIA via <code>lspci</code>.",
|
||||
"gpuCheck": "lspci | grep -iE 'VGA|3D|Display'",
|
||||
"iommu": "<strong>Prise en charge IOMMU</strong> matérielle et activation dans le micrologiciel si nécessaire (Intel VT-d ou AMD-Vi). Vérifie le système et peut configurer Linux ; ne modifie pas BIOS/UEFI et ne prouve pas qu’un IOMMU inactif y est désactivé.",
|
||||
"q35": "Cet assistant exige <strong>q35</strong> et refuse <code>i440fx</code>. Le type de machine est distinct du micrologiciel BIOS/UEFI. Changer le chipset d’une VM existante se planifie et n’est pas automatique.",
|
||||
"q35Check": "qm config VMID | grep machine",
|
||||
"moreGpus": "Prévoyez <strong>un autre GPU ou accès alternatif</strong> via SSH, IPMI ou série. Réserver le GPU principal peut couper l’affichage local. Pour <em>NVIDIA</em>, une carte hors du groupe IOMMU concerné peut rester sur l’hôte.",
|
||||
"nvidiaInstalled": "Après <nvidiaLink>installation NVIDIA sur l’hôte</nvidiaLink>, les fonctions sélectionnées sont réservées à <code>vfio-pci</code> plutôt qu’à <code>nvidia</code>. Le module <code>nvidia</code> peut rester disponible pour les <strong>autres</strong> cartes hors du groupe IOMMU concerné. Vérifiez avec <code>nvidia-smi</code>."
|
||||
},
|
||||
"pickOne": {
|
||||
"title": "Attribution exclusive VM ou partage LXC",
|
||||
"body": "Un GPU lié à <code>vfio-pci</code> pour la transmission VM ne peut pas être utilisé simultanément par l'hôte ou un LXC. Si vous avez deux GPU, vous pouvez en consacrer un à chaque chemin. Si vous n'en avez qu'une, choisissez :",
|
||||
"vmItem": "<strong>VM :</strong> accès direct et exclusif pour cette VM.",
|
||||
"lxcItem": "<strong>LXC (<lxcLink>Ajouter un GPU à LXC</lxcLink>) :</strong> partage le périphérique avec l’hôte et d’autres conteneurs via le pilote natif."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Exécuter l’installateur",
|
||||
"body": "Ouvrez ProxMenux et choisissez <strong>Matériel : GPU et Coral-TPU → Ajouter un GPU à une VM</strong>.",
|
||||
"imageAlt": "Option du menu pour ajouter un GPU à une VM"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Déroulement du script",
|
||||
"body": "Détection et sélection précèdent les changements principaux, confirmés par un résumé final. L’activation IOMMU possède une confirmation préalable et peut déjà modifier le démarrage. Le nettoyage audio ultérieur peut aussi demander un choix."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Étapes de la procédure",
|
||||
"detect": {
|
||||
"title": "Détecter les GPU et vérifier IOMMU",
|
||||
"body": "Considère IOMMU comme actif uniquement si le noyau en cours a <code>intel_iommu=on</code> ou <code>amd_iommu=on</code> et que des groupes IOMMU existent. Si le paramètre est déjà enregistré pour le prochain démarrage, il continue en mode redémarrage en attente ; sinon, une étape confirmée séparément peut l’ajouter avec <code>iommu=pt</code>. Son heuristique de fichier d’amorçage utilise <code>/etc/kernel/cmdline</code> lorsqu’un marqueur de racine ZFS comme <code>root=ZFS=</code> s’y trouve ; sinon, elle utilise <code>/etc/default/grub</code>. Cette heuristique ne prouve pas le chargeur d’amorçage réellement utilisé. Un IOMMU nouvellement configuré prend effet après redémarrage ; vérifiez ensuite les groupes réels.",
|
||||
"tipTitle": "Post-installation déjà configurée ?",
|
||||
"tipBody": "Si la <postLink>prise en charge VFIO IOMMU</postLink> est configurée et active dans le noyau, le contrôle passe. Un réglage prévu pour le prochain démarrage ne prouve pas son activation actuelle.",
|
||||
"imageAlt": "Liste des GPU détectés avec l'adresse du fournisseur et du PCI"
|
||||
},
|
||||
"preflight": {
|
||||
"title": "Choisir un GPU et lancer les contrôles préalables",
|
||||
"intro": "Une fois que vous choisissez le GPU, le script exécute une série de vérifications qui peuvent chaque bloquer les progrès suivants:",
|
||||
"items": [
|
||||
"<strong>Contrôle SR-IOV.</strong> Refuse VF et PF avec VF actives : cette procédure configure des périphériques complets, pas SR-IOV. Configurez SR-IOV séparément sur du matériel compatible.",
|
||||
"<strong>Un seul GPU.</strong> La console locale peut perdre son affichage lorsque VFIO le réserve. Vérifiez d’abord l’accès SSH ou web depuis un autre ordinateur.",
|
||||
"<strong>Politique de réinitialisation AMD.</strong> Lit <code>/sys/bus/pci/devices/<pci>/reset_method</code>. APU ou carte dédiée sans FLR est <em>bloquée par la politique de l’assistant</em> ; un sous-type inconnu sans FLR exige confirmation. Cela ne prouve pas une impossibilité universelle.",
|
||||
"<strong>État D3cold.</strong> L’assistant bloque les cartes AMD signalant <code>D3cold</code> en raison du risque d’échec d’activation. Vérifiez alimentation et micrologiciel.",
|
||||
"<strong>Analyse du groupe IOMMU.</strong> Lit <code>/sys/kernel/iommu_groups/</code> et inclut dans le plan de la VM <em>tous les membres sauf les ponts</em>, éventuellement des contrôleurs réseau ou de stockage. Si le groupe contient des périphériques d’un autre slot, le script les liste avant le résumé ; vérifiez que l’hôte n’en a pas besoin. Si IOMMU attend un redémarrage, les groupes réels ne sont pas disponibles et le plan ne contient initialement que la fonction GPU sélectionnée ; vérifiez l’isolation après le redémarrage."
|
||||
],
|
||||
"audioIntro": "<strong>Audio associé.</strong> Deux cas selon l’emplacement du contrôleur :",
|
||||
"audioDgpu": "<strong>GPU dédié :</strong> l’audio HDMI occupe souvent la fonction <code>.1</code> du même emplacement PCI et est inclus si détecté. Si l’hôte l’utilisait, il en perd l’accès lors de la réservation à la VM.",
|
||||
"audioIgpu": "<strong>Sans fonction audio <code>.1</code> :</strong> l’audio peut être sur un autre périphérique comme <code>00:1f.3</code>. Liste les contrôleurs et pilotes, par exemple <code>snd_hda_intel</code>. Par défaut <strong>aucun</strong> n’est sélectionné ; choisissez seulement le nécessaire."
|
||||
},
|
||||
"pickVm": {
|
||||
"title": "Choisir la VM cible",
|
||||
"body": "Choisissez la VM. Exige q35 et réutilise les entrées GPU existantes si possible. BIOS/UEFI est un réglage distinct, pas un type de machine. Ne change pas automatiquement chipset ou mode de démarrage du système installé.",
|
||||
"imageAlt": "Sélection de VM par nom, ID et état"
|
||||
},
|
||||
"switchMode": {
|
||||
"title": "Gérer les attributions existantes",
|
||||
"intro": "Le script scanne chaque config VM et chaque config LXC sur l'hôte à la recherche du GPU que vous avez choisi. Trois résultats possibles :",
|
||||
"items": [
|
||||
"<strong>GPU disponible.</strong> Continue sans retirer d’attribution.",
|
||||
"<strong>Attribué à une autre VM.</strong> Arrêtez d’abord la source. Vous pouvez <em>garder ses entrées et désactiver le démarrage automatique</em> ou <em>retirer les entrées en conservant le démarrage automatique</em>. Avec <code>vfio-pci</code> déjà actif et sans changement hôte, le transfert VM→VM peut éviter un redémarrage hôte.",
|
||||
"<strong>GPU utilisé par LXC.</strong> Pour les conteneurs ordinaires, choisissez <em>garder la configuration GPU et désactiver le démarrage automatique</em> ou <em>retirer la configuration du périphérique GPU en conservant le démarrage automatique</em>. Le retrait supprime les entrées <code>devN</code> et, pour AMD/Intel, aussi les anciennes règles <code>/dev/dri</code> <code>lxc.mount.entry</code> et <code>lxc.cgroup2.devices.allow</code>. Les conteneurs OCI conservent leur configuration et sont arrêtés avec le démarrage automatique désactivé ; retirez leur GPU via OCI manager Apps. La détection des conflits se fait par famille de périphériques GPU et peut inclure d’autres cartes de cette famille."
|
||||
],
|
||||
"imageAlt": "Boîte de dialogue offrant de supprimer le GPU d'un LXC avant de l'assigner au VM",
|
||||
"smartTitle": "Vérifier l’audio associé au retrait du GPU",
|
||||
"smartBody": "Propose ensuite une liste d’<strong>audio potentiellement inutilisé</strong> dans la VM source. Décochez ce qui reste nécessaire. Par exemple, peut conserver <code>02:00.1</code> et proposer de retirer <code>00:1f.3</code>. La liste détermine les suppressions supplémentaires, sans garantie universelle d’association audio/affichage."
|
||||
},
|
||||
"audioPick": {
|
||||
"title": "Sans audio .1, sélectionner les contrôleurs nécessaires",
|
||||
"body": "Pour les GPU dont l’audio est séparé, une liste présente les contrôleurs audio PCI et leurs pilotes, hors groupe IOMMU déjà inclus. Choisissez seulement ceux nécessaires à la VM, ou aucun.",
|
||||
"imageAlt": "Boîte de dialogue de liste de contrôle avec chaque contrôleur audio PCI hôte (BDF + pilote) lorsque le GPU n'a pas d'audio associé .1",
|
||||
"warnTitle": "Ne sélectionnez pas l’audio nécessaire à l’hôte",
|
||||
"warnBody": "Attribuer l’audio peut retirer l’accès à l’hôte ; le contrôleur ne peut pas appartenir à une autre VM active simultanément. Laissez l’audio facultatif non sélectionné si inutile et vérifiez ses attributions. Le bip de console ne vient pas nécessairement du PCI audio."
|
||||
},
|
||||
"summary": {
|
||||
"title": "Examiner le résumé de la confirmation",
|
||||
"body": "Vérifiez le plan final de l’hôte et de la VM, et annulez s’il est incorrect. Il affiche le groupe IOMMU et son nombre de périphériques ; les membres d’un autre slot sont listés à l’étape précédente. L’annulation empêche les changements principaux, sans annuler une modification de la configuration d’amorçage IOMMU confirmée séparément auparavant.",
|
||||
"imageAlt": "Résumé des modifications prévues sur hôte et VM"
|
||||
},
|
||||
"hostApply": {
|
||||
"title": "Les changements d'hôte sont appliqués",
|
||||
"intro": "La phase d’application modifie hôte et VM. Le nettoyage audio peut encore demander un choix. Modifications possibles :",
|
||||
"items": [
|
||||
"<code>/etc/modules</code> — ajoute <code>vfio</code>, <code>vfio_iommu_type1</code>, <code>vfio_pci</code> (plus <code>vfio_virqfd</code> sur les noyaux < 6.2).",
|
||||
"<code>/etc/modprobe.d/vfio.conf</code> — AMD/Intel : <code>options vfio-pci ids=<vendor:device,...> disable_vga=1</code>. NVIDIA : <code>softdep nvidia pre: vfio-pci</code> (<code>_drm</code>/<code>_modeset</code>/<code>_uvm</code>) ; la liaison réelle se fait par BDF. AMD ajoute l’ordre de chargement <code>softdep</code>: <code>vfio-pci</code> → <code>radeon</code>/<code>amdgpu</code>.",
|
||||
"Écrit <code>/etc/modprobe.d/iommu_unsafe_interrupts.conf</code> et <code>kvm.conf</code> avec <code>allow_unsafe_interrupts=1</code> et <code>ignore_msrs=1</code>. Réglages du script, pas des exigences universelles Windows/macOS ; les interruptions non sûres réduisent la protection du remappage.",
|
||||
"<code>/etc/modprobe.d/blacklist.conf</code>: NVIDIA — <code>nouveau</code>/<code>lbm-nouveau</code>; AMD — <code>radeon</code> + <code>amdgpu</code>; Intel — <code>i915</code>. Ces règles globales au fabricant peuvent toucher d’autres cartes utilisant le même pilote. Le module <code>nvidia</code> est bloqué <strong>uniquement</strong> via <code>/etc/modprobe.d/proxmenux-nvidia-vfio-blacklist.conf</code> lorsque <em>toutes</em> les NVIDIA de l’hôte sont réservées à VFIO.",
|
||||
"<code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> + <code>/etc/proxmenux/vfio-bind.bdfs</code> — <strong>NVIDIA seulement.</strong> Applique <code>ATTR'{'driver_override'}'=\"vfio-pci\"</code> au PCI ADD des BDF enregistrés, y compris les fonctions du groupe IOMMU concerné. Hors de ces groupes, <code>nvidia</code> peut rester actif. La politique BDF ne divise pas les groupes matériels.",
|
||||
"<strong>AMD seulement.</strong> Tente d’extraire la ROM de <code>/sys/bus/pci/.../rom</code> ou ACPI VFCT vers <code>/usr/share/kvm/vbios_<vendor>_<device>.bin</code>. En cas de réussite, la VM utilise <code>romfile=</code>. Une extraction valide ne garantit pas la réussite de l’initialisation du GPU.",
|
||||
"<strong>NVIDIA seulement.</strong> Arrête et désactive <code>nvidia-persistenced</code>, <code>nvidia-powerd</code>, <code>nvidia-fabricmanager</code> seulement si toutes les NVIDIA sont réservées à VFIO. En usage mixte, conserve les services et <code>nvidia</code> pour les cartes natives.",
|
||||
"<code>update-initramfs -u -k all</code> — ne fonctionne que si l'un des éléments ci-dessus a réellement changé."
|
||||
]
|
||||
},
|
||||
"vmApply": {
|
||||
"title": "La configuration VM est appliquée via qm set",
|
||||
"body": "La configuration VM à <code>/etc/pve/qemu-server/<vmid>.conf</code> est mise à jour via <code>qm set</code> (jamais par <code>sed</code>):",
|
||||
"after1": "Ajoute <code>x-vga=1</code> pour AMD et NVIDIA, <strong>pas</strong> Intel. C’est la politique du script, pas la preuve que tous les iGPU Intel manquent de micrologiciel ou que ce réglage bloque toujours.",
|
||||
"after2": "D'autres lignes <code>hostpciN</code> sont jointes si le groupe IOMMU du GPU contient d'autres appareils que vous devez transmettre ensemble."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Redémarrer si la modification hôte l’exige",
|
||||
"body": "Suivez le redémarrage demandé si démarrage ou pilotes changent et vérifiez la liaison active avant de lancer la VM. La configuration enregistrée ne prouve pas son activation. VM→VM avec VFIO correct peut éviter de redémarrer l’hôte.",
|
||||
"imageAlt": "Écran sommaire montrant ce qui a été changé, suivi d'une invite de redémarrage"
|
||||
}
|
||||
},
|
||||
"vendors": {
|
||||
"heading": "Notes par fabricant",
|
||||
"nvidiaHeading": "NVIDIA",
|
||||
"nvidiaBody": "Conserve un ancien contournement <em>Code 43</em> : <code>hidden=1</code>, ID <code>NV43FIX</code> dans <code>args</code>, <code>kvm=off</code>. Pas une exigence universelle des GeForce actuels : NVIDIA a activé le passthrough Windows avec R465. Le code peut avoir d’autres causes ; vérifiez GPU et pilote.",
|
||||
"nvidiaMultiHeading": "Prise en charge multi-GPU NVIDIA",
|
||||
"nvidiaMultiBody": "Usage mixte NVIDIA <strong>par BDF</strong>. Enregistre les fonctions <code>vfio-pci</code> par adresse plutôt que seulement par ID <code>vendor:device</code>. Hors des groupes concernés, peut conserver <code>nvidia</code> ; vérifiez avec <code>nvidia-smi</code>. N’isole pas deux cartes du même groupe.",
|
||||
"amdHeading": "AMD",
|
||||
"amdBody": "Certains GPU AMD échouent à se réinitialiser après arrêt VM. L’assistant vérifie les capacités annoncées, pas tous les cycles réels. <vendorResetLink>vendor-reset</vendorResetLink> prend en charge une liste limitée et exige noyau compatible et chargement précoce ; il n’est pas installé. <em>RadeonResetBugFix</em> sous Windows dépend aussi du matériel, sans garantie générale.",
|
||||
"intelHeading": "Intel iGPU",
|
||||
"intelBody": "L’attribution Intel iGPU complète et SR-IOV sont distincts. Cet assistant réserve le périphérique à une VM sans <code>x-vga=1</code>. <sriovLink>i915-sriov-dkms</sriovLink> exige matériel et noyau pris en charge ; « UHD 630+ » n’est pas une règle de compatibilité. Prévoyez un autre accès hôte."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Vérification"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Dépannage",
|
||||
"code43Title": "Code 43 dans Windows (NVIDIA)",
|
||||
"code43Body": "Code 43 ne prouve pas un échec du masquage. Consultez <code>qm config VMID | grep -E \"cpu|args\"</code> avec la vraie VMID, puis <code>hidden=1</code> et <code>hv_vendor_id=NV43FIX</code>. Vérifiez aussi pilote invité, micrologiciel et attribution. Relancer peut quitter si déjà attribué.",
|
||||
"amdResetTitle": "AMD GPU fonctionne une fois, échoue sur le redémarrage VM",
|
||||
"amdResetBody": "Un échec de réinitialisation est une cause possible. Redémarrer ou couper/rétablir l’alimentation peut aider temporairement. Vérifiez la compatibilité et le chargement précoce de <code>vendor-reset</code> ; <code>softdep amdgpu pre: vendor-reset</code> seul ne garantit pas un chargement avant VFIO. <em>RadeonResetBugFix</em> exige aussi un GPU compatible.",
|
||||
"stuckBootTitle": "VM démarrage bloqué / GPU non détecté",
|
||||
"stuckBootBody": "Consultez l’adresse réelle avec <code>lspci -nnk -s PCI_ADDRESS</code> ; attendez <code>Kernel driver in use: vfio-pci</code>. Remplacez PCI_ADDRESS. Si le pilote natif reste actif, vérifiez la politique de liaison, pas seulement <code>/etc/modprobe.d/blacklist.conf</code> ; NVIDIA utilise les BDF. Lisez <code>dmesg | grep vfio</code>. Après correction, <code>update-initramfs -u -k all</code> puis redémarrage prévu.",
|
||||
"darkTitle": "La console d'hôte devient sombre après le redémarrage et je ne peux pas SSH",
|
||||
"darkBody": "Un écran noir ne prouve pas l’arrêt de l’hôte. Si SSH échoue aussi, vérifiez réseau et contrôleurs inclus dans le groupe IOMMU. Récupérez l’accès via IPMI, série ou environnement de secours ; examinez <code>/etc/pve/qemu-server/<vmid>.conf</code> et annulez seulement les attributions/règles concernées. Ne supprimez pas les autres réglages.",
|
||||
"logTitle": "Vérifiez le journal d'installation",
|
||||
"logBody": "Chaque exécution écrit <code>/tmp/add_gpu_vm.log</code>. Joignez le journal aux demandes d’aide."
|
||||
},
|
||||
"revert": {
|
||||
"heading": "Annuler manuellement les modifications",
|
||||
"intro": "Arrêtez la VM et retirez seulement ses attributions PCI concernées dans Matériel ou avec l’index explicite ci-dessous. Cela ne rend pas encore le GPU au pilote hôte. Utilisez Changer le mode GPU pour cette transition et vérifiez les invités concernés."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Voir aussi",
|
||||
"items": [
|
||||
{
|
||||
"label": "Installer les pilotes NVIDIA (host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — préparer le pilote des cartes gardées sur l’hôte ; un GPU lié à VFIO ne peut pas l’utiliser simultanément."
|
||||
},
|
||||
{
|
||||
"label": "Ajouter un GPU à LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": "— modèle alternatif: partager le GPU avec plusieurs conteneurs au lieu de le consacrer à un VM."
|
||||
},
|
||||
{
|
||||
"label": "Changer le mode GPU (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — basculer le même GPU entre partage et attribution exclusive."
|
||||
},
|
||||
{
|
||||
"label": "commandes GPU Passthrough",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — lspci, vérification d’IOMMU et référence de qm set hostpci."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,185 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Ajouter un GPU à LXC | Documentation ProxMenux",
|
||||
"description": "Partagez un GPU Intel, AMD ou NVIDIA avec LXC. ProxMenux configure périphériques, groupes et bibliothèques selon la distribution ; l’application doit prendre en charge et configurer l’accélération."
|
||||
},
|
||||
"header": {
|
||||
"title": "Ajouter un GPU à LXC",
|
||||
"description": "Partage l’accès GPU avec LXC via les périphériques de l’hôte. Le pilote reste sur l’hôte ; les applications nécessitent des bibliothèques compatibles et leur propre configuration.",
|
||||
"section": "Matériel : GPU et Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Fonctionnement",
|
||||
"body": "Ajoute des entrées <code>dev<N></code> à <code>/etc/pve/lxc/<ctid>.conf</code> pour les nœuds <code>/dev/dri/*</code>, <code>/dev/kfd</code> ou <code>/dev/nvidia*</code> concernés. Démarre le conteneur, installe les paquets userspace de sa distribution et, pour Intel/AMD, aligne les groupes <code>video</code> et <code>render</code>. L’accélération des applications exige toujours matériel, bibliothèques et configuration d’application compatibles."
|
||||
},
|
||||
"compare": {
|
||||
"heading": "Partage LXC ou attribution directe à une VM",
|
||||
"intro": "LXC partage le noyau et peut <em>partager</em> le GPU entre hôte et conteneurs. Avec une <vmLink>attribution complète à une VM</vmLink>, le périphérique est réservé à cette VM et indisponible pour le pilote de l’hôte.",
|
||||
"headerFeature": "Fonctionnalité",
|
||||
"headerLxc": "LXC (cette page)",
|
||||
"headerVm": "VM",
|
||||
"rows": [
|
||||
{
|
||||
"feature": "L'hôte utilise toujours le GPU?",
|
||||
"lxc": "Oui",
|
||||
"vm": "Non — exclusivement au VM"
|
||||
},
|
||||
{
|
||||
"feature": "Plusieurs conteneurs partageant un GPU?",
|
||||
"lxc": "Oui",
|
||||
"vm": "Non"
|
||||
},
|
||||
{
|
||||
"feature": "Nécessite IOMMU / VFIO sur l'hôte?",
|
||||
"lxc": "Non",
|
||||
"vm": "Oui"
|
||||
},
|
||||
{
|
||||
"feature": "Redémarrer nécessaire ?",
|
||||
"lxc": "Habituellement non (relancez simplement le CT)",
|
||||
"vm": "Lors de modifications du pilote hôte ou de l’IOMMU ; pas à chaque attribution"
|
||||
},
|
||||
{
|
||||
"feature": "Systèmes d’exploitation invités",
|
||||
"lxc": "Seul Linux (LXC est uniquement Linux)",
|
||||
"vm": "Système invité pris en charge avec pilote GPU compatible"
|
||||
}
|
||||
]
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Avant de commencer",
|
||||
"gpu": "<strong>GPU sur l’hôte</strong> Intel, AMD ou NVIDIA, détecté via <code>lspci</code>.",
|
||||
"gpuCheck": "lspci | grep -iE 'VGA|3D|Display'",
|
||||
"vfio": "<strong>Le GPU ne doit pas être lié à vfio-pci.</strong> Il nécessite le pilote natif de l’hôte. S’il est attribué à une VM, le script propose <switchLink>Changer le mode GPU</switchLink>.",
|
||||
"nvidia": "<strong>Pour NVIDIA :</strong> installez d’abord le pilote hôte. Les bibliothèques du conteneur doivent correspondre à sa version. Voir <nvidiaLink>Installer les pilotes NVIDIA sur l’hôte</nvidiaLink>.",
|
||||
"nvidiaCheck": "nvidia-smi",
|
||||
"container": "<strong>Un LXC existant.</strong> Le script n’en crée pas. Les deux modes sont pris en charge ; un conteneur <strong>privilégié</strong> n’est pas toujours requis. Périphériques et droits numériques de l’application doivent correspondre."
|
||||
},
|
||||
"unpriv": {
|
||||
"title": "Compatible avec les conteneurs privilégiés et non privilégiés",
|
||||
"body": "Le script écrit les entrées <code>dev<N></code> dans la configuration LXC et, sur les conteneurs non privilégiés, aligne les GIDs <code>video</code> et <code>render</code> entre l'hôte et le conteneur de sorte que les nœuds de périphérique GPU soient accessibles de l'intérieur sans que vous ayez à éditer manuellement <code>lxc.idmap</code>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Exécuter l’installateur",
|
||||
"body": "Ouvrez ProxMenux et choisissez <strong>Matériel : GPU et Coral-TPU → Ajouter un GPU à LXC</strong>.",
|
||||
"imageAlt": "Option du menu pour ajouter un GPU à LXC"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Déroulement du script",
|
||||
"body": "Choisissez conteneur et familles GPU, puis passez les contrôles. Le traitement arrête et modifie ensuite le conteneur sans confirmation finale supplémentaire. Le nettoyage VFIO facultatif est confirmé séparément et peut modifier l’hôte auparavant."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Étapes de la procédure",
|
||||
"detect": {
|
||||
"title": "Détecter les GPU hôtes",
|
||||
"body": "Cherche les contrôleurs GPU avec <code>lspci</code>. Pour NVIDIA, vérifie le module <code>nvidia</code> et <code>nvidia-smi</code> ; la version détectée détermine l’installateur <code>.run</code> du conteneur.",
|
||||
"tipTitle": "NVIDIA pas prêt?",
|
||||
"tipBody": "Si le module ou NVIDIA ne fonctionne pas sur l’hôte, utilisez d’abord <nvidiaLink>Installer les pilotes NVIDIA sur l’hôte</nvidiaLink>, puis vérifiez le pilote."
|
||||
},
|
||||
"pickCt": {
|
||||
"title": "Choisir un conteneur LXC",
|
||||
"body": "Liste les conteneurs LXC admissibles par ID et nom ; les conteneurs OCI sont exclus et utilisent OCI manager Apps pour leurs périphériques. Le conteneur est arrêté s’il est en cours d’exécution, démarré pour l’installation des pilotes, puis retrouve normalement son état initial (en marche/arrêté).",
|
||||
"imageAlt": "Sélection d’un conteneur LXC existant"
|
||||
},
|
||||
"selectGpu": {
|
||||
"title": "Sélectionner les familles de GPU",
|
||||
"body": "La liste choisit des familles de fabricants, pas un périphérique PCI isolé. Intel/AMD ajoutent les nœuds DRI prévus ; NVIDIA ses périphériques disponibles, pouvant couvrir plusieurs cartes. Une seule famille est choisie automatiquement. Vérifiez la liste finale, surtout avec plusieurs GPU.",
|
||||
"imageAlt": "Liste des familles GPU détectées avec nom et adresse PCI"
|
||||
},
|
||||
"preflight": {
|
||||
"title": "Vérifications préalables",
|
||||
"imageAlt": "Proposition de changement de mode d’un GPU lié à vfio-pci",
|
||||
"intro": "Trois contrôles, qui peuvent vous bloquer ou vous rediriger :",
|
||||
"items": [
|
||||
"<strong>Contrôle SR-IOV.</strong> L’assistant bloque une VF ou une PF avec VF actives. C’est une limite de sa sélection large de périphériques, pas une interdiction générale dans LXC. Configurez-les séparément.",
|
||||
"<strong>Lié à vfio-pci.</strong> Le pilote natif ne peut pas créer <code>/dev/dri/*</code> ou <code>/dev/nvidia*</code>. Propose <switchLink>Changer le mode GPU</switchLink> ; suivez les indications de redémarrage avant de revenir.",
|
||||
"<strong>Déjà configuré.</strong> Si tous les périphériques sont présents, quitte sans réinstaller les bibliothèques. Continue seulement pour les familles sélectionnées manquantes."
|
||||
]
|
||||
},
|
||||
"applyConfig": {
|
||||
"title": "Appliquer les modifications de configuration LXC",
|
||||
"body1": "Arrête le conteneur s’il est en cours d’exécution et modifie <code>/etc/pve/lxc/<ctid>.conf</code>. Les entrées numérotées <code>dev<N></code> portent le GID hôte de <code>video</code> ou <code>render</code>. Les lignes bind <code>lxc.mount.entry</code> existantes pour <code>/dev/dri</code> sont remplacées par des entrées <code>dev:</code> ; vérifiez la configuration et les droits obtenus.",
|
||||
"body2": "Exemple après Intel + NVIDIA sur le même conteneur:"
|
||||
},
|
||||
"installDrivers": {
|
||||
"title": "Démarrer le conteneur et installer les pilotes à l'intérieur",
|
||||
"body": "Démarre le conteneur et attend environ 30 secondes au maximum que <code>pct exec</code> réponde. Détecte la distribution via <code>/etc/os-release</code> et installe les paquets adaptés.",
|
||||
"headerDistro": "Distribution",
|
||||
"headerInt": "Intel / AMD",
|
||||
"headerNvidia": "NVIDIA",
|
||||
"rows": [
|
||||
{
|
||||
"distro": "Alpine",
|
||||
"intel": "apk add mesa-va-gallium intel-media-driver libva-utils",
|
||||
"nvidia": "apk add nvidia-utils"
|
||||
},
|
||||
{
|
||||
"distro": "Arch / Manjaro",
|
||||
"intel": "pacman -Sy intel-media-driver mesa libva-utils",
|
||||
"nvidia": "pacman -Sy nvidia-utils"
|
||||
}
|
||||
],
|
||||
"debianDistro": "Debian / Ubuntu / autres",
|
||||
"debianIntel": "apt-get install va-driver-all intel-opencl-icd vainfo",
|
||||
"debianNvidia": "Extrait <code>.run</code> sur l’hôte → <code>pct push</code> → installe avec <code>--no-kernel-modules --no-dkms</code>.",
|
||||
"whyTitle": "Pourquoi utiliser l’installateur NVIDIA .run sous Debian",
|
||||
"whyBody": "Les paquets peuvent ne pas correspondre à l’hôte. Les bibliothèques <strong>doivent correspondre au module hôte chargé</strong> pour NVML et <code>nvidia-smi</code>. Debian/glibc utilise le <code>.run</code> de cette version en cache, l’extrait et l’archive sur l’hôte, le transfère avec <code>pct push</code> et installe avec <code>--no-kernel-modules --no-dkms</code>. Alpine et Arch utilisent leurs dépôts ; vérifiez les versions."
|
||||
},
|
||||
"alignGids": {
|
||||
"title": "Aligner les GID et restaurer l'état",
|
||||
"body1": "Pour Intel/AMD, lit les GID hôte de <code>video</code> et <code>render</code>, avec 44/104 uniquement comme valeurs de secours, puis modifie <code>/etc/group</code> dans le conteneur pour qu’ils correspondent ; les exécutions NVIDIA seul sautent cette étape. Des entrées comme <code>video:44</code> et <code>render:104</code> sont des exemples, pas des ID universels. Vérifiez l’appartenance de l’application aux groupes et les droits effectifs sur les périphériques.",
|
||||
"body2": "À la fin normale, un conteneur initialement arrêté est de nouveau arrêté ; un conteneur actif reste actif. En cas d’échec de démarrage ou d’installation, vérifiez l’état final et le journal."
|
||||
}
|
||||
},
|
||||
"vendors": {
|
||||
"heading": "Notes par fabricant",
|
||||
"intelHeading": "Intel iGPU",
|
||||
"intelBody": "L’accélération multimédia Intel, dont <em>Quick Sync</em>, dépend de la génération du GPU, des codecs et de la configuration de l’application. Le script partage ceux de <code>/dev/dri/card0</code>, <code>card1</code>, <code>renderD128</code> et <code>renderD129</code> qui existent ; les autres numéros de nœud ne sont pas ajoutés. L’hôte doit déjà les fournir via son pilote natif, par exemple <code>i915</code>.",
|
||||
"amdHeading": "AMD",
|
||||
"amdBody": "AMD utilise DRI pour Mesa/VA-API. Si <code>/dev/kfd</code> existe sur l’hôte, le partage aussi. ROCm/OpenCL exige matériel et bibliothèques compatibles ; partager le périphérique n’installe pas toute la pile ROCm.",
|
||||
"nvidiaHeading": "NVIDIA",
|
||||
"nvidiaBody": "Partage les périphériques <code>/dev/nvidia*</code>. <strong>La concordance des versions</strong> est essentielle pour <code>nvidia-smi</code>. Debian/glibc utilise le <code>.run</code> de la version hôte, Alpine/Arch leurs dépôts. Sous 2048 MiB de RAM configurée, la procédure Debian propose une hausse temporaire puis restaure la valeur ; exige aussi 1500 MiB libres sur disque.",
|
||||
"updateTitle": "Après mise à jour NVIDIA sur l’hôte, vérifiez les bibliothèques LXC",
|
||||
"updateBody": "D’anciennes bibliothèques peuvent provoquer une erreur dans <code>nvidia-smi</code>. L’<nvidiaLink>installateur NVIDIA de l’hôte</nvidiaLink> propose de mettre à jour les conteneurs. Relancer l’ajout peut quitter si les périphériques existent déjà : cela ne garantit pas la mise à jour. Vérifiez les versions et actualisez les paquets ou l’installation utilisateur adaptée."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Vérification",
|
||||
"body": "Dans le conteneur, vérifiez que le GPU est visible et utilisable."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Dépannage",
|
||||
"mismatchTitle": "nvidia-smi: Failed to initialize NVML: Driver/library version mismatch",
|
||||
"mismatchBody": "Les bibliothèques ne correspondent pas au module chargé. Vérifiez les versions et mettez à jour l’espace utilisateur LXC. Le <code>.run</code> en cache sert à Debian/glibc, mais l’ajout peut quitter si tous les périphériques existent déjà.",
|
||||
"denyTitle": "Autorisation refusée sur /dev/dri/renderD128 à l'intérieur du conteneur",
|
||||
"denyBody": "Vérifiez périphérique et droits numériques de <code>render</code>, puis l’appartenance de l’utilisateur à <code>render</code>. Si disponible, ajoutez-le à <code>render</code> avec <code>usermod -aG render <user></code> en remplaçant le marqueur par le compte réel. Redémarrez sa session. Changer de privilèges n’est pas une solution générale.",
|
||||
"vainfoTitle": "vainfo dit: VA-API version 1.xx; a échoué à initialiser",
|
||||
"vainfoBody": "Vérifiez accès et pilote VA-API. Les noms varient selon la distribution : par exemple <code>intel-media-driver</code> pour les Intel récents pris en charge, <code>i965-va-driver</code> pour les anciens compatibles, <code>mesa-va-drivers</code> pour AMD. Le message seul ne prouve pas un paquet manquant.",
|
||||
"logTitle": "Journal d’installation",
|
||||
"logBody": "Chaque exécution écrit <code>/tmp/add_gpu_lxc.log</code> sur l’hôte. Joignez le journal aux demandes d’aide."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Voir aussi",
|
||||
"items": [
|
||||
{
|
||||
"label": "Installer les pilotes NVIDIA (host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — installez le pilote hôte avant de partager NVIDIA."
|
||||
},
|
||||
{
|
||||
"label": "Ajouter GPU à VM (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — solution pour réserver un GPU à une VM."
|
||||
},
|
||||
{
|
||||
"label": "Changer le mode GPU (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — basculer le GPU entre partage LXC et attribution VM."
|
||||
},
|
||||
{
|
||||
"label": "commandes GPU Passthrough",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": "— référence rapide pour les commandes shell connexes."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,203 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Installer Coral TPU sur l’hôte | Documentation ProxMenux",
|
||||
"description": "Installe les composants Coral sur Proxmox VE selon le matériel détecté : gasket/apex avec DKMS pour M.2 / Mini-PCIe, libedgetpu1-std pour USB. Exécute les deux procédures si les deux types sont détectés."
|
||||
},
|
||||
"header": {
|
||||
"title": "Installer Coral TPU sur l’hôte",
|
||||
"description": "Préparez l’hôte Proxmox pour Coral et le partage LXC. Détecte M.2 / Mini-PCIe, USB ou les deux, puis installe les modules DKMS pour PCIe et l’environnement Google Edge TPU pour USB.",
|
||||
"section": "Matériel : GPU et Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Fonctionnement",
|
||||
"body": "Un <strong>installateur unique détectant le matériel</strong>. PCIe utilise <code>gasket</code> et <code>apex</code> avec DKMS ; les compilations futures nécessitent sources et en-têtes compatibles. USB utilise <code>libedgetpu1-std</code>. Les deux procédures s’exécutent si les deux types sont détectés. L’environnement USB doit être là où tourne l’application ; il n’est pas nécessairement requis sur l’hôte pour un usage LXC seul."
|
||||
},
|
||||
"which": {
|
||||
"heading": "Quel Coral ai-je ?",
|
||||
"body": "Les modèles PCIe et USB diffèrent par leur format et leurs besoins. Le script gère les deux ; identifiez votre périphérique avant de le lancer.",
|
||||
"headerForm": "Facteur de forme",
|
||||
"headerDetect": "Détection",
|
||||
"headerInstall": "Type d’installation",
|
||||
"headerReboot": "Redémarrer ?",
|
||||
"pcieForm": "M.2 / Mini-PCIe",
|
||||
"pcieFormSub": "(cartes M.2 avec un ou deux Edge TPU)",
|
||||
"pcieDetect": "Identifiant fabricant PCI <code>1ac1</code>",
|
||||
"pcieInstall": "Module noyau (gasket + apex) via DKMS",
|
||||
"pcieReboot": "Oui",
|
||||
"usbForm": "Accélérateur USB",
|
||||
"usbFormSub": "(petit dongle en plastique)",
|
||||
"usbDetect": "USB <code>1a6e:089a</code> (non programmé) / <code>18d1:9302</code> (programmé)",
|
||||
"usbInstall": "Environnement utilisateur <code>libedgetpu1-std</code> du dépôt APT Google",
|
||||
"usbReboot": "Non"
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Avant de commencer",
|
||||
"coral": "<strong>Un Coral connecté</strong> (M.2, Mini-PCIe ou USB) pour installer. Sans matériel détecté, le script peut nettoyer ou retirer une installation existante, mais n’installe pas de nouvelle prise en charge matérielle.",
|
||||
"coralCheck": "lspci -d 1ac1: ; lsusb | grep -E '1a6e:089a|18d1:9302'",
|
||||
"internet": "<strong>Accès à Internet</strong> sur l’hôte pour cloner le pilote PCIe depuis GitHub ou télécharger <code>libedgetpu1-std</code> depuis le dépôt APT Google pour USB.",
|
||||
"headers": "<strong>En-têtes du noyau disponibles via APT</strong> : <code>proxmox-headers-$(uname -r)</code>. Requis seulement pour PCIe/M.2 ; le script les installe.",
|
||||
"reboot": "<strong>Prévoyez un redémarrage</strong> pour PCIe. Le script tente de charger les modules compilés ; redémarrer vérifie aussi leur chargement automatique."
|
||||
},
|
||||
"hostPrepTip": {
|
||||
"title": "Cela ne prépare que l'hôte",
|
||||
"body": "Prépare l’hôte pour <em>accéder au périphérique</em>, sans configurer ni tester l’application. Pour <em>utiliser</em> Coral dans une application compatible comme Frigate, suivez <lxcLink>Ajouter Coral TPU à un LXC</lxcLink>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Exécuter l’installateur",
|
||||
"body": "Ouvrez ProxMenux sur l’hôte et choisissez <strong>Matériel : GPU et Coral-TPU → Installer/mettre à jour Coral TPU sur l’hôte</strong>.",
|
||||
"imageAlt": "Option du menu pour installer ou mettre à jour Coral TPU sur l’hôte"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Déroulement du script",
|
||||
"body": "Détecte d’abord le matériel et prépare le plan adapté. L’installation nécessite une confirmation."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Étapes de la procédure",
|
||||
"detect": {
|
||||
"title": "Détection du matériel",
|
||||
"body": "Cherche le fabricant <code>0x1ac1</code> dans <code>/sys/bus/pci/devices/*/vendor</code> et utilise <code>lsusb</code> pour USB. Il existe <strong>deux</strong> identifiants USB selon l’état du micrologiciel :",
|
||||
"items": [
|
||||
"<code>1a6e:089a</code> — Global Unichip, état <em>non programmé</em>, avant le chargement du micrologiciel par l’environnement d’exécution.",
|
||||
"<code>18d1:9302</code> — Google, état <em>programmé</em>, après chargement du micrologiciel."
|
||||
],
|
||||
"outro": "Sans Coral détecté ni installation existante, le script affiche un message et se termine. Des composants présents peuvent ouvrir le menu de nettoyage ou de suppression."
|
||||
},
|
||||
"prompt": {
|
||||
"title": "Confirmation de l’installation",
|
||||
"body": "Avant l’installation, une boîte de dialogue présente les périphériques et composants prévus. Annuler ignore l’installation. Le nettoyage facultatif des anciens composants possède sa propre confirmation préalable.",
|
||||
"imageAlt": "Résumé des périphériques Coral et des étapes d’installation"
|
||||
},
|
||||
"pcie": {
|
||||
"title": "PCIe : modules gasket et apex via DKMS",
|
||||
"body": "Exécuté uniquement pour un Coral PCIe/M.2 détecté. Compile les modules pour le noyau actuellement exécuté sur l’hôte.",
|
||||
"items": [
|
||||
"<strong>Nettoyage.</strong> Tout paquet <code>gasket-dkms</code> existant est supprimé avant la recompilation ; s’il est dans un état de paquet défectueux, le script force sa suppression et sa purge.",
|
||||
"<strong>Dépendances de compilation :</strong> <code>git</code>, <code>dkms</code>, <code>build-essential</code>, <code>proxmox-headers-$(uname -r)</code>."
|
||||
],
|
||||
"cloneIntro": "<strong>Clone les sources du pilote.</strong> Préfère <feranickLink>feranick/gasket-driver</feranickLink>, sinon utilise <googleLink>google/gasket-driver</googleLink>. La compilation dépend de la compatibilité du noyau. Les sources Google reçoivent ces correctifs selon la version :",
|
||||
"kernelPatches": [
|
||||
"À partir du noyau 6.5, le correctif remplace <code>no_llseek</code> par <code>noop_llseek</code> dans les sources de secours.",
|
||||
"Noyau 6.13 ou supérieur : transforme l’argument de <code>MODULE_IMPORT_NS(DMA_BUF)</code> en chaîne littérale."
|
||||
],
|
||||
"afterItems": [
|
||||
"<strong>Copie les sources dans <code>/usr/src/gasket-1.0/</code>,</strong> génère <code>dkms.conf</code> et les enregistre avec <code>dkms add</code>.",
|
||||
"<strong>Compile et installe :</strong> <code>dkms build</code>, puis <code>dkms install</code>. En cas d’échec, affiche les 50 dernières lignes de <code>make.log</code> si disponible.",
|
||||
"<strong>Crée le groupe <code>apex</code> et les règles udev</strong> (<code>/etc/udev/rules.d/99-coral-apex.rules</code>) pour attribuer le groupe à <code>/dev/apex_*</code>.",
|
||||
"<strong>Tente de charger les modules :</strong> <code>modprobe gasket</code> et <code>modprobe apex</code>."
|
||||
],
|
||||
"imageAlt": "Compilation DKMS et chargement des modules gasket/apex"
|
||||
},
|
||||
"usb": {
|
||||
"title": "USB : environnement Edge TPU de Google",
|
||||
"body": "Ne fonctionne que si un accélérateur USB a été détecté. Bien plus simple :",
|
||||
"items": [
|
||||
"<strong>Ajoute la clé GPG Google</strong> dans <code>/etc/apt/keyrings/coral-edgetpu.gpg</code>.",
|
||||
"<strong>Ajoute le dépôt APT</strong> dans <code>/etc/apt/sources.list.d/coral-edgetpu.list</code> ; <code>signed-by=</code> limite la vérification à son trousseau. Il s’agit du format .list sur une ligne, pas du format deb822 .sources.",
|
||||
"<strong>Installe <code>libedgetpu1-std</code></strong>, l’environnement Edge TPU aux performances standard.",
|
||||
"<strong>Recharge udev</strong> et applique les règles du paquet au périphérique USB."
|
||||
],
|
||||
"stdTitle": "Pourquoi libedgetpu1-std et pas libedgetpu1-max ?",
|
||||
"stdBody": "Le paquet <code>max</code> active la fréquence maximale prise en charge, avec davantage de performances, de consommation et de chaleur. Vérifiez le refroidissement et les conditions d’utilisation. Les paquets sont mutuellement exclusifs ; changez avec <code>apt install libedgetpu1-max</code>."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Redémarrage proposé après l’installation PCIe",
|
||||
"body": "Après PCIe, propose un redémarrage. Le script a tenté <code>modprobe</code> ; vérifiez les modules et <code>/dev/apex_0</code> avec le groupe <code>apex</code>. Un redémarrage planifié vérifie le chargement automatique. USB seul ne demande pas de redémarrer l’hôte.",
|
||||
"imageAlt": "Résumé et proposition de redémarrage après installation PCIe"
|
||||
}
|
||||
},
|
||||
"legacyCleanup": {
|
||||
"heading": "Nettoyer l’ancien gasket-dkms sur les hôtes utilisant seulement USB",
|
||||
"intro": "Si <strong>aucun Coral PCIe/M.2 n’est détecté</strong> mais qu’une ancienne installation de <code>gasket-dkms</code> existe, propose un nettoyage facultatif avec confirmation.",
|
||||
"items": [
|
||||
"Si un Coral PCIe/M.2 est détecté, suit la procédure normale de recompilation DKMS et ne propose pas ce nettoyage.",
|
||||
"Purge <code>gasket-dkms</code>, supprime les anciennes entrées DKMS et sources gasket, puis répare l’état en attente de <code>dpkg</code>/APT.",
|
||||
"Conserve les paquets USB <code>libedgetpu1-std</code> et <code>libedgetpu1-max</code>, donc le Coral USB garde son environnement d’exécution.",
|
||||
"Le script vérifie que le paquet héritage a disparu et que la gestion du paquet est saine avant de signaler le succès."
|
||||
],
|
||||
"warningTitle": "Confirmez d'abord le matériel",
|
||||
"warningBody": "Si un Coral PCIe/M.2 attendu n’apparaît pas, annulez le nettoyage et vérifiez carte, emplacement et micrologiciel."
|
||||
},
|
||||
"reinstallUninstall": {
|
||||
"heading": "Réinstaller ou désinstaller",
|
||||
"intro": "Si une installation PCIe avec <code>gasket-dkms</code>, USB avec <code>libedgetpu1-std</code>/<code>libedgetpu1-max</code> ou les deux est détectée, affiche un menu d’actions.",
|
||||
"imageAlt": "Menu pour réinstaller, mettre à jour ou désinstaller Coral",
|
||||
"imageCaption": "Le menu apparaît si un composant existe : entrée DKMS gasket, paquet <code>libedgetpu1-*</code> ou périphériques <code>/dev/apex_*</code>.",
|
||||
"reinstallHeading": "Réinstaller / mettre à jour",
|
||||
"reinstallBody": "Suit l’installation normale : recompile après changement de noyau ou met à jour <code>libedgetpu1-*</code> depuis Google. Nettoie d’abord l’ancien état DKMS pour qu’une installation échouée ne bloque pas la compilation.",
|
||||
"uninstallHeading": "Désinstaller — ce qui est enlevé",
|
||||
"uninstallIntro": "Nécessite une confirmation. Les applications LXC utilisant <code>/dev/apex_*</code> peuvent perdre l’accès pendant la suppression ou après redémarrage. Étapes :",
|
||||
"uninstallItems": [
|
||||
"Tente de décharger <code>apex</code> et <code>gasket</code> ; leur utilisation peut empêcher le retrait.",
|
||||
"Supprime chaque entrée DKMS enregistrée <code>gasket/<version></code> afin que les modules ne reviennent pas sur le prochain noyau installé.",
|
||||
"Purge <code>gasket-dkms</code>, <code>libedgetpu1-std</code> et <code>libedgetpu1-max</code>, puis exécute <code>apt-get autoremove --purge</code>.",
|
||||
"Supprime <code>/etc/udev/rules.d/99-coral-apex.rules</code> et restaure le groupe par défaut de <code>60-gasket-dkms.rules</code> si ce fichier existe encore.",
|
||||
"Vérifie les membres supplémentaires de <code>apex</code>. <strong>Si la liste est vide</strong>, tente de supprimer le groupe ; sinon conserve <code>apex</code> et liste ses membres. Ce n’est pas une vérification complète des utilisateurs dont c’est le groupe principal.",
|
||||
"Supprime la liste de dépôts <code>/etc/apt/sources.list.d/coral-edgetpu.list</code>, l’ancien <code>coral-cloud.list</code> et les anciens trousseaux nommés <code>coral-edgetpu-archive-keyring.gpg</code>. Le trousseau actuel <code>/etc/apt/keyrings/coral-edgetpu.gpg</code> n’est pas supprimé par cette séquence.",
|
||||
"Propose un redémarrage <strong>seulement si PCIe était installé</strong> pour retirer les modules encore actifs. USB seul ne nécessite pas de redémarrage."
|
||||
],
|
||||
"lxcWarnTitle": "Récipients LXC avec passage apex",
|
||||
"lxcWarnBody": "Retirer les composants de l’hôte peut interrompre l’accès LXC. Prévoyez une maintenance si des applications compatibles comme Frigate dépendent de ce Coral."
|
||||
},
|
||||
"updates": {
|
||||
"heading": "Notifications de mise à jour",
|
||||
"intro": "ProxMenux recense les composants Coral et vérifie PCIe/M.2 et USB séparément. Si les deux sont présents, chaque variante utilise sa propre source de versions :",
|
||||
"headerVariant": "Variante",
|
||||
"headerTracked": "Version enregistrée",
|
||||
"headerUpstream": "Source des versions",
|
||||
"pcieVariant": "PCIe / M.2",
|
||||
"pcieTracked": "D’abord l’étiquette enregistrée après installation, puis la version d’un paquet <code>gasket-dkms</code> sain, sinon celle du module DKMS. Cette dernière n’indique pas le niveau de correctifs du fork.",
|
||||
"pcieUpstream": "Dernière étiquette GitHub de <code>feranick/gasket-driver</code> ; cache de sept jours et comparaison du numéro de compilation.",
|
||||
"usbVariant": "USB",
|
||||
"usbTracked": "<code>libedgetpu1-std</code> ou <code>libedgetpu1-max</code> version apt",
|
||||
"usbUpstream": "Candidat local <code>apt-cache policy</code> (Google Coral apt repo)",
|
||||
"outro": "Si une nouvelle version est détectée, Monitor envoie <code>coral_driver_update_available</code> sur les canaux activés. La notification renvoie à l’installateur : choisissez <strong>Réinstaller / mettre à jour</strong>.",
|
||||
"antiTitle": "Sans notifications répétitives",
|
||||
"antiBody": "Une notification par variante lorsque la version disponible change. Pas de répétition à chaque contrôle quotidien ; un nouvel avis attend une version ultérieure.",
|
||||
"rebootTitle": "Mises à jour PCIe : prévoyez un redémarrage",
|
||||
"rebootBody": "Le module PCIe recompilé doit être chargé ; un redémarrage planifié vérifie aussi le chargement automatique. La bibliothèque USB ne nécessite pas de redémarrer l’hôte, mais les applications utilisant l’ancienne version peuvent devoir redémarrer."
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Procédure manuelle équivalente",
|
||||
"intro": "Ces commandes présentent les principales étapes de chaque procédure pour consultation ou exécution manuelle.",
|
||||
"pcieHeading": "PCIe / M.2 (gasket + apex via DKMS)",
|
||||
"usbHeading": "USB (environnement libedgetpu)"
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Vérification",
|
||||
"pcieHeading": "PCIe / M.2",
|
||||
"usbHeading": "USB"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Dépannage",
|
||||
"dkmsFailTitle": "Échec de compilation DKMS après mise à jour du noyau",
|
||||
"dkmsFailBody": "Des en-têtes manquants sont une cause possible. Vérifiez <code>proxmox-headers-$(uname -r)</code> avec <code>dpkg -l proxmox-headers-$(uname -r)</code> et installez-les si nécessaire. Consultez le journal pour les incompatibilités du noyau. Relancer appelle <code>cleanup_broken_gasket_dkms</code>, sans garantir la compatibilité avec tout noyau.",
|
||||
"apexMissTitle": "/dev/apex_0 manquant après redémarrage",
|
||||
"apexMissBody": "Vérifiez la détection PCIe et la correspondance module/noyau actif. Essayez <code>modprobe apex</code> et consultez <code>dmesg | grep -iE \"apex|gasket\"</code>. Compilation, chargement ou configuration de l’emplacement/du micrologiciel peuvent empêcher la création du périphérique.",
|
||||
"lxcMissTitle": "L’hôte voit /dev/apex_0, mais pas le LXC",
|
||||
"lxcMissBody": "Un nœud visible ne prouve pas le fonctionnement. Vérifiez l’accès sur l’hôte, le montage LXC, les règles cgroup et les droits UID/GID. Voir <lxcLink>Ajouter Coral TPU à un LXC</lxcLink>.",
|
||||
"usbUnreachTitle": "Accélérateur USB détecté mais Frigate / TFLite ne peut pas l'atteindre",
|
||||
"usbUnreachBody": "Vérifiez les règles de <code>libedgetpu1-std</code> et les droits avec <code>ls -l /dev/bus/usb/*/*</code>. L’utilisateur/groupe mappé de l’application doit pouvoir lire et écrire ; root propriétaire n’est pas une erreur en soi. Après modification, exécutez <code>udevadm control --reload-rules && udevadm trigger</code> puis reconnectez si nécessaire.",
|
||||
"logTitle": "Journal d’installation",
|
||||
"logBody": "Chaque exécution écrit <code>/tmp/coral_install.log</code>. En cas d’échec DKMS, ajoute les 50 dernières lignes de <code>/var/lib/dkms/gasket/1.0/build/make.log</code> si disponible. Joignez le journal à la demande d’aide."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Voir aussi",
|
||||
"items": [
|
||||
{
|
||||
"label": "Ajouter un Coral TPU à LXC",
|
||||
"href": "/docs/hardware/coral-tpu-lxc",
|
||||
"tail": " — donner accès au Coral de l’hôte à un conteneur avec une application compatible."
|
||||
},
|
||||
{
|
||||
"label": "Installer les pilotes NVIDIA (host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — la même démarche pour les GPU NVIDIA."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor — Onglet matériel",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — le panneau Coral présente pilote, modules, périphériques et environnement d’exécution, plus la température si un capteur pris en charge la fournit."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,175 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Installer NVIDIA sur l’hôte | Documentation ProxMenux",
|
||||
"description": "Installez les pilotes propriétaires NVIDIA sur Proxmox VE avec ProxMenux : filtrage GPU, vérifications de compilation et DKMS, persistance, correctif NVENC facultatif et mise à jour des bibliothèques LXC."
|
||||
},
|
||||
"header": {
|
||||
"title": "Installer les pilotes NVIDIA sur l'hôte",
|
||||
"description": "Installez NVIDIA sur l’hôte Proxmox VE. Filtre les branches maintenues selon l’ID PCI du GPU, vérifie la compilation, utilise DKMS, gère nouveau et installe la persistance. Peut aussi actualiser les bibliothèques des LXC utilisant NVIDIA.",
|
||||
"section": "Matériel : GPU et Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Fonctionnement",
|
||||
"body": "ProxMenux détecte le GPU et propose des branches NVIDIA maintenues incluant son ID PCI. Il bloque <code>nouveau</code>, télécharge l’installateur officiel <code>.run</code>, utilise DKMS, installe <code>nvidia-persistenced</code>, les règles udev et le NVIDIA Container Toolkit, et propose un correctif NVENC facultatif. Les vérifications de compilation portent sur le noyau en cours ; une compilation réussie ne garantit pas que toutes les applications fonctionnent. Les LXC NVIDIA existants se voient proposer une mise à jour des bibliothèques userspace, de version correspondante sauf sous Arch."
|
||||
},
|
||||
"who": {
|
||||
"heading": "C'est pour qui ?",
|
||||
"body": "Pour le traitement vidéo ou le calcul GPU avec Plex, Jellyfin, Frigate, Immich ou Stable Diffusion <strong>dans LXC</strong>, installez d’abord NVIDIA sur l’<em>hôte</em> Proxmox. L’attribution directe à une <strong>VM</strong> utilise la procédure VFIO distincte."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Avant de commencer",
|
||||
"gpu": "<strong>Un GPU NVIDIA</strong> installé dans l’hôte. Détection automatique ; cette option ne gère ni AMD ni Intel.",
|
||||
"gpuCheck": "lspci | grep -i nvidia",
|
||||
"notVm": "Le GPU <strong>ne doit pas être réservé à une VM via VFIO</strong>. L’installateur refuse ce cas pour ne pas perturber l’affectation.",
|
||||
"internet": "Accès Internet sur l’hôte. Télécharge le pilote depuis <code>download.nvidia.com</code> et peut cloner <code>nvidia-persistenced</code> et <code>nvidia-patch</code> depuis GitHub.",
|
||||
"space": "Prévoyez de l’espace dans <code>/opt/nvidia</code> pour <code>.run</code> et de la RAM pour compiler. Le parcours LXC hors Arch vérifie 1500 MiB libres et peut demander temporairement 2048 MiB de RAM si nécessaire, puis restaure la limite précédente. Prévoyez le redémarrage hôte."
|
||||
},
|
||||
"vmWarn": {
|
||||
"title": "GPU réservé à une VM ? Arrêtez ici",
|
||||
"body": "Si un périphérique NVIDIA est lié à <code>vfio-pci</code>, l’installateur quitte, même VM arrêtée. Une réservation n’implique pas une utilisation active. Planifiez le retour au pilote hôte et retirez les anciennes affectations VM/VFIO avant redémarrage et installation."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Exécution de l'installateur",
|
||||
"body": "Ouvrez <strong>Hardware Graphics → NVIDIA GPU Driver Installer</strong> dans ProxMenux. Le menu dépend de la présence d’un pilote actif.",
|
||||
"imageAlt": "Menu matériel avec l’installateur NVIDIA sélectionné"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Déroulement du script",
|
||||
"body": "Détecte les périphériques, choisit une version et installe. Un nettoyage VFIO confirmé séparément peut précéder l’aperçu. La préparation des dépôts/en-têtes et le téléchargement précèdent le remplacement du pilote ; une seule confirmation finale ne marque pas le début de tous les changements."
|
||||
},
|
||||
"walkthrough": {
|
||||
"detect": {
|
||||
"title": "Détection et aperçu de GPU",
|
||||
"body1": "Affiche les contrôleurs vidéo NVIDIA, l’état du pilote ou <em>« Aucun pilote NVIDIA installé »</em>, et les LXC configurés pour NVIDIA avec leur version interne.",
|
||||
"body2": "Vérifiez GPU et versions hôte/conteneurs. Annulez dans l’aperçu si la sélection est inattendue ; un nettoyage VFIO confirmé auparavant a déjà été effectué.",
|
||||
"imageAlt": "Aperçu avant installation : GPU, pilote et LXC configurés pour NVIDIA"
|
||||
},
|
||||
"version": {
|
||||
"title": "Choisissez la version du pilote",
|
||||
"body1": "Filtre les versions de <code>nvidia.com</code> qui <strong>incluent l’ID PCI du GPU dans la table des puces compatibles</strong> et écarte les versions bêta/développement par heuristiques. <em><version> — Recommandée</em> privilégie la dernière version de la branche installée, puis Production Branch, puis le numéro compatible le plus élevé.",
|
||||
"body2": "Si le pilote est enregistré comme corrigé via keylase, le sélecteur se limite à la table NVENC. <em>Réinstaller / mettre à jour</em> comporte toujours les confirmations et le choix du correctif ; vérifiez le résultat.",
|
||||
"whyTitle": "Comment la compatibilité du noyau est validée",
|
||||
"whyBody": "Filtre selon les branches maintenues et l’ID PCI, sans matrice noyau/pilote fixe. Une compilation préalable teste le noyau actuel. Un échec confirmé revient au sélecteur ; un test indisponible peut avertir puis continuer. Installation finale et vérification du fonctionnement restent nécessaires.",
|
||||
"imageAlt": "Sélecteur des branches compatibles GPU avec recommandation en premier"
|
||||
},
|
||||
"uninstall": {
|
||||
"title": "Retirer l’ancien pilote avant réinstallation",
|
||||
"body": "Après téléchargement et vérification de l’installateur choisi, retire le pilote précédent. Arrête les services NVIDIA, décharge les modules, retire les entrées DKMS et purge <code>nvidia-*</code> / <code>libnvidia-*</code> / <code>cuda-*</code>. Cela vaut aussi pour une réinstallation confirmée de la même version."
|
||||
},
|
||||
"prepare": {
|
||||
"title": "Préparer le système",
|
||||
"body": "Pendant la préparation, le script :",
|
||||
"items": [
|
||||
"Vérifie les dépôts avant suppression ou installation. Sans abonnement et avec Enterprise uniquement, demande l’accord pour passer à no-subscription ; un refus arrête l’installation.",
|
||||
"Installe <code>pve-headers-$(uname -r)</code> (ou <code>proxmox-headers-$(uname -r)</code>), <code>build-essential</code> et <code>dkms</code>.",
|
||||
"Crée le fichier géré par ProxMenux <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code> avec <code>blacklist nouveau</code> et <code>options nouveau modeset=0</code>. Enregistre l’éventuel ajout dans <code>blacklist.conf</code> et tente de décharger nouveau.",
|
||||
"Ecrit <code>/etc/modules-load.d/nvidia-vfio.conf</code> avec <code>nvidia</code> et <code>nvidia_uvm</code> afin que les modules se chargent tôt au démarrage."
|
||||
]
|
||||
},
|
||||
"download": {
|
||||
"title": "Téléchargez et exécutez l'installateur NVIDIA",
|
||||
"body": "Télécharge <code>NVIDIA-Linux-x86_64-<version>.run</code> dans <code>/opt/nvidia</code> et vérifie taille et type exécutable. Ces contrôles de format ne vérifient pas une signature cryptographique. Enregistre DKMS pour les changements de noyau ; sources et noyau doivent rester compatibles.",
|
||||
"imageAlt": "Progression du téléchargement et compilation DKMS de l’installateur NVIDIA"
|
||||
},
|
||||
"persist": {
|
||||
"title": "Service de persistance et règles udev",
|
||||
"body": "Installe <persistLink>nvidia-persistenced</persistLink> et écrit <code>/etc/udev/rules.d/70-nvidia.rules</code> pour créer <code>/dev/nvidia*</code> au démarrage. Cela évite qu’un LXC cherche le GPU avant la création des périphériques."
|
||||
},
|
||||
"nvenc": {
|
||||
"title": "Optionnel : appliquer le patch NVENC",
|
||||
"body": "Les limites de sessions NVENC dépendent du GPU et du pilote. <patchLink>keylase/nvidia-patch</patchLink> peut retirer la limite du pilote pour les versions prises en charge. Choisissez <strong>Oui</strong> si vous avez besoin de ce changement d’encodage et si votre version est compatible. Cela n’accélère pas le décodage ni ne supprime les limites matérielles.",
|
||||
"supportTitle": "Vérifier la compatibilité du correctif",
|
||||
"supportBody": "Vérifiez la version exacte dans la <patchTableLink>table des correctifs</patchTableLink>. Si elle manque, gardez le pilote sans correctif ou choisissez une autre version maintenue compatible GPU, noyau et correctif ; sa proximité dans la liste ne suffit pas."
|
||||
},
|
||||
"propagate": {
|
||||
"title": "Facultatif : actualiser les bibliothèques NVIDIA des LXC",
|
||||
"body1": "Propose les bibliothèques du pilote aux LXC détectés. Elles et le module hôte <strong>doivent avoir des versions correspondantes</strong> ; sinon <code>nvidia-smi</code> peut signaler « version mismatch ».",
|
||||
"body2": "Debian / Ubuntu et les autres conteneurs glibc reçoivent l’installateur <code>.run</code> extrait avec <code>--no-kernel-modules --no-dkms --no-install-compat32-libs</code> ; la RAM peut temporairement passer à 2 GiB puis être restaurée. <strong>Arch, Manjaro et EndeavourOS</strong> utilisent <code>pacman -Syu nvidia-utils</code> depuis leurs dépôts, sans fixer la version hôte : vérifiez le résultat. <strong>Alpine</strong> reçoit le contenu <code>.run</code> extrait via <code>pct push</code>, installe <code>gcompat</code> et <code>binutils</code> avec <code>apk</code> et crée les liens SONAME via <code>readelf</code>. Vérifiez le fonctionnement ; la couche de compatibilité ne garantit pas toutes les bibliothèques sous musl.",
|
||||
"imageAlt": "Dialogue des LXC NVIDIA et de leurs versions pour confirmer la mise à jour"
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Redémarrer",
|
||||
"body": "Après l’installation du pilote, le script reconstruit <code>initramfs</code> pour tous les noyaux ; sa dernière étape propose un redémarrage. <strong>Prévoyez ce redémarrage</strong> pour vérifier la configuration persistante des modules et la configuration nouveau lors d’un nouveau démarrage, même si le nouveau pilote répond déjà avant le redémarrage."
|
||||
}
|
||||
},
|
||||
"reinstallUninstall": {
|
||||
"heading": "Réinstaller ou désinstaller",
|
||||
"intro": "Si <code>nvidia</code> est chargé et que <code>nvidia-smi</code> renvoie une version, affiche un menu d’actions. Ce critère détecte un pilote actif ; des fichiers peuvent être installés sans module chargé.",
|
||||
"imageAlt": "Menu d'action NVIDIA offert lorsqu'un pilote est déjà installé — deux choix: réinstaller / mettre à jour le pilote, ou désinstaller complètement le pilote NVIDIA",
|
||||
"imageCaption": "Le menu action n'apparaît que lorsqu'un pilote NVIDIA est actuellement actif sur l'hôte.",
|
||||
"reinstallHeading": "Réinstaller / mettre à jour",
|
||||
"reinstallBody": "Choisit une version, prépare dépôts/en-têtes, télécharge et teste la compilation avant le remplacement du pilote. Permet une mise à jour dans la branche maintenue ou un autre choix compatible. Les options de bibliothèques LXC et de correctif NVENC réapparaissent ensuite.",
|
||||
"uninstallHeading": "Désinstaller — ce qui est enlevé",
|
||||
"uninstallIntro": "Après confirmation Oui/Non, retire les composants suivants :",
|
||||
"uninstallItems": [
|
||||
"Arrête et désactive <code>nvidia-persistenced</code> et <code>nvidia-powerd</code>, tente de décharger <code>nvidia_uvm</code>, <code>nvidia_drm</code>, <code>nvidia_modeset</code> et <code>nvidia</code>, puis exécute <code>nvidia-uninstall --silent</code> pour l’installation <code>.run</code>. Les charges de travail LXC dépendant de NVIDIA sont affectées ; des clients actifs peuvent empêcher le déchargement.",
|
||||
"Exécute <code>apt purge</code> sur <code>nvidia-*</code>, <code>libnvidia-*</code>, <code>cuda-*</code> et <code>libcudnn*</code>, supprime l'arborescence des sources DKMS et les dossiers <code>nvidia-persistenced</code> et <code>nvidia-patch</code> sous <code>/opt/nvidia</code>.",
|
||||
"Supprime la configuration de chargement des modules (<code>/etc/modules-load.d/nvidia-vfio.conf</code>) et les entrées de liste noire de nouveau gérées par ProxMenux. Les anciens fichiers ProxMenux de liste noire à deux lignes sont également migrés puis supprimés. Les fichiers modifiés ou indépendants de l’administrateur sont conservés.",
|
||||
"Retire <code>/etc/udev/rules.d/70-nvidia.rules</code> et marque NVENC <em>removed</em> dans le registre des installations gérées ; aucun fichier d’état séparé.",
|
||||
"Reconstruit <code>initramfs</code> pour tous les noyaux, exécute <code>proxmox-boot-tool refresh</code> selon l’amorçage et propose un redémarrage."
|
||||
],
|
||||
"lxcWarnTitle": "LXC avec accès NVIDIA",
|
||||
"lxcWarnBody": "Retirer le pilote hôte interrompt les applications LXC NVIDIA même si leurs bibliothèques restent installées. Prévoyez une maintenance pour Frigate, Plex, Jellyfin, Ollama et autres applications GPU."
|
||||
},
|
||||
"updates": {
|
||||
"heading": "Notifications de mises à jour",
|
||||
"body": "Le pilote NVIDIA est suivi dans le registre des installations gérées. Au démarrage et toutes les 24 heures, Monitor compare les versions de <code>download.nvidia.com/XFree86/Linux-x86_64/</code> à celle indiquée par <code>nvidia-smi</code>. Il notifie uniquement les nouvelles versions de maintenance de la branche installée.",
|
||||
"kindsHeading": "Message de mise à jour",
|
||||
"kindsItems": [
|
||||
"<strong>Maintenance de la même branche.</strong> Exemple : 580.65.06 installée → 580.105.08 disponible. Monitor ne déduit pas la compatibilité noyau entre branches."
|
||||
],
|
||||
"antiTitle": "Éviter les notifications répétées",
|
||||
"antiBody": "Une notification par nouvelle version, pas à chaque contrôle quotidien. Aucune notification sans version plus récente dans la branche installée.",
|
||||
"applyTitle": "Appliquer la mise à jour",
|
||||
"applyBody": "Monitor signale les mises à jour sans les installer automatiquement. Ouvrez l’installateur, choisissez <strong>Réinstaller / mettre à jour</strong> et une version compatible, puis terminez compilation et installation. Prévoyez le redémarrage proposé et vérifiez ensuite hôte et bibliothèques LXC."
|
||||
},
|
||||
"verify": {
|
||||
"heading": "Vérification de l'installation",
|
||||
"intro": "Après redémarrage de l’hôte, connectez-vous via SSH ou le shell Proxmox et exécutez :",
|
||||
"after": "Vérifiez le GPU et la version attendue. Des processus peuvent déjà apparaître si des services hôte ou conteneurs démarrés automatiquement utilisent le GPU. Vérifiez ensuite la persistance :",
|
||||
"imageAlt": "Sortie de nvidia-smi sur l'hôte montrant le GPU détecté et la version du pilote installé"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Dépannage",
|
||||
"smiFailTitle": "nvidia-smi affiche « NVIDIA-SMI has failed »",
|
||||
"smiFailBody": "Causes possibles : <strong>nouveau</strong>, <strong>en-têtes absents ou incompatibles</strong>, sources du pilote incompatibles ou autres erreurs de chargement. Examinez <code>lsmod | grep nouveau</code>, <code>dmesg | grep -i nvidia</code> et les journaux installateur/DKMS. Si la règle nouveau doit être corrigée, vérifiez <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code> avant <code>update-initramfs -u -k all</code> et redémarrage. Tout échec de compilation ne vient pas des en-têtes.",
|
||||
"lxcMissTitle": "Le conteneur LXC ne peut pas voir le GPU après la mise à jour de l'hôte",
|
||||
"lxcMissBody": "Avant de réinstaller, vérifiez périphériques hôte, droits LXC et version des bibliothèques. Un conflit de versions peut nécessiter le pilote utilisateur correspondant, selon la distribution ; sous glibc, avec <code>--no-kernel-modules</code>. Réinstaller les bibliothèques ne corrige pas les montages ou droits manquants.",
|
||||
"logTitle": "Vérifiez le journal d'installation",
|
||||
"logBody": "L’installation écrit dans <code>/tmp/nvidia_install.log</code>. En cas d’échec, examinez téléchargement, compilation DKMS et services. Joignez le journal au signalement GitHub."
|
||||
},
|
||||
"manualSteps": {
|
||||
"heading": "Vous cherchez les étapes manuelles?",
|
||||
"body": "Voir <guideLink>Guides → NVIDIA</guideLink> pour les étapes manuelles, dont <code>wget</code> et <code>./NVIDIA-Linux-...run</code>. Le guide explique les composants sans reproduire exactement l’installateur. La procédure maintenue ProxMenux apporte filtrage GPU, vérification de compilation, mises à jour LXC et contrôles VFIO."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Voir aussi",
|
||||
"items": [
|
||||
{
|
||||
"label": "Ajouter GPU à VM (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — attribuer NVIDIA directement à une VM via VFIO."
|
||||
},
|
||||
{
|
||||
"label": "Ajouter un GPU à LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — partager NVIDIA avec un ou plusieurs conteneurs."
|
||||
},
|
||||
{
|
||||
"label": "Changer de mode GPU (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — basculer entre passthrough VM et partage LXC."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor — Onglet matériel",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — fenêtre GPU ouvrant cet installateur et affichant le suivi en temps réel."
|
||||
},
|
||||
{
|
||||
"label": "Commandes de passthrough GPU",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": "— lspci / dmesg / IOMMU / nvidia-smi référence."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,172 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Changer de mode GPU (VM ↔ LXC) | Documentation ProxMenux",
|
||||
"description": "Basculez un GPU entre VFIO pour VM et pilote natif pour LXC. ProxMenux détecte le pilote, propose des choix pour les invités concernés, retire les affectations audio associées et reconstruit initramfs si la configuration hôte change."
|
||||
},
|
||||
"header": {
|
||||
"title": "Changer de mode GPU (VM ↔ LXC)",
|
||||
"description": "Basculez un GPU attribué entre passthrough VM et partage LXC. ProxMenux gère pilote, VFIO, modules et initramfs, puis demande comment traiter les invités concernés. Vérifiez les choix et la configuration obtenue après redémarrage.",
|
||||
"section": "Matériel : GPU et Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Fonctionnement",
|
||||
"body": "Avec <code>vfio-pci</code>, le GPU est réservé à une VM. Avec le pilote natif <em>(i915 / amdgpu / nvidia)</em>, l’hôte et les LXC peuvent le partager. <strong>Changer de mode GPU</strong> gère <code>vfio.conf</code>, les blocages de modules et les références des invités, et signale les affectations restantes."
|
||||
},
|
||||
"graphics": {
|
||||
"lxcTitle": "Prêt pour les conteneurs LXC",
|
||||
"lxcDesc": "Pilote natif actif",
|
||||
"vmTitle": "Prêt pour le passthrough VM",
|
||||
"vmDesc": "Pilote VFIO-PCI actif"
|
||||
},
|
||||
"when": {
|
||||
"heading": "Quand devrais-je utiliser ça ?",
|
||||
"intro": "À utiliser si le GPU est <strong>déjà attribué</strong> et que vous souhaitez changer son usage :",
|
||||
"headerSituation": "Situation actuelle",
|
||||
"headerUse": "Vous utilisez cette page ?",
|
||||
"rows": [
|
||||
{
|
||||
"situation": "GPU libre, jamais attribué : l’utiliser dans une VM.",
|
||||
"useRich": "Non — utilisez <vmLink>Ajouter un GPU à VM</vmLink>"
|
||||
},
|
||||
{
|
||||
"situation": "GPU libre, jamais attribué : l’utiliser dans un LXC.",
|
||||
"useRich": "Non — utilisez <lxcLink>Ajouter un GPU à LXC</lxcLink>"
|
||||
},
|
||||
{
|
||||
"situationRich": "Le GPU est attribué à une VM via <code>vfio-pci</code> ; je veux plutôt l’utiliser dans un LXC.",
|
||||
"useRich": "<strong>Oui — cette page.</strong>"
|
||||
},
|
||||
{
|
||||
"situation": "Le GPU est partagé avec un LXC ; je veux le réserver à une VM.",
|
||||
"useRich": "<strong>Oui — cette page.</strong>"
|
||||
},
|
||||
{
|
||||
"situation": "Je veux retirer toutes les affectations de ce GPU.",
|
||||
"use": "Le mode LXC rend le GPU au pilote hôte ; la politique de conflit VM peut retirer les entrées hostpci, mais les entrées de périphérique LXC doivent être retirées séparément. Le GPU reste associé à un pilote."
|
||||
}
|
||||
]
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Avant de commencer",
|
||||
"assigned": "<strong>Un GPU déjà attribué</strong> à une VM via VFIO ou à un LXC. Pour la première affectation, utilisez Ajouter un GPU à VM / LXC.",
|
||||
"iommu": "<strong>IOMMU doit être actif sur l’hôte</strong> pour passer <em>au</em> mode VM. Les réglages du firmware et la prise en charge par le noyau comptent tous les deux. Si <code>intel_iommu=on</code> ou <code>amd_iommu=on</code> manque dans le noyau en cours, le script l’ajoute avec <code>iommu=pt</code> à <code>/etc/kernel/cmdline</code> (marqueur de racine ZFS) ou à <code>/etc/default/grub</code>, puis exécute <code>proxmox-boot-tool refresh</code> ou <code>update-grub</code>. Vérifiez les éventuels avertissements et redémarrez si demandé.",
|
||||
"iommuCheck": "dmesg | grep -i 'IOMMU enabled' | head -1",
|
||||
"reboot": "<strong>Prévoyez un redémarrage.</strong> Les changements persistants de pilote et d’amorçage peuvent nécessiter de reconstruire initramfs puis de redémarrer. Le script le demande à la fin.",
|
||||
"knowList": "<strong>Identifiez les VM et LXC utilisant le GPU.</strong> Le script détecte les références et demande quoi faire pour chaque invité ; connaître la liste facilite la vérification."
|
||||
},
|
||||
"blocklist": {
|
||||
"title": "Tous les GPU ne sont pas sûrs de passer à un VM",
|
||||
"body": "Le script bloque le mode VM pour les identifiants de périphérique <code>8086:5a84</code> et <code>8086:5a85</code> selon sa politique de compatibilité. Si un GPU sélectionné correspond, il interrompt le passage en mode VM et revient à la sélection du GPU, ou quitte s’il s’agit du seul GPU. Cette liste de blocage n’empêche pas de passer <em>au</em> mode LXC ; d’autres contrôles peuvent encore s’appliquer."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Exécuter le script",
|
||||
"body": "Ouvrez <strong>Matériel : GPU et Coral-TPU → Changer de mode GPU (VM ↔ LXC)</strong> dans ProxMenux.",
|
||||
"imageAlt": "Option Changer de mode GPU (VM ↔ LXC) du menu matériel"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Déroulement du script",
|
||||
"body": "Le choix du GPU et du sens précède le changement principal. Un nettoyage VFIO séparé peut demander confirmation plus tôt ; les invités concernés ont leurs propres dialogues. Lisez chaque confirmation : une seule validation finale ne couvre pas tous les changements."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Étapes de la procédure",
|
||||
"detect": {
|
||||
"title": "Détecter les GPU et leur pilote actuel",
|
||||
"body": "Examine les contrôleurs VGA, 3D et Display de l’hôte et consulte <code>/sys/bus/pci/devices/*/driver</code>. Affiche nom, adresse PCI et pilote actuel de chaque GPU pour identifier son mode.",
|
||||
"imageAlt": "Liste de contrôle GPU montrant chaque GPU détecté avec son pilote actuel (vfio-pci / nvidia / amdgpu / i915) et emplacement PCI"
|
||||
},
|
||||
"pickGpu": {
|
||||
"title": "Choisir les GPU à basculer",
|
||||
"body": "Un seul GPU est sélectionné automatiquement. Avec plusieurs, vous pouvez en cocher plusieurs, à condition qu’ils soient dans le <em>même</em> mode. Un mélange de modes demande de restreindre la sélection.",
|
||||
"tipTitle": "Basculer plusieurs GPU ensemble",
|
||||
"tipBody": "Exemple : passer trois NVIDIA en mode VM, puis rendre l’iGPU aux LXC. Deux exécutions avec chacune une cible commune, plutôt qu’une opération par carte."
|
||||
},
|
||||
"direction": {
|
||||
"title": "Examiner l'orientation proposée",
|
||||
"intro": "Basé sur le mode actuel, le script propose le contraire comme cible:",
|
||||
"items": [
|
||||
"<strong>VM → LXC :</strong> retire l’affectation à <code>vfio-pci</code> pour permettre au pilote natif (<code>nvidia</code>, <code>amdgpu</code>, <code>i915</code>) de prendre en charge le GPU. Pour NVIDIA, supprime les entrées BDF correspondantes de <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> au prochain démarrage.",
|
||||
"<strong>LXC → VM :</strong> prépare l’affectation à <code>vfio-pci</code>. AMD / Intel bloquent le pilote natif et utilisent <code>options vfio-pci ids=…</code>. Pour NVIDIA, <code>nvidia</code> n’est bloqué globalement que si chaque GPU NVIDIA de l’hôte est en VFIO ; sinon, des règles par BDF appliquent <code>driver_override=vfio-pci</code> aux périphériques des groupes IOMMU concernés, et les GPU NVIDIA hors de ces groupes conservent <code>nvidia</code>. Vérifiez chaque membre du groupe avant de basculer."
|
||||
],
|
||||
"outro": "Confirmez la direction ou annulez."
|
||||
},
|
||||
"conflict": {
|
||||
"title": "Choix pour chaque VM ou LXC concerné",
|
||||
"body": "Vérifie <code>/etc/pve/lxc/*.conf</code> selon les familles de pilotes GPU et <code>/etc/pve/qemu-server/*.conf</code> pour les affectations PCI. La détection LXC ne correspond pas exactement à chaque carte par BDF. Vérifiez les invités détectés et choisissez quoi faire pour chacun :",
|
||||
"headerPolicy": "Politique",
|
||||
"headerEffect": "Effet",
|
||||
"headerWhen": "Quand choisir",
|
||||
"keepPolicy": "Conserver la configuration, désactiver le démarrage automatique",
|
||||
"keepEffect": "<code>pct set CTID -onboot 0</code> ou <code>qm set VMID -onboot 0</code>. Les entrées GPU sont conservées.",
|
||||
"keepWhen": "Si vous comptez réutiliser l’invité après retour au mode GPU initial. Choix prudent par défaut.",
|
||||
"removePolicy": "Supprimer GPU de la configuration",
|
||||
"removeEffect": "Retire les entrées <code>hostpci</code> / <code>dev</code> identifiées et les références anciennes prises en charge.",
|
||||
"removeWhen": "Pour utiliser l’invité sans GPU. Vérifiez d’abord l’application : le repli sur CPU dépend d’elle, et retirer le périphérique ne la reconfigure pas automatiquement.",
|
||||
"imageAlt": "Dialogue de choix pour chaque VM ou LXC concerné"
|
||||
},
|
||||
"audio": {
|
||||
"title": "Retirer les affectations audio associées en quittant le mode VM",
|
||||
"body1": "De nombreux GPU NVIDIA / AMD proposent l’audio HDMI sur la fonction <code>.1</code> du même emplacement ; d’autres périphériques audio peuvent être attribués. Retirer le GPU peut laisser des entrées audio <code>hostpci</code> obsolètes. Vérifiez les affectations à conserver.",
|
||||
"body2": "Identifie les adresses BDF audio et propose une liste des affectations à retirer. Supprime aussi leurs identifiants vendor:device de <code>/etc/modprobe.d/vfio.conf</code>, uniquement si aucune autre VM ne les utilise."
|
||||
},
|
||||
"apply": {
|
||||
"title": "Appliquer les changements à l’hôte et aux invités",
|
||||
"body": "Une fois que vous confirmez, le script écrit les modifications côté hôte — <code>vfio.conf</code>, liste noire, modules, et (pour NVIDIA) la règle par BDF udev à <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> plus l'état BDF à <code>/etc/proxmenux/vfio-bind.bdfs</code>. Elle applique également la politique de conflit choisie à chaque VM/LXC. Si la configuration de l'hôte a réellement changé, il exécute <code>update-initramfs -u -k all</code> suivi de <code>proxmox-boot-tool refresh</code>; sinon, les deux sont ignorés."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Redémarrer",
|
||||
"body": "Redémarrez l’hôte pour appliquer la nouvelle affectation persistante. Vous pouvez différer le redémarrage, mais vérifiez le pilote actif avant de lancer l’invité cible : l’ancien peut rester actif jusque-là.",
|
||||
"imageAlt": "Boîte de dialogue résumé listant ce qui a changé, suivie de l'invite de redémarrage"
|
||||
}
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Inspection manuelle",
|
||||
"intro": "Avant <strong>VM → LXC</strong>, examinez le pilote et la politique BDF. Cet exemple NVIDIA utilise <code>10de:2204</code> ; adaptez-le à votre carte. Ces commandes consultent l’état ; le script gère aussi les invités et les membres du groupe IOMMU.",
|
||||
"lxcToVm": "Avant <strong>LXC → VM</strong>, examinez l’adresse PCI et son groupe IOMMU. Remplacez l’adresse d’exemple et vérifiez tous les membres avant attribution.",
|
||||
"oneVmTitle": "Un GPU physique attribué par VFIO ne peut servir qu’à une VM à la fois",
|
||||
"oneVmBody": "Mettre plusieurs entrées <code>hostpci</code> avec la même fente PCI dans deux VMs est valide config, mais seulement une des VMs peut commencer avec le GPU — la seconde échouera. La politique de conflit ProxMenux vise précisément à éviter ce piège."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Vérification après redémarrage"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Dépannage",
|
||||
"stillVfioTitle": "GPU affiche toujours vfio-pci après le passage au mode LXC",
|
||||
"stillVfioBody": "Un module VFIO chargé ne prouve pas quel pilote utilise ce GPU. Vérifiez l’affectation, l’exécution de <code>update-initramfs</code> et le redémarrage. <code>lsmod | grep vfio</code> liste seulement les modules. Pour AMD / Intel, inspectez <code>vfio.conf</code> ; pour NVIDIA, <code>/etc/proxmenux/vfio-bind.bdfs</code> et <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code>. Corrigez les règles avant <code>update-initramfs -u -k all</code> et redémarrage.",
|
||||
"vmFailTitle": "Une VM ne démarre plus après passage du GPU en mode LXC",
|
||||
"vmFailBody": "Vérifiez les références <code>hostpci</code> obsolètes. Le choix <em>Retirer le GPU de la configuration</em> peut les supprimer pendant le changement prévu. Avant de relancer le script, vérifiez le sens proposé pour ne pas inverser le mode par erreur. Sinon, retirez l’affectation dans Proxmox, VM arrêtée.",
|
||||
"smiFailTitle": "nvidia-smi affiche « Driver/library version mismatch » après retour à LXC",
|
||||
"smiFailBody": "Comparez le module NVIDIA chargé aux bibliothèques installées, y compris dans les LXC. Alignez les versions : redémarrer charge le module installé sans corriger des paquets incompatibles. Recharger via <code>modprobe -r nvidia</code> puis <code>modprobe nvidia</code> nécessite l’arrêt des clients GPU et peut échouer si des modules dépendants sont utilisés.",
|
||||
"logTitle": "Journal d’exécution",
|
||||
"logBody": "Chaque exécution écrit dans <code>/tmp/proxmenux_gpu_switch_mode.log</code> sur l’hôte. Joignez le journal à votre demande d’aide GitHub."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Voir aussi",
|
||||
"items": [
|
||||
{
|
||||
"label": "Ajouter GPU à VM (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — configuration initiale du mode VM."
|
||||
},
|
||||
{
|
||||
"label": "Ajouter un GPU à LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — configuration initiale du mode LXC."
|
||||
},
|
||||
{
|
||||
"label": "Installer les pilotes NVIDIA (host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — requis pour le mode LXC avec les GPU NVIDIA."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor — Onglet matériel",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — section Cartes graphiques, avec le mode actuel et la commande de changement."
|
||||
},
|
||||
{
|
||||
"label": "Commandes de passthrough GPU",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — référence rapide des commandes."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Aggiungi Coral TPU a LXC | Documentazione ProxMenux",
|
||||
"description": "Condividi un Google Coral TPU USB o M.2 / PCIe con un LXC Proxmox. ProxMenux configura dispositivi, permessi e montaggi, avvia il container e installa il runtime Edge TPU nelle distribuzioni compatibili."
|
||||
},
|
||||
"header": {
|
||||
"title": "Aggiungi Coral TPU a LXC",
|
||||
"description": "Condividi un Coral USB Accelerator o M.2 / Mini-PCIe con un LXC. ProxMenux configura il container e il runtime Edge TPU. Questa opzione gestisce solo la TPU: per Quick Sync, VA-API o NVENC, esegui anche Aggiungi GPU a LXC.",
|
||||
"section": "Hardware: GPU e Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Cosa fa",
|
||||
"body": "Scrive la configurazione in <code>/etc/pve/lxc/<ctid>.conf</code> per <strong>USB Accelerator</strong>, <strong>Coral M.2 / PCIe</strong> o entrambi. Avvia il container e installa il runtime Google <code>libedgetpu</code>. Il GPU si configura separatamente con <lxcGpuLink>Aggiungi GPU a LXC</lxcGpuLink>."
|
||||
},
|
||||
"whenUse": {
|
||||
"heading": "Quando usarlo",
|
||||
"body": "Per <frigateLink>Frigate</frigateLink> o altre applicazioni Linux compatibili in LXC. Coral esegue l’inferenza ML supportata al posto della CPU. Le prestazioni dipendono da modello e hardware; decodifica video e altre attività consumano comunque risorse."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Prima di iniziare",
|
||||
"drivers": "<strong>Prepara il dispositivo Coral sull’host</strong>. M.2 / PCIe richiede il driver host caricato; USB richiede accesso al dispositivo e permessi adeguati. Vedi <hostLink>Installa Coral TPU sull’host</hostLink>. Lo script installa il runtime dell’applicazione nei container Debian/Ubuntu; le altre distribuzioni devono fornirlo separatamente.",
|
||||
"driversCheck": "ls /dev/apex_* 2>/dev/null ; lsusb | grep -E '1a6e:089a|18d1:9302'",
|
||||
"container": "<strong>Un LXC esistente</strong>, preferibilmente basato su <strong>Debian / Ubuntu</strong>: l’installazione usa <code>apt-get</code>. I <strong>container di altre distribuzioni</strong> possono usare la <strong>modalità solo passthrough</strong>, che salta l’installazione APT di <code>libedgetpu</code>. Utile se l’applicazione include già il runtime, come l’immagine Docker Frigate.",
|
||||
"downtime": "<strong>Prevedi una breve interruzione</strong> del container. Lo script lo ferma per configurarlo e lo avvia per installare il runtime. Queste modifiche non richiedono il riavvio dell’host."
|
||||
},
|
||||
"hostPrep": {
|
||||
"title": "Prepara prima l’host",
|
||||
"body": "M.2 / PCIe richiede <code>gasket</code>/<code>apex</code> sull’host e un dispositivo funzionante. USB richiede dispositivo collegato e permessi; l’app non deve essere eseguita sull’host. <code>libedgetpu</code> deve essere disponibile dove gira l’app. Ordine: <strong>preparare l’host → accesso LXC → configurare l’app</strong>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Eseguire lo script",
|
||||
"body": "In ProxMenux, apri <strong>Hardware: GPU e Coral-TPU → Aggiungi Coral TPU a LXC</strong>.",
|
||||
"imageAlt": "Voce Aggiungi Coral TPU a LXC nel menu hardware"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Come funziona lo script",
|
||||
"body": "Scegli il container. Lo script configura l’accesso USB anche senza Coral USB collegato e aggiunge M.2 / PCIe se rileva quel dispositivo."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Procedura passo per passo",
|
||||
"pick": {
|
||||
"title": "Scegli il container LXC",
|
||||
"body": "La selezione mostra i container idonei di <code>pct list</code>; quelli OCI sono nascosti e gestiti da Apps nel gestore OCI. Scegli il container, avviato o fermo. Lo script lo arresta se necessario, lo configura e lo avvia per installare il runtime."
|
||||
},
|
||||
"gpuHint": {
|
||||
"title": "Suggerimento facoltativo per l’accesso GPU",
|
||||
"body": "Se viene rilevato un GPU non configurato per questo container, un dialogo consiglia <lxcGpuLink>Aggiungi GPU a LXC</lxcGpuLink> per la decodifica video hardware, come Quick Sync, VA-API o NVENC. Chiede se proseguire solo con Coral: Sì continua la configurazione del TPU; No esce per permetterti di configurare prima il GPU."
|
||||
},
|
||||
"usb": {
|
||||
"title": "Configurare l’accesso USB del LXC",
|
||||
"body": "Crea una regola udev sull’host per <code>/dev/coral</code> e monta l’albero <strong>completo</strong> <code>/dev/bus/usb</code> nel container. La configurazione viene scritta anche senza Coral USB collegato ed espone più di quel solo dispositivo.",
|
||||
"whyTitle": "Perché montare /dev/bus/usb invece di /dev/coral?",
|
||||
"whyBody": "Il percorso USB, ad esempio <code>/dev/bus/usb/001/005</code>, cambia alla riconnessione. Le versioni precedenti montavano il link <code>/dev/coral</code> e potevano conservare un percorso obsoleto. Montare tutto l’albero USB rende visibile il nodo attuale. L’app potrebbe comunque dover riaprire il dispositivo."
|
||||
},
|
||||
"pcie": {
|
||||
"title": "Configurare l’accesso M.2 / PCIe del LXC",
|
||||
"body1": "Se rileva Coral M.2 / PCIe ed esiste <code>/dev/apex_0</code>, usa l’API Proxmox <code>dev</code> per gestire cgroup2 nei LXC privilegiati e non privilegiati:",
|
||||
"body2": "Se <code>/dev/apex_0</code> è assente dopo <hostLink>Installa Coral sull’host</hostLink>, lo script scrive un bind mount con <code>create=file</code> e, solo quando il numero major di apex è elencato in <code>/proc/devices</code>, una regola cgroup2 classica. Nessuno dei due crea un dispositivo funzionante:",
|
||||
"rebootTitle": "Riavviare l'host prima se hai appena installato i driver Coral",
|
||||
"rebootBody": "Il montaggio alternativo non carica <code>apex</code> sull’host. Carica il driver o riavvia dopo l’installazione e verifica il dispositivo. Poi riesegui lo script per applicare la voce moderna e riavvia il container."
|
||||
},
|
||||
"drivers": {
|
||||
"title": "Avviare il LXC e installare il runtime Coral",
|
||||
"body": "Avvia il container e attende fino a 15 secondi lo stato running, poi usa <code>pct exec</code> per eseguire l’installazione al suo interno. L’installer:",
|
||||
"items": [
|
||||
"Esegue <code>apt-get update</code>.",
|
||||
"Installa i prerequisiti del repository Coral: <code>gnupg</code>, <code>curl</code>, <code>ca-certificates</code>.",
|
||||
"Importa la chiave GPG Coral di Google per <code>/etc/apt/keyrings/coral-edgetpu.gpg</code> (percorso moderno, come l'installatore host) e aggiunge il repository APT <code>coral-edgetpu-stable</code> con <code>signed-by=</code>.",
|
||||
"Installa <code>libedgetpu1-std</code> come predefinito. Se rileva Coral M.2, propone <code>libedgetpu1-std</code> o <code>libedgetpu1-max</code>. La scelta del pacchetto non configura da sola il rilevamento nell’applicazione."
|
||||
],
|
||||
"noIgpuTitle": "Perché nessun driver iGPU qui?",
|
||||
"noIgpuBody": "Prima installava anche <code>va-driver-all</code>, <code>intel-opencl-icd</code> e altri pacchetti Intel per combinare Quick Sync e Coral. Ciò causava errori poco chiari quando serviva solo Coral. Ora l’iGPU si configura con <lxcGpuLink>Aggiungi GPU a LXC</lxcGpuLink>; eseguilo prima se serve decodifica video hardware.",
|
||||
"debianTitle": "Altre distribuzioni: solo accesso al dispositivo",
|
||||
"debianBody": "Usa <code>apt-get</code> in Debian/Ubuntu. Per <strong>Alpine, Arch, RHEL o SUSE</strong>, rilevati tramite <code>/etc/os-release</code>, propone <em>continuare solo con l’accesso al dispositivo</em> oppure <em>annullare</em>. Il primo configura <code>/etc/pve/lxc/<ctid>.conf</code> senza installare <code>libedgetpu</code>. Se l’app include già il runtime, come Frigate Docker, basta questa modalità. Altrimenti installa <code>libedgetpu</code> seguendo la <coralLink>guida ufficiale Google</coralLink>."
|
||||
},
|
||||
"summary": {
|
||||
"title": "Riepilogo",
|
||||
"body": "Al termine mostra Coral USB e M.2 con ✓ o ⚠ in base al rilevamento hardware. Il container resta avviato per configurare Frigate, CodeProject.AI o l’applicazione."
|
||||
}
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Procedura manuale equivalente",
|
||||
"body": "Se si desidera vedere esattamente cosa va nella configurazione LXC, o applicarla a mano:",
|
||||
"usbHeading": "USB Coral",
|
||||
"pcieHeading": "M.2 / PCIe Coral",
|
||||
"runtimeHeading": "Nel container: runtime Coral"
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verifica",
|
||||
"body": "Apri una shell nel container e verifica che Coral sia visibile:"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Risoluzione dei problemi",
|
||||
"apexTitle": "LXC avviato, ma manca /dev/apex_0",
|
||||
"apexBody": "Verifica prima il driver host: <code>lsmod | grep apex</code>. Se manca, prova <code>modprobe apex</code> o riavvia dopo l’installazione del driver. Quando <code>/dev/apex_0</code> esiste sull’host, verifica la voce del dispositivo LXC (riesegui lo script se sono state scritte solo le voci di ripiego) e riavvia il container con <code>pct stop <ctid> && pct start <ctid></code>.",
|
||||
"replugTitle": "Coral USB scompare dopo la riconnessione a un’altra porta",
|
||||
"replugBody": "Verifica che il LXC monti <code>/dev/bus/usb</code> anziché il link <code>/dev/coral</code>. La configurazione deve contenere <code>lxc.mount.entry: /dev/bus/usb dev/bus/usb ...</code> senza dipendere direttamente da <code>/dev/coral</code>. Riesegui lo script se la configurazione è vecchia.",
|
||||
"alpineTitle": "Alpine / Arch / RHEL / SUSE: runtime non installato",
|
||||
"alpineBody": "La <em>modalità solo passthrough</em> configura il dispositivo senza installare <code>libedgetpu</code>. Usa un pacchetto compatibile o compila i sorgenti; verifica la disponibilità prima di comandi come <code>apk add</code> in Alpine. Frigate può includere il runtime. Con Docker nel LXC, inoltra anche M.2 con <code>--device /dev/apex_0:/dev/apex_0</code> oppure monta USB in Docker: il solo montaggio LXC non basta.",
|
||||
"frigateTitle": "Frigate mostra «Coral EdgeTPU detected but not available»",
|
||||
"frigateBody": "Verifica runtime, visibilità e accesso in lettura/scrittura del processo reale. Per USB, controlla permessi ed eventuale gruppo <code>plugdev</code>. Per M.2, ispeziona <code>/dev/apex_0</code> con <code>ls -l /dev/apex_0</code>. Un nome come <code>apex</code> in <code>/etc/group</code> non basta: GID numerici e mappature LXC devono coincidere. Controlla se altri processi occupano la TPU; non passare subito alla modalità privilegiata.",
|
||||
"logsTitle": "Controllare entrambi i registri host e container",
|
||||
"logsBody": "Sull’host controlla i messaggi del kernel con <code>journalctl -k | grep -i -e apex -e gasket -e usb</code>. Nel LXC leggi i registri dell’app; con Docker annidato usa <code>docker logs <container></code>. Permessi, runtime assente, connessione USB o un altro processo sulla TPU possono causare errori."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Vedi anche",
|
||||
"items": [
|
||||
{
|
||||
"label": "Installa Coral TPU sull’host",
|
||||
"href": "/docs/hardware/install-coral-tpu-host",
|
||||
"tail": " — requisito per usare schede Coral M.2 / PCIe in un CT."
|
||||
},
|
||||
{
|
||||
"label": "Aggiungi GPU a LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — accesso GPU, spesso abbinato a Coral in Frigate."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Aggiungi GPU a VM | Documentazione ProxMenux",
|
||||
"description": "Assegna una GPU fisica a una VM Proxmox. ProxMenux verifica IOMMU, configura VFIO e dispositivi VM e rileva conflitti con altre VM o LXC."
|
||||
},
|
||||
"header": {
|
||||
"title": "Aggiungi GPU a VM (Passthrough)",
|
||||
"description": "Rileva GPU Intel, AMD o NVIDIA per l’accesso diretto da una VM. Verifica IOMMU e dispositivi associati, configura VFIO e VM e applica le regole di compatibilità. Controlla tutti i dispositivi interessati.",
|
||||
"section": "Hardware: GPU e Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Cosa fa",
|
||||
"body": "Automatizza i passaggi host e <code>hostpci</code> della <pveLink>documentazione PCI passthrough Proxmox</pveLink>. Controlla assegnazioni ad <em>altri</em> guest e propone soluzioni ai conflitti. Non garantisce supporto per ogni GPU, metodo di reset o driver guest."
|
||||
},
|
||||
"who": {
|
||||
"heading": "Per chi è questo?",
|
||||
"body": "Per l’accesso diretto di una <strong>macchina virtuale</strong> alla GPU tramite VFIO. Finché è associata a VFIO, il driver host non può usarla, anche con VM ferma. Per condividerla con <em>LXC</em>, usa <lxcLink>Aggiungi GPU a LXC</lxcLink>."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Prima di iniziare",
|
||||
"gpu": "<strong>GPU compatibile</strong> installata fisicamente. Lo script rileva Intel, AMD e NVIDIA con <code>lspci</code>.",
|
||||
"gpuCheck": "lspci | grep -iE 'VGA|3D|Display'",
|
||||
"iommu": "<strong>Supporto IOMMU</strong> hardware e attivazione firmware se richiesta (Intel VT-d o AMD-Vi). Verifica il sistema e può configurare Linux; non cambia BIOS/UEFI né prova che IOMMU inattivo sia disabilitato nel firmware.",
|
||||
"q35": "L’assistente richiede <strong>q35</strong> e rifiuta <code>i440fx</code>. Il tipo di macchina è distinto dal firmware BIOS/UEFI. Cambiare chipset a una VM esistente richiede pianificazione e non è automatico.",
|
||||
"q35Check": "qm config VMID | grep machine",
|
||||
"moreGpus": "Prepara <strong>un’altra GPU o accesso alternativo</strong> via SSH, IPMI o seriale. Riservare la GPU principale può togliere l’immagine locale. Per <em>NVIDIA</em>, una scheda fuori dal gruppo IOMMU interessato può restare sull’host.",
|
||||
"nvidiaInstalled": "Dopo l’<nvidiaLink>installazione NVIDIA sull’host</nvidiaLink>, le funzioni scelte sono riservate a <code>vfio-pci</code> anziché <code>nvidia</code>. Il modulo <code>nvidia</code> può restare disponibile per <strong>altre</strong> schede fuori dal gruppo IOMMU interessato. Verifica con <code>nvidia-smi</code>."
|
||||
},
|
||||
"pickOne": {
|
||||
"title": "Assegnazione esclusiva VM o condivisione LXC",
|
||||
"body": "Un GPU legato a <code>vfio-pci</code> per il passaggio VM non può essere utilizzato simultaneamente dall'host o da un LXC. Se hai due GPU, puoi dedicarne uno ad ogni percorso. Se ne hai uno solo, scegli:",
|
||||
"vmItem": "<strong>VM:</strong> accesso diretto ed esclusivo per quella VM.",
|
||||
"lxcItem": "<strong>LXC (<lxcLink>Aggiungi GPU a LXC</lxcLink>):</strong> condivide il dispositivo con host e altri container tramite il driver nativo."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Eseguire l’installer",
|
||||
"body": "Apri ProxMenux e scegli <strong>Hardware: GPU e Coral-TPU → Aggiungi GPU a VM</strong>.",
|
||||
"imageAlt": "Voce del menu per aggiungere GPU a VM"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Come funziona lo script",
|
||||
"body": "Rilevamento e selezione precedono le modifiche principali, confermate da un riepilogo finale. Attivare IOMMU ha una conferma precedente e può già modificare l’avvio. La successiva pulizia audio può chiedere un’altra scelta."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Procedura passo per passo",
|
||||
"detect": {
|
||||
"title": "Rileva GPU e controlla IOMMU",
|
||||
"body": "Considera IOMMU attivo solo quando il kernel in esecuzione ha <code>intel_iommu=on</code> o <code>amd_iommu=on</code> ed esistono gruppi IOMMU. Se il parametro è già salvato per il prossimo avvio, prosegue in modalità riavvio in sospeso; altrimenti un passaggio confermato separatamente può aggiungerlo con <code>iommu=pt</code>. La sua euristica per il file di avvio usa <code>/etc/kernel/cmdline</code> quando vi si trova un marcatore di root ZFS come <code>root=ZFS=</code>; altrimenti usa <code>/etc/default/grub</code>. Questa euristica non prova quale sia il bootloader effettivo. L’IOMMU appena configurato ha effetto dopo il riavvio; verifica poi i gruppi reali.",
|
||||
"tipTitle": "Hai già configurato la post-installazione?",
|
||||
"tipBody": "Se il <postLink>supporto VFIO IOMMU</postLink> è già configurato e attivo nel kernel, il controllo passa. Un’impostazione per il prossimo avvio non prova che sia attivo ora.",
|
||||
"imageAlt": "Elenco delle GPU rilevate con indirizzo fornitore e PCI"
|
||||
},
|
||||
"preflight": {
|
||||
"title": "Scegli GPU ed esegui i controlli preliminari",
|
||||
"intro": "Una volta scelto il GPU, lo script esegue una serie di controlli che possono ogni blocco ulteriori progressi:",
|
||||
"items": [
|
||||
"<strong>Controllo SR-IOV.</strong> Rifiuta VF e PF con VF attive perché configura dispositivi interi, non SR-IOV. Configura SR-IOV separatamente su hardware supportato.",
|
||||
"<strong>Una sola GPU.</strong> La console locale può perdere l’uscita quando VFIO la riserva. Verifica prima l’accesso SSH o web da un altro computer.",
|
||||
"<strong>Politica di reset AMD.</strong> Legge <code>/sys/bus/pci/devices/<pci>/reset_method</code>. APU o scheda dedicata senza FLR viene <em>bloccata dalla politica dell’assistente</em>; un sottotipo sconosciuto senza FLR richiede conferma. Non prova un’impossibilità universale.",
|
||||
"<strong>Stato D3cold.</strong> Blocca schede AMD che indicano <code>D3cold</code> per il rischio di mancata attivazione. Verifica alimentazione e firmware.",
|
||||
"<strong>Analisi del gruppo IOMMU.</strong> Legge <code>/sys/kernel/iommu_groups/</code> e include nel piano della VM <em>tutti i membri non bridge</em>, eventualmente controller di rete o di archiviazione. Se il gruppo contiene dispositivi di un altro slot, lo script li elenca prima del riepilogo; verifica che l’host non ne abbia bisogno. Se IOMMU attende un riavvio, i gruppi reali non sono disponibili e il piano contiene inizialmente solo la funzione GPU selezionata; verifica l’isolamento dopo il riavvio."
|
||||
],
|
||||
"audioIntro": "<strong>Audio associato.</strong> Due casi secondo la posizione del controller:",
|
||||
"audioDgpu": "<strong>GPU dedicata:</strong> l’audio HDMI occupa spesso la funzione <code>.1</code> dello stesso slot PCI ed è incluso se rilevato. Se l’host lo usava, perde l’accesso riservandolo alla VM.",
|
||||
"audioIgpu": "<strong>Senza funzione audio <code>.1</code>:</strong> può trovarsi altrove, per esempio <code>00:1f.3</code>. Elenca controller e driver come <code>snd_hda_intel</code>. Per impostazione predefinita <strong>nessuno</strong> è selezionato; scegli solo quelli necessari."
|
||||
},
|
||||
"pickVm": {
|
||||
"title": "Scegli la VM di destinazione",
|
||||
"body": "Scegli la VM. Richiede q35 e riutilizza le voci GPU esistenti dove possibile. BIOS/UEFI è un’impostazione separata, non un tipo di macchina. Non cambia automaticamente chipset o avvio del guest installato.",
|
||||
"imageAlt": "Selezione VM per nome, ID e stato"
|
||||
},
|
||||
"switchMode": {
|
||||
"title": "Gestire assegnazioni esistenti",
|
||||
"intro": "Lo script scansiona ogni configurazione VM e ogni configurazione LXC sull'host alla ricerca del GPU selezionato. Tre possibili risultati:",
|
||||
"items": [
|
||||
"<strong>GPU disponibile.</strong> Prosegue senza rimuovere assegnazioni.",
|
||||
"<strong>Assegnata a un’altra VM.</strong> Arresta prima la sorgente. Puoi <em>mantenere le voci disattivando l’avvio automatico</em> oppure <em>rimuoverle mantenendo l’avvio automatico</em>. Con <code>vfio-pci</code> già attivo e nessuna modifica host necessaria, il trasferimento VM→VM può evitare il riavvio host.",
|
||||
"<strong>GPU usata da LXC.</strong> Nei container normali scegli <em>mantenere la configurazione GPU e disattivare l’avvio automatico</em> o <em>rimuovere la configurazione del dispositivo GPU mantenendo l’avvio automatico</em>. La rimozione elimina le voci <code>devN</code> e, per AMD/Intel, anche le vecchie regole <code>/dev/dri</code> <code>lxc.mount.entry</code> e <code>lxc.cgroup2.devices.allow</code>. I container OCI conservano la configurazione e vengono fermati con l’avvio automatico disattivato; rimuovi la loro GPU tramite OCI manager Apps. Il rilevamento dei conflitti avviene per famiglia di dispositivi GPU e può includere altre schede della stessa famiglia."
|
||||
],
|
||||
"imageAlt": "Offerta di dialogo per rimuovere il GPU da un LXC prima di assegnarlo al VM",
|
||||
"smartTitle": "Verificare l’audio associato rimuovendo la GPU",
|
||||
"smartBody": "Poi può proporre un elenco di <strong>dispositivi audio forse inutilizzati</strong> nella VM sorgente. Deseleziona quelli ancora necessari. Per esempio può mantenere <code>02:00.1</code> e proporre di rimuovere <code>00:1f.3</code>. La scelta determina la rimozione; non garantisce ogni associazione audio/video."
|
||||
},
|
||||
"audioPick": {
|
||||
"title": "Senza audio .1, scegli i controller necessari",
|
||||
"body": "Succede solo per Intel iGPU e simili configurazioni split-audio. Una lista di controllo mostra ogni controller audio PCI sull'host (escluso qualsiasi già nel gruppo IOMMU di GPU), etichettato con il suo driver corrente. Selezionare quelli che si desidera - o nessuno, se il VM non ha bisogno di audio dall'hardware host.",
|
||||
"imageAlt": "finestra di dialogo con ogni controller audio PCI host (BDF + driver) quando il GPU non ha un audio di sibling .1",
|
||||
"warnTitle": "Non selezionare audio necessario all’host",
|
||||
"warnBody": "Assegnare l’audio può togliere accesso all’host; il controller non può appartenere anche a un’altra VM attiva. Non selezionare audio superfluo e verifica le assegnazioni. Il segnale acustico della console non proviene necessariamente dall’audio PCI."
|
||||
},
|
||||
"summary": {
|
||||
"title": "Riepilogo della conferma",
|
||||
"body": "Verifica il piano finale dell’host e della VM e annulla se è errato. Mostra il gruppo IOMMU e il numero dei suoi dispositivi; i membri di un altro slot sono elencati nel passaggio precedente. L’annullamento ferma le modifiche principali, ma non annulla una modifica della configurazione di avvio IOMMU confermata separatamente in precedenza.",
|
||||
"imageAlt": "Riepilogo delle modifiche previste a host e VM"
|
||||
},
|
||||
"hostApply": {
|
||||
"title": "Le modifiche degli host sono applicate",
|
||||
"intro": "La fase applicativa modifica host e VM. La pulizia audio può ancora richiedere una scelta. Possibili modifiche:",
|
||||
"items": [
|
||||
"<code>/etc/modules</code> — aggiunge <code>vfio</code>, <code>vfio_iommu_type1</code>, <code>vfio_pci</code> (più <code>vfio_virqfd</code> sui kernel < 6.2).",
|
||||
"<code>/etc/modprobe.d/vfio.conf</code> — AMD/Intel: <code>options vfio-pci ids=<vendor:device,...> disable_vga=1</code>. NVIDIA: <code>softdep nvidia pre: vfio-pci</code> (<code>_drm</code>/<code>_modeset</code>/<code>_uvm</code>); l’associazione effettiva è per BDF. AMD aggiunge l’ordine di caricamento <code>softdep</code>: <code>vfio-pci</code> → <code>radeon</code>/<code>amdgpu</code>.",
|
||||
"Scrive <code>/etc/modprobe.d/iommu_unsafe_interrupts.conf</code> e <code>kvm.conf</code> con <code>allow_unsafe_interrupts=1</code> e <code>ignore_msrs=1</code>. Sono impostazioni dello script, non requisiti universali Windows/macOS; gli interrupt non sicuri riducono la protezione del remapping.",
|
||||
"<code>/etc/modprobe.d/blacklist.conf</code>: NVIDIA — <code>nouveau</code>/<code>lbm-nouveau</code>; AMD — <code>radeon</code> + <code>amdgpu</code>; Intel — <code>i915</code>. Queste regole per produttore possono influire su altre schede con lo stesso driver. Il modulo <code>nvidia</code> è bloccato <strong>solo</strong> tramite <code>/etc/modprobe.d/proxmenux-nvidia-vfio-blacklist.conf</code> quando <em>tutte</em> le NVIDIA host sono riservate a VFIO.",
|
||||
"<code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> + <code>/etc/proxmenux/vfio-bind.bdfs</code> — <strong>Solo NVIDIA.</strong> Applica <code>ATTR'{'driver_override'}'=\"vfio-pci\"</code> al PCI ADD dei BDF registrati, incluse le funzioni del gruppo IOMMU interessato. Fuori da quei gruppi può restare <code>nvidia</code>. La politica BDF non divide gruppi IOMMU hardware.",
|
||||
"<strong>Solo AMD.</strong> Tenta un dump della ROM da <code>/sys/bus/pci/.../rom</code> o ACPI VFCT in <code>/usr/share/kvm/vbios_<vendor>_<device>.bin</code>. Se riesce, la VM usa <code>romfile=</code>. Un dump valido non garantisce la corretta inizializzazione della GPU.",
|
||||
"<strong>Solo NVIDIA.</strong> Ferma e disattiva <code>nvidia-persistenced</code>, <code>nvidia-powerd</code>, <code>nvidia-fabricmanager</code> solo se tutte le NVIDIA sono riservate a VFIO. In uso misto mantiene servizi e <code>nvidia</code> per le schede native.",
|
||||
"<code>update-initramfs -u -k all</code> — funziona solo se uno dei suddetti effettivamente cambiato."
|
||||
]
|
||||
},
|
||||
"vmApply": {
|
||||
"title": "La configurazione della VM viene applicata tramite qm set",
|
||||
"body": "La configurazione in <code>/etc/pve/qemu-server/<vmid>.conf</code> viene aggiornata tramite <code>qm set</code>, non modificata direttamente con <code>sed</code>.",
|
||||
"after1": "Aggiunge <code>x-vga=1</code> per AMD e NVIDIA, <strong>non</strong> Intel. È la politica dello script, non prova che ogni iGPU Intel sia priva di firmware o che il flag causi sempre blocchi.",
|
||||
"after2": "Ulteriori linee <code>hostpciN</code> sono allegate se il gruppo IOMMU di GPU contiene altri dispositivi che è necessario passare insieme."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Riavvia se richiesto dalle modifiche host",
|
||||
"body": "Segui il riavvio richiesto se cambiano avvio o driver e verifica l’associazione attiva prima di avviare la VM. La configurazione salvata non prova che sia attiva. VM→VM con VFIO corretto può evitare il riavvio host.",
|
||||
"imageAlt": "Riepilogo schermo che mostra ciò che è stato cambiato, seguito da un prompt di riavvio"
|
||||
}
|
||||
},
|
||||
"vendors": {
|
||||
"heading": "Note per produttore",
|
||||
"nvidiaHeading": "NVIDIA",
|
||||
"nvidiaBody": "Mantiene un vecchio accorgimento per <em>Code 43</em>: <code>hidden=1</code>, ID <code>NV43FIX</code> in <code>args</code> e <code>kvm=off</code>. Non è un requisito universale delle GeForce attuali: NVIDIA ha abilitato il passthrough Windows da R465. L’errore può avere altre cause; verifica GPU e driver.",
|
||||
"nvidiaMultiHeading": "Supporto Multi-GPU NVIDIA",
|
||||
"nvidiaMultiBody": "Uso misto NVIDIA <strong>per BDF</strong>. Registra funzioni <code>vfio-pci</code> per indirizzo, non solo ID <code>vendor:device</code>. Fuori dai gruppi interessati può mantenere <code>nvidia</code>; verifica con <code>nvidia-smi</code>. Non isola due schede dello stesso gruppo.",
|
||||
"amdHeading": "AMD",
|
||||
"amdBody": "Alcune GPU AMD non si resettano dopo l’arresto VM. L’assistente verifica capacità dichiarate, non tutti i cicli reali. <vendorResetLink>vendor-reset</vendorResetLink> supporta dispositivi limitati e richiede kernel compatibile e caricamento anticipato; non viene installato. Anche <em>RadeonResetBugFix</em> su Windows dipende dall’hardware, senza garanzia universale.",
|
||||
"intelHeading": "Intel iGPU",
|
||||
"intelBody": "Passthrough completo Intel iGPU e SR-IOV sono distinti. L’assistente riserva il dispositivo a una VM senza <code>x-vga=1</code>. <sriovLink>i915-sriov-dkms</sriovLink> richiede hardware/kernel supportati; «UHD 630+» non è una regola di compatibilità. Prevedi accesso alternativo all’host."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verifica"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Risoluzione dei problemi",
|
||||
"code43Title": "Codice 43 in Windows (NVIDIA)",
|
||||
"code43Body": "Code 43 non prova un errore di mascheramento. Controlla <code>qm config VMID | grep -E \"cpu|args\"</code> con VMID reale, poi <code>hidden=1</code> e <code>hv_vendor_id=NV43FIX</code>. Verifica anche driver guest, firmware e assegnazione. Ripetere può terminare se già assegnata.",
|
||||
"amdResetTitle": "AMD GPU funziona una volta, fallisce sul riavvio di VM",
|
||||
"amdResetBody": "Un reset fallito è una possibile causa. Riavvio o spegnimento completo possono aiutare temporaneamente. Verifica compatibilità e caricamento anticipato di <code>vendor-reset</code>; <code>softdep amdgpu pre: vendor-reset</code> da solo non garantisce caricamento prima di VFIO. Anche <em>RadeonResetBugFix</em> richiede una GPU compatibile.",
|
||||
"stuckBootTitle": "Avvio bloccato VM / GPU non rilevato",
|
||||
"stuckBootBody": "Controlla l’indirizzo reale con <code>lspci -nnk -s PCI_ADDRESS</code>; atteso <code>Kernel driver in use: vfio-pci</code>. Sostituisci PCI_ADDRESS. Se resta il driver nativo, verifica la politica di associazione, non solo <code>/etc/modprobe.d/blacklist.conf</code>; NVIDIA usa stato BDF. Leggi <code>dmesg | grep vfio</code>. Dopo correzioni, <code>update-initramfs -u -k all</code> e riavvio pianificato.",
|
||||
"darkTitle": "Consolle Host va scuro dopo il riavvio e non posso SSH in",
|
||||
"darkBody": "Lo schermo nero non prova che l’host sia spento. Se fallisce anche SSH, controlla rete e controller inclusi nel gruppo IOMMU. Recupera accesso via IPMI, seriale o ambiente di ripristino; verifica <code>/etc/pve/qemu-server/<vmid>.conf</code> e annulla solo assegnazioni/regole pertinenti. Non eliminare altra configurazione.",
|
||||
"logTitle": "Controlla il registro di installazione",
|
||||
"logBody": "Ogni esecuzione scrive <code>/tmp/add_gpu_vm.log</code>. Allegalo alle richieste di assistenza."
|
||||
},
|
||||
"revert": {
|
||||
"heading": "Annullare le modifiche manualmente",
|
||||
"intro": "Arresta la VM e rimuovi solo le assegnazioni PCI pertinenti da Hardware o con l’indice esplicito sotto. Non restituisce ancora la GPU al driver host. Usa Cambia modalità GPU per questa transizione e verifica i guest interessati."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Vedi anche",
|
||||
"items": [
|
||||
{
|
||||
"label": "Installare driver NVIDIA (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — prepara il driver per schede rimaste sull’host; una GPU in VFIO non può usarlo contemporaneamente."
|
||||
},
|
||||
{
|
||||
"label": "Aggiungi GPU a LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": "— modello alternativo: condividere il GPU con più contenitori invece di dedicarlo a un VM."
|
||||
},
|
||||
{
|
||||
"label": "Cambia modalità GPU (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — passa la stessa GPU fra condivisione e assegnazione esclusiva."
|
||||
},
|
||||
{
|
||||
"label": "Comandi di passaggio GPU",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": "— lspci, IOMMU verifica, qm set hostpci riferimento."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,185 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Aggiungi GPU a LXC | Documentazione ProxMenux",
|
||||
"description": "Condividi GPU Intel, AMD o NVIDIA con LXC. ProxMenux configura dispositivi, gruppi e librerie secondo la distribuzione; l’app deve supportare e configurare l’accelerazione."
|
||||
},
|
||||
"header": {
|
||||
"title": "Aggiungi GPU a LXC",
|
||||
"description": "Condivide l’accesso GPU con LXC tramite i dispositivi dell’host. Il driver resta sull’host; le app richiedono librerie compatibili e una configurazione propria.",
|
||||
"section": "Hardware: GPU e Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Cosa fa",
|
||||
"body": "Aggiunge voci <code>dev<N></code> a <code>/etc/pve/lxc/<ctid>.conf</code> per i nodi <code>/dev/dri/*</code>, <code>/dev/kfd</code> o <code>/dev/nvidia*</code> pertinenti. Avvia il container, installa i pacchetti userspace della sua distribuzione e, per Intel/AMD, allinea i gruppi <code>video</code> e <code>render</code>. L’accelerazione delle applicazioni richiede comunque hardware e librerie compatibili e configurazione dell’app."
|
||||
},
|
||||
"compare": {
|
||||
"heading": "Condivisione LXC e passthrough VM a confronto",
|
||||
"intro": "LXC condivide il kernel e può <em>condividere</em> la GPU fra host e container. Con il <vmLink>passthrough completo a una VM</vmLink>, il dispositivo è riservato alla VM e non è disponibile al driver dell’host.",
|
||||
"headerFeature": "Caratteristica",
|
||||
"headerLxc": "LXC (questa pagina)",
|
||||
"headerVm": "VM",
|
||||
"rows": [
|
||||
{
|
||||
"feature": "L’host può continuare a usare la GPU?",
|
||||
"lxc": "Sì",
|
||||
"vm": "No — esclusiva della VM"
|
||||
},
|
||||
{
|
||||
"feature": "Più container possono condividere una GPU?",
|
||||
"lxc": "Sì",
|
||||
"vm": "No"
|
||||
},
|
||||
{
|
||||
"feature": "Richiede IOMMU / VFIO sull'host?",
|
||||
"lxc": "No",
|
||||
"vm": "Sì"
|
||||
},
|
||||
{
|
||||
"feature": "Riavvio richiesto?",
|
||||
"lxc": "Di solito no (solo riavviare il CT)",
|
||||
"vm": "Se cambia la configurazione di driver o IOMMU sull’host; non a ogni assegnazione"
|
||||
},
|
||||
{
|
||||
"feature": "Sistemi operativi guest",
|
||||
"lxc": "Solo Linux (LXC è Linux-solo)",
|
||||
"vm": "Sistema guest supportato con driver GPU compatibile"
|
||||
}
|
||||
]
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Prima di iniziare",
|
||||
"gpu": "<strong>GPU sull’host</strong> Intel, AMD o NVIDIA, rilevata tramite <code>lspci</code>.",
|
||||
"gpuCheck": "lspci | grep -iE 'VGA|3D|Display'",
|
||||
"vfio": "<strong>La GPU non deve essere associata a vfio-pci.</strong> Serve il driver nativo dell’host. Se assegnata a una VM, lo script propone <switchLink>Cambia modalità GPU</switchLink>.",
|
||||
"nvidia": "<strong>Per NVIDIA:</strong> installa prima il driver sull’host. Le librerie del container devono corrispondere alla sua versione. Usa <nvidiaLink>Installa driver NVIDIA sull’host</nvidiaLink>.",
|
||||
"nvidiaCheck": "nvidia-smi",
|
||||
"container": "<strong>Un LXC esistente.</strong> Lo script non lo crea. Supporta entrambi i modi; un container <strong>privilegiato</strong> non è sempre necessario. Dispositivi e permessi numerici dell’app devono corrispondere."
|
||||
},
|
||||
"unpriv": {
|
||||
"title": "Supporta container privilegiati e non privilegiati",
|
||||
"body": "Lo script usa le voci <code>dev<N></code> e allinea i GID <code>video</code> e <code>render</code> fra host e container. Questo evita di modificare manualmente <code>lxc.idmap</code> per il normale accesso ai dispositivi; verifica comunque i permessi dell’utente dell’app."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Eseguire l’installer",
|
||||
"body": "Apri ProxMenux e scegli <strong>Hardware: GPU e Coral-TPU → Aggiungi GPU a LXC</strong>.",
|
||||
"imageAlt": "Voce del menu per aggiungere GPU a LXC"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Come funziona lo script",
|
||||
"body": "Scegli container e famiglie GPU e supera i controlli. Poi il processo arresta e modifica il container senza un’ulteriore conferma finale. La pulizia VFIO facoltativa ha conferma separata e può modificare prima l’host."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Procedura passo per passo",
|
||||
"detect": {
|
||||
"title": "Rilevamento GPU host",
|
||||
"body": "Cerca controller GPU con <code>lspci</code>. Per NVIDIA verifica il modulo <code>nvidia</code> e <code>nvidia-smi</code>; la versione rilevata determina l’installer <code>.run</code> del container.",
|
||||
"tipTitle": "NVIDIA non pronto?",
|
||||
"tipBody": "Se manca il modulo o NVIDIA non funziona sull’host, usa prima <nvidiaLink>Installa driver NVIDIA sull’host</nvidiaLink> e verifica il driver."
|
||||
},
|
||||
"pickCt": {
|
||||
"title": "Scegli un container LXC",
|
||||
"body": "Elenca i container LXC idonei per ID e nome; i container OCI sono esclusi e usano OCI manager Apps per i dispositivi. Il container viene arrestato se è in esecuzione, avviato per l’installazione dei driver e normalmente riportato allo stato iniziale (in esecuzione/arrestato).",
|
||||
"imageAlt": "Selezione di un container LXC esistente"
|
||||
},
|
||||
"selectGpu": {
|
||||
"title": "Scegli le famiglie GPU",
|
||||
"body": "L’elenco seleziona famiglie di produttori, non un dispositivo PCI isolato. Intel/AMD aggiungono i nodi DRI previsti; NVIDIA i dispositivi disponibili, anche di più schede. Una sola famiglia viene selezionata automaticamente. Verifica l’elenco finale, soprattutto con più GPU.",
|
||||
"imageAlt": "Elenco delle famiglie GPU rilevate con nome e indirizzo PCI"
|
||||
},
|
||||
"preflight": {
|
||||
"title": "Controlli preliminari",
|
||||
"imageAlt": "Proposta di cambio modalità per una GPU associata a vfio-pci",
|
||||
"intro": "Tre controlli, uno dei quali può bloccare o reindirizzare:",
|
||||
"items": [
|
||||
"<strong>Controllo SR-IOV.</strong> L’assistente blocca VF o PF con VF attive. È un limite della selezione ampia dei dispositivi, non un divieto generale per LXC. Configurali separatamente.",
|
||||
"<strong>Associata a vfio-pci.</strong> Il driver nativo non può creare <code>/dev/dri/*</code> o <code>/dev/nvidia*</code>. Propone <switchLink>Cambia modalità GPU</switchLink>; segui le indicazioni sul riavvio e poi torna.",
|
||||
"<strong>Già configurata.</strong> Se tutti i dispositivi sono presenti, esce senza reinstallare le librerie. Prosegue solo con le famiglie selezionate mancanti."
|
||||
]
|
||||
},
|
||||
"applyConfig": {
|
||||
"title": "Applicare le modifiche di configurazione LXC",
|
||||
"body1": "Arresta il container se è in esecuzione e modifica <code>/etc/pve/lxc/<ctid>.conf</code>. Le voci numerate <code>dev<N></code> includono il GID host di <code>video</code> o <code>render</code>. Le righe bind <code>lxc.mount.entry</code> esistenti per <code>/dev/dri</code> vengono sostituite da voci <code>dev:</code>; verifica la configurazione e i permessi risultanti.",
|
||||
"body2": "Esempio dopo Intel + NVIDIA sullo stesso contenitore:"
|
||||
},
|
||||
"installDrivers": {
|
||||
"title": "Avviare il contenitore e installare i driver all'interno",
|
||||
"body": "Avvia il container e attende fino a circa 30 secondi la risposta di <code>pct exec</code>. Rileva la distribuzione da <code>/etc/os-release</code> e installa i pacchetti adatti.",
|
||||
"headerDistro": "Distribuzione",
|
||||
"headerInt": "Intel / AMD",
|
||||
"headerNvidia": "NVIDIA",
|
||||
"rows": [
|
||||
{
|
||||
"distro": "Alpine",
|
||||
"intel": "apk add mesa-va-gallium intel-media-driver libva-utils",
|
||||
"nvidia": "apk add nvidia-utils"
|
||||
},
|
||||
{
|
||||
"distro": "Arch / Manjaro",
|
||||
"intel": "pacman -Sy intel-media-driver mesa libva-utils",
|
||||
"nvidia": "pacman -Sy nvidia-utils"
|
||||
}
|
||||
],
|
||||
"debianDistro": "Debian / Ubuntu / altri",
|
||||
"debianIntel": "apt-get install va-driver-all intel-opencl-icd vainfo",
|
||||
"debianNvidia": "Estrae <code>.run</code> sull’host → <code>pct push</code> → installa con <code>--no-kernel-modules --no-dkms</code>.",
|
||||
"whyTitle": "Perché usa l’installer NVIDIA .run su Debian",
|
||||
"whyBody": "I pacchetti possono non corrispondere all’host. Le librerie <strong>devono corrispondere al modulo host caricato</strong> per NVML e <code>nvidia-smi</code>. Debian/glibc usa il <code>.run</code> della versione host in cache, lo estrae e archivia sull’host, trasferisce con <code>pct push</code> e installa con <code>--no-kernel-modules --no-dkms</code>. Alpine e Arch usano i repository: verifica le versioni."
|
||||
},
|
||||
"alignGids": {
|
||||
"title": "Allineare GID e ripristinare lo stato",
|
||||
"body1": "Per Intel/AMD legge i GID host di <code>video</code> e <code>render</code>, usando 44/104 solo come ripiego, poi modifica <code>/etc/group</code> nel container perché corrispondano; le esecuzioni solo NVIDIA saltano questo passaggio. Voci come <code>video:44</code> e <code>render:104</code> sono esempi, non ID universali. Verifica l’appartenenza dell’app ai gruppi e i permessi effettivi sui dispositivi.",
|
||||
"body2": "Al termine normale, arresta di nuovo il container se inizialmente era fermo; se era attivo lo lascia attivo. In caso di errore di avvio o installazione, verifica stato finale e log."
|
||||
}
|
||||
},
|
||||
"vendors": {
|
||||
"heading": "Note per produttore",
|
||||
"intelHeading": "Intel iGPU",
|
||||
"intelBody": "L’accelerazione multimediale Intel, incluso <em>Quick Sync</em>, dipende da generazione del GPU, codec e configurazione dell’app. Lo script condivide quelli tra <code>/dev/dri/card0</code>, <code>card1</code>, <code>renderD128</code> e <code>renderD129</code> che esistono; altri numeri di nodo non vengono aggiunti. L’host deve già fornirli tramite il proprio driver nativo, per esempio <code>i915</code>.",
|
||||
"amdHeading": "AMD",
|
||||
"amdBody": "AMD usa DRI per Mesa/VA-API. Se l’host espone <code>/dev/kfd</code>, lo condivide. ROCm/OpenCL richiede hardware e librerie compatibili; condividere il dispositivo non installa l’intero stack ROCm.",
|
||||
"nvidiaHeading": "NVIDIA",
|
||||
"nvidiaBody": "Condivide i dispositivi <code>/dev/nvidia*</code>. <strong>Le versioni del driver devono corrispondere</strong> per <code>nvidia-smi</code>. Debian/glibc usa il <code>.run</code> della versione host; Alpine/Arch i repository. Sotto 2048 MiB di RAM configurata propone un aumento temporaneo poi ripristinato; richiede anche 1500 MiB liberi su disco.",
|
||||
"updateTitle": "Dopo un aggiornamento NVIDIA host, controlla le librerie LXC",
|
||||
"updateBody": "Vecchie librerie possono causare errori in <code>nvidia-smi</code>. L’<nvidiaLink>installer NVIDIA dell’host</nvidiaLink> propone aggiornamenti dei container. Ripetere l’aggiunta può terminare se i dispositivi esistono già: non garantisce l’aggiornamento delle librerie. Verifica versioni e aggiorna i pacchetti o l’installazione utente adatta."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verifica",
|
||||
"body": "Nel container verifica che la GPU sia visibile e utilizzabile."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Risoluzione dei problemi",
|
||||
"mismatchTitle": "nvidia-smi: Failed to initialize NVML: Driver/library version mismatch",
|
||||
"mismatchBody": "Le librerie non corrispondono al modulo caricato. Verifica le versioni e aggiorna lo spazio utente LXC. Il <code>.run</code> in cache serve per Debian/glibc, ma l’aggiunta può terminare se tutti i dispositivi esistono già.",
|
||||
"denyTitle": "Permesso negato su /dev/dri/renderD128 all'interno del contenitore",
|
||||
"denyBody": "Verifica dispositivo e permessi numerici di <code>render</code>, poi che l’utente appartenga a <code>render</code>. Se disponibile, aggiungilo a <code>render</code> con <code>usermod -aG render <user></code>, sostituendo il segnaposto con l’account reale. Riavvia la sessione. Cambiare privilegi non è una soluzione generale.",
|
||||
"vainfoTitle": "vainfo dice: VA-API versione 1.xx; non inizializzare",
|
||||
"vainfoBody": "Verifica accesso e driver VA-API. I nomi variano per distribuzione: per esempio <code>intel-media-driver</code> per Intel recenti supportate, <code>i965-va-driver</code> per quelle vecchie compatibili e <code>mesa-va-drivers</code> per AMD. Il messaggio da solo non prova che manchi un pacchetto.",
|
||||
"logTitle": "Registro d’installazione",
|
||||
"logBody": "Ogni esecuzione scrive <code>/tmp/add_gpu_lxc.log</code> sull’host. Allegalo alle richieste di assistenza."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Vedi anche",
|
||||
"items": [
|
||||
{
|
||||
"label": "Installare driver NVIDIA (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — installa il driver host prima di condividere NVIDIA."
|
||||
},
|
||||
{
|
||||
"label": "Aggiungi GPU a VM (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — alternativa per dedicare una GPU a una VM."
|
||||
},
|
||||
{
|
||||
"label": "Cambia modalità GPU (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — passa la GPU fra condivisione LXC e assegnazione VM."
|
||||
},
|
||||
{
|
||||
"label": "Comandi di passaggio GPU",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": "— rapido riferimento per i relativi comandi shell."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,203 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Installa Coral TPU sull’host | Documentazione ProxMenux",
|
||||
"description": "Installa componenti Coral su Proxmox VE secondo l’hardware rilevato: gasket/apex con DKMS per M.2 / Mini-PCIe e libedgetpu1-std per USB. Se rileva entrambi esegue entrambe le procedure."
|
||||
},
|
||||
"header": {
|
||||
"title": "Installa Coral TPU sull’host",
|
||||
"description": "Prepara l’host Proxmox per Coral e condivisione LXC. Rileva M.2 / Mini-PCIe, USB o entrambi ed esegue la procedura appropriata: moduli DKMS per PCIe e runtime Google Edge TPU per USB.",
|
||||
"section": "Hardware: GPU e Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Cosa fa",
|
||||
"body": "Un <strong>installer unico che rileva l’hardware</strong>. PCIe usa <code>gasket</code> e <code>apex</code> con DKMS; le compilazioni future richiedono sorgenti e header compatibili. USB usa <code>libedgetpu1-std</code>. Se rileva entrambi esegue entrambi i percorsi. Il runtime USB deve essere dove gira l’app; per l’uso solo in LXC non è necessariamente richiesto sull’host."
|
||||
},
|
||||
"which": {
|
||||
"heading": "Quale Coral ho?",
|
||||
"body": "I modelli PCIe e USB hanno formato e requisiti diversi. Lo script gestisce entrambi; identifica il dispositivo prima di eseguirlo.",
|
||||
"headerForm": "Fattore di forma",
|
||||
"headerDetect": "Rilevazione",
|
||||
"headerInstall": "Tipo di installazione",
|
||||
"headerReboot": "Riavvio?",
|
||||
"pcieForm": "M.2 / Mini-PCIe",
|
||||
"pcieFormSub": "(schede M.2 con una o due Edge TPU)",
|
||||
"pcieDetect": "ID produttore PCI <code>1ac1</code>",
|
||||
"pcieInstall": "Modulo Kernel (gasket + apex) tramite DKMS",
|
||||
"pcieReboot": "Sì",
|
||||
"usbForm": "Acceleratore USB",
|
||||
"usbFormSub": "(piccolo dongle di plastica)",
|
||||
"usbDetect": "USB <code>1a6e:089a</code> (non programmato) / <code>18d1:9302</code> (programmato)",
|
||||
"usbInstall": "Runtime utente <code>libedgetpu1-std</code> dal repository APT Google",
|
||||
"usbReboot": "No"
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Prima di iniziare",
|
||||
"coral": "<strong>Un Coral collegato</strong> (M.2, Mini-PCIe o USB) per installare. Senza hardware rilevato può pulire o rimuovere componenti esistenti, ma non installa un nuovo percorso hardware.",
|
||||
"coralCheck": "lspci -d 1ac1: ; lsusb | grep -E '1a6e:089a|18d1:9302'",
|
||||
"internet": "<strong>Accesso a Internet</strong> sull’host per clonare il driver PCIe da GitHub o scaricare <code>libedgetpu1-std</code> dal repository APT Google per USB.",
|
||||
"headers": "<strong>Header del kernel disponibili tramite APT</strong>: <code>proxmox-headers-$(uname -r)</code>. Servono solo per PCIe/M.2; lo script li installa.",
|
||||
"reboot": "<strong>Pianifica un riavvio</strong> per PCIe. Lo script tenta di caricare i moduli compilati; il riavvio verifica anche il caricamento automatico."
|
||||
},
|
||||
"hostPrepTip": {
|
||||
"title": "Questo prepara soltanto l’host",
|
||||
"body": "Prepara l’host per <em>accedere al dispositivo</em>, senza configurare o verificare l’applicazione. Per <em>usare</em> Coral con un’app compatibile come Frigate, prosegui con <lxcLink>Aggiungere Coral TPU a un LXC</lxcLink>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Eseguire l’installer",
|
||||
"body": "Apri ProxMenux sull’host e scegli <strong>Hardware: GPU e Coral-TPU → Installa/aggiorna Coral TPU sull’host</strong>.",
|
||||
"imageAlt": "Voce del menu per installare o aggiornare Coral TPU sull’host"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Come funziona lo script",
|
||||
"body": "Rileva prima l’hardware e prepara il piano adatto. L’installazione richiede conferma."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Procedura passo per passo",
|
||||
"detect": {
|
||||
"title": "Rilevamento hardware",
|
||||
"body": "Cerca il produttore <code>0x1ac1</code> in <code>/sys/bus/pci/devices/*/vendor</code> e usa <code>lsusb</code> per USB. Esistono <strong>due</strong> ID USB secondo lo stato del firmware:",
|
||||
"items": [
|
||||
"<code>1a6e:089a</code> — Global Unichip, stato <em>non programmato</em>, prima che il runtime carichi il firmware.",
|
||||
"<code>18d1:9302</code> — Google, stato <em>programmato</em>, dopo il caricamento del firmware."
|
||||
],
|
||||
"outro": "Senza Coral rilevato né installazione esistente, mostra un avviso ed esce. I componenti già presenti possono aprire il menu di pulizia o rimozione."
|
||||
},
|
||||
"prompt": {
|
||||
"title": "Conferma dell’installazione",
|
||||
"body": "Prima dell’installazione, una finestra elenca dispositivi e componenti previsti. Annullando si salta l’installazione. La pulizia facoltativa dei vecchi componenti ha una conferma precedente separata.",
|
||||
"imageAlt": "Riepilogo dei dispositivi Coral e dei passaggi d’installazione"
|
||||
},
|
||||
"pcie": {
|
||||
"title": "PCIe: moduli gasket e apex tramite DKMS",
|
||||
"body": "Eseguito solo se rileva un Coral PCIe/M.2. Compila i moduli per il kernel attualmente in esecuzione sull’host.",
|
||||
"items": [
|
||||
"<strong>Pulizia.</strong> Qualsiasi pacchetto <code>gasket-dkms</code> esistente viene rimosso prima della ricompilazione; se è in uno stato incoerente, lo script ne forza la rimozione e la purga.",
|
||||
"<strong>Dipendenze di compilazione:</strong> <code>git</code>, <code>dkms</code>, <code>build-essential</code>, <code>proxmox-headers-$(uname -r)</code>."
|
||||
],
|
||||
"cloneIntro": "<strong>Clona i sorgenti del driver.</strong> Preferisce <feranickLink>feranick/gasket-driver</feranickLink>, altrimenti usa <googleLink>google/gasket-driver</googleLink>. La compilazione dipende dalla compatibilità del kernel. Applica queste patch ai sorgenti Google secondo la versione:",
|
||||
"kernelPatches": [
|
||||
"Da kernel 6.5, la patch sostituisce <code>no_llseek</code> con <code>noop_llseek</code> nei sorgenti alternativi.",
|
||||
"Kernel 6.13 o superiore: converte l’argomento di <code>MODULE_IMPORT_NS(DMA_BUF)</code> in una stringa letterale."
|
||||
],
|
||||
"afterItems": [
|
||||
"<strong>Copia i sorgenti in <code>/usr/src/gasket-1.0/</code>,</strong> genera <code>dkms.conf</code> e li registra con <code>dkms add</code>.",
|
||||
"<strong>Compila e installa:</strong> <code>dkms build</code>, poi <code>dkms install</code>. In caso di errore mostra le ultime 50 righe di <code>make.log</code>, se disponibile.",
|
||||
"<strong>Crea il gruppo <code>apex</code> e le regole udev</strong> (<code>/etc/udev/rules.d/99-coral-apex.rules</code>) per assegnare il gruppo a <code>/dev/apex_*</code>.",
|
||||
"<strong>Tenta di caricare i moduli:</strong> <code>modprobe gasket</code> e <code>modprobe apex</code>."
|
||||
],
|
||||
"imageAlt": "Compilazione DKMS e caricamento dei moduli gasket/apex"
|
||||
},
|
||||
"usb": {
|
||||
"title": "USB: runtime Edge TPU di Google",
|
||||
"body": "Funziona solo se è stato rilevato un acceleratore USB. Molto più semplice:",
|
||||
"items": [
|
||||
"<strong>Aggiunge la chiave GPG Google</strong> in <code>/etc/apt/keyrings/coral-edgetpu.gpg</code>.",
|
||||
"<strong>Aggiunge il repository APT</strong> in <code>/etc/apt/sources.list.d/coral-edgetpu.list</code>; <code>signed-by=</code> limita la verifica al suo portachiavi. Usa sintassi .list su una riga, non .sources deb822.",
|
||||
"<strong>Installa <code>libedgetpu1-std</code></strong>, il runtime Edge TPU con prestazioni standard.",
|
||||
"<strong>Ricarica udev</strong> e applica le regole del pacchetto al dispositivo USB."
|
||||
],
|
||||
"stdTitle": "Perché libedgetpu1-std e non libedgetpu1-max?",
|
||||
"stdBody": "Il pacchetto <code>max</code> attiva la frequenza massima supportata, aumentando prestazioni, consumo e calore. Verifica raffreddamento e condizioni operative dell’acceleratore. I pacchetti si escludono a vicenda; passa all’altro con <code>apt install libedgetpu1-max</code>."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Riavvio facoltativo dopo l’installazione PCIe",
|
||||
"body": "Dopo PCIe propone un riavvio. Ha tentato <code>modprobe</code>; verifica i moduli e <code>/dev/apex_0</code> con gruppo <code>apex</code>. Un riavvio pianificato controlla il caricamento automatico. Con solo USB non propone il riavvio dell’host.",
|
||||
"imageAlt": "Riepilogo e proposta di riavvio dopo l’installazione PCIe"
|
||||
}
|
||||
},
|
||||
"legacyCleanup": {
|
||||
"heading": "Rimuovere il vecchio gasket-dkms dagli host che usano solo USB",
|
||||
"intro": "Se <strong>non rileva Coral PCIe/M.2</strong> ma esiste una precedente installazione di <code>gasket-dkms</code>, propone una pulizia facoltativa con conferma.",
|
||||
"items": [
|
||||
"Se rileva un Coral PCIe/M.2, usa il normale percorso di ricompilazione DKMS e non propone questa pulizia.",
|
||||
"Elimina <code>gasket-dkms</code>, registrazioni DKMS e vecchi sorgenti gasket, poi ripara lo stato in sospeso di <code>dpkg</code>/APT.",
|
||||
"Mantiene i pacchetti USB <code>libedgetpu1-std</code> e <code>libedgetpu1-max</code>, quindi il Coral USB conserva il runtime.",
|
||||
"Lo script verifica che il pacchetto legacy è andato e che la gestione dei pacchetti è sana prima di segnalare il successo."
|
||||
],
|
||||
"warningTitle": "Confermare l'hardware prima",
|
||||
"warningBody": "Se un Coral PCIe/M.2 previsto non appare, annulla la pulizia e controlla scheda, slot e firmware."
|
||||
},
|
||||
"reinstallUninstall": {
|
||||
"heading": "Reinstallare o disinstallare",
|
||||
"intro": "Se rileva un’installazione PCIe con <code>gasket-dkms</code>, USB con <code>libedgetpu1-std</code>/<code>libedgetpu1-max</code> o entrambe, mostra un menu di azioni.",
|
||||
"imageAlt": "Menu per reinstallare, aggiornare o disinstallare Coral",
|
||||
"imageCaption": "Il menu appare se esiste un componente: registrazione DKMS gasket, pacchetto <code>libedgetpu1-*</code> o dispositivi <code>/dev/apex_*</code>.",
|
||||
"reinstallHeading": "Reinstallare / aggiornare",
|
||||
"reinstallBody": "Segue l’installazione normale: ricompila dopo un cambio di kernel o aggiorna <code>libedgetpu1-*</code> da Google. Prima pulisce lo stato DKMS precedente per evitare che un tentativo fallito blocchi la compilazione.",
|
||||
"uninstallHeading": "Disinstallare — ciò che viene rimosso",
|
||||
"uninstallIntro": "Richiede conferma. Le app LXC che usano <code>/dev/apex_*</code> possono perdere l’accesso durante la rimozione o dopo il riavvio. Procedura:",
|
||||
"uninstallItems": [
|
||||
"Tenta di scaricare <code>apex</code> e <code>gasket</code>; l’uso da parte di processi attivi può impedirlo.",
|
||||
"Rimuove ogni voce DKMS-registrato <code>gasket/<version></code> in modo che i moduli non ritornino sul prossimo kernel install.",
|
||||
"Elimina completamente <code>gasket-dkms</code>, <code>libedgetpu1-std</code> e <code>libedgetpu1-max</code>, poi esegue <code>apt-get autoremove --purge</code>.",
|
||||
"Elimina <code>/etc/udev/rules.d/99-coral-apex.rules</code> e ripristina il gruppo predefinito in <code>60-gasket-dkms.rules</code>, se esiste ancora.",
|
||||
"Controlla i membri supplementari di <code>apex</code>. <strong>Se l’elenco è vuoto</strong>, tenta di rimuovere il gruppo; altrimenti mantiene <code>apex</code> ed elenca i membri. Non verifica completamente gli utenti che lo hanno come gruppo principale.",
|
||||
"Rimuove l’elenco dei repository <code>/etc/apt/sources.list.d/coral-edgetpu.list</code>, il vecchio <code>coral-cloud.list</code> e i vecchi portachiavi chiamati <code>coral-edgetpu-archive-keyring.gpg</code>. Il portachiavi attuale in <code>/etc/apt/keyrings/coral-edgetpu.gpg</code> non viene rimosso da questa sequenza.",
|
||||
"Propone un riavvio <strong>solo se PCIe era installato</strong> per scaricare i moduli ancora attivi. Rimuovere solo USB non richiede riavvio."
|
||||
],
|
||||
"lxcWarnTitle": "LXC contenitori con apex passthrough",
|
||||
"lxcWarnBody": "Rimuovere i componenti dell’host può interrompere l’accesso LXC. Pianifica una manutenzione se app compatibili come Frigate dipendono da questo Coral."
|
||||
},
|
||||
"updates": {
|
||||
"heading": "Notifiche di aggiornamento",
|
||||
"intro": "ProxMenux registra i componenti Coral e verifica PCIe/M.2 e USB separatamente. Se sono presenti entrambi, ogni variante usa la propria fonte delle versioni:",
|
||||
"headerVariant": "Variante",
|
||||
"headerTracked": "Versione registrata",
|
||||
"headerUpstream": "Fonte delle versioni",
|
||||
"pcieVariant": "PCIe / M.2",
|
||||
"pcieTracked": "Prima il tag registrato dopo l’installazione riuscita, poi la versione del pacchetto <code>gasket-dkms</code> integro, altrimenti quella DKMS. Quest’ultima non identifica il livello di patch del fork.",
|
||||
"pcieUpstream": "Ultimo tag GitHub di <code>feranick/gasket-driver</code>; cache di sette giorni e confronto del numero di build.",
|
||||
"usbVariant": "USB",
|
||||
"usbTracked": "<code>libedgetpu1-std</code> o <code>libedgetpu1-max</code> versione apt",
|
||||
"usbUpstream": "Candidato locale <code>apt-cache policy</code> (Google Coral apt repo)",
|
||||
"outro": "Se rileva una nuova versione, Monitor invia <code>coral_driver_update_available</code> sui canali abilitati. La notifica rimanda all’installer: scegli <strong>Reinstalla / aggiorna</strong>.",
|
||||
"antiTitle": "Niente notifiche ripetute",
|
||||
"antiBody": "Una notifica per variante quando cambia la versione disponibile. Non la ripete a ogni controllo giornaliero; avvisa di nuovo con una versione successiva.",
|
||||
"rebootTitle": "Aggiornamenti PCIe: pianifica un riavvio",
|
||||
"rebootBody": "Il modulo PCIe ricompilato deve essere caricato; un riavvio pianificato verifica anche il caricamento automatico. Aggiornare la libreria USB non richiede il riavvio dell’host, ma può richiedere quello delle app che usavano la precedente."
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Procedura manuale equivalente",
|
||||
"intro": "Questi comandi mostrano i passaggi principali di ogni percorso per consultarli o eseguirli manualmente.",
|
||||
"pcieHeading": "PCIe / M.2 (gasket + apex tramite DKMS)",
|
||||
"usbHeading": "USB (runtime libedgetpu)"
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verifica",
|
||||
"pcieHeading": "PCIe / M.2",
|
||||
"usbHeading": "USB"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Risoluzione dei problemi",
|
||||
"dkmsFailTitle": "Compilazione DKMS fallita dopo un aggiornamento del kernel",
|
||||
"dkmsFailBody": "Gli header mancanti sono una possibile causa. Verifica <code>proxmox-headers-$(uname -r)</code> con <code>dpkg -l proxmox-headers-$(uname -r)</code> e installali se assenti. Controlla le incompatibilità nel log. Ripetere esegue <code>cleanup_broken_gasket_dkms</code>, senza garantire compatibilità con ogni kernel.",
|
||||
"apexMissTitle": "/dev/apex_0 mancante dopo il riavvio",
|
||||
"apexMissBody": "Verifica rilevamento PCIe e compatibilità del modulo con il kernel attivo. Prova <code>modprobe apex</code> e controlla <code>dmesg | grep -iE \"apex|gasket\"</code>. Errori di compilazione, caricamento o configurazione slot/firmware possono impedire la creazione del dispositivo.",
|
||||
"lxcMissTitle": "L’host vede /dev/apex_0, ma il LXC no",
|
||||
"lxcMissBody": "Un nodo visibile non prova il funzionamento. Verifica accesso sull’host, montaggio LXC, regole cgroup e permessi UID/GID. Vedi <lxcLink>Aggiungere Coral TPU a un LXC</lxcLink>.",
|
||||
"usbUnreachTitle": "Acceleratore USB rilevato ma Frigate / TFLite non può raggiungerlo",
|
||||
"usbUnreachBody": "Verifica le regole di <code>libedgetpu1-std</code> e i permessi con <code>ls -l /dev/bus/usb/*/*</code>. L’utente/gruppo mappato dell’app deve poter leggere e scrivere; root come proprietario non è di per sé un errore. Dopo modifiche esegui <code>udevadm control --reload-rules && udevadm trigger</code> e ricollega se necessario.",
|
||||
"logTitle": "Registro d’installazione",
|
||||
"logBody": "Ogni esecuzione scrive <code>/tmp/coral_install.log</code>. Se DKMS fallisce e il log esiste, aggiunge le ultime 50 righe di <code>/var/lib/dkms/gasket/1.0/build/make.log</code>. Allegalo alle richieste di assistenza."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Vedi anche",
|
||||
"items": [
|
||||
{
|
||||
"label": "Aggiungi Coral TPU a LXC",
|
||||
"href": "/docs/hardware/coral-tpu-lxc",
|
||||
"tail": " — rendere disponibile il Coral dell’host a un container con un’app compatibile."
|
||||
},
|
||||
{
|
||||
"label": "Installare driver NVIDIA (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": "— stessa idea per le GPU NVIDIA."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor — Scheda hardware",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — il pannello Coral mostra driver, moduli, dispositivi e runtime, oltre alla temperatura se disponibile tramite un sensore supportato."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,175 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Installa NVIDIA sull’host | Documentazione ProxMenux",
|
||||
"description": "Installa i driver proprietari NVIDIA su Proxmox VE con ProxMenux: filtro GPU, verifiche di compilazione e DKMS, persistenza, patch NVENC facoltativa e aggiornamento delle librerie LXC."
|
||||
},
|
||||
"header": {
|
||||
"title": "Installare driver NVIDIA sull'host",
|
||||
"description": "Installa NVIDIA sull’host Proxmox VE. Filtra i rami mantenuti per ID PCI del GPU, verifica la compilazione, usa DKMS, gestisce nouveau e installa la persistenza. Può anche aggiornare le librerie dei LXC con accesso NVIDIA.",
|
||||
"section": "Hardware: GPU e Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Cosa fa",
|
||||
"body": "ProxMenux rileva il GPU e propone rami NVIDIA mantenuti che includono il suo ID PCI. Blocca <code>nouveau</code>, scarica l’installer ufficiale <code>.run</code>, usa DKMS, installa <code>nvidia-persistenced</code>, le regole udev e NVIDIA Container Toolkit e propone una patch NVENC facoltativa. I controlli di compilazione riguardano il kernel in esecuzione; una compilazione riuscita non garantisce che ogni app funzioni. Ai LXC NVIDIA esistenti viene proposto un aggiornamento delle librerie userspace, con versione corrispondente tranne su Arch."
|
||||
},
|
||||
"who": {
|
||||
"heading": "Per chi è questo?",
|
||||
"body": "Per video o calcolo accelerato con Plex, Jellyfin, Frigate, Immich o Stable Diffusion <strong>in LXC</strong>, installa prima NVIDIA sull’<em>host</em> Proxmox. L’assegnazione diretta a una <strong>VM</strong> usa la procedura VFIO separata."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Prima di iniziare",
|
||||
"gpu": "<strong>Un GPU NVIDIA</strong> installato nell’host. Il rilevamento è automatico; questa opzione non gestisce AMD o Intel.",
|
||||
"gpuCheck": "lspci | grep -i nvidia",
|
||||
"notVm": "Il GPU <strong>non deve essere riservato a una VM tramite VFIO</strong>. L’installer rifiuta questo caso per non interferire con l’assegnazione.",
|
||||
"internet": "Accesso Internet sull’host. Scarica il driver da <code>download.nvidia.com</code> e può clonare <code>nvidia-persistenced</code> e <code>nvidia-patch</code> da GitHub.",
|
||||
"space": "Prevedi spazio in <code>/opt/nvidia</code> per <code>.run</code> e RAM per compilare. Il percorso LXC non-Arch verifica 1500 MiB liberi e può richiedere temporaneamente 2048 MiB di RAM se inferiore, ripristinando poi il limite precedente. Prevedi il riavvio dell’host."
|
||||
},
|
||||
"vmWarn": {
|
||||
"title": "GPU riservato a una VM? Fermati qui",
|
||||
"body": "Se un dispositivo NVIDIA è associato a <code>vfio-pci</code>, l’installer esce anche con VM ferma. Una riserva non implica utilizzo attivo. Pianifica il ritorno al driver host e rimuovi assegnazioni VM/VFIO obsolete prima di riavviare e installare."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Eseguire l'installatore",
|
||||
"body": "Apri <strong>Hardware Graphics → NVIDIA GPU Driver Installer</strong> in ProxMenux. Il menu dipende dalla presenza di un driver attivo.",
|
||||
"imageAlt": "Menu hardware con installer NVIDIA evidenziato"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Come funziona lo script",
|
||||
"body": "Rileva dispositivi, seleziona una versione e installa. Una pulizia VFIO con conferma separata può precedere la panoramica. Preparazione di repository/header e download precedono la sostituzione del driver; non tutte le modifiche iniziano dopo un’unica conferma finale."
|
||||
},
|
||||
"walkthrough": {
|
||||
"detect": {
|
||||
"title": "GPU rilevamento e panoramica",
|
||||
"body1": "Mostra controller video NVIDIA, stato del driver o <em>«Nessun driver NVIDIA installato»</em> e i LXC configurati per NVIDIA con la loro versione interna.",
|
||||
"body2": "Verifica GPU e versioni di host/container. Annulla nella panoramica se la scelta non è quella prevista; una pulizia VFIO confermata prima è già stata applicata.",
|
||||
"imageAlt": "Panoramica prima dell’installazione: GPU, driver e LXC NVIDIA"
|
||||
},
|
||||
"version": {
|
||||
"title": "Scegli la versione del driver",
|
||||
"body1": "Filtra le versioni di <code>nvidia.com</code> che <strong>includono l’ID PCI del GPU nella tabella dei chip supportati</strong> ed esclude versioni beta/sviluppo tramite euristiche. <em><versione> — Consigliata</em> privilegia l’ultima della branca installata, poi Production Branch e infine il numero di versione supportato più alto.",
|
||||
"body2": "Se il driver risulta modificato con keylase, la selezione si limita alla tabella NVENC. <em>Reinstalla / aggiorna</em> mantiene conferme e scelta della patch; verifica il risultato finale.",
|
||||
"whyTitle": "Come viene validata la compatibilità del kernel",
|
||||
"whyBody": "Filtra per rami mantenuti e ID PCI, senza matrice fissa kernel/driver. Una compilazione preliminare verifica il kernel attuale. Un errore confermato riporta alla selezione; se il test non è disponibile può avvisare e continuare. Restano necessarie installazione e verifica del funzionamento.",
|
||||
"imageAlt": "Selettore dei rami compatibili GPU con versione consigliata in cima"
|
||||
},
|
||||
"uninstall": {
|
||||
"title": "Rimuovere il driver precedente prima di reinstallare",
|
||||
"body": "Dopo download e verifica dell’installer scelto, rimuove il driver precedente. Ferma servizi NVIDIA, scarica moduli, rimuove voci DKMS e disinstalla <code>nvidia-*</code> / <code>libnvidia-*</code> / <code>cuda-*</code>. Vale anche per la reinstallazione confermata della stessa versione."
|
||||
},
|
||||
"prepare": {
|
||||
"title": "Preparare il sistema",
|
||||
"body": "Durante la preparazione, lo script:",
|
||||
"items": [
|
||||
"Controlla i repository prima di rimuovere o installare componenti. Senza abbonamento e con solo Enterprise, chiede di passare a no-subscription; se rifiuti, ferma l’installazione.",
|
||||
"Installa <code>pve-headers-$(uname -r)</code> (o <code>proxmox-headers-$(uname -r)</code>), <code>build-essential</code> e <code>dkms</code>.",
|
||||
"Crea il file gestito da ProxMenux <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code> con <code>blacklist nouveau</code> e <code>options nouveau modeset=0</code>. Registra l’eventuale riga aggiunta a <code>blacklist.conf</code> e tenta di scaricare nouveau.",
|
||||
"Scrive <code>/etc/modules-load.d/nvidia-vfio.conf</code> con <code>nvidia</code> e <code>nvidia_uvm</code> così i moduli caricano presto al boot."
|
||||
]
|
||||
},
|
||||
"download": {
|
||||
"title": "Scaricare ed eseguire l'installatore NVIDIA",
|
||||
"body": "Scarica <code>NVIDIA-Linux-x86_64-<version>.run</code> in <code>/opt/nvidia</code> e verifica dimensione e tipo eseguibile. Sono controlli di formato, non della firma crittografica. Registra DKMS per ricompilare ai cambi di kernel; sorgenti e kernel devono restare compatibili.",
|
||||
"imageAlt": "Avanzamento del download e compilazione DKMS dell’installer NVIDIA"
|
||||
},
|
||||
"persist": {
|
||||
"title": "Servizio di persistenza e regole udev",
|
||||
"body": "Installa <persistLink>nvidia-persistenced</persistLink> e scrive <code>/etc/udev/rules.d/70-nvidia.rules</code> per creare <code>/dev/nvidia*</code> all’avvio. Aiuta a evitare accessi LXC prima che i dispositivi siano disponibili."
|
||||
},
|
||||
"nvenc": {
|
||||
"title": "Opzionale: applicare la patch NVENC",
|
||||
"body": "I limiti di sessioni NVENC dipendono da GPU e driver. <patchLink>keylase/nvidia-patch</patchLink> può rimuovere il limite del driver per versioni supportate. Scegli <strong>Sì</strong> se serve questa modifica alla codifica e la versione è compatibile. Non accelera la decodifica né elimina i limiti hardware.",
|
||||
"supportTitle": "Verifica il supporto della patch",
|
||||
"supportBody": "Cerca la versione esatta nella <patchTableLink>tabella delle patch</patchTableLink>. Se manca, usa il driver senza patch o scegli un’altra versione mantenuta compatibile con GPU, kernel e patch; non basta che sia vicina nell’elenco."
|
||||
},
|
||||
"propagate": {
|
||||
"title": "Facoltativo: aggiorna librerie NVIDIA nei LXC",
|
||||
"body1": "Propone di aggiornare le librerie del driver nei LXC rilevati. Queste e il modulo host <strong>devono avere versioni corrispondenti</strong>; altrimenti <code>nvidia-smi</code> può mostrare «version mismatch».",
|
||||
"body2": "Debian / Ubuntu e altri container glibc ricevono l’installer <code>.run</code> estratto con <code>--no-kernel-modules --no-dkms --no-install-compat32-libs</code>; la RAM può salire temporaneamente a 2 GiB e poi essere ripristinata. <strong>Arch, Manjaro ed EndeavourOS</strong> usano <code>pacman -Syu nvidia-utils</code> dai repository, senza fissare la versione host: verifica il risultato. <strong>Alpine</strong> riceve il contenuto <code>.run</code> estratto tramite <code>pct push</code>, installa <code>gcompat</code> e <code>binutils</code> con <code>apk</code> e crea link SONAME con <code>readelf</code>. Verifica il funzionamento: la compatibilità non garantisce ogni libreria su musl.",
|
||||
"imageAlt": "Dialogo con LXC NVIDIA e versioni per confermare l’aggiornamento"
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Riavvia",
|
||||
"body": "Dopo l’installazione del driver, lo script rigenera <code>initramfs</code> per tutti i kernel; il suo ultimo passaggio propone il riavvio. <strong>Prevedi questo riavvio</strong> per verificare la configurazione persistente dei moduli e di nouveau a un nuovo avvio, anche se il nuovo driver risponde già prima del riavvio."
|
||||
}
|
||||
},
|
||||
"reinstallUninstall": {
|
||||
"heading": "Reinstallare o disinstallare",
|
||||
"intro": "Se <code>nvidia</code> è caricato e <code>nvidia-smi</code> restituisce una versione, mostra un menu di azioni. Rileva così un driver attivo; possono esserci file installati anche senza modulo caricato.",
|
||||
"imageAlt": "Menu di azione NVIDIA offerto quando un driver è già installato — due scelte: Reinstallare / aggiornare il driver, o disinstallare completamente il driver NVIDIA",
|
||||
"imageCaption": "Il menu di azione appare solo quando un driver NVIDIA è attualmente attivo sull'host.",
|
||||
"reinstallHeading": "Reinstallare / aggiornare",
|
||||
"reinstallBody": "Seleziona la versione, prepara repository/header, scarica e verifica la compilazione prima di sostituire il driver. Permette aggiornamenti nel ramo mantenuto o un altro ramo supportato. Dopo ripropone le opzioni per librerie LXC e patch NVENC.",
|
||||
"uninstallHeading": "Disinstallare — ciò che viene rimosso",
|
||||
"uninstallIntro": "Dopo conferma Sì/No, rimuove i seguenti componenti:",
|
||||
"uninstallItems": [
|
||||
"Ferma e disabilita <code>nvidia-persistenced</code> e <code>nvidia-powerd</code>, tenta di scaricare <code>nvidia_uvm</code>, <code>nvidia_drm</code>, <code>nvidia_modeset</code> e <code>nvidia</code>, poi esegue <code>nvidia-uninstall --silent</code> per l’installazione <code>.run</code>. I carichi di lavoro LXC che dipendono da NVIDIA sono coinvolti; client attivi possono impedire lo scaricamento.",
|
||||
"Esegue <code>apt purge</code> su <code>nvidia-*</code>, <code>libnvidia-*</code>, <code>cuda-*</code> e <code>libcudnn*</code>, rimuove l'albero sorgente DKMS e le cartelle <code>nvidia-persistenced</code> e <code>nvidia-patch</code> in <code>/opt/nvidia</code>.",
|
||||
"Rimuove la configurazione di caricamento moduli <code>/etc/modules-load.d/nvidia-vfio.conf</code> e le regole nouveau gestite da ProxMenux. Migra e rimuove anche i vecchi file ProxMenux con le due righe note; conserva i file modificati o estranei dell’amministratore.",
|
||||
"Rimuove <code>/etc/udev/rules.d/70-nvidia.rules</code> e imposta NVENC su <em>removed</em> nel registro delle installazioni gestite; non esiste un file di stato separato.",
|
||||
"Rigenera <code>initramfs</code> per tutti i kernel, esegue <code>proxmox-boot-tool refresh</code> secondo la configurazione di avvio e chiede di riavviare."
|
||||
],
|
||||
"lxcWarnTitle": "LXC con accesso NVIDIA",
|
||||
"lxcWarnBody": "Rimuovere il driver host interrompe le app LXC NVIDIA anche se restano installate le librerie. Pianifica manutenzione per Frigate, Plex, Jellyfin, Ollama e altre app GPU."
|
||||
},
|
||||
"updates": {
|
||||
"heading": "Notifiche sugli aggiornamenti",
|
||||
"body": "Il driver NVIDIA installato viene registrato nell’elenco delle installazioni gestite da ProxMenux. All’avvio e ogni 24 ore, il Monitor confronta le versioni disponibili su <code>download.nvidia.com/XFree86/Linux-x86_64/</code> con la versione indicata da <code>nvidia-smi</code>. La notifica viene inviata solo quando è disponibile una versione di manutenzione più recente nello stesso ramo del driver installato.",
|
||||
"kindsHeading": "Messaggio di aggiornamento",
|
||||
"kindsItems": [
|
||||
"<strong>Manutenzione nello stesso ramo.</strong> Esempio: 580.65.06 installata → 580.105.08 disponibile. Monitor non deduce compatibilità del kernel tra rami."
|
||||
],
|
||||
"antiTitle": "Evitare notifiche ripetute",
|
||||
"antiBody": "Una notifica per nuova versione, non a ogni controllo giornaliero. Nessuna notifica se non esistono versioni più recenti nel ramo installato.",
|
||||
"applyTitle": "Applicare l'aggiornamento",
|
||||
"applyBody": "Monitor segnala gli aggiornamenti senza installarli automaticamente. Apri l’installer, scegli <strong>Reinstalla / aggiorna</strong> e una versione supportata, poi completa compilazione e installazione. Prevedi il riavvio proposto e verifica poi host e librerie LXC."
|
||||
},
|
||||
"verify": {
|
||||
"heading": "Verifica dell'installazione",
|
||||
"intro": "Dopo il riavvio dell’host, accedi tramite SSH o shell Proxmox ed esegui:",
|
||||
"after": "Verifica GPU e versione prevista. Possono già comparire processi se servizi host o container avviati automaticamente usano il GPU. Poi controlla la persistenza:",
|
||||
"imageAlt": "Output di nvidia-smi sull’host con GPU rilevato e versione del driver installata"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Risoluzione dei problemi",
|
||||
"smiFailTitle": "nvidia-smi mostra «NVIDIA-SMI has failed»",
|
||||
"smiFailBody": "Possibili cause: <strong>nouveau</strong>, <strong>header assenti o incompatibili</strong>, sorgenti del driver incompatibili o altri errori di caricamento. Controlla <code>lsmod | grep nouveau</code>, <code>dmesg | grep -i nvidia</code> e registri installer/DKMS. Se serve correggere nouveau, verifica <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code> prima di <code>update-initramfs -u -k all</code> e del riavvio. Non ogni errore di compilazione riguarda gli header.",
|
||||
"lxcMissTitle": "Il contenitore LXC non può vedere il GPU dopo l'aggiornamento dell'host",
|
||||
"lxcMissBody": "Prima di reinstallare controlla dispositivi host, permessi LXC e versione delle librerie. Un conflitto richiede eventualmente il driver utente corrispondente tramite il percorso supportato della distribuzione; su glibc usa <code>--no-kernel-modules</code>. Le librerie non correggono montaggi o permessi mancanti.",
|
||||
"logTitle": "Controlla il registro di installazione",
|
||||
"logBody": "L’installazione scrive in <code>/tmp/nvidia_install.log</code>. In caso di errore controlla download, compilazione DKMS e servizi. Allega il registro alla segnalazione GitHub."
|
||||
},
|
||||
"manualSteps": {
|
||||
"heading": "Cerchi i passaggi manuali?",
|
||||
"body": "Vedi <guideLink>Guide → NVIDIA</guideLink> per le basi manuali, inclusi <code>wget</code> e <code>./NVIDIA-Linux-...run</code>. Spiega i componenti senza riprodurre esattamente l’installer. La procedura mantenuta ProxMenux offre filtro GPU, verifica di compilazione, aggiornamenti LXC e controlli VFIO."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Vedi anche",
|
||||
"items": [
|
||||
{
|
||||
"label": "Aggiungi GPU a VM (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — assegnare NVIDIA direttamente a una VM tramite VFIO."
|
||||
},
|
||||
{
|
||||
"label": "Aggiungi GPU a LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — condividere NVIDIA con uno o più container."
|
||||
},
|
||||
{
|
||||
"label": "Cambia modalità GPU (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — passare da passthrough VM a condivisione LXC e viceversa."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor — Scheda hardware",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — finestra GPU che apre questo installer e mostra il monitoraggio in tempo reale."
|
||||
},
|
||||
{
|
||||
"label": "Comandi per passthrough GPU",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": "— lspci / dmesg / IOMMU / nvidia-smi riferimento."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,172 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Cambia modalità GPU (VM ↔ LXC) | Documentazione ProxMenux",
|
||||
"description": "Passa un GPU da VFIO per VM al driver nativo per LXC o viceversa. ProxMenux rileva il driver, propone come gestire gli ospiti coinvolti, rimuove l’audio associato e rigenera initramfs se cambia la configurazione dell’host."
|
||||
},
|
||||
"header": {
|
||||
"title": "Cambia modalità GPU (VM ↔ LXC)",
|
||||
"description": "Passa un GPU assegnato tra passthrough VM e condivisione LXC. ProxMenux gestisce driver, VFIO, moduli e initramfs e chiede come trattare gli ospiti coinvolti. Controlla le scelte e verifica il risultato dopo il riavvio.",
|
||||
"section": "Hardware: GPU e Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Cosa fa",
|
||||
"body": "Con <code>vfio-pci</code> il GPU è riservato a una VM. Con il driver nativo <em>(i915 / amdgpu / nvidia)</em>, host e LXC possono condividerlo. <strong>Cambia modalità GPU</strong> gestisce <code>vfio.conf</code>, blocchi dei moduli e riferimenti negli ospiti, segnalando le assegnazioni residue."
|
||||
},
|
||||
"graphics": {
|
||||
"lxcTitle": "Pronto per container LXC",
|
||||
"lxcDesc": "Driver nativo attivo",
|
||||
"vmTitle": "Pronto per passthrough VM",
|
||||
"vmDesc": "Driver VFIO-PCI attivo"
|
||||
},
|
||||
"when": {
|
||||
"heading": "Quando dovrei usarlo?",
|
||||
"intro": "Usalo se il GPU è <strong>già assegnato</strong> e vuoi cambiarne l’utilizzo:",
|
||||
"headerSituation": "Situazione",
|
||||
"headerUse": "Usa questa pagina?",
|
||||
"rows": [
|
||||
{
|
||||
"situation": "GPU libero, mai assegnato: usarlo in una VM.",
|
||||
"useRich": "No — usa <vmLink>Aggiungi GPU a VM</vmLink>"
|
||||
},
|
||||
{
|
||||
"situation": "GPU libero, mai assegnato: usarlo in un LXC.",
|
||||
"useRich": "No — usa <lxcLink>Aggiungi GPU a LXC</lxcLink>"
|
||||
},
|
||||
{
|
||||
"situationRich": "Il GPU è assegnato a una VM tramite <code>vfio-pci</code>, ma voglio usarlo in un LXC.",
|
||||
"useRich": "<strong>Sì — questa pagina.</strong>"
|
||||
},
|
||||
{
|
||||
"situation": "Il GPU è condiviso con un LXC; voglio dedicarlo a una VM.",
|
||||
"useRich": "<strong>Sì — questa pagina.</strong>"
|
||||
},
|
||||
{
|
||||
"situation": "Voglio rimuovere tutte le assegnazioni di questo GPU.",
|
||||
"use": "La modalità LXC restituisce il GPU al driver host; la politica di conflitto VM può rimuovere le voci hostpci, ma le voci dei dispositivi LXC vanno rimosse separatamente. Il GPU resta associato a un driver."
|
||||
}
|
||||
]
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Prima di iniziare",
|
||||
"assigned": "<strong>Un GPU già assegnato</strong> a una VM tramite VFIO o a un LXC. Per la prima assegnazione usa Aggiungi GPU a VM / LXC.",
|
||||
"iommu": "<strong>IOMMU deve essere attivo sull’host</strong> passando <em>alla</em> modalità VM. Contano sia le impostazioni del firmware sia il supporto del kernel. Se <code>intel_iommu=on</code> o <code>amd_iommu=on</code> manca nel kernel in esecuzione, lo script lo aggiunge con <code>iommu=pt</code> a <code>/etc/kernel/cmdline</code> (marcatore di root ZFS) o a <code>/etc/default/grub</code>, poi esegue <code>proxmox-boot-tool refresh</code> o <code>update-grub</code>. Controlla eventuali avvisi e riavvia quando richiesto.",
|
||||
"iommuCheck": "dmesg | grep -i 'IOMMU enabled' | head -1",
|
||||
"reboot": "<strong>Prevedi un riavvio.</strong> Le modifiche persistenti a driver e avvio possono richiedere la rigenerazione di initramfs e un riavvio. Lo script lo propone al termine.",
|
||||
"knowList": "<strong>Identifica VM e LXC che usano il GPU.</strong> Lo script rileva i riferimenti e chiede come trattare ogni ospite; conoscere l’elenco facilita la verifica."
|
||||
},
|
||||
"blocklist": {
|
||||
"title": "Non tutte le GPU sono sicure per passare a un VM",
|
||||
"body": "Lo script blocca la modalità VM per gli ID dispositivo <code>8086:5a84</code> e <code>8086:5a85</code> secondo la propria politica di compatibilità. Se un GPU selezionato corrisponde, interrompe il passaggio alla modalità VM e torna alla selezione del GPU, oppure esce se è l’unico GPU. Questa blocklist non impedisce il passaggio <em>alla</em> modalità LXC; altri controlli possono comunque applicarsi."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Eseguire lo script",
|
||||
"body": "Apri <strong>Hardware: GPU e Coral-TPU → Cambia modalità GPU (VM ↔ LXC)</strong> in ProxMenux.",
|
||||
"imageAlt": "Voce Cambia modalità GPU (VM ↔ LXC) nel menu hardware"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Come funziona lo script",
|
||||
"body": "La scelta del GPU e della direzione precede il cambio principale. Una pulizia VFIO separata può chiedere conferma prima; gli ospiti coinvolti hanno dialoghi propri. Leggi ogni conferma: non esiste un’unica conferma finale per tutte le modifiche."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Procedura passo per passo",
|
||||
"detect": {
|
||||
"title": "Rilevare GPU e driver attuale",
|
||||
"body": "Esamina i controller VGA, 3D e Display dell’host e consulta <code>/sys/bus/pci/devices/*/driver</code>. Mostra nome, indirizzo PCI e driver attuale di ogni GPU per identificarne la modalità.",
|
||||
"imageAlt": "Elenco di controllo GPU che mostra ogni GPU rilevato con il suo driver corrente (vfio-pci / nvidia / amdgpu / i915) e slot PCI"
|
||||
},
|
||||
"pickGpu": {
|
||||
"title": "Scegli i GPU da cambiare",
|
||||
"body": "Un solo GPU viene selezionato automaticamente. Con più GPU puoi selezionarne diversi, purché siano nella <em>stessa</em> modalità. Se le modalità sono miste, devi restringere la selezione.",
|
||||
"tipTitle": "Cambiare più GPU insieme",
|
||||
"tipBody": "Esempio: passare tre NVIDIA alla modalità VM, poi riportare l’iGPU a LXC. Due esecuzioni, ciascuna con destinazione comune, anziché cambiare ogni scheda separatamente."
|
||||
},
|
||||
"direction": {
|
||||
"title": "Rivedere la direzione proposta",
|
||||
"intro": "Sulla base della modalità corrente, lo script propone il contrario come obiettivo:",
|
||||
"items": [
|
||||
"<strong>VM → LXC:</strong> rimuove l’associazione a <code>vfio-pci</code> affinché il driver nativo (<code>nvidia</code>, <code>amdgpu</code>, <code>i915</code>) possa usare il GPU. Per NVIDIA elimina le voci BDF corrispondenti da <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> per il prossimo avvio.",
|
||||
"<strong>LXC → VM:</strong> prepara l’associazione a <code>vfio-pci</code>. AMD / Intel bloccano il driver nativo e usano <code>options vfio-pci ids=…</code>. Per NVIDIA, <code>nvidia</code> viene bloccato globalmente solo quando ogni GPU NVIDIA dell’host è in VFIO; altrimenti regole per BDF applicano <code>driver_override=vfio-pci</code> ai dispositivi dei gruppi IOMMU coinvolti, e i GPU NVIDIA esterni a questi gruppi conservano <code>nvidia</code>. Controlla ogni membro del gruppo prima del passaggio."
|
||||
],
|
||||
"outro": "Confermare la direzione o annullare."
|
||||
},
|
||||
"conflict": {
|
||||
"title": "Scelte per ogni VM o LXC coinvolto",
|
||||
"body": "Controlla <code>/etc/pve/lxc/*.conf</code> per riferimenti alla famiglia del driver GPU e <code>/etc/pve/qemu-server/*.conf</code> per assegnazioni PCI. Il rilevamento LXC non identifica ogni scheda tramite BDF esatto. Verifica gli ospiti rilevati e scegli come trattarli:",
|
||||
"headerPolicy": "Politica",
|
||||
"headerEffect": "Effetto",
|
||||
"headerWhen": "Quando scegliere",
|
||||
"keepPolicy": "Mantieni la configurazione, disattiva l’avvio automatico",
|
||||
"keepEffect": "<code>pct set CTID -onboot 0</code> o <code>qm set VMID -onboot 0</code>. Conserva le voci GPU.",
|
||||
"keepWhen": "Se vuoi riutilizzare l’ospite quando il GPU tornerà alla modalità iniziale. Scelta predefinita prudente.",
|
||||
"removePolicy": "Rimuovere GPU da config",
|
||||
"removeEffect": "Rimuove le voci <code>hostpci</code> / <code>dev</code> identificate e i riferimenti precedenti supportati.",
|
||||
"removeWhen": "Se l’ospite deve funzionare senza GPU. Controlla prima l’app: il ripiego sulla CPU dipende dall’applicazione e rimuovere il dispositivo non la riconfigura automaticamente.",
|
||||
"imageAlt": "Dialogo per scegliere come gestire ogni VM o LXC coinvolto"
|
||||
},
|
||||
"audio": {
|
||||
"title": "Rimuovere l’audio associato uscendo dalla modalità VM",
|
||||
"body1": "Molti GPU NVIDIA / AMD espongono audio HDMI nella funzione <code>.1</code> dello stesso slot; possono esserci altri dispositivi audio assegnati. Rimuovendo il GPU possono restare voci audio <code>hostpci</code> obsolete. Verifica le assegnazioni da mantenere.",
|
||||
"body2": "Identifica gli indirizzi BDF audio e mostra un elenco delle assegnazioni da rimuovere. Elimina anche gli ID vendor:device da <code>/etc/modprobe.d/vfio.conf</code>, solo se nessun’altra VM li usa."
|
||||
},
|
||||
"apply": {
|
||||
"title": "Applicare modifiche a host e ospiti",
|
||||
"body": "Una volta confermato, lo script scrive i cambiamenti di lato host — <code>vfio.conf</code>, blacklist, moduli e (per NVIDIA) la regola per-BDF udev a <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> più lo stato BDF a <code>/etc/proxmenux/vfio-bind.bdfs</code>. Esso applica anche la politica di conflitto scelta per ogni VM/LXC interessato. Se l'host config è effettivamente cambiato, viene eseguito <code>update-initramfs -u -k all</code> seguito da <code>proxmox-boot-tool refresh</code>; altrimenti entrambi sono saltati."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Riavvia",
|
||||
"body": "Riavvia l’host per applicare la nuova associazione persistente. Puoi rimandare, ma verifica il driver attivo prima di avviare l’ospite di destinazione: fino al riavvio può restare quello precedente.",
|
||||
"imageAlt": "Riepilogo finestra di dialogo che cosa è cambiato, seguito dal prompt di riavvio"
|
||||
}
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Verifica manuale",
|
||||
"intro": "Prima di <strong>VM → LXC</strong>, controlla driver e regole BDF. L’esempio NVIDIA usa <code>10de:2204</code>: adattalo alla tua scheda. I comandi leggono lo stato; lo script gestisce anche ospiti e membri del gruppo IOMMU.",
|
||||
"lxcToVm": "Prima di <strong>LXC → VM</strong>, controlla indirizzo PCI e gruppo IOMMU. Sostituisci l’indirizzo di esempio e verifica tutti i membri prima dell’assegnazione.",
|
||||
"oneVmTitle": "Un GPU fisico assegnato con VFIO può essere usato da una sola VM alla volta",
|
||||
"oneVmBody": "Mettere più voci <code>hostpci</code> con lo stesso slot PCI in due VM è valida configurazione ma solo una delle VM può iniziare con la GPU — la seconda fallirà. Il passo della politica di conflitto ProxMenux è esattamente quello di evitare questa trappola."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verifica dopo il riavvio"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Risoluzione dei problemi",
|
||||
"stillVfioTitle": "GPU mostra ancora vfio-pci dopo il passaggio alla modalità LXC",
|
||||
"stillVfioBody": "Un modulo VFIO caricato non dimostra quale driver usi il GPU. Verifica associazione, completamento di <code>update-initramfs</code> e riavvio. <code>lsmod | grep vfio</code> elenca solo moduli. Per AMD / Intel controlla <code>vfio.conf</code>; per NVIDIA, <code>/etc/proxmenux/vfio-bind.bdfs</code> e <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code>. Correggi le regole obsolete prima di <code>update-initramfs -u -k all</code> e del riavvio.",
|
||||
"vmFailTitle": "Una VM non si avvia dopo il passaggio del GPU a LXC",
|
||||
"vmFailBody": "Verifica i riferimenti <code>hostpci</code> obsoleti. L’opzione <em>Rimuovi GPU dalla configurazione</em> può eliminarli durante il cambio previsto. Prima di rieseguire lo script controlla la direzione per non invertire la modalità per errore. In alternativa rimuovi l’assegnazione in Proxmox con la VM ferma.",
|
||||
"smiFailTitle": "nvidia-smi mostra «Driver/library version mismatch» tornando a LXC",
|
||||
"smiFailBody": "Confronta il modulo NVIDIA caricato con le librerie installate, anche nei LXC. Allinea le versioni: riavviare carica il modulo installato ma non corregge pacchetti incompatibili. Ricaricare con <code>modprobe -r nvidia</code> e <code>modprobe nvidia</code> richiede di fermare i client GPU e può fallire se sono usati moduli dipendenti.",
|
||||
"logTitle": "Registro di esecuzione",
|
||||
"logBody": "Ogni esecuzione scrive in <code>/tmp/proxmenux_gpu_switch_mode.log</code> sull’host. Allega il registro quando chiedi aiuto su GitHub."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Vedi anche",
|
||||
"items": [
|
||||
{
|
||||
"label": "Aggiungi GPU a VM (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — configurazione iniziale della modalità VM."
|
||||
},
|
||||
{
|
||||
"label": "Aggiungi GPU a LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — configurazione iniziale della modalità LXC."
|
||||
},
|
||||
{
|
||||
"label": "Installare driver NVIDIA (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": "— necessario per la modalità LXC su GPU NVIDIA."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor — Scheda hardware",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — sezione Schede grafiche, con modalità attuale e comando per cambiarla."
|
||||
},
|
||||
{
|
||||
"label": "Comandi per passthrough GPU",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — riferimento rapido ai comandi."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Adicionar Coral TPU ao LXC | Documentação ProxMenux",
|
||||
"description": "Partilhe um Google Coral TPU USB ou M.2 / PCIe com um LXC Proxmox. O ProxMenux configura dispositivos, permissões e montagens, inicia o contentor e instala o runtime Edge TPU em distribuições compatíveis."
|
||||
},
|
||||
"header": {
|
||||
"title": "Adicionar Coral TPU ao LXC",
|
||||
"description": "Partilhe um Coral USB Accelerator ou M.2 / Mini-PCIe com um LXC. O ProxMenux configura o contentor e o runtime Edge TPU. Esta opção trata apenas da TPU: para Quick Sync, VA-API ou NVENC, execute também Adicionar GPU ao LXC.",
|
||||
"section": "Hardware: GPUs e Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "O que faz",
|
||||
"body": "Escreve a configuração em <code>/etc/pve/lxc/<ctid>.conf</code> para <strong>USB Accelerator</strong>, <strong>Coral M.2 / PCIe</strong> ou ambos. Inicia o contentor e instala o runtime Google <code>libedgetpu</code>. O GPU configura-se separadamente em <lxcGpuLink>Adicionar GPU ao LXC</lxcGpuLink>."
|
||||
},
|
||||
"whenUse": {
|
||||
"heading": "Quando utilizar",
|
||||
"body": "Para <frigateLink>Frigate</frigateLink> ou outra aplicação Linux compatível em LXC. O Coral executa a inferência ML suportada em vez da CPU. O desempenho depende do modelo e do hardware; descodificação de vídeo e outras tarefas continuam a consumir recursos."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de começar",
|
||||
"drivers": "<strong>Prepare o dispositivo Coral no anfitrião</strong>. M.2 / PCIe exige o controlador do anfitrião carregado; USB exige acesso ao dispositivo e permissões adequadas. Consulte <hostLink>Instalar Coral TPU no anfitrião</hostLink>. O script instala o runtime da aplicação em contentores Debian/Ubuntu; as outras distribuições têm de o disponibilizar separadamente.",
|
||||
"driversCheck": "ls /dev/apex_* 2>/dev/null ; lsusb | grep -E '1a6e:089a|18d1:9302'",
|
||||
"container": "<strong>Um LXC existente</strong>, de preferência baseado em <strong>Debian / Ubuntu</strong>: a instalação utiliza <code>apt-get</code>. Os <strong>contentores de outras distribuições</strong> podem usar o <strong>modo apenas de passagem direta</strong>, que omite a instalação APT de <code>libedgetpu</code>. É útil se a aplicação já incluir o runtime, como a imagem Docker Frigate.",
|
||||
"downtime": "<strong>Preveja uma breve interrupção</strong> do contentor. O script para-o para alterar a configuração e inicia-o para instalar o runtime. Estas alterações não exigem reiniciar o anfitrião."
|
||||
},
|
||||
"hostPrep": {
|
||||
"title": "Prepare primeiro o anfitrião",
|
||||
"body": "M.2 / PCIe exige <code>gasket</code>/<code>apex</code> no anfitrião e um dispositivo funcional. USB exige dispositivo ligado e permissões; a aplicação não precisa de executar no anfitrião. <code>libedgetpu</code> deve estar onde a aplicação executa. Ordem: <strong>preparar anfitrião → acesso LXC → configurar aplicação</strong>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Executar o script",
|
||||
"body": "No ProxMenux, abra <strong>Hardware: GPU e Coral-TPU → Adicionar Coral TPU ao LXC</strong>.",
|
||||
"imageAlt": "Opção Adicionar Coral TPU ao LXC no menu de hardware"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Como funciona o script",
|
||||
"body": "Escolha o contentor. O script configura o acesso USB mesmo sem Coral USB ligado e acrescenta M.2 / PCIe quando deteta esse hardware."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Procedimento passo a passo",
|
||||
"pick": {
|
||||
"title": "Escolha o contentor LXC",
|
||||
"body": "O seletor mostra os contentores elegíveis de <code>pct list</code>; os OCI são ocultados e geridos em Apps no gestor OCI. Escolha um, iniciado ou parado. O script para-o se necessário, configura-o e inicia-o para instalar o runtime."
|
||||
},
|
||||
"gpuHint": {
|
||||
"title": "Sugestão opcional de acesso ao GPU",
|
||||
"body": "Se for detetado um GPU não configurado para este contentor, uma caixa de diálogo recomenda <lxcGpuLink>Adicionar GPU ao LXC</lxcGpuLink> para descodificação de vídeo por hardware, como Quick Sync, VA-API ou NVENC. Pergunta se pretende continuar apenas com Coral: Sim continua a configuração do TPU; Não sai para que possa configurar primeiro o GPU."
|
||||
},
|
||||
"usb": {
|
||||
"title": "Configurar acesso USB no LXC",
|
||||
"body": "Cria uma regra udev no anfitrião para <code>/dev/coral</code> e monta a árvore <strong>completa</strong> <code>/dev/bus/usb</code> no contentor. A configuração é escrita mesmo sem Coral USB ligado e expõe outros dispositivos além do Coral.",
|
||||
"whyTitle": "Porquê montar o /dev/bus/usb em vez do /dev/coral?",
|
||||
"whyBody": "O caminho USB, como <code>/dev/bus/usb/001/005</code>, muda ao voltar a ligar o acelerador. As versões antigas montavam a ligação <code>/dev/coral</code> e podiam manter um caminho desatualizado. Montar toda a árvore USB permite ver o dispositivo atual. A aplicação poderá ter de voltar a abrir o dispositivo."
|
||||
},
|
||||
"pcie": {
|
||||
"title": "Configurar acesso M.2 / PCIe no LXC",
|
||||
"body1": "Se detetar Coral M.2 / PCIe e existir <code>/dev/apex_0</code>, utiliza a API Proxmox <code>dev</code> para gerir cgroup2 em LXC com e sem privilégios:",
|
||||
"body2": "Se <code>/dev/apex_0</code> estiver ausente após <hostLink>Instalar Coral no anfitrião</hostLink>, o script escreve um bind mount com <code>create=file</code> e, apenas quando o número major do apex consta de <code>/proc/devices</code>, uma regra cgroup2 clássica. Nenhum dos dois cria um dispositivo funcional:",
|
||||
"rebootTitle": "Reiniciar o host primeiro se você acabou de instalar os drivers Coral",
|
||||
"rebootBody": "A montagem alternativa não carrega <code>apex</code> no anfitrião. Carregue o controlador ou reinicie após a instalação e verifique o dispositivo. Execute novamente o script para aplicar a entrada moderna e reinicie o contentor."
|
||||
},
|
||||
"drivers": {
|
||||
"title": "Iniciar o LXC e instalar o runtime Coral",
|
||||
"body": "Inicia o contentor e aguarda até 15 segundos pelo estado running; depois utiliza <code>pct exec</code> para executar o instalador no interior. O instalador:",
|
||||
"items": [
|
||||
"Corre <code>apt-get update</code>.",
|
||||
"Instala os pré-requisitos do repositório Coral: <code>gnupg</code>, <code>curl</code>, <code>ca-certificates</code>.",
|
||||
"Importa a chave Coral GPG do Google para <code>/etc/apt/keyrings/coral-edgetpu.gpg</code> (caminho moderno, o mesmo que o instalador do host usa) e adiciona o repositório <code>coral-edgetpu-stable</code> APT com <code>signed-by=</code>.",
|
||||
"Instala <code>libedgetpu1-std</code> por predefinição. Se detetar Coral M.2, oferece <code>libedgetpu1-std</code> ou <code>libedgetpu1-max</code>. A escolha do pacote não configura por si só a deteção na aplicação."
|
||||
],
|
||||
"noIgpuTitle": "Porque não são instalados controladores iGPU aqui?",
|
||||
"noIgpuBody": "Antes instalava também <code>va-driver-all</code>, <code>intel-opencl-icd</code> e outros pacotes Intel para combinar Quick Sync e Coral. Isso causava falhas confusas quando se pretendia apenas Coral. Agora o iGPU configura-se em <lxcGpuLink>Adicionar GPU ao LXC</lxcGpuLink>; execute-o primeiro para descodificação de vídeo por hardware.",
|
||||
"debianTitle": "Outras distribuições: apenas acesso ao dispositivo",
|
||||
"debianBody": "Utiliza <code>apt-get</code> em Debian/Ubuntu. Para <strong>Alpine, Arch, RHEL ou SUSE</strong>, detetados por <code>/etc/os-release</code>, oferece <em>continuar apenas com acesso ao dispositivo</em> ou <em>cancelar</em>. A primeira opção configura <code>/etc/pve/lxc/<ctid>.conf</code> sem instalar <code>libedgetpu</code>. Se a aplicação já incluir o runtime, como Frigate Docker, esse modo basta. Caso contrário, instale <code>libedgetpu</code> seguindo o <coralLink>guia oficial Google</coralLink>."
|
||||
},
|
||||
"summary": {
|
||||
"title": "Resumo",
|
||||
"body": "No final apresenta Coral USB e M.2 com ✓ ou ⚠ conforme a deteção do hardware. O contentor fica iniciado para configurar Frigate, CodeProject.AI ou a sua aplicação."
|
||||
}
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Procedimento manual equivalente",
|
||||
"body": "Se você quiser ver exatamente o que vai para a configuração LXC, ou aplicá-lo à mão:",
|
||||
"usbHeading": "USB Coral",
|
||||
"pcieHeading": "M.2 / PCIe Coral",
|
||||
"runtimeHeading": "No contentor: runtime Coral"
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verificação",
|
||||
"body": "Abra uma consola no contentor e confirme que o Coral está visível:"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Resolução de problemas",
|
||||
"apexTitle": "LXC iniciado, mas falta /dev/apex_0",
|
||||
"apexBody": "Verifique primeiro o controlador do anfitrião: <code>lsmod | grep apex</code>. Se faltar, tente <code>modprobe apex</code> ou reinicie após a instalação do controlador. Quando existir <code>/dev/apex_0</code> no anfitrião, verifique a entrada de dispositivo LXC (volte a executar o script se só foram escritas as entradas alternativas) e reinicie o contentor com <code>pct stop <ctid> && pct start <ctid></code>.",
|
||||
"replugTitle": "Coral USB desaparece ao ligar noutra porta",
|
||||
"replugBody": "Confirme que o LXC monta <code>/dev/bus/usb</code> em vez da ligação <code>/dev/coral</code>. A configuração deve incluir <code>lxc.mount.entry: /dev/bus/usb dev/bus/usb ...</code> sem depender diretamente de <code>/dev/coral</code>. Execute novamente o script se a configuração for antiga.",
|
||||
"alpineTitle": "Alpine / Arch / RHEL / SUSE: runtime não instalado",
|
||||
"alpineBody": "O <em>modo apenas de passagem direta</em> configura o dispositivo sem instalar <code>libedgetpu</code>. Use um pacote compatível ou compile o código; verifique a disponibilidade antes de comandos como <code>apk add</code> em Alpine. O Frigate pode incluir o runtime. Com Docker no LXC, encaminhe também M.2 com <code>--device /dev/apex_0:/dev/apex_0</code> ou monte USB no Docker: a montagem LXC não basta.",
|
||||
"frigateTitle": "Frigate apresenta «Coral EdgeTPU detected but not available»",
|
||||
"frigateBody": "Verifique runtime, visibilidade e acesso de leitura/escrita do processo real. Para USB, examine permissões e eventual grupo <code>plugdev</code>. Para M.2, inspecione <code>/dev/apex_0</code> com <code>ls -l /dev/apex_0</code>. Um nome como <code>apex</code> em <code>/etc/group</code> não basta: GID numéricos e mapeamentos LXC devem coincidir. Verifique se outro processo ocupa a TPU; não passe logo para modo privilegiado.",
|
||||
"logsTitle": "Verificar os registos da máquina e do contentor",
|
||||
"logsBody": "No anfitrião, veja as mensagens do kernel com <code>journalctl -k | grep -i -e apex -e gasket -e usb</code>. No LXC, consulte os registos da aplicação; com Docker aninhado use <code>docker logs <container></code>. Permissões, runtime ausente, ligação USB ou outro processo a utilizar a TPU podem causar falhas."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionados",
|
||||
"items": [
|
||||
{
|
||||
"label": "Instalar Coral TPU no anfitrião",
|
||||
"href": "/docs/hardware/install-coral-tpu-host",
|
||||
"tail": " — requisito para utilizar placas Coral M.2 / PCIe num CT."
|
||||
},
|
||||
{
|
||||
"label": "Adicionar GPU ao LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — acesso GPU, frequentemente combinado com Coral no Frigate."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Adicionar GPU a VM | Documentação ProxMenux",
|
||||
"description": "Atribua uma GPU física a uma VM Proxmox. O ProxMenux verifica IOMMU, configura VFIO e dispositivos VM e deteta conflitos com outras VM ou LXC."
|
||||
},
|
||||
"header": {
|
||||
"title": "Adicionar GPU a VM (passthrough)",
|
||||
"description": "Deteta GPU Intel, AMD ou NVIDIA para acesso direto numa VM. Verifica IOMMU e dispositivos associados, configura VFIO e VM e aplica regras de compatibilidade. Verifique todos os dispositivos afetados.",
|
||||
"section": "Hardware: GPUs e Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "O que faz",
|
||||
"body": "Automatiza os passos do anfitrião e <code>hostpci</code> da <pveLink>documentação PCI passthrough Proxmox</pveLink>. Verifica atribuições a <em>outros</em> convidados e propõe soluções para conflitos. Não garante suporte para qualquer GPU, método de reset ou controlador convidado."
|
||||
},
|
||||
"who": {
|
||||
"heading": "Para quem é isto?",
|
||||
"body": "Para uma <strong>máquina virtual</strong> usar diretamente a GPU via VFIO. Enquanto estiver associada a VFIO, o controlador do anfitrião não a pode usar, mesmo com a VM parada. Para partilha com <em>LXC</em>, use <lxcLink>Adicionar GPU ao LXC</lxcLink>."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de começar",
|
||||
"gpu": "<strong>GPU compatível</strong> fisicamente instalada. O script deteta Intel, AMD e NVIDIA com <code>lspci</code>.",
|
||||
"gpuCheck": "lspci | grep -iE 'VGA|3D|Display'",
|
||||
"iommu": "<strong>Suporte IOMMU</strong> no hardware e ativação no firmware quando necessária (Intel VT-d ou AMD-Vi). Verifica o sistema e pode configurar Linux; não muda BIOS/UEFI nem prova que IOMMU inativo esteja desativado no firmware.",
|
||||
"q35": "O assistente exige <strong>q35</strong> e recusa <code>i440fx</code>. O tipo de máquina é distinto do firmware BIOS/UEFI. Mudar o chipset de uma VM existente exige planeamento e não é automático.",
|
||||
"q35Check": "qm config VMID | grep machine",
|
||||
"moreGpus": "Prepare <strong>outra GPU ou acesso alternativo</strong> por SSH, IPMI ou série. Reservar a GPU principal pode retirar a imagem local. Em <em>NVIDIA</em>, uma placa fora do grupo IOMMU afetado pode ficar no anfitrião.",
|
||||
"nvidiaInstalled": "Após <nvidiaLink>instalar NVIDIA no anfitrião</nvidiaLink>, as funções escolhidas ficam reservadas a <code>vfio-pci</code> em vez de <code>nvidia</code>. O módulo <code>nvidia</code> pode continuar disponível para <strong>outras</strong> placas fora do grupo IOMMU afetado. Verifique com <code>nvidia-smi</code>."
|
||||
},
|
||||
"pickOne": {
|
||||
"title": "Atribuição exclusiva VM ou partilha LXC",
|
||||
"body": "Um GPU ligado a <code>vfio-pci</code> para a passagem de VM não pode ser usado simultaneamente pelo hospedeiro ou por um LXC. Se você tiver duas GPUs, você pode dedicar uma a cada caminho. Se você tem apenas um, escolha:",
|
||||
"vmItem": "<strong>VM:</strong> acesso direto e exclusivo para essa VM.",
|
||||
"lxcItem": "<strong>LXC (<lxcLink>Adicionar GPU ao LXC</lxcLink>):</strong> partilha o dispositivo com anfitrião e outros contentores pelo controlador nativo."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Executar o instalador",
|
||||
"body": "Abra o ProxMenux e escolha <strong>Hardware: GPU e Coral-TPU → Adicionar GPU a VM</strong>.",
|
||||
"imageAlt": "Opção do menu para adicionar GPU a VM"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Como funciona o script",
|
||||
"body": "Deteção e seleção precedem as alterações principais, confirmadas num resumo final. Ativar IOMMU tem confirmação anterior e pode já alterar o arranque. A limpeza posterior de áudio pode também pedir uma escolha."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Procedimento passo a passo",
|
||||
"detect": {
|
||||
"title": "Detectar GPUs e verificar IOMMU",
|
||||
"body": "Considera o IOMMU ativo apenas quando o kernel em execução tem <code>intel_iommu=on</code> ou <code>amd_iommu=on</code> e existem grupos IOMMU. Se o parâmetro já estiver guardado para o próximo arranque, continua em modo de reinício pendente; caso contrário, um passo confirmado separadamente pode adicioná-lo com <code>iommu=pt</code>. A sua heurística de ficheiro de arranque utiliza <code>/etc/kernel/cmdline</code> quando aí existe uma marca de raiz ZFS como <code>root=ZFS=</code>; caso contrário, utiliza <code>/etc/default/grub</code>. Essa heurística não é prova do carregador de arranque real. O IOMMU recém-configurado entra em vigor após o reinício; verifique depois os grupos reais.",
|
||||
"tipTitle": "Já configurou a pós-instalação?",
|
||||
"tipBody": "Se o <postLink>suporte VFIO IOMMU</postLink> já estiver configurado e ativo no kernel, passa a verificação. Uma definição para o próximo arranque não prova que esteja ativo agora.",
|
||||
"imageAlt": "Lista de GPUs detectadas com fornecedor e endereço PCI"
|
||||
},
|
||||
"preflight": {
|
||||
"title": "Escolher GPU e executar verificações prévias",
|
||||
"intro": "Uma vez que você escolher o GPU, o script executa uma série de verificações que podem cada bloco mais progresso:",
|
||||
"items": [
|
||||
"<strong>Proteção SR-IOV.</strong> Recusa VF e PF com VF ativas porque configura dispositivos completos, não SR-IOV. Configure SR-IOV separadamente em hardware compatível.",
|
||||
"<strong>Uma só GPU.</strong> A consola local pode perder a imagem ao reservá-la para VFIO. Verifique antes o acesso SSH ou web de outro computador.",
|
||||
"<strong>Política de reset AMD.</strong> Lê <code>/sys/bus/pci/devices/<pci>/reset_method</code>. APU ou dedicada sem FLR fica <em>bloqueada pela política do assistente</em>; subtipo desconhecido sem FLR exige confirmação. Não prova impossibilidade universal.",
|
||||
"<strong>Estado D3cold.</strong> Bloqueia placas AMD que indicam <code>D3cold</code> pelo risco de falha na ativação. Verifique alimentação e firmware.",
|
||||
"<strong>Análise do grupo IOMMU.</strong> Lê <code>/sys/kernel/iommu_groups/</code> e inclui no plano da VM <em>todos os membros exceto pontes</em>, possivelmente controladores de rede ou de armazenamento. Se o grupo contiver dispositivos de outro slot, o script lista-os antes do resumo; verifique se o anfitrião não precisa de nenhum. Se o IOMMU aguardar reinício, os grupos reais não estão disponíveis e o plano contém inicialmente só a função GPU selecionada; verifique o isolamento após o reinício."
|
||||
],
|
||||
"audioIntro": "<strong>Áudio associado.</strong> Dois casos consoante a localização do controlador:",
|
||||
"audioDgpu": "<strong>GPU dedicada:</strong> o áudio HDMI ocupa frequentemente a função <code>.1</code> da mesma ranhura PCI e é incluído se detetado. Se o anfitrião o usava, perde acesso ao reservá-lo à VM.",
|
||||
"audioIgpu": "<strong>Sem função áudio <code>.1</code>:</strong> pode estar noutro dispositivo como <code>00:1f.3</code>. Lista controladores e drivers como <code>snd_hda_intel</code>. Por predefinição <strong>nenhum</strong> é selecionado; escolha apenas os necessários."
|
||||
},
|
||||
"pickVm": {
|
||||
"title": "Escolha a VM de destino",
|
||||
"body": "Escolha a VM. Exige q35 e reutiliza entradas GPU existentes quando possível. BIOS/UEFI é uma definição separada, não um tipo de máquina. Não muda automaticamente o chipset nem o arranque do convidado instalado.",
|
||||
"imageAlt": "Seleção de VM por nome, ID e estado"
|
||||
},
|
||||
"switchMode": {
|
||||
"title": "Tratar atribuições existentes",
|
||||
"intro": "O script verifica cada configuração do VM e cada configuração do LXC na máquina à procura do GPU que escolheu. Três resultados possíveis:",
|
||||
"items": [
|
||||
"<strong>GPU disponível.</strong> Continua sem remover atribuições.",
|
||||
"<strong>Atribuída a outra VM.</strong> Pare primeiro a origem. Pode <em>manter as entradas e desativar o arranque automático</em> ou <em>removê-las mantendo o arranque automático</em>. Com <code>vfio-pci</code> já ativo e sem alterações necessárias no anfitrião, VM→VM pode evitar reiniciá-lo.",
|
||||
"<strong>GPU usada por LXC.</strong> Nos contentores normais escolha <em>manter a configuração da GPU e desativar o arranque automático</em> ou <em>remover a configuração do dispositivo GPU, mantendo o arranque automático</em>. A remoção elimina as entradas <code>devN</code> e, em AMD/Intel, também as regras antigas <code>/dev/dri</code> <code>lxc.mount.entry</code> e <code>lxc.cgroup2.devices.allow</code>. Os contentores OCI conservam a configuração e são parados com o arranque automático desativado; remova a sua GPU através de OCI manager Apps. A deteção de conflitos é feita por família de dispositivos GPU e pode abranger outras placas dessa família."
|
||||
],
|
||||
"imageAlt": "Oferecendo diálogo para remover o GPU de um LXC antes de atribuí-lo ao VM",
|
||||
"smartTitle": "Rever áudio associado ao remover a GPU",
|
||||
"smartBody": "Depois pode propor uma lista de <strong>áudio possivelmente sem uso</strong> na VM origem. Desmarque o que ainda precisar. Por exemplo, pode manter <code>02:00.1</code> e propor remover <code>00:1f.3</code>. A lista determina as remoções adicionais, sem garantir todas as associações áudio/imagem."
|
||||
},
|
||||
"audioPick": {
|
||||
"title": "Sem áudio .1, selecione os controladores necessários",
|
||||
"body": "Apenas acontece para configurações de áudio dividido Intel iGPU e semelhantes. Uma lista de verificação mostra cada controlador de áudio PCI no host (excluindo qualquer já no grupo IOMMU do GPU), etiquetado com seu driver atual. Selecione os que você deseja — ou nenhum, se o VM não precisar de áudio do hardware do host.",
|
||||
"imageAlt": "Diálogo de lista de verificação com cada controlador de áudio PCI da máquina (controlador BDF +) quando o GPU não tem áudio .1",
|
||||
"warnTitle": "Não selecione áudio necessário ao anfitrião",
|
||||
"warnBody": "Atribuir áudio pode retirar acesso ao anfitrião; o controlador não pode pertencer também a outra VM ativa. Não selecione áudio desnecessário e verifique as atribuições. O sinal da consola não vem necessariamente do áudio PCI."
|
||||
},
|
||||
"summary": {
|
||||
"title": "Rever o resumo da confirmação",
|
||||
"body": "Verifique o plano final do anfitrião e da VM e cancele se estiver incorreto. Mostra o grupo IOMMU e o número dos seus dispositivos; os membros de outro slot são listados no passo anterior. O cancelamento impede as alterações principais, mas não reverte uma alteração da configuração de arranque IOMMU confirmada separadamente antes.",
|
||||
"imageAlt": "Resumo das alterações previstas no anfitrião e VM"
|
||||
},
|
||||
"hostApply": {
|
||||
"title": "As alterações da máquina são aplicadas",
|
||||
"intro": "A fase de aplicação altera anfitrião e VM. A limpeza áudio pode ainda pedir uma escolha. Pode modificar:",
|
||||
"items": [
|
||||
"<code>/etc/modules</code> — acrescenta <code>vfio</code>, <code>vfio_iommu_type1</code>, <code>vfio_pci</code> (mais <code>vfio_virqfd</code> em kernels < 6.2).",
|
||||
"<code>/etc/modprobe.d/vfio.conf</code> — AMD/Intel: <code>options vfio-pci ids=<vendor:device,...> disable_vga=1</code>. NVIDIA: <code>softdep nvidia pre: vfio-pci</code> (<code>_drm</code>/<code>_modeset</code>/<code>_uvm</code>); a associação efetiva é por BDF. AMD adiciona a ordem de carregamento <code>softdep</code>: <code>vfio-pci</code> → <code>radeon</code>/<code>amdgpu</code>.",
|
||||
"Escreve <code>/etc/modprobe.d/iommu_unsafe_interrupts.conf</code> e <code>kvm.conf</code> com <code>allow_unsafe_interrupts=1</code> e <code>ignore_msrs=1</code>. São definições do script, não requisitos universais Windows/macOS; interrupções inseguras reduzem a proteção do remapeamento.",
|
||||
"<code>/etc/modprobe.d/blacklist.conf</code>: NVIDIA — <code>nouveau</code>/<code>lbm-nouveau</code>; AMD — <code>radeon</code> + <code>amdgpu</code>; Intel — <code>i915</code>. Estas regras por fabricante podem afetar outras placas com o mesmo controlador. O módulo <code>nvidia</code> é bloqueado <strong>apenas</strong> por <code>/etc/modprobe.d/proxmenux-nvidia-vfio-blacklist.conf</code> quando <em>todas</em> as NVIDIA do anfitrião estão reservadas a VFIO.",
|
||||
"<code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> + <code>/etc/proxmenux/vfio-bind.bdfs</code> — <strong>Apenas NVIDIA.</strong> Aplica <code>ATTR'{'driver_override'}'=\"vfio-pci\"</code> no PCI ADD dos BDF registados, incluindo funções do grupo IOMMU afetado. Fora desses grupos pode manter-se <code>nvidia</code>. A política BDF não divide grupos IOMMU físicos.",
|
||||
"<strong>Apenas AMD.</strong> Tenta extrair a ROM de <code>/sys/bus/pci/.../rom</code> ou ACPI VFCT para <code>/usr/share/kvm/vbios_<vendor>_<device>.bin</code>. Se conseguir, a VM usa <code>romfile=</code>. Uma extração válida não garante a inicialização bem-sucedida da GPU.",
|
||||
"<strong>Apenas NVIDIA.</strong> Para e desativa <code>nvidia-persistenced</code>, <code>nvidia-powerd</code>, <code>nvidia-fabricmanager</code> só quando todas as NVIDIA estão reservadas a VFIO. Em uso misto conserva os serviços e <code>nvidia</code> para as placas nativas.",
|
||||
"<code>update-initramfs -u -k all</code> — só é executado se alguma das acima referidas tiver realmente mudado."
|
||||
]
|
||||
},
|
||||
"vmApply": {
|
||||
"title": "A configuração do VM é aplicada através de qm set",
|
||||
"body": "A configuração VM em <code>/etc/pve/qemu-server/<vmid>.conf</code> é atualizada via <code>qm set</code> (nunca por <code>sed</code>):",
|
||||
"after1": "Adiciona <code>x-vga=1</code> para AMD e NVIDIA, <strong>não</strong> Intel. É a política do script, não prova de que todas as iGPU Intel não têm firmware ou que a opção causa sempre bloqueios.",
|
||||
"after2": "Linhas adicionais de <code>hostpciN</code> são adicionadas se o grupo IOMMU do GPU contém outros dispositivos que você precisa passar juntos."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Reinicie se a alteração do anfitrião exigir",
|
||||
"body": "Siga o reinício pedido se mudar arranque ou controladores e verifique a associação ativa antes de iniciar a VM. Configuração guardada não prova ativação. VM→VM com VFIO correto pode evitar reiniciar o anfitrião.",
|
||||
"imageAlt": "Tela de resumo mostrando o que foi alterado, seguido de um prompt de reinicialização"
|
||||
}
|
||||
},
|
||||
"vendors": {
|
||||
"heading": "Notas por fabricante",
|
||||
"nvidiaHeading": "NVIDIA",
|
||||
"nvidiaBody": "Mantém uma solução antiga para <em>Code 43</em>: <code>hidden=1</code>, ID <code>NV43FIX</code> em <code>args</code> e <code>kvm=off</code>. Não é requisito universal das GeForce atuais: NVIDIA ativou passthrough Windows em R465. O erro pode ter outras causas; verifique GPU e controlador.",
|
||||
"nvidiaMultiHeading": "Suporte para multi-GPU NVIDIA",
|
||||
"nvidiaMultiBody": "Uso misto NVIDIA <strong>por BDF</strong>. Regista funções <code>vfio-pci</code> por endereço, não só ID <code>vendor:device</code>. Fora dos grupos afetados pode conservar <code>nvidia</code>; verifique com <code>nvidia-smi</code>. Não isola duas placas do mesmo grupo.",
|
||||
"amdHeading": "AMD",
|
||||
"amdBody": "Algumas AMD falham ao repor após parar uma VM. O assistente verifica capacidades declaradas, não todos os ciclos reais. <vendorResetLink>vendor-reset</vendorResetLink> suporta uma lista limitada e exige kernel compatível e carregamento antecipado; não é instalado. <em>RadeonResetBugFix</em> no Windows também depende do hardware, sem garantia universal.",
|
||||
"intelHeading": "Intel iGPU",
|
||||
"intelBody": "Atribuição completa Intel iGPU e SR-IOV são distintos. O assistente reserva o dispositivo a uma VM sem <code>x-vga=1</code>. <sriovLink>i915-sriov-dkms</sriovLink> exige hardware/kernel suportados; «UHD 630+» não é regra de compatibilidade. Planeie acesso alternativo ao anfitrião."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verificação"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Resolução de problemas",
|
||||
"code43Title": "Código 43 no Windows (NVIDIA)",
|
||||
"code43Body": "Code 43 não prova falha de ocultação. Consulte <code>qm config VMID | grep -E \"cpu|args\"</code> com VMID real, depois <code>hidden=1</code> e <code>hv_vendor_id=NV43FIX</code>. Verifique também controlador convidado, firmware e atribuição. Repetir pode terminar se já atribuída.",
|
||||
"amdResetTitle": "O AMD GPU funciona uma vez, falha na reinicialização do VM",
|
||||
"amdResetBody": "Falha de reset é uma causa possível. Reiniciar ou desligar e ligar pode ajudar temporariamente. Verifique compatibilidade e carregamento antecipado de <code>vendor-reset</code>; <code>softdep amdgpu pre: vendor-reset</code> só por si não garante carregar antes de VFIO. <em>RadeonResetBugFix</em> também exige GPU compatível.",
|
||||
"stuckBootTitle": "O arranque emperrado do VM / GPU não foi detectado",
|
||||
"stuckBootBody": "Consulte o endereço real com <code>lspci -nnk -s PCI_ADDRESS</code>; esperado <code>Kernel driver in use: vfio-pci</code>. Substitua PCI_ADDRESS. Se permanecer o controlador nativo, verifique a política de associação, não só <code>/etc/modprobe.d/blacklist.conf</code>; NVIDIA usa estado BDF. Leia <code>dmesg | grep vfio</code>. Após corrigir, execute <code>update-initramfs -u -k all</code> e siga o reinício previsto.",
|
||||
"darkTitle": "O console da máquina fica escuro depois de reiniciar e eu não posso SSH em",
|
||||
"darkBody": "Um ecrã preto não prova que o anfitrião esteja parado. Se SSH também falhar, verifique rede e controladores incluídos no grupo IOMMU. Recupere por IPMI, série ou ambiente de recuperação; reveja <code>/etc/pve/qemu-server/<vmid>.conf</code> e reverta só atribuições/regras relacionadas. Não elimine outras configurações.",
|
||||
"logTitle": "Verificar o registo de instalação",
|
||||
"logBody": "Cada execução escreve <code>/tmp/add_gpu_vm.log</code>. Anexe o registo ao pedir ajuda."
|
||||
},
|
||||
"revert": {
|
||||
"heading": "Reverter alterações manualmente",
|
||||
"intro": "Pare a VM e remova só as atribuições PCI relevantes em Hardware ou com o índice explícito abaixo. Isso não devolve a GPU ao controlador nativo. Use Alterar modo da GPU para essa transição e verifique os convidados afetados."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionados",
|
||||
"items": [
|
||||
{
|
||||
"label": "Instalar Drivers NVIDIA (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — prepara o controlador para placas mantidas no anfitrião; uma GPU em VFIO não o pode usar ao mesmo tempo."
|
||||
},
|
||||
{
|
||||
"label": "Adicionar GPU ao LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — modelo alternativo: partilhar o GPU com vários contentores em vez de o dedicar a um VM."
|
||||
},
|
||||
{
|
||||
"label": "Alterar modo da GPU (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — alterna a mesma GPU entre partilha e atribuição exclusiva."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de passagem GPU",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — lspci, verificação IOMMU, referência qm set hostpci."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,185 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Adicionar GPU ao LXC | Documentação ProxMenux",
|
||||
"description": "Partilhe GPU Intel, AMD ou NVIDIA com LXC. O ProxMenux configura dispositivos, grupos e bibliotecas conforme a distribuição; a aplicação tem de suportar e configurar a aceleração."
|
||||
},
|
||||
"header": {
|
||||
"title": "Adicionar GPU ao LXC",
|
||||
"description": "Partilha acesso GPU com LXC através dos dispositivos do anfitrião. O controlador permanece no anfitrião; as aplicações exigem bibliotecas compatíveis e configuração própria.",
|
||||
"section": "Hardware: GPUs e Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "O que faz",
|
||||
"body": "Adiciona entradas <code>dev<N></code> a <code>/etc/pve/lxc/<ctid>.conf</code> para os nós <code>/dev/dri/*</code>, <code>/dev/kfd</code> ou <code>/dev/nvidia*</code> aplicáveis. Inicia o contentor, instala pacotes userspace da sua distribuição e, para Intel/AMD, alinha os grupos <code>video</code> e <code>render</code>. A aceleração das aplicações continua a exigir hardware, bibliotecas e configuração da aplicação compatíveis."
|
||||
},
|
||||
"compare": {
|
||||
"heading": "Partilha LXC ou atribuição direta a uma VM",
|
||||
"intro": "O LXC partilha o kernel e pode <em>partilhar</em> a GPU entre anfitrião e contentores. Com <vmLink>atribuição completa a uma VM</vmLink>, o dispositivo fica dedicado à VM e indisponível para o controlador do anfitrião.",
|
||||
"headerFeature": "Característica",
|
||||
"headerLxc": "LXC (esta página)",
|
||||
"headerVm": "VM",
|
||||
"rows": [
|
||||
{
|
||||
"feature": "O host continua usando o GPU?",
|
||||
"lxc": "Sim",
|
||||
"vm": "Não — exclusiva do VM"
|
||||
},
|
||||
{
|
||||
"feature": "Vários contentores a partilhar um GPU?",
|
||||
"lxc": "Sim",
|
||||
"vm": "Não"
|
||||
},
|
||||
{
|
||||
"feature": "Requer IOMMU / VFIO no host?",
|
||||
"lxc": "Não",
|
||||
"vm": "Sim"
|
||||
},
|
||||
{
|
||||
"feature": "É necessário reiniciar?",
|
||||
"lxc": "Normalmente não (apenas reinicie o CT)",
|
||||
"vm": "Se mudar o controlador ou IOMMU do anfitrião; não a cada atribuição"
|
||||
},
|
||||
{
|
||||
"feature": "Sistemas operativos convidados",
|
||||
"lxc": "Apenas Linux (LXC é somente Linux)",
|
||||
"vm": "SO convidado suportado com controlador GPU compatível"
|
||||
}
|
||||
]
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de começar",
|
||||
"gpu": "<strong>GPU no anfitrião</strong> Intel, AMD ou NVIDIA, detetada via <code>lspci</code>.",
|
||||
"gpuCheck": "lspci | grep -iE 'VGA|3D|Display'",
|
||||
"vfio": "<strong>A GPU não deve estar associada a vfio-pci.</strong> Precisa do controlador nativo do anfitrião. Se atribuída a uma VM, o script propõe <switchLink>Alterar modo da GPU</switchLink>.",
|
||||
"nvidia": "<strong>Para NVIDIA:</strong> instale primeiro o controlador no anfitrião. As bibliotecas do contentor têm de corresponder à versão. Use <nvidiaLink>Instalar controladores NVIDIA no anfitrião</nvidiaLink>.",
|
||||
"nvidiaCheck": "nvidia-smi",
|
||||
"container": "<strong>Um LXC existente.</strong> O script não o cria. Suporta ambos os modos; um contentor <strong>privilegiado</strong> não é sempre necessário. Dispositivos e permissões numéricas da aplicação têm de corresponder."
|
||||
},
|
||||
"unpriv": {
|
||||
"title": "Suporta contentores privilegiados e sem privilégios",
|
||||
"body": "O script escreve entradas <code>dev<N></code> para a configuração LXC e, em recipientes não privilegiados, alinha os GIDs <code>video</code> e <code>render</code> entre o host e o recipiente para que os nós do dispositivo GPU sejam alcançáveis de dentro sem que você tenha que editar manualmente <code>lxc.idmap</code>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Executar o instalador",
|
||||
"body": "Abra o ProxMenux e escolha <strong>Hardware: GPU e Coral-TPU → Adicionar GPU ao LXC</strong>.",
|
||||
"imageAlt": "Opção do menu para adicionar GPU ao LXC"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Como funciona o script",
|
||||
"body": "Escolha contentor e famílias GPU e passe as verificações. Depois para e altera o contentor sem confirmação final adicional. A limpeza VFIO opcional tem confirmação separada e pode alterar antes o anfitrião."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Procedimento passo a passo",
|
||||
"detect": {
|
||||
"title": "Detectar GPUs da máquina",
|
||||
"body": "Procura controladores GPU com <code>lspci</code>. Para NVIDIA verifica o módulo <code>nvidia</code> e <code>nvidia-smi</code>; a versão detetada determina o instalador <code>.run</code> do contentor.",
|
||||
"tipTitle": "O NVIDIA não está pronto?",
|
||||
"tipBody": "Se faltar o módulo ou NVIDIA não funcionar no anfitrião, use primeiro <nvidiaLink>Instalar controladores NVIDIA no anfitrião</nvidiaLink> e verifique o controlador."
|
||||
},
|
||||
"pickCt": {
|
||||
"title": "Escolha um contentor LXC",
|
||||
"body": "Lista os contentores LXC elegíveis por ID e nome; os contentores OCI são excluídos e utilizam OCI manager Apps para os dispositivos. O contentor é parado se estiver em execução, iniciado para a instalação dos controladores e normalmente reposto no estado original (em execução/parado).",
|
||||
"imageAlt": "Seleção de um contentor LXC existente"
|
||||
},
|
||||
"selectGpu": {
|
||||
"title": "Selecione as famílias GPU",
|
||||
"body": "A lista seleciona famílias por fabricante, não um dispositivo PCI isolado. Intel/AMD adicionam os nós DRI previstos; NVIDIA os dispositivos disponíveis, eventualmente de várias placas. Uma única família é selecionada automaticamente. Verifique a lista final, sobretudo com várias GPU.",
|
||||
"imageAlt": "Lista de famílias GPU detetadas com nome e endereço PCI"
|
||||
},
|
||||
"preflight": {
|
||||
"title": "Verificações prévias",
|
||||
"imageAlt": "Proposta de alteração de modo de uma GPU associada a vfio-pci",
|
||||
"intro": "Três verificações, qualquer uma das quais pode bloqueá-lo ou redirecioná-lo:",
|
||||
"items": [
|
||||
"<strong>Proteção SR-IOV.</strong> O assistente bloqueia VF ou PF com VF ativas. É uma limitação da seleção ampla de dispositivos, não uma proibição geral em LXC. Configure-os separadamente.",
|
||||
"<strong>Associada a vfio-pci.</strong> O controlador nativo não pode criar <code>/dev/dri/*</code> ou <code>/dev/nvidia*</code>. Propõe <switchLink>Alterar modo da GPU</switchLink>; siga as indicações de reinício e volte depois.",
|
||||
"<strong>Já configurada.</strong> Se todos os dispositivos estiverem presentes, termina sem reinstalar bibliotecas. Continua apenas com as famílias selecionadas em falta."
|
||||
]
|
||||
},
|
||||
"applyConfig": {
|
||||
"title": "Aplicar as alterações de configuração do LXC",
|
||||
"body1": "Para o contentor, se estiver em execução, e altera <code>/etc/pve/lxc/<ctid>.conf</code>. As entradas numeradas <code>dev<N></code> incluem o GID do anfitrião de <code>video</code> ou <code>render</code>. As linhas bind <code>lxc.mount.entry</code> existentes para <code>/dev/dri</code> são substituídas por entradas <code>dev:</code>; verifique a configuração e as permissões resultantes.",
|
||||
"body2": "Exemplo após Intel + NVIDIA no mesmo recipiente:"
|
||||
},
|
||||
"installDrivers": {
|
||||
"title": "Iniciar o recipiente e instalar drivers dentro",
|
||||
"body": "Inicia o contentor e espera até cerca de 30 segundos pela resposta de <code>pct exec</code>. Deteta a distribuição por <code>/etc/os-release</code> e instala os pacotes adequados.",
|
||||
"headerDistro": "Distribuição",
|
||||
"headerInt": "Intel / AMD",
|
||||
"headerNvidia": "NVIDIA",
|
||||
"rows": [
|
||||
{
|
||||
"distro": "Alpine",
|
||||
"intel": "apk add mesa-va-gallium intel-media-driver libva-utils",
|
||||
"nvidia": "apk add nvidia-utils"
|
||||
},
|
||||
{
|
||||
"distro": "Arch / Manjaro",
|
||||
"intel": "pacman -Sy intel-media-driver mesa libva-utils",
|
||||
"nvidia": "pacman -Sy nvidia-utils"
|
||||
}
|
||||
],
|
||||
"debianDistro": "Debian / Ubuntu / outros",
|
||||
"debianIntel": "apt-get install va-driver-all intel-opencl-icd vainfo",
|
||||
"debianNvidia": "Extrai <code>.run</code> no anfitrião → <code>pct push</code> → instala com <code>--no-kernel-modules --no-dkms</code>.",
|
||||
"whyTitle": "Porque utiliza o instalador NVIDIA .run no Debian",
|
||||
"whyBody": "Os pacotes podem não corresponder ao anfitrião. As bibliotecas <strong>têm de corresponder ao módulo carregado</strong> para NVML e <code>nvidia-smi</code>. Debian/glibc usa o <code>.run</code> dessa versão em cache, extrai e arquiva no anfitrião, transfere com <code>pct push</code> e instala com <code>--no-kernel-modules --no-dkms</code>. Alpine e Arch usam repositórios: verifique as versões."
|
||||
},
|
||||
"alignGids": {
|
||||
"title": "Alinhar GIDs e restaurar o estado",
|
||||
"body1": "Para Intel/AMD, lê os GID do anfitrião de <code>video</code> e <code>render</code>, usando 44/104 apenas como alternativa, e depois altera <code>/etc/group</code> no contentor para corresponderem; as execuções apenas com NVIDIA saltam este passo. Entradas como <code>video:44</code> e <code>render:104</code> são exemplos, não ID universais. Verifique a pertença da aplicação aos grupos e as permissões efetivas dos dispositivos.",
|
||||
"body2": "Ao concluir normalmente, volta a parar o contentor se estava parado; se estava ativo mantém-no ativo. Se falhar o arranque ou a instalação, verifique o estado final e o registo."
|
||||
}
|
||||
},
|
||||
"vendors": {
|
||||
"heading": "Notas por fabricante",
|
||||
"intelHeading": "Intel iGPU",
|
||||
"intelBody": "A aceleração multimédia Intel, incluindo <em>Quick Sync</em>, depende da geração do GPU, dos codecs e da configuração da aplicação. O script partilha os que existirem de entre <code>/dev/dri/card0</code>, <code>card1</code>, <code>renderD128</code> e <code>renderD129</code>; outros números de nó não são adicionados. O anfitrião tem de os disponibilizar já através do seu controlador nativo, por exemplo <code>i915</code>.",
|
||||
"amdHeading": "AMD",
|
||||
"amdBody": "AMD usa DRI para Mesa/VA-API. Se existir <code>/dev/kfd</code> no anfitrião, também o partilha. ROCm/OpenCL exige hardware e bibliotecas compatíveis; partilhar o dispositivo não instala toda a pilha ROCm.",
|
||||
"nvidiaHeading": "NVIDIA",
|
||||
"nvidiaBody": "Partilha os dispositivos <code>/dev/nvidia*</code>. <strong>As versões do controlador têm de corresponder</strong> para <code>nvidia-smi</code>. Debian/glibc usa o <code>.run</code> da versão do anfitrião; Alpine/Arch os repositórios. Abaixo de 2048 MiB de RAM configurada propõe um aumento temporário e depois restaura; exige também 1500 MiB livres em disco.",
|
||||
"updateTitle": "Após atualizar NVIDIA no anfitrião, verifique as bibliotecas LXC",
|
||||
"updateBody": "Bibliotecas antigas podem causar erros em <code>nvidia-smi</code>. O <nvidiaLink>instalador NVIDIA do anfitrião</nvidiaLink> propõe atualizar contentores. Repetir a adição pode terminar se já existirem dispositivos: não garante atualizar bibliotecas. Verifique versões e atualize os pacotes ou a instalação de utilizador adequada."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verificação",
|
||||
"body": "No contentor verifique se a GPU está visível e utilizável."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Resolução de problemas",
|
||||
"mismatchTitle": "nvidia-smi: Failed to initialize NVML: Driver/library version mismatch",
|
||||
"mismatchBody": "As bibliotecas não correspondem ao módulo carregado. Verifique versões e atualize o espaço de utilizador LXC. O <code>.run</code> em cache serve para Debian/glibc, mas a adição pode terminar se todos os dispositivos já existirem.",
|
||||
"denyTitle": "Permissão negada em /dev/dri/renderD128 dentro do recipiente",
|
||||
"denyBody": "Verifique dispositivo e permissões numéricas de <code>render</code>, depois se o utilizador pertence a <code>render</code>. Se disponível, adicione-o a <code>render</code> com <code>usermod -aG render <user></code>, substituindo o marcador pela conta real. Reinicie a sessão. Mudar privilégios não é uma solução geral.",
|
||||
"vainfoTitle": "vainfo indica: VA-API version 1.xx; failed to initialize",
|
||||
"vainfoBody": "Verifique acesso e controlador VA-API. Os nomes variam por distribuição: por exemplo <code>intel-media-driver</code> para Intel recentes suportadas, <code>i965-va-driver</code> para antigas compatíveis e <code>mesa-va-drivers</code> para AMD. A mensagem só por si não prova que falte um pacote.",
|
||||
"logTitle": "Registo de instalação",
|
||||
"logBody": "Cada execução escreve <code>/tmp/add_gpu_lxc.log</code> no anfitrião. Anexe o registo ao pedir ajuda."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionados",
|
||||
"items": [
|
||||
{
|
||||
"label": "Instalar Drivers NVIDIA (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — instale o controlador do anfitrião antes de partilhar NVIDIA."
|
||||
},
|
||||
{
|
||||
"label": "Adicionar GPU a VM (passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — alternativa para dedicar uma GPU a uma VM."
|
||||
},
|
||||
{
|
||||
"label": "Alterar modo da GPU (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — alterna a GPU entre partilha LXC e atribuição VM."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de passagem GPU",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — referência rápida para comandos de shell relacionados."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,203 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Instalar Coral TPU no anfitrião | Documentação ProxMenux",
|
||||
"description": "Instala componentes Coral no Proxmox VE conforme o hardware detetado: gasket/apex com DKMS para M.2 / Mini-PCIe e libedgetpu1-std para USB. Se detetar ambos, executa os dois procedimentos."
|
||||
},
|
||||
"header": {
|
||||
"title": "Instalar Coral TPU no anfitrião",
|
||||
"description": "Prepare o anfitrião Proxmox para Coral e partilha LXC. Deteta M.2 / Mini-PCIe, USB ou ambos e executa o procedimento adequado: módulos DKMS para PCIe e runtime Google Edge TPU para USB.",
|
||||
"section": "Hardware: GPUs e Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "O que faz",
|
||||
"body": "Um <strong>instalador único que deteta o hardware</strong>. PCIe utiliza <code>gasket</code> e <code>apex</code> com DKMS; compilações futuras exigem código e cabeçalhos compatíveis. USB utiliza <code>libedgetpu1-std</code>. Se detetar ambos, executa os dois processos. O runtime USB deve estar onde a aplicação executa; para uso apenas em LXC não é obrigatório no anfitrião."
|
||||
},
|
||||
"which": {
|
||||
"heading": "Qual Coral eu tenho?",
|
||||
"body": "Os modelos PCIe e USB têm formatos e requisitos diferentes. O script trata ambos; identifique o dispositivo antes de executar.",
|
||||
"headerForm": "Factor de forma",
|
||||
"headerDetect": "Detecção",
|
||||
"headerInstall": "Tipo de instalação",
|
||||
"headerReboot": "Reiniciar?",
|
||||
"pcieForm": "M.2 / Mini-PCIe",
|
||||
"pcieFormSub": "(placas M.2 com uma ou duas Edge TPU)",
|
||||
"pcieDetect": "ID de fabricante PCI <code>1ac1</code>",
|
||||
"pcieInstall": "Módulo do kernel (gasket + apex) via DKMS",
|
||||
"pcieReboot": "Sim",
|
||||
"usbForm": "Acelerador USB",
|
||||
"usbFormSub": "(dongle de plástico pequeno)",
|
||||
"usbDetect": "<code>1a6e:089a</code> USB (não programado) / <code>18d1:9302</code> (programado)",
|
||||
"usbInstall": "Runtime <code>libedgetpu1-std</code> do repositório APT Google",
|
||||
"usbReboot": "Não"
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de começar",
|
||||
"coral": "<strong>Um Coral ligado</strong> (M.2, Mini-PCIe ou USB) para instalar. Sem hardware detetado pode limpar ou remover componentes existentes, mas não instala um novo percurso de hardware.",
|
||||
"coralCheck": "lspci -d 1ac1: ; lsusb | grep -E '1a6e:089a|18d1:9302'",
|
||||
"internet": "<strong>Acesso à Internet</strong> no anfitrião para clonar o controlador PCIe do GitHub ou transferir <code>libedgetpu1-std</code> do repositório APT Google para USB.",
|
||||
"headers": "<strong>Cabeçalhos do kernel disponíveis via APT</strong>: <code>proxmox-headers-$(uname -r)</code>. Necessários apenas para PCIe/M.2; o script instala-os.",
|
||||
"reboot": "<strong>Planeie um reinício</strong> para PCIe. O script tenta carregar os módulos compilados; reiniciar permite verificar o carregamento automático."
|
||||
},
|
||||
"hostPrepTip": {
|
||||
"title": "Isto só prepara a máquina",
|
||||
"body": "Prepara o anfitrião para <em>aceder ao dispositivo</em>, sem configurar nem testar a aplicação. Para <em>usar</em> Coral numa aplicação compatível como Frigate, siga <lxcLink>Adicionar Coral TPU a um LXC</lxcLink>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Executar o instalador",
|
||||
"body": "Abra o ProxMenux no anfitrião e escolha <strong>Hardware: GPU e Coral-TPU → Instalar/atualizar Coral TPU no anfitrião</strong>.",
|
||||
"imageAlt": "Opção do menu para instalar ou atualizar Coral TPU no anfitrião"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Como funciona o script",
|
||||
"body": "Deteta primeiro o hardware e prepara o plano adequado. A instalação exige confirmação."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Procedimento passo a passo",
|
||||
"detect": {
|
||||
"title": "Detecção de hardware",
|
||||
"body": "Procura o fabricante <code>0x1ac1</code> em <code>/sys/bus/pci/devices/*/vendor</code> e usa <code>lsusb</code> para USB. Existem <strong>dois</strong> ID USB consoante o estado do firmware:",
|
||||
"items": [
|
||||
"<code>1a6e:089a</code> — Global Unichip, estado <em>não programado</em>, antes de o runtime carregar o firmware.",
|
||||
"<code>18d1:9302</code> — Google, estado <em>programado</em>, após carregar o firmware."
|
||||
],
|
||||
"outro": "Sem Coral detetado nem instalação existente, apresenta um aviso e termina. Componentes existentes podem abrir o menu de limpeza ou remoção."
|
||||
},
|
||||
"prompt": {
|
||||
"title": "Confirmação da instalação",
|
||||
"body": "Antes da instalação, um diálogo apresenta dispositivos e componentes previstos. Cancelar ignora a instalação. A limpeza opcional de componentes antigos tem uma confirmação anterior independente.",
|
||||
"imageAlt": "Resumo dos dispositivos Coral e passos de instalação"
|
||||
},
|
||||
"pcie": {
|
||||
"title": "PCIe: módulos gasket e apex via DKMS",
|
||||
"body": "Executado apenas se detetar um Coral PCIe/M.2. Compila os módulos para o kernel em execução no anfitrião.",
|
||||
"items": [
|
||||
"<strong>Limpeza.</strong> Qualquer pacote <code>gasket-dkms</code> existente é removido antes de recompilar; se estiver num estado incorreto, o script força a sua remoção e purga.",
|
||||
"<strong>Dependências de compilação:</strong> <code>git</code>, <code>dkms</code>, <code>build-essential</code>, <code>proxmox-headers-$(uname -r)</code>."
|
||||
],
|
||||
"cloneIntro": "<strong>Clona o código do controlador.</strong> Prefere <feranickLink>feranick/gasket-driver</feranickLink>, recorrendo a <googleLink>google/gasket-driver</googleLink> se indisponível. A compilação depende da compatibilidade do kernel. Aplica estas correções ao código Google conforme a versão:",
|
||||
"kernelPatches": [
|
||||
"Para kernel 6.5 ou superior, substitui <code>no_llseek</code> por <code>noop_llseek</code> no código alternativo.",
|
||||
"Kernel 6.13 ou superior: converte o argumento de <code>MODULE_IMPORT_NS(DMA_BUF)</code> numa cadeia literal."
|
||||
],
|
||||
"afterItems": [
|
||||
"<strong>Copia o código para <code>/usr/src/gasket-1.0/</code>,</strong> gera <code>dkms.conf</code> e regista-o com <code>dkms add</code>.",
|
||||
"<strong>Compila e instala:</strong> <code>dkms build</code> e depois <code>dkms install</code>. Se falhar, mostra as últimas 50 linhas de <code>make.log</code>, se disponível.",
|
||||
"<strong>Cria o grupo <code>apex</code> e regras udev</strong> (<code>/etc/udev/rules.d/99-coral-apex.rules</code>) para atribuir o grupo a <code>/dev/apex_*</code>.",
|
||||
"<strong>Tenta carregar os módulos:</strong> <code>modprobe gasket</code> e <code>modprobe apex</code>."
|
||||
],
|
||||
"imageAlt": "Compilação DKMS e carregamento dos módulos gasket/apex"
|
||||
},
|
||||
"usb": {
|
||||
"title": "USB: runtime Edge TPU da Google",
|
||||
"body": "Só é executado se um Acelerador USB foi detectado. Muito mais simples:",
|
||||
"items": [
|
||||
"<strong>Adiciona a chave GPG Google</strong> a <code>/etc/apt/keyrings/coral-edgetpu.gpg</code>.",
|
||||
"<strong>Adiciona o repositório APT</strong> em <code>/etc/apt/sources.list.d/coral-edgetpu.list</code>; <code>signed-by=</code> limita a verificação ao respetivo chaveiro. Usa sintaxe .list numa linha, não .sources deb822.",
|
||||
"<strong>Instala <code>libedgetpu1-std</code></strong>, o runtime Edge TPU de desempenho padrão.",
|
||||
"<strong>Recarrega o udev</strong> e aplica as regras do pacote ao dispositivo USB."
|
||||
],
|
||||
"stdTitle": "Porquê libedgetpu1-std em vez de libedgetpu1-max?",
|
||||
"stdBody": "O pacote <code>max</code> ativa a frequência máxima suportada, aumentando desempenho, consumo e calor. Verifique a refrigeração e condições de utilização do acelerador. Os pacotes são mutuamente exclusivos; altere com <code>apt install libedgetpu1-max</code>."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Reinício opcional após a instalação PCIe",
|
||||
"body": "Após PCIe propõe reiniciar. Já tentou <code>modprobe</code>; verifique os módulos e <code>/dev/apex_0</code> com grupo <code>apex</code>. Um reinício planeado verifica o carregamento automático. Só USB não pede reinício do anfitrião.",
|
||||
"imageAlt": "Resumo e proposta de reinício após instalação PCIe"
|
||||
}
|
||||
},
|
||||
"legacyCleanup": {
|
||||
"heading": "Limpar gasket-dkms antigo em anfitriões que só usam USB",
|
||||
"intro": "Se <strong>não detetar Coral PCIe/M.2</strong> mas existir uma instalação antiga de <code>gasket-dkms</code>, propõe uma limpeza opcional com confirmação.",
|
||||
"items": [
|
||||
"Se detetar um Coral PCIe/M.2, utiliza o procedimento normal de recompilação DKMS e não propõe esta limpeza.",
|
||||
"Purga <code>gasket-dkms</code>, remove registos DKMS e código antigo gasket e repara o estado pendente de <code>dpkg</code>/APT.",
|
||||
"Mantém os pacotes USB <code>libedgetpu1-std</code> e <code>libedgetpu1-max</code>, pelo que o Coral USB conserva o runtime.",
|
||||
"O script verifica que o pacote legado desapareceu e que o gerenciamento de pacotes é saudável antes de relatar o sucesso."
|
||||
],
|
||||
"warningTitle": "Confirmar primeiro o hardware",
|
||||
"warningBody": "Se esperava um Coral PCIe/M.2 e não aparece, cancele a limpeza e verifique placa, ranhura e firmware."
|
||||
},
|
||||
"reinstallUninstall": {
|
||||
"heading": "Reinstalar ou desinstalar",
|
||||
"intro": "Se detetar uma instalação PCIe com <code>gasket-dkms</code>, USB com <code>libedgetpu1-std</code>/<code>libedgetpu1-max</code> ou ambas, apresenta um menu de ações.",
|
||||
"imageAlt": "Menu para reinstalar, atualizar ou desinstalar Coral",
|
||||
"imageCaption": "O menu aparece se existir algum componente: registo DKMS gasket, pacote <code>libedgetpu1-*</code> ou dispositivos <code>/dev/apex_*</code>.",
|
||||
"reinstallHeading": "Reinstalar / atualizar",
|
||||
"reinstallBody": "Segue a instalação normal: recompila após mudar de kernel ou atualiza <code>libedgetpu1-*</code> a partir da Google. Limpa primeiro o estado DKMS anterior para evitar que uma instalação falhada bloqueie a compilação.",
|
||||
"uninstallHeading": "Desinstalar — o que é removido",
|
||||
"uninstallIntro": "Exige confirmação. As aplicações LXC que usam <code>/dev/apex_*</code> podem perder acesso durante a remoção ou após reiniciar. Procedimento:",
|
||||
"uninstallItems": [
|
||||
"Tenta descarregar <code>apex</code> e <code>gasket</code>; a utilização por processos ativos pode impedi-lo.",
|
||||
"Remove a cada DKMS-registrado <code>gasket/<version></code> entrada para que os módulos não voltem na próxima instalação do kernel.",
|
||||
"Purga <code>gasket-dkms</code>, <code>libedgetpu1-std</code> e <code>libedgetpu1-max</code> e executa <code>apt-get autoremove --purge</code>.",
|
||||
"Elimina <code>/etc/udev/rules.d/99-coral-apex.rules</code> e restaura o grupo predefinido de <code>60-gasket-dkms.rules</code> se ainda existir.",
|
||||
"Verifica os membros suplementares de <code>apex</code>. <strong>Se a lista estiver vazia</strong>, tenta remover o grupo; caso contrário mantém <code>apex</code> e lista os membros. Não verifica completamente os utilizadores que o têm como grupo principal.",
|
||||
"Remove a lista de repositórios <code>/etc/apt/sources.list.d/coral-edgetpu.list</code>, o antigo <code>coral-cloud.list</code> e chaveiros antigos chamados <code>coral-edgetpu-archive-keyring.gpg</code>. O chaveiro atual em <code>/etc/apt/keyrings/coral-edgetpu.gpg</code> não é removido por esta sequência.",
|
||||
"Propõe reiniciar <strong>apenas se PCIe estava instalado</strong> para descarregar os módulos ainda ativos. Remover apenas USB não exige reinício."
|
||||
],
|
||||
"lxcWarnTitle": "LXC contêineres com apex passagem",
|
||||
"lxcWarnBody": "Remover os componentes do anfitrião pode interromper o acesso LXC. Planeie manutenção se aplicações compatíveis como Frigate dependem deste Coral."
|
||||
},
|
||||
"updates": {
|
||||
"heading": "Notificações de atualização",
|
||||
"intro": "O ProxMenux regista os componentes Coral e verifica PCIe/M.2 e USB separadamente. Se tiver ambos, cada variante usa a sua fonte de versões:",
|
||||
"headerVariant": "Variante",
|
||||
"headerTracked": "Versão registada",
|
||||
"headerUpstream": "Fonte das versões",
|
||||
"pcieVariant": "PCIe / M.2",
|
||||
"pcieTracked": "Primeiro a etiqueta registada após instalar, depois a versão de <code>gasket-dkms</code> se o pacote estiver íntegro, ou a versão DKMS como alternativa. Esta não identifica o nível de correções do fork.",
|
||||
"pcieUpstream": "Última etiqueta GitHub de <code>feranick/gasket-driver</code>; cache de sete dias e comparação do número de compilação.",
|
||||
"usbVariant": "USB",
|
||||
"usbTracked": "Versão apt <code>libedgetpu1-std</code> ou <code>libedgetpu1-max</code>",
|
||||
"usbUpstream": "Candidato local ao <code>apt-cache policy</code> (Google Coral apt repo)",
|
||||
"outro": "Se detetar uma versão nova, o Monitor envia <code>coral_driver_update_available</code> pelos canais ativados. O aviso remete para o instalador: escolha <strong>Reinstalar / atualizar</strong>.",
|
||||
"antiTitle": "Sem avisos repetidos",
|
||||
"antiBody": "Um aviso por variante quando muda a versão disponível. Não repete em cada verificação diária; volta a avisar quando surgir uma versão posterior.",
|
||||
"rebootTitle": "Atualizações PCIe: planeie um reinício",
|
||||
"rebootBody": "O módulo PCIe recompilado tem de ser carregado; um reinício planeado verifica também o carregamento automático. Atualizar a biblioteca USB não exige reiniciar o anfitrião, mas pode exigir reiniciar as aplicações que usavam a anterior."
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Procedimento manual equivalente",
|
||||
"intro": "Estes comandos mostram os principais passos de cada procedimento para consulta ou execução manual.",
|
||||
"pcieHeading": "PCIe / M.2 (gasket + apex via DKMS)",
|
||||
"usbHeading": "USB (runtime libedgetpu)"
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verificação",
|
||||
"pcieHeading": "PCIe / M.2",
|
||||
"usbHeading": "USB"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Resolução de problemas",
|
||||
"dkmsFailTitle": "Falha na compilação DKMS após atualizar o kernel",
|
||||
"dkmsFailBody": "Cabeçalhos ausentes são uma causa possível. Verifique <code>proxmox-headers-$(uname -r)</code> com <code>dpkg -l proxmox-headers-$(uname -r)</code> e instale-os se necessário. Consulte o registo para incompatibilidades com o kernel. Repetir executa <code>cleanup_broken_gasket_dkms</code>, sem garantir compatibilidade com todos os kernels.",
|
||||
"apexMissTitle": "Falta o /dev/apex_0 após reiniciar",
|
||||
"apexMissBody": "Verifique a deteção PCIe e se o módulo corresponde ao kernel ativo. Tente <code>modprobe apex</code> e consulte <code>dmesg | grep -iE \"apex|gasket\"</code>. Falhas de compilação, carregamento ou configuração da ranhura/firmware podem impedir a criação do dispositivo.",
|
||||
"lxcMissTitle": "O anfitrião vê /dev/apex_0, mas o LXC não",
|
||||
"lxcMissBody": "Um nó visível não prova o funcionamento. Verifique acesso no anfitrião, montagem LXC, regras cgroup e permissões UID/GID. Consulte <lxcLink>Adicionar Coral TPU a um LXC</lxcLink>.",
|
||||
"usbUnreachTitle": "Acelerador USB detectado, mas Frigate / TFLite não pode alcançá-lo",
|
||||
"usbUnreachBody": "Verifique as regras de <code>libedgetpu1-std</code> e permissões com <code>ls -l /dev/bus/usb/*/*</code>. O utilizador/grupo mapeado da aplicação precisa de leitura e escrita; root como proprietário não é um erro por si só. Após alterações, execute <code>udevadm control --reload-rules && udevadm trigger</code> e volte a ligar se necessário.",
|
||||
"logTitle": "Registo de instalação",
|
||||
"logBody": "Cada execução escreve <code>/tmp/coral_install.log</code>. Se DKMS falhar e o registo existir, acrescenta as últimas 50 linhas de <code>/var/lib/dkms/gasket/1.0/build/make.log</code>. Anexe o registo ao pedir ajuda."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionados",
|
||||
"items": [
|
||||
{
|
||||
"label": "Adicionar Coral TPU ao LXC",
|
||||
"href": "/docs/hardware/coral-tpu-lxc",
|
||||
"tail": " — disponibilizar o Coral do anfitrião a um contentor com uma aplicação compatível."
|
||||
},
|
||||
{
|
||||
"label": "Instalar Drivers NVIDIA (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — a mesma ideia para as GPU NVIDIA."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor — Página de hardware",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — o painel Coral mostra controlador, módulos, dispositivos e runtime, além da temperatura se um sensor compatível a disponibilizar."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,175 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Instalar NVIDIA no anfitrião | Documentação ProxMenux",
|
||||
"description": "Instale controladores proprietários NVIDIA no Proxmox VE com ProxMenux: filtragem GPU, verificações de compilação e DKMS, persistência, patch NVENC opcional e atualização de bibliotecas LXC."
|
||||
},
|
||||
"header": {
|
||||
"title": "Instalar controladores NVIDIA no anfitrião",
|
||||
"description": "Instale NVIDIA no anfitrião Proxmox VE. Filtra ramos mantidos pelo ID PCI do GPU, verifica a compilação, utiliza DKMS, gere nouveau e instala persistência. Pode também atualizar bibliotecas dos LXC com acesso NVIDIA.",
|
||||
"section": "Hardware: GPUs e Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "O que faz",
|
||||
"body": "O ProxMenux deteta o GPU e oferece ramos NVIDIA mantidos que incluem o seu ID PCI. Bloqueia <code>nouveau</code>, descarrega o instalador oficial <code>.run</code>, utiliza DKMS, instala <code>nvidia-persistenced</code>, regras udev e o NVIDIA Container Toolkit, e oferece um patch NVENC opcional. As verificações de compilação avaliam o kernel em execução; uma compilação bem-sucedida não garante que todas as aplicações funcionem. Aos LXC NVIDIA existentes é oferecida uma atualização das bibliotecas userspace, com versão correspondente exceto em Arch."
|
||||
},
|
||||
"who": {
|
||||
"heading": "Para quem é isto?",
|
||||
"body": "Para vídeo ou cálculo acelerado com Plex, Jellyfin, Frigate, Immich ou Stable Diffusion <strong>em LXC</strong>, instale primeiro NVIDIA no <em>anfitrião</em> Proxmox. A atribuição direta a uma <strong>VM</strong> utiliza o procedimento VFIO separado."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de começar",
|
||||
"gpu": "<strong>Um GPU NVIDIA</strong> instalado no anfitrião. É detetado automaticamente; esta opção não gere AMD nem Intel.",
|
||||
"gpuCheck": "lspci | grep -i nvidia",
|
||||
"notVm": "O GPU <strong>não deve estar reservado para VM através de VFIO</strong>. O instalador recusa esse caso para não interferir na atribuição.",
|
||||
"internet": "Acesso à Internet no host. O instalador baixa o driver de <code>download.nvidia.com</code> e, opcionalmente, clona <code>nvidia-persistenced</code> e <code>nvidia-patch</code> de GitHub.",
|
||||
"space": "Reserve espaço em <code>/opt/nvidia</code> para <code>.run</code> e RAM para compilar. O percurso LXC não-Arch verifica 1500 MiB livres e pode pedir aumento temporário para 2048 MiB de RAM se inferior, restaurando depois o limite anterior. Preveja o reinício do anfitrião."
|
||||
},
|
||||
"vmWarn": {
|
||||
"title": "GPU reservado para VM? Pare aqui",
|
||||
"body": "Se algum dispositivo NVIDIA estiver associado a <code>vfio-pci</code>, o instalador sai mesmo com a VM parada. Estar reservado não implica utilização ativa. Planeie o regresso ao controlador do anfitrião e remova atribuições VM/VFIO antigas antes de reiniciar e instalar."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Executar o instalador",
|
||||
"body": "Abra <strong>Hardware Graphics → NVIDIA GPU Driver Installer</strong> no ProxMenux. O menu depende de existir um controlador ativo.",
|
||||
"imageAlt": "Menu de hardware com o instalador NVIDIA destacado"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Como funciona o script",
|
||||
"body": "Deteta dispositivos, escolhe uma versão e instala. Uma limpeza VFIO com confirmação separada pode ocorrer antes do resumo. Preparação de repositórios/cabeçalhos e descarga precedem a substituição do controlador; nem todas as alterações começam após uma única confirmação final."
|
||||
},
|
||||
"walkthrough": {
|
||||
"detect": {
|
||||
"title": "Detecção e visão geral do GPU",
|
||||
"body1": "Apresenta controladores de vídeo NVIDIA, estado do controlador ou <em>«Nenhum controlador NVIDIA instalado»</em> e os LXC configurados para NVIDIA com a versão interna.",
|
||||
"body2": "Reveja GPU e versões do anfitrião/contentores. Cancele no resumo se a seleção for inesperada; uma limpeza VFIO confirmada anteriormente já terá sido aplicada.",
|
||||
"imageAlt": "Resumo pré-instalação: GPU, controlador e LXC NVIDIA"
|
||||
},
|
||||
"version": {
|
||||
"title": "Escolha a versão do controlador",
|
||||
"body1": "Filtra versões de <code>nvidia.com</code> que <strong>incluem o ID PCI do GPU na tabela de chips suportados</strong> e exclui versões beta/desenvolvimento por heurísticas. <em><versão> — Recomendada</em> prioriza a última do ramo instalado, depois Production Branch e, por fim, o número de versão compatível mais elevado.",
|
||||
"body2": "Se o controlador estiver registado com patch keylase, o seletor limita as versões à tabela NVENC. <em>Reinstalar / atualizar</em> mantém confirmações e opção de patch; verifique o resultado final.",
|
||||
"whyTitle": "Como a compatibilidade do kernel é validada",
|
||||
"whyBody": "Filtra por ramos mantidos e ID PCI, sem matriz fixa de kernel/controlador. Uma compilação prévia verifica o kernel atual. Uma falha confirmada volta ao seletor; se a verificação não estiver disponível, pode avisar e continuar. Instalação final e testes de funcionamento continuam necessários.",
|
||||
"imageAlt": "Seletor de ramos compatíveis com GPU e recomendação no topo"
|
||||
},
|
||||
"uninstall": {
|
||||
"title": "Remover o controlador anterior ao reinstalar",
|
||||
"body": "Após descarregar e verificar o instalador escolhido, remove o controlador anterior. Para serviços NVIDIA, descarrega módulos, remove entradas DKMS e purga <code>nvidia-*</code> / <code>libnvidia-*</code> / <code>cuda-*</code>. Aplica-se também à reinstalação confirmada da mesma versão."
|
||||
},
|
||||
"prepare": {
|
||||
"title": "Preparar o sistema",
|
||||
"body": "Durante a preparação, o script:",
|
||||
"items": [
|
||||
"Verifica repositórios antes de remover ou instalar componentes. Sem subscrição e apenas com Enterprise, pede autorização para mudar para no-subscription; a recusa para a instalação.",
|
||||
"Instala <code>pve-headers-$(uname -r)</code> (ou <code>proxmox-headers-$(uname -r)</code>), <code>build-essential</code> e <code>dkms</code>.",
|
||||
"Cria o ficheiro gerido pelo ProxMenux <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code> com <code>blacklist nouveau</code> e <code>options nouveau modeset=0</code>. Regista a eventual linha adicionada a <code>blacklist.conf</code> e tenta descarregar nouveau.",
|
||||
"Escreve <code>/etc/modules-load.d/nvidia-vfio.conf</code> com <code>nvidia</code> e <code>nvidia_uvm</code> para que os módulos carreguem precocemente no arranque."
|
||||
]
|
||||
},
|
||||
"download": {
|
||||
"title": "Baixe e execute o instalador NVIDIA",
|
||||
"body": "Descarrega <code>NVIDIA-Linux-x86_64-<version>.run</code> para <code>/opt/nvidia</code> e verifica tamanho e tipo executável. São verificações de formato, não de assinatura criptográfica. Regista DKMS para recompilar com alterações do kernel; código e kernel devem continuar compatíveis.",
|
||||
"imageAlt": "Progresso de descarga e compilação DKMS do instalador NVIDIA"
|
||||
},
|
||||
"persist": {
|
||||
"title": "Serviço de persistência e regras de udev",
|
||||
"body": "Instala <persistLink>nvidia-persistenced</persistLink> e escreve <code>/etc/udev/rules.d/70-nvidia.rules</code> para criar <code>/dev/nvidia*</code> no arranque. Evita que um LXC procure o GPU antes de os dispositivos estarem disponíveis."
|
||||
},
|
||||
"nvenc": {
|
||||
"title": "Opcional: aplicar patch NVENC",
|
||||
"body": "Os limites de sessões NVENC dependem do GPU e controlador. <patchLink>keylase/nvidia-patch</patchLink> pode remover o limite do controlador nas versões suportadas. Escolha <strong>Sim</strong> se precisar desta alteração de codificação e a versão for compatível. Não acelera descodificação nem elimina limites físicos.",
|
||||
"supportTitle": "Verificar compatibilidade do patch",
|
||||
"supportBody": "Procure a versão exata na <patchTableLink>tabela de patches</patchTableLink>. Se faltar, use o controlador sem patch ou outra versão mantida compatível com GPU, kernel e patch; a proximidade na lista não basta."
|
||||
},
|
||||
"propagate": {
|
||||
"title": "Opcional: atualizar bibliotecas NVIDIA em LXC",
|
||||
"body1": "Propõe atualizar bibliotecas do controlador nos LXC detetados. Estas e o módulo do anfitrião <strong>devem ter versões correspondentes</strong>; caso contrário <code>nvidia-smi</code> pode indicar «version mismatch».",
|
||||
"body2": "Debian / Ubuntu e outros contentores glibc recebem o instalador <code>.run</code> extraído com <code>--no-kernel-modules --no-dkms --no-install-compat32-libs</code>; a RAM pode subir temporariamente para 2 GiB e ser depois restaurada. <strong>Arch, Manjaro e EndeavourOS</strong> utilizam <code>pacman -Syu nvidia-utils</code> dos repositórios, sem fixar a versão do anfitrião: verifique o resultado. <strong>Alpine</strong> recebe o conteúdo <code>.run</code> extraído por <code>pct push</code>, instala <code>gcompat</code> e <code>binutils</code> com <code>apk</code> e cria ligações SONAME com <code>readelf</code>. Verifique o funcionamento; a compatibilidade não garante todas as bibliotecas sobre musl.",
|
||||
"imageAlt": "Diálogo com LXC NVIDIA e versões para confirmar a atualização"
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Reiniciar",
|
||||
"body": "Após a instalação do controlador, o script regenera <code>initramfs</code> para todos os kernels; o seu último passo oferece reiniciar. <strong>Preveja esse reinício</strong> para verificar a configuração persistente dos módulos e do nouveau num novo arranque, mesmo que o novo controlador já responda antes do reinício."
|
||||
}
|
||||
},
|
||||
"reinstallUninstall": {
|
||||
"heading": "Reinstalar ou desinstalar",
|
||||
"intro": "Se <code>nvidia</code> estiver carregado e <code>nvidia-smi</code> devolver uma versão, apresenta um menu de ações. O critério deteta um controlador ativo; pode haver ficheiros instalados sem o módulo carregado.",
|
||||
"imageAlt": "NVIDIA menu de ação oferecido quando um driver já está instalado — duas opções: Reinstalar / atualizar driver, ou desinstalar o driver NVIDIA completamente",
|
||||
"imageCaption": "O menu de ação só aparece quando um driver NVIDIA está atualmente ativo na máquina.",
|
||||
"reinstallHeading": "Reinstalar / atualizar",
|
||||
"reinstallBody": "Escolhe versão, prepara repositórios/cabeçalhos, descarrega e verifica a compilação antes de substituir o controlador. Permite atualizar no ramo mantido ou escolher outro suportado. Depois reapresenta as opções de bibliotecas LXC e patch NVENC.",
|
||||
"uninstallHeading": "Desinstalar — o que é removido",
|
||||
"uninstallIntro": "Após confirmação Sim/Não, remove os seguintes componentes:",
|
||||
"uninstallItems": [
|
||||
"Para e desativa <code>nvidia-persistenced</code> e <code>nvidia-powerd</code>, tenta descarregar <code>nvidia_uvm</code>, <code>nvidia_drm</code>, <code>nvidia_modeset</code> e <code>nvidia</code> e depois executa <code>nvidia-uninstall --silent</code> para a instalação <code>.run</code>. Afeta as cargas de trabalho LXC dependentes de NVIDIA; clientes ativos podem impedir a descarga.",
|
||||
"Executa <code>apt purge</code> em <code>nvidia-*</code>, <code>libnvidia-*</code>, <code>cuda-*</code> e <code>libcudnn*</code>, remove a árvore fonte DKMS e as pastas <code>nvidia-persistenced</code> e <code>nvidia-patch</code> em <code>/opt/nvidia</code>.",
|
||||
"Remove a configuração de carregamento <code>/etc/modules-load.d/nvidia-vfio.conf</code> e regras nouveau geridas pelo ProxMenux. Migra e remove também os antigos ficheiros ProxMenux com as duas linhas conhecidas; preserva ficheiros modificados ou não relacionados do administrador.",
|
||||
"Remove <code>/etc/udev/rules.d/70-nvidia.rules</code> e marca NVENC como <em>removed</em> no registo de instalações geridas; não existe ficheiro de estado separado.",
|
||||
"Regenera <code>initramfs</code> para todos os kernels, executa <code>proxmox-boot-tool refresh</code> conforme o arranque e pede reinício."
|
||||
],
|
||||
"lxcWarnTitle": "LXC com acesso NVIDIA",
|
||||
"lxcWarnBody": "Remover o controlador do anfitrião interrompe aplicações LXC NVIDIA mesmo mantendo as bibliotecas instaladas. Agende manutenção para Frigate, Plex, Jellyfin, Ollama e outras aplicações GPU."
|
||||
},
|
||||
"updates": {
|
||||
"heading": "Notificações de atualizações",
|
||||
"body": "O controlador NVIDIA é acompanhado no registo de instalações geridas. No arranque e a cada 24 horas, o Monitor compara as versões em <code>download.nvidia.com/XFree86/Linux-x86_64/</code> com a indicada por <code>nvidia-smi</code>. Notifica apenas novas versões de manutenção do ramo instalado.",
|
||||
"kindsHeading": "Mensagem de atualização",
|
||||
"kindsItems": [
|
||||
"<strong>Manutenção no mesmo ramo.</strong> Exemplo: 580.65.06 instalada → 580.105.08 disponível. O Monitor não deduz compatibilidade do kernel entre ramos."
|
||||
],
|
||||
"antiTitle": "Evitar notificações repetidas",
|
||||
"antiBody": "Uma notificação por nova versão, não em cada verificação diária. Sem versão mais recente no ramo instalado, não notifica.",
|
||||
"applyTitle": "Aplicando a atualização",
|
||||
"applyBody": "O Monitor avisa sem instalar automaticamente. Abra o instalador, escolha <strong>Reinstalar / atualizar</strong> e uma versão suportada, e conclua compilação e instalação. Preveja o reinício proposto e verifique depois anfitrião e bibliotecas LXC."
|
||||
},
|
||||
"verify": {
|
||||
"heading": "Verificando a instalação",
|
||||
"intro": "Após reiniciar o anfitrião, entre por SSH ou pela consola Proxmox e execute:",
|
||||
"after": "Confirme GPU e versão esperada. Podem existir processos se serviços do anfitrião ou contentores iniciados automaticamente utilizarem o GPU. Depois verifique a persistência:",
|
||||
"imageAlt": "Saída de nvidia-smi no anfitrião com GPU detetado e versão do controlador instalada"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Resolução de problemas",
|
||||
"smiFailTitle": "nvidia-smi apresenta «NVIDIA-SMI has failed»",
|
||||
"smiFailBody": "Causas possíveis: <strong>nouveau</strong>, <strong>cabeçalhos ausentes ou incompatíveis</strong>, código do controlador incompatível ou outros erros de carregamento. Veja <code>lsmod | grep nouveau</code>, <code>dmesg | grep -i nvidia</code> e registos do instalador/DKMS. Se precisar de corrigir nouveau, verifique <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code> antes de <code>update-initramfs -u -k all</code> e reinicie. Nem toda a falha de compilação é de cabeçalhos.",
|
||||
"lxcMissTitle": "O LXC não vê o GPU após a atualização do anfitrião",
|
||||
"lxcMissBody": "Antes de reinstalar, verifique dispositivos do anfitrião, permissões LXC e versão das bibliotecas. Um conflito pode exigir o controlador de utilizador correspondente pelo método suportado da distribuição; em glibc usa <code>--no-kernel-modules</code>. Reinstalar bibliotecas não corrige montagens ou permissões ausentes.",
|
||||
"logTitle": "Verificar o registo de instalação",
|
||||
"logBody": "A instalação escreve em <code>/tmp/nvidia_install.log</code>. Em caso de falha, reveja descarga, compilação DKMS e serviços. Anexe o registo ao comunicar o problema no GitHub."
|
||||
},
|
||||
"manualSteps": {
|
||||
"heading": "Procurando os passos manuais?",
|
||||
"body": "Consulte <guideLink>Guias → NVIDIA</guideLink> para os passos manuais, incluindo <code>wget</code> e <code>./NVIDIA-Linux-...run</code>. Explica componentes sem reproduzir exatamente o instalador. O processo mantido do ProxMenux oferece filtragem GPU, verificação de compilação, atualizações LXC e controlos VFIO."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionados",
|
||||
"items": [
|
||||
{
|
||||
"label": "Adicionar GPU a VM (passagem direta)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — atribuir NVIDIA diretamente a uma VM através de VFIO."
|
||||
},
|
||||
{
|
||||
"label": "Adicionar GPU ao LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — partilhar NVIDIA com um ou vários contentores."
|
||||
},
|
||||
{
|
||||
"label": "Mudar modo GPU (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — alternar entre passagem direta para VM e partilha LXC."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor — Página de hardware",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — janela GPU que abre este instalador e mostra monitorização em tempo real."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de passagem direta GPU",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — referência lspci / dmesg / IOMMU / nvidia-smi."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,172 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Mudar modo GPU (VM ↔ LXC) | Documentação ProxMenux",
|
||||
"description": "Mude um GPU entre VFIO para VM e controlador nativo para LXC. O ProxMenux deteta o controlador, pergunta como gerir os convidados afetados, remove áudio associado e regenera initramfs se a configuração do anfitrião mudar."
|
||||
},
|
||||
"header": {
|
||||
"title": "Mudar modo GPU (VM ↔ LXC)",
|
||||
"description": "Mude um GPU atribuído entre passagem direta para VM e partilha LXC. O ProxMenux gere controlador, VFIO, módulos e initramfs e pergunta como tratar os convidados afetados. Reveja as opções e verifique o resultado após reiniciar.",
|
||||
"section": "Hardware: GPUs e Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "O que faz",
|
||||
"body": "Com <code>vfio-pci</code>, o GPU fica reservado para uma VM. Com o controlador nativo <em>(i915 / amdgpu / nvidia)</em>, anfitrião e LXC podem partilhá-lo. <strong>Mudar modo GPU</strong> gere <code>vfio.conf</code>, módulos bloqueados e referências dos convidados, avisando de atribuições pendentes."
|
||||
},
|
||||
"graphics": {
|
||||
"lxcTitle": "Pronto para contêineres LXC",
|
||||
"lxcDesc": "Controlador nativo ativo",
|
||||
"vmTitle": "Pronto para passagem de VM",
|
||||
"vmDesc": "Controlador VFIO-PCI ativo"
|
||||
},
|
||||
"when": {
|
||||
"heading": "Quando devo usar isto?",
|
||||
"intro": "Utilize se o GPU <strong>já está atribuído</strong> e pretende mudar a utilização:",
|
||||
"headerSituation": "Situação",
|
||||
"headerUse": "Usar esta página?",
|
||||
"rows": [
|
||||
{
|
||||
"situation": "GPU livre, nunca atribuído: utilizá-lo numa VM.",
|
||||
"useRich": "Não — utilize <vmLink>Adicionar GPU a VM</vmLink>"
|
||||
},
|
||||
{
|
||||
"situation": "GPU livre, nunca atribuído: utilizá-lo num LXC.",
|
||||
"useRich": "Não — utilize <lxcLink>Adicionar GPU a LXC</lxcLink>"
|
||||
},
|
||||
{
|
||||
"situationRich": "O GPU está atribuído a uma VM por <code>vfio-pci</code>; quero utilizá-lo num LXC.",
|
||||
"useRich": "<strong>Sim — esta página.</strong>"
|
||||
},
|
||||
{
|
||||
"situation": "O GPU é partilhado com um LXC; quero dedicá-lo a uma VM.",
|
||||
"useRich": "<strong>Sim — esta página.</strong>"
|
||||
},
|
||||
{
|
||||
"situation": "Quero remover todas as atribuições deste GPU.",
|
||||
"use": "O modo LXC devolve o GPU ao controlador do anfitrião; a política de conflitos da VM pode remover as entradas hostpci, mas as entradas de dispositivo LXC têm de ser removidas separadamente. O GPU continua associado a um controlador."
|
||||
}
|
||||
]
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de começar",
|
||||
"assigned": "<strong>Um GPU já atribuído</strong> a uma VM por VFIO ou a um LXC. Para a primeira atribuição utilize Adicionar GPU a VM / LXC.",
|
||||
"iommu": "<strong>IOMMU deve estar ativo no anfitrião</strong> ao passar <em>para</em> modo VM. Tanto as definições do firmware como o suporte do kernel são importantes. Se faltar <code>intel_iommu=on</code> ou <code>amd_iommu=on</code> no kernel em execução, o script adiciona-o com <code>iommu=pt</code> a <code>/etc/kernel/cmdline</code> (marca de raiz ZFS) ou a <code>/etc/default/grub</code> e depois executa <code>proxmox-boot-tool refresh</code> ou <code>update-grub</code>. Reveja eventuais avisos e reinicie quando solicitado.",
|
||||
"iommuCheck": "dmesg | grep -i 'IOMMU enabled' | head -1",
|
||||
"reboot": "<strong>Preveja um reinício.</strong> Alterações persistentes ao controlador e ao arranque podem exigir regenerar initramfs e reiniciar. O script apresenta a opção no final.",
|
||||
"knowList": "<strong>Identifique as VM e LXC que utilizam o GPU.</strong> O script deteta referências e pergunta como tratar cada convidado; conhecer a lista facilita a revisão."
|
||||
},
|
||||
"blocklist": {
|
||||
"title": "Nem todas as GPUs são seguras para passar para um VM",
|
||||
"body": "O script bloqueia o modo VM para os ID de dispositivo <code>8086:5a84</code> e <code>8086:5a85</code>, segundo a sua política de compatibilidade. Se um GPU selecionado corresponder, interrompe a mudança para modo VM e volta à seleção do GPU, ou sai quando é o único GPU. Esta lista de bloqueio não impede passar <em>para</em> modo LXC; outras verificações podem continuar a aplicar-se."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Executar o script",
|
||||
"body": "Abra <strong>Hardware: GPU e Coral-TPU → Mudar modo GPU (VM ↔ LXC)</strong> no ProxMenux.",
|
||||
"imageAlt": "Opção Mudar modo GPU (VM ↔ LXC) no menu de hardware"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Como funciona o script",
|
||||
"body": "A escolha do GPU e da direção precede a mudança principal. Uma limpeza VFIO separada pode pedir confirmação antes; os convidados afetados têm os seus próprios diálogos. Leia cada confirmação: não existe uma única validação final para todas as alterações."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Procedimento passo a passo",
|
||||
"detect": {
|
||||
"title": "Detetar GPU e controlador atual",
|
||||
"body": "Examina os controladores VGA, 3D e Display do anfitrião e consulta <code>/sys/bus/pci/devices/*/driver</code>. Apresenta nome, endereço PCI e controlador atual de cada GPU para identificar o modo.",
|
||||
"imageAlt": "Lista de verificação GPU que mostra cada GPU detectado com seu driver atual (vfio-pci / nvidia / amdgpu / i915) e slot PCI"
|
||||
},
|
||||
"pickGpu": {
|
||||
"title": "Escolher os GPU a mudar",
|
||||
"body": "Um único GPU é selecionado automaticamente. Com vários, pode marcar mais de um, desde que estejam no <em>mesmo</em> modo. Se misturar modos, terá de reduzir a seleção.",
|
||||
"tipTitle": "Mudar vários GPU de uma vez",
|
||||
"tipBody": "Exemplo: passar três NVIDIA para modo VM e depois devolver o iGPU ao LXC. Duas execuções, cada uma com destino comum, em vez de mudar cada placa separadamente."
|
||||
},
|
||||
"direction": {
|
||||
"title": "Rever a direcção proposta",
|
||||
"intro": "Com base no modo atual, o script propõe o oposto como alvo:",
|
||||
"items": [
|
||||
"<strong>VM → LXC:</strong> remove a associação a <code>vfio-pci</code> para que o controlador nativo (<code>nvidia</code>, <code>amdgpu</code>, <code>i915</code>) possa utilizar o GPU. Para NVIDIA remove as entradas BDF correspondentes de <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> para o próximo arranque.",
|
||||
"<strong>LXC → VM:</strong> prepara a associação a <code>vfio-pci</code>. AMD / Intel bloqueiam o controlador nativo e utilizam <code>options vfio-pci ids=…</code>. Em NVIDIA, <code>nvidia</code> só é bloqueado globalmente quando todas as GPU NVIDIA do anfitrião estão em VFIO; caso contrário, regras por BDF aplicam <code>driver_override=vfio-pci</code> aos dispositivos dos grupos IOMMU afetados, e as GPU NVIDIA fora desses grupos mantêm <code>nvidia</code>. Reveja todos os membros do grupo antes de mudar."
|
||||
],
|
||||
"outro": "Confirme a direção ou cancele."
|
||||
},
|
||||
"conflict": {
|
||||
"title": "Opções para cada VM ou LXC afetado",
|
||||
"body": "Verifica <code>/etc/pve/lxc/*.conf</code> por família do controlador GPU e <code>/etc/pve/qemu-server/*.conf</code> por atribuições PCI. A deteção LXC não identifica cada placa por BDF exato. Reveja os convidados detetados e escolha como tratar cada um:",
|
||||
"headerPolicy": "Política",
|
||||
"headerEffect": "Efeito",
|
||||
"headerWhen": "Quando escolher",
|
||||
"keepPolicy": "Manter configuração e desativar arranque automático",
|
||||
"keepEffect": "<code>pct set CTID -onboot 0</code> ou <code>qm set VMID -onboot 0</code>. Mantém as entradas GPU.",
|
||||
"keepWhen": "Se pretende reutilizar o convidado quando o GPU voltar ao modo anterior. Escolha predefinida conservadora.",
|
||||
"removePolicy": "Remover o GPU da configuração",
|
||||
"removeEffect": "Remove as entradas <code>hostpci</code> / <code>dev</code> identificadas e referências antigas suportadas.",
|
||||
"removeWhen": "Se o convidado deve funcionar sem GPU. Verifique primeiro a aplicação: a alternativa por CPU depende dela e remover o dispositivo não a reconfigura automaticamente.",
|
||||
"imageAlt": "Diálogo para escolher como tratar cada VM ou LXC afetado"
|
||||
},
|
||||
"audio": {
|
||||
"title": "Remover áudio associado ao sair do modo VM",
|
||||
"body1": "Muitos GPU NVIDIA / AMD expõem áudio HDMI na função <code>.1</code> do mesmo slot; pode haver outros dispositivos áudio atribuídos. Remover o GPU pode deixar entradas áudio <code>hostpci</code> obsoletas. Reveja as atribuições a manter.",
|
||||
"body2": "Identifica os endereços BDF áudio e apresenta uma lista para escolher o que remover. Elimina também os ID vendor:device de <code>/etc/modprobe.d/vfio.conf</code>, apenas se nenhuma outra VM os utilizar."
|
||||
},
|
||||
"apply": {
|
||||
"title": "Aplicar alterações ao anfitrião e convidados",
|
||||
"body": "Uma vez que você confirma, o script escreve as mudanças no lado do host — <code>vfio.conf</code>, lista negra, módulos e (para NVIDIA) a regra udev per-BDF em <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> mais o estado BDF em <code>/etc/proxmenux/vfio-bind.bdfs</code>. Aplica igualmente a política de conflitos escolhida a cada VM/LXC afectado. Se a configuração do host realmente mudou, ele executa <code>update-initramfs -u -k all</code> seguido por <code>proxmox-boot-tool refresh</code>; caso contrário ambos são ignorados."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Reiniciar",
|
||||
"body": "Reinicie o anfitrião para aplicar a nova associação persistente. Pode adiar, mas verifique o controlador ativo antes de iniciar o convidado de destino: até reiniciar pode manter-se o anterior.",
|
||||
"imageAlt": "Diálogo de resumo que lista o que mudou, seguido pelo prompt de reinicialização"
|
||||
}
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Inspeção manual",
|
||||
"intro": "Antes de <strong>VM → LXC</strong>, verifique o controlador e a política BDF. Este exemplo NVIDIA utiliza <code>10de:2204</code>; adapte-o à sua placa. Os comandos consultam o estado; o script também gere convidados e membros do grupo IOMMU.",
|
||||
"lxcToVm": "Antes de <strong>LXC → VM</strong>, consulte o endereço PCI e o grupo IOMMU. Substitua o endereço de exemplo e reveja todos os membros antes de atribuir dispositivos.",
|
||||
"oneVmTitle": "Um GPU físico atribuído por VFIO só pode ser utilizado por uma VM de cada vez",
|
||||
"oneVmBody": "Colocar várias entradas <code>hostpci</code> com o mesmo slot PCI em duas VMs é uma configuração válida, mas apenas uma das VMs pode começar com o GPU — a segunda falha. O passo da política de conflitos ProxMenux é exatamente evitar esta armadilha."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verificação após reiniciar"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Resolução de problemas",
|
||||
"stillVfioTitle": "A GPU continua a mostrar vfio-pci após a mudança para o modo LXC",
|
||||
"stillVfioBody": "Um módulo VFIO carregado não prova qual controlador utiliza este GPU. Verifique a associação, a conclusão de <code>update-initramfs</code> e o reinício. <code>lsmod | grep vfio</code> só lista módulos. Para AMD / Intel veja <code>vfio.conf</code>; para NVIDIA, <code>/etc/proxmenux/vfio-bind.bdfs</code> e <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code>. Corrija regras antigas antes de <code>update-initramfs -u -k all</code> e reinicie.",
|
||||
"vmFailTitle": "Uma VM não inicia após passar o GPU para LXC",
|
||||
"vmFailBody": "Verifique referências <code>hostpci</code> obsoletas. A opção <em>Remover GPU da configuração</em> pode eliminá-las durante a mudança pretendida. Antes de repetir o script, reveja a direção para não inverter o modo por engano. Em alternativa remova a atribuição no Proxmox com a VM parada.",
|
||||
"smiFailTitle": "nvidia-smi apresenta «Driver/library version mismatch» ao voltar a LXC",
|
||||
"smiFailBody": "Compare o módulo NVIDIA carregado com as bibliotecas instaladas, também nos LXC. Alinhe as versões: reiniciar carrega o módulo instalado, mas não corrige pacotes incompatíveis. Recarregar com <code>modprobe -r nvidia</code> e <code>modprobe nvidia</code> exige parar os clientes GPU e pode falhar com módulos dependentes em utilização.",
|
||||
"logTitle": "Registo de execução",
|
||||
"logBody": "Cada execução escreve em <code>/tmp/proxmenux_gpu_switch_mode.log</code> no anfitrião. Anexe o registo ao pedir ajuda no GitHub."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionados",
|
||||
"items": [
|
||||
{
|
||||
"label": "Adicionar GPU a VM (passagem direta)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — configuração inicial do modo VM."
|
||||
},
|
||||
{
|
||||
"label": "Adicionar GPU ao LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — configuração inicial do modo LXC."
|
||||
},
|
||||
{
|
||||
"label": "Instalar Drivers NVIDIA (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — exigido para o modo LXC em GPUs NVIDIA."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor — Página de hardware",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — secção Placas gráficas, com o modo atual e o comando para o mudar."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de passagem direta GPU",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — referência rápida de comandos."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Pridať Coral TPU do LXC | Dokumentácia ProxMenux",
|
||||
"description": "Sprístupnite Google Coral TPU cez USB alebo M.2 / PCIe kontajneru LXC v Proxmoxe. ProxMenux nastaví zariadenia, oprávnenia a pripojenia, spustí kontajner a v podporovaných distribúciách nainštaluje runtime Edge TPU."
|
||||
},
|
||||
"header": {
|
||||
"title": "Pridať Coral TPU do LXC",
|
||||
"description": "Sprístupnite Coral USB Accelerator alebo M.2 / Mini-PCIe kontajneru LXC. ProxMenux nastaví kontajner a runtime Edge TPU. Táto voľba rieši iba TPU; pre Quick Sync, VA-API alebo NVENC spustite aj Pridať GPU do LXC.",
|
||||
"section": "Hardvér: grafické karty a Coral TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Čo robí",
|
||||
"body": "Zapíše konfiguráciu do <code>/etc/pve/lxc/<ctid>.conf</code> pre <strong>USB Accelerator</strong>, <strong>Coral M.2 / PCIe</strong> alebo oba. Spustí kontajner a nainštaluje runtime Google <code>libedgetpu</code>. GPU sa nastavuje samostatne cez <lxcGpuLink>Pridať GPU do LXC</lxcGpuLink>."
|
||||
},
|
||||
"whenUse": {
|
||||
"heading": "Kedy použiť",
|
||||
"body": "Pre <frigateLink>Frigate</frigateLink> alebo inú kompatibilnú linuxovú aplikáciu v LXC. Coral vykonáva podporovanú ML inferenciu namiesto CPU. Výkon závisí od modelu a hardvéru; dekódovanie videa a ďalšie úlohy naďalej spotrebúvajú prostriedky."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Skôr ako začnete",
|
||||
"drivers": "<strong>Pripravte zariadenie Coral na hostiteľovi</strong>. M.2 / PCIe vyžaduje načítaný ovládač hostiteľa; USB prístup k zariadeniu a správne oprávnenia. Pozrite <hostLink>Inštalácia Coral TPU na hostiteľa</hostLink>. Skript nainštaluje runtime aplikácie v kontajneroch Debian/Ubuntu; ostatné distribúcie ho musia poskytnúť samostatne.",
|
||||
"driversCheck": "ls /dev/apex_* 2>/dev/null ; lsusb | grep -E '1a6e:089a|18d1:9302'",
|
||||
"container": "<strong>Existujúci LXC</strong>, ideálne založený na <strong>Debian / Ubuntu</strong>: inštalácia používa <code>apt-get</code>. <strong>Kontajnery iných distribúcií</strong> môžu zvoliť <strong>režim iba sprístupnenia zariadenia</strong>, ktorý preskočí APT inštaláciu <code>libedgetpu</code>. Hodí sa, ak aplikácia už runtime obsahuje, napríklad Docker obraz Frigate.",
|
||||
"downtime": "<strong>Počítajte s krátkym výpadkom</strong> kontajnera. Skript ho zastaví kvôli konfigurácii a spustí na inštaláciu runtime. Tieto zmeny nevyžadujú reštart hostiteľa."
|
||||
},
|
||||
"hostPrep": {
|
||||
"title": "Hostiteľ musí byť pripravený ako prvý",
|
||||
"body": "M.2 / PCIe potrebuje <code>gasket</code>/<code>apex</code> na hostiteľovi a funkčné zariadenie. USB potrebuje pripojené zariadenie a oprávnenia; aplikácia nemusí bežať na hostiteľovi. <code>libedgetpu</code> musí byť tam, kde beží aplikácia. Poradie: <strong>príprava hostiteľa → prístup LXC → nastavenie aplikácie</strong>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Spustenie skriptu",
|
||||
"body": "V ProxMenuxe otvorte <strong>Hardvér: GPU a Coral-TPU → Pridať Coral TPU do LXC</strong>.",
|
||||
"imageAlt": "Voľba Pridať Coral TPU do LXC v ponuke hardvéru"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Ako skript funguje",
|
||||
"body": "Vyberte kontajner. Skript nastaví prístup USB aj bez pripojeného USB Coral a pridá M.2 / PCIe, ak zistí príslušný hardvér."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Postup krok za krokom",
|
||||
"pick": {
|
||||
"title": "Vyberte kontajner LXC",
|
||||
"body": "Výber obsahuje vhodné kontajnery z <code>pct list</code>; OCI kontajnery sú skryté a spravujú sa cez Apps v správcovi OCI. Vyberte spustený alebo zastavený kontajner. Skript ho podľa potreby zastaví, nakonfiguruje a spustí na inštaláciu runtime."
|
||||
},
|
||||
"gpuHint": {
|
||||
"title": "Voliteľné odporúčanie prístupu ku GPU",
|
||||
"body": "Ak sa zistí GPU, ktorá nie je nakonfigurovaná pre tento kontajner, dialóg odporučí <lxcGpuLink>Pridať GPU do LXC</lxcGpuLink> na hardvérové dekódovanie videa, napríklad Quick Sync, VA-API alebo NVENC. Pýta sa, či pokračovať iba s Coral: Áno pokračuje v nastavení TPU; Nie ukončí postup, aby ste najprv mohli nastaviť GPU."
|
||||
},
|
||||
"usb": {
|
||||
"title": "Nastavenie prístupu USB v LXC",
|
||||
"body": "Vytvorí pravidlo udev na hostiteľovi pre <code>/dev/coral</code> a sprístupní <strong>celý</strong> strom <code>/dev/bus/usb</code> kontajneru. Konfigurácia sa zapíše aj bez pripojeného USB Coral a sprístupní viac než iba toto zariadenie.",
|
||||
"whyTitle": "Prečo pripojiť /dev/bus/usb namiesto /dev/coral?",
|
||||
"whyBody": "Cesta USB, napríklad <code>/dev/bus/usb/001/005</code>, sa pri opätovnom pripojení mení. Staršie verzie pripájali odkaz <code>/dev/coral</code> a mohli zachovať neplatnú cestu. Pripojenie celého stromu USB sprístupní aktuálny uzol zariadenia. Aplikácia môže potrebovať zariadenie znovu otvoriť."
|
||||
},
|
||||
"pcie": {
|
||||
"title": "Nastavenie prístupu M.2 / PCIe v LXC",
|
||||
"body1": "Ak zistí Coral M.2 / PCIe a existuje <code>/dev/apex_0</code>, použije API Proxmoxu <code>dev</code> na správu cgroup2 v privilegovaných aj neprivilegovaných LXC:",
|
||||
"body2": "Ak po <hostLink>Inštalácii Coral na hostiteľa</hostLink> chýba <code>/dev/apex_0</code>, skript zapíše bind mount s <code>create=file</code> a iba vtedy, keď je číslo major zariadenia apex uvedené v <code>/proc/devices</code>, aj klasické pravidlo cgroup2. Ani jedno nevytvorí funkčné zariadenie:",
|
||||
"rebootTitle": "Reštartovať hostiteľa ako prvý, ak ste práve nainštalovali Coral ovládače",
|
||||
"rebootBody": "Náhradné pripojenie nenačíta ovládač <code>apex</code> na hostiteľovi. Načítajte ho alebo po inštalácii reštartujte a overte zariadenie. Potom znova spustite skript pre modernú položku zariadenia a reštartujte kontajner."
|
||||
},
|
||||
"drivers": {
|
||||
"title": "Spustenie LXC a inštalácia runtime Coral",
|
||||
"body": "Spustí kontajner a čaká najviac 15 sekúnd na stav running. Potom cez <code>pct exec</code> spustí inštalátor vnútri. Inštalátor:",
|
||||
"items": [
|
||||
"Spúšťa <code>apt-get update</code>.",
|
||||
"Nainštaluje požiadavky repozitára Coral: <code>gnupg</code>, <code>curl</code> a <code>ca-certificates</code>.",
|
||||
"Importuje kľúč GPG od Googlu do <code>/etc/apt/keyrings/coral-edgetpu.gpg</code>, rovnako ako inštalátor hostiteľa, a pridá repozitár APT <code>coral-edgetpu-stable</code> s <code>signed-by=</code>.",
|
||||
"Predvolene nainštaluje <code>libedgetpu1-std</code>. Pri zistení Coral M.2 ponúkne <code>libedgetpu1-std</code> alebo <code>libedgetpu1-max</code>. Výber balíka sám nenastaví detekciu v aplikácii."
|
||||
],
|
||||
"noIgpuTitle": "Prečo tu nie sú žiadne ovládače iGPU?",
|
||||
"noIgpuBody": "Predtým inštaloval aj <code>va-driver-all</code>, <code>intel-opencl-icd</code> a ďalšie balíky Intel pre Quick Sync spolu s Coral. To spôsobovalo nejasné chyby pri požiadavke iba na Coral. iGPU sa teraz nastavuje cez <lxcGpuLink>Pridať GPU do LXC</lxcGpuLink>; pre hardvérové dekódovanie videa to spustite najprv.",
|
||||
"debianTitle": "Iné distribúcie: iba sprístupnenie zariadenia",
|
||||
"debianBody": "V Debiane/Ubuntu používa <code>apt-get</code>. Pre <strong>Alpine, Arch, RHEL alebo SUSE</strong> zistené cez <code>/etc/os-release</code> ponúkne <em>pokračovať iba so sprístupnením zariadenia</em> alebo <em>zrušiť</em>. Prvá voľba nastaví <code>/etc/pve/lxc/<ctid>.conf</code> bez inštalácie <code>libedgetpu</code>. Ak aplikácia runtime obsahuje, napríklad Frigate Docker, tento režim stačí. Inak nainštalujte <code>libedgetpu</code> podľa <coralLink>oficiálnej príručky Googlu</coralLink>."
|
||||
},
|
||||
"summary": {
|
||||
"title": "Zhrnutie",
|
||||
"body": "Na konci zobrazí Coral USB a M.2 so značkou ✓ alebo ⚠ podľa zistenia hardvéru. Kontajner zostane spustený na nastavenie Frigate, CodeProject.AI alebo vašej aplikácie."
|
||||
}
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Ručný postup",
|
||||
"body": "Ak chcete presne vidieť konfiguráciu LXC alebo ju použiť ručne:",
|
||||
"usbHeading": "USB Coral",
|
||||
"pcieHeading": "M.2 / PCIe Coral",
|
||||
"runtimeHeading": "V kontajneri: runtime Coral"
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Overenie",
|
||||
"body": "Otvorte shell v kontajneri a overte viditeľnosť Coral:"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Riešenie problémov",
|
||||
"apexTitle": "LXC je spustený, ale chýba /dev/apex_0",
|
||||
"apexBody": "Najprv overte ovládač hostiteľa: <code>lsmod | grep apex</code>. Ak chýba, skúste <code>modprobe apex</code> alebo po inštalácii ovládača reštartujte. Keď na hostiteľovi existuje <code>/dev/apex_0</code>, overte položku zariadenia LXC (ak sa zapísali iba náhradné položky, spustite skript znova) a reštartujte kontajner cez <code>pct stop <ctid> && pct start <ctid></code>.",
|
||||
"replugTitle": "USB Coral zmizne po pripojení do iného portu",
|
||||
"replugBody": "Overte, že LXC pripája <code>/dev/bus/usb</code> namiesto odkazu <code>/dev/coral</code>. Konfigurácia má obsahovať <code>lxc.mount.entry: /dev/bus/usb dev/bus/usb ...</code> bez priamej závislosti od <code>/dev/coral</code>. Pri starej konfigurácii skript spustite znova.",
|
||||
"alpineTitle": "Alpine / Arch / RHEL / SUSE: runtime nie je nainštalovaný",
|
||||
"alpineBody": "<em>Režim iba sprístupnenia zariadenia</em> nastaví zariadenie bez inštalácie <code>libedgetpu</code>. Použite kompatibilný komunitný balík alebo zostavte zdrojový kód; pred príkazom ako <code>apk add</code> v Alpine overte dostupnosť balíka. Frigate môže runtime obsahovať. Pri Dockeri v LXC sprístupnite M.2 aj cez <code>--device /dev/apex_0:/dev/apex_0</code> alebo pripojte USB do Dockera: samotný LXC mount nestačí.",
|
||||
"frigateTitle": "Frigate hlási „Coral EdgeTPU detected but not available“",
|
||||
"frigateBody": "Overte runtime, viditeľnosť zariadenia a práva na čítanie/zápis skutočného procesu aplikácie. Pre USB skontrolujte oprávnenia a prípadnú skupinu <code>plugdev</code>. Pre M.2 overte <code>/dev/apex_0</code> cez <code>ls -l /dev/apex_0</code>. Názov ako <code>apex</code> v <code>/etc/group</code> nestačí: číselné GID a mapovania LXC musia sedieť. Overte aj obsadenie TPU iným procesom; privilegovaný režim nech nie je prvým riešením.",
|
||||
"logsTitle": "Skontrolujte host a kontajnerové protokoly",
|
||||
"logsBody": "Na hostiteľovi pozrite správy jadra cez <code>journalctl -k | grep -i -e apex -e gasket -e usb</code>. V LXC skontrolujte protokoly aplikácie; pri vnorenom Dockeri použite <code>docker logs <container></code>. Chyby môžu spôsobiť oprávnenia, chýbajúci runtime, USB spojenie alebo iný proces používajúci TPU."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Súvisiace",
|
||||
"items": [
|
||||
{
|
||||
"label": "Inštalácia Coral TPU na hostiteľa",
|
||||
"href": "/docs/hardware/install-coral-tpu-host",
|
||||
"tail": " — predpoklad použitia Coral M.2 / PCIe v CT."
|
||||
},
|
||||
{
|
||||
"label": "Pridať GPU do LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — prístup ku GPU, často kombinovaný s Coral vo Frigate."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Pridanie GPU do VM | Dokumentácia ProxMenux",
|
||||
"description": "Priraďte fyzickú GPU virtuálnemu stroju Proxmox. ProxMenux overí IOMMU, nastaví VFIO a zariadenia VM a zistí konflikty s inými VM alebo LXC."
|
||||
},
|
||||
"header": {
|
||||
"title": "Pridať GPU do VM (passthrough)",
|
||||
"description": "Zistí GPU Intel, AMD alebo NVIDIA pre priamy prístup z VM. Overí IOMMU a pridružené zariadenia, nastaví VFIO a VM a použije pravidlá kompatibility. Overte všetky dotknuté zariadenia.",
|
||||
"section": "Hardvér: grafické karty a Coral TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Čo robí",
|
||||
"body": "Automatizuje nastavenie hostiteľa a <code>hostpci</code> z <pveLink>dokumentácie PCI passthrough Proxmox</pveLink>. Overí priradenia <em>iným</em> hosťom a ponúkne riešenie konfliktov. Nezaručuje podporu každej GPU, resetovania či hosťovského ovládača."
|
||||
},
|
||||
"who": {
|
||||
"heading": "Pre koho je toto?",
|
||||
"body": "Pre priamy prístup <strong>virtuálneho stroja</strong> ku GPU cez VFIO. Kým je GPU priradená VFIO, ovládač hostiteľa ju nepoužije ani pri zastavenej VM. Na zdieľanie s <em>LXC</em> použite <lxcLink>Pridať GPU do LXC</lxcLink>."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Skôr ako začnete",
|
||||
"gpu": "Fyzicky nainštalovaná <strong>kompatibilná GPU</strong>. Skript zisťuje Intel, AMD a NVIDIA cez <code>lspci</code>.",
|
||||
"gpuCheck": "lspci | grep -iE 'VGA|3D|Display'",
|
||||
"iommu": "<strong>Podpora IOMMU</strong> v hardvéri a potrebné zapnutie vo firmvéri (Intel VT-d alebo AMD-Vi). Overí systém a môže nastaviť Linux; nemení BIOS/UEFI ani nedokazuje, že neaktívne IOMMU je vypnuté vo firmvéri.",
|
||||
"q35": "Sprievodca vyžaduje <strong>q35</strong> a odmietne <code>i440fx</code>. Typ stroja je oddelený od firmvéru BIOS/UEFI. Zmena čipovej súpravy existujúcej VM vyžaduje plánovanie a nevykonáva sa automaticky.",
|
||||
"q35Check": "qm config VMID | grep machine",
|
||||
"moreGpus": "Pripravte <strong>ďalšiu GPU alebo náhradný prístup</strong> cez SSH, IPMI či sériovú konzolu. Rezervovanie hlavnej GPU môže vypnúť miestny obraz. Pri <em>NVIDIA</em> môže karta mimo dotknutej skupiny IOMMU zostať hostiteľovi.",
|
||||
"nvidiaInstalled": "Po <nvidiaLink>inštalácii NVIDIA na hostiteľa</nvidiaLink> sa vybrané funkcie rezervujú pre <code>vfio-pci</code> namiesto <code>nvidia</code>. Modul <code>nvidia</code> môže zostať pre <strong>ostatné</strong> karty mimo dotknutej skupiny IOMMU. Overte ich cez <code>nvidia-smi</code>."
|
||||
},
|
||||
"pickOne": {
|
||||
"title": "Výhradné priradenie VM alebo zdieľanie LXC",
|
||||
"body": "Používateľ GPU viazaný na <code>vfio-pci</code> pre prechod VM nemôže súčasne používať hostiteľ ani LXC. Ak máte dva GPU, môžete vyhradiť jeden pre každú cestu. Ak máte iba jeden, vyberte:",
|
||||
"vmItem": "<strong>VM:</strong> priamy a výhradný prístup pre túto VM.",
|
||||
"lxcItem": "<strong>LXC (<lxcLink>Pridať GPU do LXC</lxcLink>):</strong> zdieľa zariadenie s hostiteľom a ďalšími kontajnermi cez natívny ovládač."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Spustenie inštalátora",
|
||||
"body": "Otvorte ProxMenux a vyberte <strong>Hardvér: GPU a Coral-TPU → Pridať GPU do VM</strong>.",
|
||||
"imageAlt": "Položka ponuky na pridanie GPU do VM"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Ako skript funguje",
|
||||
"body": "Zistenie a výber predchádzajú hlavným zmenám potvrdeným súhrnom. Zapnutie IOMMU má skoršie samostatné potvrdenie a môže už zmeniť štart systému. Neskoršie čistenie zvuku môže tiež vyžadovať výber."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Postup krok za krokom",
|
||||
"detect": {
|
||||
"title": "Detekovať GPU a skontrolovať IOMMU",
|
||||
"body": "Považuje IOMMU za aktívne iba vtedy, keď bežiace jadro má <code>intel_iommu=on</code> alebo <code>amd_iommu=on</code> a existujú skupiny IOMMU. Ak je parameter už uložený pre ďalší štart, pokračuje v režime čakajúceho reštartu; inak ho samostatne potvrdený krok môže pridať s <code>iommu=pt</code>. Jeho heuristika zavádzacieho súboru použije <code>/etc/kernel/cmdline</code>, keď sa v ňom nachádza značka koreňa ZFS ako <code>root=ZFS=</code>; inak použije <code>/etc/default/grub</code>. Táto heuristika nedokazuje skutočne použitý zavádzač. Novo nakonfigurované IOMMU sa prejaví po reštarte; potom overte skutočné skupiny.",
|
||||
"tipTitle": "Už ste nastavili kroky po inštalácii?",
|
||||
"tipBody": "Ak je <postLink>podpora VFIO IOMMU</postLink> nastavená a aktívna v jadre, kontrola prejde. Nastavenie pre ďalší štart samo osebe nedokazuje aktuálne zapnutie.",
|
||||
"imageAlt": "Zoznam zistených GPU s predávajúcim a PCI adresa"
|
||||
},
|
||||
"preflight": {
|
||||
"title": "Výber GPU a predbežné kontroly",
|
||||
"intro": "Akonáhle si vyberiete GPU, skript spustí sériu kontrol, ktoré môžu každý blok ďalší postup:",
|
||||
"items": [
|
||||
"<strong>Ochrana SR-IOV.</strong> Odmietne VF a PF s aktívnymi VF, pretože nastavuje celé zariadenia, nie SR-IOV. SR-IOV nastavte samostatne na podporovanom hardvéri.",
|
||||
"<strong>Jediná GPU.</strong> Po rezervovaní pre VFIO môže miestna konzola stratiť obraz. Najprv overte SSH alebo webový prístup z iného počítača.",
|
||||
"<strong>Politika resetovania AMD.</strong> Číta <code>/sys/bus/pci/devices/<pci>/reset_method</code>. APU alebo samostatná karta bez FLR je <em>blokovaná politikou sprievodcu</em>; neznámy podtyp bez FLR vyžaduje potvrdenie. Nedokazuje to všeobecnú nemožnosť.",
|
||||
"<strong>Stav D3cold.</strong> Sprievodca blokuje AMD karty so stavom <code>D3cold</code> pre riziko zlyhania aktivácie. Overte napájanie a firmvér.",
|
||||
"<strong>Analýza skupiny IOMMU.</strong> Číta <code>/sys/kernel/iommu_groups/</code> a do plánu VM zahrnie <em>všetkých členov okrem mostov</em>, prípadne aj sieťové či úložné radiče. Ak skupina obsahuje zariadenia z iného slotu, skript ich vypíše pred súhrnom; overte, že hostiteľ žiadne z nich nepotrebuje. Pri čakajúcom reštarte IOMMU nie sú skutočné skupiny dostupné a plán najprv obsahuje iba vybranú funkciu GPU; izoláciu overte po reštarte."
|
||||
],
|
||||
"audioIntro": "<strong>Pridružený zvuk.</strong> Dva prípady podľa umiestnenia radiča:",
|
||||
"audioDgpu": "<strong>Samostatná GPU:</strong> zvuk HDMI býva vo funkcii <code>.1</code> rovnakého PCI slotu a pri zistení sa zahrnie. Ak ho používal hostiteľ, rezervovaním pre VM stratí prístup.",
|
||||
"audioIgpu": "<strong>Bez zvukovej funkcie <code>.1</code>:</strong> zvuk môže byť na inom zariadení ako <code>00:1f.3</code>. Vypíše radiče a ovládače, napríklad <code>snd_hda_intel</code>. Predvolene nie je vybraný <strong>žiadny</strong>; vyberte iba potrebné."
|
||||
},
|
||||
"pickVm": {
|
||||
"title": "Vyberte cieľovú VM",
|
||||
"body": "Vyberte VM zo zoznamu. Vyžaduje q35 a podľa možnosti použije existujúce položky GPU. BIOS/UEFI je samostatné nastavenie, nie typ stroja. Čipovú súpravu ani režim štartu hosťa automaticky nemení.",
|
||||
"imageAlt": "Výber VM podľa názvu, ID a stavu"
|
||||
},
|
||||
"switchMode": {
|
||||
"title": "Riešenie existujúcich priradení",
|
||||
"intro": "Skript prehľadá konfigurácie VM a LXC na hostiteľovi a zisťuje použitie vybranej GPU. Možné výsledky:",
|
||||
"items": [
|
||||
"<strong>GPU je voľná.</strong> Pokračuje bez odstránenia priradení.",
|
||||
"<strong>Priradená inej VM.</strong> Najprv zastavte zdrojovú VM. Môžete <em>ponechať položky a vypnúť automatický štart</em> alebo <em>odstrániť položky a ponechať automatický štart</em>. Pri aktívnom <code>vfio-pci</code> bez potrebných zmien hostiteľa možno presun VM→VM vykonať bez jeho reštartu.",
|
||||
"<strong>GPU používaná LXC.</strong> Pri bežných kontajneroch zvoľte <em>ponechať konfiguráciu GPU a vypnúť automatický štart</em> alebo <em>odstrániť konfiguráciu zariadenia GPU a automatický štart ponechať</em>. Odstránenie vymaže položky <code>devN</code> a pri AMD/Intel aj staré pravidlá <code>/dev/dri</code> <code>lxc.mount.entry</code> a <code>lxc.cgroup2.devices.allow</code>. Kontajnery OCI si ponechajú konfiguráciu a zastavia sa s vypnutým automatickým štartom; ich GPU odstráňte cez OCI manager Apps. Detekcia konfliktov prebieha podľa rodiny zariadení GPU a môže zahrnúť ďalšie karty tejto rodiny."
|
||||
],
|
||||
"imageAlt": "Dialóg ponúka odstrániť GPU z LXC pred pridelením do VM",
|
||||
"smartTitle": "Kontrola pridruženého zvuku pri odstránení GPU",
|
||||
"smartBody": "Potom môže ponúknuť zoznam <strong>potenciálne nepotrebných zvukových zariadení</strong> zdrojovej VM. Zrušte výber stále potrebných. Napríklad môže ponechať <code>02:00.1</code> a ponúknuť odstránenie <code>00:1f.3</code>. O odstránení rozhoduje výber, nie zaručená univerzálna väzba zvuku a obrazu."
|
||||
},
|
||||
"audioPick": {
|
||||
"title": "Bez zvukovej funkcie .1 vyberte potrebné radiče",
|
||||
"body": "Stáva sa to len pre Intel iGPU a podobné split-audio nastavenia. Kontrolný zoznam zobrazuje každý PCI audio ovládač na hostiteľovi (s výnimkou všetkých už v skupine IOMMU GPU), označený jeho súčasným vodičom. Vyberte tie, ktoré chcete, alebo žiadne, ak VM nepotrebuje audio z hostiteľa hardvéru.",
|
||||
"imageAlt": "Kontrolný dialóg s každým hostiteľom PCI audio ovládač (BDF + ovládač), keď GPU nemá .1 súrodenec",
|
||||
"warnTitle": "Nevyberajte zvuk potrebný hostiteľovi",
|
||||
"warnBody": "Priradenie zvuku môže odobrať prístup hostiteľovi; radič nemôže súčasne patriť inej spustenej VM. Nepotrebný zvuk nevyberajte a overte priradenia. Pípanie konzoly nemusí pochádzať z PCI zvuku."
|
||||
},
|
||||
"summary": {
|
||||
"title": "Preskúmanie zhrnutia potvrdenia",
|
||||
"body": "Overte konečný plán hostiteľa a VM a pri chybe ho zrušte. Zobrazuje skupinu IOMMU a počet jej zariadení; členovia z iného slotu sú vypísaní v predchádzajúcom kroku. Zrušenie zastaví hlavné zmeny, nevráti však skoršiu samostatne potvrdenú zmenu nastavenia štartu pre IOMMU.",
|
||||
"imageAlt": "Súhrn plánovaných zmien hostiteľa a VM"
|
||||
},
|
||||
"hostApply": {
|
||||
"title": "Uplatnia sa zmeny hostiteľa",
|
||||
"intro": "Fáza vykonania mení hostiteľa a VM. Čistenie zvuku môže ešte vyžadovať výber. Možné zmeny:",
|
||||
"items": [
|
||||
"<code>/etc/modules</code> Dodáva: <code>vfio</code>, <code>vfio_iommu_type1</code>, <code>vfio_pci</code> (plus <code>vfio_virqfd</code> o jadrách < 6.2).",
|
||||
"<code>/etc/modprobe.d/vfio.conf</code> — AMD/Intel: <code>options vfio-pci ids=<vendor:device,...> disable_vga=1</code>. NVIDIA: <code>softdep nvidia pre: vfio-pci</code> (<code>_drm</code>/<code>_modeset</code>/<code>_uvm</code>); skutočné priradenie je podľa BDF. AMD pridáva poradie načítania <code>softdep</code>: <code>vfio-pci</code> → <code>radeon</code>/<code>amdgpu</code>.",
|
||||
"Zapíše <code>/etc/modprobe.d/iommu_unsafe_interrupts.conf</code> a <code>kvm.conf</code> s <code>allow_unsafe_interrupts=1</code> a <code>ignore_msrs=1</code>. Ide o nastavenia skriptu, nie všeobecné požiadavky Windows/macOS; nebezpečné prerušenia oslabujú ochranu premapovania.",
|
||||
"<code>/etc/modprobe.d/blacklist.conf</code>: NVIDIA — <code>nouveau</code>/<code>lbm-nouveau</code>; AMD — <code>radeon</code> + <code>amdgpu</code>; Intel — <code>i915</code>. Tieto pravidlá výrobcu môžu ovplyvniť ďalšie karty s rovnakým ovládačom. Modul <code>nvidia</code> sa blokuje <strong>iba</strong> cez <code>/etc/modprobe.d/proxmenux-nvidia-vfio-blacklist.conf</code>, keď sú <em>všetky</em> NVIDIA hostiteľa evidované pre VFIO.",
|
||||
"<code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> + <code>/etc/proxmenux/vfio-bind.bdfs</code> — <strong>Iba NVIDIA.</strong> Nastaví <code>ATTR'{'driver_override'}'=\"vfio-pci\"</code> pri PCI ADD pre evidované BDF vrátane funkcií dotknutej skupiny IOMMU. Mimo skupín môže zostať <code>nvidia</code>. Politika BDF nerozdelí hardvérovú skupinu IOMMU.",
|
||||
"<strong>Iba AMD.</strong> Pokúsi sa o výpis ROM z <code>/sys/bus/pci/.../rom</code> alebo ACPI VFCT do <code>/usr/share/kvm/vbios_<vendor>_<device>.bin</code>. Pri úspechu VM použije <code>romfile=</code>. Platný výpis nezaručí úspešnú inicializáciu GPU.",
|
||||
"<strong>Iba NVIDIA.</strong> Zastaví a vypne <code>nvidia-persistenced</code>, <code>nvidia-powerd</code>, <code>nvidia-fabricmanager</code> iba ak sú všetky NVIDIA rezervované pre VFIO. Pri zmiešanom použití zachová služby a <code>nvidia</code> pre natívne karty.",
|
||||
"<code>update-initramfs -u -k all</code> — spustí sa iba pri zmene nastavenia hostiteľa."
|
||||
]
|
||||
},
|
||||
"vmApply": {
|
||||
"title": "Konfigurácia VM sa aplikuje pomocou qm set",
|
||||
"body": "VM konfig na <code>/etc/pve/qemu-server/<vmid>.conf</code> je aktualizovaný prostredníctvom <code>qm set</code> (nikdy priamo <code>sed</code>):",
|
||||
"after1": "Pridáva <code>x-vga=1</code> pre AMD a NVIDIA, <strong>nie</strong> Intel. Ide o politiku skriptu, nie dôkaz, že všetkým Intel iGPU chýba firmvér alebo že príznak vždy spôsobuje zamrznutie.",
|
||||
"after2": "Dodatočné linky <code>hostpciN</code> sú pripojené, ak skupina IOMMU GPU obsahuje ďalšie zariadenia, ktoré potrebujete spoločne prechádzať."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Reštart pri požadovanej zmene hostiteľa",
|
||||
"body": "Pri zmene štartu alebo ovládačov postupujte podľa výzvy na reštart a pred VM overte aktívne priradenie GPU. Uložené nastavenie nepotvrdzuje aktiváciu. Presun VM→VM so správnym VFIO nemusí vyžadovať reštart hostiteľa.",
|
||||
"imageAlt": "Súhrnná obrazovka znázorňujúca, čo bolo zmenené, nasledovaná reštartom"
|
||||
}
|
||||
},
|
||||
"vendors": {
|
||||
"heading": "Poznámky podľa výrobcu",
|
||||
"nvidiaHeading": "NVIDIA",
|
||||
"nvidiaBody": "Zachováva staršie riešenie pre <em>Code 43</em>: <code>hidden=1</code>, ID <code>NV43FIX</code> v <code>args</code> a <code>kvm=off</code>. Nie je všeobecnou požiadavkou dnešných GeForce; NVIDIA povolila Windows passthrough od R465. Chyba môže mať iné príčiny; overte GPU a ovládač.",
|
||||
"nvidiaMultiHeading": "Podpora multi-GPU NVIDIA",
|
||||
"nvidiaMultiBody": "Zmiešané použitie NVIDIA <strong>podľa BDF</strong>. Funkcie <code>vfio-pci</code> eviduje podľa adresy, nielen ID <code>vendor:device</code>. Mimo dotknutých skupín môže ponechať <code>nvidia</code>; overte cez <code>nvidia-smi</code>. Dve karty v rovnakej skupine tým neizoluje.",
|
||||
"amdHeading": "AMD",
|
||||
"amdBody": "Niektoré AMD GPU sa po zastavení VM nedajú resetovať. Sprievodca overuje hlásené schopnosti, nie každý reálny cyklus. <vendorResetLink>vendor-reset</vendorResetLink> podporuje obmedzený zoznam, vyžaduje kompatibilné jadro a skoré načítanie; nenainštaluje sa. Aj <em>RadeonResetBugFix</em> pre Windows závisí od hardvéru, bez všeobecnej záruky.",
|
||||
"intelHeading": "Intel iGPU",
|
||||
"intelBody": "Úplné priradenie Intel iGPU a SR-IOV sú odlišné postupy. Sprievodca rezervuje celé zariadenie pre jednu VM bez <code>x-vga=1</code>. <sriovLink>i915-sriov-dkms</sriovLink> vyžaduje podporovaný hardvér a jadro; „UHD 630+“ nie je pravidlo kompatibility. Pripravte náhradný prístup k hostiteľovi."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Overenie"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Riešenie problémov",
|
||||
"code43Title": "Kód 43 vo Windows (NVIDIA)",
|
||||
"code43Body": "Code 43 nedokazuje chybu skrytia KVM. Overte <code>qm config VMID | grep -E \"cpu|args\"</code> so skutočným VMID, potom <code>hidden=1</code> a <code>hv_vendor_id=NV43FIX</code>. Overte aj hosťovský ovládač, firmvér a priradenie. Opakovanie môže pri existujúcom priradení skončiť.",
|
||||
"amdResetTitle": "AMD GPU funguje raz, zlyháva na reštarte VM",
|
||||
"amdResetBody": "Zlyhanie resetovania je jednou z príčin. Reštart alebo úplné vypnutie môže dočasne pomôcť. Overte podporu a skoré načítanie <code>vendor-reset</code>; samotné <code>softdep amdgpu pre: vendor-reset</code> nezaručí načítanie pred VFIO. Aj <em>RadeonResetBugFix</em> potrebuje kompatibilnú GPU.",
|
||||
"stuckBootTitle": "VM prilepené booting / GPU nezistené",
|
||||
"stuckBootBody": "Overte skutočnú adresu cez <code>lspci -nnk -s PCI_ADDRESS</code>; očakáva sa <code>Kernel driver in use: vfio-pci</code>. Nahraďte PCI_ADDRESS. Pri natívnom ovládači overte politiku priradenia, nielen <code>/etc/modprobe.d/blacklist.conf</code>; NVIDIA používa stav BDF. Pozrite <code>dmesg | grep vfio</code>. Po oprave spustite <code>update-initramfs -u -k all</code> a plánovaný reštart.",
|
||||
"darkTitle": "Hostiteľská konzola ide tma po reštarte a nemôžem SSH v",
|
||||
"darkBody": "Čierna obrazovka nedokazuje výpadok hostiteľa. Ak nefunguje ani SSH, overte sieť a radiče zahrnuté v skupine IOMMU. Obnovte prístup cez IPMI, sériovú konzolu alebo záchranné prostredie; overte <code>/etc/pve/qemu-server/<vmid>.conf</code> a vráťte iba príslušné priradenia a pravidlá. Nemažte nesúvisiace nastavenia.",
|
||||
"logTitle": "Skontrolujte protokol inštalácie",
|
||||
"logBody": "Každé spustenie zapisuje <code>/tmp/add_gpu_vm.log</code>. Záznam priložte k žiadosti o pomoc."
|
||||
},
|
||||
"revert": {
|
||||
"heading": "Ručné vrátenie zmien",
|
||||
"intro": "Zastavte VM a odstráňte iba príslušné PCI priradenia v Hardvéri alebo pomocou nižšie uvedeného indexu. GPU sa tým nevráti natívnemu ovládaču hostiteľa. Na to použite Zmeniť režim GPU a pred potvrdením overte dotknutých hostí."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Súvisiace",
|
||||
"items": [
|
||||
{
|
||||
"label": "Nainštalovať ovládače NVIDIA (host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — príprava ovládača pre natívne karty hostiteľa; GPU vo VFIO ho nemôže používať súčasne."
|
||||
},
|
||||
{
|
||||
"label": "Pridať GPU do LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — alternatíva: zdieľať GPU s viacerými kontajnermi namiesto vyhradenia jednej VM."
|
||||
},
|
||||
{
|
||||
"label": "Zmeniť režim GPU (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — prepnutie tej istej GPU medzi zdieľaním a výhradným priradením."
|
||||
},
|
||||
{
|
||||
"label": "GPU Prenosové príkazy",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — lspci, overenie IOMMU a prehľad qm set hostpci."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,185 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Pridanie GPU do LXC | Dokumentácia ProxMenux",
|
||||
"description": "Zdieľajte GPU Intel, AMD alebo NVIDIA s LXC. ProxMenux nastaví zariadenia, skupiny a knižnice podľa distribúcie; aplikácia musí akceleráciu podporovať a mať nastavenú."
|
||||
},
|
||||
"header": {
|
||||
"title": "Pridať GPU do LXC",
|
||||
"description": "Zdieľa prístup ku GPU s LXC cez zariadenia hostiteľa. Ovládač zostáva na hostiteľovi; aplikácie potrebujú kompatibilné knižnice a vlastné nastavenie.",
|
||||
"section": "Hardvér: grafické karty a Coral TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Čo robí",
|
||||
"body": "Pridá položky <code>dev<N></code> do <code>/etc/pve/lxc/<ctid>.conf</code> pre príslušné uzly <code>/dev/dri/*</code>, <code>/dev/kfd</code> alebo <code>/dev/nvidia*</code>. Spustí kontajner, nainštaluje balíky používateľského priestoru pre jeho distribúciu a pri Intel/AMD zosúladí skupiny <code>video</code> a <code>render</code>. Akcelerácia aplikácií naďalej vyžaduje kompatibilný hardvér, knižnice a nastavenie aplikácie."
|
||||
},
|
||||
"compare": {
|
||||
"heading": "Zdieľanie LXC a priame priradenie VM",
|
||||
"intro": "LXC zdieľa jadro a môže GPU <em>zdieľať</em> medzi hostiteľom a kontajnermi. Pri <vmLink>úplnom priradení VM</vmLink> je zariadenie vyhradené tejto VM a ovládač hostiteľa ho nemôže používať.",
|
||||
"headerFeature": "Funkcia",
|
||||
"headerLxc": "LXC (táto stránka)",
|
||||
"headerVm": "VM",
|
||||
"rows": [
|
||||
{
|
||||
"feature": "Hostiteľ stále používa GPU?",
|
||||
"lxc": "Áno",
|
||||
"vm": "Nie, exkluzívny pre VM"
|
||||
},
|
||||
{
|
||||
"feature": "Viac kontajnerov zdieľajúcich jednu GPU?",
|
||||
"lxc": "Áno",
|
||||
"vm": "Nie"
|
||||
},
|
||||
{
|
||||
"feature": "Vyžaduje IOMMU / VFIO na hostiteľovi?",
|
||||
"lxc": "Nie",
|
||||
"vm": "Áno"
|
||||
},
|
||||
{
|
||||
"feature": "Požaduje sa reštart?",
|
||||
"lxc": "Zvyčajne nie (len reštart CT)",
|
||||
"vm": "Pri zmene ovládača alebo IOMMU hostiteľa; nie pri každom priradení"
|
||||
},
|
||||
{
|
||||
"feature": "Hosťovské operačné systémy",
|
||||
"lxc": "Iba Linux (LXC je iba Linux)",
|
||||
"vm": "Podporovaný hosťovský OS s kompatibilným ovládačom GPU"
|
||||
}
|
||||
]
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Skôr ako začnete",
|
||||
"gpu": "<strong>GPU na hostiteľovi</strong> Intel, AMD alebo NVIDIA zistená cez <code>lspci</code>.",
|
||||
"gpuCheck": "lspci | grep -iE 'VGA|3D|Display'",
|
||||
"vfio": "<strong>GPU nesmie byť priradená vfio-pci.</strong> Potrebuje natívny ovládač hostiteľa. Pri priradení VM skript ponúkne <switchLink>Zmeniť režim GPU</switchLink>.",
|
||||
"nvidia": "<strong>Pre NVIDIA:</strong> najprv nainštalujte ovládač hostiteľa. Knižnice kontajnera musia zodpovedať jeho verzii. Pozrite <nvidiaLink>Inštalácia ovládačov NVIDIA na hostiteľa</nvidiaLink>.",
|
||||
"nvidiaCheck": "nvidia-smi",
|
||||
"container": "<strong>Existujúci LXC.</strong> Skript ho nevytvorí. Podporuje oba režimy; <strong>privilegovaný</strong> kontajner nie je vždy nutný. Zariadenia a číselné skupinové oprávnenia aplikácie musia súhlasiť."
|
||||
},
|
||||
"unpriv": {
|
||||
"title": "Podporuje privilegované aj neprivilegované kontajnery",
|
||||
"body": "Skript píše položky <code>dev<N></code> na LXC config a, na neprivilegovaných kontajneroch, zarovná <code>video</code> a <code>render</code> GIDs medzi hostiteľom a kontajnerom, takže uzly zariadenia GPU sú dosiahnuteľné zvnútra bez toho, aby ste museli ručne editovať <code>lxc.idmap</code>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Spustenie inštalátora",
|
||||
"body": "Otvorte ProxMenux a vyberte <strong>Hardvér: GPU a Coral-TPU → Pridať GPU do LXC</strong>.",
|
||||
"imageAlt": "Položka ponuky na pridanie GPU do LXC"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Ako skript funguje",
|
||||
"body": "Vyberte kontajner a rodiny GPU a prejdite kontrolami. Potom spracovanie zastaví a zmení kontajner bez ďalšieho konečného potvrdenia. Voliteľné čistenie VFIO má vlastné potvrdenie a môže skôr zmeniť hostiteľa."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Postup krok za krokom",
|
||||
"detect": {
|
||||
"title": "Zistenie GPU hostiteľa",
|
||||
"body": "Hľadá radiče GPU cez <code>lspci</code>. Pre NVIDIA overí modul <code>nvidia</code> a <code>nvidia-smi</code>; zistená verzia určuje inštalátor <code>.run</code> pre kontajner.",
|
||||
"tipTitle": "NVIDIA nie je pripravený?",
|
||||
"tipBody": "Ak chýba modul alebo NVIDIA na hostiteľovi nefunguje, najprv použite <nvidiaLink>Inštalácia ovládačov NVIDIA na hostiteľa</nvidiaLink> a ovládač overte."
|
||||
},
|
||||
"pickCt": {
|
||||
"title": "Vyberte kontajner LXC",
|
||||
"body": "Zobrazí vhodné kontajnery LXC podľa ID a názvu; kontajnery OCI sú vylúčené a pre zariadenia používajú OCI manager Apps. Kontajner sa zastaví, ak beží, spustí sa na inštaláciu ovládačov a bežne sa vráti do pôvodného stavu (spustený/zastavený).",
|
||||
"imageAlt": "Výber existujúceho kontajnera LXC"
|
||||
},
|
||||
"selectGpu": {
|
||||
"title": "Vyberte rodiny GPU",
|
||||
"body": "Zoznam vyberá rodiny výrobcov, nie izolované PCI zariadenie. Intel/AMD pridajú určené uzly DRI; NVIDIA dostupné zariadenia, prípadne z viacerých kariet. Jediná rodina sa vyberie automaticky. Overte výsledný zoznam najmä pri viacerých GPU.",
|
||||
"imageAlt": "Zoznam zistených rodín GPU s názvom a PCI adresou"
|
||||
},
|
||||
"preflight": {
|
||||
"title": "Predbežné kontroly",
|
||||
"imageAlt": "Ponuka zmeny režimu GPU priradenej vfio-pci",
|
||||
"intro": "Tri kontroly, ktoré vás môžu blokovať alebo presmerovať:",
|
||||
"items": [
|
||||
"<strong>Ochrana SR-IOV.</strong> Sprievodca blokuje VF alebo PF s aktívnymi VF. Je to obmedzenie širokého výberu zariadení, nie všeobecný zákaz v LXC. Tieto zariadenia nastavte samostatne.",
|
||||
"<strong>Priradená vfio-pci.</strong> Natívny ovládač nevytvorí <code>/dev/dri/*</code> ani <code>/dev/nvidia*</code>. Ponúkne <switchLink>Zmeniť režim GPU</switchLink>; postupujte podľa pokynov na reštart a vráťte sa.",
|
||||
"<strong>Už nastavená.</strong> Ak sú všetky zariadenia prítomné, skončí bez preinštalovania knižníc. Pokračuje iba s chýbajúcimi vybranými rodinami."
|
||||
]
|
||||
},
|
||||
"applyConfig": {
|
||||
"title": "Použiť zmeny konfigurácie LXC",
|
||||
"body1": "Zastaví kontajner, ak beží, a upraví <code>/etc/pve/lxc/<ctid>.conf</code>. Číslované položky <code>dev<N></code> obsahujú GID hostiteľa pre <code>video</code> alebo <code>render</code>. Existujúce riadky bind <code>lxc.mount.entry</code> pre <code>/dev/dri</code> sa nahradia položkami <code>dev:</code>; overte výslednú konfiguráciu a oprávnenia.",
|
||||
"body2": "Príklad po Intel + NVIDIA na tom istom kontajneri:"
|
||||
},
|
||||
"installDrivers": {
|
||||
"title": "Spustiť kontajner a inštalovať ovládače vnútri",
|
||||
"body": "Spustí kontajner a čaká približne 30 sekúnd na odpoveď <code>pct exec</code>. Zistí distribúciu cez <code>/etc/os-release</code> a nainštaluje príslušné balíky.",
|
||||
"headerDistro": "Distribúcia",
|
||||
"headerInt": "Intel / AMD",
|
||||
"headerNvidia": "NVIDIA",
|
||||
"rows": [
|
||||
{
|
||||
"distro": "Alpine",
|
||||
"intel": "apk add mesa-va-gallium intel-media-driver libva-utils",
|
||||
"nvidia": "apk add nvidia-utils"
|
||||
},
|
||||
{
|
||||
"distro": "Arch / Manjaro",
|
||||
"intel": "pacman -Sy intel-media-driver mesa libva-utils",
|
||||
"nvidia": "pacman -Sy nvidia-utils"
|
||||
}
|
||||
],
|
||||
"debianDistro": "Debian / Ubuntu / ostatné",
|
||||
"debianIntel": "apt-get install va-driver-all intel-opencl-icd vainfo",
|
||||
"debianNvidia": "Rozbalí <code>.run</code> na hostiteľovi → <code>pct push</code> → inštaluje s <code>--no-kernel-modules --no-dkms</code>.",
|
||||
"whyTitle": "Prečo na Debiane používa inštalátor NVIDIA .run",
|
||||
"whyBody": "Balíky nemusia zodpovedať hostiteľovi. Knižnice <strong>musia zodpovedať načítanému modulu hostiteľa</strong> pre NVML a <code>nvidia-smi</code>. Debian/glibc použije uložený <code>.run</code> verzie hostiteľa, rozbalí a zabalí ho na hostiteľovi, prenesie cez <code>pct push</code> a inštaluje s <code>--no-kernel-modules --no-dkms</code>. Alpine a Arch používajú repozitáre; overte verzie."
|
||||
},
|
||||
"alignGids": {
|
||||
"title": "Zarovnať GID a obnoviť stav",
|
||||
"body1": "Pri Intel/AMD načíta GID hostiteľa pre <code>video</code> a <code>render</code>, pričom 44/104 použije iba ako náhradné hodnoty, a potom upraví <code>/etc/group</code> v kontajneri tak, aby zodpovedali; pri behu iba s NVIDIA sa tento krok preskočí. Položky ako <code>video:44</code> a <code>render:104</code> sú príklady, nie univerzálne ID. Overte členstvo aplikácie a účinné oprávnenia k zariadeniam.",
|
||||
"body2": "Pri bežnom dokončení pôvodne zastavený kontajner znovu zastaví; pôvodne spustený nechá bežať. Pri chybe spustenia alebo inštalácie overte konečný stav a záznam."
|
||||
}
|
||||
},
|
||||
"vendors": {
|
||||
"heading": "Poznámky podľa výrobcu",
|
||||
"intelHeading": "Intel iGPU",
|
||||
"intelBody": "Akcelerácia médií Intel vrátane <em>Quick Sync</em> závisí od generácie GPU, kodekov a nastavenia aplikácie. Skript zdieľa tie z <code>/dev/dri/card0</code>, <code>card1</code>, <code>renderD128</code> a <code>renderD129</code>, ktoré existujú; iné čísla uzlov sa nepridajú. Hostiteľ ich už musí poskytovať prostredníctvom natívneho ovládača, napríklad <code>i915</code>.",
|
||||
"amdHeading": "AMD",
|
||||
"amdBody": "AMD používa DRI pre Mesa/VA-API. Ak hostiteľ poskytuje <code>/dev/kfd</code>, zdieľa aj ten. ROCm/OpenCL potrebuje podporovaný hardvér a kompatibilné knižnice; zdieľanie zariadenia nenainštaluje celé prostredie ROCm.",
|
||||
"nvidiaHeading": "NVIDIA",
|
||||
"nvidiaBody": "Zdieľa dostupné <code>/dev/nvidia*</code>. <strong>Zhoda verzií ovládača</strong> je dôležitá pre <code>nvidia-smi</code>. Debian/glibc používa <code>.run</code> verzie hostiteľa, Alpine/Arch repozitáre. Pod 2048 MiB nastavenej RAM ponúkne dočasné zvýšenie a potom obnoví hodnotu; vyžaduje aj 1500 MiB voľného disku.",
|
||||
"updateTitle": "Po aktualizácii NVIDIA hostiteľa overte knižnice LXC",
|
||||
"updateBody": "Staré knižnice môžu vyvolať chybu <code>nvidia-smi</code>. <nvidiaLink>Inštalátor NVIDIA hostiteľa</nvidiaLink> ponúka aktualizáciu kontajnerov. Opätovné pridanie môže pri existujúcich zariadeniach skončiť a aktualizáciu knižníc nezaručuje. Overte verzie a aktualizujte príslušné balíky alebo používateľský inštalátor."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Overenie",
|
||||
"body": "V kontajneri overte, či je GPU viditeľná a použiteľná."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Riešenie problémov",
|
||||
"mismatchTitle": "nvidia-smi: Failed to initialize NVML: Driver/library version mismatch",
|
||||
"mismatchBody": "Knižnice nezodpovedajú načítanému modulu. Overte verzie a aktualizujte používateľský priestor LXC. Uložený <code>.run</code> slúži pre Debian/glibc, no pridanie môže skončiť, ak už všetky zariadenia existujú.",
|
||||
"denyTitle": "Povolenie zamietnuté na /dev/dri/renderD128 vnútri kontajnera",
|
||||
"denyBody": "Overte zariadenie a číselné oprávnenia <code>render</code>, potom členstvo používateľa v <code>render</code>. Ak je príkaz dostupný, pridajte ho do <code>render</code> cez <code>usermod -aG render <user></code>; zástupný text nahraďte skutočným účtom. Reštartujte reláciu. Zmena privilégií nie je všeobecná oprava.",
|
||||
"vainfoTitle": "vainfo hovorí: VA-API verzia 1.xx; nepodarilo sa inicializovať",
|
||||
"vainfoBody": "Overte prístup a ovládač VA-API. Názvy balíkov závisia od distribúcie: napríklad <code>intel-media-driver</code> pre podporované novšie Intel GPU, <code>i965-va-driver</code> pre staršie a <code>mesa-va-drivers</code> pre AMD. Samotná správa nepotvrdzuje chýbajúci balík.",
|
||||
"logTitle": "Záznam inštalácie",
|
||||
"logBody": "Každé spustenie zapisuje <code>/tmp/add_gpu_lxc.log</code> na hostiteľovi. Priložte záznam k žiadosti o pomoc."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Súvisiace",
|
||||
"items": [
|
||||
{
|
||||
"label": "Nainštalovať ovládače NVIDIA (host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — pred zdieľaním NVIDIA nainštalujte ovládač hostiteľa."
|
||||
},
|
||||
{
|
||||
"label": "Pridať GPU do VM (passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — alternatíva na vyhradenie GPU jednej VM."
|
||||
},
|
||||
{
|
||||
"label": "Zmeniť režim GPU (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — prepnutie GPU medzi zdieľaním LXC a priradením VM."
|
||||
},
|
||||
{
|
||||
"label": "GPU Prenosové príkazy",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — stručný prehľad súvisiacich príkazov shellu."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,203 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Inštalácia Coral TPU na hostiteľa | Dokumentácia ProxMenux",
|
||||
"description": "Inštaluje komponenty Coral na Proxmox VE podľa hardvéru: gasket/apex cez DKMS pre M.2 / Mini-PCIe a libedgetpu1-std pre USB. Pri oboch typoch vykoná oba postupy."
|
||||
},
|
||||
"header": {
|
||||
"title": "Inštalácia Coral TPU na hostiteľa",
|
||||
"description": "Pripraví hostiteľa Proxmoxu na Coral a zdieľanie LXC. Zistí M.2 / Mini-PCIe, USB alebo oba a použije príslušný postup: moduly DKMS pre PCIe a runtime Google Edge TPU pre USB.",
|
||||
"section": "Hardvér: grafické karty a Coral TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Čo robí",
|
||||
"body": "<strong>Jeden inštalátor s rozpoznaním hardvéru</strong>. PCIe používa <code>gasket</code> a <code>apex</code> s DKMS; budúce zostavenia vyžadujú kompatibilné zdroje a hlavičky. USB používa <code>libedgetpu1-std</code>. Pri oboch typoch vykoná oba postupy. Runtime USB musí byť tam, kde beží aplikácia; pri použití iba v LXC nie je nevyhnutný aj na hostiteľovi."
|
||||
},
|
||||
"which": {
|
||||
"heading": "Ktorý Coral mám?",
|
||||
"body": "Modely PCIe a USB majú odlišné vyhotovenie a požiadavky. Skript podporuje oba; pred spustením identifikujte svoje zariadenie.",
|
||||
"headerForm": "Vyhotovenie",
|
||||
"headerDetect": "Detekcia",
|
||||
"headerInstall": "Typ inštalácie",
|
||||
"headerReboot": "Reštart?",
|
||||
"pcieForm": "M.2 / Mini-PCIe",
|
||||
"pcieFormSub": "(karty M.2 existujú s jedným alebo dvoma Edge TPU)",
|
||||
"pcieDetect": "PCI ID výrobcu <code>1ac1</code>",
|
||||
"pcieInstall": "Modul jadra (gasket + apex) cez DKMS",
|
||||
"pcieReboot": "Áno",
|
||||
"usbForm": "USB akcelerátor",
|
||||
"usbFormSub": "(malý plastový USB adaptér)",
|
||||
"usbDetect": "USB <code>1a6e:089a</code> (nenaprogramované) / <code>18d1:9302</code> (naprogramované)",
|
||||
"usbInstall": "Používateľský runtime <code>libedgetpu1-std</code> z repozitára APT Google",
|
||||
"usbReboot": "Nie"
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Skôr ako začnete",
|
||||
"coral": "<strong>Pripojený Coral</strong> (M.2, Mini-PCIe alebo USB) na inštaláciu. Bez zisteného hardvéru môže ponúknuť čistenie či odstránenie existujúcich komponentov, nový hardvérový postup však neinštaluje.",
|
||||
"coralCheck": "lspci -d 1ac1: ; lsusb | grep -E '1a6e:089a|18d1:9302'",
|
||||
"internet": "<strong>Prístup na internet</strong> na hostiteľovi na klonovanie ovládača PCIe z GitHubu alebo stiahnutie <code>libedgetpu1-std</code> z repozitára APT Google pre USB.",
|
||||
"headers": "<strong>Hlavičky jadra dostupné cez APT</strong>: <code>proxmox-headers-$(uname -r)</code>. Potrebné iba pre PCIe/M.2; skript ich nainštaluje.",
|
||||
"reboot": "<strong>Naplánujte reštart</strong> pre PCIe. Skript sa pokúsi načítať zostavené moduly; reštart overí aj ich automatické načítanie."
|
||||
},
|
||||
"hostPrepTip": {
|
||||
"title": "To len pripravuje hostiteľa",
|
||||
"body": "Pripraví hostiteľa na <em>prístup k zariadeniu</em>, aplikáciu však nenastaví ani neotestuje. Ak chcete Coral <em>používať</em> v kompatibilnej aplikácii ako Frigate, pokračujte na <lxcLink>Pridanie Coral TPU do LXC</lxcLink>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Spustenie inštalátora",
|
||||
"body": "Otvorte ProxMenux na hostiteľovi a vyberte <strong>Hardvér: GPU a Coral-TPU → Inštalovať/aktualizovať Coral TPU na hostiteľovi</strong>.",
|
||||
"imageAlt": "Položka ponuky na inštaláciu alebo aktualizáciu Coral TPU na hostiteľovi"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Ako skript funguje",
|
||||
"body": "Najprv zistí hardvér a pripraví príslušný plán. Inštalácia vyžaduje potvrdenie."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Postup krok za krokom",
|
||||
"detect": {
|
||||
"title": "Detekcia hardvéru",
|
||||
"body": "Hľadá výrobcu <code>0x1ac1</code> v <code>/sys/bus/pci/devices/*/vendor</code> a USB zisťuje cez <code>lsusb</code>. Existujú <strong>dva</strong> USB identifikátory podľa stavu firmvéru:",
|
||||
"items": [
|
||||
"<code>1a6e:089a</code> — Global Unichip, stav <em>nenaprogramované</em>, pred načítaním firmvéru cez runtime.",
|
||||
"<code>18d1:9302</code> — Google, stav <em>naprogramované</em>, po načítaní firmvéru."
|
||||
],
|
||||
"outro": "Ak nezistí Coral ani existujúcu inštaláciu, zobrazí vysvetlenie a skončí. Existujúce komponenty môžu vyvolať ponuku čistenia alebo odstránenia."
|
||||
},
|
||||
"prompt": {
|
||||
"title": "Potvrdenie inštalácie",
|
||||
"body": "Pred inštaláciou dialóg zobrazí zariadenia a plánované komponenty. Zrušením inštaláciu preskočíte. Voliteľné čistenie starých komponentov má samostatné predchádzajúce potvrdenie.",
|
||||
"imageAlt": "Prehľad zariadení Coral a krokov inštalácie"
|
||||
},
|
||||
"pcie": {
|
||||
"title": "PCIe: moduly gasket a apex cez DKMS",
|
||||
"body": "Spustí sa iba pri zistenom Coral PCIe/M.2. Zostaví moduly pre aktuálne spustené jadro hostiteľa.",
|
||||
"items": [
|
||||
"<strong>Čistenie.</strong> Existujúci balík <code>gasket-dkms</code> sa pred opätovným zostavením odstráni; ak je v chybnom stave, skript vynúti jeho odstránenie a vyčistenie (purge).",
|
||||
"<strong>Závislosti na zostavenie:</strong> <code>git</code>, <code>dkms</code>, <code>build-essential</code>, <code>proxmox-headers-$(uname -r)</code>."
|
||||
],
|
||||
"cloneIntro": "<strong>Klonuje zdroje ovládača.</strong> Uprednostní <feranickLink>feranick/gasket-driver</feranickLink>, inak použije <googleLink>google/gasket-driver</googleLink>. Úspešné zostavenie závisí od kompatibility jadra. Na zdroje Google aplikuje tieto opravy podľa verzie:",
|
||||
"kernelPatches": [
|
||||
"Pre jadro 6.5 a novšie nahradí v náhradných zdrojoch <code>no_llseek</code> za <code>noop_llseek</code>.",
|
||||
"Jadro 6.13 a novšie: zmení argument <code>MODULE_IMPORT_NS(DMA_BUF)</code> na reťazcový literál."
|
||||
],
|
||||
"afterItems": [
|
||||
"<strong>Skopíruje zdroje do <code>/usr/src/gasket-1.0/</code>,</strong> vytvorí <code>dkms.conf</code> a zaregistruje ich cez <code>dkms add</code>.",
|
||||
"<strong>Zostaví a nainštaluje:</strong> <code>dkms build</code>, potom <code>dkms install</code>. Pri zlyhaní zobrazí posledných 50 riadkov <code>make.log</code>, ak je dostupný.",
|
||||
"<strong>Vytvorí skupinu <code>apex</code> a pravidlá udev</strong> (<code>/etc/udev/rules.d/99-coral-apex.rules</code>) na priradenie skupiny zariadeniam <code>/dev/apex_*</code>.",
|
||||
"<strong>Pokúsi sa načítať moduly:</strong> <code>modprobe gasket</code> a <code>modprobe apex</code>."
|
||||
],
|
||||
"imageAlt": "Zostavenie cez DKMS a načítanie modulov gasket/apex"
|
||||
},
|
||||
"usb": {
|
||||
"title": "USB: runtime Edge TPU od Googlu",
|
||||
"body": "Spustí sa len vtedy, ak bol zistený akcelerátor USB. Oveľa jednoduchšie:",
|
||||
"items": [
|
||||
"<strong>Pridá kľúč GPG Googlu</strong> do <code>/etc/apt/keyrings/coral-edgetpu.gpg</code>.",
|
||||
"<strong>Pridá repozitár APT</strong> do <code>/etc/apt/sources.list.d/coral-edgetpu.list</code>; <code>signed-by=</code> obmedzí overenie na jeho zväzok kľúčov. Ide o jednoriadkový formát .list, nie deb822 .sources.",
|
||||
"<strong>Nainštaluje <code>libedgetpu1-std</code></strong>, runtime Edge TPU so štandardným výkonom.",
|
||||
"<strong>Znovu načíta udev</strong> a uplatní pravidlá balíka na zariadenie USB."
|
||||
],
|
||||
"stdTitle": "Prečo libedgetpu1-std a nie libedgetpu1-max?",
|
||||
"stdBody": "Balík <code>max</code> zapne najvyššiu podporovanú frekvenciu a zvýši výkon, spotrebu aj zahrievanie. Pred zmenou overte chladenie a prevádzkové podmienky akcelerátora. Balíky sa navzájom vylučujú; zmenu vykonáte cez <code>apt install libedgetpu1-max</code>."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Voliteľný reštart po inštalácii PCIe",
|
||||
"body": "Po PCIe ponúkne reštart. Už sa pokúsil o <code>modprobe</code>; overte načítané moduly a <code>/dev/apex_0</code> so skupinou <code>apex</code>. Plánovaný reštart preverí automatické načítanie. Pri samotnom USB reštart hostiteľa neponúkne.",
|
||||
"imageAlt": "Súhrn a ponuka reštartu po inštalácii PCIe"
|
||||
}
|
||||
},
|
||||
"legacyCleanup": {
|
||||
"heading": "Čistenie starého gasket-dkms na hostiteľoch iba s USB",
|
||||
"intro": "Ak <strong>nezistí Coral PCIe/M.2</strong>, ale nájde starú inštaláciu <code>gasket-dkms</code>, ponúkne voliteľné čistenie s potvrdením.",
|
||||
"items": [
|
||||
"Ak zistí Coral PCIe/M.2, použije bežné opätovné zostavenie DKMS a toto čistenie neponúkne.",
|
||||
"Odstráni <code>gasket-dkms</code>, staré záznamy DKMS a zdroje gasket a opraví nevybavený stav <code>dpkg</code>/APT.",
|
||||
"Zachová USB balíky <code>libedgetpu1-std</code> a <code>libedgetpu1-max</code>, takže Coral USB si ponechá runtime.",
|
||||
"Skript potvrdzuje, že starý balík je preč a že správa balíkov je pred nahlásením úspechu zdravá."
|
||||
],
|
||||
"warningTitle": "Potvrdiť najprv hardvér",
|
||||
"warningBody": "Ak očakávaný Coral PCIe/M.2 nie je zistený, zrušte čistenie a skontrolujte kartu, slot a firmvér."
|
||||
},
|
||||
"reinstallUninstall": {
|
||||
"heading": "Preinštalovať alebo odinštalovať",
|
||||
"intro": "Pri zistenej inštalácii PCIe s <code>gasket-dkms</code>, USB s <code>libedgetpu1-std</code>/<code>libedgetpu1-max</code> alebo oboch zobrazí ponuku akcií.",
|
||||
"imageAlt": "Ponuka na preinštalovanie, aktualizáciu alebo odinštalovanie Coral",
|
||||
"imageCaption": "Ponuka sa zobrazí, ak existuje komponent: záznam DKMS gasket, balík <code>libedgetpu1-*</code> alebo zariadenia <code>/dev/apex_*</code>.",
|
||||
"reinstallHeading": "Preinštalovať/aktualizovať",
|
||||
"reinstallBody": "Spustí bežnú inštaláciu: opätovné zostavenie po zmene jadra alebo aktualizáciu <code>libedgetpu1-*</code> z Googlu. Najprv vyčistí predchádzajúci stav DKMS, aby chybná inštalácia neblokovala zostavenie.",
|
||||
"uninstallHeading": "Odinštalovať čo sa odstráni",
|
||||
"uninstallIntro": "Vyžaduje potvrdenie. Aplikácie LXC používajúce <code>/dev/apex_*</code> môžu stratiť prístup počas odstránenia alebo po reštarte. Postup:",
|
||||
"uninstallItems": [
|
||||
"Pokúsi sa uvoľniť <code>apex</code> a <code>gasket</code>; aktívne používanie tomu môže zabrániť.",
|
||||
"Odstráni každú položku DKMS registrovanú na <code>gasket/<version></code>, aby sa moduly nevrátili na ďalšiu inštaláciu jadra.",
|
||||
"Úplne odstráni <code>gasket-dkms</code>, <code>libedgetpu1-std</code> a <code>libedgetpu1-max</code> a spustí <code>apt-get autoremove --purge</code>.",
|
||||
"Odstráni <code>/etc/udev/rules.d/99-coral-apex.rules</code> a obnoví predvolenú skupinu v <code>60-gasket-dkms.rules</code>, ak súbor ešte existuje.",
|
||||
"Skontroluje doplnkových členov <code>apex</code>. <strong>Ak je zoznam prázdny</strong>, pokúsi sa skupinu odstrániť; inak <code>apex</code> zachová a vypíše členov. Nejde o úplnú kontrolu používateľov s touto primárnou skupinou.",
|
||||
"Odstráni zoznam repozitárov <code>/etc/apt/sources.list.d/coral-edgetpu.list</code>, starší <code>coral-cloud.list</code> a staré zväzky kľúčov s názvom <code>coral-edgetpu-archive-keyring.gpg</code>. Aktuálny zväzok kľúčov v <code>/etc/apt/keyrings/coral-edgetpu.gpg</code> tento postup neodstráni.",
|
||||
"Ponúkne reštart <strong>iba ak bol nainštalovaný PCIe postup</strong>, aby uvoľnil stále aktívne moduly. Odstránenie samotného USB reštart nevyžaduje."
|
||||
],
|
||||
"lxcWarnTitle": "Nádoby LXC s priechodom apex",
|
||||
"lxcWarnBody": "Odstránenie komponentov hostiteľa môže prerušiť prístup LXC. Naplánujte údržbu, ak od tohto Coral závisia kompatibilné aplikácie ako Frigate."
|
||||
},
|
||||
"updates": {
|
||||
"heading": "Upozornenia na aktualizácie",
|
||||
"intro": "ProxMenux eviduje komponenty Coral a kontroluje PCIe/M.2 a USB samostatne. Ak máte oba typy, každý používa vlastný zdroj verzií:",
|
||||
"headerVariant": "Variant",
|
||||
"headerTracked": "Evidovaná verzia",
|
||||
"headerUpstream": "Zdroj verzií",
|
||||
"pcieVariant": "PCIe / M.2",
|
||||
"pcieTracked": "Najprv značka vydania uložená po úspešnej inštalácii, potom verzia funkčného balíka <code>gasket-dkms</code>, prípadne verzia modulu DKMS. Samotná verzia DKMS neurčuje úroveň opráv forku.",
|
||||
"pcieUpstream": "Najnovšia značka <code>feranick/gasket-driver</code> na GitHube; sedemdňová vyrovnávacia pamäť a porovnanie čísla zostavenia.",
|
||||
"usbVariant": "USB",
|
||||
"usbTracked": "<code>libedgetpu1-std</code> alebo <code>libedgetpu1-max</code> apt verzia",
|
||||
"usbUpstream": "Lokálny kandidát na <code>apt-cache policy</code> (Google Coral apt repo)",
|
||||
"outro": "Pri novšej verzii Monitor odošle <code>coral_driver_update_available</code> cez zapnuté kanály. Upozornenie odkazuje na inštalátor: vyberte <strong>Preinštalovať / aktualizovať</strong>.",
|
||||
"antiTitle": "Bez opakovaných upozornení",
|
||||
"antiBody": "Jedno upozornenie pre každý typ pri zmene dostupnej verzie. Neopakuje sa pri každej dennej kontrole; ďalšie príde až pri novšom vydaní.",
|
||||
"rebootTitle": "Aktualizácie PCIe: naplánujte reštart",
|
||||
"rebootBody": "Znovu zostavený modul PCIe treba načítať; plánovaný reštart preverí aj automatické načítanie. Aktualizácia knižnice USB nevyžaduje reštart hostiteľa, aplikácie so starou knižnicou však môže byť nutné reštartovať."
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Ručný postup",
|
||||
"intro": "Tieto príkazy ukazujú hlavné kroky oboch postupov na preštudovanie alebo ručné vykonanie.",
|
||||
"pcieHeading": "PCIe / M.2 (gasket + apex cez DKMS)",
|
||||
"usbHeading": "USB (runtime libedgetpu)"
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Overenie",
|
||||
"pcieHeading": "PCIe / M.2",
|
||||
"usbHeading": "USB"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Riešenie problémov",
|
||||
"dkmsFailTitle": "Zlyhanie zostavenia DKMS po aktualizácii jadra",
|
||||
"dkmsFailBody": "Jednou z príčin sú chýbajúce hlavičky. Overte <code>proxmox-headers-$(uname -r)</code> cez <code>dpkg -l proxmox-headers-$(uname -r)</code> a podľa potreby ich nainštalujte. V zázname hľadajte nekompatibilitu zdrojov s jadrom. Opakovanie spustí <code>cleanup_broken_gasket_dkms</code>, nezaručí však kompatibilitu s každým jadrom.",
|
||||
"apexMissTitle": "/dev/apex_0 chýba po reštarte",
|
||||
"apexMissBody": "Overte detekciu PCIe a zhodu modulu so spusteným jadrom. Skúste <code>modprobe apex</code> a pozrite <code>dmesg | grep -iE \"apex|gasket\"</code>. Chyby zostavenia, načítania či nastavenia slotu/firmvéru môžu zabrániť vytvoreniu zariadenia.",
|
||||
"lxcMissTitle": "Hostiteľ vidí /dev/apex_0, ale LXC nie",
|
||||
"lxcMissBody": "Viditeľný uzol nepotvrdzuje funkčnosť. Overte prístup na hostiteľovi, pripojenie v LXC, pravidlá cgroup a číselné oprávnenia UID/GID. Pozrite <lxcLink>Pridanie Coral TPU do LXC</lxcLink>.",
|
||||
"usbUnreachTitle": "USB akcelerátor detekovaný, ale Frigate / TFLite nemôže dosiahnuť",
|
||||
"usbUnreachBody": "Skontrolujte pravidlá <code>libedgetpu1-std</code> a oprávnenia cez <code>ls -l /dev/bus/usb/*/*</code>. Mapovaný používateľ/skupina aplikácie potrebuje čítanie a zápis; vlastníctvo root samo osebe nie je chyba. Po zmene pravidiel spustite <code>udevadm control --reload-rules && udevadm trigger</code> a podľa potreby zariadenie znovu pripojte.",
|
||||
"logTitle": "Záznam inštalácie",
|
||||
"logBody": "Každé spustenie zapisuje <code>/tmp/coral_install.log</code>. Pri zlyhaní DKMS pridá posledných 50 riadkov <code>/var/lib/dkms/gasket/1.0/build/make.log</code>, ak existuje. Záznam priložte k žiadosti o pomoc."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Súvisiace",
|
||||
"items": [
|
||||
{
|
||||
"label": "Pridať Coral TPU do LXC",
|
||||
"href": "/docs/hardware/coral-tpu-lxc",
|
||||
"tail": " — sprístupnenie Coral z hostiteľa kontajneru s kompatibilnou aplikáciou."
|
||||
},
|
||||
{
|
||||
"label": "Nainštalovať ovládače NVIDIA (host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — Rovnaký nápad pre NVIDIA GPU."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — panel Coral zobrazuje ovládač, moduly, zariadenia a runtime; aj teplotu, ak ju poskytuje podporovaný snímač."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,175 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Inštalácia NVIDIA na hostiteľa | Dokumentácia ProxMenux",
|
||||
"description": "Inštalujte proprietárne ovládače NVIDIA na Proxmox VE cez ProxMenux: filtrovanie GPU, kontrola zostavenia a DKMS, perzistencia, voliteľný patch NVENC a aktualizácia knižníc LXC."
|
||||
},
|
||||
"header": {
|
||||
"title": "Inštalovať ovládače NVIDIA na hostiteľa",
|
||||
"description": "Inštalácia NVIDIA na hostiteľa Proxmox VE. Filtruje udržiavané vetvy podľa PCI ID GPU, kontroluje zostavenie, používa DKMS, spravuje nouveau a inštaluje perzistenciu. Môže aktualizovať knižnice LXC s prístupom k NVIDIA.",
|
||||
"section": "Hardvér: grafické karty a Coral TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Čo robí",
|
||||
"body": "ProxMenux zistí GPU a ponúkne udržiavané vetvy NVIDIA, ktoré uvádzajú jeho PCI ID. Zablokuje <code>nouveau</code>, stiahne oficiálny inštalátor <code>.run</code>, používa DKMS, nainštaluje <code>nvidia-persistenced</code>, pravidlá udev a NVIDIA Container Toolkit a ponúkne voliteľný patch NVENC. Kontroly zostavenia overujú bežiace jadro; úspešná kompilácia nezaručuje, že bude fungovať každá aplikácia. Existujúcim LXC NVIDIA sa ponúkne aktualizácia knižníc používateľského priestoru so zodpovedajúcou verziou, okrem Arch."
|
||||
},
|
||||
"who": {
|
||||
"heading": "Pre koho je toto?",
|
||||
"body": "Pre GPU akcelerované video alebo výpočty v Plex, Jellyfin, Frigate, Immich či Stable Diffusion <strong>v LXC</strong> najprv nainštalujte NVIDIA na <em>hostiteľa</em> Proxmox. Priame priradenie do <strong>VM</strong> používa samostatný postup VFIO."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Skôr ako začnete",
|
||||
"gpu": "<strong>GPU NVIDIA</strong> nainštalovaný v hostiteľovi. Zistí sa automaticky; táto voľba nespravuje AMD ani Intel.",
|
||||
"gpuCheck": "lspci | grep -i nvidia",
|
||||
"notVm": "GPU <strong>nesmie byť vyhradený pre VM cez VFIO</strong>. Inštalátor tento prípad odmietne, aby nenarušil priradenie.",
|
||||
"internet": "Internetové pripojenie hostiteľa. Stiahne ovládač z <code>download.nvidia.com</code> a môže klonovať <code>nvidia-persistenced</code> a <code>nvidia-patch</code> z GitHubu.",
|
||||
"space": "Vyhraďte miesto v <code>/opt/nvidia</code> pre <code>.run</code> a RAM na kompiláciu. Aktualizácia LXC mimo Arch overuje 1500 MiB voľného miesta a pri nižšej RAM môže žiadať dočasné zvýšenie na 2048 MiB; potom obnoví pôvodný limit. Počítajte s reštartom hostiteľa."
|
||||
},
|
||||
"vmWarn": {
|
||||
"title": "GPU vyhradený pre VM? Tu sa zastavte",
|
||||
"body": "Ak je zariadenie NVIDIA pripojené k <code>vfio-pci</code>, inštalátor skončí aj pri zastavenej VM. Vyhradenie neznamená aktívne používanie. Naplánujte návrat k ovládaču hostiteľa a odstráňte staré priradenia VM/VFIO pred reštartom a inštaláciou."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Spustenie inštalátora",
|
||||
"body": "V ProxMenuxe otvorte <strong>Hardware Graphics → NVIDIA GPU Driver Installer</strong>. Ponuka závisí od prítomnosti aktívneho ovládača.",
|
||||
"imageAlt": "Ponuka hardvéru so zvýrazneným inštalátorom NVIDIA"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Ako skript funguje",
|
||||
"body": "Zistí zariadenia, vyberie verziu a inštaluje. Samostatne potvrdené čistenie VFIO môže predchádzať prehľadu. Príprava repozitárov/hlavičiek a sťahovanie predchádzajú výmene ovládača; všetky zmeny nezačínajú až po jednom záverečnom potvrdení."
|
||||
},
|
||||
"walkthrough": {
|
||||
"detect": {
|
||||
"title": "Detekcia a prehľad GPU",
|
||||
"body1": "Zobrazí grafické radiče NVIDIA, stav ovládača alebo <em>„Ovládač NVIDIA nie je nainštalovaný“</em> a LXC s nastaveným prístupom k NVIDIA s ich verziou ovládača.",
|
||||
"body2": "Overte GPU a verzie hostiteľa/kontajnerov. Pri neočakávanom výbere zrušte v prehľade; predtým samostatne potvrdené čistenie VFIO už bolo vykonané.",
|
||||
"imageAlt": "Prehľad pred inštaláciou: GPU, ovládač a LXC NVIDIA"
|
||||
},
|
||||
"version": {
|
||||
"title": "Vyberte verziu ovládača",
|
||||
"body1": "Filtruje verzie z <code>nvidia.com</code>, ktoré <strong>uvádzajú PCI ID GPU v tabuľke podporovaných čipov</strong>, a heuristicky vyraďuje beta/vývojové verzie. <em><verzia> — Odporúčaná</em> uprednostní najnovšiu verziu nainštalovanej vetvy, potom Production Branch a napokon najvyššie podporované číslo verzie.",
|
||||
"body2": "Ak je ovládač evidovaný s patchom keylase, výber sa obmedzí na tabuľku NVENC. <em>Preinštalovať / aktualizovať</em> naďalej obsahuje potvrdenia a výber patchu; overte konečný výsledok.",
|
||||
"whyTitle": "Ako je validovaná kompatibilita jadra",
|
||||
"whyBody": "Filtruje podľa udržiavaných vetiev a PCI ID, bez pevnej matice jadro/ovládač. Predbežné zostavenie skúša aktuálne jadro. Potvrdená chyba vráti výber verzie; nedostupný test môže len varovať a pokračovať. Konečná inštalácia a overenie funkčnosti sú naďalej potrebné.",
|
||||
"imageAlt": "Výber vetiev podporujúcich GPU s odporúčanou verziou navrchu"
|
||||
},
|
||||
"uninstall": {
|
||||
"title": "Odstránenie starého ovládača pri preinštalovaní",
|
||||
"body": "Po stiahnutí a overení inštalátora odstráni predchádzajúci ovládač. Zastaví služby NVIDIA, odpojí moduly, odstráni záznamy DKMS a balíky <code>nvidia-*</code> / <code>libnvidia-*</code> / <code>cuda-*</code>. Platí aj pri potvrdenej preinštalácii rovnakej verzie."
|
||||
},
|
||||
"prepare": {
|
||||
"title": "Pripravte systém",
|
||||
"body": "Počas prípravy skript:",
|
||||
"items": [
|
||||
"Overí repozitáre pred odstránením alebo inštaláciou. Bez predplatného a iba s Enterprise žiada súhlas s no-subscription; odmietnutie zastaví inštaláciu.",
|
||||
"Inštaluje <code>pve-headers-$(uname -r)</code> (alebo <code>proxmox-headers-$(uname -r)</code>), <code>build-essential</code> a <code>dkms</code>.",
|
||||
"Vytvorí súbor spravovaný ProxMenuxom <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code> s <code>blacklist nouveau</code> a <code>options nouveau modeset=0</code>. Zaznamená prípadný riadok pridaný do <code>blacklist.conf</code> a skúsi odpojiť nouveau.",
|
||||
"Zapíše <code>nvidia</code> a <code>nvidia_uvm</code> do <code>/etc/modules-load.d/nvidia-vfio.conf</code>, aby sa moduly načítali pri štarte."
|
||||
]
|
||||
},
|
||||
"download": {
|
||||
"title": "Stiahnite a spustite inštalátor NVIDIA",
|
||||
"body": "Stiahne <code>NVIDIA-Linux-x86_64-<version>.run</code> do <code>/opt/nvidia</code> a overí veľkosť a spustiteľný typ. Ide o kontrolu formátu, nie kryptografického podpisu. Zaregistruje DKMS na zostavenie pri zmene jadra; zdrojový kód a jadro musia zostať kompatibilné.",
|
||||
"imageAlt": "Priebeh sťahovania a zostavenia DKMS inštalátora NVIDIA"
|
||||
},
|
||||
"persist": {
|
||||
"title": "Pretrvávajúce služby a udev pravidlá",
|
||||
"body": "Nainštaluje <persistLink>nvidia-persistenced</persistLink> a zapíše <code>/etc/udev/rules.d/70-nvidia.rules</code> na vytvorenie <code>/dev/nvidia*</code> pri štarte. Pomáha predísť prístupu LXC ku GPU skôr, než existujú zariadenia."
|
||||
},
|
||||
"nvenc": {
|
||||
"title": "Voliteľné: použiť patch NVENC",
|
||||
"body": "Limity relácií NVENC závisia od GPU a ovládača. <patchLink>keylase/nvidia-patch</patchLink> môže odstrániť limit ovládača pre podporované verzie. Vyberte <strong>Áno</strong>, ak túto zmenu kódovania potrebujete a verzia je podporovaná. Nezrýchľuje dekódovanie ani neodstraňuje kapacitu hardvéru.",
|
||||
"supportTitle": "Overenie podpory patchu",
|
||||
"supportBody": "Overte presnú verziu v <patchTableLink>tabuľke patchov</patchTableLink>. Ak chýba, použite ovládač bez patchu alebo inú udržiavanú verziu podporujúcu GPU, jadro aj patch; nevyberajte iba podľa blízkosti v zozname."
|
||||
},
|
||||
"propagate": {
|
||||
"title": "Voliteľné: aktualizovať knižnice NVIDIA v LXC",
|
||||
"body1": "Ponúkne aktualizáciu knižníc ovládača v zistených LXC. Tie a modul hostiteľa <strong>musia mať zodpovedajúce verzie</strong>; inak môže <code>nvidia-smi</code> hlásiť „version mismatch“.",
|
||||
"body2": "Debian / Ubuntu a ďalšie glibc kontajnery dostanú rozbalený inštalátor <code>.run</code> s <code>--no-kernel-modules --no-dkms --no-install-compat32-libs</code>; RAM sa môže dočasne zvýšiť na 2 GiB a potom obnoviť. <strong>Arch, Manjaro a EndeavourOS</strong> používajú <code>pacman -Syu nvidia-utils</code> z repozitárov bez pripnutia na verziu hostiteľa: overte výsledok. <strong>Alpine</strong> dostane rozbalený obsah <code>.run</code> cez <code>pct push</code>, inštaluje <code>gcompat</code> a <code>binutils</code> cez <code>apk</code> a vytvorí odkazy SONAME cez <code>readelf</code>. Overte funkčnosť; kompatibilná vrstva nezaručuje všetky knižnice na musl.",
|
||||
"imageAlt": "Dialóg LXC NVIDIA a verzií na potvrdenie aktualizácie"
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Reštartovať",
|
||||
"body": "Po inštalácii ovládača skript obnoví <code>initramfs</code> pre všetky jadrá; jeho posledný krok ponúkne reštart. <strong>Naplánujte tento reštart</strong> na overenie trvalej konfigurácie modulov a nouveau pri novom štarte, aj keď nový ovládač odpovedá už pred reštartom."
|
||||
}
|
||||
},
|
||||
"reinstallUninstall": {
|
||||
"heading": "Preinštalovať alebo odinštalovať",
|
||||
"intro": "Ak je <code>nvidia</code> načítaný a <code>nvidia-smi</code> vráti verziu, zobrazí ponuku akcií. Takto zisťuje aktívny ovládač; súbory môžu byť nainštalované aj bez načítaného modulu.",
|
||||
"imageAlt": "Ponuka NVIDIA s voľbami preinštalovať/aktualizovať ovládač alebo úplne odinštalovať ovládač",
|
||||
"imageCaption": "Akčné menu sa zobrazí iba vtedy, keď je ovládač NVIDIA momentálne aktívny na hostiteľovi.",
|
||||
"reinstallHeading": "Preinštalovať/aktualizovať",
|
||||
"reinstallBody": "Vyberie verziu, pripraví repozitáre/hlavičky, stiahne a overí zostavenie pred výmenou ovládača. Umožní aktualizáciu v udržiavanej vetve alebo výber inej podporovanej. Potom znova ponúkne knižnice LXC a patch NVENC.",
|
||||
"uninstallHeading": "Odinštalovať čo sa odstráni",
|
||||
"uninstallIntro": "Po potvrdení Áno/Nie odstráni nasledujúce komponenty:",
|
||||
"uninstallItems": [
|
||||
"Zastaví a zakáže <code>nvidia-persistenced</code> a <code>nvidia-powerd</code>, skúsi odpojiť <code>nvidia_uvm</code>, <code>nvidia_drm</code>, <code>nvidia_modeset</code> a <code>nvidia</code> a potom spustí <code>nvidia-uninstall --silent</code> pre inštaláciu <code>.run</code>. Ovplyvní záťaže LXC závislé od NVIDIA; aktívni klienti môžu odpojenie blokovať.",
|
||||
"Spustí <code>apt purge</code> pre <code>nvidia-*</code>, <code>libnvidia-*</code>, <code>cuda-*</code> a <code>libcudnn*</code>, odstráni zdrojový strom DKMS a priečinky <code>nvidia-persistenced</code> a <code>nvidia-patch</code> v <code>/opt/nvidia</code>.",
|
||||
"Odstráni konfiguráciu načítavania modulov (<code>/etc/modules-load.d/nvidia-vfio.conf</code>) a položky blokovania ovládača nouveau spravované ProxMenux. Staré dvojriadkové súbory blokovania ProxMenux sa tiež migrujú a odstránia. Upravené alebo nesúvisiace súbory správcu sa zachovajú.",
|
||||
"Odstráni <code>/etc/udev/rules.d/70-nvidia.rules</code> a nastaví stav NVENC na <em>removed</em> v registri spravovaných inštalácií; samostatný stavový súbor neexistuje.",
|
||||
"Obnoví <code>initramfs</code> pre všetky jadrá, podľa konfigurácie zavádzania spustí <code>proxmox-boot-tool refresh</code> a vyzve na reštart."
|
||||
],
|
||||
"lxcWarnTitle": "LXC s prístupom k NVIDIA",
|
||||
"lxcWarnBody": "Odstránenie ovládača hostiteľa preruší aplikácie LXC používajúce NVIDIA, aj keď knižnice zostanú nainštalované. Naplánujte údržbu pre Frigate, Plex, Jellyfin, Ollama a ďalšie GPU aplikácie."
|
||||
},
|
||||
"updates": {
|
||||
"heading": "Upozornenia na aktualizácie",
|
||||
"body": "Ovládač NVIDIA sa sleduje v registri spravovaných inštalácií. Pri štarte a každých 24 hodín Monitor porovná verzie z <code>download.nvidia.com/XFree86/Linux-x86_64/</code> s verziou hlásenou cez <code>nvidia-smi</code>. Upozorní iba na nové vydania údržby nainštalovanej vetvy.",
|
||||
"kindsHeading": "Správa o aktualizácii",
|
||||
"kindsItems": [
|
||||
"<strong>Údržba v rovnakej vetve.</strong> Napríklad nainštalované 580.65.06 → dostupné 580.105.08. Monitor nevyvodzuje kompatibilitu jadra medzi vetvami."
|
||||
],
|
||||
"antiTitle": "Zabránenie opakovaným upozorneniam",
|
||||
"antiBody": "Jedno upozornenie na novú verziu, nie pri každej dennej kontrole. Bez novšej verzie v nainštalovanej vetve neupozorňuje.",
|
||||
"applyTitle": "Uplatňovanie aktualizácie",
|
||||
"applyBody": "Monitor upozorní bez automatickej inštalácie. Otvorte inštalátor, vyberte <strong>Preinštalovať / aktualizovať</strong> a podporovanú verziu, potom dokončite zostavenie a inštaláciu. Naplánujte ponúknutý reštart a overte hostiteľa aj knižnice LXC."
|
||||
},
|
||||
"verify": {
|
||||
"heading": "Overenie inštalácie",
|
||||
"intro": "Po reštarte hostiteľa sa prihláste cez SSH alebo shell Proxmoxu a spustite:",
|
||||
"after": "Overte GPU a očakávanú verziu. Procesy už môžu byť zobrazené, ak GPU používajú služby hostiteľa alebo automaticky spustené kontajnery. Potom overte perzistenciu:",
|
||||
"imageAlt": "Výstup nvidia-smi na hostiteľa zobrazujúci detekované GPU a nainštalovanú verziu ovládača"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Riešenie problémov",
|
||||
"smiFailTitle": "nvidia-smi hlási „NVIDIA-SMI has failed“",
|
||||
"smiFailBody": "Možné príčiny sú <strong>nouveau</strong>, <strong>chýbajúce alebo nesprávne hlavičky jadra</strong>, nekompatibilné zdroje ovládača alebo iné chyby načítania. Pozrite <code>lsmod | grep nouveau</code>, <code>dmesg | grep -i nvidia</code> a protokoly inštalátora/DKMS. Pri oprave nouveau overte <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code> pred <code>update-initramfs -u -k all</code> a reštartom. Nie každá chyba zostavenia súvisí s hlavičkami.",
|
||||
"lxcMissTitle": "LXC kontajner nemôže vidieť GPU po aktualizácii hostiteľa",
|
||||
"lxcMissBody": "Pred preinštalovaním overte zariadenia hostiteľa, oprávnenia LXC a verziu knižníc. Nesúlad môže vyžadovať zodpovedajúci používateľský ovládač podporovaným postupom distribúcie; na glibc používa <code>--no-kernel-modules</code>. Knižnice neopravia chýbajúce pripojenia či oprávnenia.",
|
||||
"logTitle": "Skontrolujte protokol inštalácie",
|
||||
"logBody": "Inštalácia zapisuje do <code>/tmp/nvidia_install.log</code>. Pri chybe overte sťahovanie, zostavenie DKMS a služby. Priložte protokol k hláseniu na GitHube."
|
||||
},
|
||||
"manualSteps": {
|
||||
"heading": "Hľadáte ručné kroky?",
|
||||
"body": "Pozrite <guideLink>Príručky → NVIDIA</guideLink> pre ručné postupy vrátane <code>wget</code> a <code>./NVIDIA-Linux-...run</code>. Vysvetľuje komponenty, nie je však presným prepisom inštalátora. Udržiavaný postup ProxMenuxu poskytuje filtrovanie GPU, kontrolu zostavenia, aktualizácie LXC a overenie VFIO."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Súvisiace",
|
||||
"items": [
|
||||
{
|
||||
"label": "Pridať GPU do VM (passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — priame priradenie NVIDIA do VM cez VFIO."
|
||||
},
|
||||
{
|
||||
"label": "Pridať GPU do LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — zdieľanie NVIDIA s jedným alebo viacerými kontajnermi."
|
||||
},
|
||||
{
|
||||
"label": "Zmeniť režim GPU (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — prepínanie medzi priamym prístupom VM a zdieľaním LXC."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor — karta Hardvér",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — okno GPU, ktoré otvorí inštalátor a zobrazuje sledovanie v reálnom čase."
|
||||
},
|
||||
{
|
||||
"label": "Príkazy priameho priradenia GPU",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — prehľad príkazov lspci / dmesg / IOMMU / nvidia-smi."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,172 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Zmeniť režim GPU (VM ↔ LXC) | Dokumentácia ProxMenux",
|
||||
"description": "Prepnite GPU medzi VFIO pre VM a natívnym ovládačom pre LXC. ProxMenux zistí ovládač, ponúkne riešenie konfliktov hostí, odstráni súvisiace zvukové priradenia a pri zmene konfigurácie hostiteľa obnoví initramfs."
|
||||
},
|
||||
"header": {
|
||||
"title": "Zmeniť režim GPU (VM ↔ LXC)",
|
||||
"description": "Prepnite priradený GPU medzi priamym prístupom VM a zdieľaním LXC. ProxMenux spravuje ovládač, VFIO, moduly a initramfs a pýta sa na dotknutých hostí. Skontrolujte voľby a po reštarte overte výslednú konfiguráciu.",
|
||||
"section": "Hardvér: grafické karty a Coral TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Čo robí",
|
||||
"body": "S <code>vfio-pci</code> je GPU vyhradený pre VM. S natívnym ovládačom <em>(i915 / amdgpu / nvidia)</em> ho môžu zdieľať hostiteľ a LXC. <strong>Zmeniť režim GPU</strong> spravuje <code>vfio.conf</code>, blokovanie modulov a odkazy hostí a upozorní na zostávajúce priradenia."
|
||||
},
|
||||
"graphics": {
|
||||
"lxcTitle": "Pripravené pre LXC kontajnery",
|
||||
"lxcDesc": "Aktívny natívny ovládač",
|
||||
"vmTitle": "Pripravené pre VM passthrough",
|
||||
"vmDesc": "Aktívny VFIO-PCI ovládač"
|
||||
},
|
||||
"when": {
|
||||
"heading": "Kedy to mám použiť?",
|
||||
"intro": "Použite, ak je GPU <strong>už priradený</strong> a chcete zmeniť jeho použitie:",
|
||||
"headerSituation": "Situácia",
|
||||
"headerUse": "Použiť túto stránku?",
|
||||
"rows": [
|
||||
{
|
||||
"situation": "GPU je voľný a nebol priradený: chcem ho použiť vo VM.",
|
||||
"useRich": "Nie — použite <vmLink>Pridať GPU do VM</vmLink>"
|
||||
},
|
||||
{
|
||||
"situation": "GPU je voľný a nebol priradený: chcem ho použiť v LXC.",
|
||||
"useRich": "Nie — použite <lxcLink>Pridať GPU do LXC</lxcLink>"
|
||||
},
|
||||
{
|
||||
"situationRich": "GPU je priradený VM cez <code>vfio-pci</code>, ale chcem ho používať v LXC.",
|
||||
"useRich": "<strong>Áno – táto stránka.</strong>"
|
||||
},
|
||||
{
|
||||
"situation": "GPU je zdieľaný s LXC, chcem ho venovať VM.",
|
||||
"useRich": "<strong>Áno – táto stránka.</strong>"
|
||||
},
|
||||
{
|
||||
"situation": "Chcem odstrániť všetky priradenia tohto GPU.",
|
||||
"use": "Režim LXC vráti GPU ovládaču hostiteľa; postup pri konflikte pre VM môže odstrániť položky hostpci, položky zariadení LXC však treba odstrániť samostatne. GPU zostane pripojený k ovládaču."
|
||||
}
|
||||
]
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Skôr ako začnete",
|
||||
"assigned": "<strong>Už priradený GPU</strong> do VM cez VFIO alebo do LXC. Pri prvom priradení použite Pridať GPU do VM / LXC.",
|
||||
"iommu": "<strong>IOMMU musí byť aktívne na hostiteľovi</strong> pri prechode <em>do</em> režimu VM. Záleží na nastaveniach firmvéru aj na podpore jadra. Ak v bežiacom jadre chýba <code>intel_iommu=on</code> alebo <code>amd_iommu=on</code>, skript ho pridá s <code>iommu=pt</code> do <code>/etc/kernel/cmdline</code> (značka koreňa ZFS) alebo <code>/etc/default/grub</code> a potom spustí <code>proxmox-boot-tool refresh</code> alebo <code>update-grub</code>. Skontrolujte prípadné varovania a podľa výzvy reštartujte.",
|
||||
"iommuCheck": "dmesg | grep -i 'IOMMU enabled' | head -1",
|
||||
"reboot": "<strong>Počítajte s reštartom.</strong> Trvalé zmeny ovládača a zavádzania môžu vyžadovať obnovu initramfs a reštart. Skript na to vyzve na konci.",
|
||||
"knowList": "<strong>Zistite, ktoré VM a LXC používajú GPU.</strong> Skript vyhľadá odkazy a spýta sa na každého hosťa; známy zoznam uľahčí kontrolu."
|
||||
},
|
||||
"blocklist": {
|
||||
"title": "Nie všetky GPU sú bezpečné prejsť na VM",
|
||||
"body": "Skript podľa svojich pravidiel kompatibility blokuje režim VM pre ID zariadení <code>8086:5a84</code> a <code>8086:5a85</code>. Ak vybraná GPU zodpovedá, zastaví prechod do režimu VM a vráti sa na výber GPU, alebo skončí, ak je to jediná GPU. Tento zoznam blokovaných nebráni prechodu <em>do</em> režimu LXC; ďalšie kontroly môžu naďalej platiť."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Spustenie skriptu",
|
||||
"body": "V ProxMenuxe otvorte <strong>Hardvér: GPU a Coral-TPU → Zmeniť režim GPU (VM ↔ LXC)</strong>.",
|
||||
"imageAlt": "Voľba Zmeniť režim GPU (VM ↔ LXC) v ponuke hardvéru"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Ako skript funguje",
|
||||
"body": "Výber GPU a smer sa kontrolujú pred hlavným prepnutím. Samostatné čistenie starých záznamov VFIO môže žiadať potvrdenie skôr; hostia majú vlastné dialógy konfliktov. Čítajte každé potvrdenie: jedno záverečné potvrdenie nepokrýva všetky zmeny."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Postup krok za krokom",
|
||||
"detect": {
|
||||
"title": "Zistenie GPU a aktuálneho ovládača",
|
||||
"body": "Prehľadá radiče VGA, 3D a Display hostiteľa a overí <code>/sys/bus/pci/devices/*/driver</code>. Zobrazí názov, adresu PCI a aktuálny ovládač každého GPU na určenie režimu.",
|
||||
"imageAlt": "Zoznam GPU s aktuálnym ovládačom (vfio-pci / nvidia / amdgpu / i915) a adresou PCI"
|
||||
},
|
||||
"pickGpu": {
|
||||
"title": "Výber GPU na prepnutie",
|
||||
"body": "Jediný GPU sa vyberie automaticky. Pri viacerých možno označiť viac GPU, ale musia byť v <em>rovnakom</em> režime. Pri zmiešaných režimoch treba výber zúžiť.",
|
||||
"tipTitle": "Prepínanie viacerých GPU naraz",
|
||||
"tipBody": "Príklad: prepnúť tri NVIDIA do režimu VM a potom vrátiť iGPU do LXC. Dve spustenia, každé so spoločným cieľom, namiesto samostatného prepínania kariet."
|
||||
},
|
||||
"direction": {
|
||||
"title": "Preskúmanie navrhovaného smerovania",
|
||||
"intro": "Na základe aktuálneho režimu, skript navrhuje opak ako cieľ:",
|
||||
"items": [
|
||||
"<strong>VM → LXC:</strong> odstráni väzbu na <code>vfio-pci</code>, aby GPU mohol používať natívny ovládač (<code>nvidia</code>, <code>amdgpu</code>, <code>i915</code>). Pre NVIDIA odstráni príslušné položky BDF z <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> pre ďalší štart.",
|
||||
"<strong>LXC → VM:</strong> pripraví priradenie k <code>vfio-pci</code>. AMD / Intel blokujú natívny ovládač a používajú <code>options vfio-pci ids=…</code>. Pre NVIDIA sa <code>nvidia</code> globálne blokuje iba vtedy, keď je každá NVIDIA GPU hostiteľa vo VFIO; inak pravidlá podľa BDF nastavia <code>driver_override=vfio-pci</code> zariadeniam dotknutých skupín IOMMU a NVIDIA GPU mimo týchto skupín si ponechajú <code>nvidia</code>. Pred prepnutím skontrolujte každého člena skupiny."
|
||||
],
|
||||
"outro": "Potvrdiť smer alebo zrušiť."
|
||||
},
|
||||
"conflict": {
|
||||
"title": "Postup pre každú dotknutú VM alebo LXC",
|
||||
"body": "Kontroluje <code>/etc/pve/lxc/*.conf</code> podľa rodiny ovládača GPU a <code>/etc/pve/qemu-server/*.conf</code> podľa PCI priradení. Detekcia LXC nie je presnou zhodou BDF každej karty. Skontrolujte zistených hostí a vyberte postup pre každého:",
|
||||
"headerPolicy": "Politika",
|
||||
"headerEffect": "Účinok",
|
||||
"headerWhen": "Kedy vybrať",
|
||||
"keepPolicy": "Ponechať konfiguráciu a vypnúť automatický štart",
|
||||
"keepEffect": "<code>pct set CTID -onboot 0</code> alebo <code>qm set VMID -onboot 0</code>. Položky GPU zostanú zachované.",
|
||||
"keepWhen": "Ak chcete hosťa znova používať po návrate GPU do pôvodného režimu. Opatrná predvolená voľba.",
|
||||
"removePolicy": "Odstrániť GPU z konfigurácie",
|
||||
"removeEffect": "Odstráni zistené položky <code>hostpci</code> / <code>dev</code> a podporované staršie odkazy.",
|
||||
"removeWhen": "Ak má hosť fungovať bez GPU. Najprv overte aplikáciu: náhrada cez CPU závisí od nej a odstránenie zariadenia ju automaticky nenastaví.",
|
||||
"imageAlt": "Dialóg výberu postupu pre dotknuté VM alebo LXC"
|
||||
},
|
||||
"audio": {
|
||||
"title": "Odstránenie súvisiacich zvukových priradení pri opustení VM",
|
||||
"body1": "Mnohé samostatné GPU NVIDIA / AMD poskytujú HDMI zvuk cez funkciu <code>.1</code> rovnakého slotu; priradené môžu byť aj ďalšie zvukové zariadenia. Po odstránení GPU môžu zostať neplatné zvukové položky <code>hostpci</code>. Overte, ktoré priradenia ponechať.",
|
||||
"body2": "Identifikuje zvukové adresy BDF a zobrazí zoznam priradení na odstránenie. Ich ID vendor:device odstráni aj z <code>/etc/modprobe.d/vfio.conf</code>, iba ak ich nepoužíva iná VM."
|
||||
},
|
||||
"apply": {
|
||||
"title": "Použitie zmien hostiteľa a hostí",
|
||||
"body": "Po potvrdení zapíše zmeny hostiteľa: <code>vfio.conf</code>, blokovanie ovládačov, moduly a pre NVIDIA pravidlo BDF <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> so stavom v <code>/etc/proxmenux/vfio-bind.bdfs</code>. Použije aj zvolený postup pre každého hosťa. Pri zmene konfigurácie hostiteľa spustí <code>update-initramfs -u -k all</code> a potom <code>proxmox-boot-tool refresh</code>; inak oba kroky preskočí."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Reštartovať",
|
||||
"body": "Reštartujte hostiteľa na použitie novej trvalej väzby. Reštart možno odložiť, ale pred spustením cieľového hosťa overte aktívny ovládač: dovtedy môže byť aktívny pôvodný.",
|
||||
"imageAlt": "Súhrnný dialóg so zmenami a následnou výzvou na reštart"
|
||||
}
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Ručná kontrola",
|
||||
"intro": "Pred <strong>VM → LXC</strong> overte ovládač a pravidlá BDF. Príklad NVIDIA používa <code>10de:2204</code>; prispôsobte ho karte. Príkazy čítajú stav; skript spravuje aj hostí a členov skupiny IOMMU.",
|
||||
"lxcToVm": "Pred <strong>LXC → VM</strong> overte adresu PCI a skupinu IOMMU. Nahraďte vzorovú adresu a pred priradením skontrolujte všetkých členov skupiny.",
|
||||
"oneVmTitle": "Fyzický GPU priradený cez VFIO môže naraz používať iba jedna VM",
|
||||
"oneVmBody": "Dve VM môžu mať položky <code>hostpci</code> pre rovnakú adresu PCI, ale GPU môže súčasne používať iba jedna; spustenie druhej zlyhá. Výber postupu pri konflikte pomáha tomu predísť."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Overenie po reštarte"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Riešenie problémov",
|
||||
"stillVfioTitle": "GPU stále ukazuje vfio-pci po prepnutí do režimu LXC",
|
||||
"stillVfioBody": "Načítaný modul VFIO neurčuje, ktorý ovládač používa tento GPU. Overte väzbu karty, dokončenie <code>update-initramfs</code> a reštart. <code>lsmod | grep vfio</code> iba vypíše moduly. Pre AMD / Intel pozrite <code>vfio.conf</code>; pre NVIDIA <code>/etc/proxmenux/vfio-bind.bdfs</code> a <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code>. Opravte staré pravidlá pred <code>update-initramfs -u -k all</code> a reštartom.",
|
||||
"vmFailTitle": "VM sa nespustí po prepnutí GPU do LXC",
|
||||
"vmFailBody": "Overte neplatné odkazy <code>hostpci</code>. Voľba <em>Odstrániť GPU z konfigurácie</em> ich môže odstrániť počas plánovaného prepnutia. Pred opakovaním skriptu overte smer, aby ste režim neobrátili omylom. Priradenie môžete odstrániť aj v Proxmoxe pri zastavenej VM.",
|
||||
"smiFailTitle": "nvidia-smi hlási „Driver/library version mismatch“ po návrate do LXC",
|
||||
"smiFailBody": "Porovnajte načítaný modul NVIDIA s nainštalovanými knižnicami aj v LXC. Najprv zjednoťte verzie: reštart načíta nainštalovaný modul, neopraví však nekompatibilné balíky. Obnovenie cez <code>modprobe -r nvidia</code> a <code>modprobe nvidia</code> vyžaduje zastavených GPU klientov a môže zlyhať pri používaných závislých moduloch.",
|
||||
"logTitle": "Protokol vykonávania",
|
||||
"logBody": "Každé spustenie zapisuje do <code>/tmp/proxmenux_gpu_switch_mode.log</code> na hostiteľovi. Priložte protokol k žiadosti o pomoc na GitHube."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Súvisiace",
|
||||
"items": [
|
||||
{
|
||||
"label": "Pridať GPU do VM (passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — prvotné nastavenie režimu VM."
|
||||
},
|
||||
{
|
||||
"label": "Pridať GPU do LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — prvotné nastavenie režimu LXC."
|
||||
},
|
||||
{
|
||||
"label": "Nainštalovať ovládače NVIDIA (host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — Vyžadované pre LXC režim na NVIDIA GPU."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor — karta Hardvér",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — časť Grafické karty s aktuálnym režimom a ovládaním prepnutia."
|
||||
},
|
||||
{
|
||||
"label": "Príkazy priameho priradenia GPU",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — stručný prehľad príkazov."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Lägg till Coral TPU i LXC | ProxMenux-dokumentation",
|
||||
"description": "Dela Google Coral TPU via USB eller M.2 / PCIe med en Proxmox-LXC. ProxMenux konfigurerar enheter, behörigheter och monteringar, startar containern och installerar Edge TPU-körmiljön på kompatibla distributioner."
|
||||
},
|
||||
"header": {
|
||||
"title": "Lägg till Coral TPU i LXC",
|
||||
"description": "Dela Coral USB Accelerator eller M.2 / Mini-PCIe med en LXC. ProxMenux hanterar containerkonfiguration och Edge TPU-körmiljö. Alternativet gäller bara TPU; för Quick Sync, VA-API eller NVENC kör du även Lägg till GPU i LXC.",
|
||||
"section": "Hårdvara: GPU:er och Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Vad det gör",
|
||||
"body": "Skriver konfigurationen i <code>/etc/pve/lxc/<ctid>.conf</code> för <strong>USB Accelerator</strong>, <strong>M.2 / PCIe Coral</strong> eller båda. Startar containern och installerar Googles <code>libedgetpu</code>-körmiljö. GPU konfigureras separat via <lxcGpuLink>Lägg till GPU i LXC</lxcGpuLink>."
|
||||
},
|
||||
"whenUse": {
|
||||
"heading": "När det används",
|
||||
"body": "För <frigateLink>Frigate</frigateLink> eller en annan kompatibel Linux-app i LXC. Coral utför ML-inferens som stöds i stället för CPU:n. Prestanda beror på modell och hårdvara; videoavkodning och andra uppgifter använder fortfarande resurser."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Innan du börjar",
|
||||
"drivers": "<strong>Förbered Coral-enheten på värden</strong>. M.2 / PCIe kräver att värddrivrutinen är laddad; USB kräver enhetsåtkomst och rätt behörigheter. Se <hostLink>Installera Coral TPU på värden</hostLink>. Skriptet installerar appens körmiljö i Debian/Ubuntu-containrar; andra distributioner måste tillhandahålla den separat.",
|
||||
"driversCheck": "ls /dev/apex_* 2>/dev/null ; lsusb | grep -E '1a6e:089a|18d1:9302'",
|
||||
"container": "<strong>En befintlig LXC</strong>, helst baserad på <strong>Debian / Ubuntu</strong>: installationen använder <code>apt-get</code>. <strong>Containrar med andra distributioner</strong> kan välja <strong>läge med enbart enhetsåtkomst</strong>, som hoppar över APT-installationen av <code>libedgetpu</code>. Passar om appen redan innehåller körmiljön, som Frigates Docker-avbildning.",
|
||||
"downtime": "<strong>Planera ett kort driftstopp</strong> för containern. Skriptet stoppar den för konfiguration och startar den för installation av körmiljön. Dessa ändringar kräver ingen omstart av värden."
|
||||
},
|
||||
"hostPrep": {
|
||||
"title": "Förbered värden först",
|
||||
"body": "M.2 / PCIe behöver <code>gasket</code>/<code>apex</code> på värden och en fungerande enhetsnod. USB behöver ansluten enhet och behörigheter; appen behöver inte köras på värden. <code>libedgetpu</code> måste finnas där appen körs. Ordning: <strong>förbered värden → LXC-enhetsåtkomst → konfigurera appen</strong>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Kör skriptet",
|
||||
"body": "Öppna <strong>Hårdvara: GPU och Coral-TPU → Lägg till Coral TPU i LXC</strong> i ProxMenux.",
|
||||
"imageAlt": "Alternativet Lägg till Coral TPU i LXC i hårdvarumenyn"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Så fungerar skriptet",
|
||||
"body": "Välj container. Skriptet konfigurerar USB-åtkomst även utan ansluten USB-Coral och lägger till M.2 / PCIe när den hårdvaran upptäcks."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Steg för steg",
|
||||
"pick": {
|
||||
"title": "Välj LXC-container",
|
||||
"body": "Väljaren visar lämpliga containrar från <code>pct list</code>; OCI-containrar döljs och hanteras via Apps i OCI-hanteraren. Välj en körande eller stoppad container. Skriptet stoppar den vid behov, konfigurerar den och startar den för installation av körmiljön."
|
||||
},
|
||||
"gpuHint": {
|
||||
"title": "Valfritt förslag om GPU-åtkomst",
|
||||
"body": "Om en GPU hittas men inte är konfigurerad för den här containern rekommenderar en dialog <lxcGpuLink>Lägg till GPU i LXC</lxcGpuLink> för hårdvaruavkodning av video, som Quick Sync, VA-API eller NVENC. Den frågar om installationen ska fortsätta med enbart Coral: Ja fortsätter TPU-konfigurationen, Nej avslutar så att du kan konfigurera GPU:n först."
|
||||
},
|
||||
"usb": {
|
||||
"title": "Konfigurera USB-åtkomst i LXC",
|
||||
"body": "Skapar en udev-regel på värden för <code>/dev/coral</code> och bind-monterar <strong>hela</strong> <code>/dev/bus/usb</code> i containern. Konfigurationen skrivs även utan ansluten USB-Coral och exponerar fler enheter än bara Coral.",
|
||||
"whyTitle": "Varför montera /dev/bus/usb istället för /dev/coral?",
|
||||
"whyBody": "USB-sökvägen, exempelvis <code>/dev/bus/usb/001/005</code>, ändras vid återanslutning. Äldre versioner monterade länken <code>/dev/coral</code> och kunde behålla en inaktuell sökväg. Hela USB-trädet gör den aktuella enhetsnoden synlig. Appen kan fortfarande behöva öppna enheten igen."
|
||||
},
|
||||
"pcie": {
|
||||
"title": "Konfigurera M.2 / PCIe-åtkomst i LXC",
|
||||
"body1": "Om M.2 / PCIe-Coral hittas och <code>/dev/apex_0</code> finns används Proxmox API <code>dev</code> för cgroup2-behörigheter i privilegierade och oprivilegierade LXC:",
|
||||
"body2": "Om <code>/dev/apex_0</code> saknas efter <hostLink>Installera Coral på värden</hostLink> skriver skriptet en bind-montering med <code>create=file</code> och, endast när apex-majornumret finns listat i <code>/proc/devices</code>, en klassisk cgroup2-regel. Ingen av dem skapar en fungerande enhet:",
|
||||
"rebootTitle": "Starta om värden först om du nyss installerat Coral-drivrutiner",
|
||||
"rebootBody": "Reservmonteringen laddar inte värdens <code>apex</code>-drivrutin. Ladda den eller starta om efter installationen och kontrollera enheten. Kör sedan skriptet igen för den moderna enhetsposten och starta om containern."
|
||||
},
|
||||
"drivers": {
|
||||
"title": "Starta LXC och installera Coral-körmiljön",
|
||||
"body": "Startar containern och väntar upp till 15 sekunder på statusen running, och kör sedan installationen inuti med <code>pct exec</code>. Installeraren:",
|
||||
"items": [
|
||||
"Kör <code>apt-get update</code>.",
|
||||
"Installerar förutsättningarna för Coral-paketförrådet: <code>gnupg</code>, <code>curl</code> och <code>ca-certificates</code>.",
|
||||
"Importerar Googles Coral-GPG-nyckel till <code>/etc/apt/keyrings/coral-edgetpu.gpg</code>, samma sökväg som värdinstallationen, och lägger till APT-förrådet <code>coral-edgetpu-stable</code> med <code>signed-by=</code>.",
|
||||
"Installerar <code>libedgetpu1-std</code> som standard. Om M.2-Coral hittas erbjuds <code>libedgetpu1-std</code> eller <code>libedgetpu1-max</code>. Paketvalet konfigurerar inte i sig appens detekteringsinställningar."
|
||||
],
|
||||
"noIgpuTitle": "Varför installeras inga iGPU-drivrutiner här?",
|
||||
"noIgpuBody": "Tidigare installerades även <code>va-driver-all</code>, <code>intel-opencl-icd</code> och andra Intel-paket för Quick Sync tillsammans med Coral. Det gav förvirrande fel när bara Coral önskades. iGPU konfigureras nu via <lxcGpuLink>Lägg till GPU i LXC</lxcGpuLink>; kör det först om du vill ha hårdvaruavkodning av video.",
|
||||
"debianTitle": "Andra distributioner: enbart enhetsåtkomst",
|
||||
"debianBody": "Använder <code>apt-get</code> på Debian/Ubuntu. För <strong>Alpine, Arch, RHEL eller SUSE</strong>, identifierade via <code>/etc/os-release</code>, erbjuds <em>fortsätt med enbart enhetsåtkomst</em> eller <em>avbryt</em>. Det första konfigurerar <code>/etc/pve/lxc/<ctid>.conf</code> utan att installera <code>libedgetpu</code>. Läget passar när appen redan innehåller körmiljön, som Frigate Docker. Installera annars <code>libedgetpu</code> enligt <coralLink>Googles officiella guide</coralLink>."
|
||||
},
|
||||
"summary": {
|
||||
"title": "Sammanfattning",
|
||||
"body": "Till sist visas Coral USB och M.2 med ✓ eller ⚠ beroende på upptäckt hårdvara. Containern fortsätter köra så att du kan konfigurera Frigate, CodeProject.AI eller din app."
|
||||
}
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Motsvarande manuella steg",
|
||||
"body": "Om du vill se exakt vad som går in i LXC-konfigen eller tillämpa den för hand:",
|
||||
"usbHeading": "USB Coral",
|
||||
"pcieHeading": "M.2 / PCIe Coral",
|
||||
"runtimeHeading": "I containern: Coral-körmiljö"
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verifiering",
|
||||
"body": "Öppna ett skal i containern och kontrollera att Coral syns:"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Felsökning",
|
||||
"apexTitle": "LXC har startat men /dev/apex_0 saknas",
|
||||
"apexBody": "Kontrollera först värdens drivrutin: <code>lsmod | grep apex</code>. Om den saknas, prova <code>modprobe apex</code> eller starta om efter installationen av drivrutinen. När <code>/dev/apex_0</code> finns på värden, kontrollera LXC-enhetsposten (kör skriptet igen om bara reservposterna skrevs) och starta om containern med <code>pct stop <ctid> && pct start <ctid></code>.",
|
||||
"replugTitle": "USB-Coral försvinner efter återanslutning till en annan port",
|
||||
"replugBody": "Kontrollera att LXC monterar <code>/dev/bus/usb</code> i stället för länken <code>/dev/coral</code>. Konfigurationen ska innehålla <code>lxc.mount.entry: /dev/bus/usb dev/bus/usb ...</code> utan direkt beroende av <code>/dev/coral</code>. Kör skriptet igen om konfigurationen är gammal.",
|
||||
"alpineTitle": "Alpine / Arch / RHEL / SUSE: körmiljö inte installerad",
|
||||
"alpineBody": "<em>Läget med enbart enhetsåtkomst</em> konfigurerar enheten utan att installera <code>libedgetpu</code>. Använd ett kompatibelt communitypaket eller bygg från källkod; kontrollera tillgängligheten före kommandon som <code>apk add</code> i Alpine. Frigate kan innehålla körmiljön. Med Docker i LXC måste M.2 även vidarebefordras med <code>--device /dev/apex_0:/dev/apex_0</code>, eller USB monteras i Docker: enbart LXC-monteringen räcker inte.",
|
||||
"frigateTitle": "Frigate visar ”Coral EdgeTPU detected but not available”",
|
||||
"frigateBody": "Kontrollera körmiljö, enhetssynlighet och läs-/skrivåtkomst för appens faktiska process. För USB, kontrollera behörigheter och eventuellt <code>plugdev</code>-medlemskap. För M.2, granska <code>/dev/apex_0</code> med <code>ls -l /dev/apex_0</code>. Ett namn som <code>apex</code> i <code>/etc/group</code> räcker inte: numeriska GID och LXC-mappning måste stämma. Kontrollera även om en annan process använder TPU:n; byt inte först till privilegierat läge.",
|
||||
"logsTitle": "Kontrollera både värd- och containerloggar",
|
||||
"logsBody": "På värden, granska kärnmeddelanden med <code>journalctl -k | grep -i -e apex -e gasket -e usb</code>. I LXC, läs apploggarna; med nästlad Docker använd <code>docker logs <container></code>. Behörigheter, saknad körmiljö, USB-anslutning eller en annan process som använder TPU:n kan orsaka fel."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relaterat",
|
||||
"items": [
|
||||
{
|
||||
"label": "Installera Coral TPU på värden",
|
||||
"href": "/docs/hardware/install-coral-tpu-host",
|
||||
"tail": " — förutsättning för att använda M.2 / PCIe-Coral i en CT."
|
||||
},
|
||||
{
|
||||
"label": "Lägg till GPU i LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — GPU-åtkomst, som ofta kombineras med Coral i Frigate."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Lägg till GPU i VM | ProxMenux-dokumentation",
|
||||
"description": "Tilldela en fysisk GPU till en Proxmox-VM. ProxMenux kontrollerar IOMMU, konfigurerar VFIO och VM-enheter samt upptäcker konflikter med andra VM:er eller LXC."
|
||||
},
|
||||
"header": {
|
||||
"title": "Lägg till GPU till VM (Passthrough)",
|
||||
"description": "Identifierar Intel-, AMD- eller NVIDIA-GPU:er för direkt åtkomst från en VM. Kontrollerar IOMMU och tillhörande enheter, konfigurerar VFIO och VM samt tillämpar kompatibilitetsregler. Kontrollera alla berörda enheter.",
|
||||
"section": "Hårdvara: GPU:er och Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Vad det gör",
|
||||
"body": "Automatiserar värd- och <code>hostpci</code>-stegen i <pveLink>Proxmox-dokumentationen för PCI-passthrough</pveLink>. Kontrollerar tilldelningar i <em>andra</em> gäster och erbjuder konflikthantering. Garanterar inte stöd för varje GPU, återställningsmetod eller gästdrivrutin."
|
||||
},
|
||||
"who": {
|
||||
"heading": "Vem är detta för?",
|
||||
"body": "För direkt GPU-åtkomst från en <strong>virtuell maskin</strong> via VFIO. Så länge GPU:n är bunden till VFIO kan värdens drivrutin inte använda den, även med stoppad VM. För delning med <em>LXC</em>, använd <lxcLink>Lägg till GPU i LXC</lxcLink>."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Innan du börjar",
|
||||
"gpu": "Fysiskt installerad <strong>kompatibel GPU</strong>. Skriptet hittar Intel, AMD och NVIDIA med <code>lspci</code>.",
|
||||
"gpuCheck": "lspci | grep -iE 'VGA|3D|Display'",
|
||||
"iommu": "<strong>IOMMU-stöd</strong> krävs i hårdvara och vid behov firmware (Intel VT-d eller AMD-Vi). Kontrollerar systemet och kan konfigurera Linux; ändrar inte BIOS/UEFI och bevisar inte att inaktiv IOMMU är avstängd där.",
|
||||
"q35": "Guiden kräver <strong>q35</strong> och avvisar <code>i440fx</code>. Maskintyp och BIOS/UEFI är separata inställningar. Byte av chipset på en befintlig VM kräver planering och sker inte automatiskt.",
|
||||
"q35Check": "qm config VMID | grep machine",
|
||||
"moreGpus": "Förbered <strong>en annan GPU eller alternativ åtkomst</strong> via SSH, IPMI eller seriellt. Reserverad primär GPU kan släcka lokal bild. För <em>NVIDIA</em> kan ett kort utanför berörd IOMMU-grupp stanna på värden.",
|
||||
"nvidiaInstalled": "Efter <nvidiaLink>NVIDIA-installation på värden</nvidiaLink> reserveras valda funktioner för <code>vfio-pci</code> i stället för <code>nvidia</code>. Modulen <code>nvidia</code> kan finnas kvar för <strong>andra</strong> kort utanför berörd IOMMU-grupp. Kontrollera med <code>nvidia-smi</code>."
|
||||
},
|
||||
"pickOne": {
|
||||
"title": "Exklusiv VM-tilldelning eller LXC-delning",
|
||||
"body": "En GPU bunden till <code>vfio-pci</code> för VM genomgång kan inte samtidigt användas av värden eller en LXC. Om du har två GPU kan du ägna en till varje väg. Om du bara har en, välj:",
|
||||
"vmItem": "<strong>VM:</strong> direkt och exklusiv åtkomst för den VM:n.",
|
||||
"lxcItem": "<strong>LXC (<lxcLink>Lägg till GPU i LXC</lxcLink>):</strong> delar enheten med värden och andra containrar via den vanliga drivrutinen."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Kör installationen",
|
||||
"body": "Öppna ProxMenux och välj <strong>Hårdvara: GPU:er och Coral-TPU → Lägg till GPU i VM</strong>.",
|
||||
"imageAlt": "Menyval för att lägga till GPU i VM"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Så fungerar skriptet",
|
||||
"body": "Identifiering och val föregår huvudändringarna, som bekräftas i en sammanfattning. Aktivering av IOMMU har en tidigare egen bekräftelse och kan redan ändra startkonfigurationen. Senare ljudrensning kan också kräva ett val."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Steg för steg",
|
||||
"detect": {
|
||||
"title": "Upptäck GPU och kontrollera IOMMU",
|
||||
"body": "Betraktar IOMMU som aktivt endast när den körande kärnan har <code>intel_iommu=on</code> eller <code>amd_iommu=on</code> och IOMMU-grupper finns. Om parametern redan är sparad för nästa start fortsätter den i läget väntande omstart; annars kan ett separat bekräftat steg lägga till den med <code>iommu=pt</code>. Dess heuristik för startfilen använder <code>/etc/kernel/cmdline</code> när en ZFS-rotmarkör som <code>root=ZFS=</code> finns där; annars används <code>/etc/default/grub</code>. Heuristiken bevisar inte vilken starthanterare som faktiskt används. Nykonfigurerad IOMMU börjar gälla efter omstart; kontrollera de faktiska grupperna efteråt.",
|
||||
"tipTitle": "Har du redan gjort efterinstallationen?",
|
||||
"tipBody": "Om <postLink>VFIO IOMMU-stöd</postLink> redan är inställt och aktivt i kerneln godkänns kontrollen. En inställning för nästa start bevisar inte att det är aktivt nu.",
|
||||
"imageAlt": "Lista över upptäckta GPU med leverantör och PCI-adress"
|
||||
},
|
||||
"preflight": {
|
||||
"title": "Välj GPU och kör förkontroller",
|
||||
"intro": "När du väljer GPU kör manuset en serie kontroller som kan varje blockera ytterligare framsteg:",
|
||||
"items": [
|
||||
"<strong>SR-IOV-kontroll.</strong> Avvisar VF:er och PF:er med aktiva VF:er eftersom flödet tilldelar hela enheter, inte konfigurerar SR-IOV. Ställ in SR-IOV separat på kompatibel hårdvara.",
|
||||
"<strong>En enda GPU.</strong> Den lokala konsolen kan förlora bildutmatningen när VFIO reserverar GPU:n. Kontrollera först SSH- eller webbåtkomst från en annan dator.",
|
||||
"<strong>AMD-policy för återställning.</strong> Läser <code>/sys/bus/pci/devices/<pci>/reset_method</code>. APU eller separat kort utan FLR <em>blockeras av guidens policy</em>; okänd undertyp utan FLR kräver bekräftelse. Det bevisar inte att funktionen är omöjlig i alla miljöer.",
|
||||
"<strong>D3cold-läge.</strong> Guiden blockerar AMD-kort som rapporterar <code>D3cold</code> på grund av risk för aktiveringsfel. Kontrollera strömhantering och firmware.",
|
||||
"<strong>Analys av IOMMU-grupp.</strong> Läser <code>/sys/kernel/iommu_groups/</code> och tar med <em>alla medlemmar utom bryggor</em> i VM-planen, möjligen nätverks- eller lagringskontroller. Om gruppen innehåller enheter från en annan PCI-plats listar skriptet dem före sammanfattningen; kontrollera att värden inte behöver någon av dem. Om IOMMU väntar på omstart är de faktiska grupperna inte tillgängliga och planen innehåller först bara den valda GPU-funktionen; kontrollera isoleringen efter omstarten."
|
||||
],
|
||||
"audioIntro": "<strong>Tillhörande ljud.</strong> Två fall beroende på var kontrollern finns:",
|
||||
"audioDgpu": "<strong>Separat GPU:</strong> HDMI-ljud finns ofta på funktion <code>.1</code> i samma PCI-plats och tas med om det hittas. Om värden använde ljudet förlorar den åtkomsten när det reserveras för VM:n.",
|
||||
"audioIgpu": "<strong>Utan ljudfunktion <code>.1</code>:</strong> kan ljudet finnas på en annan enhet som <code>00:1f.3</code>. Listar kontroller och drivrutiner, exempelvis <code>snd_hda_intel</code>. Som standard väljs <strong>ingen</strong>; välj bara de som behövs."
|
||||
},
|
||||
"pickVm": {
|
||||
"title": "Välj mål-VM",
|
||||
"body": "Välj VM i listan. Kräver q35 och återanvänder befintliga GPU-poster där det går. BIOS/UEFI är en separat inställning, inte en maskintyp. Chipset och gästsystemets startläge ändras inte automatiskt.",
|
||||
"imageAlt": "Val av VM efter namn, ID och status"
|
||||
},
|
||||
"switchMode": {
|
||||
"title": "Hantera befintliga tilldelningar",
|
||||
"intro": "Manuset skannar varje VM-konfig och varje LXC-konfig på värden som letar efter GPU du valde. Tre möjliga resultat:",
|
||||
"items": [
|
||||
"<strong>GPU tillgänglig.</strong> Fortsätter utan att ta bort tilldelningar.",
|
||||
"<strong>Tilldelad till en annan VM.</strong> Stoppa först källan. Välj <em>behåll poster och inaktivera automatisk start</em> eller <em>ta bort poster och behåll automatisk start</em>. Med aktiv <code>vfio-pci</code> utan nödvändiga värdändringar kan VM→VM ske utan omstart av värden.",
|
||||
"<strong>GPU som används av LXC.</strong> För vanliga containrar, välj <em>behåll GPU-konfigurationen och inaktivera automatisk start</em> eller <em>ta bort GPU-enhetskonfigurationen och behåll automatisk start</em>. Borttagningen raderar <code>devN</code>-posterna och, för AMD/Intel, även äldre <code>/dev/dri</code>-regler för <code>lxc.mount.entry</code> och <code>lxc.cgroup2.devices.allow</code>. OCI-containrar behåller sin konfiguration och stoppas med automatisk start inaktiverad; ta bort deras GPU via OCI manager Apps. Konfliktidentifieringen sker per GPU-enhetsfamilj och kan omfatta andra kort i samma familj."
|
||||
],
|
||||
"imageAlt": "Dialog erbjudande att ta bort GPU från en LXC innan tilldela den till VM",
|
||||
"smartTitle": "Granska tillhörande ljud när GPU:n tas bort",
|
||||
"smartBody": "Därefter kan en lista med <strong>möjligen oanvända ljudenheter</strong> i käll-VM:n visas. Avmarkera sådant som fortfarande behövs. Exempelvis kan <code>02:00.1</code> behållas medan <code>00:1f.3</code> föreslås tas bort. Valet styr borttagningen; alla ljud-/bildkopplingar är inte garanterade."
|
||||
},
|
||||
"audioPick": {
|
||||
"title": "Välj nödvändiga kontroller om .1-ljud saknas",
|
||||
"body": "Det händer bara för Intel iGPU och liknande uppsättningar av split-audio. En checklista visar varje PCI ljudkontroll på värden (exklusive någon redan i GPU IOMMU grupp), märkt med sin nuvarande drivrutin. Välj de du vill - eller ingen, om VM inte behöver ljud från värd hårdvaran.",
|
||||
"imageAlt": "Checklista dialog med varje värd PCI ljudkontroller (BDF + förare) när GPU har ingen .1 syskon ljud",
|
||||
"warnTitle": "Välj inte ljud som värden behöver",
|
||||
"warnBody": "Ljudtilldelning kan ta bort värdens åtkomst; kontrollern kan inte samtidigt tillhöra en annan aktiv VM. Lämna onödigt ljud omarkerat och kontrollera tilldelningarna. Konsolens pip kommer inte nödvändigtvis från PCI-ljud."
|
||||
},
|
||||
"summary": {
|
||||
"title": "Granska bekräftelse sammanfattning",
|
||||
"body": "Granska den slutliga planen för värd och VM och avbryt om den är fel. Den visar IOMMU-gruppen och antalet enheter i den; medlemmar från en annan PCI-plats listas i föregående steg. Att avbryta stoppar huvudändringarna men återställer inte en tidigare separat bekräftad ändring av IOMMU-startkonfigurationen.",
|
||||
"imageAlt": "Översikt över planerade ändringar på värd och VM"
|
||||
},
|
||||
"hostApply": {
|
||||
"title": "Värdförändringar tillämpas",
|
||||
"intro": "Tillämpningsfasen ändrar värd och VM. Tillhörande ljudrensning kan fortfarande kräva ett val. Möjliga ändringar:",
|
||||
"items": [
|
||||
"<code>/etc/modules</code> - tillägg <code>vfio</code>, <code>vfio_iommu_type1</code>, <code>vfio_pci</code> (plus) <code>vfio_virqfd</code> på Kernels < 6.2).",
|
||||
"<code>/etc/modprobe.d/vfio.conf</code> — AMD/Intel: <code>options vfio-pci ids=<vendor:device,...> disable_vga=1</code>. NVIDIA: <code>softdep nvidia pre: vfio-pci</code> (<code>_drm</code>/<code>_modeset</code>/<code>_uvm</code>); den faktiska bindningen sker per BDF. AMD lägger till inläsningsordningen <code>softdep</code>: <code>vfio-pci</code> → <code>radeon</code>/<code>amdgpu</code>.",
|
||||
"Skriver <code>/etc/modprobe.d/iommu_unsafe_interrupts.conf</code> och <code>kvm.conf</code> med <code>allow_unsafe_interrupts=1</code> och <code>ignore_msrs=1</code>. Detta är skriptets kompatibilitetsval, inga universella Windows/macOS-krav; osäkra avbrott försvagar avbrottsomappningens skydd.",
|
||||
"<code>/etc/modprobe.d/blacklist.conf</code>: NVIDIA — <code>nouveau</code>/<code>lbm-nouveau</code>; AMD — <code>radeon</code> + <code>amdgpu</code>; Intel — <code>i915</code>. Dessa regler per tillverkare kan påverka andra kort med samma drivrutin. Modulen <code>nvidia</code> blockeras <strong>bara</strong> via <code>/etc/modprobe.d/proxmenux-nvidia-vfio-blacklist.conf</code> när <em>alla</em> värdens NVIDIA-kort är registrerade för VFIO.",
|
||||
"<code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> + <code>/etc/proxmenux/vfio-bind.bdfs</code> — <strong>Endast NVIDIA.</strong> Sätter <code>ATTR'{'driver_override'}'=\"vfio-pci\"</code> vid PCI ADD för registrerade BDF:er, inklusive berörda IOMMU-gruppfunktioner. Utanför grupperna kan <code>nvidia</code> behållas. BDF-policy delar inte upp hårdvarans IOMMU-grupp.",
|
||||
"<strong>Endast AMD.</strong> Försöker dumpa ROM från <code>/sys/bus/pci/.../rom</code> eller ACPI VFCT till <code>/usr/share/kvm/vbios_<vendor>_<device>.bin</code>. Vid framgång använder VM:en <code>romfile=</code>. En giltig dump garanterar inte att GPU-initialiseringen lyckas.",
|
||||
"<strong>Endast NVIDIA.</strong> Stoppar och inaktiverar <code>nvidia-persistenced</code>, <code>nvidia-powerd</code>, <code>nvidia-fabricmanager</code> bara när alla NVIDIA-kort reserverats för VFIO. Vid blandad användning behålls tjänsterna och <code>nvidia</code> för vanliga värdkort.",
|
||||
"<code>update-initramfs -u -k all</code> - körs endast om något av ovanstående faktiskt ändrats."
|
||||
]
|
||||
},
|
||||
"vmApply": {
|
||||
"title": "VM konfig appliceras via qm set",
|
||||
"body": "VM-konfig på <code>/etc/pve/qemu-server/<vmid>.conf</code> uppdateras via <code>qm set</code> (aldrig via direkt <code>sed</code>):",
|
||||
"after1": "Lägger till <code>x-vga=1</code> för AMD och NVIDIA, <strong>inte</strong> Intel. Det är skriptets policy, inget bevis för att alla Intel-iGPU:er saknar firmware eller att flaggan alltid orsakar låsningar.",
|
||||
"after2": "Ytterligare <code>hostpciN</code>-linjer läggs till om GPUs IOMMU-grupp innehåller andra enheter du behöver för att passera tillsammans."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Starta om när värdändringen kräver det",
|
||||
"body": "Följ omstartsanvisningen vid ändringar av start eller drivrutiner och kontrollera aktiv GPU-bindning före VM-start. Sparad konfiguration bevisar inte att den är aktiv. VM→VM med rätt VFIO-läge kan slippa värdomstart.",
|
||||
"imageAlt": "Sammanfattning skärmen visar vad som ändrades, följt av en omstart prompt"
|
||||
}
|
||||
},
|
||||
"vendors": {
|
||||
"heading": "Anmärkningar per tillverkare",
|
||||
"nvidiaHeading": "NVIDIA",
|
||||
"nvidiaBody": "Behåller en äldre lösning för <em>Code 43</em>: <code>hidden=1</code>, ID <code>NV43FIX</code> i <code>args</code> och <code>kvm=off</code>. Inget universellt krav för moderna GeForce-drivrutiner: NVIDIA aktiverade Windows-VM-passthrough i R465. Felet kan ha andra orsaker; kontrollera GPU och drivrutin.",
|
||||
"nvidiaMultiHeading": "Multi-GPU NVIDIA stöd",
|
||||
"nvidiaMultiBody": "Blandad NVIDIA-användning <strong>per BDF</strong>. Registrerar <code>vfio-pci</code>-funktioner efter adress, inte bara ID <code>vendor:device</code>. Utanför berörda grupper kan <code>nvidia</code> behållas; kontrollera med <code>nvidia-smi</code>. Isolerar inte två kort i samma grupp.",
|
||||
"amdHeading": "AMD",
|
||||
"amdBody": "Vissa AMD-GPU:er misslyckas med återställning efter VM-stopp. Guiden kontrollerar rapporterade egenskaper, inte alla verkliga cykler. <vendorResetLink>vendor-reset</vendorResetLink> stöder en begränsad lista och kräver kompatibel kernel samt tidig inläsning; installeras inte automatiskt. Även <em>RadeonResetBugFix</em> för Windows är hårdvaruberoende, utan allmän garanti.",
|
||||
"intelHeading": "Intel iGPU",
|
||||
"intelBody": "Full Intel-iGPU-passthrough och SR-IOV är skilda flöden. Guiden reserverar hela enheten för en VM utan <code>x-vga=1</code>. <sriovLink>i915-sriov-dkms</sriovLink> kräver kompatibel hårdvara och kernel; ”UHD 630+” är ingen kompatibilitetsregel. Planera alternativ värdåtkomst."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verifiering"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Felsökning",
|
||||
"code43Title": "Kod 43 i Windows (NVIDIA)",
|
||||
"code43Body": "Code 43 bevisar inte att KVM-döljning misslyckats. Granska <code>qm config VMID | grep -E \"cpu|args\"</code> med rätt VMID samt <code>hidden=1</code> och <code>hv_vendor_id=NV43FIX</code>. Kontrollera även gästdrivrutin, firmware och tilldelning. En ny körning kan avslutas direkt vid befintlig tilldelning.",
|
||||
"amdResetTitle": "AMD GPU fungerar en gång, misslyckas på VM omstart",
|
||||
"amdResetBody": "Ett återställningsfel är en möjlig orsak. Omstart eller av-/påslagning kan hjälpa tillfälligt. Kontrollera stöd och tidig inläsning av <code>vendor-reset</code>; enbart <code>softdep amdgpu pre: vendor-reset</code> garanterar inte inläsning före VFIO. Även <em>RadeonResetBugFix</em> kräver kompatibel GPU.",
|
||||
"stuckBootTitle": "VM fastnade start / GPU inte upptäckt",
|
||||
"stuckBootBody": "Kontrollera den verkliga adressen med <code>lspci -nnk -s PCI_ADDRESS</code>; förvänta <code>Kernel driver in use: vfio-pci</code>. Ersätt PCI_ADDRESS. Om vanlig drivrutin är aktiv, granska bindningspolicyn, inte bara <code>/etc/modprobe.d/blacklist.conf</code>; NVIDIA använder BDF-status. Läs <code>dmesg | grep vfio</code>. Efter rättning, kör <code>update-initramfs -u -k all</code> och följ omstartsplanen.",
|
||||
"darkTitle": "Värd konsol går mörkt efter omstart och jag kan inte SSH",
|
||||
"darkBody": "Svart bild bevisar inte att värden är avstängd. Om även SSH misslyckas, kontrollera nätverk och kontroller i IOMMU-gruppen. Återfå åtkomst via IPMI, seriell konsol eller räddningsmiljö; granska <code>/etc/pve/qemu-server/<vmid>.conf</code> och återställ bara berörda tilldelningar och regler. Radera inte annan konfiguration.",
|
||||
"logTitle": "Kolla installationsloggen",
|
||||
"logBody": "Varje körning skriver <code>/tmp/add_gpu_vm.log</code>. Bifoga loggen när du söker hjälp."
|
||||
},
|
||||
"revert": {
|
||||
"heading": "Återställ ändringar manuellt",
|
||||
"intro": "Stoppa VM:n och ta bara bort berörda PCI-tilldelningar under Hårdvara eller med det uttryckliga indexet nedan. Det lämnar inte tillbaka GPU:n till värdens drivrutin. Använd Byt GPU-läge för det steget och kontrollera berörda gäster före bekräftelse."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relaterat",
|
||||
"items": [
|
||||
{
|
||||
"label": "Installera NVIDIA Drivers (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — förbered drivrutinen för kort som stannar på värden; en VFIO-bunden GPU kan inte använda den samtidigt."
|
||||
},
|
||||
{
|
||||
"label": "Lägg till GPU i LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " - alternativ modell: dela GPU med flera containrar istället för att dedikera den till en VM."
|
||||
},
|
||||
{
|
||||
"label": "Byt GPU-läge (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — växla samma GPU mellan delning och exklusiv tilldelning."
|
||||
},
|
||||
{
|
||||
"label": "GPU Passthrough kommandon",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " - lspci, IOMMU-verifiering, qm set hostpci referens."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,185 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Lägg till GPU i LXC | ProxMenux-dokumentation",
|
||||
"description": "Dela Intel-, AMD- eller NVIDIA-GPU med LXC. ProxMenux konfigurerar enheter, grupper och bibliotek efter distribution; appen måste stödja och vara inställd för acceleration."
|
||||
},
|
||||
"header": {
|
||||
"title": "Lägg till GPU i LXC",
|
||||
"description": "Delar GPU-åtkomst med LXC via värdens enheter. Drivrutinen finns kvar på värden; apparna behöver kompatibla bibliotek och egna inställningar.",
|
||||
"section": "Hårdvara: GPU:er och Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Vad det gör",
|
||||
"body": "Lägger till <code>dev<N></code>-poster i <code>/etc/pve/lxc/<ctid>.conf</code> för tillämpliga <code>/dev/dri/*</code>-, <code>/dev/kfd</code>- eller <code>/dev/nvidia*</code>-noder. Startar containern, installerar userspace-paket för dess distribution och anpassar, för Intel/AMD, grupperna <code>video</code> och <code>render</code>. Appacceleration kräver fortfarande kompatibel hårdvara, bibliotek och appinställningar."
|
||||
},
|
||||
"compare": {
|
||||
"heading": "LXC-delning jämfört med VM-passthrough",
|
||||
"intro": "LXC delar kerneln och kan <em>dela</em> GPU:n mellan värd och containrar. Med <vmLink>fullständig VM-passthrough</vmLink> tillhör enheten bara den VM:n och är inte tillgänglig för värdens drivrutin.",
|
||||
"headerFeature": "Funktion",
|
||||
"headerLxc": "LXC (denna sida)",
|
||||
"headerVm": "VM",
|
||||
"rows": [
|
||||
{
|
||||
"feature": "Värd fortsätter att använda GPU?",
|
||||
"lxc": "Ja",
|
||||
"vm": "Nej – exklusivt för VM"
|
||||
},
|
||||
{
|
||||
"feature": "Flera containrar som delar en GPU?",
|
||||
"lxc": "Ja",
|
||||
"vm": "Nej"
|
||||
},
|
||||
{
|
||||
"feature": "Kräver IOMMU/VFIO på värden?",
|
||||
"lxc": "Nej",
|
||||
"vm": "Ja"
|
||||
},
|
||||
{
|
||||
"feature": "Reboot krävs?",
|
||||
"lxc": "Normalt nej (bara starta om CT)",
|
||||
"vm": "När värdens drivrutin eller IOMMU ändras; inte för varje tilldelning"
|
||||
},
|
||||
{
|
||||
"feature": "Gästoperativsystem",
|
||||
"lxc": "Endast Linux (LXC är Linux-bara)",
|
||||
"vm": "Gästsystem som stöds med en kompatibel GPU-drivrutin"
|
||||
}
|
||||
]
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Innan du börjar",
|
||||
"gpu": "<strong>GPU på värden</strong> från Intel, AMD eller NVIDIA, identifierad med <code>lspci</code>.",
|
||||
"gpuCheck": "lspci | grep -iE 'VGA|3D|Display'",
|
||||
"vfio": "<strong>GPU:n får inte vara bunden till vfio-pci.</strong> Den behöver värdens vanliga drivrutin. Vid VM-tilldelning erbjuder skriptet <switchLink>Byt GPU-läge</switchLink>.",
|
||||
"nvidia": "<strong>För NVIDIA:</strong> installera först värdens drivrutin. Containerns bibliotek måste passa versionen. Använd <nvidiaLink>Installera NVIDIA-drivrutiner på värden</nvidiaLink>.",
|
||||
"nvidiaCheck": "nvidia-smi",
|
||||
"container": "<strong>En befintlig LXC-container.</strong> Skriptet skapar ingen. Båda lägena stöds; en <strong>privilegierad</strong> container krävs inte alltid. Enhetsposter och appens numeriska grupprättigheter måste passa."
|
||||
},
|
||||
"unpriv": {
|
||||
"title": "Stöder privilegierade och oprivilegierade containrar",
|
||||
"body": "Skriptet skriver <code>dev<N></code>-poster till LXC-konfigen och på oprivilegierade behållare anpassar <code>video</code> och <code>render</code> GID mellan värd och behållare så att GPU-enhetsnoderna nås inifrån utan att du behöver handredigera <code>lxc.idmap</code>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Kör installationen",
|
||||
"body": "Öppna ProxMenux och välj <strong>Hårdvara: GPU:er och Coral-TPU → Lägg till GPU i LXC</strong>.",
|
||||
"imageAlt": "Menyval för att lägga till GPU i LXC"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Så fungerar skriptet",
|
||||
"body": "Välj container och GPU-familjer och gå igenom kontrollerna. Därefter stoppas och ändras containern utan ytterligare slutbekräftelse. Valfri VFIO-rensning bekräftas separat och kan ändra värden tidigare."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Steg för steg",
|
||||
"detect": {
|
||||
"title": "Identifiera värdens GPU:er",
|
||||
"body": "Söker GPU-kontroller med <code>lspci</code>. För NVIDIA kontrolleras modulen <code>nvidia</code> och <code>nvidia-smi</code>; den upptäckta versionen styr containerns <code>.run</code>-installation.",
|
||||
"tipTitle": "NVIDIA är inte redo?",
|
||||
"tipBody": "Om modulen saknas eller NVIDIA inte fungerar på värden, använd först <nvidiaLink>Installera NVIDIA-drivrutiner på värden</nvidiaLink> och kontrollera drivrutinen."
|
||||
},
|
||||
"pickCt": {
|
||||
"title": "Välj en LXC-container",
|
||||
"body": "Listar lämpliga LXC-containrar med ID och namn; OCI-containrar undantas och använder OCI manager Apps för enheter. Containern stoppas om den körs, startas för installation av drivrutiner och återgår normalt till sitt ursprungliga läge (igång/stoppad).",
|
||||
"imageAlt": "Val av en befintlig LXC-container"
|
||||
},
|
||||
"selectGpu": {
|
||||
"title": "Välj GPU-familjer",
|
||||
"body": "Listan väljer tillverkarfamiljer, inte en isolerad PCI-enhet. Intel/AMD lägger till avsedda DRI-noder och NVIDIA sina tillgängliga enheter, ibland för flera kort. En enda familj väljs automatiskt. Kontrollera resultatet, särskilt med flera GPU:er.",
|
||||
"imageAlt": "Lista över upptäckta GPU-familjer med namn och PCI-adress"
|
||||
},
|
||||
"preflight": {
|
||||
"title": "Förkontroller",
|
||||
"imageAlt": "Erbjudande om lägesbyte för en GPU bunden till vfio-pci",
|
||||
"intro": "Tre kontroller, som alla kan blockera eller omdirigera dig:",
|
||||
"items": [
|
||||
"<strong>SR-IOV-kontroll.</strong> Guiden blockerar en VF eller PF med aktiva VF:er. Det beror på dess breda enhetsval och är inget allmänt förbud i LXC. Konfigurera dessa enheter separat.",
|
||||
"<strong>Bunden till vfio-pci.</strong> Den vanliga drivrutinen kan inte skapa <code>/dev/dri/*</code> eller <code>/dev/nvidia*</code>. <switchLink>Byt GPU-läge</switchLink> erbjuds; följ anvisningarna om omstart och återkom sedan.",
|
||||
"<strong>Redan konfigurerad.</strong> Om alla enheter finns avslutas skriptet utan att installera om bibliotek. Fortsätter bara med valda familjer som saknas."
|
||||
]
|
||||
},
|
||||
"applyConfig": {
|
||||
"title": "Tillämpa ändringarna i LXC-konfigurationen",
|
||||
"body1": "Stoppar containern om den körs och ändrar <code>/etc/pve/lxc/<ctid>.conf</code>. Numrerade <code>dev<N></code>-poster innehåller värdens GID för <code>video</code> eller <code>render</code>. Befintliga <code>lxc.mount.entry</code>-bindrader för <code>/dev/dri</code> ersätts av <code>dev:</code>-poster; kontrollera slutlig konfiguration och rättigheter.",
|
||||
"body2": "Exempel efter Intel + NVIDIA på samma container:"
|
||||
},
|
||||
"installDrivers": {
|
||||
"title": "Starta containern och installera drivrutiner inuti",
|
||||
"body": "Startar containern och väntar högst cirka 30 sekunder på att <code>pct exec</code> svarar. Läser distributionen från <code>/etc/os-release</code> och installerar lämpliga paket.",
|
||||
"headerDistro": "Distribution",
|
||||
"headerInt": "Intel / AMD",
|
||||
"headerNvidia": "NVIDIA",
|
||||
"rows": [
|
||||
{
|
||||
"distro": "Alpine",
|
||||
"intel": "apk add mesa-va-gallium intel-media-driver libva-utils",
|
||||
"nvidia": "apk add nvidia-utils"
|
||||
},
|
||||
{
|
||||
"distro": "Arch / Manjaro",
|
||||
"intel": "pacman -Sy intel-media-driver mesa libva-utils",
|
||||
"nvidia": "pacman -Sy nvidia-utils"
|
||||
}
|
||||
],
|
||||
"debianDistro": "Debian / Ubuntu / andra",
|
||||
"debianIntel": "apt-get install va-driver-all intel-opencl-icd vainfo",
|
||||
"debianNvidia": "Packar upp <code>.run</code> på värden → <code>pct push</code> → installerar med <code>--no-kernel-modules --no-dkms</code>.",
|
||||
"whyTitle": "Varför NVIDIA-installationen med .run används på Debian",
|
||||
"whyBody": "Paketen kan avvika från värdens version. Biblioteken <strong>måste passa värdens inlästa modul</strong> för NVML och <code>nvidia-smi</code>. Debian/glibc använder cachad <code>.run</code> för värdversionen, packar upp och arkiverar på värden, överför med <code>pct push</code> och installerar med <code>--no-kernel-modules --no-dkms</code>. Alpine och Arch använder förrådspaket; kontrollera versionerna."
|
||||
},
|
||||
"alignGids": {
|
||||
"title": "Anpassa GID:n och återställ tillståndet",
|
||||
"body1": "För Intel/AMD läses värdens GID:n för <code>video</code> och <code>render</code>, med 44/104 endast som reservvärden, och sedan ändras <code>/etc/group</code> i containern så att de matchar; körningar med enbart NVIDIA hoppar över steget. Poster som <code>video:44</code> och <code>render:104</code> är exempel, inte universella ID:n. Kontrollera appens gruppmedlemskap och faktiska enhetsrättigheter.",
|
||||
"body2": "Vid normal avslutning stoppas en från början stoppad container igen; en som kördes fortsätter köra. Vid start- eller installationsfel, kontrollera slutläget och loggen."
|
||||
}
|
||||
},
|
||||
"vendors": {
|
||||
"heading": "Anmärkningar per tillverkare",
|
||||
"intelHeading": "Intel iGPU",
|
||||
"intelBody": "Intels mediaacceleration, inklusive <em>Quick Sync</em>, beror på GPU-generation, kodekar och appinställningar. Skriptet delar de av <code>/dev/dri/card0</code>, <code>card1</code>, <code>renderD128</code> och <code>renderD129</code> som finns; andra nodnummer läggs inte till. Värden måste redan tillhandahålla dem via sin inbyggda drivrutin, exempelvis <code>i915</code>.",
|
||||
"amdHeading": "AMD",
|
||||
"amdBody": "AMD använder DRI för Mesa/VA-API. Om värden har <code>/dev/kfd</code> delas även den. ROCm/OpenCL kräver kompatibel hårdvara och bibliotek; enhetsdelning installerar inte hela ROCm-miljön.",
|
||||
"nvidiaHeading": "NVIDIA",
|
||||
"nvidiaBody": "Delar tillgängliga <code>/dev/nvidia*</code>-enheter. <strong>Matchande drivrutinsversioner</strong> krävs för <code>nvidia-smi</code>. Debian/glibc använder värdversionens <code>.run</code>, Alpine/Arch förrådspaket. Under 2048 MiB inställt RAM erbjuds en tillfällig höjning med återställning; dessutom krävs 1500 MiB ledigt diskutrymme.",
|
||||
"updateTitle": "Efter NVIDIA-uppdatering på värden, kontrollera LXC-biblioteken",
|
||||
"updateBody": "Gamla bibliotek kan ge versionsfel i <code>nvidia-smi</code>. <nvidiaLink>Värdens NVIDIA-installation</nvidiaLink> erbjuder containeruppdateringar. En ny enhetstilldelning kan avslutas direkt om posterna redan finns och garanterar ingen biblioteksuppdatering. Kontrollera versioner och uppdatera lämpliga paket eller användarinstallation."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verifiering",
|
||||
"body": "Kontrollera i containern att GPU:n syns och går att använda."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Felsökning",
|
||||
"mismatchTitle": "nvidia-smi: Failed to initialize NVML: Driver/library version mismatch",
|
||||
"mismatchBody": "Biblioteken passar inte den inlästa modulen. Kontrollera versionerna och uppdatera containerns användarmiljö. Cachad <code>.run</code> används för Debian/glibc, men enhetstilldelningen kan avslutas tidigt om alla poster redan finns.",
|
||||
"denyTitle": "Tillstånd nekas på /dev/dri/renderD128 inuti containern",
|
||||
"denyBody": "Kontrollera enhetsposten och numeriska rättigheter för <code>render</code>, sedan att appens användare tillhör <code>render</code>. Lägg vid behov till användaren i <code>render</code> med <code>usermod -aG render <user></code>; ersätt platshållaren med kontot. Starta om sessionen. Byte av privilegieläge är ingen generell lösning.",
|
||||
"vainfoTitle": "vainfo säger: VA-API version 1.xx; misslyckades med att initialisera",
|
||||
"vainfoBody": "Kontrollera åtkomst och VA-API-drivrutin. Paketnamn varierar per distribution: exempelvis <code>intel-media-driver</code> för nyare Intel-GPU:er som stöds, <code>i965-va-driver</code> för äldre och <code>mesa-va-drivers</code> för AMD. Meddelandet bevisar inte ensamt ett saknat paket.",
|
||||
"logTitle": "Installationslogg",
|
||||
"logBody": "Varje körning skriver <code>/tmp/add_gpu_lxc.log</code> på värden. Bifoga loggen när du söker hjälp."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relaterat",
|
||||
"items": [
|
||||
{
|
||||
"label": "Installera NVIDIA Drivers (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — installera värdens drivrutin före NVIDIA-delning."
|
||||
},
|
||||
{
|
||||
"label": "Lägg till GPU till VM (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — alternativ för att reservera en GPU för en VM."
|
||||
},
|
||||
{
|
||||
"label": "Byt GPU-läge (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — växla GPU:n mellan LXC-delning och VM-tilldelning."
|
||||
},
|
||||
{
|
||||
"label": "GPU Passthrough kommandon",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — snabb referens för relaterade skalkommandon."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,203 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Installera Coral TPU på värden | ProxMenux-dokumentation",
|
||||
"description": "Installerar Coral-komponenter på Proxmox VE efter upptäckt hårdvara: gasket/apex med DKMS för M.2 / Mini-PCIe och libedgetpu1-std för USB. Kör båda flödena om båda typerna hittas."
|
||||
},
|
||||
"header": {
|
||||
"title": "Installera Coral TPU på värden",
|
||||
"description": "Förbered Proxmox-värden för Coral och LXC-delning. Identifierar M.2 / Mini-PCIe, USB eller båda och kör rätt flöde: DKMS-moduler för PCIe och Google Edge TPU-körmiljö för USB.",
|
||||
"section": "Hårdvara: GPU:er och Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Vad det gör",
|
||||
"body": "En <strong>gemensam installation med hårdvaruidentifiering</strong>. PCIe använder <code>gasket</code> och <code>apex</code> med DKMS; framtida byggen kräver kompatibel källkod och headers. USB använder <code>libedgetpu1-std</code>. Båda flödena körs om båda typerna hittas. USB-körmiljön ska finnas där appen körs; för enbart LXC behövs den inte nödvändigtvis även på värden."
|
||||
},
|
||||
"which": {
|
||||
"heading": "Vilken Coral har jag?",
|
||||
"body": "PCIe- och USB-modeller har olika format och krav. Skriptet stöder båda; identifiera din enhet före körning.",
|
||||
"headerForm": "Formfaktor",
|
||||
"headerDetect": "Detektering",
|
||||
"headerInstall": "Installationstyp",
|
||||
"headerReboot": "Starta om?",
|
||||
"pcieForm": "M.2 / Mini-PCIe",
|
||||
"pcieFormSub": "(M.2-kort finns med en eller två Edge TPU:er)",
|
||||
"pcieDetect": "PCI-tillverkar-ID <code>1ac1</code>",
|
||||
"pcieInstall": "Kernel modul (gasket + apex) via DKMS",
|
||||
"pcieReboot": "Ja",
|
||||
"usbForm": "USB-accelerator",
|
||||
"usbFormSub": "(liten plastdongel)",
|
||||
"usbDetect": "USB <code>1a6e:089a</code> (oprogrammerad) / <code>18d1:9302</code> (programmerad)",
|
||||
"usbInstall": "Användarkörmiljö <code>libedgetpu1-std</code> från Googles APT-förråd",
|
||||
"usbReboot": "Nej"
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Innan du börjar",
|
||||
"coral": "<strong>En ansluten Coral</strong> (M.2, Mini-PCIe eller USB) för installation. Utan upptäckt hårdvara kan skriptet städa eller ta bort befintliga komponenter, men installerar ingen ny hårdvaruväg.",
|
||||
"coralCheck": "lspci -d 1ac1: ; lsusb | grep -E '1a6e:089a|18d1:9302'",
|
||||
"internet": "<strong>Internetanslutning</strong> på värden för att klona PCIe-drivrutinen från GitHub eller hämta <code>libedgetpu1-std</code> från Googles APT-förråd för USB.",
|
||||
"headers": "<strong>Kernelheaders tillgängliga via APT</strong>: <code>proxmox-headers-$(uname -r)</code>. Behövs bara för PCIe/M.2; skriptet installerar dem.",
|
||||
"reboot": "<strong>Planera en omstart</strong> för PCIe. Skriptet försöker läsa in de byggda modulerna; en omstart kontrollerar även automatisk inläsning."
|
||||
},
|
||||
"hostPrepTip": {
|
||||
"title": "Detta förbereder bara värden",
|
||||
"body": "Förbereder värden för <em>åtkomst till enheten</em> utan att konfigurera eller testa appen. För att <em>använda</em> Coral i en kompatibel app som Frigate, följ <lxcLink>Lägg till Coral TPU i LXC</lxcLink>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Kör installationen",
|
||||
"body": "Öppna ProxMenux på värden och välj <strong>Hårdvara: GPU:er och Coral-TPU → Installera/uppdatera Coral TPU på värden</strong>.",
|
||||
"imageAlt": "Menyval för att installera eller uppdatera Coral TPU på värden"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Så fungerar skriptet",
|
||||
"body": "Identifierar först hårdvaran och tar fram rätt plan. Installationen kräver bekräftelse."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Steg för steg",
|
||||
"detect": {
|
||||
"title": "Hårdvaruidentifiering",
|
||||
"body": "Söker efter tillverkare <code>0x1ac1</code> i <code>/sys/bus/pci/devices/*/vendor</code> och använder <code>lsusb</code> för USB. Det finns <strong>två</strong> USB-ID:n beroende på firmwareläget:",
|
||||
"items": [
|
||||
"<code>1a6e:089a</code> — Global Unichip, <em>oprogrammerat</em> läge innan körmiljön läser in firmware.",
|
||||
"<code>18d1:9302</code> — Google, <em>programmerat</em> läge efter att firmware lästs in."
|
||||
],
|
||||
"outro": "Om varken Coral eller en befintlig installation hittas visas ett meddelande och skriptet avslutas. Befintliga komponenter kan fortfarande öppna menyn för rensning eller borttagning."
|
||||
},
|
||||
"prompt": {
|
||||
"title": "Bekräfta installationen",
|
||||
"body": "Före installationen visas en dialog med enheter och planerade komponenter. Avbryt för att hoppa över installationen. Valfri rensning av äldre komponenter har en egen tidigare bekräftelse.",
|
||||
"imageAlt": "Översikt över Coral-enheter och installationssteg"
|
||||
},
|
||||
"pcie": {
|
||||
"title": "PCIe: modulerna gasket och apex med DKMS",
|
||||
"body": "Körs bara om en PCIe/M.2-Coral hittas. Bygger moduler för den kernel som värden kör.",
|
||||
"items": [
|
||||
"<strong>Rensning.</strong> Ett befintligt <code>gasket-dkms</code>-paket tas bort före ombygget; om paketet är i ett felaktigt tillstånd tvingar skriptet fram borttagning och rensning (purge).",
|
||||
"<strong>Byggberoenden:</strong> <code>git</code>, <code>dkms</code>, <code>build-essential</code>, <code>proxmox-headers-$(uname -r)</code>."
|
||||
],
|
||||
"cloneIntro": "<strong>Klonar drivrutinens källkod.</strong> Föredrar <feranickLink>feranick/gasket-driver</feranickLink>, annars används <googleLink>google/gasket-driver</googleLink>. Bygget kräver en kompatibel kernel. Google-koden får följande versionsberoende ändringar:",
|
||||
"kernelPatches": [
|
||||
"Från kernel 6.5 ersätter reservpatchen <code>no_llseek</code> med <code>noop_llseek</code>.",
|
||||
"Kernel 6.13 eller senare: ändrar argumentet till <code>MODULE_IMPORT_NS(DMA_BUF)</code> till en strängliteral."
|
||||
],
|
||||
"afterItems": [
|
||||
"<strong>Kopierar källkoden till <code>/usr/src/gasket-1.0/</code>,</strong> skapar <code>dkms.conf</code> och registrerar med <code>dkms add</code>.",
|
||||
"<strong>Bygger och installerar:</strong> <code>dkms build</code> följt av <code>dkms install</code>. Vid fel visas de sista 50 raderna i <code>make.log</code> om filen finns.",
|
||||
"<strong>Skapar gruppen <code>apex</code> och udev-regler</strong> (<code>/etc/udev/rules.d/99-coral-apex.rules</code>) för att tilldela <code>/dev/apex_*</code> rätt grupp.",
|
||||
"<strong>Försöker läsa in modulerna:</strong> <code>modprobe gasket</code> och <code>modprobe apex</code>."
|
||||
],
|
||||
"imageAlt": "DKMS-bygge och inläsning av gasket/apex-moduler"
|
||||
},
|
||||
"usb": {
|
||||
"title": "USB: Googles Edge TPU-körmiljö",
|
||||
"body": "Det går bara om en USB-accelerator upptäcktes. Mycket enklare:",
|
||||
"items": [
|
||||
"<strong>Lägger till Googles GPG-nyckel</strong> i <code>/etc/apt/keyrings/coral-edgetpu.gpg</code>.",
|
||||
"<strong>Lägger till APT-förrådet</strong> i <code>/etc/apt/sources.list.d/coral-edgetpu.list</code>; <code>signed-by=</code> begränsar verifieringen till dess nyckelring. Detta är enradsformatet .list, inte deb822-formatet .sources.",
|
||||
"<strong>Installerar <code>libedgetpu1-std</code></strong>, Edge TPU-körmiljön med standardprestanda.",
|
||||
"<strong>Läser om udev</strong> och tillämpar paketets regler på USB-enheten."
|
||||
],
|
||||
"stdTitle": "Varför libedgetpu1-std och inte libedgetpu1-max?",
|
||||
"stdBody": "Paketet <code>max</code> aktiverar högsta frekvens som stöds och ökar prestanda, effektförbrukning och värme. Kontrollera acceleratorns kylning och driftvillkor före bytet. Paketen kan inte vara installerade samtidigt; byt med <code>apt install libedgetpu1-max</code>."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Valfri omstart efter PCIe-installationen",
|
||||
"body": "Efter PCIe erbjuds omstart. Skriptet har försökt med <code>modprobe</code>; kontrollera modulerna och <code>/dev/apex_0</code> med gruppen <code>apex</code>. En planerad omstart testar automatisk inläsning. För enbart USB föreslås ingen omstart av värden.",
|
||||
"imageAlt": "Sammanfattning och erbjudande om omstart efter PCIe-installation"
|
||||
}
|
||||
},
|
||||
"legacyCleanup": {
|
||||
"heading": "Rensa äldre gasket-dkms på värdar som bara använder USB",
|
||||
"intro": "Om <strong>ingen PCIe/M.2-Coral hittas</strong> men en äldre installation av <code>gasket-dkms</code> finns erbjuds valfri rensning med bekräftelse.",
|
||||
"items": [
|
||||
"Om en PCIe/M.2-Coral hittas används det vanliga DKMS-bygget och denna rensning erbjuds inte.",
|
||||
"Rensar bort <code>gasket-dkms</code>, gamla DKMS-registreringar och gasket-källkod samt reparerar väntande <code>dpkg</code>/APT-tillstånd.",
|
||||
"USB-paketen <code>libedgetpu1-std</code> och <code>libedgetpu1-max</code> behålls så att USB-Coral har kvar sin körmiljö.",
|
||||
"Manuset verifierar att arvspaketet är borta och att pakethanteringen är hälsosam innan rapporteringen av framgång."
|
||||
],
|
||||
"warningTitle": "Bekräfta hårdvaran först",
|
||||
"warningBody": "Om en förväntad PCIe/M.2-Coral saknas, avbryt rensningen och kontrollera kort, kortplats och firmware."
|
||||
},
|
||||
"reinstallUninstall": {
|
||||
"heading": "Reinstallera eller avinstallera",
|
||||
"intro": "Om en PCIe-installation med <code>gasket-dkms</code>, USB med <code>libedgetpu1-std</code>/<code>libedgetpu1-max</code> eller båda hittas visas en åtgärdsmeny.",
|
||||
"imageAlt": "Meny för att installera om, uppdatera eller avinstallera Coral",
|
||||
"imageCaption": "Menyn visas om någon komponent finns: en gasket-registrering i DKMS, paketet <code>libedgetpu1-*</code> eller enheter <code>/dev/apex_*</code>.",
|
||||
"reinstallHeading": "Installera om / uppdatera",
|
||||
"reinstallBody": "Kör den vanliga installationen: bygger om efter kernelbyte eller uppdaterar <code>libedgetpu1-*</code> från Google. Rensar först tidigare DKMS-tillstånd så att en misslyckad installation inte blockerar bygget.",
|
||||
"uninstallHeading": "Avinstallera - vad som tas bort",
|
||||
"uninstallIntro": "Kräver bekräftelse. LXC-appar som använder <code>/dev/apex_*</code> kan förlora åtkomsten under borttagningen eller efter omstart. Stegen är:",
|
||||
"uninstallItems": [
|
||||
"Försöker ta bort <code>apex</code> och <code>gasket</code> ur kerneln; aktiva användare kan förhindra detta.",
|
||||
"Ta bort varje DKMS-registrerad <code>gasket/<version></code>-post så att modulerna inte kommer tillbaka på nästa kärninstallation.",
|
||||
"Rensar bort <code>gasket-dkms</code>, <code>libedgetpu1-std</code> och <code>libedgetpu1-max</code> och kör <code>apt-get autoremove --purge</code>.",
|
||||
"Tar bort <code>/etc/udev/rules.d/99-coral-apex.rules</code> och återställer standardgruppen i <code>60-gasket-dkms.rules</code> om filen finns kvar.",
|
||||
"Kontrollerar kompletterande medlemmar i <code>apex</code>. <strong>Om listan är tom</strong> försöker skriptet ta bort gruppen; annars behålls <code>apex</code> och medlemmarna listas. Användare med gruppen som primär grupp kontrolleras inte fullständigt.",
|
||||
"Tar bort förrådslistan <code>/etc/apt/sources.list.d/coral-edgetpu.list</code>, den äldre <code>coral-cloud.list</code> och gamla nyckelringar med namnet <code>coral-edgetpu-archive-keyring.gpg</code>. Den aktuella nyckelringen i <code>/etc/apt/keyrings/coral-edgetpu.gpg</code> tas inte bort av den här sekvensen.",
|
||||
"Erbjuder omstart <strong>bara om PCIe var installerat</strong> för att ta bort kvarvarande moduler ur kerneln. Avinstallation av enbart USB kräver ingen omstart."
|
||||
],
|
||||
"lxcWarnTitle": "LXC containrar med apex genomgång",
|
||||
"lxcWarnBody": "Borttagning av värdens komponenter kan bryta LXC-åtkomsten. Planera underhåll om kompatibla appar som Frigate är beroende av denna Coral."
|
||||
},
|
||||
"updates": {
|
||||
"heading": "Uppdateringsaviseringar",
|
||||
"intro": "ProxMenux registrerar Coral-komponenter och kontrollerar PCIe/M.2 och USB separat. Om båda finns använder varje variant sin egen versionskälla:",
|
||||
"headerVariant": "Variant",
|
||||
"headerTracked": "Registrerad version",
|
||||
"headerUpstream": "Versionskälla",
|
||||
"pcieVariant": "PCIe / M.2",
|
||||
"pcieTracked": "Först den registrerade versionstaggen från en lyckad installation, sedan versionen av ett fungerande <code>gasket-dkms</code>-paket, annars DKMS-modulens version. Den senare anger inte forkens patchnivå.",
|
||||
"pcieUpstream": "Senaste GitHub-taggen för <code>feranick/gasket-driver</code>; sju dagars cache och jämförelse av byggnummer.",
|
||||
"usbVariant": "USB",
|
||||
"usbTracked": "<code>libedgetpu1-std</code> eller <code>libedgetpu1-max</code> apt version",
|
||||
"usbUpstream": "Lokal <code>apt-cache policy</code> kandidat (Google Coral apt repo)",
|
||||
"outro": "Om en ny version hittas skickar Monitor <code>coral_driver_update_available</code> via aktiverade kanaler. Aviseringen leder till installationen: välj <strong>Installera om / uppdatera</strong>.",
|
||||
"antiTitle": "Inga upprepade aviseringar",
|
||||
"antiBody": "En avisering per variant när den tillgängliga versionen ändras. Ingen upprepning vid varje daglig kontroll; nästa avisering kommer först vid en senare version.",
|
||||
"rebootTitle": "PCIe-uppdateringar: planera en omstart",
|
||||
"rebootBody": "Den ombyggda PCIe-modulen måste läsas in; en planerad omstart testar även automatisk inläsning. USB-biblioteket kräver ingen omstart av värden, men appar som använder den gamla versionen kan behöva startas om."
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Motsvarande manuella steg",
|
||||
"intro": "Dessa kommandon visar huvudstegen i varje flöde för genomgång eller manuell körning.",
|
||||
"pcieHeading": "PCIe / M.2 (gasket + apex via DKMS)",
|
||||
"usbHeading": "USB (libedgetpu-körmiljö)"
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verifiering",
|
||||
"pcieHeading": "PCIe / M.2",
|
||||
"usbHeading": "USB"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Felsökning",
|
||||
"dkmsFailTitle": "DKMS-bygget misslyckas efter kerneluppdatering",
|
||||
"dkmsFailBody": "Saknade headers är en möjlig orsak. Kontrollera <code>proxmox-headers-$(uname -r)</code> med <code>dpkg -l proxmox-headers-$(uname -r)</code> och installera vid behov. Läs byggloggen efter inkompatibilitet med kerneln. En ny körning anropar <code>cleanup_broken_gasket_dkms</code> men kan inte garantera stöd för varje kernel.",
|
||||
"apexMissTitle": "/dev/apex_0 saknas efter omstart",
|
||||
"apexMissBody": "Kontrollera PCIe-identifieringen och att modulen passar aktuell kernel. Prova <code>modprobe apex</code> och läs <code>dmesg | grep -iE \"apex|gasket\"</code>. Fel vid bygge, inläsning eller kortplats-/firmwareinställningar kan hindra att enheten skapas.",
|
||||
"lxcMissTitle": "Värden ser /dev/apex_0 men inte LXC",
|
||||
"lxcMissBody": "En synlig enhetsnod bevisar inte att enheten fungerar. Kontrollera åtkomst på värden, LXC-montering, cgroup-regler och numeriska UID/GID-rättigheter. Se <lxcLink>Lägg till Coral TPU i LXC</lxcLink>.",
|
||||
"usbUnreachTitle": "USB Accelerator upptäckt men Frigate / TFLite kan inte nå den",
|
||||
"usbUnreachBody": "Kontrollera reglerna från <code>libedgetpu1-std</code> och rättigheterna med <code>ls -l /dev/bus/usb/*/*</code>. Appens mappade användare/grupp behöver läs- och skrivåtkomst; root som ägare är inte ett fel i sig. Efter regeländringar, kör <code>udevadm control --reload-rules && udevadm trigger</code> och återanslut vid behov.",
|
||||
"logTitle": "Installationslogg",
|
||||
"logBody": "Varje körning skriver <code>/tmp/coral_install.log</code>. Vid DKMS-fel läggs de sista 50 raderna från <code>/var/lib/dkms/gasket/1.0/build/make.log</code> till om filen finns. Bifoga loggen när du söker hjälp."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relaterat",
|
||||
"items": [
|
||||
{
|
||||
"label": "Lägg till Coral TPU i LXC",
|
||||
"href": "/docs/hardware/coral-tpu-lxc",
|
||||
"tail": " — ge en container med en kompatibel app åtkomst till värdens Coral."
|
||||
},
|
||||
{
|
||||
"label": "Installera NVIDIA Drivers (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " - samma idé för NVIDIA GPU."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor Hardware Tab",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — Coral-panelen visar drivrutin, moduler, enheter och körmiljöstatus samt temperatur om en sensor som stöds tillhandahåller den."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,175 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Installera NVIDIA på värden | ProxMenux-dokumentation",
|
||||
"description": "Installera proprietära NVIDIA-drivrutiner på Proxmox VE med ProxMenux: GPU-filtrering, bygg- och DKMS-kontroller, persistens, valfri NVENC-patch och uppdatering av LXC-bibliotek."
|
||||
},
|
||||
"header": {
|
||||
"title": "Installera NVIDIA-drivrutiner på värden",
|
||||
"description": "Installera NVIDIA på Proxmox VE-värden. Filtrerar underhållna grenar efter GPU:ns PCI-ID, kontrollerar bygget, använder DKMS, hanterar nouveau och installerar persistens. Kan även uppdatera bibliotek i LXC med NVIDIA-åtkomst.",
|
||||
"section": "Hårdvara: GPU:er och Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Vad det gör",
|
||||
"body": "ProxMenux identifierar GPU:n och erbjuder underhållna NVIDIA-grenar som listar dess PCI-ID. Det blockerar <code>nouveau</code>, hämtar den officiella <code>.run</code>-installationen, använder DKMS, installerar <code>nvidia-persistenced</code>, udev-regler och NVIDIA Container Toolkit och erbjuder en valfri NVENC-patch. Byggkontroller bedömer den körande kärnan; en lyckad kompilering garanterar inte att alla appar fungerar. Befintliga NVIDIA-LXC erbjuds en uppdatering av användarbiblioteken, med matchande version utom på Arch."
|
||||
},
|
||||
"who": {
|
||||
"heading": "Vem är detta för?",
|
||||
"body": "För GPU-accelererad video eller beräkning i Plex, Jellyfin, Frigate, Immich eller Stable Diffusion <strong>i LXC</strong>, installera först NVIDIA på Proxmox-<em>värden</em>. Direkt tilldelning till en <strong>VM</strong> använder det separata VFIO-flödet."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Innan du börjar",
|
||||
"gpu": "<strong>En NVIDIA-GPU</strong> installerad i värden. Identifieras automatiskt; AMD och Intel hanteras inte här.",
|
||||
"gpuCheck": "lspci | grep -i nvidia",
|
||||
"notVm": "GPU:n <strong>får inte vara reserverad för VM via VFIO</strong>. Installationen avbryter i detta fall för att inte störa tilldelningen.",
|
||||
"internet": "Internetåtkomst på värden. Hämtar drivrutinen från <code>download.nvidia.com</code> och kan klona <code>nvidia-persistenced</code> och <code>nvidia-patch</code> från GitHub.",
|
||||
"space": "Planera plats i <code>/opt/nvidia</code> för <code>.run</code> och RAM för kompilering. LXC-uppdateringen utanför Arch kontrollerar 1500 MiB ledigt och kan begära en tillfällig ökning till 2048 MiB RAM om gränsen är lägre, och återställer sedan tidigare gräns. Planera för värdens omstart."
|
||||
},
|
||||
"vmWarn": {
|
||||
"title": "GPU reserverad för VM? Stanna här",
|
||||
"body": "Om en NVIDIA-enhet är bunden till <code>vfio-pci</code> avslutas installationen även när VM är stoppad. Reservation betyder inte aktiv användning. Planera återgången till värddrivrutinen och ta bort gamla VM-/VFIO-tilldelningar före omstart och installation."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Kör installatören",
|
||||
"body": "Öppna <strong>Hardware Graphics → NVIDIA GPU Driver Installer</strong> i ProxMenux. Menyn beror på om en drivrutin redan är aktiv.",
|
||||
"imageAlt": "Hårdvarumeny med NVIDIA-installationen markerad"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Så fungerar skriptet",
|
||||
"body": "Identifierar enheter, väljer version och installerar. Separat bekräftad VFIO-städning kan ske före översikten. Förberedelse av paketförråd/headers och hämtning sker före drivrutinsbytet; alla ändringar börjar inte efter en enda slutbekräftelse."
|
||||
},
|
||||
"walkthrough": {
|
||||
"detect": {
|
||||
"title": "GPU upptäckt och översikt",
|
||||
"body1": "Visar NVIDIA-grafikstyrenheter, drivrutinsstatus eller <em>”Ingen NVIDIA-drivrutin installerad”</em> samt LXC med konfigurerad NVIDIA-åtkomst och deras drivrutinsversion.",
|
||||
"body2": "Granska GPU och värd-/containerversioner. Avbryt i översikten om urvalet är oväntat; tidigare separat bekräftad VFIO-städning har redan utförts.",
|
||||
"imageAlt": "Översikt före installation: GPU, drivrutin och NVIDIA-LXC"
|
||||
},
|
||||
"version": {
|
||||
"title": "Välj drivrutinsversion",
|
||||
"body1": "Filtrerar versioner från <code>nvidia.com</code> som <strong>listar GPU:ns PCI-ID bland stödda kretsar</strong> och sorterar bort beta-/utvecklarversioner heuristiskt. <em><version> — Rekommenderad</em> prioriterar senaste versionen i installerad gren, sedan Production Branch och till sist högsta stödda versionsnummer.",
|
||||
"body2": "Om drivrutinen registrerats med keylase-patch begränsas väljaren till NVENC-patchtabellen. <em>Installera om / uppdatera</em> har fortfarande bekräftelser och patchfrågor; kontrollera slutresultatet.",
|
||||
"whyTitle": "Hur kärnkompatibilitet valideras",
|
||||
"whyBody": "Filtrerar efter underhållna grenar och PCI-ID, utan fast kärn-/drivrutinsmatris. Ett förbygge testar aktuell kärna. Bekräftat byggfel återgår till väljaren; ett otillgängligt förtest kan varna och fortsätta. Slutinstallation och funktionskontroll behövs fortfarande.",
|
||||
"imageAlt": "Väljare för GPU-kompatibla grenar med rekommendation överst"
|
||||
},
|
||||
"uninstall": {
|
||||
"title": "Ta bort tidigare drivrutin vid ominstallation",
|
||||
"body": "Efter hämtning och kontroll av vald installation tas föregående drivrutin bort. Stoppar NVIDIA-tjänster, laddar ur moduler, tar bort DKMS-poster och rensar <code>nvidia-*</code> / <code>libnvidia-*</code> / <code>cuda-*</code>. Gäller även bekräftad ominstallation av samma version."
|
||||
},
|
||||
"prepare": {
|
||||
"title": "Förbered systemet",
|
||||
"body": "Under förberedelsen gör skriptet följande:",
|
||||
"items": [
|
||||
"Kontrollerar paketförråd före borttagning eller installation. Utan prenumeration och med enbart Enterprise frågar det om byte till no-subscription; nej avbryter installationen.",
|
||||
"Installerar <code>pve-headers-$(uname -r)</code> (eller <code>proxmox-headers-$(uname -r)</code>), <code>build-essential</code> och <code>dkms</code>.",
|
||||
"Skapar den ProxMenux-hanterade filen <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code> med <code>blacklist nouveau</code> och <code>options nouveau modeset=0</code>. Registrerar eventuell tillagd rad i <code>blacklist.conf</code> och försöker ladda ur nouveau.",
|
||||
"Skriver <code>/etc/modules-load.d/nvidia-vfio.conf</code> med <code>nvidia</code> och <code>nvidia_uvm</code> så modulerna laddas tidigt på starten."
|
||||
]
|
||||
},
|
||||
"download": {
|
||||
"title": "Hämta och kör NVIDIA-installationen",
|
||||
"body": "Hämtar <code>NVIDIA-Linux-x86_64-<version>.run</code> till <code>/opt/nvidia</code> och kontrollerar storlek och körbar filtyp. Det är formatkontroller, inte kontroll av kryptografisk signatur. Registrerar DKMS för kärnändringar; kompatibel källkod och kärna krävs fortfarande.",
|
||||
"imageAlt": "Hämtningsförlopp och NVIDIA-installationens DKMS-bygge"
|
||||
},
|
||||
"persist": {
|
||||
"title": "Persistens service och udev regler",
|
||||
"body": "Installerar <persistLink>nvidia-persistenced</persistLink> och skriver <code>/etc/udev/rules.d/70-nvidia.rules</code> för att skapa <code>/dev/nvidia*</code> vid start. Det hjälper till att undvika LXC-åtkomst innan enheterna finns."
|
||||
},
|
||||
"nvenc": {
|
||||
"title": "Valfritt: tillämpa NVENC-patchen",
|
||||
"body": "NVENC-sessionsgränser beror på GPU och drivrutin. <patchLink>keylase/nvidia-patch</patchLink> kan ta bort drivrutinsgränsen för stödda versioner. Välj <strong>Ja</strong> om du behöver ändringen för kodning och versionen stöds. Det förbättrar inte avkodning eller hårdvarans kapacitetsgräns.",
|
||||
"supportTitle": "Kontrollera patchstödet",
|
||||
"supportBody": "Kontrollera exakt version i <patchTableLink>patchtabellen</patchTableLink>. Om den saknas, använd opatchad drivrutin eller välj en annan underhållen version som stöder GPU, kärna och patch; närhet i listan räcker inte."
|
||||
},
|
||||
"propagate": {
|
||||
"title": "Valfritt: uppdatera NVIDIA-bibliotek i LXC",
|
||||
"body1": "Erbjuder uppdatering av drivrutinsbibliotek i upptäckta LXC. De och värdens modul <strong>måste ha matchande versioner</strong>; annars kan <code>nvidia-smi</code> visa ”version mismatch”.",
|
||||
"body2": "Debian / Ubuntu och andra glibc-containrar får den uppackade <code>.run</code>-installationen med <code>--no-kernel-modules --no-dkms --no-install-compat32-libs</code>; RAM kan tillfälligt höjas till 2 GiB och återställas efteråt. <strong>Arch, Manjaro och EndeavourOS</strong> använder <code>pacman -Syu nvidia-utils</code> från paketförråden, utan låsning till värdversionen: kontrollera resultatet. <strong>Alpine</strong> får uppackat <code>.run</code>-innehåll via <code>pct push</code>, installerar <code>gcompat</code> och <code>binutils</code> med <code>apk</code> och skapar SONAME-länkar med <code>readelf</code>. Kontrollera funktionen; kompatibilitetslagret garanterar inte alla bibliotek på musl.",
|
||||
"imageAlt": "Dialog med NVIDIA-LXC och versioner för att bekräfta uppdatering"
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Starta om",
|
||||
"body": "Efter installationen av drivrutinen bygger skriptet om <code>initramfs</code> för alla kärnor; dess sista steg erbjuder omstart. <strong>Planera den omstarten</strong> för att kontrollera den beständiga modul- och nouveau-konfigurationen vid en ny start, även om den nya drivrutinen redan svarar före omstarten."
|
||||
}
|
||||
},
|
||||
"reinstallUninstall": {
|
||||
"heading": "Reinstallera eller avinstallera",
|
||||
"intro": "Om <code>nvidia</code> är laddad och <code>nvidia-smi</code> returnerar en version visas en åtgärdsmeny. Det identifierar en aktiv drivrutin; installerade filer kan finnas även utan laddad modul.",
|
||||
"imageAlt": "NVIDIA-åtgärdsmeny med valen Installera om / uppdatera drivrutin och Avinstallera NVIDIA-drivrutinen helt",
|
||||
"imageCaption": "Åtgärdsmenyn visas när en NVIDIA-drivrutin är aktiv på värden.",
|
||||
"reinstallHeading": "Installera om / uppdatera",
|
||||
"reinstallBody": "Väljer version, förbereder paketförråd/headers, hämtar och kontrollerar bygget före drivrutinsbytet. Kan uppdatera inom underhållen gren eller välja annan stödd gren. Frågor om LXC-bibliotek och NVENC-patch visas igen efteråt.",
|
||||
"uninstallHeading": "Avinstallera - vad som tas bort",
|
||||
"uninstallIntro": "Efter Ja/Nej-bekräftelse tas följande komponenter bort:",
|
||||
"uninstallItems": [
|
||||
"Stoppar och inaktiverar <code>nvidia-persistenced</code> och <code>nvidia-powerd</code>, försöker ladda ur <code>nvidia_uvm</code>, <code>nvidia_drm</code>, <code>nvidia_modeset</code> och <code>nvidia</code> och kör sedan <code>nvidia-uninstall --silent</code> för <code>.run</code>-installationen. NVIDIA-beroende LXC-arbetslaster påverkas; aktiva klienter kan hindra urladdningen.",
|
||||
"Kör <code>apt purge</code> på <code>nvidia-*</code>, <code>libnvidia-*</code>, <code>cuda-*</code> och <code>libcudnn*</code>, tar bort DKMS-källträdet och mapparna <code>nvidia-persistenced</code> och <code>nvidia-patch</code> under <code>/opt/nvidia</code>.",
|
||||
"Tar bort modulkonfigurationen <code>/etc/modules-load.d/nvidia-vfio.conf</code> och ProxMenux egna nouveau-blockeringar. Äldre ProxMenux-filer med de två kända raderna migreras och tas bort; ändrade eller orelaterade administratörsfiler bevaras.",
|
||||
"Tar bort <code>/etc/udev/rules.d/70-nvidia.rules</code> och sätter NVENC-status till <em>removed</em> i registret för hanterade installationer; ingen separat statusfil finns.",
|
||||
"Bygger om <code>initramfs</code> för alla kärnor, kör <code>proxmox-boot-tool refresh</code> enligt startkonfigurationen och frågar om omstart."
|
||||
],
|
||||
"lxcWarnTitle": "LXC med NVIDIA-åtkomst",
|
||||
"lxcWarnBody": "Borttagning av värddrivrutinen avbryter NVIDIA-beroende LXC-appar även om biblioteken finns kvar. Planera underhåll för Frigate, Plex, Jellyfin, Ollama och andra GPU-appar."
|
||||
},
|
||||
"updates": {
|
||||
"heading": "Aviseringar om uppdateringar",
|
||||
"body": "NVIDIA-drivrutinen följs i registret för hanterade installationer. Vid start och var 24:e timme jämför Monitor versionerna på <code>download.nvidia.com/XFree86/Linux-x86_64/</code> med den som <code>nvidia-smi</code> rapporterar. Aviserar bara nya underhållsversioner i installerad gren.",
|
||||
"kindsHeading": "Uppdateringsmeddelande",
|
||||
"kindsItems": [
|
||||
"<strong>Underhåll i samma gren.</strong> Exempel: installerad 580.65.06 → tillgänglig 580.105.08. Monitor drar inga slutsatser om kärnkompatibilitet mellan grenar."
|
||||
],
|
||||
"antiTitle": "Undvik upprepade aviseringar",
|
||||
"antiBody": "En avisering per ny version, inte vid varje daglig kontroll. Ingen avisering utan nyare version i installerad gren.",
|
||||
"applyTitle": "Applicera uppdateringen",
|
||||
"applyBody": "Monitor meddelar utan automatisk installation. Öppna installationen, välj <strong>Installera om / uppdatera</strong> och en stödd version, och slutför bygge och installation. Planera omstarten som erbjuds och kontrollera därefter värd och LXC-bibliotek."
|
||||
},
|
||||
"verify": {
|
||||
"heading": "Verifiera installationen",
|
||||
"intro": "Efter värdens omstart, logga in via SSH eller Proxmox-skalet och kör:",
|
||||
"after": "Kontrollera GPU och förväntad version. Processer kan redan visas om värdtjänster eller automatiskt startade containrar använder GPU:n. Kontrollera sedan persistensen:",
|
||||
"imageAlt": "Utdata från nvidia-smi på värden med upptäckt GPU och installerad drivrutinsversion"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Felsökning",
|
||||
"smiFailTitle": "nvidia-smi visar ”NVIDIA-SMI has failed”",
|
||||
"smiFailBody": "Möjliga orsaker är <strong>nouveau</strong>, <strong>saknade eller felaktiga kärnheaders</strong>, inkompatibel drivrutinskällkod eller andra laddningsfel. Granska <code>lsmod | grep nouveau</code>, <code>dmesg | grep -i nvidia</code> och installations-/DKMS-loggar. Om nouveau-regeln behöver rättas, kontrollera <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code> före <code>update-initramfs -u -k all</code> och omstart. Alla byggfel beror inte på headers.",
|
||||
"lxcMissTitle": "LXC-container kan inte se GPU efter värduppdatering",
|
||||
"lxcMissBody": "Före ominstallation, kontrollera värdens enheter, LXC-behörigheter och biblioteksversion. Versionskonflikt kan kräva matchande användardrivrutin via distributionens stödda metod; på glibc används <code>--no-kernel-modules</code>. Bibliotek rättar inte saknade monteringar eller behörigheter.",
|
||||
"logTitle": "Kolla installationsloggen",
|
||||
"logBody": "Installationen skriver till <code>/tmp/nvidia_install.log</code>. Vid fel, granska hämtning, DKMS-bygge och tjänster. Bifoga loggen till felrapporten på GitHub."
|
||||
},
|
||||
"manualSteps": {
|
||||
"heading": "Letar du efter manuella steg?",
|
||||
"body": "Se <guideLink>Guider → NVIDIA</guideLink> för manuella grunder med <code>wget</code> och <code>./NVIDIA-Linux-...run</code>. Guiden förklarar komponenterna men återger inte installationen exakt. Det underhållna ProxMenux-flödet ger GPU-filtrering, byggkontroller, LXC-uppdateringar och VFIO-kontroller."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relaterat",
|
||||
"items": [
|
||||
{
|
||||
"label": "Lägg till GPU till VM (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — tilldela NVIDIA direkt till en VM via VFIO."
|
||||
},
|
||||
{
|
||||
"label": "Lägg till GPU i LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — dela NVIDIA med en eller flera containrar."
|
||||
},
|
||||
{
|
||||
"label": "Byt GPU-läge (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — växla mellan VM-genomkoppling och LXC-delning."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor — fliken Hårdvara",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — GPU-dialog som öppnar installationen och visar övervakning i realtid."
|
||||
},
|
||||
{
|
||||
"label": "Kommandon för GPU-genomkoppling",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — lspci / dmesg / IOMMU / nvidia-smi referens."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,172 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Byt GPU-läge (VM ↔ LXC) | ProxMenux-dokumentation",
|
||||
"description": "Byt GPU mellan VFIO för VM och inbyggd drivrutin för LXC. ProxMenux identifierar drivrutinen, frågar hur berörda gäster ska hanteras, tar bort tillhörande ljudtilldelningar och bygger om initramfs om värdkonfigurationen ändras."
|
||||
},
|
||||
"header": {
|
||||
"title": "Byt GPU-läge (VM ↔ LXC)",
|
||||
"description": "Byt en tilldelad GPU mellan VM-genomkoppling och LXC-delning. ProxMenux hanterar drivrutin, VFIO, moduler och initramfs och frågar hur berörda gäster ska hanteras. Granska valen och kontrollera konfigurationen efter omstart.",
|
||||
"section": "Hårdvara: GPU:er och Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Vad det gör",
|
||||
"body": "Med <code>vfio-pci</code> reserveras GPU:n för en VM. Med inbyggd drivrutin <em>(i915 / amdgpu / nvidia)</em> kan värden och LXC dela den. <strong>Byt GPU-läge</strong> hanterar <code>vfio.conf</code>, modulblockering och gästreferenser och varnar om kvarvarande tilldelningar."
|
||||
},
|
||||
"graphics": {
|
||||
"lxcTitle": "Klar för LXC-containrar",
|
||||
"lxcDesc": "Inbyggd drivrutin aktiv",
|
||||
"vmTitle": "Redo för VM-passthrough",
|
||||
"vmDesc": "VFIO-PCI drivrutin aktiv"
|
||||
},
|
||||
"when": {
|
||||
"heading": "När ska jag använda detta?",
|
||||
"intro": "Använd när GPU:n <strong>redan är tilldelad</strong> och du vill ändra användningen:",
|
||||
"headerSituation": "Situation",
|
||||
"headerUse": "Använd denna sida?",
|
||||
"rows": [
|
||||
{
|
||||
"situation": "GPU ledig och aldrig tilldelad: använd den i en VM.",
|
||||
"useRich": "Nej — använd <vmLink>Lägg till GPU i VM</vmLink>"
|
||||
},
|
||||
{
|
||||
"situation": "GPU ledig och aldrig tilldelad: använd den i en LXC.",
|
||||
"useRich": "Nej — använd <lxcLink>Lägg till GPU i LXC</lxcLink>"
|
||||
},
|
||||
{
|
||||
"situationRich": "GPU är i en VM via <code>vfio-pci</code>, jag vill använda den från en LXC istället.",
|
||||
"useRich": "<strong>Ja — den här sidan.</strong>"
|
||||
},
|
||||
{
|
||||
"situation": "GPU delas med en LXC, jag vill ägna den till en VM.",
|
||||
"useRich": "<strong>Ja — den här sidan.</strong>"
|
||||
},
|
||||
{
|
||||
"situation": "Jag vill ta bort alla tilldelningar av denna GPU.",
|
||||
"use": "LXC-läget återför GPU:n till värdens drivrutin; VM-konfliktpolicyn kan ta bort hostpci-poster, men LXC-enhetsposter måste tas bort separat. GPU:n är fortfarande bunden till en drivrutin."
|
||||
}
|
||||
]
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Innan du börjar",
|
||||
"assigned": "<strong>En redan tilldelad GPU</strong> i en VM via VFIO eller i en LXC. För första tilldelningen, använd Lägg till GPU i VM / LXC.",
|
||||
"iommu": "<strong>IOMMU måste vara aktivt på värden</strong> vid byte <em>till</em> VM-läge. Både firmwareinställningar och kärnstöd spelar roll. Om <code>intel_iommu=on</code> eller <code>amd_iommu=on</code> saknas i den körande kärnan lägger skriptet till det med <code>iommu=pt</code> i <code>/etc/kernel/cmdline</code> (ZFS-rotmarkör) eller <code>/etc/default/grub</code> och kör sedan <code>proxmox-boot-tool refresh</code> eller <code>update-grub</code>. Granska eventuella varningar och starta om när du uppmanas.",
|
||||
"iommuCheck": "dmesg | grep -i 'IOMMU enabled' | head -1",
|
||||
"reboot": "<strong>Planera en omstart.</strong> Beständiga drivrutins- och startändringar kan kräva ombyggnad av initramfs och omstart. Skriptet frågar om detta i slutet.",
|
||||
"knowList": "<strong>Ta reda på vilka VM och LXC som använder GPU:n.</strong> Skriptet hittar referenser och frågar hur varje gäst ska hanteras; en känd lista underlättar granskningen."
|
||||
},
|
||||
"blocklist": {
|
||||
"title": "Inte alla GPU är säkra att passera till en VM",
|
||||
"body": "Skriptet blockerar VM-läge för enhets-ID <code>8086:5a84</code> och <code>8086:5a85</code> enligt sin kompatibilitetspolicy. Om en vald GPU matchar avbryts bytet till VM-läge och skriptet återgår till GPU-valet, eller avslutas om det är den enda GPU:n. Blocklistan hindrar inte byte <em>till</em> LXC-läge; andra kontroller kan fortfarande gälla."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Kör skriptet",
|
||||
"body": "Öppna <strong>Hårdvara: GPU och Coral-TPU → Byt GPU-läge (VM ↔ LXC)</strong> i ProxMenux.",
|
||||
"imageAlt": "Alternativet Byt GPU-läge (VM ↔ LXC) i hårdvarumenyn"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Så fungerar skriptet",
|
||||
"body": "GPU-val och riktning granskas före huvudbytet. Separat städning av gamla VFIO-poster kan fråga tidigare, och berörda gäster har egna konfliktdialoger. Läs varje bekräftelse: en enda slutbekräftelse täcker inte alla ändringar."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Steg för steg",
|
||||
"detect": {
|
||||
"title": "Identifiera GPU och aktuell drivrutin",
|
||||
"body": "Granskar värdens VGA-, 3D- och Display-styrenheter och kontrollerar <code>/sys/bus/pci/devices/*/driver</code>. Visar namn, PCI-adress och aktuell drivrutin för varje GPU så att läget kan identifieras.",
|
||||
"imageAlt": "GPU checklista som visar varje upptäckt GPU med sin nuvarande drivrutin (vfio-pci / nvidia / amdgpu / i915) och PCI slot"
|
||||
},
|
||||
"pickGpu": {
|
||||
"title": "Välj GPU:er att växla",
|
||||
"body": "En ensam GPU väljs automatiskt. Med flera kan du markera flera, men alla måste vara i <em>samma</em> läge. Blandade lägen kräver att du begränsar urvalet.",
|
||||
"tipTitle": "Växla flera GPU:er samtidigt",
|
||||
"tipBody": "Exempel: växla tre NVIDIA till VM-läge och sedan iGPU:n tillbaka till LXC. Två körningar med ett gemensamt mål i varje, i stället för att växla korten ett i taget."
|
||||
},
|
||||
"direction": {
|
||||
"title": "Granska den föreslagna riktningen",
|
||||
"intro": "Baserat på det aktuella läget föreslår manuset motsatsen som mål:",
|
||||
"items": [
|
||||
"<strong>VM → LXC:</strong> tar bort bindningen till <code>vfio-pci</code> så att den inbyggda drivrutinen (<code>nvidia</code>, <code>amdgpu</code>, <code>i915</code>) kan använda GPU:n. För NVIDIA tas motsvarande BDF-poster bort från <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> inför nästa start.",
|
||||
"<strong>LXC → VM:</strong> förbereder bindning till <code>vfio-pci</code>. AMD / Intel blockerar den inbyggda drivrutinen och använder <code>options vfio-pci ids=…</code>. För NVIDIA blockeras <code>nvidia</code> globalt endast när varje NVIDIA-GPU på värden är i VFIO; annars sätter regler per BDF <code>driver_override=vfio-pci</code> för enheterna i berörda IOMMU-grupper, och NVIDIA-GPU:er utanför grupperna behåller <code>nvidia</code>. Granska varje gruppmedlem före bytet."
|
||||
],
|
||||
"outro": "Bekräfta riktningen eller avbryt."
|
||||
},
|
||||
"conflict": {
|
||||
"title": "Val för varje berörd VM eller LXC",
|
||||
"body": "Kontrollerar <code>/etc/pve/lxc/*.conf</code> efter GPU-enheter per drivrutinsfamilj och <code>/etc/pve/qemu-server/*.conf</code> efter PCI-tilldelningar. LXC-detekteringen matchar inte varje kort exakt per BDF. Granska gästerna och välj hantering för varje:",
|
||||
"headerPolicy": "Policy",
|
||||
"headerEffect": "Effekt",
|
||||
"headerWhen": "När ska man välja",
|
||||
"keepPolicy": "Behåll konfiguration, inaktivera automatisk start",
|
||||
"keepEffect": "<code>pct set CTID -onboot 0</code> eller <code>qm set VMID -onboot 0</code>. GPU-posterna behålls.",
|
||||
"keepWhen": "Om gästen ska användas igen när GPU:n återgår till ursprungligt läge. Försiktigt standardval.",
|
||||
"removePolicy": "Ta bort GPU från konfig",
|
||||
"removeEffect": "Tar bort identifierade <code>hostpci</code>- / <code>dev</code>-poster och äldre referenser som stöds.",
|
||||
"removeWhen": "Om gästen ska fungera utan GPU. Kontrollera appinställningarna först: CPU-reservdrift beror på appen, och enhetsborttagning konfigurerar inte om den automatiskt.",
|
||||
"imageAlt": "Dialog för att hantera varje berörd VM eller LXC"
|
||||
},
|
||||
"audio": {
|
||||
"title": "Ta bort tillhörande ljudtilldelningar när VM-läget lämnas",
|
||||
"body1": "Många separata NVIDIA-/AMD-GPU:er har HDMI-ljud på funktion <code>.1</code> i samma slot; fler ljudenheter kan också ha tilldelats. När GPU:n tas bort kan gamla ljudposter av typen <code>hostpci</code> bli kvar. Granska vilka tilldelningar som ska behållas.",
|
||||
"body2": "Identifierar ljudets BDF-adresser och visar en lista för att välja tilldelningar att ta bort. Tar även bort deras vendor:device-ID från <code>/etc/modprobe.d/vfio.conf</code>, men bara om ingen annan VM använder dem."
|
||||
},
|
||||
"apply": {
|
||||
"title": "Tillämpa ändringar på värd och gäster",
|
||||
"body": "Efter bekräftelse skrivs värdändringarna: <code>vfio.conf</code>, drivrutinsblockering, moduler och för NVIDIA BDF-regeln <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> med status i <code>/etc/proxmenux/vfio-bind.bdfs</code>. Vald konfliktpolicy tillämpas på varje gäst. Om värdkonfigurationen ändrats körs <code>update-initramfs -u -k all</code> följt av <code>proxmox-boot-tool refresh</code>; annars hoppas båda över."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Starta om",
|
||||
"body": "Starta om värden för att tillämpa den nya beständiga bindningen. Omstarten kan skjutas upp, men kontrollera aktiv drivrutin före start av målgästen: den gamla kan fortfarande vara aktiv fram till omstarten.",
|
||||
"imageAlt": "Sammanfattningsdialog som listar vad som ändrats, följt av omstartsprompten"
|
||||
}
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Manuell granskning",
|
||||
"intro": "Före <strong>VM → LXC</strong>, granska drivrutin och BDF-policy. NVIDIA-exemplet använder <code>10de:2204</code>; anpassa till ditt kort. Kommandona läser status; skriptet hanterar även gäster och IOMMU-gruppmedlemmar.",
|
||||
"lxcToVm": "Före <strong>LXC → VM</strong>, granska PCI-adressen och IOMMU-gruppen. Ersätt exempeladressen och kontrollera alla gruppmedlemmar före tilldelning.",
|
||||
"oneVmTitle": "En fysisk GPU tilldelad via VFIO kan bara användas av en VM i taget",
|
||||
"oneVmBody": "Att sätta flera <code>hostpci</code>-poster med samma PCI-slot i två VM är giltigt konfig men bara en av VM kan börja med GPU - den andra kommer att misslyckas. ProxMenux konfliktpolitiskt steg handlar om att undvika denna fälla."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verifiering efter omstart"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Felsökning",
|
||||
"stillVfioTitle": "GPU visar fortfarande vfio-pci efter byte till LXC-läge",
|
||||
"stillVfioBody": "En laddad VFIO-modul visar inte vilken drivrutin som äger denna GPU. Kontrollera kortets bindning samt att <code>update-initramfs</code> och omstart slutförts. <code>lsmod | grep vfio</code> listar bara moduler. För AMD / Intel granska <code>vfio.conf</code>; för NVIDIA <code>/etc/proxmenux/vfio-bind.bdfs</code> och <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code>. Korrigera gamla regler före <code>update-initramfs -u -k all</code> och omstart.",
|
||||
"vmFailTitle": "En VM startar inte efter byte av GPU:n till LXC-läge",
|
||||
"vmFailBody": "Kontrollera gamla <code>hostpci</code>-referenser. Valet <em>Ta bort GPU från konfiguration</em> kan rensa dem under avsett byte. Granska föreslagen riktning innan skriptet körs igen så att läget inte vänds av misstag. Alternativt ta bort tilldelningen i Proxmox när VM är stoppad.",
|
||||
"smiFailTitle": "nvidia-smi visar ”Driver/library version mismatch” efter återgång till LXC",
|
||||
"smiFailBody": "Jämför laddad NVIDIA-modul med installerade bibliotek, även i LXC. Anpassa versionerna först: omstart laddar installerad modul men rättar inte felaktiga bibliotekspaket. Omladdning med <code>modprobe -r nvidia</code> och <code>modprobe nvidia</code> kräver stoppade GPU-klienter och kan misslyckas när beroende moduler används.",
|
||||
"logTitle": "Körningslogg",
|
||||
"logBody": "Varje körning skriver till <code>/tmp/proxmenux_gpu_switch_mode.log</code> på värden. Bifoga loggen när du ber om hjälp på GitHub."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relaterat",
|
||||
"items": [
|
||||
{
|
||||
"label": "Lägg till GPU till VM (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — första konfigurationen av VM-läge."
|
||||
},
|
||||
{
|
||||
"label": "Lägg till GPU i LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — första konfigurationen av LXC-läge."
|
||||
},
|
||||
{
|
||||
"label": "Installera NVIDIA-drivrutiner på värden",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " - krävs för LXC-läge på NVIDIA GPU."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor — fliken Hårdvara",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — avsnittet Grafikkort med aktuellt läge och växlingskontroll."
|
||||
},
|
||||
{
|
||||
"label": "Kommandon för GPU-genomkoppling",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — kort kommandoreferens."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user