tar ile Arşiv Oluşturma ve Açma İşlemleri

Linux dünyasında dosyaları bir araya getirip paketlemenin en klasik yolu tar komutundan geçer. 1970’lerden bu yana hayatımızda olan bu araç, adını “tape archive” yani bant arşivi ifadesinden alır. Bugün artık fiziksel bantlarla değil, disk üzerindeki dosyalarla çalışıyoruz ama tar hâlâ vazgeçilmez bir araç olmaya devam ediyor. Sunucularda yedek almak, yazılım paketlerini dağıtmak, log dosyalarını arşivlemek… Bunların hepsinde tar işin içinde. Gelin bu komutu tüm detaylarıyla ele alalım.

tar Nedir ve Nasıl Çalışır?

tar tek başına bir sıkıştırma aracı değildir. Temel işlevi birden fazla dosyayı ve dizini tek bir dosya haline getirmektir. Bu birleştirilmiş dosyaya tarball denir ve genellikle .tar uzantısını alır. Sıkıştırma işlemi ise gzip, bzip2, xz gibi ayrı araçlar tarafından yapılır. tar bu araçlarla entegre çalışarak hem birleştirme hem sıkıştırma işlemini tek komutla yapmanızı sağlar.

Bir .tar.gz dosyası gördüğünüzde aslında şunu anlayabilirsiniz: önce tar ile dosyalar birleştirilmiş, sonra gzip ile sıkıştırılmış. Bu iki aşamalı yapıyı anlamak, tar komutunu kavramanın temelidir.

Temel Parametreler

tar komutunun parametrelerini öğrenmek başta kafa karıştırıcı gelebilir. Ama bir kez oturduğunda çok mantıklı bir yapısı olduğunu görürsünüz.

-c: Yeni bir arşiv oluşturur (create)

-x: Arşivi açar (extract)

-t: Arşiv içeriğini listeler (list)

-v: İşlem sırasında dosya isimlerini ekrana yazar (verbose)

-f: Arşiv dosyasının adını belirtir (file), her zaman dosya adından önce gelir

-z: gzip sıkıştırması kullanır (.tar.gz veya .tgz)

-j: bzip2 sıkıştırması kullanır (.tar.bz2)

-J: xz sıkıştırması kullanır (.tar.xz)

-p: Dosya izinlerini korur (permissions)

-C: Çıkarma işlemi için hedef dizini belirtir

–exclude: Belirli dosya ya da dizinleri arşivden dışlar

-r: Mevcut bir arşive dosya ekler (append)

–wildcards: Arşivden belirli pattern ile eşleşen dosyaları çıkarır

Arşiv Oluşturma

Basit Bir Arşiv Oluşturmak

En sık kullanılan senaryo: bir dizini arşivleyip sıkıştırmak.

# Bir dizini gzip ile sıkıştırarak arşivle
tar -czvf yedek.tar.gz /home/ahmet/belgeler/

# Birden fazla dizini tek arşive ekle
tar -czvf proje_yedek.tar.gz /var/www/html /etc/nginx /etc/ssl

# Mevcut dizindeki tüm dosyaları arşivle
tar -czvf arsiv.tar.gz .

Burada -czvf parametrelerinin ne anlama geldiğini hatırlayalım: c oluştur, z gzip kullan, v ayrıntılı çıktı ver, f dosya adını belirt. -v parametresi olmadan da çalışır ama hangi dosyaların işlendiğini görmek, özellikle büyük arşivlerde işe yarar.

Farklı Sıkıştırma Algoritmaları

# bzip2 ile sıkıştır (daha iyi sıkıştırma, daha yavaş)
tar -cjvf yedek.tar.bz2 /home/ahmet/belgeler/

# xz ile sıkıştır (en iyi sıkıştırma oranı, en yavaş)
tar -cJvf yedek.tar.xz /home/ahmet/belgeler/

# Sıkıştırmasız arşiv (sadece birleştirme)
tar -cvf yedek.tar /home/ahmet/belgeler/

Hangi sıkıştırma algoritmasını seçeceğiniz duruma göre değişir. Hızlı bir yedek almak istiyorsanız gzip yeterlidir. Disk alanı kritikse ve süre önemli değilse xz daha iyi sonuç verir. Sunucular arası dosya transferinde xz ile sıkıştırılmış arşivler bant genişliğinden tasarruf sağlar.

Belirli Dosyaları Dışlayarak Arşivleme

Gerçek dünyada her zaman her şeyi arşivlemek istemeyiz. Geçici dosyalar, önbellek dizinleri, log dosyaları… Bunları arşive dahil etmek hem zaman kaybettirir hem de gereksiz yer kaplar.

# node_modules dizinini dışarıda bırak
tar -czvf uygulama.tar.gz /var/www/proje --exclude=/var/www/proje/node_modules

# Birden fazla dizini veya dosya tipini dışla
tar -czvf web_yedek.tar.gz /var/www/html 
  --exclude=/var/www/html/cache 
  --exclude=/var/www/html/tmp 
  --exclude="*.log"

# .git dizinlerini ve log dosyalarını dışarıda bırak
tar -czvf kaynak_kod.tar.gz /opt/uygulama 
  --exclude=".git" 
  --exclude="*.log" 
  --exclude="*.pid"

--exclude parametresinde dikkat etmeniz gereken bir nokta var: tam yol verirken yol eğik çizgiyle başlamalı, pattern verirken ise tırnak içinde yazılmalı. Yoksa beklenmedik sonuçlarla karşılaşabilirsiniz.

Arşivi Açma

Temel Açma İşlemleri

# Arşivi bulunduğun dizine aç
tar -xzvf yedek.tar.gz

# Belirli bir dizine aç
tar -xzvf yedek.tar.gz -C /opt/geri_yukleme/

# bzip2 arşivini aç
tar -xjvf yedek.tar.bz2 -C /tmp/

# xz arşivini aç
tar -xJvf yedek.tar.xz -C /home/ahmet/

-C parametresi çok işe yarar bir detay. Hedef dizin arşivi açmadan önce var olmalıdır, tar onu otomatik oluşturmaz. Bu yüzden önce mkdir -p /hedef/dizin komutuyla dizini oluşturmayı unutmayın.

Arşivden Belirli Dosyaları Çıkarma

Bazen 10 GB’lık bir arşivden sadece tek bir yapılandırma dosyasına ihtiyaç duyarsınız. Tüm arşivi açmak yerine sadece o dosyayı çıkarabilirsiniz.

# Arşiv içeriğini önce listele
tar -tzvf yedek.tar.gz

# Belirli bir dosyayı çıkar
tar -xzvf yedek.tar.gz home/ahmet/belgeler/onemli.txt

# Belirli bir dizini çıkar
tar -xzvf yedek.tar.gz home/ahmet/belgeler/proje/

# Wildcard ile belirli dosyaları çıkar
tar -xzvf yedek.tar.gz --wildcards "*.conf"

Dikkat: arşivden dosya çıkarırken yolu başında / olmadan yazmanız gerekiyor. Arşiv içindeki yollar genellikle göreceli şekilde saklanır.

Arşiv İçeriğini İnceleme

Bir arşivi açmadan önce ne içerdiğini görmek her zaman iyi bir alışkanlıktır. Özellikle internetten indirdiğiniz arşivlerde, dosyaların nereye çıkacağını önceden kontrol etmek önemlidir. Bazı kötü hazırlanmış arşivler doğrudan mevcut dizine saçılır ve karmaşaya yol açar.

# Arşiv içeriğini listele
tar -tzvf yedek.tar.gz

# Sıkıştırmasız arşiv içeriğini listele
tar -tvf yedek.tar

# İlk 20 dosyayı görüntüle (büyük arşivler için)
tar -tzvf buyuk_arsiv.tar.gz | head -20

# Arşivdeki sadece .conf dosyalarını listele
tar -tzvf sistem_yedek.tar.gz | grep ".conf$"

Gerçek Dünya Senaryoları

Senaryo 1: Web Sunucusu Yedeği

Bir web sunucusunu taşıyorsunuz ya da günlük yedek alıyorsunuz. Web dosyalarını, nginx yapılandırmasını ve SSL sertifikalarını tek bir arşivde toplamak istiyorsunuz.

#!/bin/bash
# web_yedek.sh - Günlük web sunucusu yedek scripti

TARIH=$(date +%Y%m%d_%H%M%S)
YEDEK_DIZIN="/backup/web"
LOG_DOSYA="/var/log/yedek.log"

mkdir -p $YEDEK_DIZIN

echo "[$TARIH] Web yedeği başladı" >> $LOG_DOSYA

tar -czvf $YEDEK_DIZIN/web_$TARIH.tar.gz 
  /var/www/html 
  /etc/nginx 
  /etc/ssl/private 
  /etc/ssl/certs 
  --exclude=/var/www/html/cache 
  --exclude=/var/www/html/tmp 
  --exclude="*.log" 
  2>> $LOG_DOSYA

if [ $? -eq 0 ]; then
  echo "[$TARIH] Yedek başarıyla oluşturuldu: web_$TARIH.tar.gz" >> $LOG_DOSYA
else
  echo "[$TARIH] HATA: Yedek oluşturulamadı!" >> $LOG_DOSYA
fi

# 7 günden eski yedekleri sil
find $YEDEK_DIZIN -name "web_*.tar.gz" -mtime +7 -delete

Bu scripti crontab’a ekleyerek her gece çalıştırabilirsiniz:

0 2 * * * /usr/local/bin/web_yedek.sh

Senaryo 2: Veritabanı Yedeğini Sıkıştırma

MySQL dump’larını almak ve ardından sıkıştırmak oldukça yaygın bir işlemdir. tar burada pipe ile birlikte kullanılabilir.

# mysqldump çıktısını direkt sıkıştırarak kaydet
mysqldump -u root -p veritabani_adi | gzip > veritabani_$(date +%Y%m%d).sql.gz

# Ya da tar ile birden fazla dump'ı bir araya getir
mysqldump -u root -p veritabani1 > /tmp/db1.sql
mysqldump -u root -p veritabani2 > /tmp/db2.sql
tar -czvf veritabani_yedek_$(date +%Y%m%d).tar.gz /tmp/db1.sql /tmp/db2.sql
rm /tmp/db1.sql /tmp/db2.sql

Senaryo 3: Uzak Sunucuya Arşiv Aktarma

tar ve ssh kombinasyonu oldukça güçlüdür. Dosyaları önce arşivleyip sonra göndermek yerine, pipeline kullanarak tek adımda halledebilirsiniz.

# Yerel dizini sıkıştırarak uzak sunucuya gönder
tar -czvf - /var/www/html | ssh kullanici@sunucu "cat > /backup/web_$(date +%Y%m%d).tar.gz"

# Uzak sunucudan arşiv alıp yerel dizine aç
ssh kullanici@sunucu "tar -czvf - /etc/nginx" | tar -xzvf - -C /tmp/nginx_yedek/

# rsync yerine tar+ssh ile dizin senkronizasyonu
tar -cvf - /kaynak/dizin | ssh kullanici@sunucu "tar -xvf - -C /hedef/dizin"

Bu yöntem özellikle küçük dosyaların çok sayıda olduğu durumlarda rsync’ten daha hızlı olabilir. Her dosya için ayrı SSH oturumu açılmadığından overhead azalır.

Senaryo 4: İzinleri Koruyarak Sistem Yedeği

Sistem dizinlerini yedeklerken dosya izinlerinin, sahiplik bilgilerinin ve sembolik linklerin korunması kritiktir. Yoksa geri yükleme sonrası ciddi sorunlar yaşabilirsiniz.

# Dosya izinlerini ve sahiplik bilgilerini koru
tar -czvpf sistem_yedek.tar.gz 
  --same-owner 
  /etc 
  /home 
  /opt/uygulama 
  --exclude=/etc/mtab 
  --exclude=/etc/fstab.d/tmp

# Root olarak çalıştırın, aksi halde izin sorunları yaşarsınız
sudo tar -czvpf /backup/tam_yedek.tar.gz 
  --acls 
  --xattrs 
  /home/kullaniciler/

-p ve --same-owner parametrelerini root olarak çalıştırdığınızda dosyaları orijinal sahiplikleriyle geri yükleyebilirsiniz. Normal kullanıcı olarak çalıştırıldığında bu parametreler tam olarak işe yaramaz.

Arşiv Doğrulama

Oluşturduğunuz arşivin bozuk olup olmadığını kontrol etmek, özellikle yedekleme senaryolarında ihmal edilmemesi gereken bir adımdır.

# Arşivin bütünlüğünü test et (açmadan kontrol eder)
tar -tzvf yedek.tar.gz > /dev/null

# Daha kapsamlı test
tar --test-label -f yedek.tar.gz && echo "Arşiv sağlıklı" || echo "Arşiv bozuk!"

# gzip arşivinin bütünlüğünü gzip ile doğrula
gzip -t yedek.tar.gz && echo "OK" || echo "HATA"

Yedekleme scriptlerinize bu doğrulama adımını mutlaka ekleyin. Yedek aldığınızı zannederek yıllarca bozuk arşiv biriktiren sysadmin sayısı az değildir.

Arşive Dosya Ekleme ve Güncelleme

Mevcut bir arşive yeni dosya eklemek de mümkündür, ancak sıkıştırılmış arşivlerde bu işlem doğrudan yapılamaz.

# Sıkıştırmasız arşive dosya ekle
tar -rvf mevcut_arsiv.tar yeni_dosya.txt

# Birden fazla dosya ekle
tar -rvf mevcut_arsiv.tar dosya1.txt dosya2.txt /dizin/

# Arşivdeki dosyadan daha yeni olan dosyaları güncelle
tar -uvf mevcut_arsiv.tar guncellenen_dosya.txt

Sıkıştırılmış arşivlere (tar.gz, tar.bz2) doğrudan dosya eklenemez. Bu işlem için önce arşivi açmanız, dosyaları eklemeniz ve ardından yeniden arşivlemeniz gerekir.

Pratik İpuçları

İlerleme Durumunu Görmek

Büyük arşivleri işlerken -v parametresi her dosyayı yazdırdığı için bazen gürültülü olabilir. pv aracıyla daha temiz bir ilerleme çubuğu görebilirsiniz.

# pv ile ilerleme çubuğu (pv kurulu olmalı)
tar -czvf - /buyuk/dizin | pv > yedek.tar.gz

# Boyutu biliyorsanız yüzde de gösterir
tar -czvf - /buyuk/dizin | pv -s $(du -sb /buyuk/dizin | awk '{print $1}') > yedek.tar.gz

Arşiv Boyutunu Tahmin Etmek

# Dizinin sıkıştırılmamış boyutunu göster
du -sh /hedef/dizin

# Arşiv oluştururken toplam boyutu gör
tar -czvf yedek.tar.gz /hedef/dizin && ls -lh yedek.tar.gz

Paralel Sıkıştırma

Çok çekirdekli sunucularda pigz (parallel gzip) veya pbzip2 kullanarak sıkıştırma hızını artırabilirsiniz.

# pigz ile paralel gzip sıkıştırması
tar -cvf - /buyuk/dizin | pigz -9 > yedek.tar.gz

# pbzip2 ile paralel bzip2 sıkıştırması
tar -cvf - /buyuk/dizin | pbzip2 -9 > yedek.tar.bz2

# Açarken de paralel kullan
pigz -d -c yedek.tar.gz | tar -xvf -

10+ GB’lık arşivlerde paralel sıkıştırma ciddi zaman tasarrufu sağlar. Örneğin 8 çekirdekli bir sunucuda pigz, standart gzip‘e kıyasla 5-6 kat daha hızlı çalışabilir.

Sık Yapılan Hatalar

Hedef dizin yokken -C kullanmak: tar -xzvf arsiv.tar.gz -C /olmayan/dizin hata verir. Her zaman önce mkdir -p ile dizini oluşturun.

Arşivden açarken başında / olan yollar: Arşiv oluştururken tam yol kullandıysanız açarken de tam yol belirtmelisiniz. Aksi halde dosya bulunamaz.

–exclude ile yanlış yol belirtmek: --exclude parametresinde verdiğiniz yol, arşive eklenecek kaynak yolla uyumlu olmalıdır. Pattern kullanırken tırnak işareti olmadan yazmak shell tarafından yanlış yorumlanabilir.

Root yetkisi gereken dosyaları sıradan kullanıcıyla arşivlemek: /etc/shadow gibi dosyaları root olmadan arşivlemeye çalışırsanız “Permission denied” hatası alırsınız ve arşiv eksik oluşur.

Büyük arşivler için yeterli disk alanı olmamak: Arşiv oluştururken kaynak ve hedef aynı diskteyse disk dolabilir. Her zaman hedef dizinde yeterli alan olduğunu df -h ile kontrol edin.

Sonuç

tar komutu, sysadmin işlerinin tam ortasında duran bir araç. İlk bakışta karmaşık gözüken parametre kombinasyonları, biraz pratikle ikinci doğanız haline geliyor. Temel senaryoları şöyle özetleyebiliriz: oluşturmak için -czvf, açmak için -xzvf, listelemek için -tzvf. Bu üçlüyü ezberlemek işin yüzde seksenini karşılar.

Yedekleme scriptleri yazarken --exclude ile gereksiz dosyaları dışlamayı, izin gerektiren durumlarda -p ve --same-owner kullanmayı, oluşturduğunuz arşivleri mutlaka doğrulamayı alışkanlık haline getirin. Büyük arşivlerle çalışıyorsanız pigz gibi araçlarla paralel işlemeyi de değerlendirin.

Sonuç olarak tar, onlarca yıldır Linux ekosisteminin temel taşlarından biri olmaya devam ediyor ve bu durum pek değişmeyecek gibi görünüyor. Ne kadar iyi bilirseniz, günlük sistem yönetimi işlerinizde o kadar az zaman harcarsınız.

Yorum yapın