Giới thiệu về Công cụ Nén file trên Linux Server

6 năm trước

Giới thiệu về Công cụ Nén file trên Linux Server

 

Có nhiều lý do cho việc nén tập tin và thư mục trên máy tính. Một số lợi ích dễ thấy là tiết kiệm không gian đĩa và sử dụng ít băng thông cho việc truyền tin.

Trong hướng dẫn này, ta sẽ thảo luận về một số phương pháp nén dữ liệu khác nhau và ưu nhược điểm của chúng. Ta cũng sẽ đề cập đến một số vấn đề liên quan, chẳng hạn nhưu ván đề lưu trữ để các công cụ nén linh hoạt hơn.

Các công cụ dưới đây được cài đặt trên Ubuntu 12.04 VPS, nhưng nó cũng hoạt động bình thường trên các bản phân phối Linux khác.

 

Tổng quan về Nén và Lưu trữ

 

Nén (Compression) là phương pháp làm giảm dung lượng của file trên ổ đĩa bằng các thuật toán khác nhau. File được định dạng trong một số cách mà làm cho cấu trúc chung của chúng phần nào có thể dự đoán được, ngay cả khi nội dung của chúng khác nhau. Bên cạnh đó, nội dung chính của file thường được lặp đi lặp lại.

Nén có tổn hao( Lossy Compression) và nén không tổn hao( Lossless Compression)

Khi thảo luận nén liên quan đến máy tính và các loại tập tin, một số thuật ngữ sau có thể có nghĩa khác nhau tùy thuộc vào ngữ cảnh. Hãy lấy ví dụ một file nhạc MP3. MP3 là một tập tin âm thanh nén được sử dụng để tạo ra một tập tin nhỏ hơn từ một tập tin nhạc nguồn lớn hơn.

Phương pháp nén này về cơ bản là khác với những gì chúng ta sẽ nói về trong hướng dẫn này, do một MP3 được tạo ra bằng cách phân tích dạng sóng của tập tin âm thanh và về cơ bản tìm những phần dữ liệu mà nó có thể vứt bỏ vĩnh viễn trong khi vẫn duy trì tinh thần hay âm thanh chung của bản gốc.

Quá trình này được gọi là nén có tổn hao,  vì thông tin của file gốc bị loại bỏ một cách đúng nghĩa, và bạn không thể convert file MP3 về lại file gốc ban đầu.

Việc nén có thể không gây chú ý cho người sử dụng, nhưng nó không chứa tất cả các thông tin có liên quan của bản gốc. Tỷ lệ nén càng cao cao, quá trình nén càng ảnh hưởng đến các phần quan trọng của âm thanh.

Một ví dụ khác của nén có tổn hao là file ảnh JPEG. Càng được nén mạnh bao nhiêu, dữ liệu quan trọng càng bị mất và ảnh hưởng cảu việc nén càng rõ ràng. Một tiện ích nén JPEG sẽ cố gắng tìm những trường màu sắc đủ gần với nhau và thay thế các trường với một màu duy nhất.Tỷ lệ nén càng lớn, càng nhiều màu sắc sẽ được bao phủ theo cách này.

Một phương pháp khác được đề cập ở đây là nén không tiêu hao.  Phương pháp này tạo ra những file nhỏ hơn có thể dùng để dựng lại file gốc. Đây là loại nén không sử dụng xấp xỉ để nén dữ liệu,thay vào đó sử dụng thuật toán nhất định để nhận các phần lặp đi lặp lại của một tập tin. Nó loại bỏ những phần này và thay thế chúng bằng một placeholder. Nó tiếp tục trên và thay thế xuất hiện sau của mẫu bằng cách tham chiếu đến placeholder tương ứng.

Điều này cho phép các máy tính lưu trữ các thông tin trên ít không gian đĩa hơn. Quá trình này có thể được hình dung như việc tạo ra một danh sách các biến mà xác định các khối dữ liệu, và sau đó sử dụng các biến đó để điền vào trong chương trình. Thực ra việc này cũng giống với hai giai đoạn mà kỹ thuật nén lossless sử dụng: ánh xạ giá trị lặp lại với xác suất cao đến một thứ nhỏ hơn mà có thể dễ dàng tham chiếu đến và sau đó thay đổi lần xuất hiện sau của của giá trị đó băng giá trị tham chiếu.

