Print this page
@@ -8,187 +8,130 @@
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#
# Copyright 2016 Joyent, Inc. All rights reserved.
+# Copyright 2016 OmniTI Computer Consulting, Inc. All rights reserved.
#
-#
-# This is only an example install script. It is not currently used for anything.
-#
-
PATH=/bin:/usr/bin:/usr/sbin
export PATH
-fullpath()
-{
- typeset path="$1"
+. /usr/lib/brand/shared/common.ksh
- echo $path | egrep -s "^/" || path="${PWD:=$(pwd)}/$path"
- echo $path
-}
+ZFS_SEED=""
+TAR_SEED=""
-makedir()
-{
- typeset dirname=$(fullpath "$1")
- typeset mode=""
-
- [[ $# -eq 2 ]] && mode="-m $2"
-
- [[ -d "$dirname" ]] && return
-
- if ! mkdir $mode -p "$dirname"; then
- echo $(gettext "Aborting installation...")
- exit 255
- fi
+bad_usage() {
+ echo "LX zone install bad option"
+ echo "Available options are:"
+ echo " -s <absolute-pathname> Path to ZFS send stream or gzip thereof"
+ echo " -t <absolute-pathname> Path to tar archive or gzip thereof"
+ exit $ZONE_SUBPROC_USAGE
}
-symlink()
-{
- typeset src="$1"
- typeset dst=$(fullpath "$2")
+while getopts "R:s:t:z:" opt
+do
+ case "$opt" in
+ R) ZONEPATH="$OPTARG";;
+ z) ZONENAME="$OPTARG";;
+ s) ZFS_SEED="$OPTARG";;
+ t) TAR_SEED="$OPTARG";;
+ *) bad_usage ;;
+ esac
+done
+shift OPTIND-1
- [[ -e "$dst" || -h "$dst" ]] && rm -f "$dst"
+if [[ $ZFS_SEED == "" && $TAR_SEED == "" ]]; then
+ echo "The -s <absolute-pathname> argument or the -t <absolute-pathname>"
+ echo "argument is required for LX installation."
+ bad_usage
+fi
- if ! ln -s "$src" "$dst"; then
- echo $(gettext "Aborting installation...")
- exit 255
- fi
-}
+if [[ $ZFS_SEED != "" && $TAR_SEED != "" ]]; then
+ echo "You must only specify one of -s or -t for LX installation."
+ bad_usage
+fi
-install_ln()
-{
- typeset source="$1"
- typeset target=$(fullpath "$2")
+# Set the ZONEPATH_DS variable so we know the zone's dataset.
+get_zonepath_ds $ZONEPATH
- log " Installing \"$target\""
+# Do something based on whatever ZFS_SEED is.
- mv -f "$target" "$target.$tag" 2>/dev/null
-
- if ! ln -s "$source" "$target"; then
- return 1
+if [[ -f $TAR_SEED ]]; then
+ type=`file -b $TAR_SEED | awk '{print $1}'`
+ if [[ $type == "gzip" ]]; then
+ args="-xzf"
+ else
+ args="-xf"
fi
+ cd $ZONEPATH
+ # Be very precise about permissions and ownership.
+ mkdir -m 0755 dev
+ chgrp sys dev
+ mkdir -m 0755 root
+ chgrp root sys
+ cd root
+ gtar $args $TAR_SEED
+ exit 0
+elif [[ ! -f $ZFS_SEED ]]; then
+ # Try and eat a snapshot or a filesystem.
+ outstr=`zfs list -Ht filesystem $ZFS_SEED 2>/dev/null | awk '{print $1}'`
+ if [[ $outstr == $ZFS_SEED ]]; then
+ # We have a zfs filesystem name.
+ # Snapshot it using today's date/time
+ snapname=`date -u "+%Y-%m-%d:%H:%M:%S"`
+ ZFS_SEED=$ZFS_SEED@$snapname
+ zfs snapshot $ZFS_SEED
+ if [[ $? != 0 ]]; then
+ echo "ZFS snapshot ($ZFS_SEED) command failed ($?)."
+ exit $ZONE_SUBPROC_FATAL
+ fi
+ # else continue on with the new snapshot...
+ fi
- return 0
-}
-
-# If we weren't passed 3 arguments, exit now.
-[[ $# -lt 3 ]] && exit 254
-
-# Extract the brand directory name from the path.
-branddir=$(dirname "$0")
-zonename="$1"
-zoneroot="$2"
-install_src="3"
-install_root="$zoneroot/root"
-ZPOOL=`df $ZONEROOT | awk -F '[()]' '{split($2, field, "/"); print field[1]; }'`
-if [ -z "$ZPOOL" ]; then
- ROOTDEV="none"
+ outstr=`zfs list -Ht snapshot $ZFS_SEED 2>/dev/null | awk '{print $1}'`
+ if [[ $outstr == $ZFS_SEED ]]; then
+ # Hmmm, we found a snapshot name!
+ echo "Cloning from snapshot $ZFS_SEED"
+ # zoneadm already created $ZONEPATH_DS, destroy it before we clone.
+ zfs destroy $ZONEPATH_DS
+ zfs clone $ZFS_SEED $ZONEPATH_DS
+ if [[ $? != 0 ]]; then
+ echo "ZFS clone ($ZFS_SEED to $ZONEPATH_DS) failed ($?)."
+ exit $ZONE_SUBPROC_FAIL
+ fi
+ # zfs promote $ZONEPATH_DS
+ # if [[ $? != 0 ]]; then
+ # echo "ZFS promote ($ZONEPATH_DS) failed ($?)."
+ # exit $ZONE_SUBPROC_FAIL
+ # fi
+ else
+ echo "Seed file $ZFS_SEED $TAR_SEED not found."
+ bad_usage
+ fi
else
- ROOTDEV="/dev/$ZPOOL"
-fi
+ type=`file -b $ZFS_SEED | awk '{print $1}'`
-if [[ ! -f "$install_src" ]]; then
- echo "$install_src: file not found\n"
- exit 254
-fi
-
-if [[ ! -d "$install_root" ]]; then
- if ! mkdir -p "$install_root" 2>/dev/null; then
- echo "Could not create install directory $install_root"
- exit 254
+ # For now, we are dependent on the output of file(1).
+ # I'm being cheesy in checking the first word of file(1)'s output.
+ if [[ $type == "ZFS" ]]; then
+ zfs recv -F $ZONEPATH_DS < $ZFS_SEED
+ elif [[ $type == "gzip" ]]; then
+ gunzip -c $ZFS_SEED | zfs recv -F $ZONEPATH_DS
+ else
+ echo "Seed file $ZFS_SEED not a ZFS receive (or compressed) one."
+ bad_usage
fi
-fi
-if ! ( cd "$install_root" && gtar -xzf "$install_src" ) ; then
- echo "Error: extraction from tar archive failed"
- exit 255
-fi
-
-tag="lxsave_$(date +%m.%d.%Y@%T)"
-
-if [[ ! -d "$install_root" ]]; then
- exit 255
-fi
-
-cd "$install_root"
-
-makedir native/dev
-makedir native/etc/default
-makedir native/etc/svc/volatile
-makedir native/lib
-makedir native/proc
-makedir native/tmp 1777
-makedir native/usr
-makedir native/var
-
-makedir mnt
-makedir opt
-makedir usr/local/bin
-makedir usr/local/include
-makedir usr/local/lib
-makedir usr/local/sbin
-makedir usr/local/share
-makedir usr/local/src
-
-makedir dev 0755
-makedir tmp 1777
-makedir proc 0555
-makedir boot 0755
-
-symlink /bin/sh sbin/sh
-symlink /bin/su usr/bin/su
-symlink /native/usr/lib/ld.so.1 usr/lib/ld.so.1
-
-libpam_so="$(echo lib/libpam.so.0.*)"
-libpam_misc="$(echo lib/libpam_misc.so.0.*)"
-libpamc_so="$(echo lib/libpamc.so.0.*)"
-
-symlink "/$libpam_so" lib/libpam.so.0
-symlink "/$libpam_misc" lib/libpam_misc.so.0
-symlink "/$libpamc_so" lib/libpamc.so.0
-
-makedir var/ld
-
-if ! crle -c var/ld/ld.config -l /native/lib:/native/usr/lib \
- -s /native/lib/secure:/native/usr/lib/secure; then
- exit 255
-fi
-
-mv -f etc/fstab etc/fstab.$tag 2>/dev/null
-
-cat > etc/fstab <<- EOF
- $ROOTDEV / zfs defaults 1 1
- proc /proc proc defaults 0 0
-EOF
-
-if [[ $? -ne 0 ]]; then
- exit 255
-fi
-
-if [[ ! -e "$install_root/etc/hosts" ]]; then
- cat > "$install_root/etc/hosts" <<-_EOF_
- 127.0.0.1 localhost
- _EOF_
-fi
-
-#
-# Perform distribution-specific changes.
-#
-distro=""
-if [[ -f etc/redhat-release ]]; then
- distro="redhat"
-elif [[ -f etc/lsb-release ]]; then
- if egrep -s Ubuntu etc/lsb-release; then
- distro="ubuntu"
- elif [[ -f etc/debian_version ]]; then
- distro="debian"
+ if [[ $? != 0 ]]; then
+ echo "ZFS receive command failed ($?)."
+ exit $ZONE_SUBPROC_FATAL
fi
-elif [[ -f etc/debian_version ]]; then
- distro="debian"
fi
-if [[ -z $distro ]]; then
- exit 255
-fi
+# One Joyent-ism we need to clean up.
+rmdir $ZONEPATH/cores
+# And one we should probably adopt.
+zfs set devices=off $ZONEPATH_DS
exit 0