Thứ ba, 15/04/2014 | 00:00 GMT+7

Giới thiệu về công cụ nén tệp trên server Linux

Có nhiều lý do khiến bạn muốn nén file và folder trên máy tính. Một số lợi ích đơn giản hơn là tiết kiệm không gian đĩa và sử dụng ít băng thông hơn cho giao tiếp mạng.

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à nói một chút về một số đánh đổi của các phương pháp khác nhau. Ta cũng sẽ đề cập đến một số hoạt động liên quan, chẳng hạn như lưu trữ, giúp các công cụ nén của ta linh hoạt hơn nhiều.

Ta sẽ giới thiệu những công cụ này trên version VPS Ubuntu 12.04, nhưng chúng sẽ hoạt động khá giống nhau trên bất kỳ bản phân phối Linux hiện đại nào.

Khái niệm cơ bản về nén và lưu trữ

Trước khi chuyển sang các công cụ thực tế mà ta sẽ sử dụng, ta nên xác định các thuật ngữ của bạn và thảo luận về một số đặc điểm khác nhau của các kỹ thuật nén và lưu trữ.

Nén là một cách giảm kích thước của file trên đĩa bằng các thuật toán và phép tính toán học khác nhau. Các file được định dạng theo những cách nhất định khiến cấu trúc chung của chúng có thể đoán được phần nào, ngay cả khi nội dung của chúng khác nhau. Hơn nữa, bản thân nội dung thường được lặp lại. Cả hai lĩnh vực này đều đại diện cho các cơ hội để sử dụng các kỹ thuật nén.

Nén Lossy và Lossless

Khi thảo luận về nén liên quan đến máy tính và các loại file , các thuật ngữ giống nhau có thể có một số ý 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à file âm thanh nén được sử dụng để tạo file nhỏ hơn từ file nhạc nguồn lớn hơn.

Kiểu nén này về cơ bản khác với những gì ta sẽ nói trong hướng dẫn này. Điều này là do MP3 được tạo ra bằng cách phân tích dạng sóng của file âm thanh và về cơ bản tìm ra dữ liệu mà nó có thể loại bỏ vĩnh viễn trong khi vẫn giữ được tinh thần hoặc âm thanh chung của bản root .

Đây được gọi là phương pháp nén mất dữ liệu vì nó thực sự làm mất thông tin từ file root mà không được đưa vào MP3. Bạn không thể chuyển đổi MP3 trở lại thành cùng một file nguồn sau này.

Bản nén có thể không được user chú ý, nhưng nó không chứa tất cả các thông tin liên quan của bản root . Tỷ lệ nén càng cao, quá trình nén sẽ bắt đầu ảnh hưởng đến các phần đáng kể của âm thanh.

Một ví dụ khác về điều này là ảnh JPEG. Chúng càng được nén nhiều thì dữ liệu bị mất càng nhiều và hiện tượng nén càng nhiều. Một tiện ích nén JPEG sẽ cố gắng tìm các trường màu đủ gần với nhau và thay thế toàn bộ trường bằng một màu duy nhất. Tỷ lệ nén được sử dụng càng lớn, phạm vi màu càng lớn sẽ được bao phủ theo cách này.

Ngoài ra, phương pháp nén không mất dữ liệu tạo ra một file nhỏ hơn file root được dùng để tạo lại file root . Nén không mất dữ liệu là loại mà ta sẽ đề cập trong hướng dẫn này.Loại nén này không sử dụng các phép gần đúng để nén dữ liệu và thay vào đó sử dụng các thuật toán nhất định để nhận ra các phần lặp lại của file . Nó loại bỏ những thứ này và thay thế chúng bằng một trình giữ chỗ. Nó tiếp tục và thay thế các lần xuất hiện sau của mẫu bằng
tham chiếu đến cùng một chỗ dành sẵn.

Điều này cho phép máy tính lưu trữ thông tin trên ít dung lượng đĩa hơn. Hãy coi quá trình này giống như việc tạo một danh sách các biến xác định các khối dữ liệu và sau đó sử dụng các biến đó để điền vào chương trình. Đây thực sự là hai giai đoạn mà mọi kỹ thuật nén không mất dữ liệu đều sử dụng: ánh xạ các giá trị lặp lại nhiều với một thứ gì đó nhỏ hơn có thể dễ dàng tham chiếu và sau đó thay đổi lần xuất hiện của từng giá trị đó với tham chiếu.

