ทำไม GNU tar ถึงแตกไฟล์ช้า
(mort.coffee)- เริ่มสืบสวนเพราะการแตกไฟล์
tar.gzขนาด 518GiB ช้าลงอย่างมาก - อธิบายเกี่ยวกับฟอร์แมต Tar พร้อมทั้งเขียนโค้ด tar extractor แบบรวดเร็วไปด้วย
ฟอร์แมตไฟล์ Tar ดั้งเดิม
- Tar เป็นฟอร์แมตไฟล์เก็บถาวรที่แปลกมากเมื่อเทียบกับฟอร์แมตอื่น
→ ไม่มีส่วนหัวของอาร์ไคฟ์, ไม่มีดัชนีไฟล์สำหรับการค้นหา, ไม่มี magic byte สำหรับยืนยันว่าเป็น tar, ไม่มี footer และไม่มี metadata
→ สิ่งที่อยู่ใน Tar มีเพียงอ็อบเจ็กต์ไฟล์ชนิดเดียว - ประเภทไฟล์: 0 (ไฟล์ปกติ), 1 (ฮาร์ดลิงก์), 2 (ซิมโบลิก์ลิงก์)
- คำอธิบายโครงสร้างของส่วนหัวอ็อบเจ็กต์ไฟล์ขนาด 512 ไบต์
→ ข้อจำกัดใหญ่ที่สุดคือความยาวพาธของไฟล์มีได้เพียง 100 ตัวอักษรเท่านั้น และขนาดไฟล์สูงสุดคือ 8GiB
ไฟล์ส่วนขยาย UStar
- ความยาวพาธของไฟล์เพิ่มได้สูงสุด 256 ตัวอักษร และเพิ่มประเภทไฟล์ใหม่
- ขยายส่วนหัวโดยเพิ่ม magic byte และฟิลด์ prefix
- เพิ่มประเภทไฟล์: 3 (character device), 4 (block device), 5 (ไดเรกทอรี), 6 (ไฟล์ FIFO), 7 (ไฟล์ต่อเนื่อง)
- แต่ข้อจำกัดขนาด 8GiB ยังคงอยู่
ฟอร์แมตไฟล์ Pax
- มาตรฐาน POSIX.1-2001 ขยายฟอร์แมต tar ผ่าน CLI ของ pax
- เหมือนกับ UStar แต่เพิ่มฟอร์แมตไฟล์ x และ g
→ ในฐานะระเบียนส่วนหัวส่วนขยาย x จะมีผลกับไฟล์ถัดไปเท่านั้น ส่วน g จะมีผลกับทุกไฟล์หลังจากนั้น
ฟอร์แมตไฟล์ GNU Tar
- ฟอร์แมตเฉพาะของตัวเองคือ gnu และแตกต่างจาก pax
- คล้าย pax ตรงที่อิงกับ UStar แต่ใช้วิธีอื่นในการเข้ารหัสพาธและไฟล์ขนาดใหญ่
→ ชนิดL: payload ของอ็อบเจ็กต์ไฟล์ถัดไปจะแทนค่า"file_path"
→ ชนิดK: payload ของอ็อบเจ็กต์ไฟล์ถัดไปจะแทนค่า"link_path"
→ ใช้สองอย่างนี้ต่อเนื่องกันได้
→ หากไฟล์มีขนาดใหญ่กว่า 8GiB ให้ตั้งค่าไฮบิตของอักขระตัวแรกของfile_sizeจากนั้นจึง parse ส่วนที่เหลือของสตริงเป็น base 256 (จำนวนเต็ม 95 บิต)
ทำไม GNU tar ถึงแตกไฟล์ช้า?
- หากใส่ค่าอย่าง
file_path="../hello.txt"ลงในส่วนหัวของไฟล์ จะเกิดปัญหาด้านความปลอดภัย แต่ป้องกันได้ไม่ง่าย - GNU tar จะสร้าง placeholder และหน่วงการประมวลผลไว้เมื่อพบ
".."ในlink_path - แต่ในกรณีของฮาร์ดลิงก์ที่ไม่มี
".."แม้อยากสร้างโดยตรงก็ทำไม่ได้ เพราะมี placeholder อยู่แล้ว - กล่าวคือ หากจะสร้างฮาร์ดลิงก์ ต้องตรวจสอบก่อนทั้งหมดว่ามันเป็น delayed link หรือไม่ และถ้าใช่ ลิงก์ใหม่ก็ต้องถูกหน่วงไว้เช่นกัน
→ จึงต้องค้นหา delayed link สำหรับฮาร์ดลิงก์ทุกตัว และแม้ไม่ทราบเหตุผล แต่ในทางปฏิบัติจะค้นหาถึง 2 รอบ - ในไฟล์ Tar ของผู้เขียนมีลิงก์ที่มี
".."มากกว่า 800,000 รายการ และมีฮาร์ดลิงก์มากกว่า 5.4 ล้านรายการ จึงทำให้การแตกไฟล์ช้า - เพื่อป้องกันปัญหานี้ ให้เพิ่มตัวเลือก
--absolute-pathsหรือ-Pให้กับ tar
→ เป็นตัวเลือกที่เก็บพาธแบบสัมบูรณ์และปฏิเสธ".."
→ กล่าวคือ เมื่อใส่ตัวเลือก-Pจะเป็นการปิดกลไก delayed linking
1 ความคิดเห็น
บทความเกี่ยวกับ Tar ดูน่าสนุกเสมอเลยครับ..
hop - ฟอร์แมตอาร์ไคฟ์ที่เร็วกว่า tar 10 เท่า
ทำไมไฟล์ tar.xz ที่สร้างด้วย Python ถึงเล็กกว่าไฟล์ที่สร้างด้วย tar ปกติ?