138

I just formatted stuff. One disk I format as ext2. The other I want to format as ext4. I want to test how they perform.

Now, how do I know the kind of file system in a partition?

user4951
  • 10,519

12 Answers12

133

How do I tell what sort of data (what data format) is in a file?
→ Use the file utility.

Here, you want to know the format of data in a device file, so you need to pass the -s flag to tell file not just to say that it's a device file but look at the content. Sometimes you'll need the -L flag as well, if the device file name is a symbolic link. You'll see output like this:

# file -sL /dev/sd*
/dev/sda1: Linux rev 1.0 ext4 filesystem data, UUID=63fa0104-4aab-4dc8-a50d-e2c1bf0fb188 (extents) (large files) (huge files)
/dev/sdb1: Linux rev 1.0 ext2 filesystem data, UUID=b3c82023-78e1-4ad4-b6e0-62355b272166
/dev/sdb2: Linux/i386 swap file (new style), version 1 (4K pages), size 4194303 pages, no label, UUID=3f64308c-19db-4da5-a9a0-db4d7defb80f

Given this sample output, the first disk has one partition and the second disk has two partitions. /dev/sda1 is an ext4 filesystem, /dev/sdb1 is an ext2 filesystem, and /dev/sdb2 is some swap space (about 4GB).

You must run this command as root, because ordinary users may not read disk partitions directly: if needed, add sudo in front.

  • 1
    When entering $ sudo file /dev/sda1, I get /dev/sda1: block special – heinrich5991 Jan 10 '13 at 16:55
  • 3
    @heinrich5991 “you need to pass the -s flag …”. I show the command file -s /dev/sd* − with sudo in front, that's sudo file -s /dev/sd*. – Gilles 'SO- stop being evil' Jan 10 '13 at 16:57
  • Oh sorry, I overlooked that. :( – heinrich5991 Jan 10 '13 at 20:35
  • 2
    doesn't work for LVM stuff: parted -l seems to work better – TiloBunt Nov 28 '14 at 21:35
  • 1
    @TiloBunt It works for LVM as well. The device name will be /dev/VOLUMEGROUP/LOGICALVOLUME or /dev/mapper/VOLUMEGROUP-LOGICALVOLUME instead of /dev/sdLETTERDIGIT. – Gilles 'SO- stop being evil' Nov 29 '14 at 12:11
  • tried that file -s /dev/mapper/ but get symbolic link to../dm-0'same forfile -s /dev/vg_devccsrv11/*` – TiloBunt Dec 01 '14 at 16:30
  • 1
    @TiloBunt Make that file -sL /dev/mapper/foo-bar, with the -L flag to dereference the symlink. – Gilles 'SO- stop being evil' Dec 01 '14 at 17:04
  • I've been using this technique for years. But today it failed because the unformatted EBS volume happens to match the signature of a DOS executable:$ sudo file -s /dev/xvdm /dev/xvdm: DOS executable (COM) – rectalogic Jul 18 '17 at 13:54
  • @rectalogic file guesses, and sometimes it can guess wrong. When you know what kind of file you're looking at (e.g. you know that it's a filesystem image) it works reasonably well. When it's open-ended, such as in your case with a volume that contained “random” garbage, there can be false positives. COM executables don't actually have any structure, so there file has both many false positives and many false negatives. – Gilles 'SO- stop being evil' Jul 19 '17 at 00:47
  • I've switched to using blkid -o value -s TYPE /dev/xvdm - it exits with 2 if the device is unformatted, otherwise prints the filesystem, and works with LUKS encrypted filesystems. – rectalogic Jul 20 '17 at 13:16
72

Another option is to use blkid:

$ blkid /dev/sda1
/dev/sda1: UUID="625fa1fa-2785-4abc-a15a-bfcc498139d1" TYPE="ext2"

This recognizes most filesystem types and stuff like encrypted partitions.

You can also search for partitions with a given type:

# blkid -t TYPE=ext2
/dev/sda1: UUID="625fa1fa-2785-4abc-a15a-bfcc498139d1" TYPE="ext2" 
/dev/sdb1: UUID="b80153f4-92a1-473f-b7f6-80e601ae21ac" TYPE="ext2"
crater2150
  • 3,946
47

You can use sudo parted -l

[shredder12]$ sudo parted -l

Model: ATA WDC WD1600BEVT-7 (scsi)
Disk /dev/sda: 160GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type      File system     Flags
 1      32.3kB  8587MB  8587MB  primary   ext3            boot
 4      8587MB  40.0GB  31.4GB  primary   ext4
 2      40.0GB  55.0GB  15.0GB  primary   ext4
 3      55.0GB  160GB   105GB   extended
 5      55.0GB  158GB   103GB   logical   ext4
 6      158GB   160GB   1999MB  logical   linux-swap(v1)

