10 poin oleh xguru 2022-07-25 | 1 komentar | Bagikan ke WhatsApp
  • 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