Linux’ta Bozuk Arşivleri Kurtarma Yöntemleri

Bir gece 02:00’de telefon çalıyor ve karşı taraftaki ses “production sunucusundaki yedek arşiv açılmıyor, veriler kayboldu mu?” diye soruyor. Bu senaryoyu yaşadıysanız, bozuk arşivlerle uğraşmanın ne kadar sinir bozucu olduğunu çok iyi biliyorsunuzdur. İyi haber şu: çoğu bozuk arşiv kurtarılabilir. Kötü haber: doğru araçları ve yöntemleri bilmiyorsanız, panikle yapılan yanlış hamleler durumu daha da kötüleştirebilir.

Bu yazıda zip, tar, gzip, bzip2 ve 7z formatlarındaki bozuk arşivleri nasıl kurtarabileceğinizi, hangi araçları kullanmanız gerektiğini ve gerçek dünya senaryolarında bu araçları nasıl uygulayacağınızı anlatacağım.

Arşiv Bozulması Neden Olur?

Önce düşmanı tanıyalım. Arşiv bozulmaları genellikle şu nedenlerden kaynaklanır:

  • Yarıda kesilen transfer: SCP, FTP veya HTTP üzerinden indirilen dosyalar bağlantı kopukluğu nedeniyle tamamlanamamış olabilir
  • Disk hataları: Bad sector’lara sahip disklerde oluşturulan veya depolanan arşivler bozulabilir
  • RAM sorunları: Sıkıştırma işlemi sırasında bellek hatası oluşursa arşiv corrupted çıkabilir
  • Dosya sistemi sorunları: ext4 veya XFS üzerindeki journal sorunları veri tutarsızlığına yol açabilir
  • Güç kesilmesi: Yazma işlemi sırasında gelen ani güç kesintisi
  • İnsan hatası: Arşiv dosyasının üzerine kısmen yazılması, yanlış birleştirme işlemleri

Bozulma seviyesi de önemli: bazı arşivler sadece birkaç byte bozukken açılmayı tamamen reddederken, bazıları kısmi veri içerse de belirli yöntemlerle içeriğine erişilebilir.

Durumu Değerlendirmek: İlk Adımlar

Paniğe kapılmadan önce arşivin gerçekten bozuk olup olmadığını doğrulayın ve ne kadar bozuk olduğunu anlayın.

MD5/SHA Kontrolü

Eğer arşivin orijinal hash değeri elinizde varsa, bütünlük kontrolü yapın:

md5sum yedek_arsiv.tar.gz
sha256sum yedek_arsiv.tar.gz

# Beklenen hash bir dosyada saklıysa
md5sum -c yedek_arsiv.tar.gz.md5
sha256sum -c yedek_arsiv.tar.gz.sha256

Hash değerleri eşleşmiyorsa arşiv kesinlikle bozuktur. Hash yoksa da diğer yöntemlerle devam edebilirsiniz.

Dosya Boyutu ve Başlık Kontrolü

# Dosya boyutunu kontrol edin
ls -lh bozuk_arsiv.zip

# Dosya türünü doğrulayın
file bozuk_arsiv.zip
file bozuk_arsiv.tar.gz

# İlk birkaç byte'ı kontrol edin (magic bytes)
xxd bozuk_arsiv.zip | head -5
xxd bozuk_arsiv.tar.gz | head -5

file komutu “data” veya beklenmedik bir şey döndürüyorsa, dosya başlığı bozulmuş demektir. Bu durumda kurtarma şansı azalır ama imkansız değildir.

ZIP Arşivlerini Kurtarma

ZIP formatı, kurtarma açısından en şanslı format denilebilir. Merkezi dizin (central directory) yapısı sayesinde, bir kısım bozulsa bile diğer dosyalar erişilebilir olabilir.

zip -F ve zip -FF Komutu

Linux’ta zip paketi içinde gelen kurtarma araçları ilk başvuracağınız seçenektir:

# Önce orijinal dosyayı yedekleyin, ASLA orijinal üzerinde çalışmayın
cp bozuk_arsiv.zip bozuk_arsiv.zip.backup

# Hafif onarım denemesi
zip -F bozuk_arsiv.zip --out onarilmis_arsiv.zip

# Daha agresif onarım (merkezi dizin tamamen bozuksa)
zip -FF bozuk_arsiv.zip --out onarilmis_arsiv2.zip

-F: Zip dosyasını tarar ve merkezi dizini yeniden oluşturmaya çalışır. Hafif bozukluklarda işe yarar.

-FF: Yerel başlıkları tarayarak dosyaları kurtarmaya çalışır. Merkezi dizin tamamen kaybolmuş olsa bile çalışabilir. Ancak bazı dosyaları atlayabilir.

Onarımdan sonra test edin:

unzip -t onarilmis_arsiv.zip
unzip -l onarilmis_arsiv.zip

zipinfo ile Durum Analizi

# Arşiv içeriği hakkında detaylı bilgi
zipinfo -v bozuk_arsiv.zip

# Sadece dosya listesi
zipinfo -1 bozuk_arsiv.zip 2>&1 | head -20

Eğer zipinfo bazı dosyaları listeleyebiliyorsa, kısmi çıkarma yapabilirsiniz:

# Sadece belirli dosyaları çıkar
unzip bozuk_arsiv.zip "onemli_dosya.sql" -d ./kurtarilan/

# Hataları yoksayarak çıkar
unzip -o bozuk_arsiv.zip -d ./kurtarilan/ 2>/dev/null

7-Zip ile ZIP Kurtarma

7-Zip’in Linux versiyonu olan 7z, bozuk arşivleri kurtarmada oldukça başarılıdır:

# Önce test
7z t bozuk_arsiv.zip

# Kurtarma modunda çıkar
7z e bozuk_arsiv.zip -o./kurtarilan/ -y 2>&1 | tee kurtarma_log.txt

# Bozuk dosyaları atla
7z x bozuk_arsiv.zip -o./kurtarilan/ -y -r 2>&1

7z‘nin güzel yanı, bozuk dosyaları işlerken ne yaptığını açıkça söylemesidir. Log çıktısını inceleyerek hangi dosyaların kurtarıldığını, hangilerinin atlandığını görebilirsiniz.

TAR Arşivlerini Kurtarma

TAR, ZIP’ten farklı olarak merkezi dizin yapısına sahip değildir. Dosyalar sıralı olarak saklanır ve bozukluk noktasından sonraki veriler genellikle kurtarılamaz. Ama bozukluk noktasına kadar olan her şeyi genellikle alabilirsiniz.

Temel TAR Kontrol ve Kurtarma

# Arşivi test et
tar -tvf bozuk_arsiv.tar 2>&1 | tee tar_icerik.txt

# Hataları yoksayarak listeleme
tar -tvf bozuk_arsiv.tar 2>/dev/null | head -50

# Kurtarma modunda çıkar (hataları yoksay)
tar -xvf bozuk_arsiv.tar --ignore-zeros -C ./kurtarilan/ 2>&1 | tee kurtarma_log.txt

–ignore-zeros: Sıfır bloklarını yoksayarak devam eder, kısmi kurtarmada kritik öneme sahiptir.

Sıkıştırılmış TAR Arşivleri

gzip veya bzip2 ile sıkıştırılmış tar arşivleri (tar.gz, tar.bz2) farklı bir yaklaşım gerektirir. Önce sıkıştırmayı açmayı denemeniz gerekir:

# tar.gz için önce gzip katmanını kurtarmayı dene
gzip -d -c bozuk_arsiv.tar.gz > kurtarilan.tar 2>/dev/null

# Ardından tar dosyasını işle
tar -xvf kurtarilan.tar --ignore-zeros -C ./kurtarilan/ 2>&1

# Alternatif: zcat kullanımı
zcat bozuk_arsiv.tar.gz 2>/dev/null | tar -xv --ignore-zeros -C ./kurtarilan/ 2>&1

bzip2 sıkıştırmalı arşivler için:

# bzip2 kurtarma
bzip2recover bozuk_arsiv.tar.bz2

# Bu komut bzip2.recovered.0001, bzip2.recovered.0002 gibi dosyalar oluşturur
# Bunları birleştirip açmayı deneyin
cat bzip2.recovered.* > birlestirilmis.bz2
bzcat birlestirilmis.bz2 2>/dev/null | tar -xv --ignore-zeros -C ./kurtarilan/

dd ile Bozuk Bölgeleri Atlama

Arşiv dosyasının fiziksel olarak hasarlı bir disk bölgesinde olduğunu düşünüyorsanız, dd komutu devreye girer:

# Hataları yoksayarak disk imajı al
dd if=bozuk_arsiv.tar.gz of=kurtarilan_kopya.tar.gz bs=512 conv=noerror,sync status=progress

# bs değerini düşürünce daha hassas kurtarma
dd if=bozuk_arsiv.tar.gz of=kurtarilan_kopya.tar.gz bs=1 conv=noerror,sync status=progress

conv=noerror: Okuma hatalarında durmaz, devam eder.

conv=sync: Hatalı bloğu sıfırlarla doldurur, dosya boyutunu korur.

bs=512: Blok boyutu, disk sektör boyutuna eşit ayarlamak iyidir.

GZIP Dosyalarını Kurtarma

Saf .gz dosyaları (arşiv değil, tek dosya sıkıştırması) için gzip ve zlib araçları kullanılabilir:

# gzip bütünlük kontrolü
gzip -tv bozuk_dosya.gz

# Zorla açma denemesi
gzip -d -f bozuk_dosya.gz

# zcat ile açma
zcat bozuk_dosya.gz > kurtarilan_dosya 2>/dev/null

# gunzip ile farklı bir deneme
gunzip -c bozuk_dosya.gz > kurtarilan_dosya 2>/dev/null

gzrecover Aracı

Standart araçlar işe yaramazsa, özelleşmiş gzrecover aracını deneyebilirsiniz:

# Kurulum (Ubuntu/Debian)
sudo apt-get install gzrt

# Kurtarma
gzrecover bozuk_dosya.gz
# Bu işlem bozuk_dosya.gz.recovered dosyası oluşturur

7z Arşivlerini Kurtarma

7z formatı, hata düzeltme bloklarını destekler. Arşiv oluştururken kurtarma bloğu eklediyseniz, bozuklukları otomatik düzeltebilir:

# Test ve detaylı hata raporu
7z t bozuk_arsiv.7z -y 2>&1 | tee 7z_test.txt

# Kurtarma kaydıyla çıkarma
7z x bozuk_arsiv.7z -o./kurtarilan/ -y 2>&1 | tee kurtarma_log.txt

# Çok parçalı arşivlerde
7z x bozuk_arsiv.7z.001 -o./kurtarilan/ -y 2>&1

Par2 ile Kurtarma

Eğer arşivle birlikte .par2 dosyaları varsa, şanslısınız demektir:

# par2 kurulumu
sudo apt-get install par2

# Kurtarma
par2 repair bozuk_arsiv.par2

# Doğrulama
par2 verify bozuk_arsiv.par2

Par2 dosyaları olmadan 7z kurtarması daha zordur, bu nedenle kritik arşivler oluştururken her zaman par2 dosyaları oluşturmanızı öneririm.

Gerçek Dünya Senaryosu: Bozuk MySQL Yedeği

Diyelim ki bir MySQL dump dosyası tar.gz olarak yedeklenmiş ve transfer sırasında bozulmuş. Şu adımları izleyeceğiz:

# 1. Durumu değerlendir
file mysql_yedek_20241115.tar.gz
ls -lh mysql_yedek_20241115.tar.gz

# Orijinali yedekle
cp mysql_yedek_20241115.tar.gz mysql_yedek_20241115.tar.gz.original

# 2. gzip katmanını kurtarmayı dene
gzip -tv mysql_yedek_20241115.tar.gz 2>&1
# Çıktıda hangi noktada hata verdiğini not al

# 3. Mümkün olan kadar veriyi çıkar
zcat mysql_yedek_20241115.tar.gz 2>/dev/null | tar -xv --ignore-zeros -C ./kurtarilan/ 2>&1 | tee kurtarma_log.txt

# 4. Kurtarılan SQL dosyasını kontrol et
ls -lh ./kurtarilan/
wc -l ./kurtarilan/veritabani.sql

# 5. SQL dosyasının sonuna bak (bozulma genellikle sonda olur)
tail -50 ./kurtarilan/veritabani.sql

# 6. SQL dosyasını düzelt (tamamlanmamış sorguları temizle)
# Son yarım kalan satırları kaldır
head -n -5 ./kurtarilan/veritabani.sql > temiz_dump.sql

Bu senaryoda çoğu zaman verinin %90-95’ini kurtarabilirsiniz. Kalan kısım için farklı bir yedekten veya binary loglardan tamamlama yapılabilir.

Gerçek Dünya Senaryosu: Web Sitesi Yedek Arşivi

Hosting firmasından alınan bir web sitesi yedeği bozulmuş olsun:

# Arşiv tipini kontrol et
file site_yedek.zip

# zipinfo ile kısmi liste al
zipinfo -1 site_yedek.zip 2>&1 > mevcut_dosyalar.txt
cat mevcut_dosyalar.txt | wc -l

# 7z ile agresif kurtarma dene
7z x site_yedek.zip -o./kurtarilan_site/ -y 2>&1 | grep -E "(Extracting|ERROR|Warning)"

# zip -FF ile merkezi dizini yeniden oluştur
zip -FF site_yedek.zip --out site_yedek_onarilmis.zip 2>&1

# Onarılmış arşivi test et
unzip -t site_yedek_onarilmis.zip 2>&1 | tail -20

# Kritik dosyaları önce çıkar
unzip site_yedek_onarilmis.zip "wp-config.php" "*.sql" -d ./kritik_dosyalar/ 2>/dev/null

foremost ve photorec ile Derin Kurtarma

Eğer yukarıdaki yöntemlerin hiçbiri işe yaramadıysa ve arşiv içindeki dosyaları doğrudan bulmaya çalışıyorsanız, adli bilişim araçlarına başvurabilirsiniz:

# foremost kurulumu
sudo apt-get install foremost

# Arşiv içinden dosya imzalarını tarama
foremost -i bozuk_arsiv.zip -o ./foremost_output/ -v

# photorec ile daha kapsamlı tarama
sudo apt-get install testdisk
photorec bozuk_arsiv.zip

Bu araçlar magic byte’ları kullanarak dosya türlerini tespit eder. Bir ZIP içinde JPEG, PDF veya başka dosyalar varsa bunları doğrudan kurtarabilirsiniz. Arşiv yapısını değil, ham veriyi arar.

strings Komutu ile Metin Kurtarma

Bazen en basit araç en işlevsel olanıdır. Arşiv içinde metin tabanlı dosyalar varsa:

# Okunabilir metin parçalarını çıkar
strings bozuk_arsiv.tar.gz > metin_icerik.txt

# Minimum uzunluk belirle (kısa noise'u filtrele)
strings -n 20 bozuk_arsiv.tar.gz > uzun_metinler.txt

# SQL içeriği ara
strings bozuk_arsiv.tar.gz | grep -i "INSERT INTO|CREATE TABLE|ALTER TABLE" > sql_parcalari.txt

# Config dosyası içeriği ara
strings bozuk_arsiv.tar.gz | grep -E "^(host|user|password|database|port)s*=" > config_parcalari.txt

Bu yöntem “arşivi açma” değil, “içerikten anlam çıkarma” yaklaşımıdır. Veritabanı kayıtları veya yapılandırma dosyaları gibi kritik metin verilerini kurtarmak için çok değerlidir.

Gelecekte Bozuklukları Önlemek

Kurtarma yaparken “bir daha bu duruma düşmeyeceğim” diye düşünüyorsunuzdur. İşte pratik önlemler:

  • Arşiv oluştururken hash üret: sha256sum arsiv.tar.gz > arsiv.tar.gz.sha256 komutunu arşiv scripte ekleyin
  • Transfer sonrası doğrula: SCP veya rsync ile kopyaladıktan sonra her iki taraftaki hash’i karşılaştırın
  • Arşivi test et: tar -tvf veya unzip -t ile arşivi oluşturduktan hemen sonra test edin
  • Çoklu yedek konumu: Aynı yedeği en az iki farklı lokasyonda saklayın
  • Par2 dosyaları oluştur: Kritik arşivler için par2create -r10 arsiv.tar.gz ile %10 kurtarma bloğu ekleyin
  • Düzenli test: Yedeklerinizi düzenli olarak restore test ederek bozuklukları erken tespit edin
# Otomatik yedek doğrulama scripti örneği
#!/bin/bash
ARSIV="/backup/gunluk_yedek.tar.gz"
LOG="/var/log/yedek_kontrol.log"

echo "$(date): Arşiv kontrol başlıyor" >> $LOG

if tar -tzf "$ARSIV" > /dev/null 2>&1; then
    echo "$(date): Arşiv sağlıklı" >> $LOG
else
    echo "$(date): UYARI - Arşiv bozuk olabilir!" >> $LOG
    # Burada alert email veya Slack bildirimi gönderilebilir
fi

Sonuç

Bozuk arşivlerle karşılaşmak kaçınılmazdır; önemli olan panik yapmadan sistematik yaklaşmaktır. Şu sırayı aklınızda tutun: önce orijinali yedekle, sonra hafif araçları dene, işe yaramazsa daha agresif yöntemlere geç.

ZIP formatı kurtarma için en uygun formattır, TAR sıralı yapısı nedeniyle kısmi kurtarmalara daha elverişlidir, bzip2 ise bzip2recover ile blok bazında kurtarmayı destekler. 7z’nin par2 desteği kritik arşivler için gerçek bir avantaj sağlar.

Ama en iyi kurtarma yöntemi, kurtarma yapmak zorunda kalmamaktır. Yedek alırken hash üretmek, arşivi test etmek ve birden fazla konumda saklamak gibi basit alışkanlıklar, sizi 02:00 telefon çağrılarından koruyacaktır. Ve eğer yine de o çağrıyı alırsanız, artık ne yapacağınızı biliyorsunuzdur.

Yorum yapın