mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-06-15 04:47:00 +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:
145
web/messages/en/docs/utils/export-vm.json
Normal file
145
web/messages/en/docs/utils/export-vm.json
Normal file
@@ -0,0 +1,145 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Export VM to OVA / OVF | ProxMenux Documentation",
|
||||
"description": "Export a Proxmox VM to a portable OVA archive or OVF directory using the standard DMTF schema. VMDK disks in streamOptimized format, SHA1 manifest. Importable on VMware ESXi / Workstation / Fusion, VirtualBox and back into Proxmox.",
|
||||
"ogTitle": "Export VM to OVA / OVF | ProxMenux Documentation",
|
||||
"ogDescription": "Convert a Proxmox VM into a portable OVA / OVF package compatible with VMware and VirtualBox."
|
||||
},
|
||||
"header": {
|
||||
"title": "Export VM to OVA / OVF",
|
||||
"description": "Converts a Proxmox VM to a portable OVA (single TAR archive) or OVF (descriptor + VMDK files) package using the standard DMTF OVF schema. Disks are converted with qemu-img to streamOptimized VMDK. The result is importable on VMware (ESXi / Workstation / Fusion), VirtualBox and back into Proxmox via the import tool.",
|
||||
"section": "Utilities"
|
||||
},
|
||||
"intro": {
|
||||
"title": "What this does",
|
||||
"body": "Reads a stopped VM's config, converts each disk to streamOptimized VMDK, generates an OVF descriptor and a SHA1 manifest, and packages everything as either a single <code>.ova</code> file or an <code>-ovf</code> directory. The source VM is never modified."
|
||||
},
|
||||
"picker": {
|
||||
"heading": "VM picker",
|
||||
"body": "On launch, the script lists every VM from <code>qm list</code> with VMID, name and status. Pick the one to export:",
|
||||
"imgAlt": "Export VM picker dialog listing all VMs"
|
||||
},
|
||||
"stopped": {
|
||||
"heading": "VM must be stopped",
|
||||
"intro": "A consistent disk image requires a stopped VM. If the selected VM is running, ProxMenux offers to stop it:",
|
||||
"items": [
|
||||
"Graceful shutdown via <code>qm shutdown $VMID --timeout 120</code> (waits 2 min for guest ACPI shutdown).",
|
||||
"If timeout, offers force stop: <code>qm stop $VMID</code> (equivalent to power-off).",
|
||||
"If you decline both, the export is aborted — no data is touched."
|
||||
],
|
||||
"warnTitle": "Force-stop is power-off",
|
||||
"warnBody": "<code>qm stop</code> is equivalent to yanking the power. The guest may need filesystem repair on its next boot. Prefer the graceful shutdown when possible; reserve force stop for unresponsive guests."
|
||||
},
|
||||
"format": {
|
||||
"heading": "Format selector: OVA vs OVF",
|
||||
"headerFormat": "Format",
|
||||
"headerOutput": "Output",
|
||||
"headerPros": "Pros",
|
||||
"headerCons": "Cons",
|
||||
"rows": [
|
||||
{
|
||||
"format": "OVA",
|
||||
"output": "name-vmid-ts.ova",
|
||||
"pros": "Single file — easy to move, sftp, attach to a ticket. Self-contained.",
|
||||
"cons": "Needs ~220% of virtual disk size (TAR overhead during creation)."
|
||||
},
|
||||
{
|
||||
"format": "OVF",
|
||||
"output": "name-vmid-ts-ovf/",
|
||||
"pros": "~120% disk overhead. Easier to inspect (descriptor is plain XML). Can edit before importing.",
|
||||
"cons": "Multiple files — must transfer all of them together."
|
||||
}
|
||||
]
|
||||
},
|
||||
"destination": {
|
||||
"heading": "Destination directory",
|
||||
"body": "Pick from presets (<code>/var/lib/vz/dump</code>, <code>/var/lib/vz/template/iso</code>) or enter a manual path. The script validates the directory is writeable and warns if free space looks tight before starting.",
|
||||
"calloutTitle": "Free space rule of thumb",
|
||||
"calloutBody": "For an OVF export of a VM with disks totalling 100 GB virtual: budget ~120 GB free. For an OVA: budget ~220 GB. Sparse / mostly-empty disks may use less, but the conversion writes them out fully before the OVA TAR step compresses anything. If you run out of space mid-export, the temp directory is cleaned up by the EXIT trap and you start over."
|
||||
},
|
||||
"package": {
|
||||
"heading": "What ends up in the package",
|
||||
"intro": "For an OVA / OVF named <code>myvm-100-2026-04-26_18-30-15</code>:",
|
||||
"code": "# OVA mode (single .ova file is a TAR of):\nmyvm-100-2026-04-26_18-30-15.ovf # XML descriptor (DMTF OVF 1.0 + RASD + VSSD)\nmyvm-100-2026-04-26_18-30-15.mf # SHA1 manifest\nmyvm-100-2026-04-26_18-30-15-disk0.vmdk\nmyvm-100-2026-04-26_18-30-15-disk1.vmdk\n...\n\n# OVF mode (a directory):\nmyvm-100-2026-04-26_18-30-15-ovf/\n├── myvm-100-2026-04-26_18-30-15.ovf\n├── myvm-100-2026-04-26_18-30-15.mf\n├── myvm-100-2026-04-26_18-30-15-disk0.vmdk\n└── myvm-100-2026-04-26_18-30-15-disk1.vmdk"
|
||||
},
|
||||
"exported": {
|
||||
"heading": "What gets exported",
|
||||
"items": [
|
||||
"<strong>Disks:</strong> all <code>scsi*</code>, <code>sata*</code>, <code>virtio*</code>, <code>ide*</code> entries in the VM config, converted to streamOptimized VMDK.",
|
||||
"<strong>vCPU count</strong> (RASD ResourceType 3) and <strong>memory</strong> in MiB (ResourceType 4).",
|
||||
"<strong>Number of NICs</strong> (ResourceType 10 — count only, not the bridge or model).",
|
||||
"<strong>VM name</strong> and a hint of OS type."
|
||||
],
|
||||
"notTitle": "What is NOT exported",
|
||||
"notItems": [
|
||||
"CD-ROM / ISO mounts (excluded by design).",
|
||||
"Cloud-init drives (excluded by design).",
|
||||
"Specific NIC bridge / model (only the count is preserved).",
|
||||
"BIOS / UEFI choice — must be reset on import.",
|
||||
"PCI passthrough configuration.",
|
||||
"Snapshots — only the current state is captured.",
|
||||
"VM-level options (NUMA, hugepages, hotplug, …)."
|
||||
]
|
||||
},
|
||||
"conversion": {
|
||||
"heading": "Disk conversion",
|
||||
"intro": "Each disk is converted with:",
|
||||
"code": "qemu-img convert -p -O vmdk -o subformat=streamOptimized \\\n \"$source_path\" \\\n \"$work_dir/<base_name>-disk<N>.vmdk\"",
|
||||
"outro": "<code>streamOptimized</code> is VMware's single-pass readable format — supported by ESXi 6.7+, VMware Workstation, VirtualBox and obviously Proxmox itself. It's the most widely-compatible VMDK subformat and the right choice for portability. Trade-off: it's not randomly seekable, so you can't mount it directly without conversion."
|
||||
},
|
||||
"manifest": {
|
||||
"heading": "SHA1 manifest",
|
||||
"intro": "Every package includes a <code>.mf</code> file with SHA1 hashes of the OVF descriptor and each VMDK:",
|
||||
"code": "SHA1(myvm-100-2026-04-26_18-30-15.ovf)= 3a7bd3e2360a3d29eea436fcfb7e44c735d117c9\nSHA1(myvm-100-2026-04-26_18-30-15-disk0.vmdk)= b7e23ec29af22b0b4e41da31e868d57226121c84\nSHA1(myvm-100-2026-04-26_18-30-15-disk1.vmdk)= a87ff679a2f3e71d9181a67b7542122c",
|
||||
"outro": "Optional in the OVF spec — many readers ignore it — but useful for verifying the package made it across intact. Verify manually with <code>sha1sum -c file.mf</code>."
|
||||
},
|
||||
"import": {
|
||||
"heading": "Importing the result",
|
||||
"intro": "The exported package is consumable by:",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/utils/import-vm",
|
||||
"preRich": "<strong>Proxmox</strong> — use the matching ",
|
||||
"linkLabel": "Import VM from OVA / OVF",
|
||||
"tailRich": " tool."
|
||||
},
|
||||
{
|
||||
"tailRich": "<strong>VMware ESXi</strong> — Datacenter → Deploy OVF Template, point at the .ova or .ovf."
|
||||
},
|
||||
{
|
||||
"tailRich": "<strong>VMware Workstation / Fusion</strong> — File → Open, choose the .ova or .ovf."
|
||||
},
|
||||
{
|
||||
"tailRich": "<strong>VirtualBox</strong> — File → Import Appliance, choose the .ova or .ovf."
|
||||
}
|
||||
]
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Troubleshooting",
|
||||
"noSpaceTitle": "qemu-img convert fails halfway with \"No space left on device\"",
|
||||
"noSpaceBody": "Destination ran out of space. The temp directory is auto-cleaned by the EXIT trap. Pick a destination with more headroom (rule of thumb above) and re-run.",
|
||||
"unsupportedHwTitle": "Export completes but VMware refuses to import: \"Unsupported hardware family\"",
|
||||
"unsupportedHwBody": "Some ESXi versions reject OVF descriptors that declare a hardware family they don't recognise. Open the .ovf in a text editor (or extract the .ova first), find <code><vssd:VirtualSystemType></code> and edit it to a value ESXi accepts (e.g. <code>vmx-13</code> for ESXi 6.5+). For a quick workaround, try VirtualBox — it's more permissive.",
|
||||
"nicTitle": "Imported VM in VMware has e1000 NIC but I want VirtIO",
|
||||
"nicBody": "Expected — the OVF only stores the NIC count, not the model. Edit the imported VM's NIC settings in VMware after import. Same applies for SCSI controller (export uses lsilogic for VMware compatibility; change to <code>VirtIO SCSI</code> if your guest supports it).",
|
||||
"runningTitle": "VM was running and I declined to stop it — export aborted",
|
||||
"runningBody": "The script can't produce a consistent image while disks are being written. Either accept the shutdown prompt next time, or stop the VM manually first (<code>qm shutdown $VMID</code>) and re-run.",
|
||||
"slowTitle": "Disk conversion is slow",
|
||||
"slowBody": "<code>qemu-img convert</code> is single-threaded and reads the source at full speed. For a 100 GB disk on spinning rust, expect 15-30 minutes. NVMe to NVMe is 5-10x faster. Multi-disk VMs convert sequentially — time scales linearly with total virtual size."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Related",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/utils/import-vm",
|
||||
"label": "Import VM from OVA / OVF",
|
||||
"tail": " — the round-trip partner."
|
||||
},
|
||||
{
|
||||
"href": "/docs/utils",
|
||||
"label": "Utilities overview",
|
||||
"tail": " — back to the section overview."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
218
web/messages/en/docs/utils/import-vm.json
Normal file
218
web/messages/en/docs/utils/import-vm.json
Normal file
@@ -0,0 +1,218 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Import VM from OVA / OVF | ProxMenux Documentation",
|
||||
"description": "Import a VMware ESXi / Workstation / Fusion / VirtualBox / ProxMenux VM into Proxmox VE. Auto-extracts OVA, parses OVF metadata, creates the VM and imports each disk as the storage-native format (qcow2 / raw).",
|
||||
"ogTitle": "Import VM from OVA / OVF | ProxMenux Documentation",
|
||||
"ogDescription": "Bring VMs from VMware, VirtualBox or ProxMenux exports into Proxmox. Disks are auto-converted to the storage-native format."
|
||||
},
|
||||
"header": {
|
||||
"title": "Import VM from OVA / OVF",
|
||||
"description": "Imports an OVA / OVF package into Proxmox VE: extracts OVA archives, parses the OVF descriptor for vCPU / memory / NIC count and disk references, then creates the VM and imports each disk via qm importdisk to the chosen storage. Compatible with exports from VMware (ESXi / Workstation / Fusion), VirtualBox and ProxMenux itself.",
|
||||
"section": "Utilities"
|
||||
},
|
||||
"intro": {
|
||||
"title": "What this does",
|
||||
"body": "Drops a complete VM into Proxmox from a portable package. After import, the VM is ready to start — but a few post-import touch-ups (NIC model, firmware, OS-type validation) are recommended for performance and compatibility."
|
||||
},
|
||||
"picker": {
|
||||
"heading": "File picker",
|
||||
"intro": "On launch, the script offers two preset directories or a manual path:",
|
||||
"items": [
|
||||
"<code>/var/lib/vz/dump</code> — the default Proxmox vzdump backup directory.",
|
||||
"<code>/var/lib/vz/template/iso</code> — useful if you sftp'd the OVA there.",
|
||||
"Manual path — for OVA / OVF files anywhere else on the host."
|
||||
],
|
||||
"outro": "It then lists every <code>.ova</code> and <code>.ovf</code> file in the chosen directory.",
|
||||
"imageAlt": "Import VM file picker dialog"
|
||||
},
|
||||
"flow": {
|
||||
"heading": "How the import works",
|
||||
"nodes": [
|
||||
{
|
||||
"label": "OVA / OVF in",
|
||||
"detail": ".ova → tar xf to\n /tmp/.proxmenux-import-*\n.ovf → use in place",
|
||||
"variant": "source"
|
||||
},
|
||||
{
|
||||
"label": "Parse + dialogs",
|
||||
"detail": "AWK reads OVF\n(name, vCPU, RAM, NICs,\ndisks). User picks\nVMID / storage / bridge",
|
||||
"variant": "bridge"
|
||||
},
|
||||
{
|
||||
"label": "qm create + importdisk",
|
||||
"detail": "qm create $VMID\nqm importdisk\n(VMDK → qcow2)\nqm set --scsiN",
|
||||
"variant": "target"
|
||||
}
|
||||
]
|
||||
},
|
||||
"ovf": {
|
||||
"heading": "OVF parsing",
|
||||
"intro": "A <strong>gawk</strong> parser reads the OVF descriptor and pulls out the VM metadata. The parser uses the 3-argument form of <code>match()</code> which is gawk-specific (mawk — the default <code>awk</code> on Debian / Proxmox — does not support it). On the first import, the script auto-installs gawk via the canonical <code>ensure_repositories</code> + <code>install_single_package</code> pair if it's missing; subsequent imports start instantly. Fields extracted:",
|
||||
"headerField": "Field",
|
||||
"headerSource": "Source in OVF",
|
||||
"headerDefault": "Default if missing",
|
||||
"rows": [
|
||||
{
|
||||
"field": "VM name",
|
||||
"source": "<Name> (first match)",
|
||||
"default": "imported-vm"
|
||||
},
|
||||
{
|
||||
"field": "vCPU count",
|
||||
"source": "RASD ResourceType 3 → VirtualQuantity",
|
||||
"default": "1"
|
||||
},
|
||||
{
|
||||
"field": "Memory (MiB)",
|
||||
"source": "RASD ResourceType 4 → VirtualQuantity",
|
||||
"default": "1024"
|
||||
},
|
||||
{
|
||||
"field": "NIC count",
|
||||
"source": "count of ResourceType 10",
|
||||
"default": "1"
|
||||
},
|
||||
{
|
||||
"field": "OS type",
|
||||
"source": "/Linux/ or /Windows/ in description",
|
||||
"default": "other"
|
||||
},
|
||||
{
|
||||
"field": "Disk references",
|
||||
"source": "href attributes ending in .vmdk / .qcow2 / .img / .raw",
|
||||
"default": "none (import aborts)"
|
||||
}
|
||||
]
|
||||
},
|
||||
"memWarn": {
|
||||
"title": "Memory unit ambiguity",
|
||||
"body": "The parser <strong>assumes MiB</strong>. If the OVF declares memory in <em>GB</em> (e.g. some VMware exports do), the imported VM will have 1/1024th of the intended RAM. After import, double-check <code>qm config $VMID | grep memory</code> against the source VM's documented RAM and adjust with <code>qm set $VMID --memory <MiB></code> if it's off by a factor of 1024 or 1024²."
|
||||
},
|
||||
"dialog": {
|
||||
"heading": "Import dialog flow",
|
||||
"items": [
|
||||
"<strong>VMID</strong> — defaults to the next available (<code>pvesh get /cluster/nextid</code>).",
|
||||
"<strong>VM name</strong> — defaults to the parsed OVF name; you can override.",
|
||||
"<strong>Target storage</strong> — menu of all storages with <code>images</code> content (from <code>pvesm status -content images</code>).",
|
||||
"<strong>Network bridge</strong> — menu of bridges (from <code>ip link show type bridge</code>); auto-picks if only one exists; defaults to <code>vmbr0</code>.",
|
||||
"<strong>Confirmation</strong> — summary dialog with VMID, name, vCPU, memory, NICs, storage, bridge and the list of disks to be imported. Cancel here = nothing changes."
|
||||
]
|
||||
},
|
||||
"create": {
|
||||
"heading": "VM creation",
|
||||
"intro": "After confirmation, the script runs:",
|
||||
"code": "qm create $VMID \\\n --name \"$NAME\" \\\n --memory $MEMORY \\\n --cores $VCPU \\\n --ostype $OSTYPE \\\n --scsihw lsi \\\n --net0 e1000,bridge=$BRIDGE\n\n# For each additional NIC:\nqm set $VMID --netN e1000,bridge=$BRIDGE",
|
||||
"outro": "SCSI controller defaults to <code>lsi</code> (LSI Logic) for VMDK compatibility. NICs default to <code>e1000</code> (universal compatibility) on the chosen bridge."
|
||||
},
|
||||
"diskLoop": {
|
||||
"heading": "Disk import loop",
|
||||
"intro": "For each disk reference in the OVF:",
|
||||
"items": [
|
||||
"<code>qm importdisk $VMID $disk_path $STORAGE</code> — converts the VMDK to the storage-native format (e.g. qcow2 on local-lvm, raw on ZFS) and creates an <code>unusedN:</code> entry in the VM config.",
|
||||
"The script greps the config for the just-created <code>unusedN</code> reference.",
|
||||
"<code>qm set $VMID --scsiN $unused_disk</code> — attaches the disk as <code>scsi0</code>, <code>scsi1</code>, …",
|
||||
"<code>qm set $VMID --delete unusedN</code> — clears the now-redundant unused marker."
|
||||
],
|
||||
"outro": "Boot is set to the first SCSI disk: <code>qm set $VMID --boot c --bootdisk scsi0</code>."
|
||||
},
|
||||
"postImport": {
|
||||
"heading": "Recommended post-import touch-ups",
|
||||
"intro": "The import deliberately uses lowest-common-denominator settings to maximise the chance the VM boots first try. Once you confirm it boots, switch to better defaults via the Proxmox UI or CLI:",
|
||||
"headerSetting": "Setting",
|
||||
"headerDefault": "Default after import",
|
||||
"headerRecommended": "Recommended (if guest supports)",
|
||||
"rows": [
|
||||
{
|
||||
"setting": "NIC model",
|
||||
"default": "e1000",
|
||||
"recommended": "VirtIO (much faster, needs guest driver)"
|
||||
},
|
||||
{
|
||||
"setting": "SCSI controller",
|
||||
"default": "LSI",
|
||||
"recommended": "VirtIO SCSI single (modern Linux + Windows w/ VirtIO drivers)"
|
||||
},
|
||||
{
|
||||
"setting": "Firmware (BIOS / UEFI)",
|
||||
"default": "Proxmox default (BIOS)",
|
||||
"recommended": "Match the source VM's firmware (mismatched = won't boot)"
|
||||
},
|
||||
{
|
||||
"setting": "QEMU guest agent",
|
||||
"default": "Off",
|
||||
"recommendedRich": "On + install <code>qemu-guest-agent</code> in the guest (better backups, IP reporting)"
|
||||
},
|
||||
{
|
||||
"setting": "OS type",
|
||||
"default": "l26 / win10 / other (heuristic)",
|
||||
"recommended": "Verify against the actual guest OS"
|
||||
},
|
||||
{
|
||||
"setting": "Display",
|
||||
"default": "Default",
|
||||
"recommended": "VirtIO-GPU or SPICE (better console performance)"
|
||||
}
|
||||
]
|
||||
},
|
||||
"fwWarn": {
|
||||
"title": "Firmware mismatch = no boot",
|
||||
"body": "If the source VM was UEFI but Proxmox creates it as BIOS (or vice-versa), the guest will not find a bootable disk. Check the OVF or the original VM's settings for <em>FirmwareType / firmware</em> and set the same in Proxmox: <code>qm set $VMID --bios ovmf</code> for UEFI; default is <code>seabios</code> for BIOS."
|
||||
},
|
||||
"notImported": {
|
||||
"heading": "What is NOT imported",
|
||||
"items": [
|
||||
"<strong>Specific NIC bridges</strong> — only the count. All NICs land on the bridge you picked at import time.",
|
||||
"<strong>NIC model</strong> — defaults to e1000.",
|
||||
"<strong>BIOS / UEFI firmware type</strong> — defaults to Proxmox default (BIOS).",
|
||||
"<strong>PCI passthrough configuration</strong>.",
|
||||
"<strong>TPM</strong> (vTPM).",
|
||||
"<strong>Cloud-init</strong> drives.",
|
||||
"<strong>Snapshots</strong> — only the current state.",
|
||||
"<strong>USB / serial / parallel devices</strong> declared in the OVF.",
|
||||
"<strong>VM tags / notes / start-on-boot</strong> options."
|
||||
]
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Troubleshooting",
|
||||
"orphanTitle": "VM was created but disk import failed — orphan VM left behind",
|
||||
"orphanIntro": "Known limitation. The script doesn't auto-clean a partial import. Destroy the orphan with:",
|
||||
"orphanCode": "qm destroy $VMID --destroy-unreferenced-disks 1",
|
||||
"orphanOutro": "Then fix the underlying cause (likely disk space on the target storage) and re-import.",
|
||||
"memTitle": "Imported VM has 8 MB of RAM (or 8 TB)",
|
||||
"memIntro": "Memory unit ambiguity in the OVF parser. Off by a factor of 1024 → OVF used GB instead of MiB. Fix:",
|
||||
"memCode": "qm set $VMID --memory 8192 # 8 GiB",
|
||||
"bootTitle": "Imported VM doesn't boot — \"No bootable device\"",
|
||||
"bootIntro": "Most common cause: BIOS / UEFI mismatch. The VM was UEFI but Proxmox created it as BIOS. Set the matching firmware:",
|
||||
"bootCode": "qm set $VMID --bios ovmf # UEFI\n# also add an EFI disk for the EFI vars:\nqm set $VMID --efidisk0 $STORAGE:1,format=qcow2,efitype=4m,pre-enrolled-keys=1",
|
||||
"bootOutro": "Second-most-common: boot order points at scsi0 but the actual OS disk is scsi1. Edit the boot order in the VM Options tab.",
|
||||
"bsodTitle": "VMware-exported Windows VM imports but BSODs on first boot",
|
||||
"bsodBody": "Windows is sensitive to disk controller changes. Either: (a) install VirtIO drivers <em>before</em> exporting from VMware, or (b) keep the SCSI controller as <code>lsi</code> (the default) and only switch to VirtIO SCSI after the guest boots and you can install the VirtIO drivers in Windows.",
|
||||
"zeroTitle": "OVF parser reports 0 disks",
|
||||
"zeroBody": "The OVF descriptor uses an unusual disk reference style. Open the .ovf in a text editor and confirm each disk has a <code><File ovf:href=\"...vmdk\" ...></code> entry. If the file extension is unusual (e.g. just <code>.dat</code>), rename it to <code>.vmdk</code> and update the OVF reference, then re-run.",
|
||||
"awkTitle": "awk: syntax error at or near , — parser fails on every OVA / OVF",
|
||||
"awkIntro": "The OVF parser uses gawk-specific syntax (3-argument <code>match()</code>) which mawk — the default <code>awk</code> on Debian / Proxmox — does not support. Recent versions of the script auto-install gawk on first use via the canonical <code>ensure_repositories</code> + <code>install_single_package</code> pair; if you're running an older copy, install it manually:",
|
||||
"awkCode": "apt-get install -y gawk",
|
||||
"awkOutro": "Then re-run the import.",
|
||||
"netTitle": "Network not working after first boot",
|
||||
"netBody": "The NIC model in Proxmox (e1000) may not match what the guest OS has drivers for, or the bridge you chose isn't the right one. From the VM's Hardware tab in Proxmox UI: change Network Device → Model. Also check <code>ip a</code> inside the guest — sometimes the interface comes up with a different name (eth0 vs ens18) and the guest's network config still references the old one."
|
||||
},
|
||||
"files": {
|
||||
"heading": "Files involved",
|
||||
"code": "scripts/utilities/import_vm_ova_ovf.sh # this script\n/tmp/.proxmenux-import-*/ # temp extraction dir for OVA\n/etc/pve/nodes/<node>/qemu-server/<vmid>.conf # created by qm create\n<storage>/<vmid>/<vmid>-disk-<n>.<fmt> # disk images, format depends on storage"
|
||||
},
|
||||
"related": {
|
||||
"heading": "Related",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/utils/export-vm",
|
||||
"label": "Export VM to OVA / OVF",
|
||||
"tail": " — the round-trip partner."
|
||||
},
|
||||
{
|
||||
"href": "/docs/utils",
|
||||
"label": "Utilities overview",
|
||||
"tail": " — back to the section overview."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
115
web/messages/en/docs/utils/index.json
Normal file
115
web/messages/en/docs/utils/index.json
Normal file
@@ -0,0 +1,115 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Proxmox Utilities — UUP Dump, PVE 8 to 9 Upgrade, OVA Export/Import | ProxMenux",
|
||||
"description": "Day-to-day Proxmox VE utilities: build Windows ISOs from UUP Dump, install curated CLI tools, run a safe Proxmox system update, perform the major-version PVE 8 to PVE 9 upgrade, export VMs to OVA / OVF and import OVA / OVF VMs from VMware or VirtualBox.",
|
||||
"ogTitle": "Proxmox Utilities — UUP Dump, PVE 8 to 9 Upgrade, OVA Export/Import",
|
||||
"ogDescription": "Build Windows ISOs, install CLI tools, run a safe update, upgrade PVE 8 to PVE 9, export / import OVA / OVF VMs.",
|
||||
"twitterTitle": "Proxmox Utilities | ProxMenux",
|
||||
"twitterDescription": "ISO creation, CLI tools, Proxmox update, PVE 8→9 upgrade, OVA / OVF VM portability."
|
||||
},
|
||||
"header": {
|
||||
"title": "Utilities & Tools",
|
||||
"description": "Six tools that round out the day-to-day Proxmox VE workflow: ISO creation, system maintenance and VM portability. Each option is independent — pick the one you need; nothing is installed until you ask for it.",
|
||||
"section": "Utilities"
|
||||
},
|
||||
"intro": {
|
||||
"title": "What this menu is for",
|
||||
"body": "Three groups of unrelated but commonly-needed tools: <strong>build a Windows ISO</strong> from UUP Dump, <strong>maintain the Proxmox host</strong> (CLI utilities, updates, the major-version upgrade), and <strong>move VMs in and out</strong> of Proxmox using the standard OVA / OVF format."
|
||||
},
|
||||
"opening": {
|
||||
"heading": "Opening the menu",
|
||||
"body": "From ProxMenux's main menu, select <strong>Utilities</strong>. You will see this:",
|
||||
"imageAlt": "Utilities menu with UUP Dump, system utilities, update, upgrade, export and import"
|
||||
},
|
||||
"groups": {
|
||||
"heading": "Three tool groups",
|
||||
"intro": "The six tools fall into three independent groups. Click a card below to jump to the matching section.",
|
||||
"iso": {
|
||||
"title": "ISO creation",
|
||||
"body": "Build official Windows ISOs from UUP Dump on the Proxmox host itself.",
|
||||
"bullets": [
|
||||
"UUP Dump shared link → bootable ISO",
|
||||
"Dependencies installed automatically",
|
||||
"Result drops into Proxmox's ISO template path"
|
||||
]
|
||||
},
|
||||
"maintenance": {
|
||||
"title": "System maintenance",
|
||||
"body": "Keep the host healthy: CLI tooling, regular updates, and the major-version upgrade when it's time.",
|
||||
"bullets": [
|
||||
"System Utilities Installer (26 CLI tools)",
|
||||
"Proxmox System Update (apt + dist-upgrade)",
|
||||
"PVE 8 → PVE 9 major upgrade"
|
||||
]
|
||||
},
|
||||
"portability": {
|
||||
"title": "VM portability",
|
||||
"body": "Move VMs in and out of Proxmox using the standard OVA / OVF format.",
|
||||
"bullets": [
|
||||
"Export Proxmox VM → OVA / OVF",
|
||||
"Import OVA / OVF → Proxmox VM",
|
||||
"Compatible with VMware and VirtualBox"
|
||||
]
|
||||
}
|
||||
},
|
||||
"upgradeWarn": {
|
||||
"title": "The PVE 8 → 9 upgrade is destructive and not reversible",
|
||||
"body": "A major-version upgrade rewrites the Debian base (Bookworm → Trixie) and the Proxmox stack in place. There is no rollback path — you need <strong>verified backups</strong> of every VM and CT and <strong>console / IPMI / iKVM access</strong> before you start. The upgrade tool refuses to run from the Proxmox web terminal for this reason."
|
||||
},
|
||||
"isoSection": {
|
||||
"heading": "ISO creation",
|
||||
"body": "Build a fresh, up-to-date Windows installation ISO directly on the Proxmox host. The script automates the whole UUP Dump flow: dependency install (aria2c, cabextract, wimlib-imagex, …), parallelised download of the update files via aria2, and conversion into a single bootable ISO that lands in <code>/var/lib/vz/template/iso</code> ready to attach to a VM.",
|
||||
"options": [
|
||||
{
|
||||
"title": "UUP Dump ISO Creator",
|
||||
"description": "Build an up-to-date Windows installation ISO from a UUP Dump shared link. Dependencies, download and conversion fully automated; the resulting ISO lands in /var/lib/vz/template/iso ready for VM creation.",
|
||||
"href": "/docs/utils/UUp-Dump-ISO-Creator"
|
||||
}
|
||||
]
|
||||
},
|
||||
"maintenanceSection": {
|
||||
"heading": "System maintenance",
|
||||
"body": "Three tools cover the day-to-day and once-in-a-while host work. <strong>System Utilities Installer</strong> sets up the CLI tools you actually use after a fresh install. <strong>Proxmox System Update</strong> is the weekly / monthly hygiene run. <strong>Upgrade PVE 8 to PVE 9</strong> is the once-per-major-cycle big move — handled with extra safety gates because it's not reversible.",
|
||||
"options": [
|
||||
{
|
||||
"title": "System Utilities Installer",
|
||||
"description": "Curated picker for 26 CLI tools (htop, btop, iperf3, jq, tmux, ncdu, ...) with custom selection or predefined groups (basic, dev, compression, multiplexers, analysis, network). Uses the canonical repo + verify-command flow.",
|
||||
"href": "/docs/utils/system-utils"
|
||||
},
|
||||
{
|
||||
"title": "Proxmox System Update",
|
||||
"description": "Repo hygiene + apt update + apt dist-upgrade with reboot prompt. Detects PVE major version (8 or 9) and routes to the matching worker. Switches to no-subscription, removes conflicting packages, runs autoremove.",
|
||||
"href": "/docs/utils/system-update"
|
||||
},
|
||||
{
|
||||
"title": "Upgrade PVE 8 to PVE 9",
|
||||
"description": "Major-version upgrade (Debian Bookworm → Trixie + PVE 8 → 9). Pre-flight checks, repository migration, automated or interactive mode, post-upgrade validation and reboot. Refuses to run from the web terminal.",
|
||||
"href": "/docs/utils/upgrade-pve8-pve9"
|
||||
}
|
||||
]
|
||||
},
|
||||
"portabilitySection": {
|
||||
"heading": "VM portability (OVA / OVF)",
|
||||
"body": "OVA and OVF are the cross-hypervisor packaging formats from the DMTF standard — supported by VMware, VirtualBox and Proxmox. The two tools are designed to round-trip: a VM exported from Proxmox can be imported back, and vice versa. Use them to migrate workloads off ESXi, take a portable backup of a VM, or share a prepared VM with someone running VirtualBox.",
|
||||
"options": [
|
||||
{
|
||||
"title": "Export VM to OVA / OVF",
|
||||
"description": "Convert a Proxmox VM into a portable OVA archive or OVF directory. Standard DMTF schema, SHA1 manifest, streamOptimized VMDK disks. Importable on VMware (ESXi / Workstation / Fusion), VirtualBox and back into Proxmox.",
|
||||
"href": "/docs/utils/export-vm"
|
||||
},
|
||||
{
|
||||
"title": "Import VM from OVA / OVF",
|
||||
"description": "Bring a VMware / VirtualBox / ProxMenux export back into Proxmox. Auto-extracts OVA, parses OVF metadata, creates the VM and imports each disk as the storage-native format.",
|
||||
"href": "/docs/utils/import-vm"
|
||||
}
|
||||
]
|
||||
},
|
||||
"diskSpaceCallout": {
|
||||
"title": "A note on disk space for export / import",
|
||||
"body": "Both tools convert disk formats: export uses <code>qemu-img convert -O vmdk -o subformat=streamOptimized</code>; import uses <code>qm importdisk</code> to convert back to the storage-native format (qcow2 / raw). Plan for <strong>~120% of virtual disk size</strong> for OVF and <strong>~220%</strong> for OVA — the conversion writes the full disk before any compression. Check the destination directory has the headroom before you start."
|
||||
},
|
||||
"fitsTogether": {
|
||||
"heading": "How the menu fits together",
|
||||
"body": "Each tool has a dedicated script under <code>scripts/utilities/</code>. The Proxmox System Update is a wrapper that delegates to one of two worker scripts in <code>scripts/global/</code> depending on the detected major version (PVE 8 or PVE 9). The PVE 8 → 9 upgrade exposes two extra menu actions inside its own flow — a stand-alone <em>Pre-upgrade check</em> (runs <code>pve8to9 --full</code>) and a read-only <em>Manual upgrade guide</em> (17-step runbook) — for users who want to inspect or operate by hand instead of the automated path."
|
||||
}
|
||||
}
|
||||
162
web/messages/en/docs/utils/system-update.json
Normal file
162
web/messages/en/docs/utils/system-update.json
Normal file
@@ -0,0 +1,162 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Proxmox System Update | ProxMenux Documentation",
|
||||
"description": "Runs the official Proxmox upgrade sequence (apt update + apt full-upgrade -y) and adds the repo hygiene, essential-package check, LVM sanity scan, autoremove/autoclean and reboot prompt that the upgrade guide also recommends. Detects the running major version automatically.",
|
||||
"ogTitle": "Proxmox System Update | ProxMenux Documentation",
|
||||
"ogDescription": "Official apt full-upgrade / dist-upgrade wrapped with repo hygiene, autoremove and a smart reboot prompt."
|
||||
},
|
||||
"header": {
|
||||
"title": "Proxmox System Update",
|
||||
"description": "Wrapper that detects the running Proxmox major version and delegates to the matching worker (PVE 8 or PVE 9). Repos are cleaned up, the no-subscription source is enabled, all packages are upgraded, conflicting packages are removed, and the system is cleaned up afterwards. A reboot prompt fires only when the kernel was actually updated.",
|
||||
"section": "Utilities"
|
||||
},
|
||||
"calloutWhat": {
|
||||
"title": "What this does",
|
||||
"body": "Brings the host to the latest patch level of its current major version. Does <strong>not</strong> upgrade across major versions — for PVE 8 → PVE 9 see <link>Upgrade PVE 8 to PVE 9</link>."
|
||||
},
|
||||
"official": {
|
||||
"heading": "The official Proxmox recommendation",
|
||||
"intro": "Proxmox's own upgrade guidance for a running host (within the same major version) is to run:",
|
||||
"code": "apt update && apt full-upgrade -y",
|
||||
"outro": "That one line is the official command on any current Proxmox release. The hard part isn't the upgrade itself; it's making sure the repositories are clean, the right ones are enabled, and the host is in a sensible state afterwards."
|
||||
},
|
||||
"onTop": {
|
||||
"heading": "What ProxMenux runs on top — verified against the script",
|
||||
"intro": "This option runs <strong>exactly</strong> the apt command above, wrapped with the repo hygiene and post-upgrade cleanup the official upgrade guide also recommends. The list below maps 1:1 to <code>scripts/utilities/proxmox_update.sh</code> and the per-version worker scripts — nothing implied, every step is in the code:",
|
||||
"items": [
|
||||
"<strong>Detects the PVE major version</strong> (<code>pveversion | grep -oP ''pve-manager/\\K[0-9]+''</code>) and dispatches to <code>update-pve8.sh</code> or <code>update-pve9_2.sh</code> so the right codename and repo URLs are used.",
|
||||
"<strong>Cleans up repositories</strong> before touching apt: disables the enterprise source (which 401s without a subscription), removes legacy repo files, and writes a clean no-subscription source for the host's codename.",
|
||||
"<strong>Runs the upgrade non-interactively</strong> with <code>DEBIAN_FRONTEND=noninteractive</code> and <code>--force-confdef --force-confold</code> — meaning if a configuration file you already modified also changed upstream, your version stays in place. No silent overwrites of custom configs.",
|
||||
"<strong>Installs essential Proxmox packages</strong> if any are missing (<code>zfsutils-linux</code>, <code>proxmox-backup-restore-image</code>, <code>chrony</code>).",
|
||||
"<strong>LVM metadata sanity check</strong> against stray PV headers from passthrough disks (warn-only, no automatic fix).",
|
||||
"<strong>Cleans up afterwards:</strong> <code>apt-get autoremove -y</code> + <code>apt-get autoclean -y</code>.",
|
||||
"<strong>Reboot prompt</strong> only if the kernel actually changed (<code>/var/run/reboot-required</code> present or <code>linux-image</code> in the upgrade log)."
|
||||
]
|
||||
},
|
||||
"calloutOneSentence": {
|
||||
"title": "In one sentence",
|
||||
"body": "Same upgrade Proxmox tells you to run, plus the repo cleanup, the essential-package check, the LVM sanity scan, the autoremove/autoclean afterwards, and a reboot prompt only when it matters."
|
||||
},
|
||||
"confirm": {
|
||||
"heading": "Confirmation dialog",
|
||||
"intro": "Selecting the option opens a summary of what the worker will do, requiring an explicit confirmation:",
|
||||
"imageAlt": "Proxmox System Update confirmation dialog listing repo hygiene, package updates, cleanup"
|
||||
},
|
||||
"routes": {
|
||||
"heading": "How the wrapper routes",
|
||||
"nodes": {
|
||||
"source": {
|
||||
"label": "proxmox_update.sh",
|
||||
"detail": "pveversion |\ngrep -oP ''pve-manager/\\K[0-9]+''"
|
||||
},
|
||||
"bridge": {
|
||||
"label": "Worker selection",
|
||||
"detail": "PVE 8 → update-pve8.sh\nPVE 9 → update-pve9_2.sh"
|
||||
},
|
||||
"target": {
|
||||
"label": "Post-update",
|
||||
"detail": "apt-get autoremove\napt-get autoclean\nReboot prompt if needed"
|
||||
}
|
||||
}
|
||||
},
|
||||
"worker": {
|
||||
"heading": "What the worker does",
|
||||
"intro": "Both workers (<code>scripts/global/update-pve8.sh</code> for PVE 8 and <code>scripts/global/update-pve9_2.sh</code> for PVE 9) follow the same outline, with version-appropriate repo URLs and package names:",
|
||||
"items": [
|
||||
"<strong>Repo hygiene.</strong> Removes duplicate entries from <code>/etc/apt/sources.list</code> and <code>/etc/apt/sources.list.d/</code>. Comments out the enterprise repo if the host has no subscription and writes / enables the no-subscription source.",
|
||||
"<strong>Apt update + full-upgrade.</strong> Pulls the latest package lists and applies all available upgrades for the current major version, running with <code>DEBIAN_FRONTEND=noninteractive</code> and <code>--force-confdef --force-confold</code> so any configuration file you customised keeps its current contents when upstream also changed it.",
|
||||
"<strong>Essential packages check.</strong> Installs <code>zfsutils-linux</code>, <code>chrony</code>, <code>ifupdown2</code> and a few others if the host is missing them.",
|
||||
"<strong>LVM / storage sanity check.</strong> Repairs missing PV headers if detected.",
|
||||
"<strong>Conflicting package removal.</strong> Drops packages known to clash on Proxmox (e.g. some time-sync daemons that fight chrony)."
|
||||
]
|
||||
},
|
||||
"post": {
|
||||
"heading": "Post-update cleanup & reboot",
|
||||
"intro": "After the worker exits, the wrapper runs:",
|
||||
"code": "apt-get autoremove -y # drop unused dependencies pulled in by old packages\napt-get autoclean # drop downloaded .deb files no longer in the index",
|
||||
"afterCode": "Then it checks whether a reboot is needed. Two signals trigger the prompt:",
|
||||
"items": [
|
||||
"<code>/var/run/reboot-required</code> exists (created by the kernel package post-install hook)",
|
||||
"The update log contains <code>linux-image</code> entries (kernel was actually upgraded)"
|
||||
],
|
||||
"outro": "If either is true, a whiptail dialog asks <em>\"Some changes require a reboot to take effect. Do you want to restart now?\"</em>. Decline to keep running on the old kernel until you choose to reboot manually (e.g. during a planned maintenance window)."
|
||||
},
|
||||
"end": {
|
||||
"heading": "What you see at the end",
|
||||
"intro": "When the worker finishes, the terminal shows the cleanup output and (if the kernel changed) the reboot prompt:",
|
||||
"imageAlt": "Proxmox System Update completion summary with cleanup output and reboot prompt"
|
||||
},
|
||||
"calloutDeclineReboot": {
|
||||
"title": "Decline reboot only if you know why",
|
||||
"body": "Running on an old kernel after upgrading <code>linux-image-*</code> means you're on a half-upgraded system: userspace is new, kernel is old. Most of the time things work, but ZFS modules, IOMMU groups, KSMBD and any out-of-tree drivers will only match the kernel they were built for — a mismatch produces obscure failures. Reboot at the earliest sensible moment."
|
||||
},
|
||||
"noSub": {
|
||||
"heading": "When the no-subscription switch happens",
|
||||
"intro": "Proxmox ships hosts with the enterprise repo enabled by default. Without a paid subscription, that repo returns 401 on <code>apt-get update</code>. The worker detects this and:",
|
||||
"items": [
|
||||
"Comments out (or disables) <code>/etc/apt/sources.list.d/pve-enterprise.list</code> (or the deb822 equivalent)",
|
||||
"Writes <code>/etc/apt/sources.list.d/pve-no-subscription.list</code> (or the deb822 <code>proxmox.sources</code> for PVE 9) with the matching codename (<code>bookworm</code> for PVE 8, <code>trixie</code> for PVE 9)",
|
||||
"Re-runs <code>apt-get update</code>"
|
||||
],
|
||||
"outro": "If you have a paid subscription, comment out the no-subscription source and uncomment the enterprise one before running this option."
|
||||
},
|
||||
"cluster": {
|
||||
"heading": "Cluster considerations",
|
||||
"calloutTitle": "On clusters: update one node at a time",
|
||||
"calloutBody": "On a Proxmox cluster, run this option on <strong>one node at a time</strong> and wait for the reboot to complete before moving to the next. Migrate guests off the node first to avoid cluster-wide service disruption. Mixed minor versions (e.g. 8.4.1 and 8.4.5) work fine for hours; mixed running kernels can produce unexpected behaviour for HA-managed guests."
|
||||
},
|
||||
"doesnt": {
|
||||
"heading": "What it doesn't do",
|
||||
"items": [
|
||||
"<strong>Major-version upgrade.</strong> 8 → 9 is a separate operation — see <link>Upgrade PVE 8 to PVE 9</link>.",
|
||||
"<strong>Backup.</strong> No snapshots, no rollback. Apt operations are not transactional. Combine with your normal backup discipline (PBS, vzdump, ZFS snapshots).",
|
||||
"<strong>Container / VM updates.</strong> Only the host is upgraded; guests are left alone.",
|
||||
"<strong>Firmware updates.</strong> CPU microcode, NIC firmware, BIOS — out of scope."
|
||||
]
|
||||
},
|
||||
"troubleshooting": {
|
||||
"heading": "Troubleshooting",
|
||||
"items": [
|
||||
{
|
||||
"title": "apt update fails with 401 Unauthorized",
|
||||
"body": "The enterprise repo is still enabled but you don't have a subscription. The worker should detect and switch automatically; if it didn't, comment the line in <code>/etc/apt/sources.list.d/pve-enterprise.list</code> (or set <code>Enabled: false</code> in the deb822 <code>pve-enterprise.sources</code>) and re-run."
|
||||
},
|
||||
{
|
||||
"title": "dist-upgrade hangs at \"Configuring grub-pc\"",
|
||||
"body": "A dpkg prompt is asking which device(s) to install GRUB to. The wrapper passes <code>--force-confold</code> for config files but boot-loader install is a separate prompt. Use <kbd>Tab</kbd> + <kbd>Space</kbd> to select all your boot disks, then OK. Best avoided by selecting the boot disks once with <code>dpkg-reconfigure grub-pc</code> beforehand."
|
||||
},
|
||||
{
|
||||
"title": "Kernel upgraded but the new modules are missing for an out-of-tree driver",
|
||||
"body": "Out-of-tree modules (NVIDIA, ZFS via DKMS, custom NIC drivers) need to be rebuilt against the new kernel. Most are handled automatically by DKMS during the upgrade — confirm with <code>dkms status</code>. If something is missing: <code>dkms autoinstall</code>."
|
||||
},
|
||||
{
|
||||
"title": "The reboot prompt didn't appear but I'm sure the kernel changed",
|
||||
"body": "Two signals must agree (<code>/var/run/reboot-required</code> and <code>linux-image</code> in the upgrade log). If the marker file was cleared but the log is being parsed wrong, reboot manually with <code>shutdown -r now</code>. To confirm a kernel upgrade happened: <code>grep linux-image /var/log/apt/history.log</code>."
|
||||
}
|
||||
]
|
||||
},
|
||||
"files": {
|
||||
"heading": "Files involved",
|
||||
"code": "scripts/utilities/proxmox_update.sh # this script (wrapper)\nscripts/global/update-pve8.sh # worker for PVE 8 hosts\nscripts/global/update-pve9_2.sh # worker for PVE 9 hosts\nscripts/global/common-functions.sh # cleanup_duplicate_repos used by workers\n/etc/apt/sources.list # may be edited\n/etc/apt/sources.list.d/* # may be edited / created\n/var/run/reboot-required # read to decide on reboot prompt\n/var/log/apt/history.log # read to detect kernel changes"
|
||||
},
|
||||
"related": {
|
||||
"heading": "Related",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/utils/upgrade-pve8-pve9",
|
||||
"label": "Upgrade PVE 8 to PVE 9",
|
||||
"tail": " — for the major-version upgrade (different tool, different safety model)."
|
||||
},
|
||||
{
|
||||
"href": "/docs/utils/system-utils",
|
||||
"label": "System Utilities Installer",
|
||||
"tail": " — to install the CLI tools you want around updates (htop / btop / ncdu)."
|
||||
},
|
||||
{
|
||||
"href": "/docs/utils",
|
||||
"label": "Utilities overview",
|
||||
"tail": " — back to the section overview."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
257
web/messages/en/docs/utils/system-utils.json
Normal file
257
web/messages/en/docs/utils/system-utils.json
Normal file
@@ -0,0 +1,257 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "System Utilities Installer | ProxMenux Documentation",
|
||||
"description": "Curated installer for 26 CLI utilities (htop, btop, iperf3, jq, tmux, ncdu, ...) on Proxmox VE. Custom selection or predefined groups (basic, dev, compression, multiplexers, analysis, network). Uses the canonical ensure_repositories + install_single_package flow.",
|
||||
"ogTitle": "System Utilities Installer | ProxMenux Documentation",
|
||||
"ogDescription": "Install curated CLI tools on Proxmox VE with one click or custom selection."
|
||||
},
|
||||
"header": {
|
||||
"title": "System Utilities Installer",
|
||||
"description": "Curated picker for 26 CLI utilities defined in the canonical PROXMENUX_UTILS list. Offers custom selection, install-all, six predefined groups and a verify-installations check. Uses the shared ensure_repositories() + install_single_package() pair so repo configuration and per-package feedback stay consistent across the project.",
|
||||
"section": "Utilities"
|
||||
},
|
||||
"info": {
|
||||
"title": "What this does",
|
||||
"body": "Installs CLI tools from a curated list of 26 packages. Every installation goes through the same canonical flow: <code>ensure_repositories</code> sets up Proxmox + Debian repos for the running PVE major version, then <code>install_single_package</code> runs the install and verifies the resulting command is in PATH."
|
||||
},
|
||||
"opening": {
|
||||
"heading": "Opening the installer",
|
||||
"intro": "From the Utilities menu, choose <strong>System Utilities Installer</strong>. The main menu offers nine options:",
|
||||
"imageAlt": "System Utilities Installer menu with custom selection, ALL, predefined groups and verify"
|
||||
},
|
||||
"actions": {
|
||||
"heading": "The 9 menu actions",
|
||||
"headerOption": "Option",
|
||||
"headerBehaviour": "Behaviour",
|
||||
"rows": [
|
||||
{
|
||||
"option": "1. Custom selection",
|
||||
"behaviourRich": "Dialog checklist of all 26 packages. Use SPACE to toggle, ENTER to confirm; only the selected ones are installed."
|
||||
},
|
||||
{
|
||||
"option": "2. Install ALL utilities",
|
||||
"behaviourRich": "One-shot install of every package in <code>PROXMENUX_UTILS</code>. Use after a fresh Proxmox install."
|
||||
},
|
||||
{
|
||||
"option": "3. Basic",
|
||||
"behaviourRich": "<code>grc</code>, <code>htop</code>, <code>tree</code>, <code>curl</code>, <code>wget</code>"
|
||||
},
|
||||
{
|
||||
"option": "4. Development",
|
||||
"behaviourRich": "<code>git</code>, <code>vim</code>, <code>nano</code>"
|
||||
},
|
||||
{
|
||||
"option": "5. Compression",
|
||||
"behaviourRich": "<code>zip</code>, <code>unzip</code>, <code>rsync</code>"
|
||||
},
|
||||
{
|
||||
"option": "6. Terminal multiplexers",
|
||||
"behaviourRich": "<code>screen</code>, <code>tmux</code>"
|
||||
},
|
||||
{
|
||||
"option": "7. Analysis",
|
||||
"behaviourRich": "<code>jq</code>, <code>ncdu</code>, <code>iotop</code>"
|
||||
},
|
||||
{
|
||||
"option": "8. Network",
|
||||
"behaviourRich": "<code>iperf3</code>, <code>nethogs</code>, <code>nmap</code>, <code>tcpdump</code>, <code>lsof</code>"
|
||||
},
|
||||
{
|
||||
"option": "9. Verify installations",
|
||||
"behaviourRich": "Walks every entry in <code>PROXMENUX_UTILS</code>, checks if the verify command is in PATH, prints an Available / Missing summary."
|
||||
}
|
||||
]
|
||||
},
|
||||
"packages": {
|
||||
"heading": "The 26 packages",
|
||||
"intro": "Defined in the shared <code>scripts/global/utils-install-functions.sh</code> as <code>PROXMENUX_UTILS</code> (format: <code>package:verify_command:description</code>). Other ProxMenux scripts (e.g. the network monitoring launchers for iftop / iptraf-ng / iperf3) reuse entries from this list so package + verify command stay in sync.",
|
||||
"headerPackage": "Package",
|
||||
"headerVerify": "Verify command",
|
||||
"headerDescription": "Description",
|
||||
"rows": [
|
||||
{
|
||||
"package": "axel",
|
||||
"verify": "axel",
|
||||
"description": "Download accelerator"
|
||||
},
|
||||
{
|
||||
"package": "aria2",
|
||||
"verify": "aria2c",
|
||||
"description": "Multi-source downloader"
|
||||
},
|
||||
{
|
||||
"package": "btop",
|
||||
"verify": "btop",
|
||||
"description": "Modern resource monitor"
|
||||
},
|
||||
{
|
||||
"package": "cabextract",
|
||||
"verify": "cabextract",
|
||||
"description": "Extract CAB files"
|
||||
},
|
||||
{
|
||||
"package": "chntpw",
|
||||
"verify": "chntpw",
|
||||
"description": "Edit Windows registry / passwords"
|
||||
},
|
||||
{
|
||||
"package": "dos2unix",
|
||||
"verify": "dos2unix",
|
||||
"description": "Convert DOS / Unix text files"
|
||||
},
|
||||
{
|
||||
"package": "genisoimage",
|
||||
"verify": "genisoimage",
|
||||
"description": "Create ISO images"
|
||||
},
|
||||
{
|
||||
"package": "grc",
|
||||
"verify": "grc",
|
||||
"description": "Generic log colorizer"
|
||||
},
|
||||
{
|
||||
"package": "htop",
|
||||
"verify": "htop",
|
||||
"description": "Interactive process viewer"
|
||||
},
|
||||
{
|
||||
"package": "iftop",
|
||||
"verify": "iftop",
|
||||
"description": "Real-time network usage"
|
||||
},
|
||||
{
|
||||
"package": "intel-gpu-tools",
|
||||
"verify": "intel_gpu_top",
|
||||
"description": "Intel GPU tools"
|
||||
},
|
||||
{
|
||||
"package": "iotop",
|
||||
"verify": "iotop",
|
||||
"description": "Monitor disk I/O usage"
|
||||
},
|
||||
{
|
||||
"package": "iperf3",
|
||||
"verify": "iperf3",
|
||||
"description": "Network bandwidth testing"
|
||||
},
|
||||
{
|
||||
"package": "ipset",
|
||||
"verify": "ipset",
|
||||
"description": "Manage IP sets"
|
||||
},
|
||||
{
|
||||
"package": "iptraf-ng",
|
||||
"verify": "iptraf-ng",
|
||||
"description": "Network monitoring tool"
|
||||
},
|
||||
{
|
||||
"package": "libguestfs-tools",
|
||||
"verify": "virt-filesystems",
|
||||
"description": "VM disk utilities"
|
||||
},
|
||||
{
|
||||
"package": "msr-tools",
|
||||
"verify": "rdmsr",
|
||||
"description": "Access CPU MSRs"
|
||||
},
|
||||
{
|
||||
"package": "net-tools",
|
||||
"verify": "netstat",
|
||||
"description": "Legacy networking tools"
|
||||
},
|
||||
{
|
||||
"package": "plocate",
|
||||
"verify": "locate",
|
||||
"description": "Locate files quickly"
|
||||
},
|
||||
{
|
||||
"package": "s-tui",
|
||||
"verify": "s-tui",
|
||||
"description": "Stress-Terminal UI"
|
||||
},
|
||||
{
|
||||
"package": "sshpass",
|
||||
"verify": "sshpass",
|
||||
"description": "Non-interactive SSH login"
|
||||
},
|
||||
{
|
||||
"package": "tmux",
|
||||
"verify": "tmux",
|
||||
"description": "Terminal multiplexer"
|
||||
},
|
||||
{
|
||||
"package": "unzip",
|
||||
"verify": "unzip",
|
||||
"description": "Extract ZIP files"
|
||||
},
|
||||
{
|
||||
"package": "wimtools",
|
||||
"verify": "wimlib-imagex",
|
||||
"description": "Manage WIM images"
|
||||
},
|
||||
{
|
||||
"package": "zip",
|
||||
"verify": "zip",
|
||||
"description": "Create ZIP files"
|
||||
},
|
||||
{
|
||||
"package": "libguestfs-tools",
|
||||
"verify": "virt-filesystems",
|
||||
"description": "VM disk utilities"
|
||||
}
|
||||
]
|
||||
},
|
||||
"howItWorks": {
|
||||
"heading": "How a single package install works",
|
||||
"items": [
|
||||
"<code>ensure_repositories</code> detects PVE 8 or 9, writes Proxmox no-subscription + Debian sources files if missing, runs <code>apt-get update</code>.",
|
||||
"<code>install_single_package \"pkg\" \"verify_cmd\" \"description\"</code> runs <code>apt-get install -y \"$pkg\"</code> with feedback (<code>msg_info</code> / <code>msg_ok</code> / <code>msg_error</code>)."
|
||||
],
|
||||
"verifyIntro": "After install, the verify command is checked with <code>command -v \"$verify_cmd\"</code>. Three outcomes:",
|
||||
"verifyOutcomes": [
|
||||
"<strong>0 (success):</strong> command available, package counted as <em>Successful</em>.",
|
||||
"<strong>1 (failed):</strong> apt failed, counted as <em>Failed</em>.",
|
||||
"<strong>2 (warning):</strong> apt succeeded but command not yet in PATH (hash refresh pending) — counted as <em>With warnings</em>."
|
||||
],
|
||||
"summary": "At the end of a group / custom install, a summary dialog shows <em>Successful / With warnings / Failed</em> counts."
|
||||
},
|
||||
"verify": {
|
||||
"heading": "Verify installations",
|
||||
"intro": "Option 9 is read-only: it walks <code>PROXMENUX_UTILS</code> and runs <code>command -v</code> for each verify command. Output looks like this:",
|
||||
"code": "Total: 26\nAvailable: 18\nMissing: 8\n\n✓ axel - Download accelerator\n✓ aria2c - Multi-source downloader\n✓ btop - Modern resource monitor\n✗ cabextract - Extract CAB files\n✓ dos2unix - Convert DOS / Unix text files\n✗ genisoimage - Create ISO images\n✓ grc - Generic log colorizer\n...",
|
||||
"outro": "Useful before running scripts that depend on these tools (e.g. <code>uup_dump_iso_creator.sh</code> needs <code>aria2c</code> + <code>cabextract</code> + <code>wimlib-imagex</code>). If anything is missing, run the matching group install or pick the missing packages via custom selection."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Troubleshooting",
|
||||
"reposTitle": "\"Failed to configure repositories. Installation aborted.\"",
|
||||
"reposBody": "The host can't reach the Proxmox or Debian repos, or doesn't have the expected base config. From a console: <code>cat /etc/apt/sources.list /etc/apt/sources.list.d/*.sources</code> and <code>apt-get update</code> manually to see the actual error.",
|
||||
"warningsTitle": "A package is reported \"With warnings\" but the command works after I close the menu",
|
||||
"warningsBody": "Expected. After <code>apt-get install</code>, the new binary is on disk but the current shell's PATH cache (<code>hash -t</code>) doesn't know yet. ProxMenux runs <code>hash -r</code> after each install, but in some shells the refresh only takes effect on the next prompt. Open a new shell and the command will work.",
|
||||
"hangsTitle": "An apt install hangs",
|
||||
"hangsBody": "Most likely a debconf prompt is blocked behind the silenced output. The script wraps all apt calls with <code>DEBIAN_FRONTEND=noninteractive</code>, which usually suppresses prompts, but a few packages still require user input. Cancel with <kbd>Ctrl</kbd>+<kbd>C</kbd>, run <code>apt-get install -y <pkg></code> manually from a shell to see the prompt and decide."
|
||||
},
|
||||
"files": {
|
||||
"heading": "Files involved",
|
||||
"code": "scripts/utilities/system_utils.sh # this script\nscripts/global/utils-install-functions.sh # PROXMENUX_UTILS, ensure_repositories,\n # install_single_package\n/etc/apt/sources.list # may be touched by ensure_repositories\n/etc/apt/sources.list.d/proxmox.sources # created if missing (PVE 9)\n/etc/apt/sources.list.d/debian.sources # created if missing (PVE 9)\n/etc/apt/sources.list.d/pve-no-subscription.list # created if missing (PVE 8)"
|
||||
},
|
||||
"related": {
|
||||
"heading": "Related",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/utils/system-update",
|
||||
"label": "Proxmox System Update",
|
||||
"tailRich": " — for the actual <code>apt dist-upgrade</code> on the host."
|
||||
},
|
||||
{
|
||||
"href": "/docs/network/monitoring",
|
||||
"label": "Live monitoring tools (Network)",
|
||||
"tailRich": " — uses iftop / iptraf-ng / iperf3 from this same list."
|
||||
},
|
||||
{
|
||||
"href": "/docs/utils",
|
||||
"label": "Utilities overview",
|
||||
"tailRich": " — back to the section overview."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
335
web/messages/en/docs/utils/upgrade-pve8-pve9.json
Normal file
335
web/messages/en/docs/utils/upgrade-pve8-pve9.json
Normal file
File diff suppressed because one or more lines are too long
161
web/messages/en/docs/utils/uup-dump-iso-creator.json
Normal file
161
web/messages/en/docs/utils/uup-dump-iso-creator.json
Normal file
@@ -0,0 +1,161 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "UUP Dump ISO Creator | ProxMenux Documentation",
|
||||
"description": "Create an up-to-date Windows installation ISO on your Proxmox host using the ProxMenux UUP Dump ISO Creator. Automates dependency install, download and conversion of UUP files into a bootable ISO ready for VM creation.",
|
||||
"ogTitle": "UUP Dump ISO Creator | ProxMenux Documentation",
|
||||
"ogDescription": "Create an up-to-date Windows ISO from UUP Dump using ProxMenux. Dependencies, download and conversion are fully automated.",
|
||||
"ogImageAlt": "ProxMenux UUP Dump ISO Creator"
|
||||
},
|
||||
"header": {
|
||||
"title": "UUP Dump ISO Creator",
|
||||
"description": "Build an up-to-date Windows installation ISO on your Proxmox host using UUP Dump. ProxMenux handles the dependencies, downloads the UUP files in parallel, runs the official converter and drops the final ISO into the Proxmox ISO storage — ready to attach to a new Windows VM.",
|
||||
"section": "Utilities"
|
||||
},
|
||||
"intro": {
|
||||
"title": "What this script does",
|
||||
"body": "You provide a UUP Dump URL (the one uupdump.net generates after you pick the build, language and edition) and the script does the rest: installs any missing dependencies, downloads the UUP Dump converter, downloads every UUP payload file with aria2, assembles a bootable Windows ISO and moves it into the Proxmox ISO storage so the VM creator can mount it on first boot."
|
||||
},
|
||||
"hero": {
|
||||
"imageAlt": "UUP Dump ISO Creator entry in ProxMenux",
|
||||
"caption": "UUP Dump ISO Creator entry in ProxMenux"
|
||||
},
|
||||
"what": {
|
||||
"heading": "What is UUP Dump?",
|
||||
"intro": "UUP Dump is a community service that lets you download the raw Unified Update Platform (UUP) payloads that Windows Update itself uses to deliver Windows. Those payloads can be assembled back into a standard bootable ISO. It is the way to get:",
|
||||
"items": [
|
||||
"The very latest Windows build (including Insider Preview channels).",
|
||||
"A specific historical build that is no longer listed on Microsoft's download page.",
|
||||
"Clean, unmodified files sourced directly from Microsoft's servers.",
|
||||
"The exact combination of editions and languages you want in a single ISO."
|
||||
],
|
||||
"learnMore": "Learn more on the <extlink>UUP Dump project page</extlink>."
|
||||
},
|
||||
"automates": {
|
||||
"heading": "What the script automates"
|
||||
},
|
||||
"dependencies": {
|
||||
"heading": "Dependencies",
|
||||
"intro": "The first thing the script does is check for the tools needed to download UUP payloads and assemble the ISO. Any that are missing are installed with <code>apt-get</code>:",
|
||||
"headerPackage": "Package",
|
||||
"headerRole": "Role",
|
||||
"rows": [
|
||||
{
|
||||
"pkg": "curl",
|
||||
"roleRich": "HTTP fetches (converter bootstrap)."
|
||||
},
|
||||
{
|
||||
"pkg": "aria2",
|
||||
"roleRich": "Parallel downloader used for every UUP payload."
|
||||
},
|
||||
{
|
||||
"pkg": "cabextract",
|
||||
"roleRich": "Extracts Microsoft CAB packages."
|
||||
},
|
||||
{
|
||||
"pkg": "wimtools",
|
||||
"roleRich": "Builds <code>install.wim</code> (wimlib-imagex)."
|
||||
},
|
||||
{
|
||||
"pkg": "genisoimage",
|
||||
"roleRich": "Writes the final bootable ISO (or <code>mkisofs</code>)."
|
||||
},
|
||||
{
|
||||
"pkg": "chntpw",
|
||||
"roleRich": "Tweaks Windows registry hives during the build."
|
||||
}
|
||||
],
|
||||
"manualIntro": "Manual equivalent — if you ever need to install them yourself:",
|
||||
"manualCode": "apt-get install curl aria2 cabextract wimtools genisoimage chntpw"
|
||||
},
|
||||
"flow": {
|
||||
"heading": "Download and conversion",
|
||||
"steps": [
|
||||
"Detects the Proxmox ISO storage (via <code>pvesm status -content iso</code>) or falls back to <code>/var/lib/vz/template/iso</code>.",
|
||||
"Asks for a base folder for temporary files (default <code>/root/uup-temp</code>).",
|
||||
"Downloads the UUP Dump converter from <code>git.uupdump.net</code>.",
|
||||
"Parses <code>id</code>, <code>pack</code> and <code>edition</code> out of the URL you paste.",
|
||||
"Calls <code>https://uupdump.net/get.php?…&aria2=2</code> to generate an aria2 download list.",
|
||||
"Downloads every UUP payload into <code>UUPs/</code> with aria2 (parallel, resumable).",
|
||||
"Runs <code>convert.sh wim UUPs 1</code> from the converter to produce the final ISO.",
|
||||
"Moves the ISO into the Proxmox ISO storage and cleans up temporary files."
|
||||
]
|
||||
},
|
||||
"aria2": {
|
||||
"heading": "Aria2 download flags used",
|
||||
"code": "aria2c --no-conf --console-log-level=warn --log-level=info \\\n --log=aria2_download.log \\\n -x16 -s16 -j5 -c -R \\\n -d\"$destDir\" -i\"$tempScript\"",
|
||||
"flags": [
|
||||
"<code>-x16</code> — up to 16 connections per server.",
|
||||
"<code>-s16</code> — splits each file into 16 segments.",
|
||||
"<code>-j5</code> — 5 files downloaded in parallel.",
|
||||
"<code>-c</code> — resumes partial downloads.",
|
||||
"<code>-R</code> — retries on failure."
|
||||
],
|
||||
"runtime": "Typical runtime is around 10 minutes, dominated by your internet link speed and UUP Dump's mirror load."
|
||||
},
|
||||
"step1": {
|
||||
"heading": "Step 1 · Get a UUP Dump URL",
|
||||
"intro": "Before running the script you need a UUP Dump URL that includes the <code>id</code>, <code>pack</code> and <code>edition</code> query parameters. Generate it on <extlink>uupdump.net</extlink>:",
|
||||
"stepBadge": "Step",
|
||||
"items": [
|
||||
{
|
||||
"title": "Pick a Windows version",
|
||||
"img": "/iso-creator/step-1-select-version-windows.png",
|
||||
"caption": "UUP Dump main page — pick a Windows version",
|
||||
"body": "Open the UUP Dump home page and choose the Windows version you want."
|
||||
},
|
||||
{
|
||||
"title": "Pick a specific build",
|
||||
"img": "/iso-creator/step-2-select-version-windows.png",
|
||||
"caption": "Pick a specific build",
|
||||
"body": "Pick the build: latest, Insider Preview channel, or a specific older build still listed."
|
||||
},
|
||||
{
|
||||
"title": "Pick a language",
|
||||
"img": "/iso-creator/step-3-select-version-windows.png",
|
||||
"caption": "Pick a language",
|
||||
"body": "Pick the language the ISO should ship with."
|
||||
},
|
||||
{
|
||||
"title": "Pick editions",
|
||||
"img": "/iso-creator/step-4-select-version-windows.png",
|
||||
"caption": "Pick the editions to include",
|
||||
"body": "Pick the editions to bundle into the ISO (Home, Pro, Enterprise, …). You can combine several."
|
||||
},
|
||||
{
|
||||
"title": "Copy the URL",
|
||||
"img": "/iso-creator/step-5-select-version-windows.png",
|
||||
"caption": "Copy the URL from the address bar",
|
||||
"bodyRich": "On the final page, copy the URL <em>from the browser address bar</em>. It must contain <code>id=…</code>, <code>pack=…</code> and <code>edition=…</code>. That is the string the script will parse."
|
||||
}
|
||||
]
|
||||
},
|
||||
"step2": {
|
||||
"heading": "Step 2 · Run the creator",
|
||||
"intro": "With the URL in hand, open ProxMenux and launch the creator:",
|
||||
"stepBadge": "Step",
|
||||
"items": [
|
||||
{
|
||||
"title": "Start UUP Dump ISO Creator",
|
||||
"img": "/iso-creator/start-uupdump-iso-creator.png",
|
||||
"caption": "Start UUP Dump ISO Creator from ProxMenux",
|
||||
"bodyRich": "In ProxMenux go to <strong>Utilities → UUP Dump ISO Creator</strong>. The script checks dependencies and the ISO storage directory before asking for input."
|
||||
},
|
||||
{
|
||||
"title": "Paste the UUP Dump URL",
|
||||
"img": "/iso-creator/add-url-iso-creator.png",
|
||||
"caption": "Paste the URL you copied from uupdump.net",
|
||||
"body": "Paste the URL in the input dialog. The script validates that the three required parameters are present; if any is missing it aborts cleanly."
|
||||
},
|
||||
{
|
||||
"title": "Wait for the build to finish",
|
||||
"img": "/iso-creator/end-uupdump-iso-creator.png",
|
||||
"caption": "Build finished — ISO is ready in Proxmox ISO storage",
|
||||
"bodyRich": "The console shows aria2 progress and then the converter output. When it finishes, the ISO lands in the detected Proxmox ISO storage and is ready to pick from <strong>Create VM → System Windows → Install with ISO from UUP Dump</strong>."
|
||||
}
|
||||
]
|
||||
},
|
||||
"tempFiles": {
|
||||
"title": "Temporary files",
|
||||
"body": "By default, temporary files live under <code>/root/uup-temp</code> (<code>uup-temp/</code> for downloads and <code>uup-converter/</code> for the converter script). The creator cleans both after a successful run. On failure it still cleans up and returns you to the menu so a retry starts from scratch."
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user