The
Virtual File System (VFS)
Figure 9.4: A Logical Diagram of
the Virtual File System
Figure 9.4 shows the relationship between the Linux
kernel's Virtual File System and it's real file systems. The virtual file
system must manage all of the different file systems that are mounted at any
given time. To do this it maintains data structures that describe the whole
(virtual) file system and the real, mounted, file systems.
Rather confusingly, the VFS
describes the system's files in terms of superblocks and inodes in much the
same way as the EXT2 file system uses superblocks and inodes. Like the EXT2
inodes, the VFS inodes describe files and directories within the system; the
contents and topology of the Virtual File System. From now on, to avoid
confusion, I will write about VFS inodes and VFS superblocks to distinquish them
from EXT2 inodes and superblocks.
As each file system is
initialised, it registers itself with the VFS. This happens as the operating
system initialises itself at system boot time. The real file systems are either
built into the kernel itself or are built as loadable modules. File System
modules are loaded as the system needs them, so, for example, if the VFAT file system is implemented as a
kernel module, then it is only loaded when a VFAT file system is mounted. When a
block device based file system is mounted, and this includes the root file
system, the VFS must read its superblock. Each file system type's superblock
read routine must work out the file system's topology and map that information
onto a VFS superblock data structure. The VFS keeps a list of the mounted file
systems in the system together with their VFS superblocks. Each VFS superblock
contains information and pointers to routines that perform particular
functions. So, for example, the superblock representing a mounted EXT2 file
system contains a pointer to the EXT2 specific inode reading routine. This EXT2
inode read routine, like all of the file system specific inode read routines,
fills out the fields in a VFS inode. Each VFS superblock contains a pointer to
the first VFS inode on the file system. For the root file system, this is the
inode that represents the ``/''
directory. This mapping of information is very efficient for the EXT2 file
system but moderately less so for other file systems.
As the system's processes access
directories and files, system routines are called that traverse the VFS inodes
in the system.
For example, typing ls for a directory or cat for a file cause the the Virtual
File System to search through the VFS inodes that represent the file system. As
every file and directory on the system is represented by a VFS inode, then a
number of inodes will be being repeatedly accessed. These inodes are kept in
the inode cache which makes access to them quicker. If an inode is not in the
inode cache, then a file system specific routine must be called in order to
read the appropriate inode. The action of reading the inode causes it to be put
into the inode cache and further accesses to the inode keep it in the cache.
The less used VFS inodes get removed from the cache.
All of the Linux file systems use
a common buffer cache to cache data buffers from the underlying devices to help
speed up access by all of the file systems to the physical devices holding the
file systems.
This buffer cache is independent
of the file systems and is integrated into the mechanisms that the Linux kernel
uses to allocate and read and write data buffers. It has the distinct advantage
of making the Linux file systems independent from the underlying media and from
the device drivers that support them. All block structured devices register
themselves with the Linux kernel and present a uniform, block based, usually
asynchronous interface. Even relatively complex block devices such as SCSI
devices do this. As the real file systems read data from the underlying
physical disks, this results in requests to the block device drivers to read
physical blocks from the device that they control. Integrated into this block
device interface is the buffer cache. As blocks are read by the file systems
they are saved in the global buffer cache shared by all of the file systems and
the Linux kernel. Buffers within it are identified by their block number and a
unique identifier for the device that read it. So, if the same data is needed
often, it will be retrieved from the buffer cache rather than read from the
disk, which would take somewhat longer. Some devices support read ahead where
data blocks are speculatively read just in case they are needed.
The VFS also keeps a cache of
directory lookups so that the inodes for frequently used directories can be
quickly found.
As an experiment, try listing a
directory that you have not listed recently. The first time you list it, you
may notice a slight pause but the second time you list its contents the result
is immediate. The directory cache does not store the inodes for the directories
itself; these should be in the inode cache, the directory cache simply stores
the mapping between the full directory names and their inode numbers.
No comments:
Post a Comment