Hơn nữa, kĩ thuật nén lossless còn có tính thích ứng cao, nghĩa là không cần xác định cụ thể định dạng file nguồn và tạo "từ điển" của các tham chiếu cho nó. Thay vào đó, nó phân tích các tập tin và rewrite "từ điển" đó dựa trên những dữ liệu thực sự lặp đi lặp lại trên file cụ thể. Từ điển dần dần trở nên hiệu quả hơn khi quá trình này tiếp tục.

Sơ lược về lưu trữ

 

Ý tưởng của "lưu trữ" dữ liệu nói chung có nghĩa là sao lưu và lưu trữ nó đến một vị trí an toàn, thường là trong một định dạng nén. Một "lưu trữ" trên một máy chủ Linux nói chung có một ý nghĩa hơi khác nhau. Thông thường, nó dùng để chỉ một tập tin tar.

Về mặt lịch sử, dữ liệu từ các máy chủ thường được sao lưu vào băng từ,là các thiết bị có thể được sử dụng để lưu trữ dữ liệu tuần tự. Đây vẫn là phương pháp sao lưu ưa thích đối với một số ngành công nghiệp. Để thực hiện điều này một cách hiệu quả, chương trình tar đã được tạo ra để bạn có thể giải quyết và xử lý nhiều tập tin trong một hệ thống tập tin, với các điều khoản còn nguyên vẹn và siêu dữ liệu, như một tập tin. Sau đó bạn có thể trích xuất một tập tin hoặc toàn bộ hệ thống tập tin từ kho lưu trữ.

Về cơ bản, một file tar là một định dạng tập tin mà tạo ra một cách thuận tiện để phân phối, lưu trữ, sao lưu, và thao tác một nhóm các file liên quan. Ta sẽ nói về việc lưu trữ trong hướng dẫn này vì tài liệu lưu trữ thường được nén trong quá trình lưu trữ để lưu trữ dữ liệu một cách hiệu quả hơn.

 

So sánh các Công cụ Nén khác nhau

 

gzip Compression

gzip là công cụ tiêu biều cho  phương pháp nén dữ lệu cổ điển trên Linux. Nó được giới thiệu vào n ăm 1992 và vẫn đang được phát triển.

gzip sử dụng thuật toán "DEFLATE" ( nén xẹp),thuật toán được sử dụng trong nhiều kĩ thuật khác như ảnh PNG , giao thức HTTP, và giao thức bảo mật SSH.

Một trong những ưu điểm chính của nó là tốc độ. Nó có thể vừa nén vừa giải nén dữ liệu với tốc độ cao hơn nhiều so với một số công nghệ cạnh tranh, đặc biệt là khi so sánh dạng nén nhỏ gọn nhất của mỗi tiện ích. Nó cũng rất tiết kiệm tài nguyên bộ nhớ trong quá trình nén và giải nén, và dường như không đòi hỏi nhiều bộ nhớ hơn khi tối ưu hóa quá trình nén.

Một yếu tố nữa là khả năng tương thích. Mặc dù gzip là một công cụ cũ như vậy, hầu hết các hệ thống Linux đều có nó như một công cụ có sẵn để xử lý các dữ liệu.

Nhược điểm lớn nhất của nó là nó nén dữ liệu ít triệt để hơn một số lựa chọn khác. Nếu bạn đang làm rất nhiều lần nén và giải nén, đây có thể là một định dạng tốt cho bạn, nhưng nếu bạn có kế hoạch để nén một lần và lưu trữ các tập tin, những lựa chọn khác sẽ phù hợp hơn.

Các file gzip được lưu với phần mở rộng .gz. Bạn có thể nén file với gzip bằng lệnh:

gzip sourcefile

Lệnh này nén file và lưu nó thành sourcefile.gz .

Nếu muốn nén cả thư mục, sử dụng thêm cờ -r như sau:

gzip -r directory1

Lệnh này sẽ di chuyển vào trong một thư mục và nén từng file chứa trong nó. Nó không được ưu tiên, vì bình thường ta muốn nén cả thư mục vào một file đơn lẻ theo cách được trình bày dưới đây

Dùng cờ -l để xem thông tin chi tiết về file nén:

gzip -l test.gz
 compressed uncompressed ratio uncompressed_name
5133 14073 63.7% test

Nếu muốn truyền kết quả đến một tiện ích khác,ta có thể dùng cờ -c như sau:

gzip -c test > test.gz

Bạn cũng có thể tùy chỉnh quá trình nén với các cờ được đánh số từ 1 đến 9. Cờ -1 ( tương đương với --fast) cho kết quả nhanh nhất nhưng kém hiệu quả nhất.  Cờ -9  (tương đương với --best) cho kết quả nén tối ưu nhất có thể, nhưng tốc độ nén chậm nhất. Cờ mặc định là -6 , cho kết quả cân bằng giữa tốc độ và hiệu suất nén.

