Post

Proxmox VE Setup Guide - Speedrun

A Proxmox Installation Speedrun that assumes the reader already understands the concepts from the Detailed Proxmox VE setup guide.

Proxmox VE Setup Guide - Speedrun

Proxmox Installation, Speedrun - v20260710

Need the explanations and design decisions? Read the full guide.

https://mikesco3.github.io/posts/proxmox-setup-guide/

In this setup

We will set up Proxmox VE using the following layout:

Hardware

  • The main ZFS pool (rpool) is mirrored across two hard drives. It hosts the Proxmox operating system itself, along with datasets for backups and replicated “shadow” copies of our production VMs.
  • A second pool (fast200) lives on a dedicated NVMe drive and runs the live production VMs and containers. This is the high-performance tier that benefits from fast I/O and low latency.
  • Additional NVMe drives can be introduced later, each forming its own independent pool (for example fast300, fast400, and so on), following the same structure and replication process when more capacity or isolation is needed.
  • Replication tasks (using syncoid) keep the production fast200 pool synchronized to the larger, more resilient rpool, giving us a recoverable copy in case the NVMe drive fails.

These commands are meant to be read, understood, and adapted (not just copy-pasted). Think of this as a recipe that keeps improving over time, and feel free to refine it for your own setup or share any insights back.



1. Hardware Checklist

  • Clean out dust; check the heatsink compound.
  • Check CMOS battery (replace if ≤ 3.0 V)
  • Update BIOS
  • Configure BIOS (Enable VT-x/AMD-V and IOMMU)
  • Install drives
  • Check the RAM with memtest


2. Install Proxmox

  • Boot into the installation media and choose:
  • Filesystem: ZFS
  • Layout: RAID1 (mirror)
  • Select only the two HDDs
  • Set compression=zstd (optional)
  • Set ashift=12

  • Proceed with the install and reboot


3. Helper Script

  • Run the PVE Post-Install Script
    1
    
    bash -c "$(wget -qLO - https://github.com/community-scripts/ProxmoxVE/raw/main/misc/post-pve-install.sh)"
    
  • disable enterprise repo,
  • enables no-sub repo,
  • kill subscription nag,
  • disable corosync and clustering
  • DON’T Update yet


4. Install Basic Tools

1
2
apt update && apt upgrade -y && \
apt install -y libcapture-tiny-perl libconfig-inifiles-perl pv lzop mbuffer net-tools sudo mc unzip screen iftop lshw sshfs make nfs-kernel-server sysstat smartmontools ethtool pv htop ntfs-3g git samba rpcbind libsasl2-modules neofetch ncdu vim tmux iperf3 archivemount fio kpartx tldr speedtest-cli

Note: Adjust for your package preference or fix any missing packages

  • Reboot


5. Create ZFS Datasets

Create separate datasets for _Backup, _Shadows, and _VMs.

1
2
3
4
5
6
7
zfs create -o atime=off -o compression=zstd -o casesensitivity=mixed rpool/_Backup
ln -s /rpool/_Backup/ /_Backup

zfs create -o atime=off -o compression=zstd -o casesensitivity=mixed rpool/_Shadows
ln -s /rpool/_Shadows/ /_Shadows

zfs create -o atime=off -o compression=zstd -o casesensitivity=mixed rpool/_VMs

Verify Everything

1
2
3
4
5
zpool status
zfs list
lsblk
pvesm status



6. Create NVMe Pool

  • Install the NVMe Drive.
  • Locate the NVMe drive
    1
    
    lsblk -o name,model,serial
    

Partition the NVMe Drive

Warning: Do NOT blindly copy the device names shown in this guide. Confirm the correct NVMe device using the previous commands and substitute those values before creating the pool.

1
cfdisk /dev/nvme0n1 
  • create a gpt partition table
  • create a primary partition of type:
    Solaris /usr & Apple ZFS (6A898CC3-1DD2-11B2-99A6-080020736631)
  • Only allocate 85% of total capacity, leaving room for over-provisioning.
  • Write and quit cfdisk.

Finally the following command to label the partition:

1
sudo sgdisk --change-name=1:"fast200" /dev/nvme0n1 

You can list disks and their IDs with:

1
ls -l /dev/disk/by-id/ |grep nvme0n1 |grep part1

Create the pool

Danger: Creating a ZFS pool destroys all data on the selected device. Double-check the device identifier before pressing Enter.

1
2
3
4
5
6
7
8
zpool create fast200 \
  -o ashift=12       \
  -o autotrim=on     \
  nvme-2TB-Samsung_SSD_EVO_2TB_SN0001234-part1

zpool upgrade fast200
zfs set compression=zstd fast200

Create the fast200/_VMs Dataset

1
2
3
4
5
zfs create                 \
  -o atime=off             \
  -o compression=zstd      \
  -o casesensitivity=mixed \
  fast200/_VMs

Schedule ZFS Scrubs

Run crontab -e as root and add:

0 06 * * SUN /usr/sbin/zpool scrub fast200
2 06 * * SUN /usr/sbin/zpool scrub rpool


7. Add Storages in Proxmox

Datacenter → Storage

  • Disable: local and local-zfs
  • Add: fast200/_VMs, rpool/_Backup, rpool/_Shadows and rpool/_VMs

StorageLayout



8. Create an Admin User

Create the User in Linux User:

In our example, called: johndoe

1
2
3
4
5
6
sudo useradd -m \
  -s /usr/bin/bash \
  -G adm,sudo,shadow,staff,users,crontab,postfix,sambashare,dip,root \
  johndoe

