Btrfs: Modern Copy-on-Write Filesystem
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
Original File State
File contains blocks A, B, C, D at their original locations
Storage Blocks
Metadata Trees
Why Copy-on-Write is Brilliant
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
Feature | Btrfs | ext4 | XFS | ZFS |
---|---|---|---|---|
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.