mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-06-14 20:36:59 +00:00
complete i18n migration to /[locale]/ with EN+ES content
Full rewrite of the docs site under app/[locale]/ with next-intl in localePrefix:"always" mode. Every page now exists at both /en/<path> and /es/<path>; the root / shows a meta-refresh + JS redirect to /<defaultLocale>/ so GitHub Pages serves something on the apex URL. Highlights: - 107 doc pages migrated to file-per-page JSON namespaces under messages/en/ and messages/es/. Spanish content is fully translated (no copy-of-English placeholders). - New documentation for the Active Suppressions section in the Settings tab and the per-event Dismiss dropdown in the Health Monitor modal. - New screenshots: dismiss-duration-dropdown.png and an updated health-suppression-settings.png. - Pagefind integrated for client-side search; index is built on every CI deploy (not committed). - RSS feeds: per-locale at /<locale>/rss.xml plus root /rss.xml for backward compat. - Removed the dead app/[locale]/guides/[slug]/ route — every guide now has its own static page and no markdown source remains. - Fixed orphan link /guides/nvidia -> /guides/nvidia-manual in docs/hardware/nvidia-host. - Removed obsolete components (footer2, calendar, drawer). Verified locally with `npm ci && npm run build`: 2804 files in out/, 231 pages indexed by pagefind, root redirect intact, both locale roots and the new Active Suppressions docs render OK.
This commit is contained in:
119
web/messages/en/guides/backup-cloud.json
Normal file
119
web/messages/en/guides/backup-cloud.json
Normal file
@@ -0,0 +1,119 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Proxmox Backup to Personal Cloud Storage | ProxMenux Guides",
|
||||
"description": "Use rclone to mount a personal cloud (Google Drive, Mega, Dropbox, OneDrive, etc.) as a directory on the Proxmox VE host, register it as a vzdump datastore, and back up VMs / CTs straight to the cloud — no extra script.",
|
||||
"ogTitle": "Proxmox Backup to Personal Cloud Storage",
|
||||
"ogDescription": "Mount a personal cloud with rclone on a Proxmox VE host and back up VMs / CTs straight to it as a vzdump datastore."
|
||||
},
|
||||
"header": {
|
||||
"title": "Proxmox Backup to Personal Cloud Storage",
|
||||
"description": "Use rclone to mount a personal cloud (Google Drive, Mega, Dropbox, OneDrive, etc.) as a directory on the Proxmox VE host, register it as a vzdump datastore, and back up VMs / CTs straight to the cloud — no extra script.",
|
||||
"section": "Guides"
|
||||
},
|
||||
"intro": {
|
||||
"pbsCalloutTitle": "Consider Proxmox Backup Server first",
|
||||
"pbsCalloutBody": "If you have a second machine (a Pi, an old PC, a NAS), running <pbsLink>Proxmox Backup Server</pbsLink> on it gives you incremental, deduplicated, encrypted backups — a much better fit for VM backup than rsync-style cloud sync. The cloud-mount approach in this guide is for users who specifically want backups to land in their personal cloud (Google Drive / Mega / OneDrive / Dropbox).",
|
||||
"stepsTitle": "What you'll do",
|
||||
"steps": [
|
||||
"Create a directory on the Proxmox host and register it as a vzdump-capable datastore.",
|
||||
"Install and configure rclone for your cloud provider.",
|
||||
"Mount the cloud folder onto the directory.",
|
||||
"Make the mount survive reboots (systemd unit — more robust than crontab)."
|
||||
],
|
||||
"vzdumpCalloutTitle": "Heads up about Proxmox vzdump backups",
|
||||
"vzdumpCalloutBody": "They're <strong>not incremental</strong>. Every backup contains the full VM disk image (compressed). On a quota-limited cloud, this fills up fast. Plan a retention policy from day one (see end of guide)."
|
||||
},
|
||||
"createDir": {
|
||||
"heading": "1. Create the host directory and register it as a datastore",
|
||||
"body": "SSH into the host (or use the Proxmox shell) and create a mount-point directory under <code>/mnt/</code>. The name is arbitrary — use something that identifies the provider:",
|
||||
"mkdirCode": "mkdir -p /mnt/gdrive",
|
||||
"afterMkdir": "In the Proxmox web UI: <strong>Datacenter → Storage → Add → Directory</strong>.",
|
||||
"image1Alt": "Adding new storage in Proxmox",
|
||||
"configIntro": "Configure it like this:",
|
||||
"configItems": [
|
||||
"<strong>ID:</strong> <code>gdrive</code> (or whatever you used for the directory name)",
|
||||
"<strong>Directory:</strong> <code>/mnt/gdrive</code>",
|
||||
"<strong>Content:</strong> select <strong>VZDump backup file</strong>"
|
||||
],
|
||||
"image2Alt": "Configuring new storage in Proxmox",
|
||||
"afterConfig": "Click <strong>Add</strong>:",
|
||||
"image3Alt": "New storage added in Proxmox",
|
||||
"afterAdd": "The directory is now registered as a Proxmox datastore — but it's still empty (no cloud is mounted on it yet)."
|
||||
},
|
||||
"installRclone": {
|
||||
"heading": "2. Install and configure rclone",
|
||||
"body": "<rcloneLink>rclone</rcloneLink> is the tool that talks to cloud storage providers. Install it from Debian repositories:",
|
||||
"installCode": "apt-get update\napt-get install -y rclone",
|
||||
"newerCalloutTitle": "If you need a newer rclone",
|
||||
"newerCalloutBody": "If you need a newer rclone than what Debian ships, use the official installer:",
|
||||
"newerCode": "curl https://rclone.org/install.sh | bash",
|
||||
"tunnelHeading": "2.1 Browser-based authentication via SSH tunnel",
|
||||
"tunnelBody": "rclone's auth flow opens a local web browser. Since the Proxmox host doesn't have a desktop, <remoteSetupLink>rclone's remote-setup procedure</remoteSetupLink> routes the auth callback through an SSH tunnel back to your laptop's browser.",
|
||||
"tunnelFrom": "From your <strong>laptop</strong> (replace <code>ip_proxmox</code> with the Proxmox IP):",
|
||||
"tunnelCode": "ssh -L localhost:53682:localhost:53682 root@ip_proxmox",
|
||||
"tunnelAfter": "This SSH session forwards port 53682 from the Proxmox host to your laptop's localhost. Keep it open during the rclone config below.",
|
||||
"runHeading": "2.2 Run rclone config",
|
||||
"runBody": "In the SSH session you just opened, run:",
|
||||
"runCode": "rclone config",
|
||||
"runAfter": "Follow the prompts to add a new remote. The exact answers depend on your provider — see the <providerDocsLink>rclone provider docs</providerDocsLink> for Google Drive, Mega, Dropbox, OneDrive, etc. The key step is the auth question:",
|
||||
"authPrompt": "Use web browser to automatically authenticate rclone with remote?\n * Say Y if the machine running rclone has a web browser you can use\n * Say N if running rclone on a (remote) machine without web browser access\nIf not sure try Y. If Y failed, try N.\ny) Yes\nn) No\ny/n> y",
|
||||
"authAfter": "Answer <strong>Y</strong> — rclone prints a localhost URL. Open it in <strong>your laptop's browser</strong> (the SSH tunnel routes it correctly), authorise the rclone application in your cloud provider, and the config completes.",
|
||||
"nameRemote": "When asked for the remote's name, use something matching the directory you created — e.g. <code>gdrive</code>."
|
||||
},
|
||||
"mount": {
|
||||
"heading": "3. Mount the cloud folder",
|
||||
"body": "Create a folder in your personal cloud to hold the backups. Call it something like <code>PBC</code> (Proxmox Backup Cloud).",
|
||||
"mountIntro": "Mount it onto the host directory:",
|
||||
"mountCode": "rclone mount gdrive:/PBC /mnt/gdrive --allow-other --allow-non-empty",
|
||||
"mountItems": [
|
||||
"<code>gdrive:/PBC</code> — the folder in your cloud.",
|
||||
"<code>/mnt/gdrive</code> — the host directory you registered as a datastore."
|
||||
],
|
||||
"mountFootnote": "<strong>This command stays in the foreground.</strong> For testing, leave it running in a terminal and try a backup. For permanent mounting on every boot, set up a systemd unit (next section)."
|
||||
},
|
||||
"systemd": {
|
||||
"heading": "4. Auto-mount on every boot (systemd)",
|
||||
"body": "A systemd unit is more robust than <code>crontab @reboot</code> — it can wait for the network to be ready, restart on failure, and gives you proper logs via <code>journalctl</code>.",
|
||||
"createIntro": "Create the unit file:",
|
||||
"createCode": "nano /etc/systemd/system/rclone-gdrive.service",
|
||||
"pasteIntro": "Paste:",
|
||||
"unitCode": "[Unit]\nDescription=rclone mount for Proxmox cloud backups\nWants=network-online.target\nAfter=network-online.target\n\n[Service]\nType=notify\nExecStart=/usr/bin/rclone mount \\\n gdrive:/PBC /mnt/gdrive \\\n --allow-other \\\n --allow-non-empty \\\n --vfs-cache-mode writes \\\n --log-level INFO \\\n --log-file /var/log/rclone-gdrive.log\nExecStop=/bin/fusermount -uz /mnt/gdrive\nRestart=on-failure\nRestartSec=10\n\n[Install]\nWantedBy=multi-user.target",
|
||||
"adjust": "Adjust <code>gdrive:/PBC</code> and <code>/mnt/gdrive</code> if you used different names. Save (<code>Ctrl+X</code>), then enable and start:",
|
||||
"enableCode": "systemctl daemon-reload\nsystemctl enable --now rclone-gdrive.service",
|
||||
"verifyIntro": "Verify:",
|
||||
"verifyCode": "systemctl status rclone-gdrive.service\nmount | grep /mnt/gdrive",
|
||||
"verifyAfter": "If the service ever fails (provider rate-limits, expired auth token, network blip), it'll auto-restart after 10 seconds. Logs are at <code>/var/log/rclone-gdrive.log</code> and via <code>journalctl -u rclone-gdrive.service -f</code>.",
|
||||
"vfsCalloutTitle": "Why --vfs-cache-mode writes?",
|
||||
"vfsCalloutBody": "vzdump streams the backup archive to disk; without VFS write caching, every <code>fwrite</code> blocks on a HTTP round-trip to the cloud — backups get slow and providers may rate-limit. The cache buffers writes locally and flushes them in the background."
|
||||
},
|
||||
"configureBackup": {
|
||||
"heading": "5. Configure the backup to land in the cloud",
|
||||
"body": "In the Proxmox UI, when scheduling a backup or running an ad-hoc one, pick the storage you registered as the <strong>target</strong>:",
|
||||
"image5Alt": "Selecting backup destination in Proxmox",
|
||||
"after": "After the backup completes, the file appears in your cloud:",
|
||||
"image6Alt": "Backup file in cloud storage"
|
||||
},
|
||||
"retention": {
|
||||
"heading": "6. Retention — keep cloud quota under control",
|
||||
"body": "Proxmox vzdump backups are <strong>full snapshots, not incremental</strong>. A 30 GB VM = 30 GB per backup. Without retention, the cloud fills up.",
|
||||
"uiPath": "In the Proxmox UI: <strong>Datacenter → Backup → [your job] → Retention</strong>:",
|
||||
"image7Alt": "Backup retention settings in Proxmox",
|
||||
"starterIntro": "Reasonable starter values for a home / lab setup:",
|
||||
"starterItems": [
|
||||
"Keep last 5 daily backups",
|
||||
"Keep last 4 weekly backups",
|
||||
"Keep last 6 monthly backups"
|
||||
],
|
||||
"adjust": "Adjust based on your cloud quota and how often the VMs change."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Troubleshooting",
|
||||
"items": [
|
||||
"<strong><code>Mount point /mnt/gdrive is itself on a fuse.rclone filesystem</code>:</strong> the previous mount didn't unmount cleanly. Force-unmount: <code>fusermount -uz /mnt/gdrive</code>, then restart the systemd unit.",
|
||||
"<strong>Backup is extremely slow:</strong> confirm <code>--vfs-cache-mode writes</code> is on the <code>ExecStart</code> line. Without it, every write blocks on the cloud. Also check your upstream bandwidth — vzdump is bound by it.",
|
||||
"<strong>Backup fails with ''No space left on device'':</strong> the cache directory (<code>~/.cache/rclone/</code>) filled up before the upload caught up. Move it to a larger filesystem with <code>--cache-dir /var/cache/rclone</code> in the systemd unit.",
|
||||
"<strong>rclone auth token expired (typical on Google Drive after a long idle period):</strong> SSH back in with the tunnel (<code>ssh -L localhost:53682:localhost:53682 root@ip_proxmox</code>) and run <code>rclone config reconnect gdrive:</code> to refresh.",
|
||||
"<strong>Backups land but are corrupted on restore:</strong> stop using cloud storage as the <strong>only</strong> backup destination. Combine with local PBS / vzdump on a different disk for resilience."
|
||||
]
|
||||
}
|
||||
}
|
||||
118
web/messages/en/guides/index.json
Normal file
118
web/messages/en/guides/index.json
Normal file
@@ -0,0 +1,118 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Proxmox VE Guides — Coral TPU, NVIDIA, Kodi LXC, Samba, Cloud Backup | ProxMenux",
|
||||
"description": "Hand-written tutorials for Proxmox VE: install Kodi inside an LXC with GPU acceleration, NVIDIA driver setup on PVE 9, USB drive over Samba in a container, vzdump backups to personal cloud (Google Drive, Mega, Dropbox, OneDrive). Plus curated community resources, glossary and command reference.",
|
||||
"ogTitle": "Proxmox VE Guides — Coral TPU, NVIDIA, Kodi LXC, Samba, Cloud Backup",
|
||||
"ogDescription": "Hand-written Proxmox VE tutorials: GPU passthrough, Kodi LXC media center, Samba over USB, cloud backup with rclone, and curated community resources.",
|
||||
"twitterTitle": "Proxmox VE Guides | ProxMenux",
|
||||
"twitterDescription": "Hand-written tutorials for Proxmox VE — GPU, Kodi LXC, Samba, cloud backup and more.",
|
||||
"ogImageAlt": "ProxMenux Guides — Hand-written tutorials for Proxmox VE"
|
||||
},
|
||||
"header": {
|
||||
"title": "ProxMenux Guides",
|
||||
"tagline": "In-depth tutorials, quick references, and curated community resources to get the most out of Proxmox VE."
|
||||
},
|
||||
"inDepth": {
|
||||
"heading": "In-depth guides",
|
||||
"intro": "Hand-written tutorials covering specific Proxmox workflows. Each one is the manual equivalent of a ProxMenux automated flow — useful when you want full visibility into each step.",
|
||||
"items": [
|
||||
{
|
||||
"slug": "kodi-lxc",
|
||||
"title": "Install Kodi in an LXC and Connect it to a Monitor / TV with GPU Acceleration",
|
||||
"description": "Run Kodi inside a privileged LXC container on Proxmox VE, expose the host iGPU and USB input devices, and turn the Proxmox server into an all-in-one media center connected directly to a TV."
|
||||
},
|
||||
{
|
||||
"slug": "backup-cloud",
|
||||
"title": "Proxmox Backup to Personal Cloud Storage",
|
||||
"description": "Use rclone to mount a personal cloud (Google Drive, Mega, Dropbox, OneDrive, etc.) as a directory on the Proxmox VE host, register it as a vzdump datastore, and back up VMs / CTs straight to the cloud — no extra script."
|
||||
},
|
||||
{
|
||||
"slug": "lxc-samba",
|
||||
"title": "Add a USB Drive or Memory to an LXC and Share it Over the Network with Samba",
|
||||
"description": "Attach a USB hard drive or memory stick to a privileged LXC container on Proxmox VE, install Samba inside the container, and share the contents over the network."
|
||||
},
|
||||
{
|
||||
"slug": "nvidia-manual",
|
||||
"title": "Installing NVIDIA Graphics Card Drivers on Proxmox VE 9 (manual procedure)",
|
||||
"description": "Manual installation and configuration of NVIDIA drivers on a Proxmox VE 9 host, plus the LXC wiring needed to expose the GPU to one or more containers. Covers driver install, persistence service, optional NVENC patch and the per-container setup."
|
||||
}
|
||||
]
|
||||
},
|
||||
"references": {
|
||||
"heading": "ProxMenux references",
|
||||
"intro": "Quick-reference material from the ProxMenux documentation itself.",
|
||||
"cards": {
|
||||
"glossary": {
|
||||
"title": "Glossary",
|
||||
"description": "60+ definitions of the technical terms used across ProxMenux: Proxmox, virtualization, storage, network, Linux. Quick lookup with category badges and cross-links."
|
||||
},
|
||||
"helpInfo": {
|
||||
"title": "Help and Info — Command catalog",
|
||||
"description": "Curated catalog of useful Linux + Proxmox commands organised by topic, with copy-to-clipboard. Mirrors the in-menu reference inside ProxMenux."
|
||||
},
|
||||
"linuxResources": {
|
||||
"title": "Linux Resources",
|
||||
"description": "External resources for Linux command-line learning, security practices, monitoring tools and ZFS — complements the ProxMenux command catalog."
|
||||
},
|
||||
"externalRepos": {
|
||||
"title": "External Repositories",
|
||||
"description": "Third-party script repositories integrated into ProxMenux as alternative menu options (community-scripts/ProxmoxVE, etc.)."
|
||||
}
|
||||
}
|
||||
},
|
||||
"official": {
|
||||
"heading": "Official Proxmox resources",
|
||||
"intro": "First-party documentation from Proxmox Server Solutions — the source of truth for the platform.",
|
||||
"cards": {
|
||||
"pveDocs": {
|
||||
"title": "Proxmox VE Documentation",
|
||||
"description": "The official admin guide. Comprehensive reference covering installation, networking, storage, clustering, HA, and the API."
|
||||
},
|
||||
"pbsDocs": {
|
||||
"title": "Proxmox Backup Server Docs",
|
||||
"description": "Documentation for PBS — incremental, deduplicated, encrypted backups for Proxmox VE."
|
||||
},
|
||||
"videoTraining": {
|
||||
"title": "Official video training",
|
||||
"description": "Proxmox official video tutorials and training courses."
|
||||
},
|
||||
"forum": {
|
||||
"title": "Proxmox Forum",
|
||||
"description": "Official community forum — questions, troubleshooting, shared experiences. Maintainer-monitored."
|
||||
}
|
||||
}
|
||||
},
|
||||
"community": {
|
||||
"heading": "Community projects & resources",
|
||||
"intro": "Open-source projects and curated lists from the wider Proxmox community. Not affiliated with Proxmox Server Solutions or with ProxMenux — included because they have proven useful.",
|
||||
"cards": {
|
||||
"helperScripts": {
|
||||
"title": "Proxmox VE Helper-Scripts",
|
||||
"description": "Community-maintained catalog of one-shot scripts to deploy LXCs (Home Assistant, Plex, Frigate, …), VMs and PVE tweaks. Spiritual successor to tteck's helper scripts."
|
||||
},
|
||||
"awesome": {
|
||||
"title": "awesome-proxmox-ve (curated list)",
|
||||
"description": "Large community-curated meta-list of Proxmox VE resources: tools, libraries, integrations, blogs, videos. A good launchpad to discover more."
|
||||
}
|
||||
},
|
||||
"suggestRich": "Have a quality resource we should add here? Open an issue or PR on <link>GitHub</link>. We aim to keep this list curated rather than exhaustive."
|
||||
},
|
||||
"discussion": {
|
||||
"heading": "Community discussion",
|
||||
"intro": "Where people talk about Proxmox and ProxMenux.",
|
||||
"cards": {
|
||||
"proxmenuxDiscussions": {
|
||||
"title": "ProxMenux Discussions",
|
||||
"description": "ProxMenux-specific GitHub Discussions: feature ideas, Q&A, share your setup. The right place for everything about the menu, the Monitor and the docs."
|
||||
},
|
||||
"proxmoxForum": {
|
||||
"title": "Proxmox Forum",
|
||||
"description": "Official Proxmox forum (also linked above). The right place for in-depth troubleshooting and config-specific issues."
|
||||
},
|
||||
"reddit": {
|
||||
"title": "r/Proxmox on Reddit",
|
||||
"description": "Active subreddit for discussions, tips and technical support. Lower barrier than the forum, faster turnaround for casual questions."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
70
web/messages/en/guides/kodi-lxc.json
Normal file
70
web/messages/en/guides/kodi-lxc.json
Normal file
@@ -0,0 +1,70 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Install Kodi in an LXC with GPU Acceleration | ProxMenux Guides",
|
||||
"description": "Run Kodi inside a privileged LXC container on Proxmox VE, expose the host iGPU and USB input devices, and turn the Proxmox server into an all-in-one media center connected directly to a TV.",
|
||||
"ogTitle": "Install Kodi in an LXC with GPU Acceleration",
|
||||
"ogDescription": "Run Kodi inside a privileged LXC on Proxmox VE with host iGPU and USB input passthrough — turn the server into an all-in-one media center."
|
||||
},
|
||||
"header": {
|
||||
"title": "Install Kodi in an LXC and Connect it to a Monitor / TV with GPU Acceleration",
|
||||
"description": "Run Kodi inside a privileged LXC container on Proxmox VE, expose the host iGPU and USB input devices, and turn the Proxmox server into an all-in-one media center connected directly to a TV.",
|
||||
"section": "Guides"
|
||||
},
|
||||
"intro": {
|
||||
"calloutTitle": "Heads up",
|
||||
"calloutBody": "This guide uses an external community script to bootstrap the Kodi LXC. The GPU side of the setup (passing the host iGPU into the container) is also covered by the ProxMenux automated flow: <strong>GPUs and Coral-TPU → Add GPU to LXC</strong> in the ProxMenux menu — handles the <code>/dev/dri</code> wiring + driver install inside the CT. The script below additionally bootstraps Kodi itself and the autostart on <code>tty7</code>. Use it if you want a turnkey media-centre LXC; use the <gpuLink>ProxMenux flow</gpuLink> if you only need GPU access for a CT you set up by hand.",
|
||||
"credit": "Original Kodi LXC script created by <authorLink>mrrudy</authorLink>.",
|
||||
"stepsTitle": "What you'll do",
|
||||
"steps": [
|
||||
"Create a privileged LXC running Kodi (script-driven).",
|
||||
"Wire your USB keyboard, mouse or controller into the CT.",
|
||||
"(Optional) Update Kodi to the latest version from the team-xbmc PPA."
|
||||
]
|
||||
},
|
||||
"createCt": {
|
||||
"heading": "1. Create the Kodi LXC",
|
||||
"body": "The CT needs to be <strong>privileged</strong> so it can access USB input devices (keyboards, remotes, controllers). The script handles privilege flags + GPU wiring + Kodi install + autostart on <code>tty7</code>:",
|
||||
"code": "bash -c \"$(wget -qLO - https://raw.githubusercontent.com/mrrudy/proxmoxHelper/main/ct/kodi-v1.sh)\"",
|
||||
"after": "Be patient — it takes a while to install. When it finishes and Kodi starts on <code>tty7</code>, you can plug your monitor or TV directly into the host's HDMI / DisplayPort output and you should see the Kodi UI."
|
||||
},
|
||||
"addInput": {
|
||||
"heading": "2. Add a keyboard, mouse or USB controller",
|
||||
"body": "Input devices live under <code>/dev/input/</code> on the host. Identify the major number:",
|
||||
"listCode": "ls -l /dev/input",
|
||||
"imageAlt": "Input devices list",
|
||||
"afterList": "Take the first column number (in the example: <code>13</code>). Stop the Kodi LXC, then edit its config (replace <code>'<'CTID'>'</code> with the container ID — for example, <code>102</code>):",
|
||||
"editCode": "nano /etc/pve/lxc/'<'CTID'>'.conf",
|
||||
"addLines": "Add (adjust <code>13</code> to what you saw on <strong>your</strong> host):",
|
||||
"configCode": "lxc.cgroup2.devices.allow = c 13:* rwm\nlxc.mount.entry: /dev/input dev/input none bind,optional,create=dir",
|
||||
"imageConfigAlt": "LXC configuration",
|
||||
"save": "Save (<code>Ctrl+X</code>) and restart <strong>only the container</strong> — no need to reboot the whole Proxmox host:",
|
||||
"restartCode": "pct restart '<'CTID'>'",
|
||||
"plug": "Plug in the keyboard / mouse / controller and Kodi should respond to it."
|
||||
},
|
||||
"updateKodi": {
|
||||
"heading": "3. (Optional) Update Kodi to the latest release",
|
||||
"calloutTitle": "Important",
|
||||
"calloutBody": "The team-xbmc PPA is <strong>Ubuntu-only</strong>. If the Kodi LXC is based on a Debian template, <code>add-apt-repository</code> won't be available and the PPA will not work. The mrrudy script defaults to an Ubuntu template, so this should normally apply. To verify: <code>cat /etc/os-release</code> inside the container — look for <code>NAME=\"Ubuntu\"</code>.",
|
||||
"body": "Inside the container (<code>pct enter '<'CTID'>'</code>):",
|
||||
"code": "sudo add-apt-repository ppa:team-xbmc/ppa\nsudo apt update\nsudo apt install kodi kodi-bin",
|
||||
"after": "Restart the container when it finishes; on boot you'll have the latest Kodi."
|
||||
},
|
||||
"screenshots": {
|
||||
"heading": "Screenshots",
|
||||
"image1Alt": "Kodi interface 1",
|
||||
"image2Alt": "Kodi interface 2"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Troubleshooting",
|
||||
"items": [
|
||||
"<strong>Kodi LXC starts but nothing on the TV:</strong> the CT may not have inherited the iGPU. Confirm with <code>ls /dev/dri</code> inside the container (you should see <code>card0</code>, <code>renderD128</code>). If empty, the GPU passthrough wasn't applied — re-run the script or use the ProxMenux <strong>Add GPU to LXC</strong> menu.",
|
||||
"<strong>Keyboard / mouse not detected after restart:</strong> the major number for <code>/dev/input</code> changed (rare, but happens after kernel updates). Re-run <code>ls -l /dev/input</code> on the host and update the <code>lxc.cgroup2.devices.allow</code> line.",
|
||||
"<strong>Hardware-accelerated playback uses CPU instead of GPU:</strong> install or update VA-API drivers inside the container (<code>intel-media-va-driver</code> for newer Intel iGPUs, <code>i965-va-driver</code> for older ones, <code>mesa-va-drivers</code> on AMD).",
|
||||
"<strong><code>add-apt-repository: command not found</code>:</strong> the container is Debian, not Ubuntu. Either use the Debian Kodi packages (older but stable) or recreate the CT from an Ubuntu template."
|
||||
]
|
||||
},
|
||||
"further": {
|
||||
"heading": "Further reading",
|
||||
"konpatRich": "<konpatLink>Konpat's blog post</konpatLink> — additional context on Intel iGPU passthrough into LXC."
|
||||
}
|
||||
}
|
||||
119
web/messages/en/guides/lxc-samba.json
Normal file
119
web/messages/en/guides/lxc-samba.json
Normal file
@@ -0,0 +1,119 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Add a USB Drive to an LXC and Share it with Samba | ProxMenux Guides",
|
||||
"description": "Attach a USB hard drive or memory stick to a privileged LXC container on Proxmox VE, install Samba inside the container, and share the contents over the network.",
|
||||
"ogTitle": "Add a USB Drive to an LXC and Share it with Samba",
|
||||
"ogDescription": "Attach a USB drive to a privileged LXC on Proxmox VE, install Samba inside the container, and share the contents over the LAN."
|
||||
},
|
||||
"header": {
|
||||
"title": "Add a USB Drive or Memory to an LXC and Share it Over the Network with Samba",
|
||||
"description": "Attach a USB hard drive or memory stick to a privileged LXC container on Proxmox VE, install Samba inside the container, and share the contents over the network.",
|
||||
"section": "Guides"
|
||||
},
|
||||
"recommended": {
|
||||
"calloutTitle": "Recommended",
|
||||
"calloutIntro": "ProxMenux now exposes both halves of this workflow as guided menus:",
|
||||
"items": [
|
||||
"<strong>Disk Manager → Format / Wipe Physical Disk</strong> for the format step.",
|
||||
"<strong>Storage & Share Manager → LXC network sharing → Samba server in LXC</strong> for the privileged-CT install + Samba config."
|
||||
],
|
||||
"calloutOutro": "The guided flows handle the unprivileged-CT permission quirks, share-mode presets (read-write / read-only / custom) and the sharedfiles group setup. This guide is the manual equivalent — useful if you want full visibility into each step or prefer to wire things by hand."
|
||||
},
|
||||
"intro": {
|
||||
"body": "Sometimes it's useful to add a hard drive or USB memory stick to a Proxmox host, especially on a mini PC with limited internal expansion. This guide walks through:",
|
||||
"stepsTitle": "What you'll do",
|
||||
"steps": [
|
||||
"Attaching the USB disk to a privileged LXC.",
|
||||
"Installing Samba inside the container.",
|
||||
"Sharing the disk contents over the LAN."
|
||||
],
|
||||
"useCasesTitle": "Use cases",
|
||||
"useCases": [
|
||||
"Hosting Torrent files and serving them on the network.",
|
||||
"Backing a media server (Plex / Jellyfin / Emby).",
|
||||
"Holding documents that get auto-scanned by Paperless.",
|
||||
"Generic NAS-style storage for the home network."
|
||||
],
|
||||
"privilegedCalloutTitle": "Privileged container required",
|
||||
"privilegedCalloutBody": "Direct device passthrough (<code>mp0</code> with a host path) needs a privileged LXC. Unprivileged CTs can't bind-mount block devices directly — for those you need bind mounts of host directories instead (see ProxMenux <strong>Storage & Share Manager → LXC Mount Points</strong>)."
|
||||
},
|
||||
"attach": {
|
||||
"heading": "1. Attach the USB disk to the LXC",
|
||||
"identifyHeading": "1.1 Identify the device",
|
||||
"identifyBody": "Compare the disk list <strong>before</strong> and <strong>after</strong> plugging in the USB drive — the new device is your target.",
|
||||
"beforeLabel": "Before:",
|
||||
"afterLabel": "After:",
|
||||
"imageBeforeAlt": "Disk list before adding USB drive",
|
||||
"imageAfterAlt": "Disk list after adding USB drive",
|
||||
"lsblkBody": "You can also use <code>lsblk -o NAME,SIZE,MODEL,SERIAL</code> to list every block device with model and serial.",
|
||||
"stableCalloutTitle": "Important — use a stable identifier",
|
||||
"stableCalloutBody": "<code>/dev/sdb1</code> can change between boots if you have multiple USB disks. Find the persistent identifier:",
|
||||
"stableCalloutCode": "ls -l /dev/disk/by-id/ | grep -v part",
|
||||
"stableCalloutAfter": "Use the <code>/dev/disk/by-id/usb-...</code> path in the LXC config below instead of <code>/dev/sdb1</code>. It survives reboots and re-plugging.",
|
||||
"formatHeading": "1.2 Format the disk",
|
||||
"formatBody": "ext4 is a sensible default for Linux-backed shares (case-sensitive, supports POSIX ACLs, no file-size limits). Run from the <strong>Proxmox host</strong>, not the container:",
|
||||
"formatCode": "mkfs.ext4 /dev/sdb1",
|
||||
"formatAfter": "Replace <code>/dev/sdb1</code> with the actual partition device — or with the persistent <code>/dev/disk/by-id/usb-...-part1</code> path.",
|
||||
"mkdirHeading": "1.3 Create the mount point inside the LXC",
|
||||
"mkdirBody": "Inside the LXC, create the directory where the disk will appear (any name works):",
|
||||
"mkdirCode": "mkdir /mnt/lxc_USB",
|
||||
"wireHeading": "1.4 Wire the device into the LXC",
|
||||
"wireBody": "On the <strong>Proxmox host</strong> (not inside the CT), edit the container's config. Replace <code>'<'CTID'>'</code> with the container ID:",
|
||||
"wireEditCode": "nano /etc/pve/lxc/'<'CTID'>'.conf",
|
||||
"wireAddLine": "Add this line:",
|
||||
"wireConfigCode": "mp0: /dev/disk/by-id/usb-VENDOR_MODEL_SERIAL-part1,mp=/mnt/lxc_USB,backup=0",
|
||||
"wireShortForm": "(Or, if you accept the risk of the device path changing, the shorter form: <code>mp0: /dev/sdb1,mp=/mnt/lxc_USB,backup=0</code>.)",
|
||||
"wireBackupNote": "The <code>backup=0</code> flag excludes this mount point from <code>vzdump</code> backups — usually the right call for large external drives that are the host's target storage rather than its data.",
|
||||
"restartHeading": "1.5 Restart the LXC and set permissions",
|
||||
"restartBody": "Restart the CT to apply the mount point:",
|
||||
"restartCode": "pct restart '<'CTID'>'",
|
||||
"permsBody": "Inside the LXC, give the directory permissions appropriate for the user that will own the share:",
|
||||
"permsCode": "# Inside the container\nmkdir -p /mnt/lxc_USB\nchown -R proxmenux:proxmenux /mnt/lxc_USB\nchmod 770 /mnt/lxc_USB",
|
||||
"permsNoteTitle": "Note",
|
||||
"permsNote": "Replace <code>proxmenux</code> with the username you'll create in step 2.2 below. <code>770</code> gives full access to the user and group, no access to others — safer than the wide-open <code>chmod -R 777</code> while still letting the share work."
|
||||
},
|
||||
"samba": {
|
||||
"heading": "2. Install Samba",
|
||||
"installHeading": "2.1 Install the package inside the LXC",
|
||||
"installCode": "apt-get update\napt-get install -y samba",
|
||||
"confirmBody": "Confirm the service is running:",
|
||||
"confirmCode": "systemctl status smbd.service",
|
||||
"userHeading": "2.2 Create the share user",
|
||||
"userBody": "Pick a username (here we use <code>proxmenux</code>; substitute your own). Create it as a system user with no shell:",
|
||||
"userCode": "adduser proxmenux",
|
||||
"passwordBody": "Set the Samba password (separate from the system password — Samba maintains its own credential store):",
|
||||
"passwordCode": "smbpasswd -a proxmenux",
|
||||
"aclHeading": "2.3 Set ownership / ACLs",
|
||||
"aclBody": "If the simple <code>chown</code> from step 1.5 is enough for your case, you're done with permissions. For finer-grained control (multiple users sharing the same path with different rights), use ACLs:",
|
||||
"aclCode": "apt-get install -y acl\nsetfacl -R -m \"u:proxmenux:rwx\" /mnt/lxc_USB\nsetfacl -d -R -m \"u:proxmenux:rwx\" /mnt/lxc_USB # default ACL — applies to new files"
|
||||
},
|
||||
"configure": {
|
||||
"heading": "3. Configure the Samba share",
|
||||
"editHeading": "3.1 Edit smb.conf",
|
||||
"editCode": "nano /etc/samba/smb.conf",
|
||||
"appendBody": "Append a share definition at the end:",
|
||||
"shareCode": "[lxc_usb]\n comment = Shared USB storage\n path = /mnt/lxc_USB\n read only = no\n writable = yes\n browseable = yes\n guest ok = no\n valid users = proxmenux\n create mask = 0660\n directory mask = 0770",
|
||||
"validUsersNoteTitle": "Note",
|
||||
"validUsersNote": "The <code>valid users = proxmenux</code> line restricts access to that single Samba user. For group-based access, use <code>valid users = @samba_users</code> after adding the user(s) to a group named <code>samba_users</code>.",
|
||||
"reloadHeading": "3.2 Reload Samba",
|
||||
"reloadCode": "systemctl restart smbd"
|
||||
},
|
||||
"verify": {
|
||||
"heading": "4. Verify access",
|
||||
"body": "From any LAN client, browse to <code>\\\\'<'CT_IP'>'</code> (Windows) or <code>smb://'<'CT_IP'>'</code> (macOS / Linux file managers). Authenticate with the Samba user (<code>proxmenux</code>) and the password you set with <code>smbpasswd</code>.",
|
||||
"image1Alt": "Samba server access from a client",
|
||||
"image2Alt": "Samba authentication prompt",
|
||||
"usageBody": "You can use the share both inside the container and across the network:",
|
||||
"image3Alt": "Using the USB drive over the share"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Troubleshooting",
|
||||
"items": [
|
||||
"<strong><code>pct restart</code> fails with \"device not found\":</strong> the device path in <code>mp0</code> doesn't exist on the host. Check with <code>ls -l /dev/disk/by-id/</code> and update the path.",
|
||||
"<strong>CT starts but <code>/mnt/lxc_USB</code> is empty:</strong> the disk isn't mounted inside the CT. Check from the host: <code>pct exec '<'CTID'>' -- mount | grep lxc_USB</code>. If absent, the mount point in the config is wrong.",
|
||||
"<strong>Samba authenticates but writes fail with \"Permission denied\":</strong> Linux permissions on the directory don't allow the Samba user to write. Re-check <code>chown</code> / <code>setfacl</code> in section 1.5 / 2.3.",
|
||||
"<strong>Share doesn't appear in network browsers but <code>smb://'<'ip'>'/lxc_usb</code> works:</strong> browseability over the LAN depends on NetBIOS / WS-Discovery. Add <code>nmbd</code>: <code>apt-get install -y samba-common-bin</code> and ensure <code>nmbd</code> is enabled.",
|
||||
"<strong>Want to add a second user to the same share:</strong> create the user with <code>adduser</code>, register with <code>smbpasswd -a</code>, add to the share's <code>valid users =</code> list comma-separated."
|
||||
]
|
||||
}
|
||||
}
|
||||
153
web/messages/en/guides/nvidia-manual.json
Normal file
153
web/messages/en/guides/nvidia-manual.json
Normal file
@@ -0,0 +1,153 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Installing NVIDIA Drivers on Proxmox VE 9 (manual procedure) | ProxMenux Guides",
|
||||
"description": "Manual installation and configuration of NVIDIA drivers on a Proxmox VE 9 host, plus the LXC wiring needed to expose the GPU to one or more containers. Covers driver install, persistence service, optional NVENC patch and the per-container setup.",
|
||||
"ogTitle": "Installing NVIDIA Drivers on Proxmox VE 9 (manual procedure)",
|
||||
"ogDescription": "Manual NVIDIA driver install on PVE 9 — host driver, persistence service, optional NVENC patch and per-container LXC wiring."
|
||||
},
|
||||
"header": {
|
||||
"title": "Installing NVIDIA Graphics Card Drivers on Proxmox VE 9 (manual procedure)",
|
||||
"description": "Manual installation and configuration of NVIDIA drivers on a Proxmox VE 9 host, plus the LXC wiring needed to expose the GPU to one or more containers. Covers driver install, persistence service, optional NVENC patch and the per-container setup.",
|
||||
"section": "Guides"
|
||||
},
|
||||
"intro": {
|
||||
"calloutTitle": "Note",
|
||||
"calloutBody": "This is the manual procedure preserved as a reference. For most users the recommended path is the automated ProxMenux flow: <strong>Install NVIDIA Drivers (Host)</strong> in the <em>GPUs and Coral-TPU</em> menu, and <strong>Add GPU to LXC</strong> (or <strong>Add GPU to VM</strong>) for the per-guest wiring. The automated flow handles the same steps documented here (with extra safety checks: kernel-headers compatibility, IOMMU validation, VFIO conflict resolution). This page is for operators who want to understand each command, or who need to deviate from the standard flow.",
|
||||
"targetNote": "Targeted at <strong>Proxmox VE 9</strong> (Debian Trixie). PVE 7 (Bullseye) and PVE 8 (Bookworm) are no longer covered.",
|
||||
"stepsTitle": "What you'll do",
|
||||
"steps": [
|
||||
"Prepare the Proxmox VE 9 host (blacklist nouveau, repos, prerequisites).",
|
||||
"Install the NVIDIA driver on the host.",
|
||||
"Install the NVIDIA persistence service.",
|
||||
"(Optional) Apply the keylase patch to lift the NVENC concurrent-session limit on consumer GPUs.",
|
||||
"Wire the GPU into one or more LXC containers and install the matching driver inside each."
|
||||
]
|
||||
},
|
||||
"prepareHost": {
|
||||
"heading": "1. Prepare the host (PVE 9)",
|
||||
"blacklistHeading": "1.1 Blacklist nouveau",
|
||||
"blacklistBody": "Check whether the open-source <code>nouveau</code> driver is already blacklisted:",
|
||||
"blacklistCheckCode": "cat /etc/modprobe.d/blacklist.conf",
|
||||
"blacklistAdd": "If <code>blacklist nouveau</code> does not appear, add it and reboot:",
|
||||
"blacklistAddCode": "echo \"blacklist nouveau\" '>>' /etc/modprobe.d/blacklist.conf\nreboot",
|
||||
"blacklistImageAlt": "Blacklist check",
|
||||
"reposHeading": "1.2 Verify repositories (PVE 9 / Trixie)",
|
||||
"reposBody": "If you ran the ProxMenux Post-Install script (or any other Proxmox post-install tooling), the repositories are already in place — skip this step.",
|
||||
"reposOtherwise": "Otherwise, on a vanilla PVE 9 install with no enterprise subscription:",
|
||||
"reposEditCode": "nano /etc/apt/sources.list.d/proxmox.sources",
|
||||
"reposPveBody": "Make sure it contains the no-subscription source for Trixie:",
|
||||
"reposPveCode": "Types: deb\nURIs: http://download.proxmox.com/debian/pve\nSuites: trixie\nComponents: pve-no-subscription\nSigned-By: /usr/share/keyrings/proxmox-archive-keyring.gpg",
|
||||
"reposDebianBody": "And the Debian sources at <code>/etc/apt/sources.list.d/debian.sources</code>:",
|
||||
"reposDebianCode": "Types: deb\nURIs: http://deb.debian.org/debian/\nSuites: trixie trixie-updates\nComponents: main contrib non-free non-free-firmware\nSigned-By: /usr/share/keyrings/debian-archive-keyring.gpg\n\nTypes: deb\nURIs: http://security.debian.org/debian-security/\nSuites: trixie-security\nComponents: main contrib non-free non-free-firmware\nSigned-By: /usr/share/keyrings/debian-archive-keyring.gpg",
|
||||
"updateHeading": "1.3 Update the system and install prerequisites",
|
||||
"updateCode": "apt update && apt dist-upgrade -y",
|
||||
"buildToolsBody": "Install the build tools and kernel headers needed to compile the NVIDIA kernel module:",
|
||||
"buildToolsCode": "apt-get install -y git\napt-get install -qqy pve-headers-$(uname -r) gcc make"
|
||||
},
|
||||
"installDriver": {
|
||||
"heading": "2. Install the NVIDIA driver on the host",
|
||||
"pickHeading": "2.1 Pick a driver version",
|
||||
"pickBody": "Check the latest stable driver:",
|
||||
"pickUrlCode": "https://download.nvidia.com/XFree86/Linux-x86_64/latest.txt",
|
||||
"nvencCallout": "If you plan to apply the NVENC patch (step 4), verify the patch supports your chosen driver version first: <patchLink>github.com/keylase/nvidia-patch</patchLink>",
|
||||
"nvencCalloutTitle": "Heads up",
|
||||
"pickReplace": "Replace <code>latest.txt</code> in the URL with the version number to find the installer file ending in <code>.run</code>. The full driver list is at:",
|
||||
"pickListCode": "https://download.nvidia.com/XFree86/Linux-x86_64/",
|
||||
"pickImageAlt": "NVIDIA driver download",
|
||||
"pickVersionNote": "Throughout the rest of this guide, replace <code>'<'VERSION'>'</code> with the actual version (for example <code>580.95.05</code>).",
|
||||
"downloadHeading": "2.2 Download and run the installer",
|
||||
"downloadCode": "mkdir -p /opt/nvidia\ncd /opt/nvidia\nwget https://download.nvidia.com/XFree86/Linux-x86_64/'<'VERSION'>'/NVIDIA-Linux-x86_64-'<'VERSION'>'.run\nchmod +x NVIDIA-Linux-x86_64-'<'VERSION'>'.run",
|
||||
"firstPassBody": "First pass — this disables <code>nouveau</code> and prepares the system:",
|
||||
"firstPassCode": "./NVIDIA-Linux-x86_64-'<'VERSION'>'.run --no-questions --ui=none --disable-nouveau\nreboot",
|
||||
"secondPassBody": "After the host comes back, run the installer again to compile and install the kernel module:",
|
||||
"secondPassCode": "/opt/nvidia/NVIDIA-Linux-x86_64-'<'VERSION'>'.run --no-questions --ui=none",
|
||||
"modulesHeading": "2.3 Load NVIDIA modules at boot",
|
||||
"modulesBody": "Edit the modules-load configuration:",
|
||||
"modulesEditCode": "nano /etc/modules-load.d/modules.conf",
|
||||
"modulesAddBody": "Add the VFIO and NVIDIA modules:",
|
||||
"modulesAddCode": "vfio\nvfio_iommu_type1\nvfio_pci\nvfio_virqfd\nnvidia\nnvidia_uvm",
|
||||
"modulesSaveBody": "Save (<code>Ctrl+X</code>) and rebuild initramfs:",
|
||||
"modulesSaveCode": "update-initramfs -u -k all",
|
||||
"udevHeading": "2.4 Create udev rules",
|
||||
"udevBody": "So that <code>/dev/nvidia*</code> device nodes are created when the modules load:",
|
||||
"udevEditCode": "nano /etc/udev/rules.d/70-nvidia.rules",
|
||||
"udevRulesCode": "# /etc/udev/rules.d/70-nvidia.rules\n# Create /dev/nvidia0, /dev/nvidia1 ... and /dev/nvidiactl when nvidia module is loaded\nKERNEL==\"nvidia\", RUN+=\"/bin/bash -c ''/usr/bin/nvidia-smi -L''\"\n\n# Create the CUDA node when nvidia_uvm CUDA module is loaded\nKERNEL==\"nvidia_uvm\", RUN+=\"/bin/bash -c ''/usr/bin/nvidia-modprobe -c0 -u''\"",
|
||||
"udevSaveBody": "Save (<code>Ctrl+X</code>)."
|
||||
},
|
||||
"persistence": {
|
||||
"heading": "3. NVIDIA driver persistence service",
|
||||
"body": "The persistence daemon keeps the GPU initialised between uses, which avoids the latency hit and occasional state loss that happens when the kernel module is loaded and unloaded repeatedly:",
|
||||
"installCode": "cd /opt/nvidia\ngit clone https://github.com/NVIDIA/nvidia-persistenced.git\ncd nvidia-persistenced/init\n./install.sh\nreboot",
|
||||
"verifyBody": "Verify the driver is loaded and the service is running after reboot:",
|
||||
"verifySmiCode": "nvidia-smi",
|
||||
"smiImageAlt": "NVIDIA SMI output",
|
||||
"verifyServiceCode": "systemctl status nvidia-persistenced",
|
||||
"serviceImageAlt": "NVIDIA persistence service status"
|
||||
},
|
||||
"nvenc": {
|
||||
"heading": "4. (Optional) Lift the NVENC concurrent-session limit",
|
||||
"body": "Consumer NVIDIA GPUs ship with a hardcoded limit on the number of simultaneous NVENC encoding sessions (typically 3, 5 or 8 depending on generation). The keylase patch removes that restriction. Useful when running Plex / Jellyfin / Frigate transcoding workloads.",
|
||||
"code": "cd /opt/nvidia\ngit clone https://github.com/keylase/nvidia-patch.git\ncd nvidia-patch\n./patch.sh",
|
||||
"imageAlt": "NVIDIA patch application",
|
||||
"after": "The patch must be re-applied after every driver update. The keylase repo also includes <code>patch-fbc.sh</code> for the FBC (frame buffer capture) limit if you need it."
|
||||
},
|
||||
"lxcSetup": {
|
||||
"heading": "5. Configure an LXC container to use the GPU",
|
||||
"identifyHeading": "5.1 Identify the device numbers",
|
||||
"identifyBody": "On the host:",
|
||||
"identifyCode": "ls -l /dev/nv*",
|
||||
"identifyImageAlt": "NVIDIA device list",
|
||||
"identifyNote": "Note the major numbers — they vary between systems. Typical values:",
|
||||
"tableHeaders": {
|
||||
"device": "Device",
|
||||
"major": "Typical major"
|
||||
},
|
||||
"tableRows": [
|
||||
{ "device": "<code>/dev/nvidia0</code>, <code>/dev/nvidiactl</code>", "major": "195" },
|
||||
{ "device": "<code>/dev/nvidia-uvm</code>, <code>/dev/nvidia-uvm-tools</code>", "major": "509 (varies)" },
|
||||
{ "device": "<code>/dev/dri/*</code>", "major": "226" },
|
||||
{ "device": "<code>/dev/nvidia-modeset</code>", "major": "195 (shares with nvidia)" }
|
||||
],
|
||||
"editHeading": "5.2 Edit the LXC config",
|
||||
"editBody": "Stop the container first if it's running. Open its config file (replace <code>'<'CTID'>'</code> with the container ID):",
|
||||
"editCode": "nano /etc/pve/lxc/'<'CTID'>'.conf",
|
||||
"editConfigBody": "Comment out any pre-existing <code>lxc.cgroup2.devices.allow</code> or <code>/dev/dri</code> lines that conflict, then append the NVIDIA wiring (adjust the major numbers to match what <code>ls -l /dev/nv*</code> showed on <strong>your</strong> host):",
|
||||
"editConfigCode": "lxc.cgroup2.devices.allow: c 195:* rwm\nlxc.cgroup2.devices.allow: c 509:* rwm\nlxc.cgroup2.devices.allow: c 10:* rwm\nlxc.cgroup2.devices.allow: c 238:* rwm\nlxc.mount.entry: /dev/nvidia0 dev/nvidia0 none bind,optional,create=file\nlxc.mount.entry: /dev/nvidiactl dev/nvidiactl none bind,optional,create=file\nlxc.mount.entry: /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file\nlxc.mount.entry: /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file\nlxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file\nlxc.mount.entry: /dev/nvram dev/nvram none bind,optional,create=file",
|
||||
"editConfigImageAlt": "LXC configuration",
|
||||
"editSave": "Save (<code>Ctrl+X</code>) and start the container.",
|
||||
"installCtHeading": "5.3 Install the driver inside the container",
|
||||
"installCtCalloutTitle": "Important",
|
||||
"installCtCalloutBody": "This part runs <strong>inside</strong> the container, not on the host.",
|
||||
"installCtBody": "The kernel module is already loaded by the host — the container only needs the userland libraries that match the same driver version:",
|
||||
"installCtCode": "mkdir -p /opt/nvidia\ncd /opt/nvidia\nwget https://download.nvidia.com/XFree86/Linux-x86_64/'<'VERSION'>'/NVIDIA-Linux-x86_64-'<'VERSION'>'.run\nchmod +x NVIDIA-Linux-x86_64-'<'VERSION'>'.run\n./NVIDIA-Linux-x86_64-'<'VERSION'>'.run --no-kernel-module",
|
||||
"installCtAfter": "Accept the defaults at every prompt.",
|
||||
"installCtImageAlt": "NVIDIA driver installation",
|
||||
"verifyCtHeading": "5.4 Verify inside the container",
|
||||
"verifyCtSmiCode": "nvidia-smi",
|
||||
"verifyCtSmiImageAlt": "NVIDIA SMI in LXC",
|
||||
"verifyCtLsCode": "ls -l /dev/nv*",
|
||||
"verifyCtLsImageAlt": "NVIDIA devices in LXC",
|
||||
"verifyCtAfter": "You should see the GPU listed and the device nodes mounted into the container's filesystem.",
|
||||
"workloadHeading": "5.5 Confirm a real workload picks up the GPU",
|
||||
"workloadBody": "For Plex / Jellyfin, transcode a video and check the dashboard / logs — hardware-accelerated transcoding is now active.",
|
||||
"workloadImage1Alt": "Plex using NVIDIA GPU",
|
||||
"workloadImage2Alt": "Plex using NVIDIA GPU - active session",
|
||||
"repeatNote": "To wire the GPU into another container, repeat <strong>section 5</strong> for each additional CTID. The driver install inside the container only needs to be done once per container."
|
||||
},
|
||||
"docker": {
|
||||
"heading": "6. (Optional) NVIDIA Docker inside an LXC",
|
||||
"body": "If the container runs Docker and you want containers-inside-the-container to use the GPU, install <code>nvidia-docker2</code>. From inside the LXC:",
|
||||
"code": "wget https://raw.githubusercontent.com/MacRimi/manuales/main/NVIDIA/nvidia-docker.sh\nchmod +x nvidia-docker.sh\n./nvidia-docker.sh",
|
||||
"after": "The script handles the repository setup, package install and Docker daemon configuration in one go."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Troubleshooting",
|
||||
"items": [
|
||||
"<strong><code>nvidia-smi</code> on the host shows the GPU, but inside the container it errors with \"No devices found\":</strong> the driver versions don't match. Re-download the same <code>'<'VERSION'>'</code> inside the container and run with <code>--no-kernel-module</code>.",
|
||||
"<strong>Driver compile fails on the host with \"No precompiled kernel interface was found\":</strong> kernel headers are missing or out of sync. Re-run <code>apt-get install pve-headers-$(uname -r)</code> and confirm <code>uname -r</code> matches the running kernel.",
|
||||
"<strong>NVENC sessions still capped after applying the patch:</strong> the patch was overwritten by a driver update. Re-run <code>./patch.sh</code> from <code>/opt/nvidia/nvidia-patch</code>.",
|
||||
"<strong>GPU stops responding after a few hours of idle:</strong> persistence daemon isn't running. Check with <code>systemctl status nvidia-persistenced</code> and start / enable it.",
|
||||
"<strong>Container starts but <code>ls /dev/nv*</code> shows nothing:</strong> the major numbers in the LXC config don't match the host's. Re-run <code>ls -l /dev/nv*</code> on the host and adjust the <code>lxc.cgroup2.devices.allow</code> lines accordingly."
|
||||
]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user