- 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
1 yorum
Tar ile ilgili yazılar her zaman eğlenceli gibi geliyor..
hop - tar'dan 10 kat daha hızlı bir arşiv formatı
Neden Python ile oluşturulan tar.xz dosyası, varsayılan tar ile oluşturulan dosyadan daha küçük?