File System Administration
  Search only this book
Download this book in PDF

File System Reference

A

This appendix has these sections:
Default Directories for / and /usr File Systemspage 265
The Structure of UFS File System Cylinder Groupspage 270
Deciding on Custom File System Parameterspage 274
Commands for Creating a Customized File Systempage 278

Default Directories for / and /usr File Systems

Table A-1 describes all the directories contained in the default root and /usr file systems. See the Administration Supplement for Solaris Platforms for a list of directories that are platform specific. See "The Default SunOS File Systems" on page 12 for a description of all of the directories in the default SunOS file system.
Table A-1 root/usr (1 of 6)
DirectoryDescription
Directories in the root file system:
/Root of the overall file system name space
/devPrimary location for special files
/dev/dskBlock disk devices
/dev/ptspty slave devices
Table A-1 root/usr (2 of 6)
DirectoryDescription
/dev/rdskRaw disk devices
/dev/rmtRaw tape devices
/dev/sadEntry points for the STREAMS Administrative Driver
/dev/termTerminal devices
/etcHost-specific system administrative configuration files and databases
/etc/acctAccounting system configuration information
/etc/cron.dConfiguration information for cron
/etc/defaultDefaults information for various programs
/etc/dfsConfiguration information for exported file systems
/etc/fsBinaries organized by fs types for operations required before /usr is mounted.
/etc/inetConfiguration files for Internet services
/etc/init.dScripts for changing between run levels
/etc/lpConfiguration information for the printer subsystem
/etc/mailMail subsystem configuration
/etc/netConfiguration information for ti (transport-independent) network services
/etc/optConfiguration information for optional packages
/etc/rc0.dScripts for entering/leaving run level 0
/etc/rc1.dScripts for entering/leaving run level 1
/etc/rc2.dScripts for entering/leaving run level 2
/etc/rc3.dScripts for entering/leaving run level 3
/etc/rcS.dScripts for bringing the system up in single user mode
/etc/safService access facility files (including FIFOs)
/etc/skelDefault profile scripts for new user accounts
/etc/smStatus monitor information
/etc/sm.bakBackup copy of status monitor information
Table A-1 root/usr (3 of 6)
DirectoryDescription
/etc/tmTrademark files; contents displayed at boot time
/etc/uucpuucp configuration information
/exportDefault root of the exported file system tree
/homeDefault root of a subtree for user directories
/kernelSubtree of loadable kernel modules, including the base kernel itself as /kernel/unix
/mntConvenient, temporary mount point for file systems
/optRoot of a subtree for add-on application packages
/opt/SUNWsproMount/installation point for unbundled language products
/sbinEssential executables used in the booting process and in manual system failure recovery
/standStandalone programs
/tmpTemporary files; cleared during boot sequence
/usrMount point for /usr file system
/varRoot of a subtree of varying files
/var/admSystem logging and accounting files
/var/crashDefault depository for kernel crash dumps
/var/croncron's log file
/var/lpLine printer subsystem logging information
/var/mailDirectory where users' mail is kept
/var/newsCommunity service messages (note: not the same as USENET-style news)
/var/nisNIS+ databases
/var/optRoot of a subtree for varying files associated with software packages
/var/preserveBackup files for vi and ex
/var/sadmDatabases maintained by the software package management utilities
Table A-1 root/usr (4 of 6)
DirectoryDescription
/var/safsaf (service access facility) logging and accounting files
/var/spoolDirectories for spooled temporary files
/var/spool/croncron and at spool files
/var/spool/locksSpooling lock files
/var/spool/lpLine printer spool files
/var/spool/mqueueMail queued for delivery
/var/spool/pkgSpooled packages
/var/spool/uucpQueued uucp jobs
/var/spool/uucppublicFiles deposited by uucp
/var/tmpDirectory for temporary files; not cleared during boot sequence
/var/uucpc log and status files
/var/ypNIS databases (for backwards compatibility with NIS
and unnecessary after full transition to NIS+)
Directories in the /usr file system
binLocation for standard system commands
demoDemo programs and data
gamesGame binaries and data
includeHeader files (for C programs, etc.)
kernelAdditional modules
kvmImplementation architecture-specific binaries and
libraries
libVarious program libraries, architecture-dependent databases, and binaries not invoked directly by the user
lib/acctAccounting scripts and binaries
lib/classScheduling class-specific directories containing executables for priocntl and dispadmin commands
Table A-1 root/usr (5 of 6)
DirectoryDescription
lib/fonttroff font description files
lib/fsFile system type-dependent modules; not invoked directly by the user
lib/iconvConversion tables for iconv(1)
lib/libpProfiled libraries
lib/localeInternationalization localization databases
lib/lpLine printer subsystem databases and back-end executables
lib/mailAuxiliary programs for the mail subsystem
lib/netsvcInternet network services
lib/nfsAuxiliary NFS-related programs and daemons
lib/picsPIC archives needed to build the run-time linker
lib/referAuxiliary refer-related programs
lib/saScripts and commands for the system activity report package
lib/safAuxiliary programs and daemons related to the service access facility
lib/uucpAuxiliary uucp-related programs and daemons
lib/zoneinfoTime zone information
localCommands local to a site
oldPrograms that are being phased out
openwinMount/installation point for OpenWindows software
sadmVarious files and directories related to system administration; see specifics below
sadm/bin"valtools" binaries for use by FMLI scripts
sadm/installExecutables and scripts for pkg management
sbinExecutables for system administration
sbin/staticStatically linked version of selected programs from /usr/bin and /usr/sbin
Table A-1 root/usr (6 of 6)
DirectoryDescription
shareArchitecture-independent sharable files
share/libArchitecture-independent databases
share/lib/keytablesKeyboard layout description tables
share/lib/mailxmailx-related help files
share/lib/ntermnroff terminal tables
share/lib/pubVarious data files
share/lib/spellAuxiliary spell-related databases and scripts
share/lib/tabsetTab setting escape sequences
share/lib/terminfoterminfo-style terminal description files
share/lib/tmac[nt]roff macro packages
share/srcSource code for kernel, libraries, and utilities
ucbBerkeley compatibility package binaries
ucbincludeBerkeley compatibility package header files
ucblibBerkeley compatibility package libraries

