15%

Save 15% on All Hosting Services

Test your skills and get Discount on any hosting plan

Use code:

Skills
Get Started
08.10.2024

Using the `mkfs` Command in Linux: A Complete Guide to Formatting Disks and Partitions

The `mkfs` (make filesystem) command is the primary Linux utility for writing a filesystem structure onto a block device β€” whether that is a raw disk, a partition, or a logical volume. It initializes the superblock, inode tables, block groups, and journal structures required before any data can be written to that device.

Before touching any disk, understand this: `mkfs` is a destructive, non-reversible operation. It does not merely erase a partition table entry β€” it overwrites critical on-disk metadata. Running it against the wrong device, even briefly, renders existing data unrecoverable without forensic tools. Verify your target device with `lsblk` or `blkid` before every invocation.

What `mkfs` Actually Does Under the Hood

When you execute `mkfs -t ext4 /dev/sdb1`, the kernel does not simply "format" the partition in the Windows sense. The command calls the appropriate filesystem-specific binary (in this case `mkfs.ext4`, which is actually `mke2fs` with ext4 defaults) and performs the following:

  • Writes the superblock and backup superblock copies at fixed block group offsets
  • Allocates and initializes the inode table across all block groups
  • Creates the block group descriptor table
  • Initializes the journal (for journaling filesystems like ext4 and XFS)
  • Writes the root directory inode (inode 2 for ext4)
  • Stamps a UUID onto the filesystem for persistent identification

This distinction matters on large drives. Formatting a 4 TB ext4 partition with full inode table initialization can take several minutes. XFS, by contrast, defers most of this work to runtime, making its `mkfs.xfs` nearly instantaneous regardless of volume size.

Identifying the Correct Device Before Formatting

Never guess a device name. Use the following tools to map physical hardware to kernel device nodes.

Using `lsblk`

“`bash

lsblk -o NAME,SIZE,FSTYPE,LABEL,UUID,MOUNTPOINT

“`

Sample output:

“`

NAME SIZE FSTYPE LABEL UUID MOUNTPOINT

sda 100G

β”œβ”€sda1 20G ext4 a1b2c3d4-… /

└─sda2 80G ext4 e5f6a7b8-… /home

sdb 500G

└─sdb1 500G

“`

An empty `FSTYPE` field confirms that `/dev/sdb1` has no existing filesystem β€” it is safe to format.

Using `blkid`

“`bash

sudo blkid /dev/sdb1

“`

If the command returns no output, the partition carries no recognized filesystem signature. If it returns a type, you are about to overwrite existing data.

Using `fdisk -l`

“`bash

sudo fdisk -l /dev/sdb

“`

This reveals partition boundaries, partition types, and whether the disk uses MBR or GPT. If `/dev/sdb` shows no partition table at all, you may need to partition it first with `fdisk`, `gdisk`, or `parted` before running `mkfs`.

Core `mkfs` Syntax and Invocation Patterns

The canonical syntax is:

“`bash

mkfs -t <filesystem_type> [options] <device>

“`

However, `mkfs` itself is a thin wrapper. Each filesystem type ships its own dedicated binary:

`mkfs` aliasUnderlying binaryFilesystem
`mkfs.ext4``mke2fs`Fourth Extended Filesystem
`mkfs.xfs``mkfs.xfs`XFS
`mkfs.btrfs``mkfs.btrfs`B-Tree Filesystem
`mkfs.vfat``mkdosfs`FAT16/FAT32
`mkfs.exfat``mkfs.exfat`exFAT
`mkfs.ntfs``mkntfs`NTFS
`mkfs.f2fs``mkfs.f2fs`Flash-Friendly Filesystem

Calling `mkfs -t ext4` and calling `mkfs.ext4` directly are functionally identical β€” the former simply resolves to the latter. In production scripts, prefer the explicit alias (`mkfs.ext4`) to make intent unambiguous.

Filesystem Type Selection: Technical Comparison

Choosing the wrong filesystem for a workload is a common and costly mistake. The following table maps filesystem characteristics to real-world use cases.

