Tại sao trên Linux hay dùng những định dạng file nén như *.gz, *.xz thay vì *.zip, *.7z?

Những bạn đang dùng Windows mà tìm hiểu về Linux sẽ thấy trên Linux, những định dạng file nén quen thuộc như *.zip , *.7z lại không được ưa chuộng, mà lại thấy người ta hay sử dụng *.gz , *.tar.gz , *.zz , *.tar.xz , mặc dù cả định dạng và thuật toán của zip, 7zip đều là mã nguồn mở. Thế thì tại sao?

Đọc thêm tại đây.

9 Likes

Bài viết rất hay! Cảm ơn bạn!

1 Like

cái lý do uncompress “cuốn chiếu” là ở đâu nói vậy, tôi google thấy nó bảo là Linux xài gz xz là để giữ mấy permission bên Linux mà, vì zip ban đầu chỉ giữ các thuộc tính của msdos :V

3 Likes

Ngoài ra 7z không hỗ trợ các thuộc tính của Unix file system.

3 Likes

Bài bạn đọc là thiếu kiến thức nha. Trong bài mình có nói (không những nói mà còn chứng minh bằng dòng lệnh) là gzip hỗ trợ xử lý dữ liệu truyền ở dạng stream. Ở dạng stream, không phải file, thì làm gì có mấy permission?

Xử lý trên stream này chính là “cuốn chiếu”.

Còn khi tạo một file (bằng việc nén / giải nén một file khác), gzip chỉ đơn giản là copy permission của file gốc ra file mới tạo, chứ định dạng gzip không cần phải lưu thông tin permission của file.

Khi bạn đóng gói thư mục ra file *.tar.gz thì việc bảo lưu permission của các file trong thư mục là việc của tar, không phải của gzip.

4 Likes

nếu nói ko chọn dạng zip vì nó chậm hơn so với ko chọn zip vì nó ko cho lưu permission của Linux thì đương nhiên lý do vì nó làm mất permission là lý do bắt buộc chứ: zip lưu sai thông tin về tập tin. Còn chậm mà vẫn đúng thì có gì là ghê gớm đâu :V x abc | y thì y chờ x xử lý hết abc rồi output ra cũng được mà, đâu cần bắt buộc x abc phải streamable đâu, chậm hơn tí đâu phải là ko thể.

sau này zip nó có cho lưu permission thì mới có thể nói tới các yếu tố khác như streamable gì đó, nhưng lưu tar.* đã thành thói quen rồi nên ít ai xài zip. Mà sao gg thấy nó nói zip cũng là streamable format mà :V

echo hello world | zip hello.zip -
unzip -p hello

vậy được mà

3 Likes

y chờ x xử lý hết abc rồi output ra cũng được mà

Làm kiểu này thì phải chờ, chứ không làm kiểu cuốn chiếu được. Đâu phải ai cũng sẵn lòng chờ, có những muốn làm việc nhanh hơn thì stream mới đáp ứng nhu cầu của họ.

đâu cần bắt buộc x abc phải streamable đâu

Ở đây đâu ai nói “bắt buộc” đâu? Nhưng nếu hỗ trợ stream thì là lợi thế.

Mà sao gg thấy nó nói zip cũng là streamable format

Bài nào? Cứ lôi Google ra nhưng mà những đứa viết bài trên đó có phải đứa nào cũng đáng tin? Như cái dòng lệnh với zip mà ông đưa ra chỉ chứng minh lệnh zip hỗ trợ đầu vào là standard input chứ có chứng minh nó hỗ trợ giải nén trên stream đâu.
Chưa kể ông chạy thử cái lệnh đó chưa, có kiểm tra file hello.zip chưa hay nhắm mắt nhắm mũi tin ba bài viết tào lao trên Google?

Sau đây là bài viết chứng minh định dạng của zip không hỗ trợ stream.

A ZIP file is correctly identified by the presence of an end of central directory record which is located at the end of the archive structure

Tools that correctly read ZIP archives must scan for the end of central directory record signature

Hai câu trên cho thấy, muốn giải nén một file zip thì phải đọc từ đầu đến cuối file, để tìm ra “end of central directory record”. Phải đọc đến cuối file thì làm gì hỗ trợ stream được, vì khi nhận vào 1 stream, stream đó chưa chảy hết đến cuối thì chả bắt đầu làm được gì.

3 Likes

Về việc cuốn chiếu hay stream gì đó mình hổng rõ nhưng quả là đọc bài này thì cũng biết thêm ít thông tin càng thấy lịch sử Linux thú vị. Những nhà lập trình *nix xưa là những người rất am hiểu hệ thống, lọ mọ trên bàn phím rất chăm chút. Hoặc nói cách khác, họ là những thợ thủ công lành nghề, tạo ra những công cụ xịn sò. Kết quả là, với hàng tá những công cụ nhỏ gọn, hiệu quả cao đến mức M$ phải thèm thuồng, và sau thời Steve Ballmer đã thôi chửi Linux là… bệnh ung thư mà còn ve vãn, tích hợp cả vào hệ sinh thái của mình. Nhưng mà nói thật Linux có công cụ dòng lệnh mạnh, hiệu quả sẽ đi kèm là việc rất nguy hại nếu gà mờ, bất cẩn. Cần phải thật tỉnh táo khi gõ lệnh, nếu không có ngày khóc ròng, mình bị một lần, nhầm thế nào quét bay sạch dữ liệu, vô phương phục hồi vì đã bị ghi đè, thay đổi mất journal.

1 Like

có ktra rồi mà, trong hello.zip chỉ chứa 1 tập tin tên -

