xref: /illumos-gate/usr/src/cmd/svc/milestone/fs-usr (revision f5c2e7ea56aaa46a9976476fb0cb1f02b9426f07)
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 (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
24#
25# Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T.
26# All rights reserved.
27#
28#
29. /lib/svc/share/smf_include.sh
30. /lib/svc/share/fs_include.sh
31
32UPDATEFILE=/etc/svc/volatile/boot_archive_needs_update
33
34#
35# Once root is read/write we can enable the dedicated dumpdevice if it exists
36# locally. This is an optimization as svc-dumpadm will attempt do this later.
37#
38dump_setup()
39{
40	[ -r /etc/dumpadm.conf ] && . /etc/dumpadm.conf
41
42	readswapdev $DUMPADM_DEVICE < $vfstab
43
44	#
45	# Make sure that the dump save area has been configured before
46	# proceeding. If the variable has not been defined or does not exist
47	# then bail out early. This will prevent us from configuring a
48	# dump save area before a hostname has been configured (i.e after
49	# sys-unconfig has been invoked).
50	#
51	[ -z "$DUMPADM_SAVDIR" ] && return
52
53	#
54	# If we have a dedicated dump device, then go ahead and configure it.
55	#
56	if [ "x$special" != "x$DUMPADM_DEVICE" ]; then
57		if [ -x /usr/sbin/dumpadm -a -b $DUMPADM_DEVICE ]; then
58			/usr/sbin/dumpadm -u || exit $SMF_EXIT_ERR_CONFIG
59		fi
60	fi
61}
62
63#
64# Write a unique id into this kernel image; this will be included
65# in the dump header and panicbuf of any crashdump of this image.
66#
67if [ -x /usr/sbin/dumpadm ]; then
68	/usr/sbin/dumpadm -i
69fi
70
71rootiszfs=0
72# get the fstype of root
73readmnttab / </etc/mnttab
74if [ "$fstype" = zfs ] ; then
75	rootiszfs=1
76	dump_setup
77fi
78
79#
80# Add physical swap.
81#
82/sbin/swapadd -1
83
84#
85# Check and remount the / (root) file system.
86# For NFS mounts, force the llock option on.
87#
88if smf_is_globalzone && [ $rootiszfs = 0 ]; then
89	readvfstab / < $vfstab
90	checkfs $fsckdev $fstype $mountp || exit $SMF_EXIT_ERR_FATAL
91	checkopt "llock" $mntopts
92	mntopts='remount'
93
94	[ -n "$otherops" ] && mntopts="${mntopts},${otherops}"
95	[ "$fstype" = nfs ] && mntopts="${mntopts},llock"
96
97	# if root dev is a read-only metadevice then fail
98	case $special in
99	/dev/md/dsk/*)
100		dd if=/dev/null of=$special count=0 >/dev/null 2>&1 ||
101		    exit $SMF_EXIT_ERR_FATAL
102		;;
103	esac
104
105	mountfs -m $mountp $fstype $mntopts - || exit $SMF_EXIT_ERR_FATAL
106fi
107
108#
109# Check and remount the /usr file system (formerly mounted read-only).
110# Unless root is zfs, in which case we've already mounted /usr read-write
111#
112if [ "$rootiszfs" = 0 ] ; then
113	readvfstab /usr < $vfstab
114	if [ "$mountp" ]; then
115		if [ "$fstype" = cachefs ]; then
116			mountfs -O $mountp cachefs $mntopts $special ||
117			    exit $SMF_EXIT_ERR_FATAL
118		else
119			checkopt ro $mntopts
120			if [ "x$option" != xro ]; then
121				checkfs $fsckdev $fstype $mountp ||
122				    exit $SMF_EXIT_ERR_FATAL
123				if [ "x$mntopts" != x- ]; then
124					mntopts="remount,$mntopts"
125				else
126					mntopts="remount"
127				fi
128
129				# if usr dev is a read-only metadevice then fail
130				case $special in
131				/dev/md/dsk/*)
132					dd if=/dev/null of=$special count=0 \
133					    >/dev/null 2>&1 || exit $SMF_EXIT_ERR_FATAL
134					;;
135				esac
136
137				mountfs - /usr $fstype $mntopts - ||
138				    exit $SMF_EXIT_ERR_FATAL
139			fi
140		fi
141	fi
142fi
143
144#
145# Check and mount the /usr/platform file system.  This should only be
146# present when a SunOS 5.5 (Solaris 2.5) or greater client is being
147# administered by a SunOS 5.4 or less host.
148#
149readvfstab /usr/platform < $vfstab
150if [ "$mountp" ]; then
151	checkfs $fsckdev $fstype $mountp || exit $SMF_EXIT_ERR_FATAL
152	mountfs - $mountp $fstype $mntopts - || exit $SMF_EXIT_ERR_FATAL
153fi
154
155#
156# Mount the fd file systems if mount point exists.
157#
158readvfstab /dev/fd < $vfstab
159if [ "$mountp" -a -d /dev/fd ]; then
160	mountfs - /dev/fd - - - || exit $SMF_EXIT_ERR_FATAL
161fi
162
163if [ -f "${UPDATEFILE}" ]; then
164	/usr/sbin/bootadm update-archive
165	if [ $? != 0 ]; then
166		cecho ""
167		cecho "WARNING: Automatic update of the boot archive failed."
168		cecho "Update the archives using 'bootadm update-archive'"
169		cecho "command and then reboot the system from the same device that"
170		cecho "was previously booted."
171		cecho ""
172		exit $SMF_EXIT_ERR_FATAL
173	fi
174	rm -f $UPDATEFILE
175	bootcmd=`/usr/sbin/eeprom bootcmd | /usr/bin/sed -e 's#bootcmd=##g'`
176	if [ `uname -p` = "i386" ]; then
177		/usr/sbin/reboot -f dryrun
178		if [ $? = 0 ]; then
179			/usr/sbin/reboot -f -- "$bootcmd"
180			exit $SMF_EXIT_OK
181		fi
182		boot_prop=`/usr/sbin/svccfg -s svc:/system/boot-config:default listprop config/auto-reboot-safe | \
183			/usr/bin/nawk '{ print $3}'`
184		if [ "$boot_prop" != "true" ]; then
185			cecho ""
186			cecho "WARNING: Reboot required."
187			cecho "The system has updated the cache of files (boot archive) that is used"
188			cecho "during the early boot sequence. To avoid booting and running the system"
189			cecho "with the previously out-of-sync version of these files, reboot the"
190			cecho "system from the same device that was previously booted."
191			cecho ""
192			exit $SMF_EXIT_ERR_FATAL
193		else
194			/usr/sbin/reboot -p
195			exit $SMF_EXIT_OK
196		fi
197	fi
198	/usr/sbin/reboot -- "$bootcmd"
199fi
200
201exit $SMF_EXIT_OK
202