Hơn nữa, các kỹ thuật nén không mất dữ liệu hiện đại được cho là thích ứng . Điều này nghĩa là họ không phân tích toàn bộ file đầu vào ngay từ đầu và tạo “từ điển” thay thế tài liệu tham khảo từ đó. Thay vào đó, họ phân tích file khi đi và viết lại từ điển dựa trên dữ liệu thực sự được lặp lại. Từ điển dần trở nên hiệu quả hơn khi quá trình này tiếp tục.

Nền lưu trữ

Ý tưởng “lưu trữ” dữ liệu thường nghĩa là backup nó và lưu nó vào một vị trí an toàn, thường ở định dạng nén. “Kho lưu trữ” trên server Linux nói chung có một ý nghĩa hơi khác. Thông thường nó đề cập đến một file tar .

Trước đây, dữ liệu từ các server thường được backup vào các repository băng, đây là các thiết bị băng từ được dùng để lưu trữ dữ liệu tuần tự. Đây vẫn là phương pháp backup ưu tiên cho một số ngành. Để 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ể xử lý và xử lý nhiều file trong một hệ thống file , với các quyền và metadata nguyên vẹn, như một file . Sau đó, bạn có thể extract một file hoặc toàn bộ hệ thống file từ repository .

Về cơ bản, file tar là một định dạng file tạo ra một cách thuận tiện để phân phối, lưu trữ, backup và thao tác với các group file liên quan. Ta cũng sẽ nói về lưu trữ trong hướng dẫn này vì các 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

Linux có sẵn một số công cụ nén khác nhau. Mỗi người đều hy sinh trong một số lĩnh vực nhất định và mỗi người đều có thế mạnh riêng. Ta sẽ thiên vị mình đối với các schemas nén hoạt động với tar vì chúng sẽ linh hoạt hơn nhiều so với các phương pháp khác.

nén gzip

Công cụ gzip thường được gọi là phương pháp nén dữ liệu "cổ điển" trên máy Linux. Nó đã xuất hiện từ năm 1992, vẫn đang trong quá trình phát triển và vẫn còn nhiều thứ đang diễn ra.

Công cụ gzip sử dụng thuật toán nén được gọi là “DEFLATE”, một thuật toán cũng được sử dụng trong các công nghệ phổ biến khác như định dạng hình ảnh PNG, giao thức web HTTP và giao thức vỏ bảo mật SSH.

Một trong những lợi thế chính của nó là tốc độ.Nó có thể vừa nén và extract 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 các đị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 về việc sử dụng bộ nhớ trong quá trình nén và extract và dường như không yêu cầu thêm bộ nhớ khi tối ưu hóa để nén tốt nhất.

Một xem xét khác là khả năng tương thích. Vì gzip là một công cụ cũ như vậy nên hầu như tất cả các hệ thống Linux, dù tuổi tác, sẽ có sẵn công cụ để xử lý dữ liệu.

Nhược điểm lớn nhất của nó là nén dữ liệu kém triệt để hơn so với một số tùy chọn khác. Nếu bạn đang thực hiện nhiều nén và extract nhanh, đây có thể là một định dạng tốt cho bạn, nhưng nếu bạn định nén một lần và lưu trữ file , thì các tùy chọn khác có thể có lợi.

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

<pre>
gzip <span class = “highlight”> sourcefile </span>
</pre>

Thao tác này sẽ nén file và đổi tên thành sourcefile.gz trên hệ thống.

Nếu bạn muốn nén đệ quy toàn bộ folder , bạn có thể chuyển cờ -r như sau:

<pre>
gzip -r <span class = “highlight”> directory1 </span>
</pre>

Thao tác này sẽ di chuyển xuống folder và nén từng file riêng lẻ. Điều này thường không được ưu tiên và có thể đạt được kết quả tốt hơn bằng cách lưu trữ folder và nén toàn bộ file kết quả, ta sẽ trình bày cách thực hiện ngay sau đây.

Để tìm hiểu thêm thông tin về file nén, bạn có thể sử dụng cờ -l , cờ này sẽ cung cấp cho bạn một số thống kê:

