GNU tar neden çıkarırken yavaş?
(mort.coffee)- 518GiB’lik bir
tar.gzdosyası 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
prefixalanı 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ı
paxCLI üzerinden genişletilmiştir - UStar ile aynıdır ancak
xvegdosya formatları eklenmiştir
→ Genişletilmiş başlık kayıtları olarakxyalnızca sonraki dosyaya uygulanır,gise sonraki tüm dosyalara uygulanır
GNU Tar dosya formatı
- Kendi formatı
gnuolup 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üksefile_sizealanı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_pathiç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
tarkomutuna--absolute-pathsveya-Pseçeneğini eklemek gerekir
→ Mutlak yolları saklayan ve".."kullanımını reddeden seçenek
→ Yani-Pseç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?