The Structure of UFS File System Cylinder Groups

When you create a UFS file system, the disk slice is divided into cylinder groups, which are then divided into blocks to control and organize the structure of the files within the cylinder group. A cylinder group has one or more consecutive disk cylinders. Each type of block has a specific function in the file system. A UFS file system has these four types of blocks:
  • Boot block - Used to store information used when booting the system
  • Superblock - Used to store much of the information about the file system
  • Inode - Used to store all information about a file except its name
  • Storage or data block - Used to store data for each file
This section provides additional information about the organization and function of these blocks.

The Boot Block

The boot block stores the procedures used in booting the system. If a file system is not to be used for booting, the boot block is left blank. The boot block appears only in the first cylinder group (cylinder group 0) and is the first 8 Kbytes in a partition.

The Superblock

The superblock stores much of the information about the file system. A few of the more important things it contains are:
  • Size and status of the file system
  • Label (file system name and volume name)
  • Size of the file system logical block
  • Date and time of the last update
  • Cylinder group size
  • Number of data blocks in a cylinder group
  • Summary data block
  • File system state: clean, stable, or active
  • Path name of the last mount point
The superblock is located at the beginning of the disk partition, and is replicated in each cylinder group. Because the superblock contains critical data, multiple superblocks are made when the file system is created. Each of the superblock replicas is offset by a different amount from the beginning of its cylinder group. For multiple-platter disk drives, the offsets are calculated so that a superblock appears on each platter of the drive. That way, if the first platter is lost, an alternate superblock can always be retrieved. Except for the leading blocks in the first cylinder group, the leading blocks created by the offsets are used for data storage.
A summary information block is kept with the superblock. It is not replicated, but is grouped with the first superblock, usually in cylinder group 0. The summary block records changes that take place as the file system is used, and lists the number of inodes, directories, fragments, and storage blocks within the file system.

