tar là công cụ đóng gói kinh điển của Unix, nhưng cái tên đầy chữ cái khó nhớ (czf, xzf, tvf...) khiến nhiều người dùng theo trí nhớ máy móc mà không hiểu, rồi mắc hai lỗi tốn kém: tưởng tar tự nén, và đặt sai thứ tự cờ khiến archive tạo ra rỗng hoặc ghi đè mất dữ liệu. Bài này (phần 9 loạt Unix) chạy tar thật để làm rõ nó thực sự làm gì, so các thuật toán nén bằng số đo, và chỉ ra cái bẫy thứ tự cờ.
tar chỉ GỘP — nén là bước riêng
Điều đầu tiên cần khắc sâu: tar tự nó KHÔNG nén. Tên viết tắt của tape archive — nó ra đời để gom nhiều file thành một luồng ghi ra băng từ. Gộp và nén là hai việc khác nhau; tar lo phần gộp, còn nén là do gzip/zstd/xz.
tar cf goi.tar data # c=create, f=file — GỘP, không nén
tar xf goi.tar # x=extract — giải gộp
tar tf goi.tar # t=list — xem nội dung
Đo thật: thư mục data 4.9M gộp thành goi.tar cũng 4.9M — bằng đúng tổng kích thước file gốc (thực tế còn hơi lớn hơn do metadata). Không có byte nào được nén.

Hình 1: tar gộp (c/x/t + f), thêm cờ nén z(gzip)/j(bzip2)/J(xz) hoặc -a tự đoán; bẫy thứ tự cờ -f phải ngay trước tên archive; và cách chọn gzip/zstd/xz.
Thêm nén, và so bằng số đo thật
Thêm một chữ cái là có nén: z cho gzip, j cho bzip2, J cho xz, hoặc -a để tar tự chọn theo đuôi tên file. Đo thật trên cùng dữ liệu (text lặp nén tốt + 1MB ngẫu nhiên nén kém):

Hình 2: Chạy thật — tar cf không nén = 4.9M; czf gzip = 992K, zstd = 996K; gzip 0,03s→992K vs zstd -19 0,05s→980K; tar tzf liệt kê 22 mục không cần giải nén; bẫy thứ tự cờ tar -cf data goi2.tar báo Is a directory.
- Nén ăn thua rất nhiều: 4.9M xuống còn ~990K (giảm ~80%) — nhờ phần text lặp. Phần 1MB ngẫu nhiên gần như không nén được, nên tổng không thể nhỏ hơn nhiều so với 1MB đó.
- gzip vs zstd: đo thật gzip cho 992K trong 0,03s;
zstd -19(mức nén cao) cho 980K trong 0,05s — nén chặt hơn một chút và vẫn rất nhanh. Với dữ liệu nén tốt hơn, khoảng cách zstd/xz vs gzip thường rõ hơn; ở đây phần ngẫu nhiên làm mờ khác biệt (báo cáo trung thực).
Xem nội dung không cần giải nén
tar tf (thêm z nếu nén: tar tzf) liệt kê nội dung archive mà không giải ra đĩa — đo thật cho ra danh sách file và tổng 22 mục. Cực hữu ích để kiểm một archive lạ chứa gì (và cấu trúc thư mục ra sao) trước khi giải, tránh "tar bomb" đổ hàng nghìn file ra thư mục hiện tại.
Cái bẫy thứ tự cờ
Đây là lỗi khiến nhiều người tạo nhầm archive hoặc mất file. Chữ ngay sau f là tên archive — nên archive phải đứng trước danh sách file cần gộp:
tar -cf data goi.tar # SAI: tar tưởng "data" là archive, "goi.tar" là thứ cần gộp
tar -cf goi.tar data # ĐÚNG: archive trước, nội dung sau
Đo thật, lệnh sai báo tar: data: Cannot open: Is a directory (vì nó cố ghi archive vào data là thư mục). Nguy hiểm hơn: nếu bạn đảo hai file thường, tar có thể ghi đè lên file dữ liệu bằng archive — mất dữ liệu. Quy tắc vàng: luôn tar -cf <archive> <nội-dung>, archive đứng ngay sau -f.
Đánh đổi cần cân nhắc
Chọn thuật toán theo mục đích, không mặc định gzip mãi. gzip (.gz) nhanh và tương thích mọi nơi — an toàn nhất cho chia sẻ. zstd (.zst) nén tốt hơn và giải cực nhanh — lựa chọn mặc định hiện đại cho backup/CI. xz (.xz) nén chặt nhất nhưng chậm — hợp cho thứ nén một lần, tải nhiều lần (bản phát hành phần mềm). Đừng dùng xz cho backup hằng ngày vì thời gian nén tốn kém.
Nén không giúp gì với dữ liệu đã nén. Ảnh JPEG, video MP4, file .zip/.gz sẵn — nén lại gần như vô ích (như 1MB ngẫu nhiên ở demo). tar chúng để gộp thì được, nhưng thêm z/J chỉ tốn CPU mà không giảm dung lượng. Biết dữ liệu của mình trước khi chọn mức nén.
Cẩn thận đường dẫn tuyệt đối và tar bomb khi giải. Giải một archive lạ có thể đổ file ra khắp nơi hoặc (với archive độc) ghi ra đường dẫn tuyệt đối. Luôn tar tzf xem trước, giải vào một thư mục rỗng, và tar hiện đại đã chặn đường dẫn ../tuyệt đối theo mặc định — nhưng đừng ỷ lại.
Ba ý mang về
- tar chỉ gộp, nén là bước riêng: đo thật
tar cfcho archive 4.9M bằng tổng file gốc (không nén); thêmz/amới nén xuống ~990K. Nhớc=tạo,x=giải,t=xem,f=file. - Chọn thuật toán theo mục đích: đo thật gzip (0,03s→992K) và zstd -19 (0,05s→980K); gzip cho tương thích, zstd cho backup/CI (giải nhanh), xz cho phát hành một lần — và nén lại dữ liệu đã nén là vô ích.
- Bẫy thứ tự cờ
-f: đo thậttar -cf data goi.tarbáoIs a directory; chữ ngay sauflà tên archive, luôn viếttar -cf <archive> <nội-dung>— đảo sai có thể ghi đè mất file. Dùngtar tzfxem trước khi giải.
Nguồn
- GNU tar manual: https://www.gnu.org/software/tar/manual/tar.html
- man7.org — tar(1): https://man7.org/linux/man-pages/man1/tar.1.html
- Facebook zstd — Zstandard: https://facebook.github.io/zstd/
Phần sau ta đi vào hệ thống quyền của Unix: đọc/ghi/thực thi, số bát phân chmod 755, và umask quyết định quyền mặc định của file mới mà nhiều người không để ý.