- Penyelidikan dimulai karena proses mengekstrak
tar.gz berukuran 518GiB menjadi sangat lambat
- Menjelaskan format tar sambil menulis kode extractor tar yang cepat
Format file Tar asli
- Tar sangat tidak lazim sebagai file arsip
→ Tidak ada header arsip, tidak ada indeks file untuk pencarian, tidak ada magic byte untuk memverifikasi bahwa itu tar, tidak ada footer, dan tidak ada metadata
→ Yang ada di dalam tar hanyalah satu jenis objek file
- Tipe file: 0 (file biasa), 1 (hard link), 2 (tautan simbolik)
- Penjelasan struktur header objek file 512-byte
→ Batasan terbesar adalah panjang path file hanya 100 karakter. Selain itu, ukuran file maksimum adalah 8GiB
File ekstensi UStar
- Panjang path file hingga 256 dan menambahkan tipe file baru
- Memperluas header dengan menambahkan magic byte dan field prefix
- Penambahan tipe file: 3 (character device), 4 (block device), 5 (direktori), 6 (file FIFO), 7 (file kontinu)
- Namun batas ukuran 8GiB masih tetap ada
Format file Pax
- Memperluas format tar melalui CLI pax sebagai standar POSIX.1-2001
- Sama seperti UStar, tetapi menambahkan format file x dan g
→ Sebagai rekaman header ekstensi, x hanya berlaku untuk file berikutnya, sedangkan g berlaku untuk semua file setelahnya
Format file GNU Tar
- Format miliknya sendiri adalah gnu dan berbeda dari pax
- Mirip dengan pax karena berbasis UStar, tetapi menggunakan metode berbeda untuk mengenkode path dan file besar
→ Tipe L: payload objek file berikutnya merepresentasikan "file_path"
→ Tipe K: payload objek file berikutnya merepresentasikan "link_path"
→ Keduanya bisa diterapkan secara berurutan
→ Jika file lebih besar dari 8GiB, bit tinggi pada karakter pertama file_size di-set. Setelah itu sisa string diparse sebagai base 256 (integer 95-bit)
Mengapa GNU tar mengekstrak kompresi dengan lambat?
- Jika memasukkan nilai seperti
file_path="../hello.txt" ke header file, itu menimbulkan masalah keamanan. Namun, tidak mudah untuk mencegahnya
- GNU tar membuat placeholder ketika menemukan
".." di link_path dan memprosesnya secara tertunda
- Namun untuk hard link tanpa
"..", sebenarnya ingin dibuat langsung, tetapi karena placeholder sudah ada maka tidak bisa dibuat
- Artinya, untuk membuat hard link, harus lebih dulu memeriksa apakah itu delayed link, dan jika ya, link baru itu juga harus diproses tertunda
→ Semua hard link harus mencari delayed link. Tidak jelas alasannya, tetapi dalam praktiknya pencarian dilakukan 2 kali
- Dalam file Tar milik penulis ada lebih dari 800 ribu link yang mengandung
".." dan lebih dari 5,4 juta hard link, sehingga ekstraksi menjadi lambat
- Untuk mencegah hal ini, tambahkan opsi
--absolute-paths atau -P ke tar
→ Opsi untuk menyimpan path absolut dan menolak ".."
→ Dengan kata lain, memberikan opsi -P akan menonaktifkan mekanisme delayed linking
1 komentar
Tulisan tentang tar sepertinya selalu menarik..
hop - format arsip yang 10x lebih cepat daripada tar
Mengapa file tar.xz yang dibuat dengan Python lebih kecil daripada file yang dibuat dengan tar bawaan?