Safely Replace Proxmox SSD Without Reinstalling
Running out of space on your Proxmox boot drive? Or maybe you picked up a faster NVMe and want to move your entire homelab to it — VMs, LXC containers, and all. The best part: you can replace Proxmox SSD without reinstalling a single service. No reconfiguration, no lost VMs, no wasted weekend. This guide walks you through exactly how to replace Proxmox SSD without reinstalling, using dd, parted, and LVM commands that ship with every Linux system.
I used this exact process on my own server — Xeon E5-2650L v4, MACHINIST X99 V9S, 64GB DDR4 — upgrading from a 256GB SATA SSD to a 1TB NVMe.
🧰 Prerequisites
Before you start, have these ready:
- A new SSD that is equal to or larger than the current one — you cannot clone to a smaller drive with
dd - A USB-to-SATA or USB-to-NVMe adapter if your board has only one drive slot
- A bootable USB stick with SystemRescue or Ubuntu Live
- Physical access to the server
⚠️ This guide covers the default Proxmox LVM layout (ext4 + LVM thin pool). If you chose ZFS at install time, the partition resize step is different — use
zpool online -einstead ofpvresize.
These are everything you need to replace Proxmox SSD without reinstalling. Nothing fancy — no paid tools, no special software.
If you haven’t set up Proxmox yet, start with my Proxmox VE 9.1 installation guide first.
Step 1 — Back Up VMs and Containers 🗄️
The dd clone is reliable, but backups are non-negotiable. The safest way to replace Proxmox SSD without reinstalling is to have a fallback — use vzdump before touching any hardware.
Back up a single VM or container:
vzdump <VMID> --storage local --mode snapshot
Back up everything at once:
for vmid in $(qm list | awk 'NR>1 {print $1}') $(pct list | awk 'NR>1 {print $1}'); do
vzdump $vmid --storage local --mode snapshot
done
⚠️ Save backups to a separate NAS or external drive — not on the SSD you’re about to clone. If something goes wrong mid-clone, that backup is the only copy you’ll have.
Step 2 — Connect the New Drive 💽
Option A — spare slot available: Install the new drive in a second M.2 or SATA slot while keeping the old one in. Clean and simple.
Option B — single slot only: Use a USB-to-NVMe or USB-to-SATA adapter to attach the new drive externally.
The target drive doesn’t need to be blank. dd writes over everything on the destination — existing partitions, filesystems, and data are all overwritten without any prompts. If the new SSD already has data on it that you don’t need, don’t worry about it.
If you want to wipe partition signatures before cloning anyway (optional, not required):
wipefs -a /dev/TARGET # replace TARGET with your device name, e.g. sdb or nvme0n1
⚠️
wipefsonly erases partition table signatures — it’s fast and doesn’t touch the rest of the disk. But again,ddwill overwrite everything regardless, so this step is purely for peace of mind.
Power down the server, connect the new SSD, then boot from your live Linux USB — not from Proxmox. The entire point of a live environment is that neither drive is mounted. Cloning a mounted system drive produces a corrupted copy. Booting from the live USB is the most critical precondition to successfully replace Proxmox SSD without reinstalling. Skip it and the clone will be broken.
Step 3 — Identify the Drives 🔍
In the live environment, run:
lsblk
SATA drives appear as /dev/sda, /dev/sdb, etc. Partitions are named /dev/sda1, /dev/sda2, and so on.
NVMe drives appear as /dev/nvme0n1, /dev/nvme1n1, etc. Their partitions use a p suffix: /dev/nvme0n1p1, /dev/nvme0n1p2, /dev/nvme0n1p3.
Depending on your setup, lsblk will look like one of these:
Both SATA:
NAME SIZE TYPE
sda 256G disk ← old Proxmox SSD
sdb 1T disk ← new target SSD
Both NVMe:
NAME SIZE TYPE
nvme0n1 256G disk ← old Proxmox NVMe
nvme1n1 1T disk ← new target NVMe
Mixed — old SATA, new NVMe (very common upgrade path):
NAME SIZE TYPE
sda 256G disk ← old Proxmox SATA SSD
nvme0n1 1T disk ← new NVMe target
Not sure which drive is which? The drive that already has partitions is your current Proxmox SSD. The blank one with no partitions listed is the new drive. Confirm with:
fdisk -l /dev/sda # SATA
fdisk -l /dev/nvme0n1 # NVMe
The naming scheme matters a lot here — using the wrong device path in Step 4 is the most common reason people fail to replace Proxmox SSD without reinstalling cleanly.
⚠️ Critical — read twice: In
dd,if=is the source andof=is the destination. Swapping them overwrites your Proxmox drive instantly and permanently. Check device names before running anything.
Step 4 — Clone with dd 📋
Replace SOURCE and TARGET with the actual device names from Step 3, then run:
dd if=/dev/SOURCE of=/dev/TARGET bs=4M status=progress conv=noerror,sync
Real examples based on your scenario:
Both SATA (old: sda, new: sdb):
dd if=/dev/sda of=/dev/sdb bs=4M status=progress conv=noerror,sync
Both NVMe (old: nvme0n1, new: nvme1n1) — you can also replace Proxmox SSD without reinstalling when going NVMe-to-NVMe:
dd if=/dev/nvme0n1 of=/dev/nvme1n1 bs=4M status=progress conv=noerror,sync
SATA → NVMe (old: sda, new: nvme0n1):
dd if=/dev/sda of=/dev/nvme0n1 bs=4M status=progress conv=noerror,sync
Flag breakdown:
if=— input: your current Proxmox driveof=— output: the new, larger drivebs=4M— 4MB block size for better throughputstatus=progress— live progress output in the terminalconv=noerror,sync— continues past read errors, fills bad blocks with zeros
💡 If you get
permission denied, run the command withsudo:sudo dd if=/dev/SOURCE of=/dev/TARGET bs=4M status=progress conv=noerror,syncIn most live environments (SystemRescue, Ubuntu Live) you’re already root, but some distros drop you into a regular user session by default.
This takes 15–60 minutes depending on drive size and interface speed. ☕
dd copies everything bit-for-bit: EFI partition, /boot, the entire LVM physical volume, and all VM/container storage inside it. That’s what makes it possible to replace Proxmox SSD without reinstalling — the new drive is an exact working replica, bootloader included.
Step 5 — Swap and Boot 🔄
When dd finishes:
- Power off the server
- Remove the old SSD (or disconnect the USB adapter)
- Install the new SSD in the primary slot
- Power on
Proxmox should boot exactly as before. All VMs, LXC containers, and network configs will be present and working. You’ve completed the physical part to replace Proxmox SSD without reinstalling — the only remaining task is expanding the storage to use the full capacity of the new drive. Fix that in Step 6.
Step 6 — Expand the Partition and LVM 📐
Log into the Proxmox shell via the web UI (https://proxmox-ip:8006 → Shell) or SSH. These commands are how you complete the final part needed to replace Proxmox SSD without reinstalling — expanding the storage to fill the new drive.
6.1 — Find the new drive and its LVM partition
lsblk
A default Proxmox install has three partitions. Depending on your drive type it will look like one of these:
SATA:
sda
├─sda1 1007K BIOS boot / EFI
├─sda2 1G /boot
└─sda3 XXG LVM PV ← this is what we resize
NVMe:
nvme0n1
├─nvme0n1p1 1007K BIOS boot / EFI
├─nvme0n1p2 1G /boot
└─nvme0n1p3 XXG LVM PV ← this is what we resize
Note the partition number of the LVM PV — almost always 3.
6.2 — Resize the partition with parted
If parted is not installed, you’ll get command not found. Fix it first:
apt install parted -y
Then open the drive with parted — use the drive device (not the partition):
SATA:
parted /dev/sda
NVMe:
parted /dev/nvme0n1
Inside the parted interactive prompt (same for both):
(parted) print
(parted) resizepart 3 100%
(parted) quit
⚠️ If parted prints “The backup GPT table is not at the end of the disk” or asks “Fix/Ignore?” — type
Fix. This always happens after cloning to a larger disk. The GPT backup table was written at the end of the old drive; parted is moving it to the correct position on the new one. Completely safe and expected.
6.3 — Resize the LVM Physical Volume
Here you use the partition device — note the difference in naming:
SATA (partition 3):
pvresize /dev/sda3
NVMe (partition 3 — note the p prefix):
pvresize /dev/nvme0n1p3
Confirm with:
pvdisplay
# "Free PE" should now show the newly available space
6.4 — Extend the root Logical Volume
This command is identical regardless of drive type — LVM abstracts the hardware underneath, which is exactly why you can replace Proxmox SSD without reinstalling even when switching between SATA and NVMe.
But stop before you run anything — you have a decision to make here. This is the step where most guides that show you how to replace Proxmox SSD without reinstalling go wrong by blindly giving all space to root.
After pvresize, all the new space lands in the pve volume group as free PEs. You need to decide where that space goes:
Option A — give everything to pve-root:
lvresize --extents +100%FREE --resizefs /dev/pve/root
Simple, one command. But pve-root is the Proxmox OS partition — it doesn’t need hundreds of GB. You’ll end up with a bloated root and no extra space in pve-data for VM disks.
⚠️ Don’t do this if
pve-dataon this drive is your primary VM storage. Option A is only sensible if you store VM disks on a separate drive (a second NVMe, a dedicated SSD, a NAS). When you replace Proxmox SSD without reinstalling and the new drive is your only storage, always use Option B.
Option B — give a fixed amount to pve-root, rest to pve-data (recommended):
# Step 1 — extend root by a fixed amount, e.g. +50G (adjust to your needs)
lvresize --size +50G --resizefs /dev/pve/root
# Step 2 — extend pve-data thin pool with the remaining free space
lvresize --extents +100%FREE /dev/pve/pve-data-tpool
This keeps pve-root reasonably sized (96G + 50G = ~146G is more than enough for Proxmox) and gives the bulk of new space to your VM storage pool.
💡 Not sure how big
pve-rootneeds to be? 50–100GB is plenty for Proxmox itself, system logs, and LXC container roots. VM disk images live inpve-data, not inpve-root. This split is the correct way to replace Proxmox SSD without reinstalling when you want to use the full capacity of the new drive for VM storage.
Check the result:
df -h /
The root filesystem should now reflect the full new drive capacity. 🎉
Verification ✅
Run a quick sanity check across the stack:
lsblk # partition layout
df -h # filesystem sizes
pvs # LVM physical volumes
lvs # logical volumes and their sizes
Then confirm VMs and containers start normally:
qm list
pct list
Start a couple and verify they work. If everything is intact, you’ve successfully managed to replace Proxmox SSD without reinstalling any package or reconfiguring any service.
For extra confidence, run the Proxmox post-install script — it validates repos, removes the subscription nag, and verifies the system is in a clean baseline state after hardware changes.
Troubleshooting 🛠️
Most problems people hit when they try to replace Proxmox SSD without reinstalling fall into one of these categories: The new drive may have a different device name (e.g. /dev/nvme0n1 instead of /dev/sda). Boot from the live USB, chroot into the Proxmox root, update /etc/fstab and the GRUB config, then run update-grub and reboot.
lvresize says no free space is available: The pve-data thin pool may be consuming all PEs. Inspect with lvs — you may need to reduce pve-data allocation before expanding pve-root.
parted resizepart fails with “device busy”: Stop all running VMs and containers first (qm stop <vmid>, pct stop <ctid>), then retry.
Clone took forever but df still shows the old size: That’s expected — dd only copies the partition layout as-is. Expansion is a separate operation done in Step 6.
Final Thoughts 💬
The ability to replace Proxmox SSD without reinstalling — using dd, parted, and two LVM commands — is one of those skills that saves hours every time you upgrade hardware. No third-party tools, no GUI, no drama. Everything you need is already on the system.
If you’re also hosting services like WireGuard VPN on this same Proxmox box, don’t worry — after the drive swap, your VPN tunnel will come right back up exactly as configured. Here’s how I set up WireGuard on Proxmox in a lightweight LXC container if you haven’t done it yet.
Happy upgrading! 🚀