FilesystemMax Volume SizeMax File SizeJournalingBest Use CaseCross-OS Support
**ext4**1 EiB16 TiBYes (ordered/writeback)General-purpose Linux root and data volumesLinux native; read-only on macOS/Windows with drivers
**XFS**8 EiB8 EiBYes (metadata only by default)Large files, databases, high-throughput storage, NFS exportsLinux native
**Btrfs**16 EiB16 EiBCoW (no traditional journal)Snapshots, RAID, subvolumes, NAS workloadsLinux native
**vFAT/FAT32**2 TiB4 GiBNoUSB drives, EFI System Partition (ESP), cross-OS removable mediaUniversal
**exFAT**128 PiB16 EiBNoLarge removable media where FAT32 file size limit is a constraintUniversal (modern OS)
**NTFS**256 TiB256 TiBYesDual-boot Windows data partitionsWindows native; full support on Linux via `ntfs-3g`
**F2FS**16 TiB3.94 TiBLog-structuredSSDs, eMMC, SD cards, Android internal storageLinux native

Critical edge case β€” the EFI System Partition: The ESP must be formatted as `vfat` (FAT32 specifically). Using any other filesystem here will prevent UEFI firmware from locating the bootloader. Always format the ESP with:

“`bash

sudo mkfs.vfat -F 32 /dev/sda1

“`

The `-F 32` flag explicitly forces FAT32 rather than FAT16, which matters for ESP partitions larger than 32 MiB.

Practical `mkfs` Examples with Production-Grade Options

Example 1: Creating an ext4 Filesystem with Tuned Parameters

“`bash

sudo mkfs.ext4 -L "data_vol" -m 1 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdb1

“`

What each flag does:

  • `-L "data_vol"` β€” assigns a persistent label, allowing `/etc/fstab` entries to use `LABEL=data_vol` instead of a raw device path (safer on systems where device enumeration order can shift)
  • `-m 1` β€” reduces reserved block percentage from the default 5% to 1%; on a 2 TB data volume, the default wastes ~100 GB that only root can use
  • `-E lazy_itable_init=0,lazy_journal_init=0` β€” forces complete inode table initialization at format time rather than deferring it to background I/O; critical for production servers where background initialization can cause unexpected I/O spikes hours after deployment

Example 2: Creating an XFS Filesystem for a Database Server

“`bash

sudo mkfs.xfs -L "pg_data" -f /dev/sdb1

“`

  • `-f` β€” forces creation even if an existing filesystem signature is detected; use only when you have confirmed the device is expendable
  • XFS does not support shrinking; plan your volume size carefully before formatting

For PostgreSQL or MySQL workloads on XFS, also set the mount option `noatime` in `/etc/fstab` to eliminate inode access-time write overhead on every read operation.

Example 3: Creating a Btrfs Filesystem with RAID-1 Across Two Devices

“`bash

sudo mkfs.btrfs -L "btrfs_mirror" -d raid1 -m raid1 /dev/sdb /dev/sdc

“`

Btrfs can span multiple block devices natively. `-d raid1` mirrors data; `-m raid1` mirrors metadata. This is a legitimate alternative to mdadm software RAID for environments where snapshot and subvolume functionality is also needed.

Example 4: Creating a vFAT Filesystem for a USB Drive

“`bash

sudo mkfs.vfat -F 32 -n "BACKUP_USB" /dev/sdc1

“`

  • `-n "BACKUP_USB"` β€” sets the volume label (FAT32 labels are limited to 11 characters, uppercase)
  • `-F 32` β€” explicitly selects FAT32 over FAT16

Example 5: Creating an F2FS Filesystem on an SSD

“`bash

sudo mkfs.f2fs -l "ssd_cache" /dev/sdb1

“`

F2FS is specifically engineered for NAND flash storage. It reduces write amplification and manages wear leveling at the filesystem level. On VPS Hosting instances backed by NVMe storage, F2FS can outperform ext4 for ephemeral cache volumes with high write churn.

Formatting an Entire Disk Without a Partition Table

In specific scenarios β€” LVM physical volumes, Ceph OSDs, or single-purpose storage appliances β€” you may write a filesystem directly to a whole disk rather than a partition:

“`bash

sudo mkfs.ext4 /dev/sdb

“`

When this is appropriate:

  • The disk is dedicated to a single purpose and partition flexibility is not needed
  • You are preparing a disk for LVM (`pvcreate` handles this differently, but the concept is similar)
  • You are creating a loopback filesystem image

When this is inappropriate:

  • Any disk that needs to boot (requires a partition table with a boot flag)
  • Any disk shared between multiple filesystems or operating systems
  • Disks on systems where udev rules or cloud infrastructure tooling expect a partition table

Mounting the Formatted Partition and Making It Persistent

