diff --git a/commands/Makefile b/commands/Makefile index c237994a0..9dd01c41c 100644 --- a/commands/Makefile +++ b/commands/Makefile @@ -16,7 +16,7 @@ SUBDIR= add_route arp ash at backup banner basename btrace cal \ less loadkeys loadramdisk logger look lp \ lpd ls lspci mail MAKEDEV \ mesg mined mkfifo \ - mkproto mount mt netconf nice acknm nohup \ + mount mt netconf nice acknm nohup \ nonamed od paste patch \ ping postinstall poweroff pr prep printf printroot \ profile progressbar pr_routes ps pwd pwdauth \ diff --git a/man/man1/Makefile b/man/man1/Makefile index b0563b34c..9ee8eec3c 100644 --- a/man/man1/Makefile +++ b/man/man1/Makefile @@ -10,7 +10,7 @@ MAN= ash.1 at.1 banner.1 basename.1 \ install.1 isodir.1 isoinfo.1 isoread.1 join.1 kill.1 \ last.1 loadfont.1 loadkeys.1 logger.1 \ look.1 lp.1 ls.1 lspci.1 mail.1 \ - mesg.1 mixer.1 mkfs.1 \ + mesg.1 mixer.1 mkfs.mfs.1 \ mkproto.1 mount.1 mt.1 nice.1 nm.1 nohup.1 od.1 \ paste.1 ping.1 playwave.1 pr.1 prep.1 \ profile.1 ps.1 pwd.1 rcp.1 recwave.1 \ diff --git a/man/man1/mkfs.mfs.1 b/man/man1/mkfs.mfs.1 new file mode 100644 index 000000000..2b2361739 --- /dev/null +++ b/man/man1/mkfs.mfs.1 @@ -0,0 +1,113 @@ +.TH MKFS 1 +.SH NAME +mkfs \- make a file system +.SH SYNOPSIS +\fBmkfs \fR[\fB\-Ldot\fR] [\fB\-B \fIblocksize\fR] [\fB\-i \fIinodes\fR] [\fB\-b \fIblocks\fR] \fIspecial \fIprototype\fR +.br +.de FL +.TP +\\fB\\$1\\fR +\\$2 +.. +.de EX +.TP 20 +\\fB\\$1\\fR +# \\$2 +.. +.SH OPTIONS +.TP 5 +.B \-L +# Make a listing on standard output +.TP 5 +.B \-d +# Use mod time of \fImkfs\fR binary for all files +.TP 5 +.B \-o +# Use a drive other than 0 or 1 (safety precaution) +.TP 5 +.B \-t +# Do not test if file system fits on the medium +.TP 5 +.B \-1 +# Make a version 1 file system (for backward compatibility) +.TP 5 +.B \-i +# Number of i-nodes (files) +.TP 5 +.B \-B +# Filesystem block size (in bytes) +.TP 5 +.B \-b +# Filesystem size (in blocks) +.TP 5 +.B \-x +# Extra space after dynamic sizing (blocks and inodes) +.SH EXAMPLES +.TP 20 +.B mkfs /dev/fd1 proto +# Make a file system on \fI/dev/fd1\fR +.TP 20 +.B mkfs -b 360 /dev/fd1 +# Make empty 360 block file system +.TP 20 +.B mkfs /dev/fd1 360 +# Alternate way to specify the size +.SH DESCRIPTION +.PP +.I Mkfs +builds a file system and copies specified files to it. +The prototype file tells which directories and files to copy to it. +If the prototype file cannot be opened, and its name is just a string of +digits, an empty file system will be made with the specified number of +blocks. +A sample prototype file follows. +The text following the \fI#\fR sign in the example below is comment. +In real prototype files, comments are not allowed. +.PP +.nf +.ta 0.20i 0.70i 1.10i 3i 3.5i 4i + boot # boot block file (ignored) + 360 63 # blocks and i-nodes + d--755 1 1 # root directory + bin d--755 \|2 1 # bin dir: mode (755), uid (2), gid (1) + sh \|---755 2 1 /user/bin/shell # shell has mode \fIrwxr-xr-x\fP + mv -u-755 2 1 /user/bin/mv # u = SETUID bit + login -ug755 2 1 /user/bin/login # SETUID and SETGID + $ # end of \fI/bin\fP + dev d--755 2 1 # special files: tty (char), fd0 (block) + tty c--777 2 1 4 0 # uid=2, gid=1, major=4, minor=0 + fd0 b--644 2 1 2 0 360 # uid, gid, major, minor, blocks + $ # end of \fI/dev\fP + user d--755 12 1 # user dir: mode (755), uid (12), gid (1) + ast d--755 12 1 # \fI/user/ast\fP + $ # \fI/user/ast\fP is empty + $ # end of \fI/user\fP + $ # end of root directory +.PP +.fi +The first entry on each line (except the first 3 and the $ lines, which +terminate directories) is the name the file or directory will get on the +new file system. +Next comes its mode, with the first character being +\fB\-dbc\fR for regular files, directories, block special files and character +special files, respectively. +The next two characters are used to specify the SETUID and SETGID bits, as +shown above. +The last three characters of the mode are the +.I rwx +protection bits. +.PP +Following the mode are the uid and gid. +For special files, the major and minor devices are needed. +.PP +The maximum size of a file system is 1 Gb for a version 2 file system, +and 64 Mb for a version 1 file system. Alas the 8086 +.I fsck +runs out of memory on a V2 file system larger than 128 Mb, so for the 8086 +version of +\s-1MINIX 3\s-1 +you have to limit yourself to file systems of that size. +.SH "SEE ALSO" +.BR mkproto (1), +.BR fsck (1), +.BR mount (1). diff --git a/tools/mkproto/Makefile b/tools/mkproto/Makefile new file mode 100644 index 000000000..6f2350c38 --- /dev/null +++ b/tools/mkproto/Makefile @@ -0,0 +1,7 @@ + +HOSTPROGNAME= ${_TOOL_PREFIX}mkproto +HOST_SRCDIR= usr.sbin/mkproto +#CPPFLAGS+= -I${.CURDIR}/../compat/sys + +LDADD= #defined +.include "${.CURDIR}/../Makefile.host" diff --git a/usr.sbin/Makefile b/usr.sbin/Makefile index ec3aa1d6b..0c19679f8 100644 --- a/usr.sbin/Makefile +++ b/usr.sbin/Makefile @@ -14,6 +14,7 @@ SUBDIR= \ zic # LSC MINIX Specific -SUBDIR+= mkfs.mfs +SUBDIR+= mkfs.mfs \ + mkproto .include diff --git a/usr.sbin/mkfs.mfs/mkfs.c b/usr.sbin/mkfs.mfs/mkfs.c index 8e8649be2..1cbc761b7 100644 --- a/usr.sbin/mkfs.mfs/mkfs.c +++ b/usr.sbin/mkfs.mfs/mkfs.c @@ -92,6 +92,7 @@ block_t zone_map; /* where is zone map? (depends on # inodes) */ int inodes_per_block; int fs_version; size_t block_size; +int extra_space_percent; FILE *proto; @@ -178,7 +179,8 @@ char *argv[]; fs_version = 3; inodes_per_block = 0; block_size = 0; - while ((ch = getopt(argc, argv, "12b:di:lotB:")) != EOF) + extra_space_percent = 0; + while ((ch = getopt(argc, argv, "12b:di:lotB:x:")) != EOF) switch (ch) { case '1': fs_version = 1; @@ -201,11 +203,17 @@ char *argv[]; case 'o': override = 1; break; case 't': donttest = 1; break; case 'B': block_size = atoi(optarg); break; + case 'x': extra_space_percent = atoi(optarg); break; default: usage(); } if (argc == optind) usage(); + /* Percentage of extra size must be nonnegative. + * It can legitimately be bigger than 100 but has to make some sort of sense. + */ + if(extra_space_percent < 0 || extra_space_percent > 2000) usage(); + if(fs_version == 3) { if(!block_size) block_size = _MAX_BLOCK_SIZE; /* V3 default block size */ if(block_size%SECTOR_SIZE || block_size < _MIN_BLOCK_SIZE) { @@ -283,10 +291,16 @@ char *argv[]; usrid = atoi(token[1]); grpid = atoi(token[2]); - if(blocks == 0 && inodes == 0){ + if(blocks <= 0 && inodes <= 0){ + block_t extrablocks = 0; + ino_t extrainodes = 0; + if(blocks < 0) extrablocks = -blocks; + if(inodes < 0) extrainodes = -inodes; detect_fs_size(); - blocks = blockcount; - inodes = inocount; + blocks = blockcount + extrablocks; + inodes = inocount + extrainodes; + blocks += blocks*extra_space_percent/100; + inodes += inodes*extra_space_percent/100; printf("dynamically sized filesystem: %d blocks, %d inodes\n", blocks, (unsigned int) inodes); } @@ -699,7 +713,6 @@ ino_t parent; mode = mode_con(p); usrid = atoi(token[2]); grpid = atoi(token[3]); - if (grpid & 0200) fprintf(stderr, "A.S.Tanenbaum\n"); n = alloc_inode(mode, usrid, grpid); /* Enter name in directory and update directory's size. */ @@ -1487,7 +1500,8 @@ block_t n; void usage() { fprintf(stderr, - "Usage: %s [-12dlot] [-b blocks] [-i inodes] [-B blocksize] special [proto]\n", + "Usage: %s [-12dlot] [-b blocks] [-i inodes]\n" + "\t[-x extra] [-B blocksize] special [proto]\n", progname); exit(1); } diff --git a/commands/mkproto/Makefile b/usr.sbin/mkproto/Makefile similarity index 100% rename from commands/mkproto/Makefile rename to usr.sbin/mkproto/Makefile diff --git a/commands/mkproto/mkproto.c b/usr.sbin/mkproto/mkproto.c similarity index 100% rename from commands/mkproto/mkproto.c rename to usr.sbin/mkproto/mkproto.c