xref: /illumos-gate/usr/src/cmd/stmsboot/mpxio-upgrade (revision 60a3f738d56f92ae8b80e4b62a2331c6e1f2311f)
1#!/sbin/sh
2#
3# CDDL HEADER START
4#
5# The contents of this file are subject to the terms of the
6# Common Development and Distribution License (the "License").
7# You may not use this file except in compliance with the License.
8#
9# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10# or http://www.opensolaris.org/os/licensing.
11# See the License for the specific language governing permissions
12# and limitations under the License.
13#
14# When distributing Covered Code, include this CDDL HEADER in each
15# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16# If applicable, add the following below this CDDL HEADER, with the
17# fields enclosed by brackets "[]" replaced with your own identifying
18# information: Portions Copyright [yyyy] [name of copyright owner]
19#
20# CDDL HEADER END
21#
22#
23# Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
24# Use is subject to license terms.
25#
26#ident	"%Z%%M%	%I%	%E% SMI"
27
28. /lib/svc/share/fs_include.sh
29. /lib/svc/share/net_include.sh
30
31# Make sure that the essential libraries can be found.
32LD_LIBRARY_PATH=/lib; export LD_LIBRARY_PATH
33STMSBOOTUTIL=/lib/mpxio/stmsboot_util
34FPCONF=/kernel/drv/fp.conf
35SAVEDIR=/etc/mpxio
36RECOVERFILE=$SAVEDIR/recover_instructions
37DEVFSADM=/usr/sbin/devfsadm
38METADEVADM=/usr/sbin/metadevadm
39usrmounted=0
40
41# map $special and $fsckdev
42mpxio_mapdev()
43{
44	new_special=`$STMSBOOTUTIL -m $special`
45	if [ $? -eq 0 ]; then
46		special=$new_special
47	fi
48
49	new_fsckdev=`$STMSBOOTUTIL -m $fsckdev`
50	if [ $? -eq 0 ]; then
51		fsckdev=$new_fsckdev
52	fi
53}
54
55mpxio_error()
56{
57	cecho "\nERROR: stmsboot: $1"
58	#
59	# display recovery instructions - the first call logs to the service
60	# log and the second call displays on the console.
61	#
62	shcat $RECOVERFILE
63	shcat $RECOVERFILE >/dev/msglog 2>&1
64	cecho "These instructions were also logged to the file $RECOVERFILE\n"
65}
66
67#
68# root ("/") is already mounted read only by the kernel.
69# Remount the root read-write.
70#
71mpxio_mount_root()
72{
73	exec < $vfstab; readvfstab /
74	mpxio_mapdev
75
76	checkopt "llock" $mntopts
77	mntopts='remount'
78	[ -n "$otherops" ] && mntopts="${mntopts},${otherops}"
79	/sbin/mount -m -F $fstype -o $mntopts $special $mountp \
80>/dev/msglog 2>&1
81}
82
83#
84# mount /usr read only
85#
86mpxio_mount_usr()
87{
88	exec < $vfstab; readvfstab "/usr"
89	ret_val=0
90	if [ -n "$mountp" ]; then
91		mpxio_mapdev
92		if [ "$fstype" = cachefs ]; then
93			# Mount read-only without the cache.
94			case "$mntopts" in
95			*backfstype=nfs*)
96				cfsbacktype=nfs
97				;;
98			*backfstype=hsfs*)
99				cfsbacktype=hsfs
100				;;
101			*)
102				cecho 'stmsboot: invalid vfstab entry for /usr'
103				cfsbacktype=nfs
104				;;
105			esac
106			# see the comment below for /dev/null
107			/sbin/mount -m -F $cfsbacktype -o ro $special $mountp \
108>/dev/null 2>&1
109			ret_val=$?
110		else
111			#
112			# Must use -o largefiles here to ensure the read-only
113			# mount does not fail as a result of having a large
114			# file present on /usr.
115			#
116			if [ "x$mntopts" = x- ]; then
117				mntopts='ro,largefiles'
118			else
119				checkopt largefiles $mntopts
120				if [ "x$option" != xlargefiles ]; then
121					mntopts="largefiles,$mntopts"
122				fi
123
124				checkopt ro $mntopts
125				if [ "x$option" != xro ]; then
126					mntopts="ro,$mntopts"
127				fi
128
129				#
130				# Requesting logging on a read-only mount
131				# causes errors to be displayed, so remove
132				# "logging" from the list of options.
133				#
134
135				checkopt logging $mntopts
136				if [ "x$option" = xlogging ]; then
137					mntopts="$otherops"
138				fi
139			fi
140
141			#
142			# In case of a manual restart of the service, mount
143			# will emit messages if /usr is already mounted.
144			# So redirect the output to /dev/null.
145			#
146			/sbin/mount -m -F $fstype -o $mntopts $special /usr \
147>/dev/null 2>&1
148			ret_val=$?
149		fi
150		if [ $ret_val -eq 0 ]; then
151			usrmounted=1
152		fi
153	fi
154
155	return $ret_val
156}
157
158# update system dump configuration
159update_dumpconf()
160{
161	#
162	# Disable device-in-use checking (done in libdiskmgt).
163	# Without disabling this check, the configuration of dump device
164	# would fail as the device-in-use code incorrectly concludes that
165	# the device is in use and hence prevents configuration of the dump
166	# device.
167	#
168	NOINUSE_CHECK=1
169	export NOINUSE_CHECK
170
171	set -- `dumpadm -u 2>&1 | egrep 'cannot use /dev.* as dump device'`
172	if [ "x$4" != x ]; then
173		newname=`$STMSBOOTUTIL -M $4`
174		if [ $? -eq 0 ]; then
175			if dumpadm -d $newname > /dev/null; then
176				cecho "stmsboot: dump configuration has been \
177updated."
178			else
179				mpxio_error "failed to configure $newname as \
180the dump device.\nold dump device name: $4"
181				return 1
182			fi
183		fi
184	fi
185	return 0
186}
187
188#
189# do the actual work
190#
191mpxio_main()
192{
193	#
194	# NOTE: If the first attempt to run the service has failed due to an
195	# expected error, users should be able to manually rerun the service.
196	#
197	# First mount /usr read only. This must be done to run
198	# utilities such as fsck and devfsadm.
199	# In the case of a manual rerun of the service, mounting of /usr here
200	# fails if /usr already happens to be mounted. It is better that we
201	# do not mount /usr if already mounted, but there seems to be no
202	# apparent way to check whether /usr is mounted or not as we mount
203	# /usr without making an entry into /etc/mnttab. So instead of
204	# explicitly checking for mount failures, we just do a sanity check
205	# by looking for some file (in this case devfsadm) in /usr.
206	#
207	mpxio_mount_usr
208	if [ ! -s $DEVFSADM ]; then
209		mpxio_error "failed to mount the /usr filesystem."
210		return
211	fi
212
213	if mpxio_mount_root; then
214		# create /dev links
215		cecho "stmsboot: configuring devices"
216		$DEVFSADM
217
218		# update /etc/vfstab to reflect device name changes
219		if $STMSBOOTUTIL -u >/dev/msglog 2>&1; then
220			if update_dumpconf; then
221				# update svm configuration to reflect new names
222				if [ -s /kernel/drv/md.conf ] && \
223				    [ -x $METADEVADM ]; then
224					$METADEVADM -r >/dev/msglog 2>&1
225				fi
226			fi
227		else
228			mpxio_error "failed to update /etc/vfstab."
229		fi
230
231		/usr/sbin/svcadm disable platform/sun4u/mpxio-upgrade
232
233		/usr/sbin/reboot
234	else
235		mpxio_error "failed to mount the root filesystem."
236		if [ $usrmounted -eq 1 ]; then
237			/sbin/umount /usr
238		fi
239	fi
240}
241
242mpxio_main
243