I got an interesting question regarding zones on Solaris in #omnios.
scarcry: Does anyone know how to move a zone from one zpool to another?
There are some guides out there on how to move a zone from one machine to
another, but most of them install the zone in the same place as before.
But instead of moving it from one machine to another, this small guide will just
show what to do, when only the location is chaning.
First, we need to setup the partitions and zones for our little experiment. For
this example, I will use the pool
rpool and the following partitions
rpool/zones/old mounted to
rpool/zones/new mounted to
We also need the zone config, so here is it.
Just install the zone with the normal commands
$ zonecfg -z zone1 < zone.config
$ zoneadm -z zone1 install
$ zoneadm -z zone1 boot
Check if the zone is running and write a file, just to make sure, we have the
same zone at the end.
moving the zone
For this guide, we will assume, that the zone is in production use and can't be
offline too long. For that to work, we will do a first snapshot, when the zone
is still running.
$ zfs snapshot -r rpool/zones/old/zone1@move1
After that, we can replay that snapshot into the new location.
$ zfs send -R rpool/zones/old/zone1@move1 | zfs recv rpool/zones/new/zone1
This step will take some time, depending on the size of your zone. Now we stop
the the zone and detach it.
$ zoneadm -z zone1 halt
$ zoneadm -z zone1 detach
This frees the zfs partition from the zone and makes it accessible. We need that
a bit later.
Now we need an incremental snapshot and move that data to the new location.
$ zfs snapshot -r rpool/zones/old/zone1@move2
$ zfs send -R -i move1 rpool/zones/old/zone1@move2 | zfs recv rpool/zones/new/zone1
When we now list all zfs partitions, we see, that a partition zbe is mounted two
times into the same location.
rpool/zones/old/zone1/ROOT/zbe 724M 1.59T 723M /zones/old/zone1/root
rpool/zones/new/zone1/ROOT/zbe 724M 1.59T 723M /zones/old/zone1/root
To fix that, issue the following command.
zfs set mountpoint=/zones/new/zone1/root rpool/zones/new/zone1/ROOT/zbe
Now the partition has to be mounted, so that zoneadm can find it for the attach.
You can do that with the following command
zfs mount rpool/zones/new/zone1/ROOT/zbe
Now with the partition in the correct place, we have to tell the zone, where to
look for its new partition.
$ zonecfg -z zone1
zonecfg:zone1> set zonepath=/zones/new/zone1
With the zone reconfigured, attach the zone.
$ zoneadm -z zone1 attach
This may take a bit of time, as the content of the zone gets checked for
compatibility. When it is back, check the zone is installed.
$ zoneadm list -cv
ID NAME STATUS PATH BRAND IP
- zone1 installed /zones/new/zone1 ipkg excl
Now boot the zone and we are done.
$ zoneadm -z zone1 boot
Now check if everything is where you expect it to be and start your services and
everything is good.
Here are some ideas, what can be done differently in the process.
If you zone has a lot of traffic, where many changes aggregate between the first
snapshot and the second, do some more iterative snapshots before taking down the
This has the advantage, that you can close the gap of changes to a minimum size
and therefore make the move at the end a bit faster. But check the available
disk space in the process to avoid a full disk.
create a new zone
Instead of chaning the old zone and therefore making a rollback more complicated,
create a new zone, which looks exactly like the old one.
Instead of chaning the old one, do instead
$ zonecfg -z zone2
zonecfg:zone2> create -a /zones/new/zone1
This will set everything from the old zone with the new zonepath. Keep in mind,
that this will also use the old interface. If you don't want that, create a new
interface before and change it in the config step.
You can also restore that zfs partition in a partition which has the correct.
I hope it helps and you have some fun playing with it.