Source

Karthik T
  • 924
  • 6
  • 13
  • 1
    parted is not installed. Also the drives are not mounted yet. – user4951 Jan 09 '13 at 10:45
  • 1
    @JimThio I assume you were able to install it? You should be able to get it by simply doing sudo apt-get install parted (or gparted) if you are on Ubuntu or any other debian derivative. – Karthik T Jan 09 '13 at 12:24
  • 2
    +1: I've verified that this gives the correct result when mounting an ext2 filesystem with mount -t ext4. parted isn't fooled by that. – Warren Young Jan 09 '13 at 16:45
  • While this is not the most upvoted answer, this is the one I actually use. Also I do not need to specify the device. – user4951 Jan 10 '13 at 02:34
  • Because it is not the best answer: a partition might be grub-labeled as ext2 and contains ext4 filesystem (and then would be mounted as ext4 with mount -t auto) – Basile Starynkevitch Jan 18 '16 at 08:18
20

Surprised this isn't on here already. No sudo required:

lsblk -f

Freedom_Ben
  • 4,494
  • 3
    If I run this without sudo the FSTYPE column is blank. – Flup Jul 15 '15 at 14:45
  • @Flup I just tried it myself again and it worked perfectly without sudo. FSTYPE column was fully populated. May be some disparity between our systems? – Freedom_Ben Jul 18 '15 at 01:50
  • 1
    @Flup - you must be using Debian/Ubuntu or derivatives... They're famous for doing something (or maybe not doing something, I wouldn't know) and the end result is you need root privileges to list some lsblk columns... – don_crissti Sep 03 '15 at 22:00
  • 1
    Best answer for me, using without sudo, also works on Debian/Ubuntu derivatives, I am on Pop Os. – zer09 Nov 24 '19 at 01:36
15

Still another way, since you know you're running some flavor of ext?, is to look at the filesystem's feature list:

# tune2fs -l /dev/sda1 | grep features

If in the list you see:

  • extent — it's ext4
  • no extent, but has_journal — it's ext3
  • neither extent nor has_journal — it's ext2

The parted and blkid answers are better if you want these heuristics run for you automatically. (They tell the difference with feature checks, too.) They can also identify non-ext? filesystems.

This method has the virtue of showing you the low-level differences.

The important thing to realize here is that these three filesystems are forwards compatible, and to some extent backwards-compatible, too. Later versions just add features on top of the older ones.

See the ext4 HOWTO for more information on this.

Warren Young
  • 72,032
13

try using df -T see man df for more options still one more way I found is cfdisk

  • 2
    This has the same weakness as h3rmiller's mount based answer. – Warren Young Jan 09 '13 at 16:38
  • 3
    h3rrmiller removed his answer, so for those who don't have the rep to see it now, the problem is that if you say mount -t ext4 on an ext2 filesystem, df -T reports ext4. That is, it's just reading what the mount table says, not looking at the filesystem metadata to figure this out. – Warren Young Jan 09 '13 at 18:19
  • @Warren: That's because it is an ext4 filesystem in that case. Just one with not many features. – mattdm Jan 09 '13 at 19:05
  • @mattdm: So when you unmount it...is it still an ext4 filesystem? – Warren Young Jan 09 '13 at 19:26
  • @Warren: in a sense, all ext2 filesystems are also ext4 filesystems, yes. (But of course, not in the sense most people mean.) – mattdm Jan 09 '13 at 19:32
  • In that case, I've been using ext4 since 1993 or so, in Yggdrasil Linux. I'm probably using ext5 already. Woohoo, I live in the FUTURE! – Warren Young Jan 10 '13 at 22:26
6

use -T option to print file system type

[root@centos6 ~]# df -T

Filesystem           Type  1K-blocks    Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root
                     ext4    6795192 6367072     76276  99% /
tmpfs                tmpfs    639164       0    639164   0% /dev/shm
/dev/sda1            ext4     487652   28684    433368   7% /boot
2

fdisk -l will list

Usage:

 fdisk [options] -l <disk> list partition table(s)
 fdisk -s <partition>      give partition size(s) in blocks
 fdisk [options] <disk>    change partition table
  • 2
    On what system? fdisk, on the system I'm using at the moment at least, only shows the partition type, not the filesystem type. That means not only can't it tell the difference between ext2, ext3, and ext4, it also can't discern ReiserFS or XFS from these. – Warren Young Jan 09 '13 at 20:17
  • +1 for effort. I have done fdisk before asking this question. Keep points up. – user4951 Jan 10 '13 at 02:35
