I’m trying to recover my containers/migrate to a new machine.
My old machine was 18.04 and used lxc storage with a loopback file managed by lxc. It no longer boots, but I have a backup of the data from the disk.
The new machine is 20.04 and has zfs storage backend on a dataset (named tank0/lxc
and created outside of lxc, and this time on it’s own disk partition).
I’m trying to understand how to import the containers from the old disk onto the new machine, but am struggling – partly I think because I’ve followed a mix of instructions and they’re no longer current.
So far I tried
bringing the old loopback based pool online:
sudo zpool import -o readonly=on -d /mnt/backup/var/lib/lxd/disks default -R /mnt/mnt0
This seems to be suggest the data is available:
sudo zfs list
NAME USED AVAIL REFER MOUNTPOINT
default 18.5G 4.29G 24K none
default/containers 15.7G 4.29G 24K none
default/containers/ansible 1.41G 4.29G 1.00G /mnt/mnt0/var/lib/lxd/storage-pools/default/containers/ansible
default/containers/ansible-target-test 1.14G 4.29G 1.50G /mnt/mnt0/var/lib/lxd/storage-pools/default/containers/ansible-target-test
...etc
I then tried using lxd import but got
Error: Command has been replaced with "lxd recover"
I’ve tried various incantations of lxd recover
but I’m not sure I’m entering things correctly (to be honest I initially tried entering ‘dataset’ or ‘path’ in answer to Source of the storage pool
as the previous question required an answer provided from the set in brackets!)
This LXD server currently has the following storage pools:
- default (backend="zfs", source="tank0/lxc")
Would you like to recover another storage pool? (yes/no) [default=no]: yes
Name of the storage pool: default
Name of the storage backend (btrfs, cephfs, dir, lvm, zfs, ceph): zfs
Source of the storage pool (block device, volume group, dataset, path, ... as applicable): /mnt/backup/var/lib/lxd/disks/default.img
Additional storage pool configuration property (KEY=VALUE, empty when done):
Would you like to recover another storage pool? (yes/no) [default=no]:
The recovery process will be scanning the following storage pools:
- EXISTING: "default" (backend="zfs", source="tank0/lxc")
- NEW: "default" (backend="zfs", source="/mnt/backup/var/lib/lxd/disks/default.img")
Would you like to continue with scanning for lost volumes? (yes/no) [default=yes]:
Scanning for unknown volumes...
No unknown volumes found. Nothing to do.
Other debugging info that may help:
sudo zfs list -r -o name,mounted,canmount,mountpoint default
NAME MOUNTED CANMOUNT MOUNTPOINT
default no on none
default/containers no on none
default/containers/ansible no noauto /mnt/mnt0/var/lib/lxd/storage-pools/default/containers/ansible
default/containers/ansible-target-test no noauto /mnt/mnt0/var/lib/lxd/storage-pools/default/containers/ansible-target-test
...etc
I’ve tried to read the documentation but get the impression this is a newly developing area of lxc.
I saw this alternative that rsyncs the data: Recovering containers from crashed HD - #22 by stgraber but I’m not entirely sure how lxd recover behaves – I want the old containers to run from the new zfs pool, not a dir backend.
I’d much appreciate it if someone could point me in the right direction, or some good documentation/examples for using lxd recover, thanks.