Print this page
| Split |
Close |
| Expand all |
| Collapse all |
--- old/usr/src/lib/brand/lx/zone/lx_install.ksh
+++ new/usr/src/lib/brand/lx/zone/lx_install.ksh
1 1 #!/bin/ksh -p
2 2 #
|
↓ open down ↓ |
2 lines elided |
↑ open up ↑ |
3 3 # This file and its contents are supplied under the terms of the
4 4 # Common Development and Distribution License ("CDDL"), version 1.0.
5 5 # You may only use this file in accordance with the terms of version
6 6 # 1.0 of the CDDL.
7 7 #
8 8 # A full copy of the text of the CDDL should have accompanied this
9 9 # source. A copy of the CDDL is also available via the Internet at
10 10 # http://www.illumos.org/license/CDDL.
11 11 #
12 12 # Copyright 2016 Joyent, Inc. All rights reserved.
13 +# Copyright 2016 OmniTI Computer Consulting, Inc. All rights reserved.
13 14 #
14 15
15 -#
16 -# This is only an example install script. It is not currently used for anything.
17 -#
18 -
19 16 PATH=/bin:/usr/bin:/usr/sbin
20 17 export PATH
21 18
22 -fullpath()
23 -{
24 - typeset path="$1"
19 +. /usr/lib/brand/shared/common.ksh
25 20
26 - echo $path | egrep -s "^/" || path="${PWD:=$(pwd)}/$path"
27 - echo $path
28 -}
21 +ZFS_SEED=""
22 +TAR_SEED=""
29 23
30 -makedir()
31 -{
32 - typeset dirname=$(fullpath "$1")
33 - typeset mode=""
34 -
35 - [[ $# -eq 2 ]] && mode="-m $2"
36 -
37 - [[ -d "$dirname" ]] && return
38 -
39 - if ! mkdir $mode -p "$dirname"; then
40 - echo $(gettext "Aborting installation...")
41 - exit 255
42 - fi
24 +bad_usage() {
25 + echo "LX zone install bad option"
26 + echo "Available options are:"
27 + echo " -s <absolute-pathname> Path to ZFS send stream or gzip thereof"
28 + echo " -t <absolute-pathname> Path to tar archive or gzip thereof"
29 + exit $ZONE_SUBPROC_USAGE
43 30 }
44 31
45 -symlink()
46 -{
47 - typeset src="$1"
48 - typeset dst=$(fullpath "$2")
32 +while getopts "R:s:t:z:" opt
33 +do
34 + case "$opt" in
35 + R) ZONEPATH="$OPTARG";;
36 + z) ZONENAME="$OPTARG";;
37 + s) ZFS_SEED="$OPTARG";;
38 + t) TAR_SEED="$OPTARG";;
39 + *) bad_usage ;;
40 + esac
41 +done
42 +shift OPTIND-1
49 43
50 - [[ -e "$dst" || -h "$dst" ]] && rm -f "$dst"
51 -
52 - if ! ln -s "$src" "$dst"; then
53 - echo $(gettext "Aborting installation...")
54 - exit 255
55 - fi
56 -}
44 +if [[ $ZFS_SEED == "" && $TAR_SEED == "" ]]; then
45 + echo "The -s <absolute-pathname> argument or the -t <absolute-pathname>"
46 + echo "argument is required for LX installation."
47 + bad_usage
48 +fi
57 49
58 -install_ln()
59 -{
60 - typeset source="$1"
61 - typeset target=$(fullpath "$2")
50 +if [[ $ZFS_SEED != "" && $TAR_SEED != "" ]]; then
51 + echo "You must only specify one of -s or -t for LX installation."
52 + bad_usage
53 +fi
62 54
63 - log " Installing \"$target\""
55 +# Set the ZONEPATH_DS variable so we know the zone's dataset.
56 +get_zonepath_ds $ZONEPATH
64 57
65 - mv -f "$target" "$target.$tag" 2>/dev/null
58 +# Do something based on whatever ZFS_SEED is.
66 59
67 - if ! ln -s "$source" "$target"; then
68 - return 1
60 +if [[ -f $TAR_SEED ]]; then
61 + type=`file -b $TAR_SEED | awk '{print $1}'`
62 + if [[ $type == "gzip" ]]; then
63 + args="-xzf"
64 + else
65 + args="-xf"
66 + fi
67 + cd $ZONEPATH
68 + # Be very precise about permissions and ownership.
69 + mkdir -m 0755 dev
70 + chgrp sys dev
71 + mkdir -m 0755 root
72 + chgrp root sys
73 + cd root
74 + gtar $args $TAR_SEED
75 + exit 0
76 +elif [[ ! -f $ZFS_SEED ]]; then
77 + # Try and eat a snapshot or a filesystem.
78 + outstr=`zfs list -Ht filesystem $ZFS_SEED 2>/dev/null | awk '{print $1}'`
79 + if [[ $outstr == $ZFS_SEED ]]; then
80 + # We have a zfs filesystem name.
81 + # Snapshot it using today's date/time
82 + snapname=`date -u "+%Y-%m-%d:%H:%M:%S"`
83 + ZFS_SEED=$ZFS_SEED@$snapname
84 + zfs snapshot $ZFS_SEED
85 + if [[ $? != 0 ]]; then
86 + echo "ZFS snapshot ($ZFS_SEED) command failed ($?)."
87 + exit $ZONE_SUBPROC_FATAL
69 88 fi
89 + # else continue on with the new snapshot...
90 + fi
70 91
71 - return 0
72 -}
73 -
74 -# If we weren't passed 3 arguments, exit now.
75 -[[ $# -lt 3 ]] && exit 254
76 -
77 -# Extract the brand directory name from the path.
78 -branddir=$(dirname "$0")
79 -zonename="$1"
80 -zoneroot="$2"
81 -install_src="3"
82 -install_root="$zoneroot/root"
83 -ZPOOL=`df $ZONEROOT | awk -F '[()]' '{split($2, field, "/"); print field[1]; }'`
84 -if [ -z "$ZPOOL" ]; then
85 - ROOTDEV="none"
92 + outstr=`zfs list -Ht snapshot $ZFS_SEED 2>/dev/null | awk '{print $1}'`
93 + if [[ $outstr == $ZFS_SEED ]]; then
94 + # Hmmm, we found a snapshot name!
95 + echo "Cloning from snapshot $ZFS_SEED"
96 + # zoneadm already created $ZONEPATH_DS, destroy it before we clone.
97 + zfs destroy $ZONEPATH_DS
98 + zfs clone $ZFS_SEED $ZONEPATH_DS
99 + if [[ $? != 0 ]]; then
100 + echo "ZFS clone ($ZFS_SEED to $ZONEPATH_DS) failed ($?)."
101 + exit $ZONE_SUBPROC_FAIL
102 + fi
103 + # zfs promote $ZONEPATH_DS
104 + # if [[ $? != 0 ]]; then
105 + # echo "ZFS promote ($ZONEPATH_DS) failed ($?)."
106 + # exit $ZONE_SUBPROC_FAIL
107 + # fi
108 + else
109 + echo "Seed file $ZFS_SEED $TAR_SEED not found."
110 + bad_usage
111 + fi
86 112 else
87 - ROOTDEV="/dev/$ZPOOL"
88 -fi
113 + type=`file -b $ZFS_SEED | awk '{print $1}'`
89 114
90 -if [[ ! -f "$install_src" ]]; then
91 - echo "$install_src: file not found\n"
92 - exit 254
93 -fi
115 + # For now, we are dependent on the output of file(1).
116 + # I'm being cheesy in checking the first word of file(1)'s output.
117 + if [[ $type == "ZFS" ]]; then
118 + zfs recv -F $ZONEPATH_DS < $ZFS_SEED
119 + elif [[ $type == "gzip" ]]; then
120 + gunzip -c $ZFS_SEED | zfs recv -F $ZONEPATH_DS
121 + else
122 + echo "Seed file $ZFS_SEED not a ZFS receive (or compressed) one."
123 + bad_usage
124 + fi
94 125
95 -if [[ ! -d "$install_root" ]]; then
96 - if ! mkdir -p "$install_root" 2>/dev/null; then
97 - echo "Could not create install directory $install_root"
98 - exit 254
99 - fi
126 + if [[ $? != 0 ]]; then
127 + echo "ZFS receive command failed ($?)."
128 + exit $ZONE_SUBPROC_FATAL
129 + fi
100 130 fi
101 131
102 -if ! ( cd "$install_root" && gtar -xzf "$install_src" ) ; then
103 - echo "Error: extraction from tar archive failed"
104 - exit 255
105 -fi
132 +# One Joyent-ism we need to clean up.
133 +rmdir $ZONEPATH/cores
134 +# And one we should probably adopt.
135 +zfs set devices=off $ZONEPATH_DS
106 136
107 -tag="lxsave_$(date +%m.%d.%Y@%T)"
108 -
109 -if [[ ! -d "$install_root" ]]; then
110 - exit 255
111 -fi
112 -
113 -cd "$install_root"
114 -
115 -makedir native/dev
116 -makedir native/etc/default
117 -makedir native/etc/svc/volatile
118 -makedir native/lib
119 -makedir native/proc
120 -makedir native/tmp 1777
121 -makedir native/usr
122 -makedir native/var
123 -
124 -makedir mnt
125 -makedir opt
126 -makedir usr/local/bin
127 -makedir usr/local/include
128 -makedir usr/local/lib
129 -makedir usr/local/sbin
130 -makedir usr/local/share
131 -makedir usr/local/src
132 -
133 -makedir dev 0755
134 -makedir tmp 1777
135 -makedir proc 0555
136 -makedir boot 0755
137 -
138 -symlink /bin/sh sbin/sh
139 -symlink /bin/su usr/bin/su
140 -symlink /native/usr/lib/ld.so.1 usr/lib/ld.so.1
141 -
142 -libpam_so="$(echo lib/libpam.so.0.*)"
143 -libpam_misc="$(echo lib/libpam_misc.so.0.*)"
144 -libpamc_so="$(echo lib/libpamc.so.0.*)"
145 -
146 -symlink "/$libpam_so" lib/libpam.so.0
147 -symlink "/$libpam_misc" lib/libpam_misc.so.0
148 -symlink "/$libpamc_so" lib/libpamc.so.0
149 -
150 -makedir var/ld
151 -
152 -if ! crle -c var/ld/ld.config -l /native/lib:/native/usr/lib \
153 - -s /native/lib/secure:/native/usr/lib/secure; then
154 - exit 255
155 -fi
156 -
157 -mv -f etc/fstab etc/fstab.$tag 2>/dev/null
158 -
159 -cat > etc/fstab <<- EOF
160 - $ROOTDEV / zfs defaults 1 1
161 - proc /proc proc defaults 0 0
162 -EOF
163 -
164 -if [[ $? -ne 0 ]]; then
165 - exit 255
166 -fi
167 -
168 -if [[ ! -e "$install_root/etc/hosts" ]]; then
169 - cat > "$install_root/etc/hosts" <<-_EOF_
170 - 127.0.0.1 localhost
171 - _EOF_
172 -fi
173 -
174 -#
175 -# Perform distribution-specific changes.
176 -#
177 -distro=""
178 -if [[ -f etc/redhat-release ]]; then
179 - distro="redhat"
180 -elif [[ -f etc/lsb-release ]]; then
181 - if egrep -s Ubuntu etc/lsb-release; then
182 - distro="ubuntu"
183 - elif [[ -f etc/debian_version ]]; then
184 - distro="debian"
185 - fi
186 -elif [[ -f etc/debian_version ]]; then
187 - distro="debian"
188 -fi
189 -
190 -if [[ -z $distro ]]; then
191 - exit 255
192 -fi
193 -
194 137 exit 0
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX