Btrfs: Modern Copy-on-Write Filesystem

16 min

Explore Btrfs (B-tree filesystem) - the modern Linux filesystem with built-in snapshots, RAID, compression, and advanced features for data integrity and flexibility.

Best viewed on desktop for optimal interactive experience

Btrfs: Where Your Data Gets Superpowers

Imagine a filesystem that could travel back in time. One that never loses data, even when you accidentally delete something. A filesystem that can detect and fix corruption before you even know it's there. Welcome to Btrfs—where science fiction meets your storage!

Btrfs (B-tree filesystem, pronounced "Butter FS" or "Better FS") isn't just another filesystem—it's a complete rethinking of how we store data. Born at Oracle in 2007 and now community-driven, Btrfs brings enterprise-grade features to everyone.

Think of Btrfs as Linux's Swiss Army knife for storage. While ext4 is your reliable daily driver, Btrfs is the transformer that can morph into whatever you need: a snapshot machine, a RAID array, a compression engine, or all of the above simultaneously!

Key Features

1. Copy-on-Write: The Magic Behind Everything

The Revolution: Traditional filesystems are like writing with a pen—once you overwrite something, it's gone forever. Btrfs is like having an infinite stack of transparent sheets. Every change creates a new layer, and you can always peek back at previous versions.

Watch Copy-on-Write in action—see how Btrfs creates snapshots instantly and preserves your data:

Copy-on-Write (CoW) in Action

1
2
3
4
5

Original File State

File contains blocks A, B, C, D at their original locations

Storage Blocks

A
Addr: 0x1000
Refs: 1
B
Addr: 0x2000
Refs: 1
C
Addr: 0x3000
Refs: 1
D
Addr: 0x4000
Refs: 1

Metadata Trees

Current File
1000
2000
3000
4000

Why Copy-on-Write is Brilliant

Instant Snapshots
Creating snapshots takes milliseconds, not minutes
Space Efficient
Only changed blocks use additional space
Data Protection
Original data never overwritten, always consistent
Time Travel
Access any previous version instantly

Why CoW Changes Everything

Copy-on-Write isn't just a feature—it's the foundation that enables:

  • Instant snapshots (no data copying needed)
  • Atomic transactions (all or nothing writes)
  • Data integrity (old data never corrupted)
  • Time travel (rollback to any snapshot)

2. Subvolumes

Subvolumes are like lightweight filesystems within Btrfs:

# Create subvolume sudo btrfs subvolume create /mnt/data/projects # List subvolumes sudo btrfs subvolume list /mnt # Subvolumes can be mounted independently sudo mount -o subvol=projects /dev/sda1 /mnt/projects # Each subvolume can have different mount options sudo mount -o subvol=databases,nodatasum /dev/sda1 /mnt/db

3. Snapshots

Instant, space-efficient copies of subvolumes:

# Create snapshot sudo btrfs subvolume snapshot /mnt/data /mnt/snapshots/data-$(date +%Y%m%d) # Create read-only snapshot sudo btrfs subvolume snapshot -r /mnt/data /mnt/snapshots/data-backup # List snapshots sudo btrfs subvolume list -s /mnt # Rollback to snapshot sudo btrfs subvolume delete /mnt/data sudo btrfs subvolume snapshot /mnt/snapshots/data-backup /mnt/data

Btrfs Architecture

B-tree Structure

Everything in Btrfs is stored in B-trees:

# B-tree Structure: # Root Tree # | # ┌───────────────┼───────────────┐ # | | | # Extent Tree Chunk Tree Filesystem Tree # | | | # [Extents] [Devices] [Files/Dirs]

Object Types

  • Subvolume: Independent filesystem tree
  • Snapshot: CoW copy of a subvolume
  • Extent: Contiguous data blocks
  • Chunk: Physical device allocation unit
  • Block Group: Collection of chunks

Creating and Managing Btrfs

Creating Btrfs Filesystem

# Single device sudo mkfs.btrfs /dev/sdb1 # Multiple devices (RAID) sudo mkfs.btrfs -d raid1 -m raid1 /dev/sdb1 /dev/sdc1 # With label and options sudo mkfs.btrfs -L "MyData" \ -O compress-force \ # Force compression -O no-holes \ # Efficient sparse files /dev/sdb1 # For SSD with optimizations sudo mkfs.btrfs -O ssd \ -O discard=async \ /dev/sdb1

Mount Options

# Basic mount sudo mount /dev/sdb1 /mnt/btrfs # With compression sudo mount -o compress=zstd:3 /dev/sdb1 /mnt/btrfs # SSD optimizations sudo mount -o ssd,discard=async,noatime /dev/sdb1 /mnt/btrfs # Space cache for performance sudo mount -o space_cache=v2 /dev/sdb1 /mnt/btrfs # Autodefrag for desktop use sudo mount -o autodefrag /dev/sdb1 /mnt/btrfs

Advanced Features

1. Compression

Btrfs supports transparent compression:

# Mount with compression sudo mount -o compress=zstd /dev/sdb1 /mnt # Compression algorithms: # - zlib: Best compression, slowest # - lzo: Fast compression, moderate ratio # - zstd: Best balance (recommended) # Set compression level sudo mount -o compress=zstd:3 /dev/sdb1 /mnt # Level 1-15 # Force compression on all files sudo mount -o compress-force=zstd /dev/sdb1 /mnt # Check compression ratio sudo compsize /mnt/

2. RAID Support

Built-in RAID without mdadm:

# RAID levels: # - raid0: Striping (performance, no redundancy) # - raid1: Mirroring (redundancy) # - raid10: Striped mirrors # - raid5/6: Parity (not production ready!) # Create RAID1 filesystem sudo mkfs.btrfs -d raid1 -m raid1 /dev/sdb /dev/sdc # Add device to existing filesystem sudo btrfs device add /dev/sdd /mnt # Remove device sudo btrfs device delete /dev/sdc /mnt # Balance data across devices sudo btrfs balance start /mnt # Convert RAID level sudo btrfs balance start -dconvert=raid10 -mconvert=raid10 /mnt

3. Deduplication

Remove duplicate data blocks:

# Online deduplication (not recommended for production) # Requires third-party tools like duperemove # Offline deduplication sudo duperemove -dr /mnt/btrfs # Check deduplication savings sudo duperemove -d --hashfile=/tmp/hash.db /mnt/btrfs

4. Scrubbing

Verify data integrity using checksums:

# Start scrub sudo btrfs scrub start /mnt # Check scrub status sudo btrfs scrub status /mnt # Scrub specific device sudo btrfs scrub start /dev/sdb1 # Cancel scrub sudo btrfs scrub cancel /mnt # Schedule regular scrubs (cron) 0 2 * * 0 /usr/bin/btrfs scrub start /mnt

5. Send/Receive

Efficient backup and replication:

# Create initial snapshot sudo btrfs subvolume snapshot -r /mnt/data /mnt/data-snap1 # Send snapshot to another location sudo btrfs send /mnt/data-snap1 | sudo btrfs receive /backup/ # Incremental send (only changes) sudo btrfs subvolume snapshot -r /mnt/data /mnt/data-snap2 sudo btrfs send -p /mnt/data-snap1 /mnt/data-snap2 | \ sudo btrfs receive /backup/ # Send over network sudo btrfs send /mnt/snapshot | ssh remote "sudo btrfs receive /mnt/"

Quota Management

Setting Up Quotas

# Enable quotas sudo btrfs quota enable /mnt # Create quota group sudo btrfs qgroup create 1/0 /mnt # Set limit (10GB) sudo btrfs qgroup limit 10G 1/0 /mnt # Check quota usage sudo btrfs qgroup show /mnt # Disable quotas sudo btrfs quota disable /mnt

Performance Optimization

For SSDs

# Mount options for SSD mount -o ssd,discard=async,compress=zstd,noatime /dev/sdb1 /mnt # Disable CoW for databases (VM images, databases) chattr +C /mnt/databases/ # Note: +C only works on empty files/directories

For HDDs

# Mount options for HDD mount -o compress=zstd,autodefrag,noatime /dev/sdb1 /mnt # Enable space cache mount -o space_cache=v2 /dev/sdb1 /mnt # Optimize for large files mount -o compress=zstd,max_inline=0 /dev/sdb1 /mnt

Database Optimization

# Disable CoW for database files mkdir /mnt/postgres chattr +C /mnt/postgres # Mount subvolume with nodatasum mount -o subvol=databases,nodatasum,nodatacow /dev/sdb1 /mnt/db

Maintenance and Monitoring

Filesystem Usage

# Show filesystem usage sudo btrfs filesystem show /mnt # Detailed usage sudo btrfs filesystem usage /mnt # Device statistics sudo btrfs device stats /mnt # Check free space sudo btrfs filesystem df /mnt

Balance Operations

# Balance filesystem (redistribute data) sudo btrfs balance start /mnt # Balance with filters sudo btrfs balance start -dusage=50 /mnt # Balance chunks <50% full # Monitor balance progress sudo btrfs balance status /mnt # Cancel balance sudo btrfs balance cancel /mnt

Defragmentation

# Defragment file sudo btrfs filesystem defragment /path/to/file # Defragment directory recursively sudo btrfs filesystem defragment -r /mnt/data # Defragment with compression sudo btrfs filesystem defragment -czstd -r /mnt/data # Note: Defragmentation breaks CoW links (increases space usage)

Troubleshooting

Common Issues

1. No Space Left (but df shows space)

# Check metadata usage sudo btrfs filesystem usage /mnt # Balance metadata sudo btrfs balance start -m /mnt # If metadata is full sudo btrfs balance start -dusage=0 /mnt

2. Read-only Filesystem

# Check for errors sudo btrfs check --readonly /dev/sdb1 # Try to clear errors sudo btrfs rescue zero-log /dev/sdb1 # Mount with recovery options mount -o recovery,ro /dev/sdb1 /mnt

3. Corrupted Filesystem

# Check filesystem (unmounted) sudo umount /mnt sudo btrfs check /dev/sdb1 # Repair (use with caution!) sudo btrfs check --repair /dev/sdb1 # Recovery mount options mount -o recovery,usebackuproot /dev/sdb1 /mnt

Recovery Tools

# Restore from backup superblock sudo btrfs rescue super-recover /dev/sdb1 # Find and recover files sudo btrfs restore /dev/sdb1 /recovery/ # Show backup roots sudo btrfs rescue chunk-recover /dev/sdb1

Btrfs vs Other Filesystems

Feature Comparison

FeatureBtrfsext4XFSZFS
CoW
Snapshots
Compression
Checksums
Built-in RAID
Deduplication
Subvolumes
Linux mainline

Performance Characteristics

# Performance Characteristics: # # Sequential Write: # XFS ████████████████████ 100% # ext4 ███████████████████ 95% # Btrfs ████████████████ 80% # ZFS ███████████████ 75% # # Random I/O: # ext4 ████████████████████ 100% # XFS ███████████████████ 95% # Btrfs ███████████████ 75% # ZFS ██████████████ 70% # # Snapshot Performance: # ZFS ████████████████████ 100% # Btrfs ███████████████████ 95% # ext4 N/A # XFS N/A

Best Practices

1. Snapshot Strategy

# Automated snapshots with systemd timer cat > /etc/systemd/system/btrfs-snapshot.service << EOF [Unit] Description=Btrfs snapshot [Service] Type=oneshot ExecStart=/usr/local/bin/btrfs-snapshot.sh EOF cat > /etc/systemd/system/btrfs-snapshot.timer << EOF [Unit] Description=Daily Btrfs snapshot [Timer] OnCalendar=daily Persistent=true [Install] WantedBy=timers.target EOF

2. Backup Strategy

# Regular send/receive backups #!/bin/bash DATE=$(date +%Y%m%d) btrfs subvolume snapshot -r /mnt/data /mnt/snapshots/data-$DATE btrfs send /mnt/snapshots/data-$DATE | \ btrfs receive /backup/snapshots/ # Clean old snapshots btrfs subvolume delete /mnt/snapshots/data-$(date -d '30 days ago' +%Y%m%d)

3. Monitoring Script

#!/bin/bash # Monitor Btrfs health # Check device errors btrfs device stats /mnt | grep -v ' 0$' # Check space usage usage=$(btrfs filesystem df /mnt | grep "Data.*used" | grep -o '[0-9]*\.[0-9]*') if (( $(echo "$usage > 90" | bc -l) )); then echo "Warning: Filesystem usage above 90%" fi # Check scrub status btrfs scrub status /mnt

When to Use Btrfs

✅ Perfect for:

  • Desktop/laptop systems: Snapshots for easy recovery
  • Development environments: Quick rollback capability
  • Container hosts: Efficient storage with deduplication
  • Home NAS: Built-in RAID and data integrity
  • Backup servers: Send/receive for efficient replication

❌ Avoid for:

  • Databases in production: CoW overhead impacts performance
  • RAID 5/6 requirements: Not stable yet
  • Maximum stability needs: Use ext4 or XFS
  • Very large filesystems: ZFS handles scale better

Limitations and Considerations

Current Limitations

  • RAID 5/6: Still considered unstable
  • Deduplication: Only offline, high memory usage
  • Quotas: Performance impact, occasional bugs
  • Large filesystems: Some operations slow with many snapshots
  • fsck: Limited repair capabilities compared to ext4

Hardware Considerations

  • RAM: More demanding than ext4 (1GB minimum recommended)
  • CPU: Compression and checksumming add overhead
  • Storage: CoW can increase space usage with many snapshots

Future Development

Upcoming Features

  • RAID 5/6 stability: Active development
  • Online deduplication: Planned improvements
  • Reflink for files: More efficient file copies
  • Encryption: Native encryption support
  • Better fsck: Enhanced repair capabilities

Migration to Btrfs

From ext4

# In-place conversion (backup first!) sudo umount /dev/sdb1 sudo btrfs-convert /dev/sdb1 # Mount as Btrfs sudo mount /dev/sdb1 /mnt # If successful, delete ext4 backup sudo btrfs subvolume delete /mnt/ext2_saved # If issues, rollback sudo btrfs-convert -r /dev/sdb1

Fresh Migration

# Create new Btrfs filesystem sudo mkfs.btrfs /dev/sdc1 # Mount both sudo mount /dev/sdb1 /mnt/old # ext4 sudo mount /dev/sdc1 /mnt/new # btrfs # Copy with attributes preserved sudo rsync -avxHAX /mnt/old/ /mnt/new/ # Or use btrfs send/receive for Btrfs to Btrfs

Conclusion

Btrfs represents a significant advancement in Linux filesystem technology, bringing features like snapshots, compression, and checksums that were previously only available in proprietary or non-mainline solutions. While it may not match ext4's maturity or XFS's raw performance, its feature set makes it ideal for many use cases, particularly where data integrity and flexibility are priorities.

The CoW design enables powerful features but comes with trade-offs. Understanding these trade-offs helps you decide when Btrfs is the right choice. For desktop users, developers, and home servers, Btrfs offers compelling advantages. For high-performance databases or maximum stability requirements, traditional filesystems may still be preferable.

As Btrfs continues to mature, it's becoming an increasingly attractive option for Linux systems, offering a glimpse of the future of Linux storage management.

← Back to Filesystems Overview | Compare with ZFS →

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

Mastodon