tar ile Arşiv Yönetimi: Oluşturma, Açma ve İçerik Listeleme
Bir şeyi açıkça söyleyeyim: tar komutunu öğrenmek için dokümantasyon okumak ile gerçekte bir production sunucusunda yanlış parametreyle arşiv açmak arasındaki fark, insanı gerçekten ustalaştırır. Ben ikinci yoldan geçtim. Bu yazı, o deneyimlerin süzülmüş hali.
tar Nedir ve Neden Hala Kullanıyoruz?
tar, “Tape Archive” kelimelerinin kısaltması. Adından da anlaşılacağı üzere, aslında manyetik bant yedeklemelerinden kalma bir araç. Ama 2024 yılında hala neden her Linux sisteminde birincil arşivleme aracı olarak kullanıyoruz? Çünkü basit, tahmin edilebilir ve her yerde var. Alpine Linux’ta da var, RHEL’de de, minimal Docker image’larında da. zip için aynı şeyi söyleyemezsiniz.
tar tek başına sıkıştırma yapmaz, dikkat edin. O sadece dosyaları bir araya toplar. Sıkıştırma işini gzip, bzip2, xz gibi araçlar yapar. tar bu araçlarla entegre çalışarak hem birleştirme hem sıkıştırma işini tek komutla halletmenizi sağlar.
Temel Parametreler
Parametreleri ezberlemeden önce mantığını anlamak gerekiyor. tar parametreleri iki şekilde yazabilirsiniz: tire ile ya da tiresiz. Her ikisi de çalışır:
tar -cvf arsiv.tar /home/kullanici
tar cvf arsiv.tar /home/kullanici
Sık kullandığım parametreler şunlar:
- -c: Create, yeni arşiv oluştur
- -x: Extract, arşivi aç
- -t: Table of contents, içeriği listele
- -v: Verbose, işlenen dosyaları göster
- -f: File, arşiv dosyasının adını belirt (her zaman kullanılır)
- -z: gzip ile sıkıştır (.tar.gz)
- -j: bzip2 ile sıkıştır (.tar.bz2)
- -J: xz ile sıkıştır (.tar.xz)
- -p: Dosya izinlerini koru
- -P: Mutlak yolları kullan (dikkatli olun!)
- –exclude: Belirli dosya/dizinleri hariç tut
- -C: Hedef dizini belirt
Arşiv Oluşturma
Basit Arşiv
En temel kullanım, bir dizini arşivlemek:
tar -cvf yedek.tar /var/www/html
Bu komut /var/www/html dizinini yedek.tar dosyasına toplar. Sıkıştırma yok, sadece birleştirme.
gzip ile Sıkıştırarak Arşiv Oluşturma
Pratikte en çok kullandığım format .tar.gz veya .tgz:
tar -czf yedek.tar.gz /var/www/html
Burada -z parametresi gzip sıkıştırmasını devreye sokuyor. Genel amaçlı yedeklemeler için hız ve sıkıştırma oranı dengesi açısından gzip iyi bir tercih.
bzip2 ile Daha İyi Sıkıştırma
Log dosyaları veya metin ağırlıklı içerikler için bzip2 daha iyi sıkıştırma oranı verir:
tar -cjf loglar.tar.bz2 /var/log/nginx/
-j parametresi bzip2’yi kullanır. Gzip’e göre daha yavaş ama özellikle büyük metin dosyalarında %20-30 daha küçük arşiv elde edebilirsiniz.
xz ile Maksimum Sıkıştırma
Disk alanı kritikse ve zaman önemli değilse:
tar -cJf yedek.tar.xz /opt/uygulama/
xz en iyi sıkıştırma oranını verir ama işlemci yükü ciddi olabilir. Büyük veritabanı dump’ları için bu farkı bizzat yaşadım, aynı 2GB dump için gzip 45 saniye alırken xz 3 dakikayı geçiyordu. Ama dosya boyutu %40 küçük çıkıyordu.
Arşiv İçeriğini Listeleme
Açmadan önce ne olduğuna bakmak, özellikle dışarıdan gelen arşivlerde altın kural. Production’da “bu arşivde ne var acaba” diyerek direkt açmak, beklenmedik yerlere dosya saçılmasına yol açabilir.
tar -tvf yedek.tar.gz
Bu komut arşiv içindeki tüm dosyaları, izinlerini, sahiplerini, boyutlarını ve tarihlerini listeler. Çıktı şuna benzer:
drwxr-xr-x kullanici/kullanici 0 2024-01-15 10:30 html/
-rw-r--r-- kullanici/kullanici 2048 2024-01-15 10:29 html/index.php
-rw-r--r-- kullanici/kullanici 15360 2024-01-14 22:15 html/config.php
Sadece dosya listesi istiyorsanız, verbose olmadan:
tar -tf yedek.tar.gz | head -20
Büyük arşivlerde head veya grep ile filtrelemek hayat kurtarır.
Arşiv Açma
Mevcut Dizine Açma
tar -xzvf yedek.tar.gz
Dikkat: Bu komut arşivi çalıştığınız dizine açar. Arşiv içinde html/ gibi bir dizin yapısı varsa o yapıyla birlikte açılır. Arşiv doğrudan / veya /home gibi mutlak yollarla oluşturulmuşsa bu durum tehlikeli olabilir.
Belirli Bir Dizine Açma
Her zaman -C ile hedef belirtin:
tar -xzvf yedek.tar.gz -C /tmp/geri_yukleme/
Hedef dizin önceden mevcut olmalı. Yoksa hata alırsınız:
mkdir -p /tmp/geri_yukleme && tar -xzvf yedek.tar.gz -C /tmp/geri_yukleme/
Arşivden Belirli Dosyaları Çıkarma
Tüm arşivi açmak istemiyorsanız, sadece ihtiyacınız olan dosyaları çekebilirsiniz:
tar -xzvf yedek.tar.gz html/config.php
Ya da bir grep ile eşleşen dosyaları bulmak için önce listeleyin:
tar -tf yedek.tar.gz | grep "config"
Sonra sadece o dosyayı çıkarın. Çok büyük arşivlerde tek bir config dosyasını geri almak için tüm arşivi açmak yerine bu yöntemi kullanmak ciddi zaman kazandırır.
Gerçek Dünya Senaryoları
Web Sunucusu Yedekleme Scripti
Basit ama işlevsel bir yedekleme scripti. Bunu birçok müşteri sunucusuna yerleştirdim, cron ile çalışıyor:
#!/bin/bash
TARIH=$(date +%Y%m%d_%H%M%S)
YEDEK_DIZIN="/backup/web"
KAYNAK="/var/www"
DOSYA_ADI="web_yedek_${TARIH}.tar.gz"
mkdir -p "$YEDEK_DIZIN"
tar -czf "${YEDEK_DIZIN}/${DOSYA_ADI}"
--exclude="*/cache/*"
--exclude="*/tmp/*"
--exclude="*.log"
/var/www/
# 7 gunden eski yedekleri sil
find "$YEDEK_DIZIN" -name "web_yedek_*.tar.gz" -mtime +7 -delete
echo "Yedek tamamlandi: ${DOSYA_ADI}"
--exclude parametresine dikkat edin. Cache ve geçici dosyaları yedeklemeye dahil etmemek hem arşiv boyutunu küçültür hem de anlamsız veriyi dışarıda tutar.
Dizin Yapısını Koruyarak Yedekleme
Özellikle izinlerin ve sahiplik bilgilerinin önemli olduğu durumlarda:
tar -czpf sistem_yedek.tar.gz
--same-owner
/etc/
/home/
/root/
-p parametresi izinleri korur. --same-owner ise sahiplik bilgisini aynen aktarır. Root olarak çalıştırıyorsanız bu zaten varsayılan davranış, ama root olmayan bir kullanıcı arşivi açıyorsa bu bayraklar olmadan sahiplik bilgileri kaybolur.
Uzak Sunucuya SSH Üzerinden Arşiv Gönderme
Ara dosya oluşturmadan, doğrudan uzak sunucuya aktarmak için:
tar -czf - /var/www/html | ssh kullanici@uzak-sunucu "tar -xzf - -C /var/www/"
Bu komut aslında oldukça zarif. tar -czf - çıktıyı standart output’a yazıyor, pipe ile ssh üzerinden karşı tarafa gönderiyor. Karşı taraftaki tar -xzf - ise standart input’tan okuyor. Disk I/O’su yok, direkt transfer. Büyük arşivleri bir sunucudan diğerine taşımanın en hızlı yollarından biri.
Artımlı Yedekleme (Incremental Backup)
tar ile basit bir artımlı yedek almak mümkün:
# İlk tam yedek (snapshot dosyası oluşturulur)
tar -czf tam_yedek.tar.gz
--listed-incremental=/backup/snapshot.snar
/var/www/
# Sonraki günlerde sadece değişenleri yedekle
tar -czf artimli_yedek_$(date +%Y%m%d).tar.gz
--listed-incremental=/backup/snapshot.snar
/var/www/
--listed-incremental parametresi bir snapshot dosyası kullanır. İlk çalışmada tam yedek alır ve snapshot dosyasını oluşturur. Sonraki çalışmalarda sadece değişen veya eklenen dosyaları arşive dahil eder.
Dikkat Edilmesi Gereken Noktalar
Mutlak Yol Tuzağı
Bu konuda çok ciddi uyarı vermem gerekiyor. Eğer arşiv mutlak yollarla oluşturulmuşsa (yani / ile başlayan yollar):
tar -xzvf tehlikeli_arsiv.tar.gz
Bu komut, arşivdeki dosyaları aynı mutlak yollara açmaya çalışır. Yani arşiv içinde /etc/passwd varsa, mevcut /etc/passwd dosyanızın üzerine yazar.
tar bunu varsayılan olarak önler ve şu uyarıyı verir:
tar: Removing leading '/' from member names
Bu uyarı göründüğünde paniklemeyip işlemin devam etmesine izin verebilirsiniz. tar güvenlik amacıyla başındaki / karakterini kaldırıyor. Ama --absolute-names veya -P parametresi kullanılarak oluşturulmuş arşivlerde bu koruma devre dışıdır.
Dışarıdan gelen bir arşivi önce listeleyin:
tar -tf bilinmeyen_arsiv.tar.gz | head -30
Dosya yolları / ile başlıyorsa çok dikkatli olun.
Sembolik Link Davranışı
tar varsayılan olarak sembolik linkleri olduğu gibi arşivler, linkin işaret ettiği dosyayı değil. Eğer linkin hedefini de arşive dahil etmek istiyorsanız:
tar -czhf arsiv.tar.gz /var/www/html/
-h parametresi symbolic link’leri takip eder ve gerçek dosyaları arşivler.
Büyük Dosyalarda İlerlemeyi Takip Etme
Büyük arşiv oluştururken veya açarken ne kadar ilerlediğini görmek isteyebilirsiniz. pv aracı kuruluysa:
tar -czf - /var/www/ | pv > yedek.tar.gz
Ya da tar‘ın --checkpoint özelliğiyle:
tar -czf yedek.tar.gz
--checkpoint=1000
--checkpoint-action=echo="%T"
/var/www/
Her 1000 blokta bir mesaj basar. Uzun süren işlemlerde en azından takılıp kalmadığınızı anlarsınız.
Farklı Sıkıştırma Formatlarını Karşılaştırma
Hangi sıkıştırma formatını seçeceğiniz senaryoya göre değişir:
- Sıkıştırmasız tar: Hız önemliyse ve disk alanı bol ise, aynı dosya sistemi içinde taşıma işlemlerinde kullanın
- tar.gz (gzip): Genel amaçlı, hız ve sıkıştırma dengesi iyi, en yaygın format
- tar.bz2 (bzip2): Metin ağırlıklı içerikler için daha iyi oran, ama daha yavaş
- tar.xz (xz): Maksimum sıkıştırma, uzun süre saklanacak arşivler için uygun, işlemci yoğun
Arşiv Bütünlüğünü Doğrulama
Yedeklediğinizi düşündüğünüz arşivin gerçekten okunabilir olduğunu doğrulamak kritik:
tar -tzf yedek.tar.gz > /dev/null && echo "Arsiv saglikli" || echo "HATA: Arsiv bozuk!"
Bu komut arşivi okuyup içindeki dosyaları listeler ama bir yere yazmaz. Hata çıkmazsa arşiv sağlıklı demektir.
Daha kapsamlı doğrulama için checksum de alabilirsiniz:
sha256sum yedek.tar.gz > yedek.tar.gz.sha256
# Sonra doğrulamak için:
sha256sum -c yedek.tar.gz.sha256
Yedek arşivin yanına mutlaka checksum dosyasını da koyun. Aktarım sırasında bozulma olup olmadığını bu şekilde anlarsınız.
Sonuç
tar komutu, görünürde basit ama doğru kullanılmadığında ciddi sorunlara yol açabilecek bir araç. Production’da arşiv açarken her seferinde önce -t ile içerik listesi almak, mutlak yol tuzağına karşı dikkatli olmak ve arşiv bütünlüğünü doğrulamak alışkanlık haline gelmeli.
Özellikle şunu vurgulayayım: Yedekleme scriptleri yazarken sadece arşiv oluşturmayı değil, geri yüklemeyi de test edin. Açılmayan bir yedek, yedek değildir. Haftada bir random bir dosyayı geri yükleyerek test eden bir script yazmak, gerçek bir kriz anında sizi kurtarabilir.
tar‘ın daha pek çok parametresi var, ama bu yazıda ele aldıklarım günlük işlerin %95’ini karşılar. Geri kalanını man tar ile keşfedebilirsiniz, dökümanı gerçekten iyi yazılmış ve okunmaya değer.