gzip -l test.gz 

         compressed        uncompressed  ratio uncompressed_name                5133               14073  63.7% test 

Nếu bạn cần chuyển kết quả đến một tiện ích khác, bạn có thể yêu cầu gzip gửi file nén về trạng thái chuẩn bằng cách sử dụng cờ -c . Ta sẽ chỉ chuyển nó trực tiếp vào một file trong ví dụ này:

gzip -c test > test.gz 

Bạn có thể điều chỉnh tối ưu hóa nén bằng cách chuyển một cờ được đánh số từ 1 đến 9. Cờ -1 (và alias của nó --fast ) đại diện cho việc nén nhanh nhất, nhưng ít triệt để nhất. Cờ -9 (và alias của nó --best ) đại diện cho quá trình nén chậm nhất và triệt để nhất. Tùy chọn mặc định là -6 , đây là mức trung bình tốt.

gzip -9 compressme 

Để extract một file , bạn chỉ cần chuyển cờ -d cho gzip (cũng có những alias như gunzip , nhưng chúng cũng làm điều tương tự):

gzip -d test.gz 

nén bzip2

Một công cụ và định dạng nén phổ biến khác là bzip2 . Mặc dù có phần hiện đại hơn gzip , được giới thiệu lần đầu tiên vào năm 1996, bzip2 được triển khai rất nhiều như một giải pháp thay thế truyền thống cho gzip .

Trong khi gzip dựa trên thuật toán “DEFLATE”, bzip2 là một triển khai của một thuật toán được gọi là “thuật toán Burrows-Wheeler”. Sự khác biệt về phương pháp này dẫn đến một tập hợp các điểm mạnh và điểm yếu khá khác biệt so với gzip .

Sự đánh đổi quan trọng nhất đối với hầu hết user là độ nén lớn hơn với chi phí là thời gian nén lâu hơn. Các công cụ bzip2 có thể tạo các file nhỏ gọn hơn đáng kể so với gzip , nhưng mất nhiều thời gian hơn để đạt được những kết quả đó do một thuật toán phức tạp hơn.

May mắn là thời gian extract không bị ảnh hưởng nhiều như thời gian nén, vì vậy có thể có lợi khi phân phối file bằng định dạng bzip2 vì bạn sẽ chỉ phải chịu hình phạt về 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 extract trong một khoảng thời gian hợp lý. Thời gian extract vẫn lớn hơn nhiều so với gzip , nhưng không có tác động lớn như hoạt động nén.

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

Các file được nén bằng cơ chế này thường có phần mở rộng file .bz2 .

Để tạo file nén bzip2 , bạn có thể gõ đơn giản như:

<pre>
bzip2 <span class = “highlight”> afile </span>
</pre>

Thao tác này sẽ nén file và đặt tên là “afile.bz2”.

Như đã đề cập ở trên, bạn có thể chuyển cờ -s để biểu thị rằng tiện ích sẽ hoạt động ở chế độ bộ nhớ giảm. Điều này sẽ không nén, nhưng nó sẽ không yêu cầu nhiều tài nguyên.

bzip2 -s afile 

Trong khi bzip2 triển khai các cờ được đánh số, chúng có nghĩa hơi khác so với gzip . Ở đây, chúng đại diện cho kích thước khối mà tiện ích quản lý để thực hiện nén của nó, vì vậy đây là phép đo mức sử dụng bộ nhớ so với kích thước nén, hơn là thời gian so với kích thước nén. Hành vi mặc định là cờ -9 , nghĩa là sử dụng bộ nhớ cao (tương đối) nhưng nén lớn hơn.

bzip2 -1 file 

Để extract file nén bzip , bạn có thể chuyển cờ -d :

bzip2 -d file.bz2 

Thao tác này sẽ trả lại một file không nén được gọi là “tệp”.

nén xz

Một người mới tương đối trong không gian là cơ chế nén xz . Công cụ nén này được phát hành lần đầu tiên vào năm 2009 và đã có được lượng người theo dõi ổ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 lớn hơn hai ví dụ trước, làm cho nó trở thành một định dạng tuyệt vời khi bạn cần lưu trữ dữ liệu trên dung lượng ổ đĩa hạn chế. Nó tạo ra các file nhỏ hơn.

