usr/src/cmd/svc/shell/fs_include.sh
author gw25295
Fri, 11 Apr 2008 18:36:28 -0700
changeset 6423 437422a29d3a
parent 6168 51c045dcc498
permissions -rw-r--r--
PSARC 2006/370 ZFS Boot Support 5008936 ZFS and/or zvol should support dumps 5070124 dumpadm -d /dev/... does not enforce block device requirement for savecore 6521468 ZFS Boot support Phase 2 6553503 bfu can't find 'rootdev' from /etc/vfstab on a zfs root filesystem 6574993 zfs_mountroot() may need to call clkset() to set the boot_time kstat 6633197 zvol should not permit newfs or createpool while it's in use by swap or dump 6661127 zfs_name_valid() does not support ZFS_TYPE_POOL 6684121 The changes to smf scripts for supporting canmount=noauto will cause a boot failure.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
#!/bin/sh
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
# CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
# The contents of this file are subject to the terms of the
2716
bb7a9ab4a572 6352196 fsck cannot open disk images
mishra
parents: 974
diff changeset
     6
# Common Development and Distribution License (the "License").
bb7a9ab4a572 6352196 fsck cannot open disk images
mishra
parents: 974
diff changeset
     7
# You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
# or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
# See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
# and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
# When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
# If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
# fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
# information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
# CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
#
6168
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
    23
# Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
# Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
# Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
# All rights reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
vfstab=${vfstab:=/etc/vfstab}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
# readvfstab mount_point
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#   -> (special, fsckdev, mountp, fstype, fsckpass, automnt, mntopts)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#   A vfstab-like input stream is scanned for the mount point specified
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#   as $1.  Returns the fields of vfstab in the following shell
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#   variables:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#       special		block device
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#       fsckdev		raw device
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#       mountp		mount point (must match $1, if found)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#       fstype		file system type
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#       fsckpass	fsck(1M) pass number
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#       automnt		automount flag (yes or no)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#       mntopts		file system-specific mount options.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#   If the mount point can not be found in the standard input stream,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#   then all fields are set to empty values.  This function assumes that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#   stdin is already set /etc/vfstab (or other appropriate input
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#   stream).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
readvfstab() {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
	while read special fsckdev mountp fstype fsckpass automnt mntopts; do
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
		case "$special" in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
			'' )	# Ignore empty lines.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
				continue
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
				;;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
			'#'* )	# Ignore comment lines.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
				continue
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
				;;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
			'-')	# Ignore "no-action" lines.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
				continue
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
				;;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
		esac
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
		[ "x$mountp" = "x$1" ] && break
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
	done
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6168
diff changeset
    75
readswapdev() {
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6168
diff changeset
    76
	while read special fsckdev mountp fstype fsckpass automnt mntopts; do
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6168
diff changeset
    77
		# Ignore comments, empty lines, and no-action lines
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6168
diff changeset
    78
		case "$special" in
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6168
diff changeset
    79
		'#'* | '' | '-') continue;;
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6168
diff changeset
    80
		esac
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6168
diff changeset
    81
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6168
diff changeset
    82
		[ "$fstype" != swap ] && continue
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6168
diff changeset
    83
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6168
diff changeset
    84
		[ "x$special" = "x$1" ] && break
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6168
diff changeset
    85
	done
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6168
diff changeset
    86
}
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6168
diff changeset
    87
6168
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
    88
#
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
    89
# readmnttab mount_point
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
    90
#   -> (special, mountp, fstype, mntopts, mnttime)
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
    91
#
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
    92
#   A mnttab-like input stream is scanned for the mount point specified
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
    93
#   as $1.  Returns the fields of mnttab in the following shell
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
    94
#   variables:
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
    95
#
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
    96
#       special		block device
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
    97
#       mountp		mount point (must match $1, if found)
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
    98
#       fstype		file system type
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
    99
#       mntopts		file system-specific mount options.
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
   100
#	mnttime		time at which file system was mounted
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
   101
#
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
   102
#   If the mount point can not be found in the standard input stream,
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
   103
#   then all fields are set to empty values.  This function assumes that
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
   104
#   stdin is already set to /etc/mnttab (or other appropriate input
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
   105
#   stream).
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
   106
#
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
   107
