Subject: Re: problem with MFS and init
To: None <tech-embed@netbsd.org>
From: David Young <dyoung@pobox.com>
List: tech-embed
Date: 11/01/2005 17:18:10
--V0207lvV8h4k8FAm
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Tue, Nov 01, 2005 at 08:54:06PM +0100, Jachym Holecek wrote:
> Hello,
> 
> > If you don't have /dev populated, init is supposed to "make one" in an 
> > MFS filesystem.
> 
> Yup, there's a compile-time option for this.
> 
> > I probably should file this as a PR, but I wanted to inquire before I 
> > did that.  FWIW my unit has ~192MB, so its not RAM that is exhausted -- 
> > just inodes in the MFS.
> 
> Bump NINODE in sbin/init/init.c (1024 currently). IMO, the right solution
> here is to teach init(8) to create /dev on tmpfs instead of mfs
> (tmpfs can grow and shrink as needed, unlike mfs). This is somewhere
> deep down on my TODO list...

I did that last night.  It's pretty simple.  Here is a patch.

Dave

-- 
David Young             OJC Technologies
dyoung@ojctech.com      Urbana, IL * (217) 278-3933

--V0207lvV8h4k8FAm
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename=init-tmpfs-dev

? .init.c.swp
Index: init.c
===================================================================
RCS file: /cvsroot/src/sbin/init/init.c,v
retrieving revision 1.70
diff -u -u -r1.70 init.c
--- init.c	27 Jun 2005 01:00:05 -0000	1.70
+++ init.c	1 Nov 2005 23:17:23 -0000
@@ -94,11 +94,11 @@
 
 #if defined(RESCUEDIR)
 #define	INIT_BSHELL	RESCUEDIR "/sh"
-#define	INIT_MOUNT_MFS	RESCUEDIR "/mount_mfs"
+#define	INIT_MOUNT_TMPFS	RESCUEDIR "/mount_tmpfs"
 #define	INIT_PATH	RESCUEDIR ":" _PATH_STDPATH
 #else
 #define	INIT_BSHELL	_PATH_BSHELL
-#define	INIT_MOUNT_MFS	"/sbin/mount_mfs"
+#define	INIT_MOUNT_TMPFS	"/sbin/mount_tmpfs"
 #define	INIT_PATH	_PATH_STDPATH
 #endif
 
@@ -187,12 +187,7 @@
 #ifdef MFS_DEV_IF_NO_CONSOLE
 
 #define NINODE 1024
-#define FSSIZE ((8192		/* boot area */				\
-	+ 2 * 8192		/* two copies of superblock */		\
-	+ 4096			/* cylinder group info */		\
-	+ NINODE * (128 + 18)	/* inode and directory entry */		\
-	+ mfile[0].len		/* size of MAKEDEV file */		\
-	+ 2 * 4096) / 512)	/* some slack */
+#define FSSIZE (400 * 1024)
 
 struct mappedfile {
 	const char *path;
@@ -203,7 +198,7 @@
 	{ "/dev/MAKEDEV.local",	NULL,	0 }
 };
 
-static int mfs_dev(void);
+static int tmpfs_dev(void);
 static void mapfile(struct mappedfile *);
 static void writefile(struct mappedfile *);
 
@@ -246,7 +241,7 @@
 
 
 #ifdef MFS_DEV_IF_NO_CONSOLE
-	if (mfs_dev() == -1)
+	if (tmpfs_dev() == -1)
 		requested_transition = single_user;
 #endif
 
@@ -1415,7 +1410,7 @@
 }
 
 static int
-mfs_dev(void)
+tmpfs_dev(void)
 {
 	/*
 	 * We cannot print errors so we bail out silently...
@@ -1439,14 +1434,13 @@
 	/* Grab the contents of MAKEDEV.local */
 	mapfile(&mfile[1]);
 
-	/* Mount an mfs over /dev so we can create devices */
+	/* Mount an tmpfs over /dev so we can create devices */
 	switch ((pid = fork())) {
 	case 0:
 		asprintf(&fs_size, "%d", FSSIZE);
-		(void)execl(INIT_MOUNT_MFS, "mount_mfs",
-		    "-b", "4096", "-f", "512",
+		(void)execl(INIT_MOUNT_TMPFS, "mount_tmpfs",
 		    "-s", fs_size, "-n", STR(NINODE),
-		    "-p", "0755",
+		    "-m", "0755",
 		    "swap", "/dev", NULL);
 		_exit(1);
 		/*NOTREACHED*/
@@ -1475,12 +1469,12 @@
 
 	(void)freopen(_PATH_CONSOLE, "a", stderr);
 
-	warnx("Creating mfs /dev (%d blocks, %d inodes)", FSSIZE, NINODE);
+	warnx("Creating tmpfs /dev (%d bytes, %d inodes)", FSSIZE, NINODE);
 
-	/* Create a MAKEDEV script in the mfs /dev */
+	/* Create a MAKEDEV script in the tmpfs /dev */
 	writefile(&mfile[0]);
 
-	/* Create a MAKEDEV.local script in the mfs /dev */
+	/* Create a MAKEDEV.local script in the tmpfs /dev */
 	writefile(&mfile[1]);
 
 	/* Run the makedev script to create devices */

--V0207lvV8h4k8FAm--