As part of my job in the ISV
Engineering team, I am often asked by partners the following question : is it possible to easily move a Solaris 11 Zone from a
physical server to another?
The short answer is : YES ! The longer one comes with the following restrictions :
Both physical servers should be of the same architecture, x64 or SPARC (T-series and M-series systems are compatible).
Both physical servers should run Oracle Solaris 11.
The destination server should run at least the same or higher release of Solaris 11. This includes the SRU (Support Repository Update) level.
Given a physical server called “Source” hosting a Solaris 11 Zone called “myZone” on a ZFS filesystem, here are the steps to move the zone on another physical server called“Target” :
Export the Zones configuration
The zone needs to be configured on the destination server before it can be installed. The first step is to export the configuration of the Zone to a file:
[Source]# zonecfg -z myZone export -f myZone.cfgArchive the Zone
My favourite solution is to use the ZFS “send” functionality to archive the ZFS file system hosting the Zone in a single movable file, although this can also be achieved in other ways (cpio, pax)- Halt the Zone
[Source]# zoneadm -z myZone halt - Take a recursive ZFS Snapshot of
the rpool of the zone
[Source]# zfs snapshot -r rpool/zones/myZone@archive - Archive the Zone using ZFS send (ZFS and cpio archives can be zipped using gzip or bzip2)
[Source]# zfs send -rc rpool/zones/myZone@archive | bzip2 > /var/tmp/myZone.zfs.bz2
- Halt the Zone
Move the configuration and archive files to the destination server
FTP, scp, NFS, removable hard drive, …Configure the zone on the destination server
Depending on the configuration of the Targer server, you might need to tweak the zone configuration file before using it.
[Target]# zonecfg -z myZone -f myZone.cfgInstall the Zone
If the zone is being installed in the same network, the zone configuration (IP address, DNS server, Gateway, etc) can be preserved using the "-p" option:
[Target]# zoneadm -z myZone install -a myZone.zfs.bz2 -p
If the Zone is being installed in a new network environment, using the "-u" option instead of "-p" will unconfigure the system. The Zone would need to be manually configured on the first boot. The configuration can be automatized during installation if a system configuration profile XML file is provided:
# zoneadm -z myZone install -a myZone.zfs -u -c sc_profile.xml
Quick Tip: To create a system configuration file, you can use the sysconfig program with option "create-profile":
# sysconfig create-profile -o sc_profile.xml
The configuration text wizard will walk you through the system configuration steps (same process as the first boot configuration wizard) but will not re-configure your system. It will simply create an output XML file with the defined system configuration. This files can then be manually tweaked if needed and act as a template for future use.Boot the Zone
# zoneadm -z myZone boot
You should now be able to log in the Zone which is the exact copy of the original Zone on the source server.
Obviously there are many more options and possibilities that go beyond the scope of this post. My intend was just to give a glimpse of what can be done, so don't hesitate to consult the documentation for more options.
Also, these simple steps cans be scripted to be made even more flexible and usable. Below are two scripts I have written for my own needs. There are only provided as an example and must not be considered as production ready scripts.
archive_zone.sh
#!/bi#!/bin/sh
#----------------------------------------------------------------
# archive_zone.sh
#
# This script creates a movable archive of an Solaris 11 Zone
# It take a single input parameter: The Zone name
#----------------------------------------------------------------
SCRIPT_NAME=$0
BASE_DIR="$(pwd
-P)"
ZONE_NAME=$1
ZONES_ROOT=rpool/zones
ARCHIVE_FILE=${ZONE_NAME}.zfs.bz2
CONFIG_FILE=${ZONE_NAME}.cfg
SNAPSHOT=${ZONES_ROOT}/${ZONE_NAME}@`date'+%d_%m_%Y-%H:%M:%S'`
if
[ if [ ! -d ${ARCHIVE_FOLDER} ] ; then
mkdir
-p ${ARCHIVE_FOLDER}
fi
zoneadm -z ${ZONE_NAME} halt
zonecfg -z ${ZONE_NAME} export -f ${ARCHIVE_FOLDER}/${CONFIG_FILE}
#
Take a ZFS Snapshot of the rpool of the zone
zfs
snapshot -r ${SNAPSHOT}
#
Archive the Zone using ZFS send
zfs
send -rc ${SNAPSHOT} | bzip2 > ${ARCHIVE_FOLDER}/${ARCHIVE_FILE}
#
Delete the snapshot used to create the archive
zfs
destroy -r ${SNAPSHOT}
deploy_zone.sh
#!/bin/sh
#----------------------------------------------------------------
# deploy_zone.sh
#
# This script deploys an archived Solaris 11 Zone
# It take a single input parameter: The Zone name
#----------------------------------------------------------------
SCRIPT_NAME=$0
ZONE_NAME=$1
ARCHIVE_FOLDER=/var/tmp/${ZONE_NAME}
ARCHIVE_FILE=${ZONE_NAME}.zfs.bz2
#
Configure the Zone
zonecfg
-z ${ZONE_NAME} -f ${ARCHIVE_FOLDER}/${CONFIG_FILE}
#
Install the Zone and configure the system
zoneadm
-z ${ZONE_NAME} install -a ${ARCHIVE_FOLDER}/${ARCHIVE_FILE} -u
#
Boot the Zone
zoneadm
-z ${ZONE_NAME} boot