Formatting creates the filesystem; mounting makes it accessible. Always use UUID-based references in `/etc/fstab` rather than device names, because device names (`/dev/sdb1`) are not guaranteed to be stable across reboots on systems with multiple disks or hot-plug storage.

“`bash

Create the mount point

sudo mkdir -p /mnt/data_vol

Mount temporarily to verify

sudo mount /dev/sdb1 /mnt/data_vol

Retrieve the UUID

sudo blkid /dev/sdb1

Output: /dev/sdb1: LABEL="data_vol" UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="ext4"

Add a persistent, UUID-based fstab entry

echo 'UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890 /mnt/data_vol ext4 defaults,noatime 0 2' | sudo tee -a /etc/fstab

Validate the fstab entry without rebooting

sudo mount -a

“`

The `0 2` at the end of the fstab entry controls `dump` (backup utility, set to 0 to disable) and `fsck` pass order (2 means check after the root filesystem; root should be 1).

Verifying Filesystem Integrity After Formatting

Do not assume a format succeeded without verification.

“`bash

Check filesystem type, label, and UUID

lsblk -f /dev/sdb1

For ext4: run e2fsck in read-only check mode

sudo e2fsck -n /dev/sdb1

For XFS: verify the filesystem structure

sudo xfs_repair -n /dev/sdb1

Check available space after mounting

df -hT /mnt/data_vol

“`

The `-n` flag on both `e2fsck` and `xfs_repair` performs a dry-run check without modifying the filesystem. This is safe to run on a mounted filesystem for diagnostic purposes, though a full repair requires unmounting first.

Advanced Options Reference

OptionApplicable ToEffect
`-L <label>`AllAssigns a human-readable filesystem label
`-b <block_size>`ext4, XFSSets block size (512, 1024, 2048, 4096 bytes); larger blocks improve throughput for large files, waste space for small files
`-m <percent>`ext4Reserved block percentage for root (default 5%); reduce to 1% on large data volumes
`-i <bytes-per-inode>`ext4Controls inode density; reduce for filesystems storing millions of small files
`-N <inode-count>`ext4Sets explicit inode count; useful when you know the expected file count
`-E lazy_itable_init=0`ext4Disables lazy inode initialization; slower format, eliminates background I/O post-deployment
`-f`XFSForces format even if filesystem signature exists
`-d su=,sw=`XFSConfigures stripe unit and width for RAID-aligned I/O
`-F 32`vFATForces FAT32 (vs FAT16)
`-q`ext4Quiet mode; suppresses progress output (useful in scripts)

Common Pitfalls and How to Avoid Them

Formatting a mounted filesystem: Linux will not always prevent this. Running `mkfs` on a mounted partition corrupts the filesystem immediately and can cause kernel panics. Always verify mount status with `mount | grep /dev/sdb1` before proceeding.

Inode exhaustion on ext4: If you set a large block size (e.g., 4096 bytes) on a volume that will store millions of tiny files (mail spools, session caches), you will exhaust inodes long before disk space. Use `-i 4096` or `-i 2048` to increase inode density. This is a particularly common issue on Email Hosting servers and high-traffic web servers storing per-session files.

XFS and shrinking: XFS volumes cannot be shrunk after creation. If you format a 2 TB XFS volume and later need to reclaim space, your only option is backup, reformat, and restore. Plan XFS volume sizes conservatively or use LVM thin provisioning underneath.

Stripe alignment for RAID and SSDs: Formatting without specifying stripe alignment on a RAID array or SSD causes misaligned I/O, degrading performance significantly. For a RAID-5 array with a 512 KB stripe and 4 disks:

“`bash

sudo mkfs.ext4 -E stride=128,stripe-width=384 /dev/md0

“`

Where `stride = stripe_size / block_size` and `stripe-width = stride * (data_disks)`.

UUID collisions after disk cloning: Cloning a disk with `dd` duplicates the filesystem UUID. Two devices with identical UUIDs cause mount failures and data corruption. After cloning, regenerate the UUID:

“`bash

sudo tune2fs -U random /dev/sdb1 # ext4

sudo xfs_admin -U generate /dev/sdb1 # XFS

“`

This is a critical consideration when deploying Dedicated Servers from disk images or provisioning multiple nodes from a single template.

Filesystem Considerations for VPS and Cloud Environments

