Arşivleme İşlemlerinde Hata Ayıklama ve Verbose Çıktıyı Analiz Etme: tar, zip ve gzip ile Tanı Yöntemleri

Bir arşivleme işlemi gece yarısı patlarsa ve sen de log dosyasına bakıp “permission denied” ile “input/output error” arasında kaybolursan, verbose çıktının ne kadar değerli olduğunu anlarsın. Ben bu durumu birden fazla kez yaşadım. Yıllar içinde öğrendiğim şu: arşivleme araçlarının tanı yeteneklerini kullanmadan sorun çözmek, gözlerin kapalı ameliyat yapmaya benziyor.

Bu yazıda tar, zip ve gzip araçlarıyla hata ayıklama sürecini, verbose çıktıyı nasıl yorumlayacağını ve gerçek dünyada karşılaşılan senaryolarda ne yapman gerektiğini anlatacağım.

Neden Verbose Çıktı Bu Kadar Önemli?

Çoğu sysadmin arşivleme komutlarını şöyle çalıştırır:

tar -czf yedek.tar.gz /var/www/html

Komut çalışır, biter. Tamam mı? Belki. Ama içinde ne var? Hangi dosyalar atlandı? Symlink’ler doğru işlendi mi? Bunu bilmiyorsun. Verbose mod olmadan arşivleme işlemi bir kara kutu gibi çalışır.

Verbose çıktı sadece “ne yapıldığını görmek” için değil, aynı zamanda şunlar için kritiktir:

  • Beklenmedik dosya atlamalarını tespit etmek
  • İzin hatalarını anlık görmek
  • Arşiv bütünlüğünü doğrulamak
  • Script’lerde hata yakalama mantığı kurmak
  • Büyük arşiv işlemlerinde ilerlemeyi izlemek

tar ile Verbose ve Tanı Modları

Temel Verbose Kullanımı

tar‘ın -v parametresi en temel verbose modunu açar. Ama burada bir nüans var: tek -v ile çift -vv arasında fark vardır.

# Tek verbose: sadece dosya adlarını listeler
tar -czvf arsiv.tar.gz /etc/nginx/

# Çift verbose: dosya izinleri, boyut, tarih gibi ls -l benzeri bilgi verir
tar -czvvf arsiv.tar.gz /etc/nginx/

Çıktıyı karşılaştıralım:

# -v çıktısı
etc/nginx/nginx.conf
etc/nginx/sites-enabled/default

# -vv çıktısı
-rw-r--r-- root/root      2345 2024-01-15 14:23 etc/nginx/nginx.conf
lrwxrwxrwx root/root         0 2024-01-15 09:11 etc/nginx/sites-enabled/default -> ../sites-available/default

İkinci çıktıda symlink’in varlığını ve hedefini görebiliyorsun. Bu, geri yükleme sırasında neden bir dosyanın eksik olduğunu anlamanda kritik rol oynar.

Hata Çıktısını Ayırmak

Verbose çıktının en önemli pratik kullanımı: stdout ve stderr’i ayırmak. tar, normal işlem bilgilerini stderr’e, dosya listesini stdout’a yazar. Bunu anlamamak seni yanlış yönlendirebilir.

# stderr'i ayrı dosyaya yaz, stdout'u ayrı dosyaya yaz
tar -czvf arsiv.tar.gz /var/log/ 
  > dosya_listesi.txt 
  2> hata_listesi.txt

# Sonrasında hataları incele
cat hata_listesi.txt

Tipik bir hata çıktısı şöyle görünür:

tar: /var/log/journal: Cannot open: Permission denied
tar: /var/log/private: Cannot open: Permission denied
tar: Exiting with failure status due to previous errors

Bu çıktıdan iki şey anlıyorsun: hangi dosyaların atlandığını ve exit code’un sıfır olmadığını. Script’lerde bunu yakalamak için:

#!/bin/bash
tar -czvf /backup/sistem_yedek.tar.gz /etc/ 2>/tmp/tar_hatalar.log
EXIT_CODE=$?

if [ $EXIT_CODE -ne 0 ]; then
    echo "UYARI: tar işlemi hatalarla tamamlandı (exit code: $EXIT_CODE)"
    echo "Atlanan dosyalar:"
    grep "Cannot open" /tmp/tar_hatalar.log
    # İzin hataları varsa yine de devam et
    if grep -v "Permission denied" /tmp/tar_hatalar.log | grep -q "error"; then
        echo "KRİTİK HATA: İzin dışında başka hatalar var!"
        exit 1
    fi
fi

–warning Parametresiyle İnce Ayar

GNU tar, --warning parametresiyle belirli uyarı kategorilerini kontrol etmeni sağlar:

