ext4: The Linux Workhorse Filesystem

8 min

Deep dive into ext4 (fourth extended filesystem) - the default filesystem for most Linux distributions. Learn about journaling, extents, and why ext4 remains the reliable choice.

Best viewed on desktop for optimal interactive experience

The ext4 Story: Why Boring is Beautiful

Picture this: It's 3 AM, your server just crashed, and you're frantically rebooting. Will your data be there? Will the filesystem be corrupted? With ext4, you can breathe easy. This is the filesystem that millions trust with their data every single day.

ext4 isn't trying to win any innovation awards. It's not the fastest (that's XFS), not the most feature-rich (hello ZFS), and definitely not the most modern (looking at you, Btrfs). But here's the thing—ext4 is the filesystem that just works. It's been battle-tested for over 15 years, handling everything from tiny Raspberry Pis to massive enterprise servers.

Think of ext4 as the Toyota Camry of filesystems. It won't turn heads at a car show, but it'll reliably get you to work every day for the next 200,000 miles without breaking a sweat.

Evolution: ext2 → ext3 → ext4

  • ext2 (1993): Basic filesystem, no journaling, fast but risky
  • ext3 (2001): Added journaling for crash recovery
  • ext4 (2008): Extents, delayed allocation, larger files (16 TiB), better performance

Key Features of ext4

1. Journaling: Your Data's Safety Net

The Problem: Imagine you're updating a file when suddenly—power outage! Without journaling, your filesystem could be left in an inconsistent state, with half-written data and corrupted metadata. Recovery could take hours of fsck scanning.

The Solution: ext4's journal acts like a transaction log. Before making any changes, ext4 writes them to the journal first. If the system crashes, it simply replays the journal on boot—recovery in seconds, not hours!

ext4 Journaling Modes

Journaling Process Visualization

Idle
Write to Journal
Write Data Blocks
Commit Transaction
Checkpoint
Complete
Journal Log
Page Cache
Dirty Pages: 0/16
Storage Device
Journal Area
Data Blocks

Crash Recovery with Journaling

Without Journaling
Full filesystem check (fsck) required
Can take hours on large filesystems
Possible data loss or corruption
With ext4 Journaling
Replay journal on mount (~seconds)
Guaranteed filesystem consistency
Minimal to no data loss

Journal Modes

  • journal: Both data & metadata journaled (safest, slowest)
  • ordered (default): Metadata journaled, data written first (balanced)
  • writeback: Only metadata journaled (fastest, riskier)
sudo tune2fs -o journal_data /dev/sda1 # Full journaling

2. Extents

ext3: Tracks individual blocks (25,600 entries for 100MB file) ext4: Uses extents for contiguous blocks (1 entry for 100MB file)

Benefits: Less metadata, better large file performance, reduced fragmentation

3. Delayed Allocation

Delays block allocation until flush → better contiguous allocation, reduced fragmentation

4. Limits

  • Max file: 16 TiB | Max volume: 1 EiB | Filename: 255 bytes

ext4 Architecture

Block Groups: The Building Blocks of ext4

The Challenge: How do you organize billions of blocks efficiently? How do you enable parallel operations? How do you survive disk corruption?

The Solution: ext4 divides the entire filesystem into self-contained units called Block Groups. Each group is like a mini-filesystem with its own metadata and data blocks. This brilliant design enables parallelism, fault isolation, and efficient disk usage.

Explore how ext4 organizes its block groups and watch file operations in action:

ext4 Block Groups Structure

BG 0
Used45%
BG 1
Used62%
BG 2
Used38%
BG 3
Used71%
BG 4
Used25%
BG 5
Used89%
BG 6
Used54%
BG 7
Used41%

Block Group 0 Structure

Superblock1%
Group Descriptors1%
Block Bitmap1%
Inode Bitmap1%
Inode Table8%
Data Blocks88%

Key Features

Redundant Superblocks
Backup copies in groups 0, 1, 3^n, 5^n, 7^n for recovery
Flex Block Groups
Groups metadata together for better locality (typically 16 groups)
Locality Optimization
Keeps related files in same block group for faster access
Inode Allocation
Each group has its own inode table for parallel operations
128 MB
Block Group Size
32,768
Blocks per Group
8,192
Inodes per Group
4 KB
Default Block Size

Why Block Groups Matter

Parallelism
Multiple processes can allocate from different groups simultaneously
Fault Isolation
Corruption in one group doesn't affect others
Reduced Seeking
Related files stay physically close on disk
Efficient fsck
Can check groups independently for faster recovery

Understanding the Structure

Each block group contains:

  1. Superblock (Group 0, 1, and powers of 3, 5, 7): Critical filesystem metadata
  2. Group Descriptors: Information about all block groups
  3. Block Bitmap: Tracks free/used data blocks (1 bit per block)
  4. Inode Bitmap: Tracks free/used inodes (1 bit per inode)
  5. Inode Table: Actual inode structures
  6. Data Blocks: Where your actual file content lives
# View block group information sudo dumpe2fs /dev/sda1 | head -50 # See block group layout sudo debugfs /dev/sda1 debugfs: stats # Shows groups, free blocks, free inodes, directories

Flex Block Groups

ext4 groups multiple block groups together:

# Check flex_bg setting sudo dumpe2fs /dev/sda1 | grep -i flex # Flex block group size: 16 # Benefits: # - Larger contiguous free space # - Better locality for metadata # - Improved performance

Creating and Managing ext4

Creating ext4 Filesystem

# Basic creation sudo mkfs.ext4 /dev/sdb1 # With options sudo mkfs.ext4 -L "MyData" \ # Label -m 1 \ # 1% reserved blocks -O extent,flex_bg \ # Enable features -E stride=32,stripe-width=64 \ # RAID optimization /dev/sdb1 # For SSDs sudo mkfs.ext4 -O extent,flex_bg,uninit_bg \ -E discard \ # Enable TRIM /dev/sdb1

Tuning ext4

# View current settings sudo tune2fs -l /dev/sdb1 # Change reserved block percentage (default 5%) sudo tune2fs -m 1 /dev/sdb1 # Set maximum mount count before fsck sudo tune2fs -c 50 /dev/sdb1 # Set check interval (days) sudo tune2fs -i 180 /dev/sdb1 # Enable/disable features sudo tune2fs -O has_journal /dev/sdb1 # Enable journaling sudo tune2fs -O ^has_journal /dev/sdb1 # Disable journaling sudo tune2fs -O extent /dev/sdb1 # Enable extents # Set label sudo tune2fs -L "BackupDrive" /dev/sdb1

Mount Options

# Performance mount -o noatime,nodiratime /dev/sdb1 /mnt # Skip access time updates # SSDs mount -o discard /dev/sdb1 /mnt # Enable TRIM # Or: sudo fstrim -v / # Error handling mount -o errors=remount-ro /dev/sdb1 /mnt

Performance Optimization

# Directory indexing (many files) tune2fs -O dir_index /dev/sdb1 # Increase journal size (databases) tune2fs -J size=400 /dev/sdb1

Maintenance

# Check filesystem (unmounted) sudo e2fsck -f /dev/sdb1 # Resize sudo resize2fs /dev/sdb1 100G # Can be online for growth # Defragment sudo e4defrag /dev/sdb1 # Restore from backup superblock sudo e2fsck -b 32768 /dev/sdb1

ext4 Limitations and Considerations

Limitations

  • No built-in snapshots (unlike Btrfs/ZFS)
  • No built-in compression (unlike Btrfs/ZFS)
  • No built-in RAID (use mdadm/LVM instead)
  • Limited to 4 billion files per filesystem
  • No data checksums (can't detect silent corruption)

When to Use ext4

Perfect for:

  • Root filesystem
  • General purpose storage
  • Production servers (proven reliability)
  • When you need stability over features

Consider alternatives for:

  • Large storage pools (→ ZFS)
  • Need snapshots (→ Btrfs/ZFS)
  • Need compression (→ Btrfs/ZFS)
  • Cross-platform (→ exFAT/NTFS)

ext4 vs Others

Featureext4XFSBtrfsZFS
Maturity★★★★★★★★★★★★★★★★★★
Performance★★★★★★★★★★★★★★★
Features★★★★★★★★★★★★★★★★
Simplicity★★★★★★★★★★★

Advanced Features

Inline Data: Small files stored in inode (faster, saves space) Metadata Checksums: Detect corruption (tune2fs -O metadata_csum) Lazy Init: Faster filesystem creation with background initialization

Monitoring & Recovery

# View statistics cat /sys/fs/ext4/sdb1/lifetime_write_kbytes # Recover deleted files sudo extundelete /dev/sdb1 --restore-all # Fix corruption sudo e2fsck -y /dev/sdb1

Best Practices

  1. Use appropriate journal mode (balance safety vs performance)
  2. Keep 10-20% free space for performance
  3. Run e2fsck periodically
  4. Use UUIDs instead of device names
  5. Regular backups - no filesystem replaces backups

ext4 remains the go-to filesystem because it perfectly balances features, performance, and reliability. While it lacks advanced features of Btrfs or ZFS, its simplicity is often its strength. For most use cases, ext4 provides everything you need with minimal complexity.

If you found this explanation helpful, consider sharing it with others.

Mastodon