Home | History | Annotate | Download | only in milestone
      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 2009 Sun Microsystems, Inc.  All rights reserved.
     24 # Use is subject to license terms.
     25 #
     26 #
     27 #
     28 
     29 # Make sure that the libraries essential to this stage of booting can be found.
     30 LD_LIBRARY_PATH=/lib; export LD_LIBRARY_PATH
     31 
     32 libc_mount() {
     33 	#
     34 	# If there is an optimized libc available in /usr that fits this
     35 	# processor, mount it on top of the base libc.
     36 	#
     37 	LIBC_MOE_32=`/usr/bin/moe -32 '/usr/lib/libc/$HWCAP'`
     38 	if [ -n "$LIBC_MOE_32" ]; then
     39 		/usr/sbin/mount | egrep -s "^/lib/libc.so.1 on "
     40 		if [ $? -ne 0 ]; then
     41 			/usr/sbin/mount -O -F lofs $LIBC_MOE_32 /lib/libc.so.1
     42 		fi
     43 	fi
     44 
     45 	ARCH64=`isainfo | awk '{print $1}'`
     46 	LIBC_MOE_64=`/usr/bin/moe -64 /usr/lib/$ARCH64/libc/'$HWCAP'`
     47 	if [ -n "$LIBC_MOE_64" ]; then
     48 		/usr/sbin/mount | egrep -s "^/lib/$ARCH64/libc.so.1 on "
     49 		if [ $? -ne 0 ]; then
     50 			/usr/sbin/mount -O -F lofs $LIBC_MOE_64 \
     51 				/lib/$ARCH64/libc.so.1
     52 		fi
     53 	fi
     54 }
     55 
     56 # This mount function is sun4v only. It may be melded with the sun4u-us3
     57 # version later.
     58 sun4v_libc_psr_mount() {
     59 	LIBC_MOE_32=`/usr/bin/moe -32 /platform/$PLAT/lib/libc_psr/'$HWCAP'`
     60 	if [ -n "$LIBC_MOE_32" ]; then
     61 		/usr/sbin/mount |
     62 		    egrep -s "^/platform/[^/]*/lib/libc_psr.so.1 on "
     63 		if [ $? -ne 0 ]; then
     64 			/usr/sbin/mount -O -F lofs $LIBC_MOE_32 \
     65 			    /platform/$PLAT/lib/libc_psr.so.1
     66 		fi
     67 	fi
     68 
     69 	LIBC_MOE_64=`/usr/bin/moe -64 \
     70 	    /platform/$PLAT/lib/sparcv9/libc_psr/'$HWCAP'`
     71 	if [ -n "$LIBC_MOE_64" ]; then
     72 		/usr/sbin/mount |
     73 		    egrep -s "^/platform/[^/]*/lib/sparcv9/libc_psr.so.1 on "
     74 		if [ $? -ne 0 ]; then
     75 			/usr/sbin/mount -O -F lofs $LIBC_MOE_64 \
     76 			    /platform/$PLAT/lib/sparcv9/libc_psr.so.1
     77 		fi
     78 	fi
     79 }
     80 
     81 # This is specific to sun4u[-us3].
     82 # try to intelligently handle the various ways that a hwcap library can
     83 # be present for libc_psr for sun4u.
     84 sun4u_libc_psr_mount() {
     85 	# first look for $PLAT specific
     86 	# the string $HWCAP is not an env var but part of the argument to moe
     87 	LIBC_MOE_32=`/usr/bin/moe -32 /platform/$PLAT/lib/libc_psr/'$HWCAP'`
     88 	if [ -n "$LIBC_MOE_32" ]; then
     89 		/usr/sbin/mount |
     90 		    egrep -s "^/platform/$PLAT/lib/libc_psr.so.1 on "
     91 		if [ $? -ne 0 ]; then
     92 			/usr/sbin/mount -O -F lofs $LIBC_MOE_32 \
     93 			    /platform/$PLAT/lib/libc_psr.so.1
     94 		fi
     95 	else
     96 		# try the 'generic' one under $ARCH
     97 		LIBC_MOE_32=`/usr/bin/moe -32 \
     98 		    /platform/$ARCH/lib/libc_psr/'$HWCAP'`
     99 		if [ -n "$LIBC_MOE_32" ]; then
    100 			/usr/sbin/mount |
    101 			    egrep -s "^/platform/$ARCH/lib/libc_psr.so.1 on "
    102 			if [ $? -ne 0 ]; then
    103 				/usr/sbin/mount -O -F lofs $LIBC_MOE_32 \
    104 				    /platform/$ARCH/lib/libc_psr.so.1
    105 			fi
    106 		fi
    107 
    108 	fi
    109 
    110 	# now repeat for 64 bit.
    111 
    112 	LIBC_MOE_64=`/usr/bin/moe -64 \
    113 	    /platform/$PLAT/lib/sparcv9/libc_psr/'$HWCAP'`
    114 	if [ -n "$LIBC_MOE_64" ]; then
    115 		/usr/sbin/mount |
    116 		    egrep -s "^/platform/$PLAT/lib/sparcv9/libc_psr.so.1 on "
    117 		if [ $? -ne 0 ]; then
    118 			/usr/sbin/mount -O -F lofs $LIBC_MOE_64 \
    119 			    /platform/$PLAT/lib/sparcv9/libc_psr.so.1
    120 		fi
    121 	else
    122 		# now try $ARCH version
    123 		LIBC_MOE_64=`/usr/bin/moe -64 \
    124 		    /platform/$ARCH/lib/sparcv9/libc_psr/'$HWCAP'`
    125 		if [ -n "$LIBC_MOE_64" ]; then
    126 			/usr/sbin/mount |
    127 			    egrep -s \
    128 			    "^/platform/$ARCH/lib/sparcv9/libc_psr.so.1 on "
    129 			if [ $? -ne 0 ]; then
    130 				/usr/sbin/mount -O -F lofs $LIBC_MOE_64 \
    131 				    /platform/$ARCH/lib/sparcv9/libc_psr.so.1
    132 			fi
    133 		fi
    134 	fi
    135 }
    136 
    137 # 
    138 # Discover architecture and find and mount optimal libc_psr 
    139 #  
    140 libc_psr_mount() {
    141 	PLAT=`/usr/bin/uname -i` 
    142 	ARCH=`/usr/bin/uname -m` 
    143 	if [ "$ARCH" = "sun4v" ]; then 
    144 		# Check if we already loaded libc_hwcapX.so.1 thru libc_mount
    145 		# We can get rid of this check (and the libc_psr mount),
    146 		# if all the sun4v platforms start using libc_hwcap.
    147 		if [ ! -n "$LIBC_MOE_32" ]; then
    148 			sun4v_libc_psr_mount
    149 		fi
    150 	elif [ "$ARCH" = "sun4u" ]; then 
    151 		if [ -h /platform/$PLAT/lib/libc_psr.so.1 ]; then 
    152 			LINKSTO=`/usr/bin/ls -l \
    153 			    /platform/$PLAT/lib/libc_psr.so.1 | 
    154 			    /usr/bin/awk '{print $NF}'` 
    155 			if [ "$LINKSTO" = \
    156 			    "../../sun4u-us3/lib/libc_psr.so.1" ]; then 
    157 				ARCH=sun4u-us3 
    158 			fi
    159 		fi
    160 		sun4u_libc_psr_mount 
    161 	fi
    162 }
    163 
    164 . /lib/svc/share/smf_include.sh
    165 . /lib/svc/share/fs_include.sh
    166 
    167 #
    168 # Most of the operations in this script are only necessary in the global
    169 # zone but due to the way initialization scripts like this are packaged,
    170 # it needs to currently exist for all zones.
    171 #
    172 if smf_is_nonglobalzone; then
    173 	libc_mount
    174 	libc_psr_mount
    175 	exit $SMF_EXIT_OK
    176 fi
    177 
    178 #
    179 # Root is already mounted (by the kernel), but still needs to be
    180 # checked, possibly remounted and entered into mnttab.  First
    181 # mount /usr if it is a separate file system.  If the file system
    182 # type is something other than zfs, mount it read-only.  This must
    183 # be done first to allow utilities such as fsck and setmnt to
    184 # reside on /usr minimizing the space required by the root file
    185 # system.
    186 #
    187 readvfstab "/usr" < $vfstab
    188 if [ -n "$mountp" ]; then
    189 	if [ "$fstype" = cachefs ]; then
    190 		#
    191 		# Mount without the cache initially.  We'll enable it
    192 		# later at remount time.  This lets us avoid
    193 		# teaching the statically linked mount program about
    194 		# cachefs.  Here we determine the backfstype.
    195 		# This is not pretty, but we have no tools for parsing
    196 		# the option string until we get /usr mounted...
    197 		#
    198 		case "$mntopts" in
    199 		*backfstype=nfs*)
    200 			cfsbacktype=nfs
    201 			;;
    202 		*backfstype=hsfs*)
    203 			cfsbacktype=hsfs
    204 			;;
    205 		*)
    206 			msg='invalid vfstab entry for /usr'
    207 			echo $msg
    208 			echo "$SMF_FMRI:" $msg >/dev/msglog
    209 			cfsbacktype=nfs
    210 			;;
    211 		esac
    212 		mountfs - /usr $cfsbacktype ro $special ||
    213 		    exit $SMF_EXIT_ERR_FATAL
    214 	elif [ "$fstype" = zfs ]; then
    215 		mountfs - /usr $fstype $mntopts - || exit $SMF_EXIT_ERR_FATAL
    216 	else
    217 		#
    218 		# Must use -o largefiles here to ensure the
    219 		# read-only mount does not fail as a result of
    220 		# having a large file present on /usr. This gives
    221 		# fsck a chance to fix up the largefiles flag
    222 		# before we remount /usr read-write.
    223 		#
    224 		if [ "x$mntopts" = x- ]; then
    225 			mntopts='ro,largefiles'
    226 		else
    227 			checkopt largefiles $mntopts
    228 			if [ "x$option" != xlargefiles ]; then
    229 				mntopts="largefiles,$mntopts"
    230 			fi
    231 
    232 			checkopt ro $mntopts
    233 			if [ "x$option" != xro ]; then
    234 				mntopts="ro,$mntopts"
    235 			fi
    236 
    237 			#
    238 			# Requesting logging on a read-only mount
    239 			# causes errors to be displayed, so remove
    240 			# "logging" from the list of options for now.
    241 			# The read-write mount performed later will
    242 			# specify the logging option if appropriate.
    243 			#
    244 
    245 			checkopt logging $mntopts
    246 			if [ "x$option" = xlogging ]; then
    247 				mntopts="$otherops"
    248 			fi
    249 		fi
    250 
    251 		mountfs -O /usr $fstype $mntopts - || exit $SMF_EXIT_ERR_FATAL
    252 	fi
    253 fi
    254 
    255 #
    256 # if we are booted from zfs, the /usr mount probably won't be a
    257 # legacy mount.  Use the standard zfs mount command instead.
    258 
    259 readmnttab "/" < /etc/mnttab
    260 if [ "$fstype" = zfs ]; then
    261 	mountp=`/sbin/zfs get -H -o value mountpoint $special/usr 2>/dev/null`
    262 	#
    263 	# if mountp = /usr, there is a non-legacy mount of /usr
    264 	# in the boot environment being booted.
    265 	#
    266 	if [ "x$mountp" = "x/usr" ] ; then
    267 		/sbin/zfs mount $special/usr
    268 		if [ $? != 0 ] ; then
    269 				msg='zfs-mount failed'
    270 				echo $msg
    271 				echo "$SMF_FMRI:" $msg >/dev/msglog
    272 		 	exit $SMF_EXIT_ERR_FATAL
    273 		fi
    274 	fi
    275 fi
    276 
    277 #
    278 # Also mount /boot now so that things like keymap.sh can access
    279 # boot properties through eeprom.  Readonly isn't required because
    280 # /boot (and other pcfs filesystems) aren't fsck'ed at boot yet.
    281 # Also, we don't account for caching /boot as it must be on a local
    282 # disk.  So what's in vfstab is fine as it stands; just look to see
    283 # if it's there and avoid the mount if not.
    284 #
    285 readvfstab "/boot" < $vfstab
    286 
    287 if [ -n "$mountp" ]; then
    288 	mountfs - /boot $fstype $mntopts - || exit $SMF_EXIT_ERR_FATAL
    289 fi
    290 
    291 #
    292 # Update kernel driver.conf cache with any additional driver.conf
    293 # files found on /usr, and device permissions from /etc/minor_perm.
    294 #
    295 /usr/sbin/devfsadm -I -P
    296 
    297 libc_mount
    298 libc_psr_mount
    299 
    300 exit $SMF_EXIT_OK
    301