Moving Oracle Solaris 11 Zones between physical servers

por | 4 enero, 2017


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” :

  1. 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.cfg
  2. Archive 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
    1. Move the configuration and archive files to the destination server
      FTP, scp, NFS, removable hard drive, …
    2. Configure the zone on the destination serverDepending 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.cfg

    3. Install the ZoneIf 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.

    4. 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_FOLDER=/var/tmp/${ZONE_NAME}
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

BASE_DIR=»$(pwd -P)»ZONE_NAME=$1

ARCHIVE_FOLDER=/var/tmp/${ZONE_NAME}
ARCHIVE_FILE=${ZONE_NAME}.zfs.bz2

CONFIG_FILE=${ZONE_NAME}.cfg# 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