Basic Linux Filesystems Tutorial
Basic Linux Filesystems Tutorial
The original Linux system used a simple filesystem that mimicked the functionality of the Unix
filesystem. In this tutorial we will discuss basic file system used in Linux.
The ext filesystem uses a system called inodes to track information about the files stored in
the virtual directory. The inode system creates a separate table on each physical device, called
the inode table , to store the file information. Each stored file in the virtual directory has an entry
in the inode table. The extended part of the name comes from the additional data that it tracks on
each file, which consists of:
Linux references each inode in the inode table using a unique number (called the inode number
), assigned by the filesystem as data files are created. The filesystem uses the inode number to
identify the file rather than having to use the full file name and path.
The ext2 inode table adds the created, modified, and last accessed time values for files to help
system administrators track file access on the system. The ext2 filesystem also increases the
maximum file size allowed to 2TB (then in later versions of ext2, that was increased to 32TB) to
help accommodate large files commonly found in database servers.
In addition to expanding the inode table, the ext2 filesystem also changed the way in which files
are stored in the data blocks. A common problem with the ext filesystem was that as a file is written
to the physical device, the blocks used to store the data tend to be scattered throughout the
device (called fragmentation ). Fragmentation of data blocks can reduce the performance of the
filesystem, as it takes longer to search the storage device to access all of the blocks for a specific
file.
The ext2 filesystem helps reduce fragmentation by allocating disk blocks in groups when you
save a file. By grouping the data blocks for a file, the filesystem doesn't have to search all over the
physical device for the data blocks to read the file. The ext2 filesystem was the default filesystem
used in Linux distributions for many years, but it, too, had its limitations. The inode table, while
a nice feature that allows the filesystem to track additional information about files, can cause
problems that can be fatal to the system. Each time the filesystem stores or updates a file, it has
to modify the inode table with the new information. The problem is that this isn't always a fluid
action.
If something should happen to the computer system between the file being stored and the inode
table being updated, the two would become out of sync. The ext2 filesystem is notorious for easily
becoming corrupted due to system crashes and power outages. Even if the file data is stored
just fine on the physical device, if the inode table entry wasn't completed, the ext2 filesystem
wouldn't even know that the file existed! It wasn't long before developers were exploring a different
avenue of Linux filesystems.
Journaling Filesystems
Journaling filesystems provide a new level of safety to the Linux system. Instead of writing data
directly to the storage device and then updating the inode table, journaling filesystems write file
changes into a temporary file (called the journal ) first. After data is successfully written to the
storage device and the inode table, the journal entry is deleted.
If the system should crash or suffer a power outage before the data can be written to the storage
device, the journaling filesystem just reads through the journal file and processes any
uncommitted data left over.
There are three different methods of journaling commonly used in Linux, each with different levels
of protection. These are shown in below Table.
Method Description
Data mode Both inode and file data are journaled. Low risk of losing data, but poor performance.
Ordered mode Only inode data written to the journal, but not removed until file data is successfully written. Good compromise between performance
and safety.
Writeback mode Only inode data written to the journal, no control over when the file data is written. Higher risk of losing data, but still better than not
using journaling.
Limitation:
The data mode journaling method is by far the safest for protecting data, but it is also the slowest.
All of the data written to a storage device must be written twice, once to the journal, then again
to the actual storage device. This can cause poor performance, especially for systems that do a
lot of data writing. Over the years, a few different journaling filesystems have appeared in Linux.
The following sections describe the popular Linux journaling filesystems available.
The Extended Linux Journaling Filesystems
The same group that developed the ext and ext2 filesystems as part of the Linux project also
created journaling versions of the filesystems. These journaling filesystems are compatible with
the ext2 filesystem, and it's easy to convert back and forth between them. There are currently
two separate journaling filesystems based on the ext2 filesystem.
While the ext3 filesystem added basic journaling to the Linux filesystem, there were still a few
things it lacked. For example, the ext3 filesystem doesn't provide any recovery from accidental
deletion of files, there's no built-in data compressionavailable (although there is a patch that can
be installed separately that provides this feature), and the ext3 filesystem doesn't support
encrypting files. For those reasons developers in the Linux project choose to continue work on
improving the ext3 filesystem.
In addition to support compression and encryption, the ext4 filesystem also supports a feature
called extents .Extents allocate space on a storage device in blocks, and only store the starting
block location in the inode table. This helps save space in the inode table by not having to list all
of the data blocks used to store data from the file.
The ext4 filesystem also incorporates block preallocation . If you want to reserve space on a
storage device for a file that you know will grow in size, with the ext4 filesystem it's possible to
allocate all of the expected blocks for the file, not just the blocks that physically exist. The ext4
filesystem fills in the reserved data blocks with zeroes, and knows not to allocate them for any
other file.
The Reiser Filesystem
In 2001, Hans Reiser created the first journaling filesystem for Linux, called ReiserFS . The
ReiserFS filesystem only supports writeback journaling mode, writing only the inode table data to
the journal file. Because it writes only the inode table data to the journal, the ReiserFS filesystem
is one of the fastest journaling filesystems in Linux.
Two interesting features incorporated into the ReiserFS filesystem are that you can resize an
existing filesystem while it's still active, and that it uses a technique called tailpacking , which
stuffs data from one file into empty space in a data block from another file. The active
filesystem resizing feature is great if you have to expand an already created filesystem to
accommodate more data.
Note :The official IBM name of the second version of the JFS filesystem is JFS2, but most Linux
systems refer to it as just JFS.
The JFS filesystem uses the ordered journaling method, storing only the inode table data in the
journal, but not removing it until the actual file data is written to the storage device. This method is
a compromise between the speed of the ReiserFS and the integrity of the data mode journaling
method.
The JFS filesystem uses extent-based file allocation, allocating a group of blocks for each file
written to the storage device. This method provides for less fragmentation on the storage device.
Outside of the IBM Linux offerings, the JFS filesystem isn't popularly used, but you may run into
it in your Linux journey.
The XFS filesystem uses the writeback mode of journaling, which provides high performance but
does introduce an amount of risk because the actual data isn't stored in the journal file. The XFS
filesystem also allows online resizing of the filesystem, similar to the ReiserFS filesystem, except
XFS filesystems can only be expanded and not shrunk.