nếu chỉ có 1 file thì có thể xài local file header để giải nén: https://news.ycombinator.com/item?id=20356564 nhưng đó là hack thôi, đọc đúng thì phải đọc cái central record.

mà vì lý do streamable mà loại hẳn zip thay vì xài như 1 định dạng thứ 3 sau gz, xz thì nghe vô lý. Lý do nó ko lưu permission nên loại nó ra thì có lý hơn.

edit: với lại nếu có thêm tar thì làm sao là streamable được nữa, .tar.gz trước tiên phải giải nén hết thành 1 file tar rồi mới đọc từng file trong tar được chứ, vậy cũng đâu phải streamable. tar cũng streamable được :V :V

nếu ko lưu permission thì 1 file abc trong Linux có thể là executable, ko có permission x thì làm sao biết đó là executable, nên ban đầu Linux ko chọn zip đúng rồi. Zip xong unzip ra abc ko còn là executable nữa, phải gán x permission lại. Sau này zip có hỗ trợ lưu permission thì thoải mái thôi nhưng thói quen người ta mặc định ko install sẵn zip/unzip gì.

ví dụ có 3 file

abc r-x
def rw-
ghi r--

nén zip rồi unzip ra thành

abc rw- hay r--
def rw-     r--
ghi rw-     r--

đâu biết file nào là executable :V Ko lưu permission vậy ai dám xài zip/unzip. So với lý do streamable thì tuy là bất tiện, phải download hết file, lưu vào 1 thư mục temp nào đó, nhưng vẫn decompress ra đúng nội dung, nếu ko quan tâm tới permissions. Chưa kể nếu kĩ thì phải ktra cái checksum của file trước xem có download đúng file hay trong quá trình download có bị flip bit nào ko, nếu vậy thì cũng phải cần lưu ra 1 file tạm thôi. Cái lý do streamable để tăng tốc độ đâu có quan trọng bằng kiểm tra đúng file đúng permission.

2 Likes

Đó là chỉ ông thấy vô lý, chứ tôi và nhiều người khác thì rất đánh giá cao và “không thể sống thiếu được” tính năng stream này. Vụ permission thì không đáng bận tâm vì nó là “auto có” khi dùng một ứng dụng quan tâm đến thói quen của Linux user như gzip, xz rồi.

xem có download đúng file hay trong quá trình download có bị flip bit nào ko

Đã đụng tới download thì nguy cơ sai lệch thông tin trên đường truyền sẽ có, bất kể dùng ứng dụng giải nén nào, nên không thể đem nó ra để bào chữa cho zip. Tuy nhiên, vì gzip, xz có hỗ trợ ghi ra standard ouput nên có thể bọc trong SSH để đảm bảo không bị sai lệch thông tin trên đường truyền.

Cái lý do streamable để tăng tốc độ đâu có quan trọng bằng kiểm tra đúng file đúng permission.

Kết hợp các lệnh trên một máy thì sợ gì chuyện hư thông tin giữa chừng, còn permission thì thực tế tôi không quan tâm do nó là “sẵn có” khi dùng những ứng dụng hướng đến Linux user rồi.

2 Likes

cái streamable kia thì đâu có liên quan gì tới Linux. Đó là cho task cụ thể, ví dụ dump db từ server về máy thì có thể vì db quá lớn nên cần compress rồi mới send, và quá lớn ko đủ decompress 1 lần trong memory rồi mới write xuống disk lại thì có thể decompress từng byte một aka streamable. Như vậy tính năng streamable là xài cho task cụ thể đâu liên quan gì tới OS. Trên Windows nếu muốn dump db từ server về nếu dữ liệu lớn thì cũng phải xài gzip vậy, đâu có xài zip được.

permission là chỉ có ở Linux, ko có trên Windows. Cái rw thì na ná thuộc tính readonly/archive trên Win nhưng x hay .exe thì Win và Linux khác nhau. Ví dụ tạo ra 1 cái tool chuyển ảnh thành định dạng webp, trên Windows build ra cwebp.exedwebp.exe cùng với vài file dll khác, mấy file dll này ko có đuôi exe nên ko phải là file thực thi. Nén tất cả các file build ra bằng zip xong send qua máy khác để làm standalone tool, giải nén ra vẫn được cwebp.exedwebp.exe, Win vẫn nhận ra nó là file thực thi. Còn trên Linux thì build ra file cwebpdwebp, cùng vài file .so khác. File .so ko gán permission x nên gọi ./xxx.so nó ko chạy các file này, còn ./cwebp./dwebp nó chạy vì 2 file này có gán permission x. Nếu nén lại bằng zip rồi giải nén ra thì cwebpdwebp đều mất permission executable đi, gõ ./cwebp hoặc ./dwebp ko chạy được nữa, phải gán permission lại sau khi extract ra. Mất công vậy nên người ta ko xài zip để compress file(s) trong Linux. Rõ ràng đây mới là khác biệt liên quan tới OS chứ đâu phải khác biệt trong task cụ thể, ko liên quan tới OS như dump db từ sv về.

bây giờ zip có hỗ trợ permission rồi thì thích gzip hay zip là tùy vào dung lượng nén được bao nhiêu. xz nén ra ít dung lượng hơn nhưng nén cực kì chậm. Nhưng mà bây giờ người ta bắt đầu chuyển sang thuật toán nén mới là .zst zstandard rồi. Vừa nhanh hơn zip nghe đồn là chục lần vừa compress tốt ngang ngửa xz. Hình như Arch package xài .tar.zst.

3 Likes

Copy - Paste rồi phó mặc số phận thôi chứ ai mà nhớ được :roll_eyes:

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?