System V (with no version number) had one filesystem format. It called it FS. BSD unix just had to be better, so they made some major improvements aimed at optimizing for larger disks, and called it ffs, for fast file system. Today's descendant from BSD's ffs is the ufs filesystem.

These days, nearly every unix calls its own filesystem the Unix File System, as opposed to the DOS filesystem, or the CDROM filesystem, etc...

UFS is the primary filesystem of a number of unix variants, including SunOS, Solaris, NeXTstep, many (all?) BSD unix variants, and possibly others. Even the Linux ext2 filesystem uses the features described here. Of course, each adds a few of its own proprietary features to UFS, so UFS binary compatibility between systems may be limited.

A UFS filesystem is composed of the following parts:

  • some potential boot blocks at the beginning of the disk, just in case you want to make this partition bootable
  • a superblock, containing a magic number identifying this as a UFS filesystem, and some other vital numbers describing this filesystem's geometry and statistics and behavioral tuning parameters
  • a collection of cylinder groups; Each cylinder group has the following components:
    • a backup copy of the superblock
    • a cylinder group header, with statistics, free lists, etc, about this cylinder group, similar to those in the superblock
    • a number of inodes, each containing file attributes
    • a number of data blocks

additional details:
The original unix FS only included the boot block, superblock, a clump of inodes, and the data blocks. On large disks, moving the head back and forth between the clump of inodes and the data blocks they referred to caused thrashing, so BSD ffs invented the cylinder groups, breaking the disk up into chunks each with its own inode clump and data blocks.

The intent of BSD FFS is to try to localize associated data blocks and metadata in the same cylinder group, and ideally, all of the contents of a directory (both data and metadata for all the files) in the same or near by cylinder group, thus reducing fragmentation caused by scattering a directory's contents over a whole disk.

Another optimization UFS has inherited from BSD ffs is the file tail fragment. In order to reduce the fragmentation of a file and increase the number of contiguous blocks in the file, BSD increased the block size from 512b to 8k. As a consequence, a 10 byte file would still use 8K of space. To fix this, they added the concept of tail fragments. If the last block in a file is smaller than 4k, it may be stored in a fragment block, along with the tail fragments of other files, saving significant space on, 300M disk.

Of course now, the numbers are more like 32K blocks on 200G disks.


No UFS man pages or include files or linux source code files were hurt during the creation of this writeup.