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 # Copyright 2015 Nexenta Systems, Inc. All rights reserved.
28 #
29 . /lib/svc/share/smf_include.sh
30 . /lib/svc/share/fs_include.sh
31
32 UPDATEFILE=/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 #
38 dump_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 #
67 if [ -x /usr/sbin/dumpadm ]; then
68 /usr/sbin/dumpadm -i
69 fi
70
71 rootiszfs=0
72 # get the fstype of root
73 readmnttab / </etc/mnttab
74 if [ "$fstype" = zfs ] ; then
75 rootiszfs=1
76 dump_setup
77 fi
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 #
88 if 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
106 fi
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 #
112 if [ "$rootiszfs" = 0 ] ; then
113 readvfstab /usr < $vfstab
114 if [ "$mountp" ]; then
115 checkopt ro $mntopts
116 if [ "x$option" != xro ]; then
117 checkfs $fsckdev $fstype $mountp ||
118 exit $SMF_EXIT_ERR_FATAL
119 if [ "x$mntopts" != x- ]; then
120 mntopts="remount,$mntopts"
121 else
122 mntopts="remount"
123 fi
124
125 # if usr dev is a read-only metadevice then fail
126 case $special in
127 /dev/md/dsk/*)
128 dd if=/dev/null of=$special count=0 \
129 >/dev/null 2>&1 || exit $SMF_EXIT_ERR_FATAL
130 ;;
131 esac
132
133 mountfs - /usr $fstype $mntopts - ||
134 exit $SMF_EXIT_ERR_FATAL
135 fi
136 fi
137 fi
138
139 #
140 # Check and mount the /usr/platform file system. This should only be
141 # present when a SunOS 5.5 (Solaris 2.5) or greater client is being
142 # administered by a SunOS 5.4 or less host.
143 #
144 readvfstab /usr/platform < $vfstab
145 if [ "$mountp" ]; then
146 checkfs $fsckdev $fstype $mountp || exit $SMF_EXIT_ERR_FATAL
147 mountfs - $mountp $fstype $mntopts - || exit $SMF_EXIT_ERR_FATAL
148 fi
149
150 #
151 # Mount the fd file systems if mount point exists.
152 #
153 readvfstab /dev/fd < $vfstab
154 if [ "$mountp" -a -d /dev/fd ]; then
155 mountfs - /dev/fd - - - || exit $SMF_EXIT_ERR_FATAL
156 fi
157
158 if [ -f "${UPDATEFILE}" ]; then
159 /usr/sbin/bootadm update-archive
160 if [ $? != 0 ]; then
161 cecho ""
162 cecho "WARNING: Automatic update of the boot archive failed."
163 cecho "Update the archives using 'bootadm update-archive'"
164 cecho "command and then reboot the system from the same device that"
165 cecho "was previously booted."
166 cecho ""
167 exit $SMF_EXIT_ERR_FATAL
168 fi
169 rm -f $UPDATEFILE
170 bootcmd=`/usr/sbin/eeprom bootcmd | /usr/bin/sed -e 's#bootcmd=##g'`
171 if [ `uname -p` = "i386" ]; then
172 /usr/sbin/reboot -f dryrun
173 if [ $? = 0 ]; then
174 /usr/sbin/reboot -f -- "$bootcmd"
175 exit $SMF_EXIT_OK
176 fi
177 boot_prop=`/usr/sbin/svccfg -s svc:/system/boot-config:default listprop config/auto-reboot-safe | \
178 /usr/bin/nawk '{ print $3}'`
179 if [ "$boot_prop" != "true" ]; then
180 cecho ""
181 cecho "WARNING: Reboot required."
182 cecho "The system has updated the cache of files (boot archive) that is used"
183 cecho "during the early boot sequence. To avoid booting and running the system"
184 cecho "with the previously out-of-sync version of these files, reboot the"
185 cecho "system from the same device that was previously booted."
186 cecho ""
187 exit $SMF_EXIT_ERR_FATAL
188 else
189 /usr/sbin/reboot -p
190 exit $SMF_EXIT_OK
191 fi
192 fi
193 /usr/sbin/reboot -- "$bootcmd"
194 fi
195
196 exit $SMF_EXIT_OK