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 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:
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
gptpartition 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:
localandlocal-zfs - Add:
fast200/_VMs,rpool/_Backup,rpool/_Shadowsandrpool/_VMs
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
In the Proxmox Web Interface, create a group (for example,
masters):
Datacenter → Permissions → Groups → Create- Grant that group administrative rights from the command line:
1
pveum aclmod / -group masters -role Administrator
- 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.confand 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:
- Download and Install
drivestatus1 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 201to aShadow VM 1201
Create the Shadow VM:
- Copy the VM Config file in
/etc/pve/qemu-server/from201.confto1201.conf - Change the Shadow VM drive entries:
- In
/etc/pve/qemu-server/1201.conf
Example:
from:
fast200vm 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:
_Shadowvm 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:


