Btrfs Snapshot ve Alt Birim Yönetimi

Sistem yöneticiliğinde en çok pişman olduğumuz an, bir şeylerin bozulduğu ama yedeğin olmadığı o kritik andır. Btrfs’in snapshot özelliği tam da bu sorunu çözmek için tasarlanmış olsa da pek çok sysadmin hâlâ bu güçlü aracı tam anlamıyla kullanmıyor. Bu yazıda Btrfs snapshot’larını ve alt birim (subvolume) yönetimini gerçek dünya senaryolarıyla ele alacağız.

Btrfs ve Alt Birim Mantığını Anlamak

Btrfs (B-tree File System), Linux dünyasında modern depolama ihtiyaçlarını karşılamak için geliştirilmiş bir dosya sistemidir. Geleneksel ext4’ten temel farkı, dosya sistemi düzeyinde snapshot, şeffaf sıkıştırma, RAID desteği ve alt birim yönetimi sunmasıdır.

Alt birim (subvolume), Btrfs içinde bağımsız olarak bağlanabilen (mount edilebilen), kendi namespace’ine sahip bir dosya sistemi ağacıdır. Bir diski birden fazla partition’a bölmek yerine, tek bir Btrfs dosya sistemi içinde birden fazla alt birim oluşturabilirsiniz. Bu yaklaşım hem esneklik hem de yönetim kolaylığı sağlar.

Snapshot ise bir alt birimin belirli bir andaki durumunu kayıt altına alan, copy-on-write (CoW) mekanizmasıyla çalışan özel bir alt birimdir. Snapshot alındığı anda disk alanı tüketmez; sadece değişen bloklar için yeni alan kullanır. Bu, hem hızlı hem de verimli bir yedekleme mekanizması sunar.

Gerekli Araçların Kurulumu

Btrfs yönetimi için btrfs-progs paketine ihtiyacınız var. Dağıtımınıza göre kurulum:

# Debian/Ubuntu
sudo apt update && sudo apt install btrfs-progs

# RHEL/CentOS/Fedora
sudo dnf install btrfs-progs

# Arch Linux
sudo pacman -S btrfs-progs

Kurulumdan sonra mevcut Btrfs dosya sistemlerini kontrol edin:

# Sistemdeki tüm Btrfs dosya sistemlerini listele
sudo btrfs filesystem show

# Belirli bir bağlama noktasının durumunu gör
sudo btrfs filesystem df /

Alt Birim Oluşturma ve Yönetme

Temel Alt Birim İşlemleri

Yeni bir alt birim oluşturmak oldukça basittir. Önce Btrfs dosya sisteminizin bağlı olduğu yere gidin:

# Btrfs kök birimini geçici olarak bağla
sudo mount /dev/sda1 /mnt/btrfs-root

# Alt birimler oluştur
sudo btrfs subvolume create /mnt/btrfs-root/@
sudo btrfs subvolume create /mnt/btrfs-root/@home
sudo btrfs subvolume create /mnt/btrfs-root/@var
sudo btrfs subvolume create /mnt/btrfs-root/@snapshots

# Oluşturulan alt birimleri listele
sudo btrfs subvolume list /mnt/btrfs-root

Yaygın kullanılan düzen şudur: @ ana sistem için, @home kullanıcı dosyaları için, @var log ve geçici dosyalar için ayrılır. Bu ayrımın en büyük avantajı, /var altında dolup taşan logların ana sistemi etkilememesidir.

/etc/fstab dosyasını bu yapıya göre düzenlemek için:

# /etc/fstab örneği
UUID=xxxx-xxxx  /         btrfs  defaults,subvol=@,compress=zstd,noatime  0 0
UUID=xxxx-xxxx  /home     btrfs  defaults,subvol=@home,compress=zstd,noatime  0 0
UUID=xxxx-xxxx  /var      btrfs  defaults,subvol=@var,noatime  0 0
UUID=xxxx-xxxx  /.snapshots  btrfs  defaults,subvol=@snapshots,noatime  0 0

compress=zstd seçeneği, disk kullanımını önemli ölçüde azaltırken performans kaybı minimumdur. noatime ise her dosya okumasında erişim zamanını güncellemez, bu da I/O yükünü düşürür.

Alt Birim Silme

Bir alt birimi silmeden önce içindeki snapshot’ları temizlemeniz gerekir:

# Alt birimi sil
sudo btrfs subvolume delete /mnt/btrfs-root/@eski-birim

