Rewrite Hetzner guide section 2: proper QEMU-based Proxmox installation

Replace incorrect installimage-based instructions with the full QEMU
method from the Hetzner community tutorial. Covers disk discovery, BIOS
mode check, ISO download, SSH port forwarding for VNC, QEMU command with
NVMe passthrough, graphical installer walkthrough (ZFS RAID1 mirror),
predict-check for real NIC name, and network config fix before first boot.

Alternative Debian+upgrade method mentioned in a single sentence at the end.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Maarten 2026-03-02 16:01:00 +01:00
parent a7c856121d
commit 14d27fccc8
1 changed files with 191 additions and 26 deletions

View File

@ -25,48 +25,213 @@ servers). Note the assigned IP address and temporary root password.
## 2. Proxmox installation
Hetzner provides two installation paths:
We use the official Proxmox VE ISO installer running inside QEMU from
the Hetzner rescue system. This gives the full graphical installer with
ZFS support, which is not available via Hetzner's `installimage`. The
method is documented in the
[Hetzner community tutorial](https://community.hetzner.com/tutorials/install-and-configure-proxmox_ve).
### Option A: installimage (recommended)
### 2.1 Boot the rescue system
Boot the rescue system from the Hetzner Robot panel, then SSH in:
In the Hetzner Robot panel, activate the rescue system (Linux 64-bit)
and reboot the server. Then SSH in:
```bash
ssh root@<public-ip>
installimage
```
Select Proxmox VE from the list. The installer presents an editor for
disk configuration -- set up ZFS RAID1 mirror on two system disks:
### 2.2 Discover disks
```
SWRAID 0
SWRAIDLEVEL 1
PART /boot ext4 1G
PART lvm pve all
LV pve root ext4 100G
LV pve swap swap 16G
```
Reboot after installation completes.
### Option B: ISO install
Upload the Proxmox VE ISO via Robot panel → Server → ISO Images, then
boot from it. Follow the standard Proxmox installer. This gives more
control over partitioning but requires KVM console access.
### Verify
Identify which disks the server has:
```bash
ssh root@<public-ip>
pvesh get /version
lsblk -d -o NAME,SIZE,MODEL,ROTA,TYPE
```
Example output on a typical auction server with 2 NVMe drives:
```
NAME SIZE MODEL ROTA TYPE
nvme0n1 477G Samsung SSD 970 EVO 0 disk
nvme1n1 477G Samsung SSD 970 EVO 0 disk
```
For ZFS RAID1 (mirror), you want two matching disks. NVMe pairs are the
strong favourite -- fast and reliable. Note the device names (`/dev/nvme0n1`,
`/dev/nvme1n1`) for the QEMU command.
If you have additional disks beyond the pair (e.g. large SATA drives),
those can be set up as a separate storage pool later (section 6). Only
pass the system disks to QEMU for now.
### 2.3 Check BIOS mode
Determine whether the server boots in UEFI or legacy BIOS mode:
```bash
[ -d "/sys/firmware/efi" ] && echo "UEFI" || echo "BIOS"
```
Most modern Hetzner servers are UEFI. The QEMU command below includes
the OVMF BIOS line for UEFI -- remove it if your server reports BIOS.
### 2.4 Download the Proxmox ISO
Get the latest Proxmox VE ISO from the official download page:
```bash
wget https://enterprise.proxmox.com/iso/proxmox-ve_9.0-1.iso
```
Check [proxmox.com/en/downloads](https://www.proxmox.com/en/downloads)
for the current version and adjust the URL accordingly.
### 2.5 Set up SSH port forwarding for VNC
On your **workstation** (not the server), open an SSH tunnel forwarding
the VNC port:
```bash
ssh -L 5900:localhost:5900 root@<public-ip>
```
This forwards local port 5900 to the server's localhost:5900, where
QEMU will expose its VNC display. Keep this session open.
### 2.6 Start the QEMU installer
In the SSH session on the server, start QEMU with the ISO and the disks
you identified in step 2.2:
```bash
qemu-system-x86_64 \
-enable-kvm \
-cpu host \
-m 16G \
-boot d \
-cdrom ./proxmox-ve_9.0-1.iso \
-drive file=/dev/nvme0n1,format=raw,if=virtio \
-drive file=/dev/nvme1n1,format=raw,if=virtio \
-bios /usr/share/OVMF/OVMF_CODE.fd \
-vnc 127.0.0.1:0
```
**Notes:**
- Remove the `-bios /usr/share/OVMF/OVMF_CODE.fd \` line for legacy
BIOS servers (step 2.3).
- For SATA drives, use `/dev/sda`, `/dev/sdb` instead of `/dev/nvmeXn1`.
- Disks appear as `/dev/vdX` inside the VM because of the virtio interface
-- this is normal and expected.
- The `-vnc 127.0.0.1:0` flag binds VNC to localhost only (safe, no
password needed since it's behind the SSH tunnel).
### 2.7 Connect via VNC and install
Open a VNC client on your workstation and connect to `127.0.0.1:5900`
(or just `127.0.0.1` -- most clients default to port 5900).
The Proxmox graphical installer appears. Walk through it:
1. Accept the EULA.
2. **Target disk**: Select the ZFS RAID1 (mirror) option across both
drives (`/dev/vda` and `/dev/vdb` in the VM -- these are your NVMe
drives passed through via virtio).
3. **Country/timezone/keyboard**: Set as appropriate.
4. **Root password and email**: Set a strong root password. This becomes
`HETZNER_PROXMOX_ROOT_PASSWORD` in your `env` file.
5. **Network**: The installer shows a virtualized NIC. Configure it with
the server's public IP, gateway, and hostname. This will be corrected
in the next step since the real NIC name differs.
6. Click **Install** and wait for completion.
The VNC client may disconnect briefly during install -- just reconnect
to `127.0.0.1:5900`.
### 2.8 Predict the real network interface name
After installation completes, stop QEMU with `Ctrl+C` in the SSH
terminal. **Do not reboot yet** -- the network interface name configured
by the installer is wrong (it matches the virtual NIC, not the real one).
Use the Hetzner `predict-check` tool to discover the real interface name:
```bash
predict-check
```
Example output:
```
eth0 -> enp0s31f6
```
Note the predicted name (e.g. `enp0s31f6`). You can also check the
current rescue interface for reference:
```bash
netdata
```
### 2.9 Fix the network config before first real boot
Boot Proxmox again in QEMU, **without** the ISO (no `-cdrom` flag):
```bash
qemu-system-x86_64 \
-enable-kvm \
-cpu host \
-m 16G \
-boot d \
-drive file=/dev/nvme0n1,format=raw,if=virtio \
-drive file=/dev/nvme1n1,format=raw,if=virtio \
-bios /usr/share/OVMF/OVMF_CODE.fd \
-vnc 127.0.0.1:0
```
Connect via VNC, log in as root, and edit the network configuration:
```bash
nano /etc/network/interfaces
```
Replace the virtual interface name (e.g. `ens18`) with the predicted
real name (e.g. `enp0s31f6`). A minimal working config:
```
auto lo
iface lo inet loopback
auto enp0s31f6
iface enp0s31f6 inet static
address <public-ip>/32
gateway <gateway-ip>
```
Save and shut down the VM (`shutdown -h now` inside the VNC session,
or `Ctrl+C` in the SSH terminal).
### 2.10 Reboot into Proxmox
Exit the rescue system and reboot the server from the Hetzner Robot
panel (or just `reboot` from SSH). The server now boots from disk
into Proxmox with the correct network configuration.
### 2.11 Verify
```bash
ssh root@<public-ip> pvesh get /version
# Should show Proxmox VE version and API info
```
The web UI is available at `https://<public-ip>:8006` (we'll lock this
down to WireGuard-only in section 9).
> **Alternative method**: You can also install Debian 13 via Hetzner's
> `installimage` and then upgrade to Proxmox following the
> [official guide](https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_13_Trixie).
> This skips the QEMU/VNC process but does not offer ZFS-on-root from
> the installer.
---
## 3. Network configuration