readmnttab() {
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
   108
	while read special mountp fstype mntopts mnttime; do
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
   109
		[ "x$mountp" = "x$1" ] && break
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
   110
	done
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
   111
}
51c045dcc498 PSARC 2008/168 Support for ZFS property value canmount=noauto
hs24103
parents: 2716
diff changeset
   112
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
cecho() {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	echo $*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	echo $* >/dev/msglog
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
# checkmessage raw_device fstype mountpoint
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
# checkmessage2 raw_device fstype mountpoint
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
#   Two simple auxilary routines to the shell function checkfs.  Both
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
#   display instructions for a manual file system check.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
checkmessage() {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	cecho ""
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	cecho "WARNING - Unable to repair the $3 filesystem. Run fsck"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	cecho "manually (fsck -F $2 $1)."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
	cecho ""
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
checkmessage2() {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	cecho ""
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
	cecho "WARNING - fatal error from fsck - error $4"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	cecho "Unable to repair the $3 filesystem. Run fsck manually"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	cecho "(fsck -F $2 $1)."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	cecho ""
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
# checkfs raw_device fstype mountpoint
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
#   Check the file system specified. The return codes from fsck have the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
#   following meanings.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
#	 0	file system is unmounted and okay
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
#	32	file system is unmounted and needs checking (fsck -m only)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
#	33	file system is already mounted
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
#	34	cannot stat device
392
68e38aa09ba8 1260290 RFE: fsck error: UNKNOWN FILE TYPE describes multiple error conditions
swilcox
parents: 0
diff changeset
   150
#	35	modified root or something equally dangerous
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
#	36	uncorrectable errors detected - terminate normally (4.1 code 8)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
#	37	a signal was caught during processing (4.1 exit 12)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
#	39	uncorrectable errors detected - terminate rightaway (4.1 code 8)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
#	40	 for root, same as 0 (used here to remount root)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
checkfs() {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	# skip checking if the fsckdev is "-"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	[ "x$1" = x- ] && return
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	# if fsck isn't present, it is probably because either the mount of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	# /usr failed or the /usr filesystem is badly damanged.  In either
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
	# case, there is not much to be done automatically.  Fail with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	# a message to the user.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	if [ ! -x /usr/sbin/fsck ]; then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
		cecho ""
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
		cecho "WARNING - /usr/sbin/fsck not found.  Most likely the"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
		cecho "mount of /usr failed or the /usr filesystem is badly"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
		cecho "damaged."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
		cecho ""
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
		return 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	fi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
974
19b5ecbe56ef 6354381 checkfs() fails irritably for fsck-free filesystems
sch
parents: 392
diff changeset
   173
	# If a filesystem-specific fsck binary is unavailable, then no
19b5ecbe56ef 6354381 checkfs() fails irritably for fsck-free filesystems
sch
parents: 392
diff changeset
   174
	# fsck pass is required.
19b5ecbe56ef 6354381 checkfs() fails irritably for fsck-free filesystems
sch
parents: 392
diff changeset
   175
	[ ! -x /usr/lib/fs/$2/fsck ] && [ ! -x /etc/fs/$2/fsck ] && return
19b5ecbe56ef 6354381 checkfs() fails irritably for fsck-free filesystems
sch
parents: 392
diff changeset
   176
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	/usr/sbin/fsck -F $2 -m $1 >/dev/null 2>&1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	if [ $? -ne 0 ]; then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
		# Determine fsck options by file system type
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
		case $2 in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
			ufs)	foptions="-o p"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
				;;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
			*)	foptions="-y"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
				;;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
		esac
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
		cecho "The $3 file system ($1) is being checked."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
		/usr/sbin/fsck -F $2 $foptions $1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
		case $? in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
		0|40)	# File system OK
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
			;;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
		1|34|36|37|39)	# couldn't fix the file system - fail
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
			checkmessage "$1" "$2" "$3"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
			return 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
			;;
2716
bb7a9ab4a572 6352196 fsck cannot open disk images
mishra
parents: 974
diff changeset
   199
		33)	# already mounted
bb7a9ab4a572 6352196 fsck cannot open disk images
mishra
parents: 974
diff changeset
   200
			return 0
