Introduction To Linux File System

This article gives you an overview of Linux file system, and introduces Linux system directories.

What Is It?

File system is basically a system software component to help users to manage data on their storages. File system is the foundation of your Operating System. Pretty much everything is stored on your file system. Getting familiar with Linux file system is one of the first steps towards learning Linux.

How Does It Work?

You can think of the file system stack as three layers from top to bottom:

  • File system: File system defines a specific format on a block device. The format allows us to create and delete files on it.
  • Block device: This is the virtual representation of a hardware device in Linux kernel.
  • Hardware storage: This is the real hardware storage. Typically, a hardware storage is a disk, but it could also be memory.

On Linux, you can use lsblk command to list your block devices:

swe@ubuntu-server:~$ lsblk
loop0    7:0    0  63.3M  1 loop /snap/core20/1778
loop1    7:1    0 141.4M  1 loop /snap/docker/2285
loop2    7:2    0  55.6M  1 loop /snap/core18/2667
loop3    7:3    0  55.4M  1 loop /snap/core18/2066
loop4    7:4    0 131.6M  1 loop /snap/docker/796
loop5    7:5    0  67.6M  1 loop /snap/lxd/20326
loop6    7:6    0  49.6M  1 loop /snap/snapd/17883
loop7    7:7    0  49.8M  1 loop /snap/snapd/17950
loop8    7:8    0  91.9M  1 loop /snap/lxd/24061
sda      8:0    0    32G  0 disk
├─sda1   8:1    0     1M  0 part
└─sda2   8:2    0    32G  0 part /
sr0     11:0    1     4M  0 rom
sr1     11:1    1  1024M  0 rom

In the above example, /sda is my physical storage disk. You can also use fdisk command to check the details of that block device or even update it:

swe@ubuntu-server:~$ sudo fdisk -l /dev/sda
Disk /dev/sda: 32 GiB, 34359738368 bytes, 67108864 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: DEED7D2C-0ED2-409D-8019-83AA10EDE0D6

Device     Start      End  Sectors Size Type
/dev/sda1   2048     4095     2048   1M BIOS boot
/dev/sda2   4096 67106815 67102720  32G Linux filesystem

A block device can be mounted to a certain directory.

swe@ubuntu-server:~$ df -lhT
Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  1.9G     0  1.9G   0% /dev
tmpfs          tmpfs     394M  1.1M  393M   1% /run
/dev/sda2      ext4       32G  8.0G   22G  27% /
tmpfs          tmpfs     2.0G     0  2.0G   0% /dev/shm
tmpfs          tmpfs     5.0M     0  5.0M   0% /run/lock
tmpfs          tmpfs     2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/loop0     squashfs   64M   64M     0 100% /snap/core20/1778
/dev/loop1     squashfs  142M  142M     0 100% /snap/docker/2285
/dev/loop3     squashfs   56M   56M     0 100% /snap/core18/2066
/dev/loop2     squashfs   56M   56M     0 100% /snap/core18/2667
/dev/loop4     squashfs  132M  132M     0 100% /snap/docker/796
/dev/loop5     squashfs   68M   68M     0 100% /snap/lxd/20326
/dev/loop6     squashfs   50M   50M     0 100% /snap/snapd/17883
/dev/loop7     squashfs   50M   50M     0 100% /snap/snapd/17950
/dev/loop8     squashfs   92M   92M     0 100% /snap/lxd/24061
tmpfs          tmpfs     394M     0  394M   0% /run/user/1001
tmpfs          tmpfs     394M     0  394M   0% /run/user/1000

The above command suggests that my /dev/sda2 is mounted to my root directory.

Note that another block can be mounted to a sub-directory, even if that sub-directory belongs to directory that another device mounts to. For example, in my case, /dev/shm is mounted to the memory (which is typically called ramdisk).

File System Type

Linux supports a few different file system formats, e.g., ext4, NTFS, FAT32. ext4 is the most commonly used file system type today. The above example device /dev/sda2 is formated as ext4.

Linux System Directories

If you go to your root directory and do an ls, you’ll see something similar to this

swe@ubuntu-server:/$ ls
bin  boot  cdrom  dev  etc  home  lib  lib32  lib64  libx32  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  swap.img  sys  tmp  usr  var

These directories belong to your Linux system. Here are what they do.

binThis is the directory for your executable binaries.
bootThis directory contains the information needed for Linux bootup, e.g., grub files.
devThis is a virtual directory, which includes your device files.
etcThis directory includes a lot of the Linux configuration files, e.g., your apt source repos.
homeThis is where you’ll find your and others’ home directories are in.
libThis is the library directory.
mediaThis is a directory where your system will automatically mount external storage devices to.
mntThis is typically where people manually mount storage devices to.
optThis is reserved for the installation of add-on application software packages.
procThis is also a virtual directory, just like the dev directory. It includes runtime information, e.g., process running information.
rootThis is the home directory for the root user.
runThis is a directory where some processes dump data to.
sbinThis is similar to the bin directory, but it only includes binaries for the root.
srvThis is a directory for servers.
sysThis is another virtual directory. It contains information from devices connected to your computer.
tmpThis directory is for temporary files.
usrThis directory includes user related data, e.g., applications, libraries, documentation, wallpapers, icons.
varvar means variable. This directory includes files whose sizes change over time, e.g., system logs.

Basic Operations

For basic file system operations, please check out commands in this section.