Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 1 Nov 2019 03:10:53 +0000 (UTC)
From:      Kyle Evans <kevans@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r354236 - head/sbin/mdmfs
Message-ID:  <201911010310.xA13ArC0061756@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kevans
Date: Fri Nov  1 03:10:53 2019
New Revision: 354236
URL: https://svnweb.freebsd.org/changeset/base/354236

Log:
  mdmfs(8): add -k skel option to populate fs from a skeleton
  
  mdmfs(8) lacks the ability to populate throwaway memory filesystems from an
  existing directory.
  
  This features permits an interesting setup where /var for instance lives on
  a device where wear-leveling is something you want to avoid as much as
  possible and nonetheless you don't want to lose your logs, ports metadata,
  etc. Here are the steps:
  
  1. Copy /var to /var.bak;
  2. Mount an mfs into /var using -k /var.bak at startup;
  3. Synchronize /var to /var.bak weekly and on shutdown.
  
  Note that this more or less mimics OpenBSD's mount_mfs(8) -P flag.
  
  PR:		146254
  Submitted by:	jlh (many moons ago)
  MFC after:	1 week

Modified:
  head/sbin/mdmfs/mdmfs.8
  head/sbin/mdmfs/mdmfs.c

Modified: head/sbin/mdmfs/mdmfs.8
==============================================================================
--- head/sbin/mdmfs/mdmfs.8	Fri Nov  1 02:55:58 2019	(r354235)
+++ head/sbin/mdmfs/mdmfs.8	Fri Nov  1 03:10:53 2019	(r354236)
@@ -25,7 +25,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd September 9, 2017
+.Dd October 31, 2019
 .Dt MDMFS 8
 .Os
 .Sh NAME
@@ -48,6 +48,7 @@ filesystem
 .Op Fl F Ar file
 .Op Fl f Ar frag-size
 .Op Fl i Ar bytes
+.Op Fl k Ar skel
 .Op Fl m Ar percent-free
 .Op Fl O Ar optimization
 .Op Fl o Ar mount-options
@@ -193,6 +194,11 @@ memory disk backed by
 The fragment size of the file system in bytes.
 .It Fl i Ar bytes
 Number of bytes per inode.
+.It Fl k Ar skel
+Copy the content of directory
+.Ar skel
+into
+.Ar mount-point .
 .It Fl l
 Enable multilabel MAC on the new file system.
 .It Fl L

Modified: head/sbin/mdmfs/mdmfs.c
==============================================================================
--- head/sbin/mdmfs/mdmfs.c	Fri Nov  1 02:55:58 2019	(r354235)
+++ head/sbin/mdmfs/mdmfs.c	Fri Nov  1 03:10:53 2019	(r354236)
@@ -88,6 +88,7 @@ static void	 do_mount_md(const char *, const char *);
 static void	 do_mount_tmpfs(const char *, const char *);
 static void	 do_mtptsetup(const char *, struct mtpt_info *);
 static void	 do_newfs(const char *);
+static void	 do_copy(const char *, const char *);
 static void	 extract_ugid(const char *, struct mtpt_info *);
 static int	 run(int *, const char *, ...) __printflike(2, 3);
 static const char *run_exitstr(int);
@@ -104,7 +105,7 @@ main(int argc, char **argv)
 	enum md_types mdtype;		/* The type of our memory disk. */
 	bool have_mdtype, mlmac;
 	bool detach, softdep, autounit, newfs;
-	const char *mtpoint, *size_arg, *unitstr;
+	const char *mtpoint, *size_arg, *skel, *unitstr;
 	char *p;
 	int ch, idx;
 	void *set;
@@ -118,6 +119,7 @@ main(int argc, char **argv)
 	mlmac = false;
 	newfs = true;
 	have_mdtype = false;
+	skel = NULL;
 	mdtype = MD_SWAP;
 	mdname = MD_NAME;
 	mdnamelen = strlen(mdname);
@@ -142,7 +144,7 @@ main(int argc, char **argv)
 	}
 
 	while ((ch = getopt(argc, argv,
-	    "a:b:Cc:Dd:E:e:F:f:hi:LlMm:NnO:o:Pp:Ss:tT:Uv:w:X")) != -1)
+	    "a:b:Cc:Dd:E:e:F:f:hi:k:LlMm:NnO:o:Pp:Ss:tT:Uv:w:X")) != -1)
 		switch (ch) {
 		case 'a':
 			argappend(&newfs_arg, "-a %s", optarg);
@@ -184,6 +186,9 @@ main(int argc, char **argv)
 		case 'i':
 			argappend(&newfs_arg, "-i %s", optarg);
 			break;
+		case 'k':
+			skel = optarg;
+			break;
 		case 'L':
 			loudsubs = true;
 			break;
@@ -359,6 +364,8 @@ main(int argc, char **argv)
 	}
 
 	do_mtptsetup(mtpoint, &mi);
+	if (skel != NULL)
+		do_copy(mtpoint, skel);
 
 	return (0);
 }
@@ -615,7 +622,24 @@ do_newfs(const char *args)
 		    run_exitnumber(rv));
 }
 
+
 /*
+ * Copy skel into the mountpoint.
+ */
+static void
+do_copy(const char *mtpoint, const char *skel)
+{
+	int rv;
+
+	rv = chdir(skel);
+	if (rv != 0)
+		err(1, "chdir to %s", skel);
+	rv = run(NULL, "/bin/pax -rw -pe . %s", mtpoint);
+	if (rv != 0)
+		errx(1, "skel copy failed");
+}
+
+/*
  * 'str' should be a user and group name similar to the last argument
  * to chown(1); i.e., a user, followed by a colon, followed by a
  * group.  The user and group in 'str' may be either a [ug]id or a
@@ -822,8 +846,8 @@ usage(void)
 	fprintf(stderr,
 "usage: %s [-DLlMNnPStUX] [-a maxcontig] [-b block-size]\n"
 "\t[-c blocks-per-cylinder-group][-d max-extent-size] [-E path-mdconfig]\n"
-"\t[-e maxbpg] [-F file] [-f frag-size] [-i bytes] [-m percent-free]\n"
-"\t[-O optimization] [-o mount-options]\n"
+"\t[-e maxbpg] [-F file] [-f frag-size] [-i bytes] [-k skel]\n"
+"\t[-m percent-free] [-O optimization] [-o mount-options]\n"
 "\t[-p permissions] [-s size] [-v version] [-w user:group]\n"
 "\tmd-device mount-point\n", getprogname());
 	exit(1);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201911010310.xA13ArC0061756>