Moving proxmox to another disk is not that straight forward. If the new disk is different size you can't just copy the whole disk. Here is how you can do that.
This is not a trivial task. Having knowledge on zfs will help. It would be nice to experiment on a virtual machine before doing it on an actual proxmox install.
You can backup the rpool using zfs send. First you need to boot ubuntu live (zfs on Debian does not recognize some of proxmox rpool features). After ubuntu boots open terminal and:
sudo su - apt update apt install openssh-server net-tools zstd -y
Install zfs
apt install zfsutils-linux zfs-dkms
then change the password:
passwd
then
vim /etc/ssh/sshd_config
add
PermitRootLogin yes
and save
service sshd restart ifconfig
note the ip address and you can login remotely in order to be albe sit comfortably, open this manual and copy/paste
cd /mnt mkdir -p backup
Plug a usb disk or mount network share to /mnt/backup. now import the rpool
zpool import –R /mnt/rpool rpool
now make a backup of the pool:
zfs send rpool |zstd -5 -T0 >/mnt/backup/proxmox-zfs-send.img.zst
After backup is done export the pool and unmount backup disk/network share
umount /mnt/backup zpool export rpool
Shutdown and remove the disk.
Place the new disk. install fresh copy of proxmox and update it.
Shutdown and plug the old disk (if it's nvme and you don't have second NVMe slot you can use usb to NVMe adapter or PCIe to m.2).
Boot to Ubuntu live again and do all the steps from the previous chapter to enable yourself to use ssh, but don't import any pools yet.
Run lsblk to see which disk which is your disk. If you can't recognize it based on size alone you can check each disk's serial number:
smartctl -i /dev/nvme2n1|grep -i serial Serial Number: S3TNNF0K938696
run
zpool import
to see the list of pools. You'll see something like:
pool: rpool id: 9353721585537995636 state: ONLINE status: The pool was last accessed by another system. action: The pool can be imported using its name or numeric identifier and the '-f' flag. see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-EY config: rpool ONLINE sda ONLINE
Note that there are two pools named 'rpool'. Once you figured out which is your old pool import it like this (you have to use the id instead of the name):
zpool import -R /mnt/old <old pool id> oldrpool zpool import -R /mnt/new <new pool id> rpool
Record mountpoints (or better use a flash drive or network share so you don't loose it on reboot)
zfs list >/mountpoint-backup.txt
create snapshot to send to the new pool
zfs snapshot -r rpool@move
now you need to remove mount points because zfs will fail to copy the pool:
zfs set mountpoint=none rpool/ROOT zfs set mountpoint=none rpool/data zfs set mountpoint=none rpool/var-lib-vz zfs set mountpoint=none rpool
I haven't tried this, so not sure if it'll work - copy the root dataset:
zfs send -R rpool@move | zfs receive -F rpool
If it doesn't work you have to copy each second level dataset individually
zfs send -R rpool/ROOT@move | zfs receive -F rpool/ROOT zfs send -R rpool/data@move | zfs receive -F rpool/data zfs send -R rpool/var-lib-vz@move | zfs receive -F rpool/var-lib-vz
the receiving dataset must not have snapshots. If it has, you need to delete them before copying. That can happen if you need to copy again. to delete snapshot:
zfs destroy -r rpool@move