On virtual machines and cloud instances, the underlying storage is often a thin-provisioned virtual disk backed by a distributed storage system. Several `mkfs` decisions become more impactful in this context:

  • Discard/TRIM support: Format ext4 with `-E discard` or add the `discard` mount option to enable online TRIM, which returns freed blocks to the underlying storage pool and maintains performance over time on SSD-backed VPS with cPanel instances.
  • Journal mode: For latency-sensitive applications, consider `data=writeback` journal mode in `/etc/fstab` for ext4. This trades strict data ordering for lower write latency, acceptable for databases that manage their own write-ahead logs.
  • Avoid formatting swap as a filesystem: Swap partitions use `mkswap`, not `mkfs`. Running `mkfs` on a swap partition destroys the swap signature without creating a usable filesystem.

When managing storage on VPS Control Panels, additional disk volumes typically appear as unformatted block devices. The workflow is always: identify with `lsblk`, partition if needed with `fdisk`/`gdisk`, format with `mkfs`, mount, and persist in `/etc/fstab`.

Decision Matrix: Choosing the Right Filesystem

Use this matrix to select a filesystem based on your primary constraint:

Primary RequirementRecommended FilesystemAvoid
General-purpose Linux serverext4Btrfs (complexity overhead)
Large files, databases, NFSXFSFAT32 (no permissions)
Snapshots, subvolumes, NASBtrfsext4 (no native snapshots)
Cross-OS USB/removable mediaexFAT or FAT32ext4 (poor Windows support)
EFI System PartitionFAT32 (`mkfs.vfat -F 32`)Any non-FAT
NVMe SSD, high write churnF2FS or XFSFAT32
Dual-boot Windows data volumeNTFSext4
Millions of small filesext4 with `-i 2048`XFS (fixed inode count)

Technical Key-Takeaway Checklist

Before running `mkfs` in any environment, work through this checklist:

  • Confirm the target device with `lsblk -f` and `blkid` β€” never rely on memory or assumption
  • Unmount the target with `umount /dev/sdXN` and verify with `mount | grep sdX`
  • Back up any data on the device; `mkfs` is not reversible
  • Select the filesystem type based on workload (see decision matrix above), not habit
  • Set a filesystem label with `-L` for human-readable identification in logs and `fstab`
  • Reduce reserved blocks on large data volumes (`-m 1` for ext4) to reclaim usable space
  • Disable lazy init (`-E lazy_itable_init=0`) on production servers to prevent post-deployment I/O spikes
  • Use UUID in `/etc/fstab`, not device names, for mount persistence
  • Validate with `mount -a` after editing `/etc/fstab` to catch errors before reboot
  • Run `e2fsck -n` or `xfs_repair -n` after formatting to confirm filesystem integrity
  • Regenerate UUIDs on any disk cloned from a template image

FAQ

Q: Can I run `mkfs` on a partition that is currently mounted?

A: Technically the kernel may allow it, but doing so immediately corrupts the filesystem and can trigger kernel panics or data loss. Always unmount the partition first and confirm with `mount | grep <device>` before running `mkfs`.

Q: What is the difference between `mkfs.ext4` and `mke2fs`?

A: `mkfs.ext4` is a symlink or wrapper that calls `mke2fs` with `-t ext4` defaults. They are functionally identical. `mke2fs` is the canonical tool and accepts the full range of ext2/ext3/ext4 creation options.

Q: Why does formatting a large ext4 partition take so long compared to XFS?

A: ext4 initializes the inode table for every block group at format time (unless `lazy_itable_init=1` is set). On a 4 TB volume, this involves writing gigabytes of zeroed inode table data. XFS defers structure initialization to runtime, making `mkfs.xfs` complete in seconds regardless of volume size.

Q: How do I change a filesystem label after formatting without reformatting?

A: For ext4, use `sudo tune2fs -L "NewLabel" /dev/sdb1`. For XFS, use `sudo xfs_admin -L "NewLabel" /dev/sdb1`. For FAT32, use `sudo fatlabel /dev/sdb1 NEWLABEL`. No data is affected by relabeling.

Q: Is it safe to use `mkfs` on an LVM logical volume?

A: Yes. LVM logical volumes appear as block devices (e.g., `/dev/mapper/vg0-lv_data` or `/dev/vg0/lv_data`) and are treated identically to physical partitions by `mkfs`. This is the standard workflow for production Linux storage: create the LV with `lvcreate`, format with `mkfs`, mount, and persist in `/etc/fstab`.

15%

Save 15% on All Hosting Services

Test your skills and get Discount on any hosting plan

Use code:

Skills
Get Started