Unix File System
||This article includes a list of references, but its sources remain unclear because it has insufficient inline citations. (April 2009)|
|Full name||UNIX file system|
|Max. file size||273 bytes (8 ZB)|
|Max. filename length||255 bytes|
|Max. volume size||273 bytes (8 ZB)|
|Supported operating systems||A/UX, DragonFlyBSD, FreeBSD, FreeNAS, HP-UX, NetBSD, Linux, OpenBSD, Solaris, SunOS, Tru64 UNIX, UNIX System V, and others|
The Unix file system (UFS) is a file system used by many Unix and Unix-like operating systems. It is also called the Berkeley Fast File System, the BSD Fast File System or FFS. It is a distant descendant of the original filesystem used by Version 7 Unix.
A UFS volume is composed of the following parts:
- a few blocks at the beginning of the partition reserved for boot blocks (which must be initialized separately from the filesystem)
- 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:
Inodes are numbered sequentially, starting at 0. The first two inodes are reserved for historical reasons, followed by the inode for the root directory, which is always inode 2.
Directory files contain only the list of filenames in the directory and the inode associated with each file. All file metadata is kept in the inode.
History and evolution
Early versions of Unix filesystems were referred to simply as FS. FS only included the boot block, superblock, a clump of inodes, and the data blocks. This worked well for the small disks early Unixes were designed for, but as technology advanced and disks grew larger, moving the head back and forth between the clump of inodes and the data blocks they referred to caused thrashing. Marshall Kirk McKusick, then a Berkeley graduate student, optimized the BSD 4.2's FFS (Fast File System) by inventing cylinder groups, which break the disk up into smaller chunks, with each group having its own inodes 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 nearby cylinder group, thus reducing fragmentation caused by scattering a directory's contents over a whole disk.
Some of the performance parameters in the superblock included number of tracks and sectors, disk rotation speed, head speed, and alignment of the sectors between tracks. In a fully optimized system, the head could be moved between close tracks to read scattered sectors from alternating tracks while waiting for the platter to spin around.
As disks grew larger and larger, sector level optimization became obsolete (especially with disks that used linear sector numbering and variable sectors per track). With larger disks and larger files, fragmented reads became more of a problem. To combat this, BSD originally increased the filesystem block size from one sector to 1K in 4.0BSD; and, in FFS, increased the filesystem block size from 1K to 8K. This has several effects. The chances of a file's sectors being contiguous is much greater. The amount of overhead to list the file's blocks is reduced, while the number of bytes representable by any given number of blocks is increased.
Larger disk sizes are also possible, since the maximum number of blocks is limited by a fixed bit-width block number. However, with larger block sizes, disks with many small files will waste space, since each file must occupy at least one block. Because of this, BSD added block level fragmentation, also called block suballocation, tail merging or tail packing, where the last partial block of data from several files may be stored in a single "fragment" block instead of multiple mostly empty blocks (Allen 2005).
Vendors of some proprietary Unix systems, such as SunOS/Solaris, System V Release 4, HP-UX, and Tru64 UNIX, have adopted UFS. Most of them adapted UFS to their own uses, adding proprietary extensions that may not be recognized by other vendors' versions of Unix. Surprisingly, many have continued to use the original block size and data field widths as the original UFS, so some degree of (read) compatibility remains across platforms. Compatibility between implementations as a whole is spotty at best and should be researched before using it across multiple platforms where shared data is a primary intent.
In 4.4BSD and BSD Unix systems derived from it, such as FreeBSD, NetBSD, OpenBSD, and DragonFlyBSD, the implementation of UFS1 and UFS2 is split into two layers — an upper layer that provides the directory structure and supports metadata (permissions, ownership, etc.) in the inode structure, and lower layers that provide data containers implemented as inodes. This was done to support both the traditional FFS and the LFS log-structured file system with shared code for common functions. The upper layer is called "UFS", and the lower layers are called "FFS" and "LFS". In some of those systems, the term "FFS" is used for the combination of the FFS lower layer and the UFS upper layer, and the term "LFS" is used for the combination of the LFS lower layer and the UFS upper layer.
Kirk McKusick implemented block reallocation, a technique that reorders the blocks in the file system just before the writes are done to reduce fragmentation and control file system aging. He also implemented soft updates, a mechanism that maintains the file system consistency without limiting the performance in the way the traditional sync mode did. This has the side effect of reducing the requirement of file system checking after a crash or power failure. To overcome the remaining issues after a failure, a background fsck utility was introduced.
In UFS2, Kirk McKusick and Poul-Henning Kamp extended the FreeBSD FFS and UFS layers to add 64-bit block pointers (allowing volumes to grow up to 8 zettabytes), variable-sized blocks (similar to extents), extended flag fields, additional 'birthtime' stamps, extended attribute support and POSIX1.e ACLs. UFS2 became the default UFS version starting with FreeBSD 5.0. FreeBSD also introduced soft updates and the ability to make file system snapshots for both UFS1 and UFS2. These have since been ported to NetBSD, but eventually soft updates (called soft dependencies in NetBSD) was removed from NetBSD 6.0 in favor of the less complex file system journaling mechanism called WAPBL (also referred as logging), which was added to FFS in NetBSD 5.0. OpenBSD has supported soft updates since version 2.9 and has had UFS2 (FFS2) support (no ACLs) since version 4.2. Since FreeBSD 7.0, UFS also supports filesystem journaling using the gjournal GEOM provider. FreeBSD 9.0 adds support for lightweight journaling on top of softupdates(SU+J), which greatly reduces the need for background fsck, and uses NFS-style ACLs by default.
FreeBSD, NetBSD, OpenBSD, and DragonFlyBSD also include the Dirhash system, developed by Ian Dowse. This system maintains an in-memory hash table to speed up directory lookups. Dirhash alleviates a number of performance problems associated with large directories in UFS.
Linux includes a UFS implementation for binary compatibility at the read level with other Unixes, but since there is no standard implementation for the vendor extensions to UFS, Linux does not have full support for writing to UFS. The native Linux ext2 filesystem was inspired by UFS1 but does not support fragments and there are no plans to implement softupdates. (In some 4.4BSD-derived systems, the UFS layer can use an ext2 layer as a container layer, just as it can use FFS and LFS.)
NeXTStep, which was BSD-derived, also used a version of UFS. In Apple's Mac OS X, it is available as an alternative to HFS+, their proprietary filesystem. However, as of Mac OS X v10.5, it is no longer possible to install Mac OS X "Leopard" on a UFS-formatted volume. In addition, one cannot upgrade older versions of Mac OS X installed on UFS-formatted volumes to Leopard; upgrading requires reformatting the startup volume. Currently there is a 4GB file limit for disks formatted as UFS in Mac OSX.
- Marshall Kirk McKusick, William N. Joy, Samuel J. Leffler and Robert S. Fabry. A Fast File System for UNIX (PDF) (Technical report). Computer Systems Research Group, Computer Science Division, Department of Electrical Engineering and Computer Science, University of California, Berkeley. Retrieved 2013-04-08.
- Marshall Kirk McKusick, William N. Joy, Samuel J. Leffler and Robert S. Fabry (August 1984). "A Fast File System for UNIX" (PDF). ACM Transactions on Computer Systems 2 (3): 181–197. doi:10.1145/989.990. Retrieved 2013-04-08.
- Marshall Kirk McKusick, Keith Bostic, Michael J. Karels, and John S. Quarterman (1996). "Local Filesystems; Local Filestores". The Design and Implementation of the 4.4BSD Operating System. Addison-Wesley. ISBN 0-201-54979-4.
- Marshall Kirk McKusick and Gregory R. Ganger (June 1999). "Soft Updates: A Technique for Eliminating Most Synchronous Writes in the Fast Filesystem" (PDF). Proceedings of the FREENIX Track: 1999 USENIX Annual Technical Conference. pp. 1–18. Retrieved 2013-04-08.
- Marshall Kirk McKusick (February 2002). "Running "fsck" in the Background". Proceedings of the BSDCon 2002. pp. 55–64. Retrieved 2013-04-08.
- Richard McDougall, Jim Mauro (2006). "15: The UFS File System". Solaris Internals: Solaris 10 and OpenSolaris Kernel Architecture (2 ed.). ISBN 0-13-148209-2.
- Allen, Hervey (2005-06-20). "UFS2 and Soft Updates make for a powerful combination" (PDF). Introduction to FreeBSD, PacNOG I Workshop, Additional Topics. Network Startup Resource Center. p. 23. Retrieved 2013-04-08.
- "Large data storage in FreeBSD". FreeBSD. 2012-10-01.
- Niraj Kumar (2004-04-12). "UFS/UFS2 tools on Linux".
- Nehal Mistry (2006-08-24). "ufs2tools - UFS for Windows".
- "OpenBSD 2.9 Release". OpenBSD. 2001-06-01. Retrieved 2013-04-08.
- "OpenBSD 4.2 Release". OpenBSD. 2007-11-01. Retrieved 2013-04-08.
- "Archived - Mac OS X 10.5 Leopard: Installing on a UFS-formatted volume". Apple, Inc. 2012-06-12. Retrieved 2013-04-08.