- Bắt đầu điều tra vì việc giải nén một file tar.gz 518GiB trở nên cực kỳ chậm
- Giải thích về định dạng Tar và mô tả trong lúc viết mã cho một tar extractor nhanh
Định dạng file Tar nguyên bản
- Tar là trường hợp rất khác thường đối với một file lưu trữ
→ Không có header của kho lưu trữ, không có chỉ mục file để tìm kiếm, không có magic byte để xác nhận đó là tar, không có footer, cũng không có metadata
→ Trong tar chỉ có đúng một loại đối tượng là đối tượng file
- Loại file: 0 (file thông thường), 1 (hard link), 2 (symbolic link)
- Mô tả cấu trúc của header đối tượng file 512 byte
→ Giới hạn lớn nhất là đường dẫn file chỉ dài tối đa 100 ký tự. Ngoài ra kích thước file tối đa là 8GiB
File mở rộng UStar
- Độ dài đường dẫn file tối đa là 256 và bổ sung các loại file mới
- Mở rộng header để thêm magic byte và trường prefix
- Bổ sung loại file: 3 (character device), 4 (block device), 5 (thư mục), 6 (file FIFO), 7 (file liên tục)
- Nhưng giới hạn kích thước 8GiB vẫn giữ nguyên
Định dạng file Pax
- Mở rộng định dạng tar thông qua CLI pax theo chuẩn POSIX.1-2001
- Giống UStar nhưng thêm các định dạng file x và g
→ Là các bản ghi header mở rộng, trong đó x chỉ áp dụng cho file kế tiếp còn g áp dụng cho mọi file phía sau
Định dạng file GNU Tar
- Định dạng riêng của nó là gnu và khác với pax
- Tương tự pax ở chỗ dựa trên UStar, nhưng dùng phương pháp khác để mã hóa đường dẫn và file lớn
→ Kiểu 'L': payload của đối tượng file kế tiếp biểu thị file_path
→ Kiểu 'K': payload của đối tượng file kế tiếp biểu thị link_path
→ Có thể áp dụng liên tiếp cả hai
→ Nếu file lớn hơn 8GiB thì đặt bit cao của ký tự đầu tiên của file_size. Khi đó phần còn lại của chuỗi sẽ được phân tích theo base 256 (số nguyên 95 bit)
Vì sao GNU tar giải nén chậm?
- Nếu chèn giá trị như
file_path="../hello.txt" vào header của file thì sẽ phát sinh vấn đề bảo mật. Nhưng việc ngăn chặn không hề dễ
- GNU tar tạo placeholder khi gặp
".." trong link_path và xử lý theo kiểu trì hoãn
- Tuy nhiên, với hard link không có
"..", lẽ ra tar muốn tạo trực tiếp, nhưng vì placeholder đã tồn tại nên không thể tạo
- Tức là để tạo hard link, trước tiên nó phải kiểm tra hết xem đó có phải delayed link hay không, và nếu đúng thì link mới cũng phải bị trì hoãn
→ Với mọi hard link, nó phải dò qua các delayed link. Không rõ vì sao nhưng trên thực tế nó dò tới 2 lần
- Trong file Tar của tác giả có hơn 800 nghìn link chứa
".." và hơn 5,4 triệu hard link, nên việc giải nén đã chậm đi
- Để tránh điều này, hãy thêm tùy chọn
--absolute-paths hoặc -P cho tar
→ Đây là tùy chọn lưu đường dẫn tuyệt đối và từ chối ".."
→ Tức là khi dùng tùy chọn -P, cơ chế delayed linking sẽ bị vô hiệu hóa
1 bình luận
Mấy bài viết liên quan đến Tar lúc nào cũng thấy thú vị..
hop - định dạng lưu trữ nhanh hơn tar 10 lần
Tại sao file tar.xz tạo bằng Python lại nhỏ hơn file tạo bằng tar mặc định?