Inodes

An inode contains all the information about a file except its name, which is kept in a directory. An inode is 128 bytes. The inode information is kept in the cylinder information block, and contains:
  • The type of the file

    · Regular

    · Directory

    · Block special

    · Character special

    · Symbolic link

    · FIFO, also known as named pipe

    · Socket

  • The mode of the file (the set of read-write-execute permissions)
  • The number of hard links to the file
  • The user-id of the owner of the file
  • The group-id to which the file belongs
  • The number of bytes in the file
  • An array of 15 disk-block addresses
  • The date and time the file was last accessed
  • The date and time the file was last modified
  • The date and time the file was created
The array of 15 disk addresses (0 to 14) point to the data blocks that store the contents of the file. The first 12 are direct addresses; that is, they point directly to the first 12 logical storage blocks of the contents of the file. If the file is larger than 12 logical blocks, the 13th address points to an indirect block, which contains direct block addresses instead of file contents. The 14th address points to a double indirect block, which contains addresses of indirect blocks. The 15th address is for triple indirect addresses, if they are ever needed. Figure A-1 shows this chaining of address blocks starting from the inode.

Graphic

Figure A-1

Storage Blocks

The rest of the space allocated to the file system is occupied by storage blocks, also called data blocks. The size of these storage blocks is determined at the time a file system is created. Storage blocks are allocated, by default, in two sizes: an 8-Kbyte logical block size, and a 1-Kbyte fragmentation size.
For a regular file, the storage blocks contain the contents of the file. For a directory, the storage blocks contain entries that give the inode number and the file name of the files in the directory.

Free Blocks

Blocks not currently being used as inodes, as indirect address blocks, or as storage blocks are marked as free in the cylinder group map. This map also keeps track of fragments to prevent fragmentation from degrading disk performance.
To give you an idea of the appearance of a typical UFS file system, Figure A-2 shows a series of cylinder groups in a generic UFS file system.

Graphic

Figure A-2

Deciding on Custom File System Parameters

If you choose to alter the default file system parameters assigned by the newfs command, you need to understand them so you can decide whether to use the default values or to change them. This section describes each of these parameters:
  • Block size
  • Fragment size
  • Minimum free space
  • Rotational delay
  • Optimization type
  • Number of inodes

Logical Block Size

The logical block size is the size of the blocks that the UNIX kernel uses to read or write files. The logical block size is usually different from the physical block size (usually 512 bytes), which is the size of the smallest block that the disk controller can read or write.
You can specify the logical block size of the file system. Once the file system is created, you cannot change this parameter without rebuilding the file system. You can have file systems with different logical block sizes on the same disk.
By default, the logical block size is 8192 bytes (8 Kbytes) for UFS file systems. The UFS file system supports block sizes of 4096 or 8192 bytes (4 or 8 Kbytes). 8 Kbytes is the recommended logical block size.
To choose the best logical block size for your system, consider both the performance desired and the available space. For most UFS systems, an 8 Kbyte file system provides the best performance, offering a good balance between disk performance and use of space in primary memory and on disk.
As a general rule, to increase efficiency, use a larger logical block size for file systems where most of the files are very large. Use a smaller logical block size for file systems where most of the files are very small. You can use the quot -c file-system command on a file system to display a complete report on the distribution of files by block size.

Fragment Size

As files are created or expanded, they are allocated disk space in either full logical blocks or portions of logical blocks called fragments. When disk space is needed to hold a data for a file, full blocks are allocated first, and then one or more fragments of a block are allocated for the remainder. For small files allocation begins with fragments.
The ability to allocate fragments of blocks to files, rather than just whole blocks saves space by reducing fragmentation of disk space resulting from unused holes in blocks.
You define the fragment size when you create a UFS file system. The default fragment size is 1 Kbyte. Each block can be divided into 1, 2, 4, or 8 fragments, which results in fragment sizes from 8192 bytes to 512 bytes (for 4-Kbyte file systems only). The lower bound is actually tied to the disk sector size, typically 512 bytes.