gzip -9 compressme

Để giải nén một file, sử dụng cờ -d với gzip hoặc một lệnh tương đương là gunzip

gzip -d test.gz

bzip2 Compression

Một công cụ nén phổ biến khác là bzip2

Được giới thiệu vào năm 1996, bzip2 được phát triển để như một bản nâng cấp thay thế cho gzip.

bzip2 sử dụng một thuật toán Burrows-Wheeler. Khác biệt về thuật toán sử dụng khiến nó có đặc điểm khác với gzip.

Lợi ích quan trọng nhất cho hầu hết người dùng là hiệu suất nén cao hơn với chi phí của thời gian nén lâu hơn. Các công cụ bzip2 có thể tạo ra nhiều hơn đáng kể các file nhỏ gọn hơn gzip, nhưng mất nhiều thời gian để đạt được kết quả do sử dụng một thuật toán phức tạp hơn.

May mắn là thời gian giải nén không ảnh hưởng nhiều như thời gian nén, vì vậy phân phối các file bằng cách sử dụng định dạng bzip2 sẽ mang đến thuận lợi vì bạn sẽ chỉ phải chịu chi phí thời gian trong quá trình nén và có thể phân phối các file nhỏ hơn có thể được giải nén trong một lượng thời gian hợp lý. Thời gian giải nén vẫn là lớn hơn nhiều so với gzip, nhưng không lớn như các hoạt động nén.

Một điều cần lưu ý là bzip2 yêu cầu bộ nhớ lớn hơn gzip. Điều này sẽ không có ảnh hưởng đến hầu hết các thiết bị, nhưng trên các thiết bị nhúng cỡ nhỏ, điều này có thể ảnh hưởng đến sự lựa chọn của bạn. Bạn có thể tùy chọn thông qua cờ -s, để cắt giảm các yêu cầu bộ nhớ khoảng một nửa, nhưng cũng sẽ dẫn đến một tỷ lệ nén thấp hơn.

Các file nén sử dụng phương pháp này có phần mở rộng .bz2

Để tạo một file nén bzip2 , dùng lệnh:

bzip2 afile

File nén sẽ có tên "afile.bz2".

Như đã đề cập, ta có thể dùng cờ -s như sau:

bzip2 -s afile

bzip2 thực thi các cờ số khác với gzip. Ở đây, các cờ số đại diện cho kích thước khối mà các tiện ích quản lý để thực hiện nén của nó, vì vậy đây là một phép đo bộ nhớ sử dụng với kích thước nén, chứ không phải là thời gian vs kích thước nén. Cờ mặc định là cờ -9 , cho hiệu suất nén tối ưu với bộ nhớ sử dụng tối đa:

bzip2 -1 file

Để giải nén một file bzip ta có thể sử dụng cờ -d :

bzip2 -d file.bz2

xz Compression

 

Một công cụ nén khác được đề cập ở đây là xz. Nó được lần đầu tiên phát hành vào năm 2009, và đã đạt được một chỗ đứng ổn định kể từ đó.

Các tiện ích nén xz tận dụng một thuật toán nén được gọi là LZMA2. Thuật toán này có tỷ lệ nén cao hơn so với hai ví dụ trước, làm cho nó trở thành một lựa chọn tuyệt vời khi bạn cần phải lưu trữ dữ liệu trên không gian đĩa hạn chế.

Đi kèm với hiệu suất cao là chi phí, giống như vấn đề của bzip2. Trong khi các file nén mà xz sản xuất có kích thước nhỏ hơn so với các tiện ích khác, nó mất nhiều thời gian đáng kể để thực hiện nén. Ví dụ, với những cờ nén nặng trên một tập tin khá lớn, gzip có thể yêu cầu khoảng nửa phút, bzip2 khoảng một phút, và xz có thể mất khoảng bốn hoặc năm phút.

Các công cụ nén xz cũng cần đáp ứng yêu cầu về bộ nhớ, đôi khi hơn hẳn một bậc so với các phương pháp khác. Nếu bạn đang ở trên một hệ thống với bộ nhớ dồi dào, nó có thể không phải là một vấn đề, nhưng hãy chú ý điều này.