# Belirli bir ID ile silme
sudo btrfs subvolume delete --subvolid 256 /mnt/btrfs-root

Snapshot Alma ve Yönetme

Manuel Snapshot

Snapshot almanın en temel hali:

# Salt okunur snapshot al (yedekleme için ideal)
sudo btrfs subvolume snapshot -r / /.snapshots/root-$(date +%Y%m%d-%H%M%S)

# Yazılabilir snapshot al (test ortamı için ideal)
sudo btrfs subvolume snapshot /home /.snapshots/home-$(date +%Y%m%d-%H%M%S)

Salt okunur (-r) snapshot’lar yedekleme amaçlı kullanım için tercih edilir çünkü yanlışlıkla değiştirilemezler. Yazılabilir snapshot’lar ise “şu anki sistemi kopyalayıp test edeyim” senaryolarında işe yarar.

Otomatik Snapshot Script’i

Gerçek dünyada manuel snapshot almak pratik değildir. İşte basit ama işlevsel bir otomatik snapshot scripti:

#!/bin/bash
# /usr/local/bin/btrfs-snapshot.sh

SUBVOLUME="/"
SNAPSHOT_DIR="/.snapshots"
SNAPSHOT_NAME="root-$(date +%Y%m%d-%H%M%S)"
MAX_SNAPSHOTS=10

# Snapshot al
btrfs subvolume snapshot -r "$SUBVOLUME" "$SNAPSHOT_DIR/$SNAPSHOT_NAME"

if [ $? -eq 0 ]; then
    echo "Snapshot alındı: $SNAPSHOT_DIR/$SNAPSHOT_NAME"
else
    echo "HATA: Snapshot alınamadı!" >&2
    exit 1
fi

# Eski snapshot'ları temizle
SNAPSHOT_COUNT=$(btrfs subvolume list "$SNAPSHOT_DIR" | grep "root-" | wc -l)

if [ "$SNAPSHOT_COUNT" -gt "$MAX_SNAPSHOTS" ]; then
    OLDEST=$(btrfs subvolume list "$SNAPSHOT_DIR" | grep "root-" | sort -k9 | head -1 | awk '{print $NF}')
    btrfs subvolume delete "$SNAPSHOT_DIR/$OLDEST"
    echo "Eski snapshot silindi: $OLDEST"
fi

Bu scripti crontab ile günde birkaç kez çalıştırabilirsiniz:

# crontab -e ile ekle
# Her gün sabah 6'da snapshot al
0 6 * * * /usr/local/bin/btrfs-snapshot.sh >> /var/log/btrfs-snapshot.log 2>&1

# Her 4 saatte bir snapshot al
0 */4 * * * /usr/local/bin/btrfs-snapshot.sh >> /var/log/btrfs-snapshot.log 2>&1

Snapper ile Profesyonel Snapshot Yönetimi

Manuel scriptler yerine Snapper kullanmak çok daha kapsamlı bir yönetim sunar. Snapper, openSUSE ekibi tarafından geliştirilmiş, Btrfs snapshot’larını otomatik olarak yöneten bir araçtır.

# Snapper kurulumu
sudo apt install snapper  # Debian/Ubuntu
sudo dnf install snapper  # Fedora

# Root için snapper konfigürasyonu oluştur
sudo snapper -c root create-config /

# Home için ayrı konfigürasyon
sudo snapper -c home create-config /home

# Konfigürasyonları listele
sudo snapper list-configs

Snapper konfigürasyon dosyası /etc/snapper/configs/root içinde bulunur. Temel parametreler:

  • TIMELINE_CREATE: Zaman çizelgesi snapshot’larını etkinleştirir (yes/no)
  • TIMELINE_LIMIT_HOURLY: Saatlik snapshot saklama limiti
  • TIMELINE_LIMIT_DAILY: Günlük snapshot saklama limiti
  • TIMELINE_LIMIT_WEEKLY: Haftalık snapshot saklama limiti
  • TIMELINE_LIMIT_MONTHLY: Aylık snapshot saklama limiti
  • NUMBER_LIMIT: Toplam snapshot sayısı limiti

Konfigürasyonu düzenleyin:

sudo nano /etc/snapper/configs/root

# Şu değerleri ayarlayın:
TIMELINE_LIMIT_HOURLY="5"
TIMELINE_LIMIT_DAILY="7"
TIMELINE_LIMIT_WEEKLY="4"
TIMELINE_LIMIT_MONTHLY="6"

