Print this page
Modernize CDDL license text and copyrights for OmniTI-original code.
Factor out SetKeyboardLayout so a PXE server-side config can call it out.
Fix PXE regressions.
Do better on keyboard selection, plus save it in installed image.
Also, pv(1) output for install doesn't scroll anymore.
Kayak for ISO checkpoint 1
Initial foray into Kayak for ISO
| Split |
Close |
| Expand all |
| Collapse all |
--- old/install_help.sh
+++ new/install_help.sh
1 1 #!/usr/bin/bash
2 +
2 3 #
3 -# CDDL HEADER START
4 +# This file and its contents are supplied under the terms of the
5 +# Common Development and Distribution License ("CDDL"), version 1.0.
6 +# You may only use this file in accordance with the terms of version
7 +# 1.0 of the CDDL.
4 8 #
5 -# The contents of this file are subject to the terms of the
6 -# Common Development and Distribution License, Version 1.0 only
7 -# (the "License"). You may not use this file except in compliance
8 -# with the License.
9 +# A full copy of the text of the CDDL should have accompanied this
10 +# source. A copy of the CDDL is also available via the Internet at
11 +# http://www.illumos.org/license/CDDL.
9 12 #
10 -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
11 -# or http://www.opensolaris.org/os/licensing.
12 -# See the License for the specific language governing permissions
13 -# and limitations under the License.
13 +
14 14 #
15 -# When distributing Covered Code, include this CDDL HEADER in each
16 -# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
17 -# If applicable, add the following below this CDDL HEADER, with the
18 -# fields enclosed by brackets "[]" replaced with your own identifying
19 -# information: Portions Copyright [yyyy] [name of copyright owner]
15 +# Copyright 2017 OmniTI Computer Consulting, Inc. All rights reserved.
20 16 #
21 -# CDDL HEADER END
22 -#
23 -#
24 -# Copyright 2012 OmniTI Computer Consulting, Inc. All rights reserved.
25 -# Use is subject to license terms.
26 -#
17 +
27 18 LOG_SETUP=0
28 19
29 20 ConsoleLog(){
30 21 exec 4>/dev/console
31 22 exec 1>>${1}
32 23 exec 2>>${1}
33 24 INSTALL_LOG=${1}
34 25 LOG_SETUP=1
35 26 }
36 27 CopyInstallLog(){
37 28 if [[ -n "$INSTALL_LOG" ]]; then
38 29 cp $INSTALL_LOG $ALTROOT/var/log/install/kayak.log
39 30 fi
40 31 }
41 32 SendInstallLog(){
42 33 PUTURL=`echo $CONFIG | sed -e 's%/kayak/%/kayaklog/%g;'`
43 34 PUTURL=`echo $PUTURL | sed -e 's%/kayak$%/kayaklog%g;'`
44 35 curl -T $INSTALL_LOG $PUTURL/$ETHER
45 36 }
46 37 OutputLog(){
47 38 if [[ "$LOG_SETUP" -eq "0" ]]; then
48 39 exec 4>/dev/null
49 40 LOG_SETUP=1
50 41 fi
51 42 }
52 43 log() {
53 44 OutputLog
54 45 TS=`date +%Y/%m/%d-%H:%M:%S`
55 46 echo "[$TS] $*" 1>&4
56 47 echo "[$TS] $*"
57 48 }
58 49 bomb() {
59 50 log
60 51 log ======================================================
61 52 log "$*"
62 53 log ======================================================
63 54 if [[ -n "$INSTALL_LOG" ]]; then
64 55 log "For more information, check $INSTALL_LOG"
65 56 log ======================================================
66 57 fi
67 58 exit 1
68 59 }
69 60
70 61 . /kayak/net_help.sh
71 62 . /kayak/disk_help.sh
72 63
73 64 ICFILE=/tmp/_install_config
74 65 getvar(){
75 66 prtconf -v /devices | sed -n '/'$1'/{;n;p;}' | cut -f2 -d\'
76 67 }
77 68
78 69 # Blank
79 70 ROOTPW='$5$kr1VgdIt$OUiUAyZCDogH/uaxH71rMeQxvpDEY2yX.x0ZQRnmeb9'
80 71 RootPW(){
81 72 ROOTPW="$1"
82 73 }
83 74 SetRootPW(){
84 75 sed -i -e 's%^root::%root:'$ROOTPW':%' $ALTROOT/etc/shadow
85 76 }
86 77 ForceDHCP(){
87 78 log "Forcing all interfaces into DHCP..."
88 79 /sbin/ifconfig -a plumb 2> /dev/null
89 80 # for the logs
90 81 for iface in `/sbin/dladm show-phys -o device -p` ; do
91 82 /sbin/ifconfig $iface dhcp &
92 83 done
|
↓ open down ↓ |
56 lines elided |
↑ open up ↑ |
93 84 while [[ -z $(/sbin/dhcpinfo BootSrvA) ]]; do
94 85 log "Waiting for dhcpinfo..."
95 86 sleep 1
96 87 done
97 88 BOOTSRVA=`/sbin/dhcpinfo BootSrvA`
98 89 log "Next server: $BOOTSRVA"
99 90 sleep 1
100 91 }
101 92
102 93 BuildBE() {
103 - BOOTSRVA=`/sbin/dhcpinfo BootSrvA`
104 - MEDIA=`getvar install_media`
105 - MEDIA=`echo $MEDIA | sed -e "s%//\:%//$BOOTSRVA\:%g;"`
106 - MEDIA=`echo $MEDIA | sed -e "s%///%//$BOOTSRVA/%g;"`
107 - zfs set compression=on rpool
108 - zfs create rpool/ROOT
109 - zfs set canmount=off rpool/ROOT
110 - zfs set mountpoint=legacy rpool/ROOT
94 + RPOOL=${1:-rpool}
95 + if [[ -z $2 ]]; then
96 + BOOTSRVA=`/sbin/dhcpinfo BootSrvA`
97 + MEDIA=`getvar install_media`
98 + MEDIA=`echo $MEDIA | sed -e "s%//\:%//$BOOTSRVA\:%g;"`
99 + MEDIA=`echo $MEDIA | sed -e "s%///%//$BOOTSRVA/%g;"`
100 + DECOMP="bzip2 -dc"
101 + GRAB="curl -s"
102 + else
103 + # ASSUME $2 is a file path. TODO: Parse the URL...
104 + MEDIA=$2
105 + # TODO: make switch statement based on $MEDIA's extension.
106 + # e.g. "bz2" ==> "bzip -dc", "7z" ==>
107 + DECOMP="bzip2 -dc"
108 + GRAB=cat
109 + fi
110 + zfs set compression=on $RPOOL
111 + zfs create $RPOOL/ROOT
112 + zfs set canmount=off $RPOOL/ROOT
113 + zfs set mountpoint=legacy $RPOOL/ROOT
111 114 log "Receiving image: $MEDIA"
112 - curl -s $MEDIA | pv -B 128m | bzip2 -dc | zfs receive -u rpool/ROOT/omnios
113 - zfs set canmount=noauto rpool/ROOT/omnios
114 - zfs set mountpoint=legacy rpool/ROOT/omnios
115 + $GRAB $MEDIA | pv -B 128m -w 78 | $DECOMP | zfs receive -u $RPOOL/ROOT/omnios
116 + zfs set canmount=noauto $RPOOL/ROOT/omnios
117 + zfs set mountpoint=legacy $RPOOL/ROOT/omnios
115 118 log "Cleaning up boot environment"
116 119 beadm mount omnios /mnt
117 120 ALTROOT=/mnt
118 121 cp $ALTROOT/lib/svc/seed/global.db $ALTROOT/etc/svc/repository.db
119 122 chmod 0600 $ALTROOT/etc/svc/repository.db
120 123 chown root:sys $ALTROOT/etc/svc/repository.db
121 124 /usr/sbin/devfsadm -r /mnt
122 125 [[ -L $ALTROOT/dev/msglog ]] || \
123 126 ln -s ../devices/pseudo/sysmsg@0:msglog $ALTROOT/dev/msglog
124 127 MakeSwapDump
125 - zfs destroy rpool/ROOT/omnios@kayak
128 + zfs destroy $RPOOL/ROOT/omnios@kayak
126 129 }
127 130
128 131 FetchConfig(){
129 132 ETHER=`Ether`
130 133 BOOTSRVA=`/sbin/dhcpinfo BootSrvA`
131 134 CONFIG=`getvar install_config`
132 135 CONFIG=`echo $CONFIG | sed -e "s%//\:%//$BOOTSRVA\:%g;"`
133 136 CONFIG=`echo $CONFIG | sed -e "s%///%//$BOOTSRVA/%g;"`
134 137 L=${#ETHER}
135 138 while [[ "$L" -gt "0" ]]; do
136 139 URL="$CONFIG/${ETHER:0:$L}"
137 140 log "... trying $URL"
138 141 /bin/curl -s -o $ICFILE $URL
139 142 if [[ -f $ICFILE ]]; then
140 143 if [[ -n $(grep BuildRpool $ICFILE) ]]; then
141 144 log "fetched config."
|
↓ open down ↓ |
6 lines elided |
↑ open up ↑ |
142 145 return 0
143 146 fi
144 147 rm -f $ICFILE
145 148 fi
146 149 L=$(($L - 1))
147 150 done
148 151 return 1
149 152 }
150 153
151 154 MakeBootable(){
155 + RPOOL=${1:-rpool}
152 156 log "Making boot environment bootable"
153 - zpool set bootfs=rpool/ROOT/omnios rpool
157 + zpool set bootfs=$RPOOL/ROOT/omnios rpool
154 158 # Must do beadm activate first on the off chance we're bootstrapping from
155 159 # GRUB.
156 - beadm activate omnios
160 + beadm activate omnios || return 1
157 161
162 + if [[ ! -z $1 ]]; then
163 + # Generate kayak-disk-list from zpool status.
164 + # NOTE: If this is something on non-s0 slices, the installboot below
165 + # will fail most likely, which is possibly a desired result.
166 + zpool list -v $RPOOL | egrep -v "NAME|rpool|mirror" | \
167 + awk '{print $1}' | sed -E 's/s0$//g' > /tmp/kayak-disk-list
168 + fi
169 +
158 170 # NOTE: This installboot loop assumes we're doing GPT whole-disk rpools.
159 171 for i in `cat /tmp/kayak-disk-list`
160 172 do
161 - installboot -mf /boot/pmbr /boot/gptzfsboot /dev/rdsk/${i}s0
173 + installboot -mfF /boot/pmbr /boot/gptzfsboot /dev/rdsk/${i}s0 || return 1
162 174 done
163 175
164 - bootadm update-archive -R $ALTROOT
176 + bootadm update-archive -R $ALTROOT || return 1
165 177 return 0
166 178 }
167 179
168 180 SetHostname()
169 181 {
170 182 log "Setting hostname: ${1}"
171 183 /bin/hostname "$1"
172 184 echo "$1" > $ALTROOT/etc/nodename
173 185 head -n 26 $ALTROOT/etc/hosts > /tmp/hosts
174 186 echo "::1\t\t$1" >> /tmp/hosts
175 187 echo "127.0.0.1\t$1" >> /tmp/hosts
176 188 cat /tmp/hosts > $ALTROOT/etc/hosts
177 189 }
178 190
179 191 AutoHostname() {
180 192 suffix=$1
181 193 macadr=`/sbin/ifconfig -a | \
182 194 /usr/bin/awk '/UP/{if($2 !~ /LOOPBACK/){iface=$1;}} /ether/{if(iface){print $2; exit;}}' | \
183 195 /bin/tr '[:upper:]' '[:lower:]' | \
184 196 /bin/sed -e 's/^/ 0/g;s/:/-0/g; s/0\([0-9a-f][0-9a-f]\)/\1/g; s/ //g;'`
185 197 [ -z $suffix ] && suffix=omnios
|
↓ open down ↓ |
11 lines elided |
↑ open up ↑ |
186 198 [ "$suffix" == "-" ] && suffix= || suffix=-$suffix
187 199 SetHostname $macadr$suffix
188 200 }
189 201
190 202 SetTimezone()
191 203 {
192 204 log "Setting timezone: ${1}"
193 205 sed -i -e "s:^TZ=.*:TZ=${1}:" $ALTROOT/etc/default/init
194 206 }
195 207
208 +SetLang()
209 +{
210 + log "Setting language: ${1}"
211 + sed -i -e "s:^LANG=.*:LANG=${1}:" $ALTROOT/etc/default/init
212 +}
213 +
214 +SetKeyboardLayout()
215 +{
216 + # Put the new keyboard layout ($1) in
217 + # "setprop keyboard-layout <foo>" in the newly-installed root's
218 + # /boot/solaris/bootenv.rc (aka. eeprom(1M) storage for amd64/i386).
219 + layout=$1
220 + sed "s/keyboard-layout Unknown/keyboard-layout $layout/g" \
221 + < $ALTROOT/boot/solaris/bootenv.rc > /tmp/bootenv.rc
222 + mv /tmp/bootenv.rc $ALTROOT/boot/solaris/bootenv.rc
223 + # Also modify the SMF manifest, assuming US-English was set by default.
224 + sed "s/US-English/$layout/g" \
225 + < $ALTROOT/lib/svc/manifest/system/keymap.xml > /tmp/keymap.xml
226 + cp -f /tmp/keymap.xml $ALTROOT/lib/svc/manifest/system/keymap.xml
227 +}
228 +
196 229 ApplyChanges(){
197 230 SetRootPW
198 231 [[ -L $ALTROOT/etc/svc/profile/generic.xml ]] || \
199 232 ln -s generic_limited_net.xml $ALTROOT/etc/svc/profile/generic.xml
200 233 [[ -L $ALTROOT/etc/svc/profile/name_service.xml ]] || \
201 234 ln -s ns_dns.xml $ALTROOT/etc/svc/profile/name_service.xml
235 +
236 + # Extras from interactive ISO/USB install...
237 + # arg1 == hostname
238 + if [[ ! -z $1 ]]; then
239 + SetHostname $1
240 + fi
241 +
242 + # arg2 == timezone
243 + if [[ ! -z $2 ]]; then
244 + SetTimezone $2
245 + fi
246 +
247 + # arg3 == Language
248 + if [[ ! -z $3 ]]; then
249 + SetLang $3
250 + fi
251 +
252 + # arg4 == Keyboard layout
253 + if [[ ! -z $4 ]]; then
254 + SetKeyboardLayout $4
255 + fi
256 +
202 257 return 0
203 258 }
204 259
205 260 Postboot() {
206 261 [[ -f $ALTROOT/.initialboot ]] || touch $ALTROOT/.initialboot
207 262 echo "$*" >> $ALTROOT/.initialboot
208 263 }
209 264
210 265 Reboot() {
211 266 # This is an awful hack... we already setup bootadm
212 267 # and we've likely deleted enough of the userspace that this
213 268 # can't run successfully... The easiest way to skip it is to
214 269 # remove the binary
215 270 rm -f /sbin/bootadm
216 271 svccfg -s "system/boot-config:default" setprop config/fastreboot_default=false
217 272 svcadm refresh svc:/system/boot-config:default
218 273 reboot
219 274 }
220 275
221 276 RunInstall(){
222 - FetchConfig || bomb "Could not fecth kayak config for target"
277 + FetchConfig || bomb "Could not fetch kayak config for target"
278 + # Set RPOOL if it wasn't done so already. We need it set.
279 + RPOOL=${RPOOL:-rpool}
223 280 . $ICFILE
224 281 Postboot 'exit $SMF_EXIT_OK'
225 282 ApplyChanges || bomb "Could not apply all configuration changes"
226 283 MakeBootable || bomb "Could not make new BE bootable"
227 284 log "Install complete"
228 285 return 0
229 286 }
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX