Creating a Solaris Zone on ZFS

This article is a simple example of creating a ZFS filesystem and using it to hold a new Solaris Zone. ZFS the new Zetabyte file system, created for OpenSolaris but now integrated into mainstream Solaris, and the use of Zones (formerly Solaris Containers)

ZFS allows for large, more reliable filesystems. The key advantages being:

  • Simple administration
  • Data integrity (64-bit checksums on data)
  • Large capacity format for future growth (2\*\*128 512-byte block files). That's 256 quadrillion zettabytes.

Other notable features of ZFS are:

  • Filesystems built on virtual storage "pools"
  • Copy-on-write removes need for recovery (no fsck)
  • Dynamic striping and multiple block sizes optimizes throughput (512 to 128K)
  • Optional compression
  • No modifications needed for apps

The ZFS software is installed via the packages SUNWzfsr and SUNWzfsu.

Create the ZFS pool

We firstly, need to create a virtual device for ZFS. In an idela situation this would be a raw device (or disk slice), but for the purpose of this article we will create a regular file to hold the filesystem.

# mkfile 5g /example/zfs5g

Now create the ZFS storage pool on the virtual device:

# zpool create VirtZones /example/zfs5g
# zpool list
NAME                SIZE    USED    AVAIL    CAP    HEALTH    ALTROOT
VirtZones          4.97G    32.5K    4.97G    0%    ONLINE

NOTE: If you wish to create a mirrored-pool, simple use the keyword pool and specify two virtual devices.

Create a ZFS file system

Now we create a ZFS file system using the new ZFS pool:

# zfs create VirtZones/newzone
# zfs set mountpoint=/newzone VirtZones/newzone
# zpool status -z
  pool: VirtZones
 state: ONLINE
 scrub: none requested
config:

        NAME           STATE       READ WRITE CKSUM
        VirtZones      ONLINE         0     0     0
          /newzone     ONLINE         0     0     0

# mount | grep newzone
/newzone on VirtZones/newzone read/write/setuid/devices/exec/atime/dev=3f50004 on Mon Nov 14 12:34:
# df -k /newzone
Filesystem        kbytes    used   avail capacity Mounted on
VirtZones/newzone
                  5169408      8 5169341       1% /newzone
# ls -l /newzone
total 0

NOTE: At this stage /newzone is not listed in /etc/vfstab. Mounting is done automatically at boot tine by ZFS.

#  grep newzone /etc/vfstab
#

If you want to allow the file system to be managed inside the zone, we must use the zfs zoned=on option when creating or modifying the file system.

Creating the Solaris Zone

Use zonecfg to setup the zone:

# zonecfg -z newzone
newzone: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:newzone> create
zonecfg:newzone> set zonepath=/newzone
zonecfg:newzone> set autoboot=true
zonecfg:newzone> add net
zonecfg:newzone:net> set address=10.1.1.21
zonecfg:newzone:net> set physical=ce0
zonecfg:newzone:net> end
zonecfg:newzone> verify
zonecfg:newzone> commit
zonecfg:newzone> exit

Install the Solaris Zone

Now we need to install packages on the newly created Soalris zone:

Firstly set the proper permissions on the directory, which must moy be world or group read, write or execute:

# chmod go-rwx /newzone

Now we can install the zone using the zoneadm command. This may take several minutes to complete

# zoneadm -z newzone install
Preparing to install zone <newzone>.
Creating list of files to copy from the global zone.
Copying <2048> files to the zone.
Initializing zone product registry.
Determining zone package initialization order.
Preparing to initialize <946> packages on the zone.
Initializing package <252> of <956>: percent complete: 26%
. . .
Initialized <946> packages on zone.
Zone <newzone> is initialized.
The file </newzone/root/var/sadm/system/logs/install_log> contains a log of the zone installation.

NOTE: If you decide to halt, uninstall or delete the zone, we can use these commands, respectively:

# zoneadm -z newzone halt
# zoneadm -z newzone uninstall
# zonecfg -z newzone delete

NOTE: By default zonecfg creates a "sparse" zone--that is read-only files are shared from the "global" zone. This saves a lot of space.

NOTE: If a "sparse" zone is not desired, simply use "create -b" instead of "create" in the zonecfg as in the above example. This prevents the new zone from "inheriting" packages from the global zone. This is called a "whole root" configuration.

The zone has been created, but it won't show up until after the initial boot:

# zoneadm list -v
  ID NAME                 STATUS       PATH
   0 global               running      /

Boot and Configure the Solaris Zone

Now boot the zone and login to the console with zoneadm and zlogin. The initial boot prompts for basic configuration information (language, locale, terminal, hostname, name service, time zone, and root password):

# zoneadm -z newzone boot
# zlogin -C newzone
[Connected to zone 'newzone' console]
Loading smf(5) service descriptions:
1/108
. . .
newzone console login: root
. . .
~.

NOTE: Use "~." to disconnect from the console.