1
0
mirror of https://git.FreeBSD.org/src.git synced 2025-01-17 15:27:36 +00:00

Teach mount(8) about a 'late' keyword, which means the file system should

not be mounted unless the -l flag was specified.

Add an rc script, mountlate, which basically runs 'mount -a -l'.  It runs
after DAEMON but before LOGIN.

This is useful for things like loopback mounts, because mountcritremote
runs before mountd  / nfsd (since /usr might be a remote file system), so
an attempt to mount a loopback network file system in mountcritremote will
fail.

Also add a progress message to mountcritlocal, for the sake of symmetry
with similar messages in mountcritremote and mountlate.

Reviewed by:	freebsd-rc
MFC after:	3 weeks
This commit is contained in:
Dag-Erling Smørgrav 2006-07-12 16:05:51 +00:00
parent 7f5932be3e
commit 4b4f91707c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=160303
4 changed files with 76 additions and 7 deletions

View File

@ -27,6 +27,7 @@ mountcritlocal_start()
esac
# Mount everything except nfs filesystems.
echo -n 'Mounting local file systems:'
mount_excludes='no'
for i in ${netfs_types}; do
fstype=${i%:*}
@ -34,6 +35,7 @@ mountcritlocal_start()
done
mount_excludes=${mount_excludes%,}
mount -a -t ${mount_excludes}
echo '.'
case $? in
0)

36
etc/rc.d/mountlate Normal file
View File

@ -0,0 +1,36 @@
#!/bin/sh
#
# $FreeBSD$
#
# PROVIDE: mountlate
# REQUIRE: DAEMON
# BEFORE: LOGIN
# KEYWORD: nojail
. /etc/rc.subr
name="mountlate"
start_cmd="mountlate_start"
stop_cmd=":"
mountlate_start()
{
# Mount "late" filesystems.
echo -n 'Mounting late file systems:'
mount -a -l
echo '.'
case $? in
0)
;;
*)
echo 'Mounting /etc/fstab filesystems failed,' \
' startup aborted'
kill -QUIT $$
;;
esac
}
load_rc_config $name
run_rc_command "$1"

View File

@ -28,7 +28,7 @@
.\" @(#)mount.8 8.8 (Berkeley) 6/16/94
.\" $FreeBSD$
.\"
.Dd November 26, 2004
.Dd July 12, 2006
.Dt MOUNT 8
.Os
.Sh NAME
@ -36,7 +36,7 @@
.Nd mount file systems
.Sh SYNOPSIS
.Nm
.Op Fl adfpruvw
.Op Fl adflpruvw
.Op Fl F Ar fstab
.Op Fl o Ar options
.Op Fl t Ar ufs | external_type
@ -78,7 +78,12 @@ All the file systems described in
are mounted.
Exceptions are those marked as
.Dq noauto ,
excluded by the
those marked as
.Dq late
(unless the
.Fl l
option was specified),
those excluded by the
.Fl t
flag (see below), or if they are already mounted (except the
root file system which is always remounted to preserve
@ -101,6 +106,11 @@ a file system mount status from read-write to read-only.
Also
forces the R/W mount of an unclean file system (dangerous; use with
caution).
.It Fl l
When used in conjunction with the
.Fl a
option, also mount those file systems which are marked as
.Dq late .
.It Fl o
Options are specified with a
.Fl o
@ -142,6 +152,13 @@ When used with the
flag, this is the same as specifying all the options listed in the
.Xr fstab 5
file for the file system.
.It Cm late
This file system should be skipped when
.Nm is run with the
.Fl a
flag but without the
.Fl l
flag.
.It Cm multilabel
Enable multi-label Mandatory Access Control, or MAC, on the specified file
system.

View File

@ -191,17 +191,17 @@ main(int argc, char *argv[])
struct statfs *mntbuf;
FILE *mountdfp;
pid_t pid;
int all, ch, i, init_flags, mntsize, rval, have_fstab;
int all, ch, i, init_flags, late, mntsize, rval, have_fstab;
char *cp, *ep, *options;
options = strdup("noro");
if (options == NULL)
errx(1, "malloc failed");
all = init_flags = 0;
all = init_flags = late = 0;
vfslist = NULL;
vfstype = "ufs";
while ((ch = getopt(argc, argv, "adF:fo:prwt:uv")) != -1)
while ((ch = getopt(argc, argv, "adlF:fo:prwt:uv")) != -1)
switch (ch) {
case 'a':
all = 1;
@ -215,6 +215,9 @@ main(int argc, char *argv[])
case 'f':
init_flags |= MNT_FORCE;
break;
case 'l':
late = 1;
break;
case 'o':
options = catopt(options, optarg);
break;
@ -265,6 +268,8 @@ main(int argc, char *argv[])
continue;
if (hasopt(fs->fs_mntops, "noauto"))
continue;
if (hasopt(fs->fs_mntops, "late") && !late)
continue;
if (!(init_flags & MNT_UPDATE) &&
ismounted(fs, mntbuf, mntsize))
continue;
@ -628,6 +633,15 @@ mangle(char *options, int *argcp, char *argv[])
* not a real mount option.
*/
continue;
} else if (strcmp(p, "late") == 0) {
/*
* "late" is used to prevent certain file
* systems from being mounted before late
* in the boot cycle; for instance,
* loopback NFS mounts can't be mounted
* before mountd starts.
*/
continue;
} else if (strcmp(p, "userquota") == 0) {
continue;
} else if (strncmp(p, userquotaeq,
@ -737,7 +751,7 @@ usage(void)
{
(void)fprintf(stderr, "%s\n%s\n%s\n",
"usage: mount [-adfpruvw] [-F fstab] [-o options] [-t ufs | external_type]",
"usage: mount [-adflpruvw] [-F fstab] [-o options] [-t ufs | external_type]",
" mount [-dfpruvw] special | node",
" mount [-dfpruvw] [-o options] [-t ufs | external_type] special node");
exit(1);