Note - The upper bound may equal the full block size, in which case the fragment is not a fragment at all. This configuration may be optimal for file systems with very large files when you are more concerned with speed than with space.

When choosing a fragment size, look at the trade-off between time and space: a small fragment size saves space, but requires more time to allocate. As a general rule, to increase storage efficiency, use a larger fragment size for file systems where most of the files are large. Use a smaller fragment size for file systems where most of the files are small.

Minimum Free Space

The minimum free space is the percentage of the total disk space held in reserve when you create the file system. The default reserve is 10 percent. Free space is important because file access becomes less and less efficient as a file system gets full. As long as there is an adequate amount of free space, UFS file systems operate efficiently. When a file system becomes full, using up the available user space, only the superuser can access the reserved free space.
Commands such as df report the percentage of space that is available to users, excluding the percentage allocated as the minimum free space. When the command reports that more than 100 percent of the disk space in the file system is in use, some of the reserve has been used by root.
If you impose quotas on users, the amount of space available to the users does not include the free space reserve. You can change the value of the minimum free space for an existing file system using the tunefs command.

Rotational Delay (Gap)

The rotational delay is the expected minimum time (in milliseconds) it takes the CPU to complete a data transfer and initiate a new data transfer on the same disk cylinder. The default delay depends on the type of the disk, and is usually optimized for each disk type.
When writing a file, the UFS allocation routines try to position new blocks on the same disk cylinder as the previous block in the same file. The allocation routines also try to optimally position new blocks within tracks to minimize the disk rotation needed to access them.
To position file blocks so they are "rotationally well-behaved," the allocation routines must know how fast the CPU can service transfers and how long it takes the disk to skip over a block. Using options to the mkfs command, you can indicate how fast the disk rotates and how many disk blocks (sectors) it has per track. The allocation routines use this information to figure out how many milliseconds it takes to skip a disk block. Then using the expected transfer time (rotational delay), blocks can be optimally positioned or spaced so that the next block is just coming under the disk head when the system is ready to read it.

Note - It is not necessary to specify the rotational delay (-d option to newfs) for some devices.

Place blocks consecutively only if your system is fast enough to read them on the same disk rotation. If the system is too slow, the disk spins past the beginning of the next block in the file and must complete a full rotation before the block can be read, which takes a lot of time. You should try to specify an appropriate value for the gap so that the head is located over the appropriate block when the next disk request occurs.
You can change the value of this parameter for an existing file system using the tunefs command. The change applies only to subsequent block allocation, not to blocks already allocated.

Optimization Type

The optimization type is either space or time.
  • Space - When you select space optimization, disk blocks are allocated to minimize fragmentation and disk use is optimized. Space is the default when you set the minimum free space to less than 10 percent.
  • Time - When you select time optimization, disk blocks are allocated as quickly as possible, with less emphasis on their placement. Time is the default when you set the minimum free space to 10 percent or greater. When there is enough free space, it is relatively easy to allocate disk blocks well, without resulting in too much fragmentation.
You can change the value of this parameter for an existing file system using the tunefs command.

Number of Bytes per Inode

The number of inodes determines the number of files you can have in the file system: one inode for each file. The number of bytes per inode determines the total number of inodes created when the file system is made: the total size of the file system divided by the number of bytes per inode. Once the inodes are allocated, you cannot change the number without re-creating the file system.
The default number of bytes per inode is 2048 bytes (2 Kbytes), which assumes the average size of each file is 2 Kbytes or greater. Most files are larger than 2 Kbytes. If you have a file system with many symbolic links, they can lower the average file size. If your file system is going to have many small files, you can give this parameter a lower value. Note, however, that having too many inodes is much better than running out of them. If you have too few inodes, you could reach the maximum number of files on a disk partition that is practically empty.

Commands for Creating a Customized File System

