e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek#!/bin/ksh -p
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek#
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# CDDL HEADER START
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek#
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# The contents of this file are subject to the terms of the
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# Common Development and Distribution License (the "License").
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# You may not use this file except in compliance with the License.
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek#
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# or http://www.opensolaris.org/os/licensing.
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# See the License for the specific language governing permissions
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# and limitations under the License.
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek#
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# When distributing Covered Code, include this CDDL HEADER in each
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# If applicable, add the following below this CDDL HEADER, with the
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# fields enclosed by brackets "[]" replaced with your own identifying
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# information: Portions Copyright [yyyy] [name of copyright owner]
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek#
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# CDDL HEADER END
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek#
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek#
ab5dfd5e82c7de6e8a7172573741f3c5890a82fa# Copyright 2010 Sun Microsystems, Inc. All rights reserved.
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# Use is subject to license terms.
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek#
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek. /usr/lib/brand/solaris10/common.ksh
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekm_usage=$(gettext "solaris10 brand usage: clone {sourcezone}.")
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekf_nosource=$(gettext "Error: unable to determine source zone dataset.")
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekf_sysunconfig=$(gettext "Error: sys-unconfig failed.")
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# Other brand clone options are invalid for this brand.
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekwhile getopts "R:z:" opt; do
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek case $opt in
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek R) ZONEPATH="$OPTARG" ;;
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek z) ZONENAME="$OPTARG" ;;
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek *) printf "$m_usage\n"
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek exit $ZONE_SUBPROC_USAGE;;
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek esac
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekdone
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekshift $((OPTIND-1))
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekif [ $# -ne 1 ]; then
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek fail_usage "$0 {sourcezone}";
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekfi
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek
090f667debfb7792a579172d3f173753762ee29aZONEROOT="$ZONEPATH/root"
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelineksourcezone=$1
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# Find the active source zone dataset to clone.
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelineksourcezonepath=`/usr/sbin/zonecfg -z $sourcezone info zonepath | \
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek /usr/bin/cut -f2 -d' '`
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekif [ -z "$sourcezonepath" ]; then
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek fail_fatal "$f_nosource"
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekfi
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekget_zonepath_ds $sourcezonepath
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekget_active_ds $ZONEPATH_DS
090f667debfb7792a579172d3f173753762ee29aACTIVE_SRC=$ACTIVE_DS
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek#
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# Now set up the zone's datasets
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek#
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek#
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# First make the top-level dataset.
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek#
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekpdir=`/usr/bin/dirname $ZONEPATH`
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekzpname=`/usr/bin/basename $ZONEPATH`
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekget_zonepath_ds $pdir
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekzpds=$ZONEPATH_DS
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# Create the datasets.
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek/usr/sbin/zfs create $zpds/$zpname
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekif (( $? != 0 )); then
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek fail_fatal "$f_zfs_create"
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekfi
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek/usr/sbin/zfs create -o mountpoint=legacy -o zoned=on $zpds/$zpname/ROOT
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekif (( $? != 0 )); then
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek fail_fatal "$f_zfs_create"
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekfi
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# make snapshot
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald JelinekSNAPNAME=${ZONENAME}_snap
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald JelinekSNAPNUM=0
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekwhile [ $SNAPNUM -lt 100 ]; do
090f667debfb7792a579172d3f173753762ee29a zfs snapshot $ACTIVE_SRC@$SNAPNAME
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek if [ $? = 0 ]; then
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek break
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek fi
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek SNAPNUM=`expr $SNAPNUM + 1`
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek SNAPNAME="${ZONENAME}_snap$SNAPNUM"
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekdone
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekif [ $SNAPNUM -ge 100 ]; then
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek fail_fatal "$f_zfs_create"
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekfi
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# do clone
090f667debfb7792a579172d3f173753762ee29aget_active_ds $zpds/$zpname
090f667debfb7792a579172d3f173753762ee29azfs clone -o canmount=noauto $ACTIVE_SRC@$SNAPNAME $ACTIVE_DS
090f667debfb7792a579172d3f173753762ee29a(( $? != 0 )) && fail_fatal "$f_zfs_create"
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek
090f667debfb7792a579172d3f173753762ee29aif [ ! -d $ZONEROOT ]; then
090f667debfb7792a579172d3f173753762ee29a mkdir -p $ZONEROOT || fail_fatal "$f_mkdir" "$ZONEROOT"
090f667debfb7792a579172d3f173753762ee29a chmod 700 $ZONEPATH || fail_fatal "$f_chmod" "$ZONEPATH"
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekfi
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek
090f667debfb7792a579172d3f173753762ee29amount -F zfs $ACTIVE_DS $ZONEROOT || fail_fatal "$f_zfs_mount"
090f667debfb7792a579172d3f173753762ee29a
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek# Don't re-sysunconfig if we've already done so
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekif [[ ! -f $ZONEROOT/etc/.UNCONFIGURED ]]; then
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek /usr/sbin/zoneadm -z $ZONENAME boot -f -- -m milestone=none
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek if (( $? != 0 )); then
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek error "$e_badboot"
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek fail_incomplete "$f_sysunconfig"
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek fi
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek sysunconfig_zone
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek if (( $? != 0 )); then
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek /usr/sbin/zoneadm -z $ZONENAME halt
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek fail_incomplete "$f_sysunconfig"
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek fi
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek /usr/sbin/zoneadm -z $ZONENAME halt
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekfi
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinek
ab5dfd5e82c7de6e8a7172573741f3c5890a82fa# Add a service tag for this zone.
ab5dfd5e82c7de6e8a7172573741f3c5890a82faadd_svc_tag "$ZONENAME" "clone $sourcezone"
ab5dfd5e82c7de6e8a7172573741f3c5890a82fa
e71ca95ca6de23d33b54cb55cefdef30bc7c969bGerald Jelinekexit $ZONE_SUBPROC_OK