Điều này phải trả giá, trong hầu hết các lĩnh vực tương tự như bzip2 . Mặc dù các file nén mà xz tạo ra nhỏ hơn các tiện ích khác, nhưng việc nén sẽ mất nhiều thời gian hơn đáng kể . Ví dụ: với các cờ nén nặng trên một file khá lớn, gzip có thể cần khoảng nửa phút, bzip2 có thể ở đâu đó 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 ảnh hưởng đến yêu cầu bộ nhớ, đôi khi lên đến một bậc so với các phương pháp khác. Nếu bạn đang sử dụng hệ thống có bộ nhớ dồi dào, đây có thể không phải là vấn đề, nhưng đây là một điều cần lưu ý.

Mặc dù thời gian nén có thể lâu hơn nhiều so với thời gian thích hợp, nhưng thời gian extract thực sự tương đối tốt. Mặc dù nó không bao giờ tiếp cận gzip về tốc độ extract , nhưng nó thường nhanh hơn đáng kể khi extract so với bzip2 . Việc sử dụng bộ nhớ để extract cũng không phải là điều hoàn toàn bình thường (nhưng vẫn còn khá cao).

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

Một nhược điểm tiềm ẩn khác 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ũ hơn do tuổi đời của nó. Nếu bạn muốn tương thích tối đa, bạn có thể buộc phải tìm kiếm ở nơi khác.

Các file được tạo ở định dạng này thường có phần mở rộng là .xz .

Để nén file , chỉ cần gọi tiện ích mà không có bất kỳ đối số nào:

<pre>
file xz
</pre>

Thao tác này sẽ xử lý file và tạo ra file có tên “file.xz”.

Để liệt kê số liệu thống kê về quá trình nén file , bạn có thể chuyển cờ -l trên 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 

Nếu bạn cần gửi kết quả đã nén sang chuẩn, bạn có thể báo hiệu điều đó cho tiện ích bằng cờ -c . Tại đây, ta có thể đưa nó trở lại thẳng vào một file :

xz -c test > test.xz 

Đối với các cờ được đánh số, xz sử dụng các số thấp hơn để biểu thị quá trình nén nhanh hơn. Trên thực tế, nó có cờ -0 cho giá trị đặt trước nhanh nhất. Cờ -6 là mặc định và là điểm trung gian tốt cho hầu hết các trường hợp sử dụng. Nếu bạn thực sự cần phải nén các file lớn hơn, bạn có thể sử dụng các cờ cao hơn, có thể mất nhiều thời gian nhưng có thể cho thấy một số lợi ích.

Nếu bạn cần nén nhiều hơn và không quan tâm đến thời gian, yêu cầu bộ nhớ, v.v., bạn có thể sử dụng cờ -e , sử dụng một biến thể nén thay thế "cực đại". Điều này cũng có thể sửa đổi hiệu suất của nó với các cờ số:

xz -e -9 large_file 

Điều này sẽ mất nhiều thời gian và cuối cùng, có thể không cho thấy lợi ích đáng kể, nhưng nếu bạn cần chức năng đó, tùy chọn có sẵn.

Để extract file , bạn chuyển lại cờ -d :

xz -d large_file.xz 

Thao tác này sẽ extract dữ liệu thành một file có tên “Large_file”.

Sử dụng lưu trữ Tar bằng nén

Mặc dù các phương pháp nén riêng lẻ hữu ích theo đúng nghĩa của chúng, nhưng thông thường bạn sẽ thấy chúng được ghép nối với tar để nén các file lưu trữ. Điều này cho phép ta duy trì cấu trúc folder , quyền, v.v. của các file mà ta kết thúc.

Lệnh tar thực sự rất rõ ràng về mối quan hệ này. Nó bao gồm các cờ dòng lệnh được dùng để tự động gọi một công cụ nén được liên kết sau khi quá trình lưu trữ hoàn tất, tất cả chỉ trong một bước.

Sử dụng tar với gzip

Để tạo một repository tar sau đó được nén bằng tiện ích gzip , bạn có thể chuyển cờ -z , cho biết rằng bạn muốn sử dụng tính năng nén gzip ở đầu repository . Trên thực tế, cờ tar không thực sự yêu cầu “ - ” ở đầu như hầu hết các công cụ. Một thành ngữ phổ biến để hoàn thành các repository được nén là:

