moving a zone between zpools
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.
preparations
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/zones/old/
rpool/zones/new
mounted to/zones/new/
We also need the zone config, so here is it.
create -b
set zonepath=/zones/old/zone1
set ip-type=exclusive
set autoboot=false
add net
set physical=zone1
end
commit
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
zonecfg:zone1> verify
zonecfg:zone1> commit
zonecfg:zone1> exit
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.
ideas
Here are some ideas, what can be done differently in the process.
iterative snapshots
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 zone. 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.