Büyük bir klasörü yedeklemek istiyorsun, tar komutuyla sıkıştırıyorsun, sonra bakıyorsun ki ortaya 80 GB’lık dev bir dosya çıkmış. O dosyayı harici diske kopyalamaya çalışıyorsun, yarıda kopuyor. USB’ye atmak istiyorsun, FAT32 sınırına takılıyorsun. E-posta ile göndermek? Unut gitsin. İşte bu yüzden büyük arşivleri parçalara bölmek, sysadmin’in olmazsa olmaz silahlarından biridir.
Bu yazıda tar komutuyla büyük klasörleri nasıl parçalı yedekleyeceğini, bu parçaları nasıl bir araya getireceğini ve gerçek hayatta karşılaşabileceğin senaryolara nasıl hazırlıklı olacağını anlatacağım.
Neden Parçalı Yedekleme?
Diyelim ki /var/backups/uploads dizininde 120 GB’lık kullanıcı yükleme dosyan var. Bunu tek bir tar.gz dosyasına sıkıştırsan ne olur?
- FAT32 formatındaki bir USB belleğe kopyalayamazsın (4 GB dosya boyutu sınırı var)
- Bazı bulut depolama hizmetleri tek dosya için boyut sınırı koyuyor
- Aktarım sırasında bir hata olursa tüm dosyayı yeniden göndermen gerekiyor
- Birden fazla sunucuya paralel aktarım yapamazsın
Parçalı yedekleme ile tüm bu sorunların önüne geçersin. 120 GB’lık arşivi 10’ar GB’lık 12 parçaya böldüğünde hem taşıması hem de yönetimi çok daha kolay hale gelir.
Temel Yöntem: split Komutuyla Birlikte Kullanım
En klasik ve güvenilir yöntem tar ile split komutunu boru hattıyla birleştirmektir. Önce tar arşivi oluşturur, çıktıyı doğrudan split komutuna iletirsin.
tar -czf - /var/backups/uploads | split -b 2G - yedek_parca_
Bu komutu biraz açalım:
- -czf –: Arşivi oluştur (
c), gzip ile sıkıştır (z), dosyaya yaz (f), ama dosya adı olarak-kullanarak stdout’a yaz - /var/backups/uploads: Yedeklenecek dizin
- |: Boru hattı,
tarçıktısınısplitkomutuna aktar - -b 2G: Her parçayı 2 GB olarak böl
- –: Girdi olarak stdin’i kullan
- yedek_parca_: Oluşturulacak dosyaların ön eki
Bu komut çalıştıktan sonra bulunduğun dizinde şöyle dosyalar göreceksin:
yedek_parca_aa
yedek_parca_ab
yedek_parca_ac
yedek_parca_ad
...
Parçaları Geri Birleştirme ve Açma
Parçaları yeniden bir araya getirip açmak için cat ve tar kombinasyonunu kullanırsın:
cat yedek_parca_* | tar -xzf -
Ya da daha kontrollü bir şekilde önce birleştirip sonra açabilirsin:
cat yedek_parca_* > yedek_tam.tar.gz
tar -xzf yedek_tam.tar.gz
İkinci yöntem disk alanı tüketir ama bir şeyler ters giderse ne olduğunu daha kolay anlarsın. Disk alanın yeterliyse ve hata ayıklama ihtimali varsa bu yöntemi tercih et.
Parça Boyutunu Belirlemek
split komutu farklı boyut birimlerini destekler:
- -b 500M: 500 megabayt
- -b 2G: 2 gigabayt
- -b 1T: 1 terabayt (çok büyük sistemler için)
- -b 4096: 4096 bayt (küçük test için)
FAT32’ye yazacaksan parça boyutunu 3.9G veya daha küçük tutmalısın. 4G tam sınır olduğundan dosya sistemi meta verisi için biraz pay bırakmak akıllıca olur:
tar -czf - /home/kullanici/proje | split -b 3900M - proje_yedek_
Gerçek Dünya Senaryosu 1: Veritabanı Yedeklerini Taşıma
Diyelim ki bir MySQL dump aldın ve bu dump 15 GB. Bunu başka bir sunucuya scp ile göndermen gerekiyor ama bağlantı kararsız, kopabiliyor. Parçalara bölersen her parça daha kısa sürede transfer edilir ve bir parça bozulursa sadece onu tekrar gönderirsin.
# Dump al ve parçalara böl
mysqldump -u root -p --all-databases | gzip | split -b 1G - db_yedek_$(date +%Y%m%d)_
# Parçaları uzak sunucuya gönder
for f in db_yedek_*; do
scp $f [email protected]:/opt/yedekler/
echo "$f gonderildi"
done
Uzak sunucuda geri yükleme:
cat db_yedek_20241215_* | gunzip | mysql -u root -p
Gerçek Dünya Senaryosu 2: Web Sunucusu Yedekleme Scripti
Cron job olarak çalışacak bir yedekleme scripti yazalım. Bu script /var/www dizinini alıp tarihe göre adlandırılmış parçalara böler, eski yedekleri temizler ve işlem sonunda bir log kaydı bırakır.
#!/bin/bash
KAYNAK="/var/www"
HEDEF="/mnt/backup_disk/www_yedekler"
TARIH=$(date +%Y%m%d_%H%M%S)
PARCA_BOYUT="4G"
LOG_DOSYA="/var/log/yedekleme.log"
echo "[$TARIH] Yedekleme basliyor..." >> $LOG_DOSYA
# Hedef dizin yoksa oluştur
mkdir -p "$HEDEF/$TARIH"
# Yedek al ve parçalara böl
tar -czf - "$KAYNAK" | split -b "$PARCA_BOYUT" - "$HEDEF/$TARIH/www_yedek_"
if [ $? -eq 0 ]; then
echo "[$TARIH] Yedekleme basarili." >> $LOG_DOSYA
else
echo "[$TARIH] HATA: Yedekleme basarisiz!" >> $LOG_DOSYA
exit 1
fi
# 30 günden eski yedekleri temizle
find "$HEDEF" -maxdepth 1 -type d -mtime +30 -exec rm -rf {} ;
echo "[$TARIH] Eski yedekler temizlendi." >> $LOG_DOSYA
Bu scripti /etc/cron.d/www_yedekleme dosyasına ekleyerek her gece otomatik çalıştırabilirsin:
0 2 * * * root /opt/scripts/www_yedekle.sh
Bütünlük Kontrolü: MD5 veya SHA256 Kullanımı
Parçalı yedek aktarırken bir parçanın bozulup bozulmadığını kontrol etmek kritik öneme sahip. Bunun için checksum kullanırsın.
# Parçaları oluştururken checksum üret
tar -czf - /opt/uygulama | split -b 2G - uygulama_yedek_
md5sum uygulama_yedek_* > uygulama_yedek_md5sums.txt
Hedef sistemde kontrol:
# Checksum dosyasını da kopyaladığını varsayarak
md5sum -c uygulama_yedek_md5sums.txt
Her şey yolundaysa şöyle bir çıktı alırsın:
uygulama_yedek_aa: OK
uygulama_yedek_ab: OK
uygulama_yedek_ac: OK
Bir parça bozuksa FAILED mesajı görürsün ve sadece o parçayı yeniden alman gerekir.
SHA256 kullanmak istersen:
sha256sum uygulama_yedek_* > uygulama_yedek_sha256.txt
sha256sum -c uygulama_yedek_sha256.txt
İlerleme Durumunu Görme
Büyük bir dizini yedeklerken işlemin ne kadar süreceğini merak edersin. pv (pipe viewer) aracı bu durumda imdadına yetişir:
# pv kurulumu (Debian/Ubuntu)
apt install pv
# pv kurulumu (RHEL/CentOS)
yum install pv
Kullanımı:
tar -czf - /var/backups/uploads | pv | split -b 2G - yedek_parca_
Bu komut sana gerçek zamanlı aktarım hızı, geçen süre ve işlenen veri miktarını gösterir. Eğer dizinin toplam boyutunu biliyorsan daha detaylı ilerleme çubuğu elde edebilirsin:
BOYUT=$(du -sb /var/backups/uploads | awk '{print $1}')
tar -czf - /var/backups/uploads | pv -s $BOYUT | split -b 2G - yedek_parca_
Parçaları Numaralandırma
Varsayılan olarak split aa, ab, ac şeklinde harf tabanlı sonek kullanır. Büyük dosyalar için sayısal sonek daha okunabilir ve sıralama problemlerini önler:
# Sayısal sonek kullan, 3 haneli numara
tar -czf - /home | split -b 2G -d -a 3 - home_yedek_
# Sonuç: home_yedek_000, home_yedek_001, home_yedek_002...
- -d: Rakamsal sonek kullan
- -a 3: 3 karakterlik sonek oluştur (000’dan başlar)
Bu yöntemle 999 parçaya kadar sorunsuz çalışırsın. Daha fazlası gerekirse -a 4 ile 9999 parçaya çıkabilirsin.
Gerçek Dünya Senaryosu 3: Şifreli Parçalı Yedek
Yedekler hassas veriler içeriyorsa şifreleme şart. openssl ile hem sıkıştırma hem şifreleme hem bölme işlemini tek satırda yapabilirsin:
# Şifreli yedek oluştur
tar -czf - /home/kullanici/gizli_veriler |
openssl enc -aes-256-cbc -salt -pbkdf2 -k "guclu_parola_buraya" |
split -b 1G - gizli_yedek_enc_
Geri açma işlemi:
cat gizli_yedek_enc_* |
openssl enc -d -aes-256-cbc -pbkdf2 -k "guclu_parola_buraya" |
tar -xzf -
Parolayı komut satırına yazmak yerine dosyadan okuması daha güvenli:
# Parola dosyası oluştur (sadece root okuyabilsin)
echo "guclu_parola_buraya" > /root/.yedek_parola
chmod 600 /root/.yedek_parola
# Parola dosyasından oku
tar -czf - /home/kullanici/gizli_veriler |
openssl enc -aes-256-cbc -salt -pbkdf2 -pass file:/root/.yedek_parola |
split -b 1G - gizli_yedek_enc_
tar’ın Kendi Bölme Özelliği
tar GNU sürümünde --multi-volume seçeneğiyle kendi parçalama mekanizmasına sahiptir. Ancak bu yöntem split‘e göre daha az esnektir ve bazı senaryolarda kullanışsız olabilir. Yine de bilmekte fayda var:
# Çok birimli arşiv oluştur
tar -czf yedek.tar.gz --multi-volume --tape-length=2G /var/www
Bu yöntem interaktif olarak çalışır ve senden her birim için onay ister. Otomasyona uygun değil, manuel yedeklemelerde tercih edilebilir.
Parçaları Uzak Sunucuya Doğrudan Gönderme
Disk alanın yoksa veya aracı dosya oluşturmak istemiyorsan, yedekleri doğrudan uzak sunucuya bölünmüş şekilde gönderebilirsin:
# Yerel tar, uzak split
tar -czf - /var/www | ssh kullanici@uzak-sunucu
"split -b 2G - /opt/yedekler/www_yedek_"
Ya da tam tersi, uzak sunucudan yerel makineye:
ssh kullanici@uzak-sunucu "tar -czf - /var/www" |
split -b 2G - /mnt/yedek_disk/www_yedek_
Bu yöntem özellikle ağ üzerinden büyük sunucu yedeklerini çekmek için çok kullanışlıdır. ssh bağlantısı veriyi otomatik şifreler, ekstra OpenSSL adımına gerek kalmaz.
Hangi Parçanın Hangi Dosyaları İçerdiğini Anlama
Bir parçayı açmadan hangi dosyaları içerdiğini görmek ister misin? Bu biraz karmaşık ama mümkün. Tüm parçaları birleştirip liste almak gerekir:
cat yedek_parca_* | tar -tzf - | head -50
Belirli bir dosyanın hangi parçada olduğunu bulmak split yöntemiyle doğrudan mümkün değil çünkü parçalar ham bayt bazında bölünüyor. Bu yüzden büyük ve kritik arşivler için içerik listesini ayrıca kaydetmek iyi bir pratik:
# Arşiv oluştururken içerik listesi de kaydet
tar -czf - /var/www | tee >(split -b 2G - www_yedek_) |
tar -tzf - > www_yedek_icerik_listesi.txt
Ya da daha basit yaklaşım, önce liste al sonra yedekle:
tar -czf - /var/www | split -b 2G - www_yedek_
tar -tzf - <(cat www_yedek_*) > www_yedek_icerik.txt
Sorun Giderme
“No space left on device” hatası: Hedef diskin dolduğu anlamına gelir. Parça boyutunu küçülterek tekrar dene veya eski dosyaları temizle.
Parçaları birleştirirken “not in gzip format” hatası: Bu genellikle dosyaların yanlış sırada birleştirilmesinden kaynaklanır. cat yedek_parca_ yerine cat $(ls yedek_parca_ | sort) kullan.
“Unexpected EOF in archive” hatası: Son parça eksik olabilir ya da bir parça bozulmuş. MD5 checksumları kontrol et.
# Kaç parça olması gerektiğini hesapla
ls -la yedek_parca_* | wc -l
# Toplam boyutu kontrol et
cat yedek_parca_* | wc -c
Parçaları farklı bir dizinde birleştirme:
# Tam yolu belirterek birleştir
cat /mnt/usb/yedek_parca_* | tar -xzf - -C /home/restore/
- -C /home/restore/: Arşivi bu dizine aç
Hızlı Referans: Sık Kullanılan Komutlar
Günlük işlerde en çok ihtiyaç duyacağın komutları özetleyeyim:
# Temel parçalı yedek (2 GB parçalar)
tar -czf - /dizin | split -b 2G - yedek_
# İlerleme göstergeli (pv gerektirir)
tar -czf - /dizin | pv | split -b 2G - yedek_
# Sayısal sonek ile
tar -czf - /dizin | split -b 2G -d -a 3 - yedek_
# Parçaları birleştirip açma
cat yedek_* | tar -xzf -
# Belli bir dizine açma
cat yedek_* | tar -xzf - -C /hedef/dizin/
# Checksum oluştur
md5sum yedek_* > yedek_md5.txt
# Checksum kontrol et
md5sum -c yedek_md5.txt
# İçerik listesi
cat yedek_* | tar -tzf -
Performans İpuçları
Sıkıştırma hızını artırmak istiyorsan gzip yerine pigz (paralel gzip) kullanabilirsin. Çok çekirdekli sunucularda ciddi hız farkı yaratır:
# pigz kurulumu
apt install pigz
# pigz ile parçalı yedek
tar -cf - /var/www | pigz | split -b 2G - www_yedek_
# Açma
cat www_yedek_* | pigz -d | tar -xf -
Sıkıştırma oranını önemsemiyorsan ve hız öncelikliyse sıkıştırmayı tamamen kaldır:
# Sıkıştırmasız (çok daha hızlı, ama büyük dosyalar)
tar -cf - /var/www | split -b 5G - www_yedek_nosik_
Ağ aktarımı söz konusuysa sıkıştırma her zaman avantajlı. Disk-disk kopyalamada ise sıkıştırma bazen darboğaz oluşturabilir, profil çıkararak karar ver.
Sonuç
Parçalı tar yedekleme, görünürde basit bir ihtiyaçtan doğan ama doğru uygulandığında çok güçlü bir araçtır. FAT32 sınırlarını aşmaktan tutun da ağ üzerinden güvenli ve kontrollü veri transferine, şifreli yedeklerden otomatik cron scriptlerine kadar pek çok senaryo için bu yöntemi kullanabilirsin.
Özetle aklında kalması gereken birkaç temel nokta:
tar -czf - /dizin | split -b 2G - ek_kombinasyonu senin temel silahın- Her yedek setinin yanına mutlaka checksum dosyası bırak
- FAT32 için parça boyutunu 3.9G veya altında tut
- Büyük sunucularda
pigzile paralel sıkıştırma yap - Cron job’larda log kaydı tutmayı ihmal etme
Bu araçları bir kez öğrendiğinde, “dosya çok büyük, ne yapacağım?” diye endişelenmeyi bırakırsın. Her şey küçük, yönetilebilir parçalara indirgeniyor.