sudo passwd johndoe
  • Create the same user for Samba access:
1
smbpasswd -a johndoe

Add the User to Proxmox

  1. In the Proxmox Web Interface, create a group (for example, masters):
    Datacenter → Permissions → Groups → Create

  2. Grant that group administrative rights from the command line:
    1
    
    pveum aclmod / -group masters -role Administrator
    
  3. Then, back in the web interface, create the user:

Datacenter → Permissions → Users → Add and assign the user (e.g. johndoe@pam) to the masters group. __ __

9. Configure Samba

  • Backup Samba config first
    1
    
    cp /etc/samba/smb.conf /etc/samba/smb.conf_orig
    

Edit the Main Configuration

  • Open /etc/samba/smb.conf, and edit the following lines:
1
2
3
4
5
6
7
8
9
workgroup = WORKGROUP

# Under [homes]
read only = no
create mask = 0775
directory mask = 0775

# At the end of the file, include the custom shares file:
include = /etc/samba/shares.conf

Add the Shares

  • Create /etc/samba/shares.conf and add the Shares:

Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
[.Backup$]
   comment = Proxmox Backup Share
   path = /rpool/_Backup
   browseable = no         
   guest ok = no           
   read only = no          
   valid users = johndoe, @staff, @adm
   admin users = johndoe, @adm
   force user = johndoe
   force group = adm
   create mask = 0660
   directory mask = 2770
   case sensitive = no     

Set the Permissions

1
2
3
4
chmod 644 /etc/samba/shares.conf 
chown :sambashare --recursive /rpool/_Backup
chmod g+rwx --recursive /rpool/_Backup


Final Check and Start the Service

Before starting Samba, verify that the configuration is valid:

1
testparm   # Checks for syntax errors and lists available shares

If no errors appear, enable and start the service:

1
2
systemctl enable --now smbd nmbd
systemctl status smbd nmbd

From a Windows or macOS system, test access to the share.



10. Install Additional Software & Tools

Sanoid & Syncoid

For Creating Snapshots and Replicating ZFS Datasets

1
2
apt update
apt install -y sanoid
  • Create the configuration /etc/sanoid/sanoid.conf

Samples are available from:

  • Enable the timer:
1
2
systemctl enable --now sanoid sanoid-prune 
systemctl status sanoid sanoid-prune sanoid.timer 

DriveStatus

drivestatus is a small utility for identifying disks.

Example output:

drivestatus

  • Download and Install drivestatus
    1
    2
    3
    
    sudo wget -O /usr/bin/drivestatus \
    https://raw.githubusercontent.com/Mikesco3/drivestatus.sh/main/drivestatus.sh && \
    sudo chmod +x /usr/bin/drivestatus
    

ZeroTier

1
curl -s https://install.zerotier.com | sudo bash


11. Replicate Production VMs

Once we have Production VMs we can setup replication to their Shadow Equivalents:

In this example we will replicate VM 201 to a Shadow VM 1201


Create the Shadow VM:

  • Copy the VM Config file in /etc/pve/qemu-server/ from 201.conf to 1201.conf
  • Change the Shadow VM drive entries:
  • In /etc/pve/qemu-server/1201.conf

Example:

from: fast200 vm 201

efidisk0: fast200_VMs-zfs:vm-201-disk-0,efitype=4m,pre-enrolled-keys=1,size=1M
tpmstate0: fast200_VMs-zfs:vm-201-disk-1,size=4M,version=v2.0
virtio0: fast200_VMs-zfs:vm-201-disk-2,discard=on,iothread=1,size=150G

To: _Shadow vm 1201.

efidisk0: rpool_Shadows-zfs:vm-1201-disk-0,efitype=4m,pre-enrolled-keys=1,size=1M
tpmstate0: rpool_Shadows-zfs:vm-1201-disk-1,size=4M,version=v2.0
virtio0: rpool_Shadows-zfs:vm-1201-disk-2,discard=on,iothread=1,size=150G
  • Disable the network interfaces of the Shadow VM 1201:

Create the Replication Script

In our example we’re creating the script in /root/replicateVMs-to-Shadows.sh

1
2
3
4
5
6
7
#!/usr/bin/bash

## VM 201 Win11 
  /usr/sbin/syncoid --force-delete fast200/_VMs/vm-201-disk-0 rpool/_Shadows/vm-1201-disk-0 && \
  /usr/sbin/syncoid --force-delete fast200/_VMs/vm-201-disk-1 rpool/_Shadows/vm-1201-disk-1 && \
  /usr/sbin/syncoid --force-delete fast200/_VMs/vm-201-disk-2 rpool/_Shadows/vm-1201-disk-2


Schedule the Script

Schedule this script from crontab -e:

5 8-18/2 * * * /root/replicateVMs-to-Shadows.sh >/dev/null 2>&1

12. Maintenance & Lifecycle Planning

  • Enable Sanoid
  • Configure replication
  • Schedule scrubs
  • Configure monitoring & Alerts
  • Verify Replicatoin and Restores
  • Keep Proxmox Updated ___

  • Backup Strategy
  • Schedule Lifecycle & Redundancy Planning
  • Disaster Recovery Drills

Schedule Replacements:

  • NVMe Wear Level
  • Hard Drives
  • CMOS Battery


If you run into installer issues, network problems, USB/KVM quirks, or hardware compatibility issues, refer to the Troubleshooting section of the full guide Link:



This post is licensed under CC BY 4.0 by the author.