mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-06-01 13:04:42 +00:00
5ca3463bf6
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.
131 lines
7.3 KiB
JSON
131 lines
7.3 KiB
JSON
{
|
|
"meta": {
|
|
"title": "Persistent Interface Names | ProxMenux Documentation",
|
|
"description": "Pin Proxmox interface names (eno1, enp3s0, …) to MAC addresses via systemd .link files so names survive PCI re-enumeration, kernel upgrades and adding / removing other NICs.",
|
|
"ogTitle": "Persistent Interface Names | ProxMenux Documentation",
|
|
"ogDescription": "Stop Proxmox interface names from changing when you alter hardware. Uses systemd .link files keyed on MAC address."
|
|
},
|
|
"header": {
|
|
"title": "Persistent interface names",
|
|
"description": "Generates a systemd .link file per physical NIC that pins the kernel-assigned name to the card's MAC address. Once applied (after the next reboot), interface names stop drifting when you add, remove or move PCIe cards.",
|
|
"section": "Network"
|
|
},
|
|
"intro": {
|
|
"title": "What this does",
|
|
"body": "For every physical NIC on the host, writes a small file under <code>/etc/systemd/network/10-<iface>.link</code> that says: <em>\"the device with this MAC must always be called this name\"</em>. systemd-udevd applies the rule at every boot, before <code>ifupdown</code> reads <code>/etc/network/interfaces</code>."
|
|
},
|
|
"problem": {
|
|
"heading": "The problem this solves",
|
|
"intro": "Linux derives default interface names from PCI topology — <code>eno1</code> = onboard, <code>enp3s0</code> = the card in PCI bus 3, slot 0, etc. The naming scheme is deterministic <em>given the same hardware layout</em>. Change the layout and names shift:",
|
|
"items": [
|
|
"Add a GPU in front of an existing NIC → the NIC bus number can change → name changes.",
|
|
"Move a card to a different PCIe slot → name changes.",
|
|
"BIOS / UEFI update that re-enumerates devices → names can change.",
|
|
"Replace a faulty card with the same model in a different slot → name changes."
|
|
],
|
|
"outro": "After such a change, <code>/etc/network/interfaces</code> still references the <em>old</em> name; the bridge fails to come up; the host loses network. Setting up persistent names prevents this scenario from happening again."
|
|
},
|
|
"howWorks": {
|
|
"heading": "How it works",
|
|
"arrowLabel": "per NIC",
|
|
"nodes": {
|
|
"detectLabel": "Detect physical NICs",
|
|
"detectDetail": "ls /sys/class/net/\nfilter out vmbr / bond /\ndocker / veth / wireguard …",
|
|
"readLabel": "Read each MAC",
|
|
"readDetail": "cat /sys/class/net/\n '<'iface'>'/address",
|
|
"writeLabel": "Write .link file",
|
|
"writeDetail": "/etc/systemd/network/\n 10-'<'iface'>'.link"
|
|
},
|
|
"minimalIntro": "Each generated file is intentionally minimal:",
|
|
"minimalOutro": "At boot, systemd-udevd matches the device by MAC and assigns the requested name <em>before</em> any other component (ifupdown, kernel default naming) gets to it. The file prefix <code>10-</code> ensures these rules load early, ahead of the default <code>99-default.link</code>."
|
|
},
|
|
"scope": {
|
|
"heading": "What gets written, what gets skipped",
|
|
"headerType": "Type",
|
|
"headerBehaviour": "Behaviour",
|
|
"headerWhy": "Why",
|
|
"rows": [
|
|
{
|
|
"type": "Onboard / PCIe NIC",
|
|
"behaviour": "<code>.link</code> file written",
|
|
"why": "Backed by a real PCI device — the case the tool is for"
|
|
},
|
|
{
|
|
"type": "Wi-Fi (phy80211)",
|
|
"behaviour": "<code>.link</code> file written",
|
|
"why": "Has a real MAC and benefits from name stability"
|
|
},
|
|
{
|
|
"type": "Bridges (vmbrX)",
|
|
"behaviour": "Skipped",
|
|
"why": "Virtual; name comes from <code>/etc/network/interfaces</code>"
|
|
},
|
|
{
|
|
"type": "Bonds (bondX)",
|
|
"behaviour": "Skipped",
|
|
"why": "Virtual; bond name is set by ifupdown"
|
|
},
|
|
{
|
|
"type": "veth / docker0 / br-XXXX",
|
|
"behaviour": "Skipped",
|
|
"why": "Created on demand by Docker / LXC — not persistent hardware"
|
|
},
|
|
{
|
|
"type": "tap / fwpr / fwln",
|
|
"behaviour": "Skipped",
|
|
"why": "Created on demand by Proxmox per VM/CT"
|
|
},
|
|
{
|
|
"type": "WireGuard / Cilium / Tailscale",
|
|
"behaviour": "Skipped",
|
|
"why": "Software interfaces managed by their own daemons"
|
|
}
|
|
]
|
|
},
|
|
"safety": {
|
|
"heading": "Safety net: previous .link files are backed up",
|
|
"intro": "If <code>/etc/systemd/network/</code> already contains <code>.link</code> files (from a previous run or other tooling), they are copied to a timestamped backup directory before the new ones are generated:",
|
|
"outro": "To roll back: copy the files back from the backup directory and reboot.",
|
|
"rebootTitle": "Takes effect on next reboot, not immediately",
|
|
"rebootBody": "Changes to <code>.link</code> files only apply at boot, when udev re-enumerates devices. The tool reports <em>\"Changes will apply after reboot\"</em> for this reason. Renaming an interface live is risky and not attempted: an active <code>vmbr0</code> with members would have to be reconfigured atomically, which is why the operation is deferred to the next clean boot."
|
|
},
|
|
"afterReboot": {
|
|
"heading": "After the reboot",
|
|
"intro": "Once the names are pinned, the workflow for future hardware changes is simple:",
|
|
"items": [
|
|
"Power off, change hardware (add card, move slot, …), boot.",
|
|
"Each NIC keeps its previous name because its MAC matches a <code>.link</code> file.",
|
|
"If a NIC is replaced (different MAC), it gets a default kernel name (<code>enp<bus>s<slot></code>); re-run this menu to add a <code>.link</code> entry for the new card's MAC."
|
|
]
|
|
},
|
|
"troubleshoot": {
|
|
"heading": "Troubleshooting",
|
|
"emptyTitle": "\"No physical interfaces found\" after running the tool",
|
|
"emptyBody": "The host has no PCI / phy80211-backed interfaces visible to the kernel. Confirm with <code>ls -l /sys/class/net/</code> — every entry should have either a <code>device</code> symlink (PCI) or a <code>phy80211</code> entry (Wi-Fi). If both are missing for what should be a real NIC, the driver is not loaded.",
|
|
"noChangeTitle": "After the reboot, names did not change as expected",
|
|
"noChangeBody": "Check that the file is present and well-formed: <code>cat /etc/systemd/network/10-<iface>.link</code>. Then check udev logs: <code>journalctl -u systemd-udevd -b | grep -i link</code>. A common cause is a stale <code>net.ifnames=0</code> kernel parameter that disables predictable naming entirely — remove it from <code>/etc/default/grub</code>, run <code>update-grub</code>, reboot.",
|
|
"undoTitle": "I want to undo persistent naming",
|
|
"undoBody": "Either delete the <code>.link</code> files (<code>rm /etc/systemd/network/10-*.link</code>) or restore from the backup directory generated on the previous run. Reboot to apply."
|
|
},
|
|
"related": {
|
|
"heading": "Related",
|
|
"items": [
|
|
{
|
|
"label": "Bridge analysis & guided repair",
|
|
"href": "/docs/network/bridge-analysis",
|
|
"tailRich": " — the recovery path when names <em>have</em> already shifted."
|
|
},
|
|
{
|
|
"label": "Config analysis & guided cleanup",
|
|
"href": "/docs/network/config-analysis",
|
|
"tail": " — to remove orphan blocks left behind by name shifts."
|
|
},
|
|
{
|
|
"label": "Diagnostics",
|
|
"href": "/docs/network/diagnostics",
|
|
"tailRich": " — confirm the new names with <em>Show Routing Table</em> after reboot."
|
|
}
|
|
]
|
|
}
|
|
}
|