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 -Tya dagzip -tvçalıştırmak birkaç saniyen alır, bozuk arşivi keşfetmen saatler alabilir. filekomutunu sık kullan. Dosya uzantısı her zaman gerçeği söylemez.- Büyük arşivler için
pvkullan. İ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.
