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) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
  24 # Copyright 2015 Nexenta Systems, Inc. All rights reserved.
  25 #
  26 
  27 # Make sure that the libraries essential to this stage of booting can be found.
  28 LD_LIBRARY_PATH=/lib; export LD_LIBRARY_PATH
  29 
  30 libc_mount() {
  31         #
  32         # If there is an optimized libc available in /usr that fits this
  33         # processor, mount it on top of the base libc.
  34         #
  35         LIBC_MOE_32=`/usr/bin/moe -32 '/usr/lib/libc/$HWCAP'`
  36         if [ -n "$LIBC_MOE_32" ]; then
  37                 /usr/sbin/mount | egrep -s "^/lib/libc.so.1 on "
  38                 if [ $? -ne 0 ]; then
  39                         /usr/sbin/mount -O -F lofs $LIBC_MOE_32 /lib/libc.so.1
  40                 fi
  41         fi
  42 
  43         ARCH64=`isainfo | awk '{print $1}'`
  44         LIBC_MOE_64=`/usr/bin/moe -64 /usr/lib/$ARCH64/libc/'$HWCAP'`
  45         if [ -n "$LIBC_MOE_64" ]; then
  46                 /usr/sbin/mount | egrep -s "^/lib/$ARCH64/libc.so.1 on "
  47                 if [ $? -ne 0 ]; then
  48                         /usr/sbin/mount -O -F lofs $LIBC_MOE_64 \
  49                                 /lib/$ARCH64/libc.so.1
  50                 fi
  51         fi
  52 }
  53 
  54 . /lib/svc/share/smf_include.sh
  55 . /lib/svc/share/fs_include.sh
  56 
  57 #
  58 # Most of the operations in this script are only necessary in the global
  59 # zone but due to the way initialization scripts like this are packaged,
  60 # it needs to currently exist for all zones.
  61 #
  62 if smf_is_nonglobalzone; then
  63         libc_mount
  64         exit $SMF_EXIT_OK
  65 fi
  66 
  67 #
  68 # Root is already mounted (by the kernel), but still needs to be
  69 # checked, possibly remounted and entered into mnttab.  First
  70 # mount /usr if it is a separate file system.  If the file system
  71 # type is something other than zfs, mount it read-only.  This must
  72 # be done first to allow utilities such as fsck and setmnt to
  73 # reside on /usr minimizing the space required by the root file
  74 # system.
  75 #
  76 readvfstab "/usr" < $vfstab
  77 if [ -n "$mountp" ]; then
  78         if [ "$fstype" = zfs ]; then
  79                 mountfs - /usr $fstype $mntopts - || exit $SMF_EXIT_ERR_FATAL
  80         else
  81                 #
  82                 # Must use -o largefiles here to ensure the
  83                 # read-only mount does not fail as a result of
  84                 # having a large file present on /usr. This gives
  85                 # fsck a chance to fix up the largefiles flag
  86                 # before we remount /usr read-write.
  87                 #
  88                 if [ "x$mntopts" = x- ]; then
  89                         mntopts='ro,largefiles'
  90                 else
  91                         checkopt largefiles $mntopts
  92                         if [ "x$option" != xlargefiles ]; then
  93                                 mntopts="largefiles,$mntopts"
  94                         fi
  95 
  96                         checkopt ro $mntopts
  97                         if [ "x$option" != xro ]; then
  98                                 mntopts="ro,$mntopts"
  99                         fi
 100 
 101                         #
 102                         # Requesting logging on a read-only mount
 103                         # causes errors to be displayed, so remove
 104                         # "logging" from the list of options for now.
 105                         # The read-write mount performed later will
 106                         # specify the logging option if appropriate.
 107                         #
 108 
 109                         checkopt logging $mntopts
 110                         if [ "x$option" = xlogging ]; then
 111                                 mntopts="$otherops"
 112                         fi
 113                 fi
 114 
 115                 mountfs -O /usr $fstype $mntopts - || exit $SMF_EXIT_ERR_FATAL
 116         fi
 117 fi
 118 
 119 #
 120 # if we are booted from zfs, the /usr mount probably won't be a
 121 # legacy mount.  Use the standard zfs mount command instead.
 122 
 123 readmnttab "/" < /etc/mnttab
 124 if [ "$fstype" = zfs ]; then
 125         mountp=`/sbin/zfs get -H -o value mountpoint $special/usr 2>/dev/null`
 126         #
 127         # if mountp = /usr, there is a non-legacy mount of /usr
 128         # in the boot environment being booted.
 129         #
 130         if [ "x$mountp" = "x/usr" ] ; then
 131                 /sbin/zfs mount $special/usr
 132                 if [ $? != 0 ] ; then
 133                                 msg='zfs-mount failed'
 134                                 echo $msg
 135                                 echo "$SMF_FMRI:" $msg >/dev/msglog
 136                         exit $SMF_EXIT_ERR_FATAL
 137                 fi
 138         fi
 139 fi
 140 
 141 #
 142 # Also mount /boot now so that things like keymap.sh can access
 143 # boot properties through eeprom.  Readonly isn't required because
 144 # /boot (and other pcfs filesystems) aren't fsck'ed at boot yet.
 145 # Also, we don't account for caching /boot as it must be on a local
 146 # disk.  So what's in vfstab is fine as it stands; just look to see
 147 # if it's there and avoid the mount if not.
 148 #
 149 readvfstab "/boot" < $vfstab
 150 
 151 if [ -n "$mountp" ]; then
 152         mountfs - /boot $fstype $mntopts - || exit $SMF_EXIT_ERR_FATAL
 153 fi
 154 
 155 #
 156 # Update kernel driver.conf cache with any additional driver.conf
 157 # files found on /usr, and device permissions from /etc/minor_perm.
 158 #
 159 /usr/sbin/devfsadm -I -P
 160 
 161 libc_mount
 162 
 163 exit $SMF_EXIT_OK