1. Overview

An operating system uses a file system on a storage device to manage its files. A file system allows us to create and manage files in a hierarchical manner.

It’s very common to see a single Linux server with multiple storage devices. Often these storage devices are configured to use different types of file systems. One of the common tasks performed by the administrator is to find the file system type used by the particular storage device.

In this short tutorial, we’ll discuss various ways to find the file system type of the particular storage device.

2. Setting up an Example

In Linux, we can create a file system only on a block device. A block device can be any physical storage device, for example – Hard Disk Drive, Solid State Drive, USB Drive, etc. In a virtualized environment, it can be a virtual disk as well.

In this tutorial, primarily, we’ll use a loop device to represent a block device. This will allow us to create multiple disk drives with different file systems. However, the commands discussed in the tutorials will work with real block devices as well.

A loop device is a pseudo-device that doesn’t correspond to any physical block device. It allows us to use a regular file as a block device. Let’s understand this with an example.

2.1. Creating the Files

First, we’ll create five files of 1 GB size each. We can use the dd command for this:

$ mkdir /tmp/fs-demo
$ cd /tmp/fs-demo
$ dd if=/dev/zero of=file-1.img bs=1M count=1024
$ dd if=/dev/zero of=file-2.img bs=1M count=1024
$ dd if=/dev/zero of=file-3.img bs=1M count=1024
$ dd if=/dev/zero of=file-4.img bs=1M count=1024
$ dd if=/dev/zero of=file-5.img bs=1M count=1024

In this example, we are reading ASCII NUL(0x00) characters from the /dev/zero device and writing them to the corresponding file.

The bs option represents the block size, whereas the count option represents the number of blocks to be copied. In our case, these values are 1 M and 1024, respectively.

In a nutshell, this command copies 1024 blocks of 1 M size each to create a file of a 1 GB size.

Let’s verify that the files have been created:

$ ls -1sh
total 5.1G
1.1G file-1.img
1.1G file-2.img
1.1G file-3.img
1.1G file-4.img
1.1G file-5.img

2.2. Creating the Loop Devices

Now, the next step is to create loop devices. We can use the losetup command to create and manage the loop devices.

Let’s associate the loop devices with the files that we created in the previous section:

$ sudo losetup -fP file-1.img 
$ sudo losetup -fP file-2.img 
$ sudo losetup -fP file-3.img 
$ sudo losetup -fP file-4.img 
$ sudo losetup -fP file-5.img

In this example, the -f option finds the first unused device, and the -P option forces the kernel to scan the partition table on a newly created loop device.

Let’s check that loop devices have been associated with the files correctly. We can achieve this using the -l option:

$ losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE               DIO LOG-SEC
/dev/loop1         0      0         0  0 /tmp/fs-demo/file-2.img   0     512
/dev/loop4         0      0         0  0 /tmp/fs-demo/file-5.img   0     512
/dev/loop2         0      0         0  0 /tmp/fs-demo/file-3.img   0     512
/dev/loop0         0      0         0  0 /tmp/fs-demo/file-1.img   0     512
/dev/loop3         0      0         0  0 /tmp/fs-demo/file-4.img   0     512

Here, the NAME column represents the loop device, and the BACK-FILE column represents the file associated with it.

We should note that, the available loop devices vary from system to system. Hence it’s important to find the correct loop devices before using them.

In our case, we can use the loop device from /dev/loop0 to /dev/loop4.

2.3. Creating the File System

Now, let’s create a few different types of file systems on the loop devices using the mkfs command:

$ sudo mkfs -t ext2 /dev/loop0
$ sudo mkfs -t ext3 /dev/loop1
$ sudo mkfs -t ext4 /dev/loop2
$ sudo mkfs -t xfs /dev/loop3
$ sudo mkfs -t vfat /dev/loop4

In this example, we have used the -t option with mkfs to specify the file system type.

2.4. Mounting the Loop-back File System

Finally, we can mount the first three loop devices onto directories using the mount command:

$ sudo mkdir -p /mnt/fs-1 /mnt/fs-2 /mnt/fs-3
$ sudo mount -o loop file-1.img /mnt/fs-1
$ sudo mount -o loop file-2.img /mnt/fs-2
$ sudo mount -o loop file-3.img /mnt/fs-3

We should note that, we have used the -o loop option with the command to mount the loop devices.

In the next section, we’ll see how to verify that the loop devices have been mounted correctly.

3. Finding the File System Type of the Mounted Devices

3.1. Using the mount Command

In the previous section, we used the mount command to mount a file system. We can use the same command to find the file system’s type.

Let’s see this in action:

$ mount | grep -iE "loop0|loop1|loop2"
/dev/loop0 on /mnt/fs-1 type ext2 (rw,relatime)
/dev/loop1 on /mnt/fs-2 type ext3 (rw,relatime)
/dev/loop2 on /mnt/fs-3 type ext4 (rw,relatime)

Here, the second to last column shows the file system type.

Additionally, this command also shows the other file system details like – the loop device, its mount point, its permissions, etc.

3.2. Cleaning Up

In this tutorial, we created loop devices and files for demo purposes. Hence, we should remove them to reclaim the storage space.

Let’s see the steps to remove the first loop device and its associated file.

First, unmount and delete the directory:

$ sudo umount /mnt/fs-1
$ sudo rm -rf /mnt/fs-1/

Next, we detach the loop device with the help of the -d option:

$ sudo losetup -d /dev/loop0

Finally, we’ll remove the file associate with the loop device:

$ rm -f /tmp/fs-demo/file-1.img

3.3. Using the df Command

The df command shows the details about the file system’s disk space. We can use the -T option with it to show file system type:

$ df -T | grep -iE "loop1|loop2"
/dev/loop1     ext3     998060       60    945572   1% /mnt/fs-2
/dev/loop2     ext4     996780       24    927944   1% /mnt/fs-3

In this example, the second column represents the file system type.

Apart from this, we can also use the -t option with the command to filters the output based on the file system type.

Let’s list the device that is using the ext3 file system:

$ df -t ext3
Filesystem     1K-blocks  Used Available Use% Mounted on
/dev/loop1        998060    60    945572   1% /mnt/fs-2

3.4. Cleaning Up the Other Devices

Now, let’s remove the /dev/loop1 and /dev/loop2 devices and their associated files:

$ sudo umount /mnt/fs-2 /mnt/fs-3 
$ sudo rm -rf /mnt/fs-2/ /mnt/fs-3/
$ sudo losetup -d /dev/loop1 /dev/loop2 
$ rm -f /tmp/fs-demo/file-2.img /tmp/fs-demo/file-3.img

4. Finding the File System Type of the Unmounted Devices

4.1. Using the file Command

The file command is used to determine a file type. However, to use it with the block devices, we have to use the -s option:

$ sudo file -s /dev/loop3
/dev/loop3: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs)

The -s option instructs the command to treat the file as a special type of file.

Here, we can see that the /dev/loop3 device is configured to use the XFS file system.

4.2. Cleaning Up

Let’s clean up the /dev/loop3 device and its associated file:

$ sudo losetup -d /dev/loop3
$ rm -f /tmp/fs-demo/file-4.img

We should note that, the /dev/loop3 device wasn’t mounted while setting up our example. Hence steps related to unmounting and deleting the directory are not required.

4.3. Using the blkid Command

The blkid command is useful when we want to print the attributes of the block devices. The file system type is one such attribute.

Let’s use the blkid command to find the file system type:

$ blkid /dev/loop4 
/dev/loop4: UUID="0700-9673" BLOCK_SIZE="512" TYPE="vfat"

In this example, the last column represents the file system type which is vfat.

Similar to the df command, we can use the -t option of this command to filter the output.

Let’s list the device that is formatted using the vfat file system:

$ blkid -t TYPE=vfat
/dev/loop4: UUID="0700-9673" BLOCK_SIZE="512" TYPE="vfat"

4.4. Using the lsblk Command

The lsblk command list all block devices. We can use the -f option of this command to display details about the file system:

$ lsblk -f /dev/loop4
NAME  FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
loop4 vfat   FAT32       0700-9673                                           

Here, we can determine the file system type by referring to the second column of the output.

4.5. Cleaning Up the Last Device

Now, let’s remove the /dev/loop4 device and the file associated with it:

$ sudo losetup -d /dev/loop4
$ rm -f /tmp/fs-demo/file-5.img

5. Finding the File System Type of the Real Devices

In the previous sections, we worked with pseudo-devices only. However, we can use all of these commands with real block devices as well.

Let’s use the df command to find the file system type:

$ df -T | grep -iE "sda|sdb"
/dev/sda3      ext4  238735004 111667452 114867616  50% /
/dev/sda2      vfat     524252      5364    518888   2% /boot/efi
/dev/sdb       vfat   15000952   4025864  10975088  27% /media/jarvis/NARENDRA

In this example, the /dev/sda is a Hard Disk Drive, and /dev/sdb is a USB drive.

Similarly, we can use the lsblk command to achieve the same result:

$ lsblk -f /dev/sda2 /dev/sda3 /dev/sdb
NAME FSTYPE FSVER LABEL    UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sda2 vfat   FAT32          76C6-9FD9                             506.7M     1% /boot/efi
sda3 ext4   1.0            82cfd4da-604d-4127-a05c-a6eb240f87b8  109.5G    47% /
sdb  vfat   FAT32 NARENDRA 5E75-A2F2                              10.5G    27% /media/jarvis/NARENDRA

Here, /dev/sda2 and /dev/sda3 represent the partitions of the Hard Disk Drive.

6. Conclusion

In this article, we saw how to identify the file system type of the block devices.

First, we used the mount and df commands to find the file system type of the mounted block devices.

Then we used the file, blkid, and lsblk commands to find the file system type of the unmounted block devices.

Finally, we used the df and lsblk commands with the real block devices.