Snapper ile temel işlemler:

# Manuel snapshot al
sudo snapper -c root create --description "Paket güncellemesi öncesi"

# Snapshot listesini gör
sudo snapper -c root list

# İki snapshot arasındaki farkı gör
sudo snapper -c root diff 3..5

# Belirli dosyaların değişimini incele
sudo snapper -c root status 3..5

Gerçek Dünya Senaryosu: Sistem Geri Yükleme

Bir gün apt upgrade sonrası sistem ayağa kalkmadı. Klasik senaryo. Btrfs snapshot’ları sayesinde bu durumdan çıkmak mümkün:

Canlı Sistemde Geri Yükleme

Sistem ayaktaysa ve sadece belirli dosyaları geri yüklemek istiyorsanız:

# Snapshot listesini görüntüle
sudo snapper -c root list

# Belirli bir dosyayı eski snapshot'tan geri yükle
sudo snapper -c root undochange 15..0 /etc/nginx/nginx.conf

# Birden fazla dosyayı geri yükle
sudo snapper -c root undochange 15..0 /etc/nginx/ /etc/php/

Tam Sistem Geri Yüklemesi (Root Rollback)

Sistem boot etmiyorsa, live USB ile açıp şu adımları izleyin:

# Live sistemden Btrfs bölümünü bağla
sudo mount /dev/sda1 /mnt

# Bozuk @ alt birimini yedekle
sudo mv /mnt/@ /mnt/@-broken-$(date +%Y%m%d)

# Çalışan son snapshot'ı yeni @ olarak ayarla
# Snapshot ID'sini btrfs subvolume list ile öğrenin
sudo btrfs subvolume snapshot /mnt/@snapshots/root-20241125-060000 /mnt/@

# Snapshot'ı yazılabilir yapın (salt okunursa)
sudo btrfs property set /mnt/@ ro false

# Yeniden başlat
sudo reboot

Bu işlem sonrası sistem, snapshot alındığı andaki duruma döner. Bozuk @ alt birimini daha sonra inceleyip silebilirsiniz.

Btrfs Send/Receive ile Uzak Yedekleme

Snapshot’ları başka bir diske veya uzak sunucuya göndermek için btrfs send ve btrfs receive kullanılır. Bu, gerçek anlamda tam yedeğin alındığı yöntemdir.

# İlk tam yedek gönder
sudo btrfs send /.snapshots/root-20241125-060000 | 
    sudo btrfs receive /backup/snapshots/

# Artımlı (incremental) yedek gönder
# Önceki snapshot baz alınır, sadece fark gönderilir
sudo btrfs send -p /.snapshots/root-20241125-060000 
    /.snapshots/root-20241126-060000 | 
    sudo btrfs receive /backup/snapshots/

Uzak sunucuya SSH üzerinden gönderim:

# Uzak sunucuya SSH ile gönder
sudo btrfs send /.snapshots/root-20241125-060000 | 
    ssh backup-server "sudo btrfs receive /backup/snapshots/"

# Artımlı yedek uzak sunucuya
sudo btrfs send -p /.snapshots/root-20241125-060000 
    /.snapshots/root-20241126-060000 | 
    ssh backup-server "sudo btrfs receive /backup/snapshots/"

Artımlı yedeklemenin gücünü küçümsemeyin. İlk tam yedek 20GB ise, sonraki günlük artımlı yedekler yalnızca değişen blokları gönderir ve bu genellikle birkaç yüz MB’ı geçmez.

Disk Kullanımını İzleme ve Yönetme

Snapshot’lar zamanla disk dolmasına yol açabilir. Durumu takip etmek önemlidir:

# Genel disk kullanımı
sudo btrfs filesystem df /

# Detaylı kullanım istatistikleri
sudo btrfs filesystem usage /

# Her snapshot'ın boyutunu yaklaşık görmek için
sudo btrfs subvolume list -s /

# Quota (kota) etkinleştir ve snapshot boyutlarını gör
sudo btrfs quota enable /
sudo btrfs qgroup show /

Disk dolmaya başladığında önce eski snapshot’ları temizleyin:

# Belirli bir snapshot'ı sil
sudo btrfs subvolume delete /.snapshots/root-20241101-060000

# Btrfs balance çalıştır (disk alanını optimize et)
sudo btrfs balance start -dusage=50 /

# Scrub ile dosya sistemi bütünlüğünü kontrol et
sudo btrfs scrub start /
sudo btrfs scrub status /