This section describes the two commands you use to create a customized file system:
  • newfs
  • mkfs

The newfs Command Syntax, Options, and Arguments

The newfs command is located in /usr/sbin/newfs.
The syntax for the newfs command is:
newfs [-Nv] [mkfs_options] special

The newfs command has the following options and arguments:
-N
  Displays the file system parameters that would be used in creating the file
  system without actually creating it. This option does not display the
  parameters used to create an existing file system. The example shows
  information for /dev/rdsd/c0t0d0s0.


  # newfs -N /dev/rdsk/c0t0d0s0  
  /dev/rdsk/c0t0d0s0:     37260 sectors in 115 cylinders of 9 tracks, 36 sectors  
          19.1MB in 8 cyl groups (16 c/g, 2.65MB/g, 1216 i/g)  
  superblock backups (for fsck -b #) at:  
   32, 5264, 10496, 15728, 20960, 26192, 31424, 36656,  
  #  

-v

Displays the parameters to be passed to the mkfs command and creates the file system, unless used with the -N option. The example shows the information displayed by the -v option:

Imported image(504x124)

mkfs-options
Use the following options to set the parameters passed to the mkfs command. The options are listed in the order they are passed to mkfs. Separate the options with spaces without any preceding keywords.
-s size
The size of the file system in sectors. The default is automatically determined from the disk label.
-t ntrack
The number of tracks per cylinder on the disk. The default is determined from the disk label.
-b bsize
The logical block size in bytes to use for data transfers. Specify the size of 4096 or 8192 (4 or 8 Kbytes). The default is 8192 bytes (8 Kbytes).
-f fragsize
The smallest amount of disk space in bytes that is allocated to a file. Specify the fragment size in powers of two in the range from 512 to 8192 bytes. The default is 1024 bytes (1 Kbyte).
-c cgsize
The number of disk cylinders per cylinder group. This number must be in the range 1 to 32. The default is 16.
-m free
The minimum percentage of free disk space to allow. The default is 10 percent.
-r rpm
   The speed of the disk, in revolutions per minute. The default is 3600. This
   parameter is converted to revolutions per second before it is passed to
   mkfs.

-i nbpi
The number of bytes per inode to use in computing how may inodes to create. The default is 2048.
-o opt
Optimization type to use for allocating disk blocks to files: s for space or t for time.
-a apc
The number of alternate blocks per disk cylinder (SCSI devices only) to reserve for bad block placement. The default is 0.
-d gap
(Rotational delay.) The expected minimum number of milliseconds it takes the CPU to complete a data transfer and initiate a new data transfer on the same disk cylinder. The default is 4.
-d nrpos
The number of different rotation positions in which to divide a cylinder group. The default is 8.
-C maxcontig
The maximum number of blocks, belonging to one file, that will be allocated contiguously before inserting a rotational delay. The default varies from drive to drive. Drives without internal (track) buffers (or drives/controllers that don't advertise the existence of an internal buffer) default to 1. Drives with buffers default to 7.
This parameter is limited in the following way:
blocksize * maxcontig must be <= maxphys
maxphys is a read-only kernel variable that specifies the maximum block transfer size (in bytes) that the I/O subsystem is capable of satisfying. (This limit is enforced by mount, not by newfs or mkfs.)
This parameter also controls clustering. Regardless of the value of rotdelay, clustering is enabled only when maxcontig is greater than 1. Clustering allows higher I/O rates for sequential I/O and is described in the tunefs(1M) manual page.
The following argument is required:
special
The special character (raw) device file name of the partition to contain the file system.

The Generic mkfs Command

The generic mkfs command calls a file system-specific mkfs, which then creates a file system of a specified type on a specified disk partition. Although mkfs can support different types of file systems, in practice you would use it to create UFS file systems. To make other types of file systems, you would have to write the software for the file system-specific versions of the mkfs command to use. Normally, you do not run mkfs directly; it is called by the newfs command.
The generic mkfs command is located in /usr/sbin. See the mkfs(1M) manual page for a description of the arguments and options.