bb7a9ab4a572 6352196 fsck cannot open disk images
mishra
parents: 974
diff changeset
   201
			;;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
		*)	# fsck child process killed (+ error code 35)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
			checkmessage2 "$1" "$2" "$3" "$?"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
			return 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
			;;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
		esac
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	fi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	return 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
# checkopt option option-string
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
# -> ($option, $otherops)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
#   Check to see if a given mount option is present in the comma
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
#   separated list gotten from vfstab.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
#	Returns:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
#	${option}       : the option if found the empty string if not found
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
#	${otherops}     : the option string with the found option deleted
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
checkopt() {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
	option=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
	otherops=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	[ "x$2" = x- ] && return
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
	searchop="$1"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
	set -- `IFS=, ; echo $2`
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
	while [ $# -gt 0 ]; do
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
		if [ "x$1" = "x$searchop" ]; then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
			option="$1"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
			if [ -z "$otherops" ]; then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
				otherops="$1"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
				otherops="${otherops},$1"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
			fi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
		fi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
		shift
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
	done
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
# hasopts $opts $allopts
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
#   Check if all options from the list $opts are present in $allopts.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
#   Both $opts and $allopts should be in comma separated format.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
# Return 0 on success, and 1 otherwise.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
hasopts() {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
	opts="$1"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
	allopts="$2"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
	set -- `IFS=, ; echo $opts`
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
	while [ $# -gt 0 ]; do
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
		if [ "$1" != "remount" ]; then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
			checkopt $1 $allopts
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
			#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
			# Don't report errors if the filesystem is already
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
			# read-write when mounting it as read-only.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
			#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
			[ -z "$option" ] && [ "$1" = "ro" ] && \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
				checkopt rw $allopts
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
			[ -z "$option" ] && return 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
		fi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
		shift
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
	done
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
	return 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
# mounted $path $fsopts $fstype
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
#   Check whether the specified file system of the given type is currently
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
#   mounted with all required filesystem options by going through /etc/mnttab
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
#   in our standard input.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
#   Return values:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
#   0	Success.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
#   1	The filesystem is not currently mounted, or mounted without required
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
#	options, or a filesystem of a different type is mounted instead.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
mounted() {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
	path="$1"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
	fsopts="$2"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
	fstype="$3"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
	while read mntspec mntpath mnttype mntopts on; do
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
		[ "$mntpath" = "$path" ] || continue
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
		[ "$fstype" != "-" ] && [ "$mnttype" != "$fstype" ] && return 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
		[ "$fsopts" = "-" ] && return 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
		hasopts $fsopts $mntopts && return 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
	done
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
	return 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
# mountfs $opts $path $type $fsopts $special
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
#   Try to mount a filesystem.  If failed, display our standard error
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
#   message on the console and print more details about what happened 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
#   to our service log.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
# Arguments:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
#   $opts	- options for mount(1M)				[optional]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
#   $path	- mount point
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
#   $type	- file system type				[optional]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
#   $fsopts	- file system specific options (-o)		[optional]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
#   $special	- device on which the file system resides	[optional]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
# Return codes:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
#   0		- success.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
#   otherwise	- error code returned by mount(1M).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
mountfs() {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
	opts="$1"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
	path="$2"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
	special="$5"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
	#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	# Take care of optional arguments
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
	#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
	[ "$opts" = "-" ] && opts=""
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
	[ "$special" = "-" ] &&	special=""
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
	[ "$3" = "-" ] && type=""
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
	[ "$3" != "-" ] && type="-F $3"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
	[ "$4" = "-" ] && fsopts=""
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
	[ "$4" != "-" ] && fsopts="-o $4"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
	cmd="/sbin/mount $opts $type $fsopts $special $path"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
	msg=`$cmd 2>&1`
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
	err=$?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
	[ $err = 0 ] && return 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
	#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
	# If the specified file system is already mounted with all
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
	# required options, and has the same filesystem type
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
	# then ignore errors and return success
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
	#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
	mounted $path $4 $3 < /etc/mnttab && return 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	echo "ERROR: $SMF_FMRI failed to mount $path "\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
	     "(see 'svcs -x' for details)" > /dev/msglog
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	echo "ERROR: $cmd failed, err=$err"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
	echo $msg
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
	return $err
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
}