Linux Filesystem follows a tree-like hierarchical layout that is governed by the Filesystem Hierarchy Standard (FHS). This is a standard maintained by the Linux Foundation. The latest version of the FHS at the time of writing this guide is version 3.0.3 which was released in June 2015.
The Linux Filesystem structure starts at the very top with the root directory which is the uppermost directory in the hierarchy. It contains all the directories and subdirectories on the system as we shall see later on in this guide.
To get a better picture of this, navigate to the root directory /
and run the following command:
tree -D -L 1
The output provides all the main directories residing on the system. Before we delve deeper and explore what each of these directories contain, let us briefly look at the main types of files on a Linux system.
Type of Files in Linux
In Linux and UNIX systems, everything is considered a file. If not, then it’s a running process. Generally, all files in Linux fall into either of these three categories.
- Regular files: These include text files, photos, videos, programs, and executable files.
- Directories: This might sound a bit strange, but in Linux, directories are also considered files since they provide storage for other files and subdirectories.
- Special files: These are device files that comprise symbolic links, block files, socket files, and named pipe files.
That said, let us now examine the Linux File System Tree in more detail.
/ ( Root Directory)
Denoted by a single forward slash ( / ), the root directory is the topmost directory in the Linux hierarchy structure, as discussed earlier. All files and folders on your Linux system are stored here and can be referenced from this directory, even when stored in various locations such as removable or virtual devices.
NOTE:
The root (/) directory is not to be confused with the root home directory ( /root ).
/home
The /home
directory is a directory that contains users' personal files. The directory is the entry point for any login user on the Linux system. It stores folders, files, and personal data that is specific to an individual user.
Folders in the /home
directory take the form /home/USERNAME
where USERNAME
is the name of the login user. For example, if we have a login user called mike, the home directory for the user will be /home/mike
.
Inside the /home/USERNAME
directory are other sub-directories such as Desktop, Downloads, Documents, Pictures, Videos, Templates, Public, and Music as below.
In addition, home directories contain personalized configuration files which are hidden files preceded by a dot. Such files include the .bashrc
, .bash_logout,
and .bash_profile
to mention a few.
To view hidden files, run the ls
command with the -la
option as shown.
ls -la
/root
This is the home directory of the root account, also known as the root user’s home directory. The /root
directory stores configuration files for the root account in the same way each regular user's home directory contains configuration files and regular files for that user.
/boot
Another critical directory is the /boot
directory. The directory, as the name implies, contains essential files needed to successfully boot the system. These files include the grub bootloader files, root filesystem files, Linux kernel files (vmlinuz), and other boot configuration files.
/bin
The /bin
directory contains binary executables or Linux programs. These include common Linux commands that are made available for all users in single-user mode. These include cat, chown, chmod, ping, cp, mkdir, ls, cat, rm, and mv just to mention a few.
To confirm the path of a binary executable or command such as the cp
command, run the command:
which cp
/sbin
Unlike the /bin
directory, the /sbin
directory contains binary executables and command line tools that are preserved for the root user. These are privileged commands used for system administration tasks. Examples of such commands include fdisk, route, reboot, mkfs, init, and fsck to mention a few.
Again, to confirm the path to the binary executable, run the which
command followed by the binary executable.
which reboot
/dev
The /dev
directory contains special files that are representative of devices attached to the system. These include consoles, hard drives, or any other peripheral devices plugged into the system. A good example of a device file is /dev/sda
which represents the first SATA hard drive attached to the Linux system.
The /dev
directory is also a storage location for pseudo devices or virtual devices that do not reference any hardware connected to the system. An example is the /dev/null
file which discards any data sent to it.
/etc
The /etc
directory contains host-specific system-wide configuration files. It stores configuration files required by all programs as well as startup and shutdown shell scripts.
The configuration files can be modified using a text editor such as nano or vim by the root or sudo user which is a regular user with elevated privileges to run certain root commands.
/lib,/lib64
The /lib directory contains shared library images required in the /bin
or /sbin
directories. These are essential libraries required by the system to boot and run normally.
/media
The /media
directory contains temporary sub-directories on which removable media such as optical drives are automatically mounted. A good example of a sub-directory is /media/cdrom
for optical drives.
/mnt
The /mnt
directory provides a temporary mount point on which removable media such as CDROMs can be mounted. It is most often used to mount storage devices or partitions manually, and is more of a relic of the past.
/tmp
On Linux systems, temporary files are stored in the /tmp
directory. These are temporary files created by the system and users. Files in this directory are usually a few kilobytes in size and are, in most cases, deleted when a system is rebooted.
/opt
The /opt
directory contains add-on applications or software packages that are provided by a third-party vendor and are not installed through your operating system package manager. Each such application has its own subdirectory which contains all the essential files needed for it to run.
When you install a software package from a third-party repository, or compile software binaries yourself, the files are stored in the /opt
directory.
/var
Var stands for variable. As the name suggests the /var
directory is a directory that contains files that are constantly changing in size such as log and spool files.
Here is a list of the salient directories contained in the /var
directory:
-
/var/log
- Contains system and application log files. -
/var/cache
- Contains cached data from programs. -
/var/mail
- Contains users’ mailboxes -
/var/spool
- Comprises queued or spooled files for various programs. -
/var/spool/cron
- Contains spooled files for cron jobs. -
/var/spool/at
- Contains spooled jobs for at. -
/var/spool/lpd
- Contains spooled files for printing. -
/var/opt
- Contains variable data files for the/opt
directory.
/run
Most Linux distributions come with the /run
filesystem. This is a directory that stores volatile runtime data since the system was started. Data stored in this directory does not persist upon a reboot.
/proc
Also referred to as the proc filesystem, The /proc
directory is a virtual or pseudo filesystem that contains special files that provide information about running processes and the kernel’s current state. It is regarded as the information and control center of the Linux kernel.
The proc directory is a peculiar directory in that it’s not a real filesystem and it ceases to exist once the system is powered off. It is mounted at the /proc
mount point during the booting process.
/usr
This is one of the most critical directories in the Linux system. The /usr
directory is a directory that comprises libraries, binaries, and documentation for installed software applications. System files contained in this directory are shareable among other users.
At a glance, here are some of the salient subdirectories contained in the /usr
directory:
-
/usr/bin
- This contains binary files for user programs that cannot be found under the/bin
directories. Examples of such programs include less, more, scp, and awk to mention a few. -
/usr/sbin
- This provides binary files for system administrators or privileged users. Usually, system binaries are located in the/sbin
directory but if you can't find them there, look under the/sbin
directory. -
/usr/local
- The directory contains user programs installed from source or outside the distribution's provided software. For example, when you install the Go programming language from source, it goes under the/usr/local/go
directory. -
/usr/lib
- This provided libraries needed by the/usr/bin
and/usr/sbin
directories. -
/usr/src
- This contains the Linux header files, kernel sources, and documentation.
/srv (Service directory)
The term srv stands for service. The/srv
directory contains site-specific data for your Linux distribution. It points to the location for data files for a specific service such as www, rsync, FTP and CVS.
/sys
This is a virtual or pseudo filesystem that contains a collection of virtual files that are attached to the Linux Kernel.
/snap
This is where snap packages go into. Snap is a package management system developed by Canonical, the publisher and maintainer of Ubuntu. Snaps are containerized, cross-distribution software packages that are packaged with all their dependencies. They are easy to install and are intended to work across all major Linux distributions that have snap enabled.
If you have installed an application from a snap package, then all the software files will be found in the /snap
directory.
/lost+found
This is a directory that is mostly found in Ubuntu and Ubuntu-based distributions. It’s a special directory that contains obsoleted data. These are fragments of files that have either been deleted or lost during disk operation.
Conclusion
In this guide, we examined the Linux File System Tree and fleshed out the directories that make up the File system hierarchy. The Linux file filesystem hierarchy ensures consistency between various Linux Systems and provides Linux administrators and developers with a standard directory structure that makes it easy to manage the system.