# Tüm uyarıları göster
tar -czvf arsiv.tar.gz /home/ --warning=all

# Değişen dosya uyarısını göster (canlı sistemlerde kritik)
tar -czvf arsiv.tar.gz /var/ --warning=file-changed

# Belirli bir uyarı kategorisini sustur
tar -czvf arsiv.tar.gz /home/ --warning=no-file-changed

--warning=file-changed özellikle veritabanı dosyaları veya aktif log dosyalarını arşivlerken önemli. Dosya arşivlenirken değiştiyse seni uyarır:

tar: /var/log/syslog: file changed as we read it

Bu uyarıyı görürsen, o dosyanın arşivdeki kopyası tutarsız olabilir.

Arşiv Bütünlüğünü Doğrulamak

Arşiv oluşturduktan sonra doğrulamak için --test-label veya -t parametresi kullanılır:

# Arşivi listele ve doğrula (ayıklama yapmadan)
tar -tzvf arsiv.tar.gz

# Verbose doğrulama ile birlikte diff kontrolü
tar -dzvf arsiv.tar.gz /etc/nginx/

-d (diff) parametresi arşivdeki dosyaları dosya sistemindeki hallerıyla karşılaştırır. Bu çıktı oldukça bilgi verici:

etc/nginx/nginx.conf: Mod time differs
etc/nginx/sites-enabled/default: Size differs

Bu sana “arşivden bu yana bu dosyalar değişti” diyor. Geri yükleme kararı vermeden önce bunu bilmek istersin.

zip ile Hata Ayıklama

Verbose Seviyeleri ve Tanı Parametreleri

zip‘in verbose sistemi tar‘dan biraz farklı çalışır. Birden fazla -v ekleyerek daha derin bilgiye ulaşırsın:

# Temel verbose
zip -v arsiv.zip /etc/hosts /etc/passwd

# Çok yüksek verbosity (debug seviyesi bilgi verir)
zip -vv arsiv.zip /etc/hosts

Gerçek bir verbose zip çıktısı şöyle görünür:

adding: etc/hosts (deflated 42%)
adding: etc/passwd (deflated 61%)
  zip warning: name not matched: /etc/sudoers

Buradaki “name not matched” uyarısı kritik: dosya bulunamadı ya da glob pattern eşleşmedi. Bu hatayı sessiz modda asla göremezdin.

zip Hata Kodlarını Yorumlamak

#!/bin/bash
zip -r /backup/web_yedek.zip /var/www/html/

ZIPEXIT=$?
case $ZIPEXIT in
    0) echo "Başarılı" ;;
    1) echo "UYARI: İşlem uyarılarla tamamlandı, arşiv oluştu" ;;
    2) echo "HATA: Beklenmedik son - arşiv zarar görmüş olabilir" ;;
    3) echo "HATA: Zip dosyası oluşturulamadı" ;;
    4) echo "HATA: Yetersiz bellek" ;;
    5) echo "HATA: Disk hatası" ;;
    6) echo "UYARI: Bazı dosyalar kritik değişiklikle arşivlendi" ;;
    12) echo "HATA: zip executable bulunamadı" ;;
    *) echo "Bilinmeyen hata kodu: $ZIPEXIT" ;;
esac

Bu exit code tablosunu ezberlemene gerek yok ama script’lerde en azından 0 dışındakileri yakalamalısın.

zipinfo ile Arşiv Analizi

zipinfo komutu, zip dosyalarını hata ayıklamak için tar -tvf‘den çok daha ayrıntılı bilgi sunar:

# Detaylı arşiv bilgisi
zipinfo -v arsiv.zip

# Özet istatistikler
zipinfo -m arsiv.zip

# Sadece dosya listesi, Unix ls tarzı
zipinfo -l arsiv.zip

zipinfo -v çıktısından bir parça:

Central directory entry #1:
---------------------------

  etc/nginx/nginx.conf

  offset of local header from start of archive: 0 (000000h) bytes
  file system or operating system of origin:    Unix
  version of encoding software:                 3.0
  minimum file system compatibility required:   MS-DOS, OS/2 or NT FAT
  minimum software version required to extract: 2.0
  compression method:                           deflated
  compression sub-type (deflation):             normal
  file security status:                         not encrypted
  extended local header:                        no
  file last modified on (DOS date/time):        2024 Jan 15 14:23:22
  file last modified on (UT extra field modtime): 2024 Jan 15 14:23:22 local
  32-bit CRC value (hex):                       a3f2c1d8
  compressed size:                              1823 bytes
  uncompressed size:                            3145 bytes
  length of filename:                           20 characters
  length of extra field:                        24 bytes
  length of file comment:                       0 characters

CRC değeri özellikle önemli. Arşivi farklı ortamlarda oluşturduğunda CRC tutarlılığını kontrol edebilirsin.

Bozuk zip Dosyasını Onarmak

# Zip bütünlük testi
zip -T arsiv.zip

# Detaylı test
zip -Tv arsiv.zip

# Geri kazanım denemesi (zip_recovery aracıyla)
zip -FF bozuk.zip --out onarilan.zip
zip -FFv bozuk.zip --out onarilan.zip  # verbose ile

-FF parametresi bozuk zip dosyasından kurtarılabildiğini kurtarmaya çalışır. Bu parametreyi production bir ortamda kaybettiğin zip için kullandım ve içeriklerin yaklaşık yüzde seksenini kurtarabildim.

gzip ile Tanı ve Hata Ayıklama

Verbose Test Modu

gzip‘in test modu, sıkıştırılmış dosyanın bütünlüğünü kontrol eder:

# Bütünlük testi, sessiz
gzip -t dosya.gz

# Verbose bütünlük testi
gzip -tv dosya.gz

# Çok detaylı test
gzip -tvv dosya.gz

Normal bir verbose test çıktısı:

dosya.gz:    OK

Bozuk bir dosyada:

dosya.gz:    FAILED - crc error
gzip: dosya.gz: invalid compressed data--crc error

gzip Dosya Bilgisini Okumak

# Sıkıştırma oranı ve dosya bilgisi
gzip -lv dosya.gz

# Çıktı örneği:
# method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
# defla a3f2c1d8 Jan 15 14:23           182345             523421  65.2% dosya

Bu çıktıdaki ratio değeri sıkıştırma verimliliğini gösteriyor. Eğer beklediğinden düşük bir oran görürsen, kaynak dosyanın zaten sıkıştırılmış olduğundan şüphelenebilirsin (JPG, MP4 gibi).

Gerçek Senaryo: Büyük Log Arşivi Sorununu Çözmek

Bir gün production sunucusunda şöyle bir durumla karşılaştım: gece yarısı çalışan log arşivleme scripti hep başarılı görünüyordu, ama arşivlerin bazıları beklenden çok küçüktü. Sorun neydi?

# Önce mevcut arşivleri kontrol ettim
for f in /backup/logs/*.gz; do
    echo -n "$f: "
    gzip -tv "$f" 2>&1
done

# Şüpheli dosyalar için detaylı bilgi
gzip -lv /backup/logs/app_2024*.gz | sort -k7 -n

Çıktıda bazı dosyaların sıkıştırma oranının yüzde sıfır olduğunu gördüm. Yani dosyalar sıkıştırılmamıştı, sadece .gz uzantısı almıştı. Sebebi neydi? Script’te şöyle bir satır vardı:

gzip -f /var/log/app.log.1

-f parametresi “force” anlamına geliyor ve dosya zaten .gz ise bile üzerine yazar. Ama asıl sorun, bazı log rotasyonlarının dosyaları zaten gzip formatında bıraktığıydı. Çözüm:

#!/bin/bash
LOG_FILE="/var/log/app.log.1"

# Önce dosya tipini kontrol et
if file "$LOG_FILE" | grep -q "gzip compressed"; then
    echo "Dosya zaten sıkıştırılmış, sadece taşınıyor"
    mv "$LOG_FILE" "/backup/logs/app_$(date +%Y%m%d).log.gz"
else
    echo "Sıkıştırılıyor..."
    gzip -v "$LOG_FILE"
    mv "${LOG_FILE}.gz" "/backup/logs/app_$(date +%Y%m%d).log.gz"
fi

# Sonucu doğrula
gzip -tv "/backup/logs/app_$(date +%Y%m%d).log.gz" || echo "HATA: Arşiv bozuk!"

Karmaşık Senaryolarda Birleşik Tanı Yaklaşımı

Büyük Arşivlerde İlerleme Takibi

tar tek başına ilerleme göstermez, ama pv aracıyla birlikte kullanabilirsin:

# pv ile ilerleme çubuğu
tar -czf - /var/www/html | pv -s $(du -sb /var/www/html | awk '{print $1}') > arsiv.tar.gz

# Hem verbose hem ilerleme
tar -czv /var/www/html | pv > arsiv.tar.gz 2>arsiv_dosyalar.txt

Arşiv İçerik Doğrulama Script’i

Production ortamında kullandığım kapsamlı bir doğrulama script’i:

#!/bin/bash

# Kullanım: ./arsiv_dogrula.sh /backup/arsiv.tar.gz /kaynak/dizin
ARSIV=$1
KAYNAK=$2

if [ -z "$ARSIV" ] || [ -z "$KAYNAK" ]; then
    echo "Kullanim: $0 <arsiv.tar.gz> <kaynak_dizin>"
    exit 1
fi

echo "=== Arşiv Bütünlük Testi ==="
if tar -tzvf "$ARSIV" > /tmp/arsiv_listesi.txt 2>/tmp/arsiv_hatalar.txt; then
    echo "OK: Arşiv bütünlüğü doğrulandı"
else
    echo "HATA: Arşiv bütünlüğü testini geçemedi!"
    cat /tmp/arsiv_hatalar.txt
    exit 1
fi

echo ""
echo "=== Dosya Sayısı Kontrolü ==="
ARSIV_SAYI=$(wc -l < /tmp/arsiv_listesi.txt)
KAYNAK_SAYI=$(find "$KAYNAK" -type f | wc -l)
echo "Arşivdeki dosya sayısı: $ARSIV_SAYI"
echo "Kaynak dosya sayısı: $KAYNAK_SAYI"

if [ "$ARSIV_SAYI" -lt "$KAYNAK_SAYI" ]; then
    echo "UYARI: Arşivde kaynak dizinden daha az dosya var!"
    FARK=$((KAYNAK_SAYI - ARSIV_SAYI))
    echo "Eksik dosya sayısı yaklaşık: $FARK"
fi

echo ""
echo "=== Hata Raporu ==="
if [ -s /tmp/arsiv_hatalar.txt ]; then
    echo "Arşivleme sırasında hatalar oluştu:"
    cat /tmp/arsiv_hatalar.txt
else
    echo "OK: Hata bulunamadı"
fi

echo ""
echo "=== Boyut Bilgisi ==="
ARSIV_BOYUT=$(du -sh "$ARSIV" | cut -f1)
KAYNAK_BOYUT=$(du -sh "$KAYNAK" | cut -f1)
echo "Arşiv boyutu: $ARSIV_BOYUT"
echo "Kaynak boyutu: $KAYNAK_SAYI"

Ağ Üzerinden Arşiv Aktarımında Sorun Giderme

# SSH üzerinden arşiv oluştururken verbose ile takip
ssh uzak_sunucu "tar -czvf - /var/www/" 2>uzak_hatalar.log | 
    gzip -v > yerel_arsiv.tar.gz.gz 2>yerel_hatalar.log

# Daha iyi yöntem: rsync ile tar kombinasyonu
tar -czvf - /var/www/ | ssh -C uzak_sunucu "cat > /backup/web_arsiv.tar.gz"

Sık Karşılaşılan Hatalar ve Çözümleri

Yıllar içinde defalarca karşılaştığım hata mesajları ve anlamları:

“tar: Removing leading ‘/’ from member names”: tar, mutlak yolları göreli yola çeviriyor. Bu bir hata değil, güvenlik özelliği. Mutlak yolları korumak istiyorsan -P kullan ama dikkatli ol, bu geri yüklemede dosyaları üzerine yazar.

“gzip: stdin: not in gzip format”: Dosya gerçekten gzip formatında değil. file komutuyla kontrol et: file dosya.gz

“tar: Cannot stat: No such file or directory”: Glob pattern eşleşmedi veya sembolik link kırık. -v ile hangi dosyaların atlandığını gör.

“zip error: Invalid command arguments”: Çoğunlukla dosya yolu sorunudur. Yolda boşluk varsa tırnak içine al.

“tar: file changed as we read it”: Aktif kullanılan dosya arşivleniyor. Mümkünse servisi durdur ya da LVM snapshot al.

Sonuç

Arşivleme hatalarının büyük çoğunluğu aslında sessiz başarısızlıklardır: komut çıkış kodu sıfır döner, arşiv dosyası oluşur, ama içerik eksik ya da bozuktur. Bunu ancak verbose çıktıyı inceleyerek veya sistematik doğrulama yaparak anlayabilirsin.

Pratik önerilerim:

  • Production script’lerinde her zaman exit code yakala. Özellikle tar için 1 ve 2 arasındaki farkı bil.
  • stderr ve stdout’u ayır. Verbose çıktıyı dosyaya yaz, sonra analiz et.
  • Arşiv oluşturduktan sonra mutlaka test et. tar -tzvf, zip -T ya da gzip -tv çalıştırmak birkaç saniyen alır, bozuk arşivi keşfetmen saatler alabilir.
  • file komutunu sık kullan. Dosya uzantısı her zaman gerçeği söylemez.
  • Büyük arşivler için pv kullan. İlerlemeyi görmek hem seni rahatlatır hem de takılıp kalmayı fark ettirir.

Bir arşiv sorunuyla gece yarısı boğuşmak zorunda kalmadan önce bu araçları tanı işlemlerinin ayrılmaz parçası haline getir. Sabah geldiğinde seni bekleyen sürpriz sayısı belirgin şekilde azalacak.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir