The History of the Filesystem

Fractional CTO · Founder of Injuria.ai
The History of the Filesystem
A filesystem is the foundational software abstraction that allows operating systems and users to store, retrieve, and organize data on physical storage media. Without this abstraction, a storage device is merely a continuous, undifferentiated sequence of blocks or sectors. The filesystem imposes a logical structure, translating human-readable file names and hierarchical directories into the physical addresses required by the hardware. It manages metadata, access permissions, free space allocation, and data integrity, acting as the critical intermediary between software applications and persistent storage.
The development of the filesystem is a direct response to the physical constraints of storage hardware and the changing demands of computing workloads. In the early days of computing, data was processed sequentially on punched cards or magnetic tape, requiring flat, record-oriented storage methods. The invention of the random access magnetic disk in the 1950s necessitated new logical structures to locate data anywhere on a platter without reading the entire medium. As storage capacities grew from megabytes to terabytes, filesystems evolved from simple allocation tables to complex, B-tree indexed, journaled architectures capable of recovering from sudden power losses.
Modern filesystems have diverged into highly specialized domains. Local filesystems on consumer devices are optimized for the wear leveling and latency characteristics of solid state NAND flash memory. Enterprise servers rely on copy-on-write filesystems that integrate logical volume management to protect against silent data corruption. At the extreme end of scale, cloud computing providers have largely abandoned traditional POSIX compliant filesystems in favor of distributed object storage and append-only chunk architectures, distributing petabytes of data across thousands of commodity machines.
The Era of Sequential Storage and Early Mainframes (1950s to 1960s)
Before the advent of disk drives, computer storage was strictly sequential. Mainframes of the 1950s, such as the IBM 7090[1], relied heavily on punched cards and magnetic tape. Data was stored as discrete records, and finding a specific piece of information required reading the tape from the beginning until the target record was reached. Operating systems of this era did not have filesystems in the modern sense. They used Input/Output Control Systems (IOCS) to manage the mechanical operation of tape drives and card readers. Programmers had to manually account for the physical constraints of the tape, including inter-record gaps and rewind times, and software was primarily designed around sequential batch processing.
The physical constraint of sequential access was broken on September 14, 1956, when IBM announced the IBM 305 RAMAC[2] (Random Access Method of Accounting and Control). The RAMAC included the IBM 350 Disk Storage Unit, the first commercial hard disk drive. The IBM 350 contained fifty 24-inch magnetic platters spinning at 1200 revolutions per minute, offering a total capacity of approximately 3.75 megabytes of data stored as 5 million 6-bit characters IBM History. This hardware innovation introduced the concept of random access, allowing a mechanical arm to seek directly to a specific track and sector on a platter. However, the software to manage this space was still primitive. Early disk operating systems required programmers to specify exact cylinder, head, and sector (CHS) addresses to store and retrieve data.
The conceptual leap toward modern filesystems occurred with the development of time-sharing operating systems in the 1960s. As multiple users began sharing a single mainframe, the need for data isolation, security, and logical organization became paramount. The Compatible Time-Sharing System (CTSS) developed at MIT introduced a basic file system where users had their own private directories, but the structure was essentially flat within those user boundaries.
The true foundation of the modern hierarchical filesystem was laid by the Multics (Multiplexed Information and Computing Service) project, a collaboration between MIT, Bell Labs, and General Electric. In 1965, R. C. Daley and P. G. Neumann published their paper on the Multics filesystem, detailing a tree-structured hierarchy of directories and files Multics History[3]. In Multics, a directory was simply a special type of file that contained a list of pointers to other files or subdirectories. This recursive definition allowed for an infinitely deep tree structure, enabling users to organize data logically rather than physically. Multics also introduced Access Control Lists (ACLs) to manage permissions across different users, a concept that remains central to enterprise filesystems today.
The Unix Epoch and the Inode (1970s)
While Multics was highly advanced, it was also notoriously complex and resource-intensive. In 1969, Ken Thompson and Dennis Ritchie at Bell Labs began developing a simpler, more elegant operating system that would become Unix. The Unix filesystem borrowed the hierarchical directory structure of Multics but stripped away much of the complexity, introducing a design that would influence almost every operating system that followed ACM Digital Library[4].[17]
The core innovation of the Unix filesystem was the separation of a file's metadata from its human-readable name. In Unix, a file is represented by an index node, or "inode". The inode is a data structure stored in a fixed location on the disk that contains all the administrative information about a file, including its owner, permissions, size, timestamps, and, most importantly, pointers to the physical disk blocks where the file's data is stored.
Directories in Unix are merely lists of human-readable filenames paired with their corresponding inode numbers. This separation allows for features like hard links, where multiple filenames in different directories can point to the exact same inode and underlying data. The original Unix filesystem utilized a multi-level index structure within the inode to locate data blocks. An inode contained a fixed number of direct pointers to data blocks for fast access to small files. For larger files, it utilized a single indirect pointer (pointing to a block of pointers), a double indirect pointer, and a triple indirect pointer. This mathematical progression allowed a very small, fixed-size inode to manage files ranging from a few bytes to several gigabytes.
Unix also popularized the philosophy that "everything is a file." Hardware devices, terminals, and inter-process communication channels were all exposed through the filesystem namespace. A user could write data to a printer by redirecting output to a device file in the /dev directory, using the exact same system calls (open, read, write, close) used for regular text files.
Despite its elegance, the original Unix filesystem suffered from severe performance degradation over time. It allocated data blocks sequentially from a single free list. As files were created and deleted, the free list became scrambled, causing the blocks of new files to be scattered randomly across the disk platter. This fragmentation required the disk head to seek constantly, destroying read and write throughput. In 1984, Marshall Kirk McKusick and his colleagues at the University of California, Berkeley, solved this with the Berkeley Fast File System (FFS) ACM Digital Library[5]. FFS divided the disk into "cylinder groups" and attempted to allocate a file's inode and its data blocks within the same cylinder group, drastically reducing mechanical seek times. FFS also introduced larger block sizes to improve throughput, while using block "fragments" to prevent wasted space for small files.
Personal Computing and the FAT Era (1970s to 1990s)
While Unix dominated academic and minicomputer environments, the microcomputer revolution of the late 1970s and 1980s required filesystems that could operate within severe memory and processing constraints. Early microcomputers relied on floppy disks, which had capacities measured in kilobytes.
In 1977, Marc McDonald and Bill Gates at Microsoft designed the File Allocation Table (FAT) filesystem for Standalone Disk BASIC, which was later adopted by Seattle Computer Products for QDOS, and ultimately became the basis for MS-DOS and early versions of Microsoft Windows Wikipedia[6]. The FAT architecture is remarkably simple, which contributed to its universal adoption as a cross-platform standard for removable media.
A FAT12 and FAT16 volume is divided into a boot sector, a root directory, the File Allocation Table itself, and the data area; in FAT32, the root directory is stored within the data area rather than in a fixed location. The data area is divided into fixed-size "clusters" (groups of contiguous disk sectors). The FAT is essentially an array of integers, where each index in the array corresponds to a cluster on the disk. When a file is created, the directory entry stores the starting cluster number. The operating system looks up that cluster index in the FAT to find the number of the next cluster in the file, forming a linked list. A special end-of-file (EOF) marker indicates the final cluster.
The FAT filesystem evolved through three major iterations based on the bit-width of the table entries. FAT12 used 12-bit entries, limiting a volume to 4,096 clusters, which was sufficient for early floppy disks. FAT16 expanded this to 16 bits (65,536 clusters), supporting early hard drives up to 2 gigabytes (using 32-kilobyte clusters). FAT32, introduced with Windows 95 OSR2, used 28 bits for cluster numbers, allowing for volumes up to 2 terabytes.
Despite its ubiquity, FAT had significant architectural flaws. Because it relied on a linked list, random access to a large file required traversing the entire chain of clusters in the table, which was computationally expensive. In addition, FAT had no built-in mechanisms for file permissions, ownership, or fault tolerance. If the system crashed while updating the File Allocation Table, the linked lists could become orphaned or cross-linked, resulting in data loss.
During this same period, Apple Computer developed the Hierarchical File System (HFS) for the Macintosh, introduced in 1985 Apple Developer Documentation[7]. Unlike FAT's simple linked list, HFS utilized a B-tree data structure to store the catalog of files and directories. This allowed the Macintosh operating system to search for files much faster than MS-DOS could, especially as hard drives grew larger and contained thousands of files. Resource forks and data forks were introduced earlier by the Macintosh File System (MFS) in 1984, allowing a single file to have two separate data streams (one for metadata like icons and executable code, and one for raw data).
Network Abstractions and the VFS (1980s)
As local area networks proliferated in the 1980s, the need arose to share files across different computers.[18] Sun Microsystems addressed this in 1984 with the introduction of the Network File System (NFS) ACM Digital Library[8]. NFS allowed a client computer to mount a remote filesystem over a network and interact with it as if it were a local disk.[19]
To make NFS work smoothly, Sun engineers had to modify the Unix kernel. They introduced an abstraction layer called the Virtual File System (VFS). Before VFS, system calls like open(), read(), and write() were hardcoded to interact directly with the local Unix filesystem. VFS introduced an object-oriented interface inside the kernel. It defined a generic file object called a "vnode" (virtual node).
When a user application issued a read request, the kernel passed the request to the VFS layer. The VFS layer examined the vnode to determine which specific filesystem driver (e.g., local FFS, or remote NFS) was responsible for that file, and then dispatched the request to the appropriate driver. This architectural breakthrough decoupled the operating system's system calls from the underlying storage format.[20] It allowed a single machine to simultaneously mount and interact with CD-ROM filesystems (ISO 9660), MS-DOS floppy disks (FAT), and remote network shares (NFS), all unified under a single root directory tree.
The Rise of Journaling and Enterprise Filesystems (1990s)
By the 1990s, hard drives had grown from megabytes to gigabytes, and servers were hosting millions of files. The traditional filesystems of the 1980s faced a critical scaling problem related to crash recovery. If a server lost power in the middle of a write operation, the filesystem's metadata (inodes, directories, free space bitmaps) could be left in an inconsistent state. Upon reboot, the operating system had to run a filesystem check utility (like fsck in Unix or chkdsk in DOS) to scan the entire disk, verify every pointer, and repair inconsistencies. As disks grew larger, this scanning process began to take hours, causing unacceptable downtime for enterprise environments.
The solution was borrowed from relational database theory: write-ahead logging, commonly known in this context as journaling.[17] In a journaling filesystem, before the operating system modifies the actual filesystem structures, it writes a sequential log entry (the journal) describing the pending changes. Once the journal write is safely on disk, the system applies the changes to the main filesystem. If power is lost during the update, the system upon reboot simply reads the journal and either completes the pending transactions or rolls them back. This reduces crash recovery time from hours to seconds, as only the journal needs to be inspected.
Microsoft introduced journaling to the PC market with the New Technology File System (NTFS), released with Windows NT 3.1 in 1993 Microsoft Learn[9]. NTFS completely abandoned the FAT architecture. Instead, it relies on a relational database-like structure called the Master File Table (MFT). Every file and directory on an NTFS volume is represented by a record in the MFT. In NTFS, everything is an "attribute." The filename is an attribute, the security descriptors (ACLs) are attributes, and the file data itself is an attribute. If a file is very small, its data attribute can be stored directly inside the MFT record (a resident attribute), eliminating the need to allocate a separate disk block and reducing access time.
In the Unix and Linux ecosystems, journaling became standard in the late 1990s and early 2000s. The ext2 filesystem, the default for early Linux distributions, was upgraded to ext3 simply by adding a journal. Later, ext4 was introduced to support much larger volumes and files Kernel.org[10]. Ext4 replaced the traditional Unix block mapping scheme with "extents." Instead of maintaining a pointer for every single block of a large file, an extent records a starting block and a length. A 1-gigabyte contiguous file can be represented by a single extent rather than thousands of individual block pointers, drastically reducing metadata overhead and improving sequential read performance.
Other enterprise filesystems developed during this era, such as SGI's XFS and IBM's JFS, utilized B+ trees not just for directories, but for tracking free space and file extents. This allowed them to scale to massive multi-terabyte arrays while maintaining high performance for parallel input/output operations.
Advanced Volume Management and Copy-on-Write (2000s)
Despite the reliability improvements of journaling, traditional filesystems still suffered from a fundamental architectural limitation: they sat on top of block devices and trusted the hardware implicitly. A traditional filesystem assumes that if it writes a block of data to the disk, reading that block later will return the exact same data. However, physical disks are susceptible to "bit rot" or silent data corruption, where magnetic interference or firmware bugs cause bits to flip without reporting an error to the operating system. In addition, traditional filesystems required separate software layers, such as hardware RAID controllers or Logical Volume Managers (LVM), to span multiple disks.
In 2006, Sun Microsystems released the Zettabyte File System (ZFS) for the Solaris operating system, fundamentally changing the storage paradigm Oracle Documentation[11]. ZFS eliminated the traditional separation between the volume manager and the filesystem. Instead of formatting individual partitions, ZFS aggregates raw disks into a shared storage pool. Multiple logical filesystems can be created on top of this pool, dynamically sharing the available space without needing to be pre-sized.
To combat silent data corruption, ZFS introduced a copy-on-write (CoW) transactional model combined with end-to-end checksumming. In a traditional filesystem, when a file is modified, the new data overwrites the old data in place. If power is lost during this overwrite, the file is corrupted. In ZFS, data is never overwritten in place. When a modification is made, the new data is written to a newly allocated block. Once the write is complete, the metadata pointers are updated to point to the new block.
In addition, ZFS arranges its blocks in a Merkle tree structure. Every block pointer contains a 256-bit checksum of the data block it points to, but the default algorithm (Fletcher4) is not cryptographic. The pointer to that block is itself checksummed by the block above it, all the way up to the root of the tree (the uberblock). When ZFS reads a file, it calculates the checksum of the data and compares it to the checksum stored in the parent pointer. If they do not match, ZFS detects the silent corruption and, if the storage pool is configured with redundancy (like a RAID-Z mirror), automatically fetches the correct data from another disk and repairs the corrupted block on the fly.
The copy-on-write architecture also enables instantaneous snapshots. Because old data is not overwritten, taking a snapshot simply involves preserving the old metadata pointers and preventing the old blocks from being marked as free space. This allows administrators to freeze the state of a massive filesystem in milliseconds with zero performance penalty. Similar concepts were later adopted by the Linux Btrfs (B-tree file system).
Flash Storage and Mobile Optimization (2010s to Present)
The transition from mechanical hard disk drives (HDDs) to solid state drives (SSDs) based on NAND flash memory introduced new physical constraints that required filesystem innovation. Unlike magnetic platters, which can overwrite data at any location, NAND flash memory is divided into pages and erase blocks. While data can be written at the page level (e.g., 4 kilobytes), it can only be erased at the block level (e.g., 2 megabytes). To overwrite a single page, the SSD controller must read the entire block into memory, erase the physical block, modify the page in memory, and write the entire block back. This phenomenon, known as write amplification, degrades performance and physically wears out the flash memory cells.
Modern SSDs use a hardware Flash Translation Layer (FTL) to hide this complexity from the operating system, allowing traditional filesystems like NTFS and ext4 to function. However, filesystems designed specifically for flash memory can achieve better performance and longevity by aligning their write patterns with the physical geometry of the NAND chips.
In 2012, Samsung introduced the Flash-Friendly File System (F2FS) for the Linux kernel, heavily targeting Android smartphones and embedded devices Kernel.org[12].[21] F2FS is based on the concept of a log-structured filesystem. Instead of scattering updates across the disk, F2FS gathers random write requests in memory and flushes them to the storage device as large, sequential, append-only logs. This sequential write pattern minimizes write amplification and reduces the garbage collection overhead on the SSD controller. F2FS maintains a Node Address Table (NAT) to keep track of where the latest version of a file's metadata is located within the sequential log.
Apple undertook a similar modernization effort, replacing the aging HFS+ with the Apple File System (APFS) in 2017 across iOS, macOS, and its other operating systems Apple Developer Documentation[13]. APFS was built from the ground up for solid state storage and mobile devices. It incorporates copy-on-write semantics for fast file cloning and instantaneous snapshots, similar to ZFS but optimized for single-user consumer devices rather than enterprise arrays. APFS also introduced space sharing, where multiple volumes (such as the operating system volume and the user data volume) reside in the same APFS container and dynamically share the same pool of free space. In addition, APFS integrated native encryption at the filesystem level, allowing individual files or entire volumes to be encrypted with different cryptographic keys, a critical requirement for mobile device security.
Distributed and Cloud Filesystems (2000s to Present)
As the internet scaled into the Web 2.0 era, technology companies faced data storage requirements that exceeded the capacity of any single storage array. Traditional network filesystems like NFS were bound by POSIX semantics. POSIX compliance requires strict consistency; if Client A writes to a file and Client B reads it a millisecond later, Client B must see Client A's write. Enforcing this strict consistency across a network requires distributed locking mechanisms, which create massive bottlenecks when scaling to thousands of concurrent clients.
To solve this, companies abandoned POSIX compliance in favor of highly specialized distributed filesystems. In 2003, Google published the architecture of the Google File System (GFS), designed to run on clusters of cheap, commodity hardware Google Research[14]. GFS was optimized for Google's specific workload: storing massive datasets (like the crawl of the World Wide Web) that are written once, appended to occasionally, and read sequentially many times.
GFS utilizes a centralized Master node that stores the filesystem metadata (the directory tree and mapping of files to chunks). The actual data is broken into massive 64-megabyte chunks and distributed across thousands of Chunkservers. When a client application wants to read a file, it asks the Master for the location of the chunks, and then streams the data directly from the Chunkservers, bypassing the Master for the actual data transfer. To ensure reliability on hardware that frequently fails, GFS automatically replicates each chunk to at least three different Chunkservers. This architecture heavily influenced the open-source Hadoop Distributed File System (HDFS), which became the foundation of the big data analytics industry Apache Hadoop[15].
As cloud computing matured, the concept of the filesystem was abstracted even further into Object Storage. In 2006, Amazon Web Services launched Amazon S3 (Simple Storage Service) Amazon Web Services[16]. Object storage completely discards the hierarchical directory tree, inodes, and block-level access. Instead, data is stored in a flat namespace within "buckets." Each file is treated as an immutable object, identified by a unique key (a string), and accessed via standard HTTP REST APIs using simple GET, PUT, and DELETE commands.
Because there are no directories to traverse and no file locks to manage, object storage can scale infinitely. It relies on an eventual consistency model, accepting that it might take a few seconds for a newly written object to be visible across all global data centers. This trade-off of strict consistency for infinite scalability and high availability has made object storage the dominant paradigm for cloud-native applications, media streaming, and data lakes.
The evolution of the filesystem demonstrates a continuous negotiation between hardware limitations and software ambition. From the mechanical constraints of spinning magnetic platters to the wear-leveling algorithms of silicon flash memory, and finally to the globally distributed data centers of the cloud, the filesystem has mutated to ensure that data remains persistent, accessible, and secure. While the underlying structures have shifted from simple linked lists to cryptographic Merkle trees and flat object namespaces, the fundamental goal remains unchanged: translating the physical reality of storage media into a logical framework that software can comprehend.
Sources (21)
- Wikipedia: IBM 7090
- Wikipedia: IBM 305 RAMAC
- Multics History
- ACM Digital Library
- ACM Digital Library
- Wikipedia: Wikipedia
- Apple Developer Documentation
- ACM Digital Library
- Microsoft Learn
- Kernel.org
- Oracle Documentation
- The Linux Kernel Archives
- Apple Developer Documentation
- Google Research
- Apache Hadoop
- Amazon Web Services
- Steve D. Pate, UNIX Filesystems (John Wiley & Sons, 2003)
- Marshall Kirk McKusick, The Design and Implementation of the 4.4BSD Operating System (Addison-Wesley Professional, 1996)
- Marshall Kirk McKusick, George V. Neville-Neil, The Design and Implementation of the FreeBSD Operating System (Addison-Wesley Professional, 2004)
- Hal Stern, Mike Eisler, Ricardo Labiaga, Managing NFS and NIS (O'Reilly Media, 2001)
- Karim Yaghmour, Jon Masters, Gilad Ben-Yossef, Building Embedded Linux Systems ("O'Reilly Media, Inc.", 2008)