mkfs, mkproto: minor improvements

. mkfs: -x feature for extra space
	. rename manpage to mkfs.mfs.1 to follow the binary
	. move mkproto so it can become part of the tools easily
This commit is contained in:
Ben Gras 2012-11-07 19:19:46 +01:00
parent 62aac7f191
commit cf6fa5ad92
8 changed files with 144 additions and 9 deletions

View file

@ -16,7 +16,7 @@ SUBDIR= add_route arp ash at backup banner basename btrace cal \
less loadkeys loadramdisk logger look lp \ less loadkeys loadramdisk logger look lp \
lpd ls lspci mail MAKEDEV \ lpd ls lspci mail MAKEDEV \
mesg mined mkfifo \ mesg mined mkfifo \
mkproto mount mt netconf nice acknm nohup \ mount mt netconf nice acknm nohup \
nonamed od paste patch \ nonamed od paste patch \
ping postinstall poweroff pr prep printf printroot \ ping postinstall poweroff pr prep printf printroot \
profile progressbar pr_routes ps pwd pwdauth \ profile progressbar pr_routes ps pwd pwdauth \

View file

@ -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 \ install.1 isodir.1 isoinfo.1 isoread.1 join.1 kill.1 \
last.1 loadfont.1 loadkeys.1 logger.1 \ last.1 loadfont.1 loadkeys.1 logger.1 \
look.1 lp.1 ls.1 lspci.1 mail.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 \ mkproto.1 mount.1 mt.1 nice.1 nm.1 nohup.1 od.1 \
paste.1 ping.1 playwave.1 pr.1 prep.1 \ paste.1 ping.1 playwave.1 pr.1 prep.1 \
profile.1 ps.1 pwd.1 rcp.1 recwave.1 \ profile.1 ps.1 pwd.1 rcp.1 recwave.1 \

113
man/man1/mkfs.mfs.1 Normal file
View file

@ -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).

7
tools/mkproto/Makefile Normal file
View file

@ -0,0 +1,7 @@
HOSTPROGNAME= ${_TOOL_PREFIX}mkproto
HOST_SRCDIR= usr.sbin/mkproto
#CPPFLAGS+= -I${.CURDIR}/../compat/sys
LDADD= #defined
.include "${.CURDIR}/../Makefile.host"

View file

@ -14,6 +14,7 @@ SUBDIR= \
zic zic
# LSC MINIX Specific # LSC MINIX Specific
SUBDIR+= mkfs.mfs SUBDIR+= mkfs.mfs \
mkproto
.include <bsd.subdir.mk> .include <bsd.subdir.mk>

View file

@ -92,6 +92,7 @@ block_t zone_map; /* where is zone map? (depends on # inodes) */
int inodes_per_block; int inodes_per_block;
int fs_version; int fs_version;
size_t block_size; size_t block_size;
int extra_space_percent;
FILE *proto; FILE *proto;
@ -178,7 +179,8 @@ char *argv[];
fs_version = 3; fs_version = 3;
inodes_per_block = 0; inodes_per_block = 0;
block_size = 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) { switch (ch) {
case '1': case '1':
fs_version = 1; fs_version = 1;
@ -201,11 +203,17 @@ char *argv[];
case 'o': override = 1; break; case 'o': override = 1; break;
case 't': donttest = 1; break; case 't': donttest = 1; break;
case 'B': block_size = atoi(optarg); break; case 'B': block_size = atoi(optarg); break;
case 'x': extra_space_percent = atoi(optarg); break;
default: usage(); default: usage();
} }
if (argc == optind) 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(fs_version == 3) {
if(!block_size) block_size = _MAX_BLOCK_SIZE; /* V3 default block size */ if(!block_size) block_size = _MAX_BLOCK_SIZE; /* V3 default block size */
if(block_size%SECTOR_SIZE || block_size < _MIN_BLOCK_SIZE) { if(block_size%SECTOR_SIZE || block_size < _MIN_BLOCK_SIZE) {
@ -283,10 +291,16 @@ char *argv[];
usrid = atoi(token[1]); usrid = atoi(token[1]);
grpid = atoi(token[2]); 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(); detect_fs_size();
blocks = blockcount; blocks = blockcount + extrablocks;
inodes = inocount; 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, printf("dynamically sized filesystem: %d blocks, %d inodes\n", blocks,
(unsigned int) inodes); (unsigned int) inodes);
} }
@ -699,7 +713,6 @@ ino_t parent;
mode = mode_con(p); mode = mode_con(p);
usrid = atoi(token[2]); usrid = atoi(token[2]);
grpid = atoi(token[3]); grpid = atoi(token[3]);
if (grpid & 0200) fprintf(stderr, "A.S.Tanenbaum\n");
n = alloc_inode(mode, usrid, grpid); n = alloc_inode(mode, usrid, grpid);
/* Enter name in directory and update directory's size. */ /* Enter name in directory and update directory's size. */
@ -1487,7 +1500,8 @@ block_t n;
void usage() void usage()
{ {
fprintf(stderr, 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); progname);
exit(1); exit(1);
} }