<pre>
tar czvf <span class = “highlight”> được nén </span> .tar.gz <span class = “highlight”> directory1 </span>
</pre>

Thao tác này sẽ tạo một repository ( -c ) từ một folder được gọi là “directory1”. Nó sẽ tạo ra kết quả dài dòng, nén file lưu trữ kết quả bằng gzip và xuất ra một file có tên là “nén.tar.gz” (một file tar đã được extract ).

Sau khi file được tạo, ta có thể xem bên trong bằng cách sử dụng cờ -t thay vì cờ tạo:

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 

Để extract file sau này và mở rộng file lưu trữ, bạn có thể sử dụng cờ -x :

tar xzvf compressed.tar.gz 

Thao tác này sẽ tạo lại cấu trúc folder trong folder hiện tại.

Sử dụng tar với bzip2

Để sử dụng tính năng lưu trữ bằng bzip2 , bạn có thể thay thế cờ -z , là gzip -specific, bằng cờ -j .

Điều này nghĩa là lệnh tạo repository nén được sửa đổi thành:

<pre>
tar cjvf <span class = “highlight”> bzipcompressed </span> .tar.bz2 <span class = “highlight”> directory2 </span>
</pre>

, bạn có thể xem các file có trong repository lưu trữ bằng cách chuyển cờ -t :

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 

Bạn có thể extract các file và cấu trúc folder vào folder hiện tại bằng lệnh :

tar xjvf bzipcompressed.tar.bz2 

Sử dụng tar với xz

Bất kỳ version tar nào từ xa gần đây đã thêm chức năng tương tự cho nén xz . Chúng tuân theo cùng một định dạng sử dụng cờ -J .

<pre>
tar cJvf <span class = “highlight”> xzcompressed </span> .tar.xz <span class = “highlight”> directory3 </span>
</pre>

Để hiển thị thông tin, hãy sử dụng cơ chế tương 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 

Làm theo các mẫu tương tự để extract :

tar xJvf xzcompressed.tar.xz 

Điều này sẽ cung cấp cho bạn cấu trúc folder đầy đủ của bạn trở lại nguyên vẹn.

Kết luận

Hy vọng rằng bây giờ bạn đã có đủ thông tin để đưa ra quyết định sáng suốt về việc sử dụng phương pháp nén nào trong các trường hợp khác nhau. Tất cả các schemas nén mà ta đã thảo luận trong bài đăng này đều có những điểm mạnh rất hấp dẫn tùy thuộc vào yêu cầu cụ thể của tình huống của bạn.

Điều quan trọng là phải nhận thức được những hạn chế về hiệu suất và các vấn đề về tính tương thích có thể có với mỗi giải pháp. Bao nhiêu trọng lượng mà bạn đưa ra cho những mối quan tâm này phụ thuộc hoàn toàn vào máy móc bạn đang vận hành và loại khách hàng bạn phải hỗ trợ. Hầu hết các máy hiện đại không phải chú ý quá nhiều đến những chi tiết này, nhưng chúng có thể gây ra vấn đề nếu bạn thực hiện một cách mù quáng kiểu nén khi tương tác với các máy cũ.

<div class = “author”> Bởi Justin Ellingwood </div>


Tags:

Các tin liên quan

Cách tải phần mềm và nội dung lên VPS Linux của bạn
2014-04-14
Cách bảo vệ server của bạn chống lại lỗ hổng bảo mật OpenSSL.
2014-04-08
Cách cấu hình mail server bằng Postfix, Dovecot, MySQL và SpamAssassin
2014-04-01
Cách cấu hình mail server bằng Postfix, Dovecot, MySQL và SpamAssassin
2014-04-01
Cách cấu hình công cụ để sử dụng IPv6 trên VPS Linux
2014-04-01
Cách điều chỉnh cấu hình SSH Daemon của bạn trên VPS Linux
2014-03-26
Cách xác thực người dùng với server SSH bằng Monkeysphere trên VPS Ubuntu
2014-03-24
Cách xác thực danh tính server SSH với Monkeysphere trên VPS Ubuntu
2014-03-24
Cách thiết lập DNSSEC trên server DNS BIND ủy quyền
2014-03-19
Cách thiết lập DNSSEC trên server DNS BIND ủy quyền
2014-03-19