@@ -21,6 +21,7 @@ one document.
- [Phase 10 — GPU Passthrough Setup ](#phase-10--gpu-passthrough-setup )
- [Phase 11 — Create the VMs ](#phase-11--create-the-vms )
- [Phase 12 — Deploy Frigate in VM 101 ](#phase-12--deploy-frigate-in-vm-101 )
- [Phase 13 — Minecraft Server VMs (R720) ](#phase-13--minecraft-server-vms-r720 )
---
@@ -2309,9 +2310,64 @@ Click **Next**.
Click **Next ** , then **Finish ** .
VM 100 now appears in the left panel. **Do not start it yet ** — data drives
must be added first (Steps 11.6– 11.8). The GPU and USB PCIe card are added
**after ** the OS is installed (Steps 11.4 and 11.4b, later in this phase).
VM 100 now appears in the left panel. **Do not start it yet ** — the GPU and
data drives must be added first.
After the wizard completes, add the GPU in the **Hardware ** tab:
Click **Add ** → **PCI Device ** .
| Field | Value |
|-------|-------|
| Raw Device | select the GPU from the dropdown |
| All Functions | **checked ** |
| ROM-Bar | **checked ** |
| PCI-Express | **checked ** |
| Primary GPU | **checked ** |
Click **Add ** .
> **ROM-Bar must stay checked.** NVIDIA drivers read the GPU's VBIOS through
> the ROM BAR during initialization. Unchecking it causes the driver to fail
> or the GPU to not be recognized inside the VM.
> VM 100 gets the GPU for Jellyfin transcoding, Immich ML acceleration,
> HandBrake encoding, and general desktop GPU acceleration.
---
### Step 11.4b — Add USB 3.0 PCIe card to VM 100
Still in VM 100's **Hardware ** tab. Click **Add ** → **PCI Device ** .
First, identify the card's PCI address on the Proxmox host:
``` bash
lspci | grep -i usb
# Look for the PCIe card — e.g.:
# 82:00.0 USB controller: VIA Technologies, Inc. VL805/806 xHCI USB 3.0 Controller (rev 01)
```
In the dialog:
| Field | Value |
|-------|-------|
| Raw Device | selected |
| Device | 0000:82:00.0 (your address from lspci) |
| All Functions | checked |
| PCI-Express | checked |
| ROM-Bar | checked |
| Primary GPU | unchecked |
Click **Add ** .
All ports on the USB card are now owned by VM 100. The Coral TPU for VM 101
(Frigate) uses one of the server's built-in rear USB ports instead — it only
needs USB 3.0 speed and works on any port.
> **VL805/VIA cards** are single-function (one PCI address), so All Functions
> has no effect but does no harm. ASMedia and other multi-function cards
> benefit from it more.
---
@@ -2656,7 +2712,81 @@ Click **Add**.
---
### Step 11.10 — Install Ubuntu Desktop in VM 100
### Step 11.10 — Create VM 102 (Windows 11, Sync.com)
VM 102 is a Windows 11 VM that runs the Sync.com desktop client for cloud
backup. Syncthing on VM 100 (Services) mirrors NAS data to VM 102's local
NTFS drive, and Sync.com picks it up natively.
Click **Create VM** again.
**Tab: General**
| Field | Value |
|-------|-------|
| VM ID | 102 |
| Name | windows-sync |
**Tab: OS**
| Field | Value |
|-------|-------|
| ISO image | windows11 ISO (upload to local storage first) |
| OS Type | Microsoft Windows |
| Version | 11/2022/2025 |
**Tab: System**
| Field | Value |
|-------|-------|
| Graphic card | Default (VirtIO) |
| Machine | q35 |
| BIOS | OVMF (UEFI) |
| Add EFI Disk | checked |
| EFI Storage | local-lvm |
| Pre-Enrolled Keys | **checked** (Windows 11 requires Secure Boot) |
| Add TPM | **checked**, TPM Storage: local-lvm (Windows 11 requires TPM 2.0) |
| SCSI Controller | VirtIO SCSI Single |
**Tab: Disks**
| Field | Value |
|-------|-------|
| Disk size (GiB) | 128 |
| Storage | local-lvm |
| Cache | Write back |
**Tab: CPU**
| Field | Value |
|-------|-------|
| Sockets | 1 |
| Cores | 4 |
| Type | host |
**Tab: Memory**
| Field | Value |
|-------|-------|
| Memory (MiB) | 8192 |
Click **Finish**.
Then pass a dedicated data drive to VM 102 for Sync.com to sync to:
` ``bash
# Use one of your spare HDDs — Sync.com data lives here (formatted NTFS in Windows)
qm set 102 -scsi1 /dev/disk/by-id/PLACEHOLDER_SYNC_DRIVE
` ``
> **Why a dedicated drive?** Sync.com needs a real local NTFS disk — not a
> network share, not a shared folder. Windows formats this drive NTFS and
> Sync.com treats it as a native local drive. Syncthing on VM 100 (Services)
> pushes data to it over the LAN.
---
### Step 11.11 — Install Ubuntu Desktop in VM 100
In the left panel, click **100** → click **Start** (▶ button).
@@ -2690,7 +2820,7 @@ the ISO automatically.
---
### Step 11.11 — Find VM 100's IP and test SSH
### Step 11.12 — Find VM 100's IP and test SSH
Log in at the console. Check the assigned IP:
@@ -2718,7 +2848,7 @@ If SSH connects, close the noVNC console tab — you will not need it again.
---
### Step 11.12 — Disable Wayland, force Xorg
### Step 11.13 — Disable Wayland, force Xorg
Ubuntu 24.04 defaults to Wayland. WinApps file sharing (` \\tsclient\home`)
breaks under Wayland due to FreeRDP limitations — tsclient mounts as empty.
@@ -2749,69 +2879,7 @@ echo $XDG_SESSION_TYPE # should print: x11
---
### Step 11.13 — Add GPU to VM 100
Now that Ubuntu is installed and the noVNC console is no longer needed, add
the GPU. **Shut down VM 100 first** (` sudo poweroff` inside the VM).
In VM 100's **Hardware** tab, click **Add** → **PCI Device**.
| Field | Value |
|-------|-------|
| Raw Device | select the GPU from the dropdown |
| All Functions | **checked** |
| ROM-Bar | **checked** |
| PCI-Express | **checked** |
| Primary GPU | **checked** |
Click **Add**.
> **ROM-Bar must stay checked.** NVIDIA drivers read the GPU's VBIOS through
> the ROM BAR during initialization. Unchecking it causes the driver to fail
> or the GPU to not be recognized inside the VM.
Also change the Display device: **Hardware → Display → Edit → Graphic card: none**.
noVNC will stop working after this — all console access goes through SSH or
the GPU's physical output.
---
### Step 11.14 — Add USB 3.0 PCIe card to VM 100
Still in VM 100's **Hardware** tab (VM still shut down). Click **Add** → **PCI Device**.
First, identify the card's PCI address on the Proxmox host:
` ``bash
lspci | grep -i usb
# Look for the PCIe card — e.g.:
# 82:00.0 USB controller: VIA Technologies, Inc. VL805/806 xHCI USB 3.0 Controller (rev 01)
` ``
In the dialog:
| Field | Value |
|-------|-------|
| Raw Device | selected |
| Device | 0000:82:00.0 (your address from lspci) |
| All Functions | checked |
| PCI-Express | checked |
| ROM-Bar | checked |
| Primary GPU | unchecked |
Click **Add**, then start VM 100.
All ports on the USB card are now owned by VM 100. The Coral TPU for VM 101
(Frigate) uses one of the server's built-in rear USB ports instead — it only
needs USB 3.0 speed and works on any port.
> **VL805/VIA cards** are single-function (one PCI address), so All Functions
> has no effect but does no harm. ASMedia and other multi-function cards
> benefit from it more.
---
### Step 11.15 — Install Ubuntu Server in VM 101
### Step 11.14 — Install Ubuntu Server in VM 101
Start VM 101, open the console, and work through the Ubuntu Server installer.
Use ` frigate` as the hostname. When prompted for storage, install only to the
@@ -2821,6 +2889,11 @@ when prompted so you can SSH in for Phase 12.
> **No Wayland to disable** — Ubuntu Server has no desktop environment.
> After install, SSH in directly: ` ssh ubuntu@<vm101-ip>`
**VM 102 (Windows 11):** Boot from the Windows 11 ISO, work through the
installer. Use ` windows-sync` as the hostname. Install to the 128 GiB OS disk.
After install, format the dedicated Sync.com data drive as NTFS in Disk
Management, then install the Sync.com desktop client and point it at that drive.
---
### Phase 11 complete — where you are now
@@ -2828,9 +2901,10 @@ when prompted so you can SSH in for Phase 12.
| What is done | Status |
|---|---|
| Ubuntu Server 24.04.4 and Desktop 24.04.4 ISOs uploaded to Proxmox | ✓ |
| VM 100 created: GPU, raw data drives, services (Immich/Jellyfin/Audiobookshelf/NAS) | ✓ |
| VM 101 created: Coral USB, security VLAN, Frigate NVR | ✓ |
| Ubuntu installed and SSH accessible in both VMs | ✓ |
| VM 100 created: GPU, 8 raw data drives, services (Immich/Jellyfin/Audiobookshelf/NAS) | ✓ |
| VM 101 created: Coral USB (× 2) , security VLAN, Frigate NVR | ✓ |
| VM 102 created: Windows 11, Sync.com | ✓ |
| Ubuntu installed and SSH accessible in all three VMs | ✓ |
---
@@ -3184,6 +3258,220 @@ stats. Navigate to **System → Stats** to confirm:
| Services | fan-control (quiet fans), stagger-spinup (PSU protection) | ✓ |
| VM 100 | Ubuntu Desktop 24.04.4, GPU passthrough, 8 drives, Immich/Jellyfin/Audiobookshelf/NAS | ✓ |
| VM 101 | Ubuntu Server 24.04.4, Coral TPU, Frigate NVR, security VLAN | ✓ |
| VM 102 | Windows 11, Sync.com | ready |
---
## Phase 13 — Minecraft Server VMs (R720)
**What this phase does: ** Creates four Minecraft server VMs on a second,
separate Proxmox host — a Dell R720 — using the same wizard-driven VM setup
as Phases 11/12, but without any of the GPU passthrough, Coral USB, or raw
drive passthrough work. Minecraft needs CPU, RAM, and disk — nothing else.
**Hardware (this host, not the R730xd): **
| Component | Detail |
|-----------|--------|
| Server | Dell PowerEdge R720 |
| CPU | 2x Intel Xeon E5-2697 v2 (12c/24t each — 24 cores / 48 threads total) |
| RAM | 125 GiB |
| Storage | 5x spinning HDD behind PERC H710 (no SSD) — `local-lvm` |
| Network | `eno1` → `vmbr0` , single 1GbE link |
| Proxmox | VE 8.1.3 |
> **No GPU passthrough, no Coral, no raw disk passthrough on this host.**
> Skip `gpu-passthrough-setup.sh`, `build-bay-map.sh`, and `perc-nonraid.sh`
> entirely — those only apply to the R730xd's Frigate/storage workload.
> VM disks here are plain `local-lvm` virtual disks, same as VM 102 in the
> R730xd setup.
> **All HDDs, no SSD.** Minecraft autosaves and region-file writes are small
> and frequent. Expect more I/O wait under heavy load (many players, modded
> redstone/farms) than an SSD host would show. If a server feels laggy under
> load, check `iostat -x 2` on the Proxmox host before assuming it's CPU.
**Prerequisites: **
- VMs 101, 102, 106 removed from this host (freed full 24c/48t, 125GiB, and
all five disks for this phase)
- Ubuntu Server 24.04.4 LTS ISO uploaded to this host's `local` storage
(same download step as Phase 11, Step 11.1/11.2 — repeat on the R720)
---
### Step 13.1 — Create VM 201 (Survival/Paper #1) via the wizard
In the R720's Proxmox web UI, click **Create VM ** .
**Tab: General **
| Field | Value |
|-------|-------|
| VM ID | 201 |
| Name | mc-survival-1 |
**Tab: OS **
| Field | Value |
|-------|-------|
| ISO image | ubuntu-24.04.4-live-server-amd64.iso |
| OS Type | Linux |
| Version | 6.x - 2.6 Kernel |
**Tab: System **
| Field | Value |
|-------|-------|
| Graphic card | Default |
| Machine | i440fx |
| BIOS | SeaBIOS |
| SCSI Controller | VirtIO SCSI Single |
| Qemu Agent | checked |
> **Why SeaBIOS/i440fx here instead of OVMF/q35 like Phases 11– 12?** Those
> were required for GPU passthrough on the R730xd. Nothing on this host is
> being passed through, so there's no reason to take on UEFI's extra
> complexity (Secure Boot prompts, EFI disk, etc.).
**Tab: Disks **
| Field | Value |
|-------|-------|
| Bus/Device | SCSI / 0 |
| Storage | local-lvm |
| Disk size (GiB) | 20 |
| Cache | Write back |
| Discard | checked |
| IO thread | checked |
**Tab: CPU **
| Field | Value |
|-------|-------|
| Sockets | 1 |
| Cores | 4 |
| Type | host |
**Tab: Memory **
| Field | Value |
|-------|-------|
| Memory (MiB) | 8192 |
| Ballooning | unchecked |
> **Why disable ballooning?** Minecraft's JVM heap grabs and holds memory.
> Letting Proxmox reclaim "idle" RAM from the VM fights with the JVM and can
> trigger GC pauses or swapping inside the guest. Fix the allocation instead.
**Tab: Network **
| Field | Value |
|-------|-------|
| Bridge | vmbr0 |
| Model | VirtIO (paravirtualized) |
| Firewall | checked |
Click **Finish ** , then **Start ** the VM and install Ubuntu Server normally
(same installer flow as Phase 11 — set hostname `mc-survival-1` , enable
OpenSSH server during install).
---
### Step 13.2 — Repeat for VMs 202– 204
Same wizard steps as 13.1, changing only VM ID/name, cores, and memory:
| VM ID | Name | Cores | Memory | Disk | Notes |
|-------|------|-------|--------|------|-------|
| 201 | mc-survival-1 | 4 | 8192 MiB | 20G | Paper, vanilla-like |
| 202 | mc-survival-2 | 4 | 8192 MiB | 20G | Paper, vanilla-like |
| 203 | mc-modded | 6 | 12288 MiB | 30G | Forge/NeoForge modpack |
| 204 | mc-minigames | 2 | 4096 MiB | 15G | Creative/minigames |
This commits 16 of 24 cores and 32 of 125 GiB RAM — leaving headroom for
Proxmox itself and room to add a fifth server later without resizing
anything.
---
### Step 13.3 — Install Java and the server jar (inside each VM)
SSH into each VM and run:
``` bash
sudo apt update && sudo apt install -y openjdk-21-jre-headless
sudo useradd -m -s /bin/bash minecraft
sudo mkdir -p /opt/minecraft
sudo chown minecraft:minecraft /opt/minecraft
```
Download the server jar as the `minecraft` user (Paper for 201/202/204,
the modpack's server pack for 203), accept the EULA:
``` bash
sudo -u minecraft bash -c '
cd /opt/minecraft
curl -o server.jar "<paper or modpack server jar URL>"
echo "eula=true" > eula.txt
'
```
---
### Step 13.4 — Create a systemd service per VM
``` bash
sudo tee /etc/systemd/system/minecraft.service <<'EOF'
[Unit]
Description=Minecraft Server
After=network.target
[Service]
User=minecraft
WorkingDirectory=/opt/minecraft
ExecStart=/usr/bin/java -Xms2G -Xmx<HEAP> -jar server.jar nogui
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now minecraft.service
```
Set `-Xmx` to roughly RAM minus 1.5– 2 GiB headroom for the OS (e.g. 6G heap
on the 8 GiB VMs, 10G heap on the 12 GiB VM, 2.5G heap on the 4 GiB VM).
---
### Step 13.5 — Open ports
One port per server, forwarded from the router/firewall to each VM's IP:
| VM | Port |
|----|------|
| 201 | 25565 |
| 202 | 25566 |
| 203 | 25567 |
| 204 | 25568 |
``` bash
sudo ufw allow 25565/tcp # adjust per VM
```
---
### Phase 13 complete — summary
| What is done | Status |
|---|---|
| VMs 201– 204 created with fixed (non-ballooned) CPU/RAM | ✓ |
| Ubuntu Server installed in each, SSH access confirmed | ✓ |
| Java + server jar installed, EULA accepted | ✓ |
| systemd service running each server, restarts on crash | ✓ |
| Ports forwarded per server | ✓ |
---