--- /dev/null
+.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).
int inodes_per_block;
int fs_version;
size_t block_size;
+int extra_space_percent;
FILE *proto;
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;
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) {
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);
}
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. */
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);
}