balance komutu, disk bloklarını yeniden düzenler ve boş alanı birleştirir. Büyük dosya sistemlerinde uzun sürebilir, bu yüzden yoğun olmayan saatlerde çalıştırın.

Snapper ve Pacman/APT Entegrasyonu

En akıllıca kullanım, paket yöneticisiyle entegrasyon kurmaktır. Böylece her paket güncellemesi öncesi ve sonrası otomatik snapshot alınır.

Arch Linux üzerinde snap-pac paketiyle bu entegrasyon otomatik gelir:

sudo pacman -S snap-pac

# Artık her pacman işleminde otomatik snapshot alınır
# Test edelim:
sudo pacman -Syu

# Öncesi ve sonrası snapshot'ları gör
sudo snapper list

Debian/Ubuntu sistemlerde apt-btrfs-snapshot aracı benzer işlevi görür:

sudo apt install apt-btrfs-snapshot

# Konfigürasyonu etkinleştir
sudo apt-btrfs-snapshot supported

# Artık her apt işlemi otomatik snapshot alır
sudo apt upgrade
sudo snapper list

Yaygın Sorunlar ve Çözümleri

“No space left on device” Hatası

Btrfs bazen diskte yer olmasına rağmen bu hatayı verebilir. Bu, metadata alanının dolmasından kaynaklanır:

# Metadata kullanımını kontrol et
sudo btrfs filesystem df /

# Balance çalıştır
sudo btrfs balance start -musage=50 /

# Acil durum: bazı snapshot'ları sil
sudo snapper -c root list
sudo snapper -c root delete 1-10

Salt Okunur Snapshot’ı Yazılabilir Yapma

# Snapshot'ın mevcut özelliğini kontrol et
sudo btrfs property get -ts /.snapshots/root-20241125-060000

# Yazılabilir yap
sudo btrfs property set -ts /.snapshots/root-20241125-060000 ro false

Bozuk Dosya Sistemi Onarımı

# Btrfs check (sadece unmount edilmiş sistemde)
sudo btrfs check /dev/sda1

# Onarım modunda çalıştır (dikkatli kullanın)
sudo btrfs check --repair /dev/sda1

# Scrub ile veri bütünlüğü kontrolü (canlı sistemde)
sudo btrfs scrub start -B /

Performans İpuçları

Btrfs’i verimli kullanmak için bazı mount seçenekleri kritik önem taşır:

  • noatime: Dosya erişim zamanını güncellemez, I/O yükünü düşürür
  • compress=zstd:3: Zstd algoritmasıyla seviye 3 sıkıştırma, iyi denge sağlar
  • space_cache=v2: Boş alan cache’ini optimize eder
  • autodefrag: Küçük rastgele yazmaları otomatik birleştirir, HDD’lerde faydalıdır
  • ssd: SSD’lere özel optimizasyonları etkinleştirir, modern kernellerde otomatik algılanır

Log ve veritabanı dizinleri için CoW’u devre dışı bırakmak performansı artırır:

# PostgreSQL veri dizini için CoW kapat
sudo chattr +C /var/lib/postgresql

# Yeni oluşturulan dizin için
sudo mkdir /var/lib/mysql-data
sudo chattr +C /var/lib/mysql-data

Sonuç

Btrfs snapshot ve alt birim yönetimi, Linux sistemlerinde veri güvenliğini ve yönetim esnekliğini ciddi ölçüde artırır. Sadece birkaç komutla günlerce uğraşacak bir sistem sorununu dakikalar içinde çözebilirsiniz.

Önerilen minimum kurulumu şöyle özetleyebiliriz: Alt birimleri anlamlı şekilde ayırın (@, @home, @var), Snapper ile otomatik snapshot alın, günlük snapshot’larınızı btrfs send/receive ile uzak bir hedefe gönderin ve disk kullanımını düzenli takip edin.

Unutmayın, en iyi yedek test edilmiş yedektir. Ayda en az bir kez snapshot geri yükleme pratiği yapın. Gerçekten ihtiyaç duyduğunuz anda “acaba çalışır mı?” sorusunu sormak istemezsiniz.

Btrfs hâlâ aktif gelişim altında olan bir dosya sistemidir. RAID 5/6 desteği gibi bazı özellikler üretim ortamı için henüz tam olarak olgunlaşmamıştır. Ancak snapshot ve alt birim yönetimi özellikleri son derece stabil ve üretim ortamında güvenle kullanılabilir durumdadır.

Yorum yapın