diff --git a/etc/rc.d/mountcritlocal b/etc/rc.d/mountcritlocal index 49f1ba9bdef8..20d247373c50 100755 --- a/etc/rc.d/mountcritlocal +++ b/etc/rc.d/mountcritlocal @@ -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) diff --git a/etc/rc.d/mountlate b/etc/rc.d/mountlate new file mode 100644 index 000000000000..1d4e33f401a1 --- /dev/null +++ b/etc/rc.d/mountlate @@ -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" diff --git a/sbin/mount/mount.8 b/sbin/mount/mount.8 index 47ea62151f6a..ec3ca96c4542 100644 --- a/sbin/mount/mount.8 +++ b/sbin/mount/mount.8 @@ -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. diff --git a/sbin/mount/mount.c b/sbin/mount/mount.c index 3da2d73a8618..3d25b7b8d00c 100644 --- a/sbin/mount/mount.c +++ b/sbin/mount/mount.c @@ -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);