Trong khi thời gian nén có thể dài hơn nhiều, thời gian giải nén cuả xz là tương đối tốt. MẶc dù không thể nào so được với gzip về tốc độ giải nén, nó thường nhanh hơn đáng kể so với bzip2. Việc sử dụng bộ nhớ cho giải nén cũng không phải quá khủng khiếp (nhưng vẫn còn cao tương đối).

Tập hợp các ưu điểm và nhược điểm lại, đây là một định dạng tuyệt vời cho việc phân phối các file ,giống như phần mềm. Bạn sẽ cần thời gian nén khá lâu, nhưng người dùng sẽ được hưởng lợi khá nhiều. Họ sẽ có một tập tin nhỏ gọn được giải nén một cách nhanh chóng.

Một bất lợi tiềm ẩn của định dạng này là nó có thể không được hỗ trợ trên một số hệ thống cũ. Nếu bạn cần tương thích tối đa, hãy lựa chọn các phương pháp thay thế.

Định dạng file nén của phương pháp này là .xz.

Dùng lệnh sau để nén một file:

xz file

Thêm cờ -l  để hiển thị thêm thông tin về file nén:

xz -l test.xz
Strms Blocks Compressed Uncompressed Ratio Check Filename
1 1 5,016 B 13.7 KiB 0.356 CRC64 test.xz

Cờ -c để truyefn file nén ra standard out, giống như trên:

xz -c test > test.xz

Với các cờ số, xz dùng các số nhỏ hơn để biểu thị cho tốc độ nén nhanh hơn. Cờ -0 cho tốc đọ nhanh nhất. Cờ -6 là giá trị mặc định và ổn trong hầu hết trường hợp.

Nếu muốn tối ưu hiệu suất nén và không quan tâm đến thời gian, hãy sử dụng cờ -e kết hợp với các cờ số như sau:

xz -e -9 large_file

Dùng cờ -d để giải nén file:

xz -d large_file.xz
 

Nén với Tar Archiving  

Trong khi các phương pháp nén cá nhân rất hữu ích, bạn sẽ thấy chũng được kết hợp với tar để nén tài liệu lưu trữ các tập tin. Điều này cho phép bảo vệ cấu trúc thư mục, điều khoản, vv của các tập tin.

Sử dụng tar với gzip

Để tạo một file nén tar được nén bằng gzip ,bạn có thể dùng cờ -z như sau:

tar czvf compressed.tar.gz directory1

Lẹnh này tạo một file nén mới (-c) từ thư mục "directory1" tên là "compressed.tar.gz" 

Dùng cờ -t để truy cập vào trong file:

tar tzvf compressed.tar.gz
drwxr-xr-x demouser/demouser 0 2014-03-19 18:31 directory1/
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:31 directory1/httpd.conf.orig
-rw-r--r-- demouser/demouser 2295 2014-03-19 18:31 directory1/nginx.conf.orig
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:21 directory1/httpd.conf

Dùng cờ -x để giải nén:

tar xzvf compressed.tar.gz

 

Sử dụng tar với bzip2

 

Để sử dụng bzip2, thay cờ -z ở trên thành cờ -j .

tar cjvf bzipcompressed.tar.bz2 directory2

Dùng cờ -t để xem tahnhf phần file, giống ở trên:

tar tjvf bzipcompressed.tar.bz2
drwxr-xr-x demouser/demouser 0 2014-03-19 18:31 directory2/
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:31 directory2/httpd.conf.orig
-rw-r--r-- demouser/demouser 2295 2014-03-19 18:31 directory2/nginx.conf.orig
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:21 directory2/httpd.conf

Giải nén file với lệnh:

tar xjvf bzipcompressed.tar.bz2

Sử dụng tar với xz

 

Dùng cờ -J để tạo file tar bằng xz.

tar cJvf xzcompressed.tar.xz directory3

Dùng cờ tương tự như trên để xem chi tiết:

tar tJvf xzcompressed.tar.xz
drwxr-xr-x demouser/demouser 0 2014-03-19 18:31 directory3/
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:31 directory3/httpd.conf.orig
-rw-r--r-- demouser/demouser 2295 2014-03-19 18:31 directory3/nginx.conf.orig
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:21 directory3/httpd.conf

Và giải nén:

tar xJvf xzcompressed.tar.xz

Tổng kết

Hy vọng rằng bạn đã có đủ thông tin để đưa ra quyết định chính xác cho phương pháp nén được sử dụng trong những hoàn cảnh khác nhau. Tất cả các tiện ích nén mà chúng ta đã thảo luận trong bài viết này có ưu nhược điểm tùy theo yêu cầu cụ thể của bạn.