📄 newfs.c
字号:
/* * Copyright (c) 1983, 1989, 1993, 1994 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#ifndef lintstatic char sccsid[] = "@(#)newfs.c 8.8 (Berkeley) 4/18/94";#endif /* not lint */#ifndef lintstatic char copyright[] ="@(#) Copyright (c) 1983, 1989, 1993, 1994\n\ The Regents of the University of California. All rights reserved.\n";#endif /* not lint *//* * newfs: friendly front end to mkfs */#include <sys/param.h>#include <sys/stat.h>#include <sys/ioctl.h>#include <sys/disklabel.h>#include <sys/file.h>#include <sys/mount.h>#include <ufs/ufs/dir.h>#include <ufs/ffs/fs.h>#include <ctype.h>#include <errno.h>#include <paths.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <syslog.h>#include <unistd.h>#if __STDC__#include <stdarg.h>#else#include <varargs.h>#endif#include "mntopts.h"struct mntopt mopts[] = { MOPT_STDOPTS, MOPT_ASYNC, { NULL },};#if __STDC__void fatal(const char *fmt, ...);#elsevoid fatal();#endif#define COMPAT /* allow non-labeled disks *//* * The following two constants set the default block and fragment sizes. * Both constants must be a power of 2 and meet the following constraints: * MINBSIZE <= DESBLKSIZE <= MAXBSIZE * sectorsize <= DESFRAGSIZE <= DESBLKSIZE * DESBLKSIZE / DESFRAGSIZE <= 8 */#define DFL_FRAGSIZE 1024#define DFL_BLKSIZE 8192/* * Cylinder groups may have up to many cylinders. The actual * number used depends upon how much information can be stored * on a single cylinder. The default is to use 16 cylinders * per group. */#define DESCPG 16 /* desired fs_cpg *//* * ROTDELAY gives the minimum number of milliseconds to initiate * another disk transfer on the same cylinder. It is used in * determining the rotationally optimal layout for disk blocks * within a file; the default of fs_rotdelay is 4ms. */#define ROTDELAY 4/* * MAXBLKPG determines the maximum number of data blocks which are * placed in a single cylinder group. The default is one indirect * block worth of data blocks. */#define MAXBLKPG(bsize) ((bsize) / sizeof(daddr_t))/* * Each file system has a number of inodes statically allocated. * We allocate one inode slot per NFPI fragments, expecting this * to be far more than we will ever need. */#define NFPI 4/* * For each cylinder we keep track of the availability of blocks at different * rotational positions, so that we can lay out the data to be picked * up with minimum rotational latency. NRPOS is the default number of * rotational positions that we distinguish. With NRPOS of 8 the resolution * of our summary information is 2ms for a typical 3600 rpm drive. */#define NRPOS 8 /* number distinct rotational positions */int mfs; /* run as the memory based filesystem */int Nflag; /* run without writing file system */int Oflag; /* format as an 4.3BSD file system */int fssize; /* file system size */int ntracks; /* # tracks/cylinder */int nsectors; /* # sectors/track */int nphyssectors; /* # sectors/track including spares */int secpercyl; /* sectors per cylinder */int trackspares = -1; /* spare sectors per track */int cylspares = -1; /* spare sectors per cylinder */int sectorsize; /* bytes/sector */#ifdef tahoeint realsectorsize; /* bytes/sector in hardware */#endifint rpm; /* revolutions/minute of drive */int interleave; /* hardware sector interleave */int trackskew = -1; /* sector 0 skew, per track */int headswitch; /* head switch time, usec */int trackseek; /* track-to-track seek, usec */int fsize = 0; /* fragment size */int bsize = 0; /* block size */int cpg = DESCPG; /* cylinders/cylinder group */int cpgflg; /* cylinders/cylinder group flag was given */int minfree = MINFREE; /* free space threshold */int opt = DEFAULTOPT; /* optimization preference (space or time) */int density; /* number of bytes per inode */int maxcontig = 0; /* max contiguous blocks to allocate */int rotdelay = ROTDELAY; /* rotational delay between blocks */int maxbpg; /* maximum blocks per file in a cyl group */int nrpos = NRPOS; /* # of distinguished rotational positions */int bbsize = BBSIZE; /* boot block size */int sbsize = SBSIZE; /* superblock size */int mntflags = MNT_ASYNC; /* flags to be passed to mount */u_long memleft; /* virtual memory available */caddr_t membase; /* start address of memory based filesystem */#ifdef COMPATchar *disktype;int unlabeled;#endifchar device[MAXPATHLEN];char *progname;intmain(argc, argv) int argc; char *argv[];{ extern char *optarg; extern int optind; register int ch; register struct partition *pp; register struct disklabel *lp; struct disklabel *getdisklabel(); struct partition oldpartition; struct stat st; struct statfs *mp; int fsi, fso, len, n; char *cp, *s1, *s2, *special, *opstring, buf[BUFSIZ]; if (progname = rindex(*argv, '/')) ++progname; else progname = *argv; if (strstr(progname, "mfs")) { mfs = 1; Nflag++; } opstring = mfs ? "NT:a:b:c:d:e:f:i:m:o:s:" : "NOS:T:a:b:c:d:e:f:i:k:l:m:n:o:p:r:s:t:u:x:"; while ((ch = getopt(argc, argv, opstring)) != EOF) switch (ch) { case 'N': Nflag = 1; break; case 'O': Oflag = 1; break; case 'S': if ((sectorsize = atoi(optarg)) <= 0) fatal("%s: bad sector size", optarg); break;#ifdef COMPAT case 'T': disktype = optarg; break;#endif case 'a': if ((maxcontig = atoi(optarg)) <= 0) fatal("%s: bad maximum contiguous blocks\n", optarg); break; case 'b': if ((bsize = atoi(optarg)) < MINBSIZE) fatal("%s: bad block size", optarg); break; case 'c': if ((cpg = atoi(optarg)) <= 0) fatal("%s: bad cylinders/group", optarg); cpgflg++; break; case 'd': if ((rotdelay = atoi(optarg)) < 0) fatal("%s: bad rotational delay\n", optarg); break; case 'e': if ((maxbpg = atoi(optarg)) <= 0) fatal("%s: bad blocks per file in a cylinder group\n", optarg); break; case 'f': if ((fsize = atoi(optarg)) <= 0) fatal("%s: bad fragment size", optarg); break; case 'i': if ((density = atoi(optarg)) <= 0) fatal("%s: bad bytes per inode\n", optarg); break; case 'k': if ((trackskew = atoi(optarg)) < 0) fatal("%s: bad track skew", optarg); break; case 'l': if ((interleave = atoi(optarg)) <= 0) fatal("%s: bad interleave", optarg); break; case 'm': if ((minfree = atoi(optarg)) < 0 || minfree > 99) fatal("%s: bad free space %%\n", optarg); break; case 'n': if ((nrpos = atoi(optarg)) <= 0) fatal("%s: bad rotational layout count\n", optarg); break; case 'o': if (mfs) getmntopts(optarg, mopts, &mntflags); else { if (strcmp(optarg, "space") == 0) opt = FS_OPTSPACE; else if (strcmp(optarg, "time") == 0) opt = FS_OPTTIME; else fatal("%s: unknown optimization preference: use `space' or `time'."); } break; case 'p': if ((trackspares = atoi(optarg)) < 0) fatal("%s: bad spare sectors per track", optarg); break; case 'r': if ((rpm = atoi(optarg)) <= 0) fatal("%s: bad revolutions/minute\n", optarg); break; case 's': if ((fssize = atoi(optarg)) <= 0) fatal("%s: bad file system size", optarg); break; case 't': if ((ntracks = atoi(optarg)) <= 0) fatal("%s: bad total tracks", optarg); break; case 'u': if ((nsectors = atoi(optarg)) <= 0) fatal("%s: bad sectors/track", optarg); break; case 'x': if ((cylspares = atoi(optarg)) < 0) fatal("%s: bad spare sectors per cylinder", optarg); break; case '?': default: usage(); } argc -= optind; argv += optind; if (argc != 2 && (mfs || argc != 1)) usage(); special = argv[0]; cp = rindex(special, '/'); if (cp == 0) { /* * No path prefix; try /dev/r%s then /dev/%s. */ (void)sprintf(device, "%sr%s", _PATH_DEV, special); if (stat(device, &st) == -1) (void)sprintf(device, "%s%s", _PATH_DEV, special); special = device; } if (Nflag) { fso = -1; } else { fso = open(special, O_WRONLY); if (fso < 0) fatal("%s: %s", special, strerror(errno));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -