10 puan yazan xguru 2022-07-25 | 1 yorum | WhatsApp'ta paylaş
  • 518GiB’lik bir tar.gz dosyası açılırken aşırı yavaşlaması nedeniyle araştırmaya başlanmış
  • Tar formatına dair açıklama ve hızlı bir tar çıkarıcı kodu yazılırken yapılan açıklamalar

Orijinal Tar dosya formatı

  • Tar, arşiv dosyaları arasında oldukça sıra dışıdır
    → Arşiv başlığı yoktur, arama için dosya indeksi yoktur, bunun tar olduğunu doğrulayacak magic byte yoktur, footer yoktur ve metadata yoktur
    → Tar içinde bulunan tek şey tek bir tür dosya nesnesidir
  • Dosya tipleri: 0 (normal dosya), 1 (hard link), 2 (sembolik bağlantı)
  • 512 baytlık dosya nesnesi başlığının yapısının açıklaması
    → En büyük kısıt, dosya yolu uzunluğunun yalnızca 100 karakter olmasıdır. Ayrıca dosya boyutu en fazla 8GiB olabilir

UStar genişletilmiş dosyası

  • Dosya yolu uzunluğu en fazla 256’dır ve yeni dosya tipleri eklenmiştir
  • Başlık genişletilerek magic byte ve prefix alanı eklenmiştir
  • Eklenen dosya tipleri: 3 (karakter aygıtı), 4 (blok aygıtı), 5 (dizin), 6 (FIFO dosyası), 7 (ardışık dosya)
  • Ancak 8GiB boyut sınırı hâlâ devam eder

Pax dosya formatı

  • POSIX.1-2001 standardı olarak, tar formatı pax CLI üzerinden genişletilmiştir
  • UStar ile aynıdır ancak x ve g dosya formatları eklenmiştir
    → Genişletilmiş başlık kayıtları olarak x yalnızca sonraki dosyaya uygulanır, g ise sonraki tüm dosyalara uygulanır

GNU Tar dosya formatı

  • Kendi formatı gnu olup pax’tan farklıdır
  • Pax’a benzer şekilde UStar tabanlıdır ancak yol ve büyük dosyaları kodlamak için farklı yöntemler kullanır
    'L' tipi: sonraki dosya nesnesinin payload’u "file_path" anlamına gelir
    'K' tipi: sonraki dosya nesnesinin payload’u "link_path" anlamına gelir
    → İkisi art arda uygulanabilir
    → Dosya 8GiB’den büyükse file_size alanının ilk karakterinin high bit’i ayarlanır. Böylece dizgenin geri kalanı base 256 olarak parse edilir (95 bit tamsayı)

GNU tar neden açarken yavaş?

  • Dosyanın başlığına file_path="../hello.txt" gibi bir değer konulursa güvenlik sorunu oluşur. Ancak bunu engellemek kolay değildir
  • GNU tar, link_path içinde ".." gördüğünde bir placeholder oluşturur ve işlemi geciktirerek ele alır
  • Ancak ".." içermeyen hard link durumunda doğrudan oluşturmak ister, fakat zaten placeholder bulunduğu için oluşturamaz
  • Yani bir hard link oluşturmak için önce bunun geciktirilmiş bağlantı olup olmadığını tamamen kontrol etmesi gerekir; öyleyse yeni bağlantı da yine geciktirilmiş olarak işlenmelidir
    → Tüm hard linkler için geciktirilmiş bağlantıları taraması gerekir. Sebebi bilinmiyor ama pratikte bunu iki kez yapar
  • Yazarın Tar dosyasında ".." içeren 800 binden fazla bağlantı ve 5,4 milyondan fazla hard link bulunduğu için açma işlemi yavaşlamış
  • Bunu önlemek için tar komutuna --absolute-paths veya -P seçeneğini eklemek gerekir
    → Mutlak yolları saklayan ve ".." kullanımını reddeden seçenek
    → Yani -P seçeneği verilirse geciktirilmiş bağlantılama mekanizması devre dışı kalır