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 
  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                 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
 142 fi
 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 #
 149 readvfstab /usr/platform < $vfstab
 150 if [ "$mountp" ]; then
 151         checkfs $fsckdev $fstype $mountp || exit $SMF_EXIT_ERR_FATAL
 152         mountfs - $mountp $fstype $mntopts - || exit $SMF_EXIT_ERR_FATAL
 153 fi
 154 
 155 #
 156 # Mount the fd file systems if mount point exists.
 157 #
 158 readvfstab /dev/fd < $vfstab
 159 if [ "$mountp" -a -d /dev/fd ]; then
 160         mountfs - /dev/fd - - - || exit $SMF_EXIT_ERR_FATAL
 161 fi
 162 
 163 if [ -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"
 199 fi
 200 
 201 exit $SMF_EXIT_OK