1

To get just the filesystem type with lsblk:

# lsblk -n -o FSTYPE /dev/sda1 
vfat
# lsblk -n -o FSTYPE /dev/sda2
ext4

Another option is blkid:

blkid -o export <partition-device> | grep '^TYPE' | cut -d"=" -f2

An example run is:

# blkid -o export /dev/sda1 | grep '^TYPE' | cut -d"=" -f2
vfat
# blkid -o export /dev/sda2 | grep '^TYPE' | cut -d"=" -f2
ext4
Diego
  • 143
  • 6
  • Not sure if this is a newer option, but blkid can directly output a value without pipes # blkid -s TYPE -o value /dev/sdb1 yields ext4 for example – nijave Aug 21 '23 at 23:04
0

This didn't show the BSD answer I was looking for. I had the impression these type bytes were actually contained in the partition table on the disk, not sure about that. There's only type 85 for all Linux extfs types, but Linux doesn't recognize OpenBSD's A6 type at all either.

00 unused         20 Willowsoft     66 NetWare 386    A9 NetBSD
01 DOS FAT-12     24 NEC DOS        67 Novell         AB MacOS X boot
02 XENIX /        27 Win Recovery   68 Novell         AF MacOS X HFS+
03 XENIX /usr     38 Theos          69 Novell         B7 BSDI filesy*
04 DOS FAT-16     39 Plan 9         70 DiskSecure     B8 BSDI swap
05 Extended DOS   40 VENIX 286      75 PCIX           BF Solaris
06 DOS > 32MB     41 Lin/Minux DR   80 Minix (old)    C0 CTOS
07 NTFS           42 LinuxSwap DR   81 Minix (new)    C1 DRDOSs FAT12
08 AIX fs         43 Linux DR       82 Linux swap     C4 DRDOSs < 32M
09 AIX/Coherent   4D QNX 4.2 Pri    83 Linux files*   C6 DRDOSs >=32M
0A OS/2 Bootmgr   4E QNX 4.2 Sec    84 OS/2 hidden    C7 HPFS Disbled
0B Win95 FAT-32   4F QNX 4.2 Ter    85 Linux ext.     DB CPM/C.DOS/C*
0C Win95 FAT32L   50 DM             86 NT FAT VS      DE Dell Maint
0E DOS FAT-16     51 DM             87 NTFS VS        E1 SpeedStor
0F Extended LBA   52 CP/M or SysV   8E Linux LVM      E3 SpeedStor
10 OPUS           53 DM             93 Amoeba FS      E4 SpeedStor
11 OS/2 hidden    54 Ontrack        94 Amoeba BBT     EB BeOS/i386
12 Compaq Diag.   55 EZ-Drive       99 Mylex          EE EFI GPT
14 OS/2 hidden    56 Golden Bow     9F BSDI           EF EFI Sys
16 OS/2 hidden    5C Priam          A0 NotebookSave   F1 SpeedStor
17 OS/2 hidden    61 SpeedStor      A5 FreeBSD        F2 DOS 3.3+ Sec
18 AST swap       63 ISC, HURD, *   A6 OpenBSD        F4 SpeedStor
19 Willowtech     64 NetWare 2.xx   A7 NEXTSTEP       FF Xenix BBT   
1C ThinkPad Rec   65 NetWare 3.xx   A8 MacOS X     

If you're in OpenBSD's fdisk and you hit ? when it asks for partition type this is what you get. The types show when you're editing or listing the partition table.

Partition types on Wikipedia: https://en.wikipedia.org/wiki/Partition_type

Mark Booth
  • 1,031
0

Since it hasn't been mentioned, wipefs can also do this.

When used without any options, wipefs lists all visible filesystems and the offsets of their basic signatures. The default output is subject to change. So whenever possible, you should avoid using default outputs in your scripts. Always explicitly define expected columns by using --output columns-list in environments where a stable output is required.

e.x.

wipefs --output type -i /dev/sdb1
ext4

--output to specify you only want the type column

-i hides headers from the output

Under the hood this appears to use libblkid so should have the same output as blkid

nijave
  • 123
0

You can mount the partitions and then use findmnt. (Doesn't require root.)

findmnt             # to lists all
findmnt /dev/sda1   # to specify a partition

See: https://wiki.archlinux.org/title/File_systems#List_mounted_file_systems

zazke
  • 101