Linux

Lệnh Tar Trong Linux: Nén Và Giải Nén File tar.gz Từ Cơ Bản Đến Thực Tế

phongdhphongdh
19 phút đọc
Chia sẻ:
Zalo
Lệnh Tar Trong Linux: Nén Và Giải Nén File tar.gz Từ Cơ Bản Đến Thực Tế

Ai quản trị máy chủ Linux cũng sớm gặp tình huống phải đóng gói cả một thư mục mã nguồn để sao lưu, chuyển một file log khổng lồ sang máy khác, hoặc dọn dẹp khi ổ đĩa báo đầy. Công cụ đảm nhiệm việc đóng gói kinh điển nhất là lệnh tar trong Linux, thường kết hợp cùng gzip để vừa gom vừa nén trong một thao tác. Bài viết này hướng dẫn lệnh tar trong Linux từ giải mã các ký tự tùy chọn, tạo và giải nén file tar.gz, đến gzip, zip và cách kiểm tra dung lượng đĩa bằng df, du, tất cả đều có ảnh chạy lệnh thật để đối chiếu từng bước.

1. Vì sao cần nén file trên Linux

Nhu cầu nén file trong Linux xuất phát từ ba việc lặp lại hằng ngày của quản trị viên. Thứ nhất là sao lưu: gom hàng nghìn file của một website thành một file duy nhất giúp việc lưu trữ và khôi phục đơn giản hơn rất nhiều. Thứ hai là truyền tải: một file nén di chuyển qua mạng nhanh và ít lỗi hơn hàng nghìn file rời. Thứ ba là tiết kiệm dung lượng, đặc biệt với log và dữ liệu văn bản có tỷ lệ nén rất cao.

Cần phân biệt hai khái niệm thường bị gộp chung: đóng gói (archive) là gom nhiều file thành một file duy nhất mà dung lượng gần như giữ nguyên, còn nén (compress) là giảm dung lượng thực tế của dữ liệu. Tar vốn là công cụ đóng gói thuần túy, khi kết hợp thêm gzip hoặc các thuật toán khác, file tar.gz mới đồng thời đạt được cả hai mục đích.

Tên tar bắt nguồn từ “tape archive”, công cụ lưu trữ lên băng từ của thời Unix sơ khai. Vượt qua nhiều thập kỷ, tar vẫn là chuẩn mặc định trên mọi hệ thống Linux và là định dạng đóng gói phổ biến nhất của mã nguồn mở. Hiểu rõ lệnh này là điều kiện cần trước khi bạn làm việc với sao lưu, triển khai ứng dụng hay phân phối phần mềm.

Ba nhu cầu sao lưu, truyền tải và tiết kiệm dung lượng khiến việc nén file trong Linux trở thành kỹ năng dùng đến hằng tuần.

2. Chuẩn bị thư mục thực hành

Bài viết thực hành trong thư mục ~/nen-file chứa một thư mục con tên du-an gồm ba file mã nguồn là index.html, style.css và app.js, cùng một file rời tên goc.txt để thực hành gzip riêng lẻ. Lệnh ls -R liệt kê đệ quy toàn bộ cây thư mục, còn du -sh cho biết thư mục đang chiếm 12K dung lượng.

Liệt kê cây thư mục thực hành bằng ls -R và đo dung lượng thư mục bằng du -sh

Con số dung lượng trước khi nén là mốc để đối chiếu hiệu quả sau mỗi thao tác. Với dữ liệu thật, thư mục mã nguồn của một website thường nặng vài trăm MB đến vài GB, và tỷ lệ nén của file văn bản, mã nguồn có thể đạt 60-80%. Hãy luôn kiểm tra dung lượng nguồn trước khi nén để ước lượng trước dung lượng đích còn đủ chỗ chứa hay không.

Bạn hoàn toàn có thể tự tạo một thư mục thực hành tương tự trong thư mục nhà của mình và làm theo từng lệnh trong bài. Việc gõ lại toàn bộ chuỗi thao tác là cách học nhanh nhất, vì lỗi gõ sai tùy chọn của tar là chuyện gần như ai cũng trải qua vài lần trước khi thành thạo.

Hiểu sâu về nén file trong Linux giúp bạn chọn đúng định dạng cho từng tình huống, thay vì dùng một công cụ cho mọi việc.

Trong mọi quy trình sao lưu trên Linux, lệnh tar trong Linux là mắt xích đầu tiên và quan trọng nhất.

Đối chiếu dung lượng trước và sau là thói quen nhỏ giúp mọi thao tác với lệnh tar trong Linux luôn nằm trong tầm kiểm soát.

3. Lệnh tar trong Linux: giải mã các ký tự c, z, v, f

Điểm khiến người mới e ngại lệnh tar trong Linux là chuỗi ký tự tùy chọn trông như mật mã, ví dụ -czvf. Thật ra mỗi ký tự mang một nghĩa cố định và rất dễ nhớ khi tách ra. Nắm được bảng giải mã dưới đây, bạn tự ghép được mọi tổ hợp lệnh tar cần dùng thay vì học thuộc lòng từng câu lệnh mẫu.

Ký tựTừ gốcÝ nghĩa
ccreateTạo file đóng gói mới
xextractGiải nén file đóng gói
tlistLiệt kê nội dung bên trong mà không giải nén
zgzipNén hoặc giải nén bằng gzip, cho file .tar.gz
vverboseHiển thị danh sách file đang xử lý
ffileChỉ định tên file đóng gói, luôn đứng cuối cụm tùy chọn
Cchange dirChuyển tới thư mục đích trước khi giải nén

Hai quy tắc ghép lệnh cần nhớ: hành động chỉ chọn một trong ba ký tự c, x hoặc t; và ký tự f luôn đứng ở cuối cụm vì ngay sau nó phải là tên file đóng gói. Theo quy tắc này, tar -czvf đọc thành “tạo mới, nén gzip, hiện chi tiết, ghi vào file sau đây”, còn tar -xzvf là “giải nén gzip, hiện chi tiết, từ file sau đây”. Chỉ vậy thôi, không còn gì bí ẩn.

Ngoài gzip, tar còn bắt cặp được với bzip2 (ký tự j, file .tar.bz2, nén chặt hơn nhưng chậm hơn) và xz (ký tự J, file .tar.xz, chặt nhất trong ba loại). Trong thực tế hằng ngày, tar.gz vẫn là lựa chọn cân bằng nhất giữa tốc độ và tỷ lệ nén, đó là lý do bài tập trung vào định dạng này.

Một khi giải mã được các ký tự, lệnh tar trong Linux không còn là câu thần chú khó hiểu mà là công cụ bạn tự lắp ráp theo nhu cầu.

4. Tạo file nén tar.gz bằng tar -czvf

Để đóng gói và nén một thư mục, dùng cú pháp tar -czvf tên-file.tar.gz thư-mục-nguồn. Trong bài thực hành, lệnh tar -czvf du-an.tar.gz du-an gom toàn bộ thư mục du-an thành một file nén duy nhất. Nhờ ký tự v, màn hình liệt kê từng file được đưa vào gói, giúp bạn xác nhận không thiếu file nào quan trọng.

Tạo file nén tar.gz bằng lệnh tar -czvf và xem dung lượng bằng ls -lh

Lệnh ls -lh sau đó cho phép so sánh dung lượng: thư mục gốc và file nén cùng hiện diện trong thư mục làm việc, file gốc không bị xóa sau khi nén. Đây là đặc tính quan trọng của tar: tạo file đóng gói là thao tác độc lập, file nguồn giữ nguyên cho đến khi bạn chủ động xóa. Hãy tranh thủ kiểm tra tính toàn vẹn của file nén trước khi xóa nguồn.

Quy ước đặt tên nên theo khuôn tên-dự-án-YYYYMMDD.tar.gz kèm ngày tháng để các bản sao lưu tự sắp xếp theo thời gian và không ghi đè lẫn nhau. Trong các script sao lưu tự động, đây cũng là định dạng tên phổ biến nhất. Nếu nén nhiều thư mục cùng lúc, chỉ cần liệt kê chúng nối tiếp ở cuối lệnh.

Một lệnh tar trong Linux viết đúng cú pháp ngay từ đầu sẽ tiết kiệm cho bạn nhiều lần làm lại về sau.

Khả năng giữ nguyên phân quyền khiến lệnh tar trong Linux vượt trội so với nhiều định dạng đóng gói thông thường khi sao lưu hệ thống.

Kiểm tra nội dung trước khi bung gói là quy tắc an toàn số một mỗi khi giải nén file tar.gz nhận từ bất kỳ nguồn nào.

5. Xem nội dung file nén mà không giải nén: tar -tzf

Trước khi giải nén bất kỳ file tar.gz lạ nào, hãy xem bên trong nó có gì bằng cú pháp tar -tzf tên-file.tar.gz. Ký tự t liệt kê toàn bộ danh sách file và thư mục trong gói, còn z báo cho tar biết gói này có nén gzip. Thao tác này không tạo ra bất kỳ file nào trên đĩa nên hoàn toàn an toàn để kiểm tra trước.

Liệt kê nội dung bên trong file tar.gz bằng tar -tzf trước khi giải nén

Việc xem trước đặc biệt quan trọng với các file tải từ Internet hoặc nhận từ người khác: bạn biết trước cấu trúc bên trong có một thư mục cha bao ngoài hay các file sẽ bung thẳng ra thư mục hiện tại. File nén không có thư mục cha khi giải nén sẽ làm rác thư mục đích với hàng loạt file rời, một sự cố rất khó dọn dẹp.

Ngoài mục đích an toàn, tar -tzf còn giúp kiểm chứng bản sao lưu: sau khi tạo file nén cho một hệ thống thật, liệt kê lại nội dung để chắc chắn các thư mục quan trọng như mã nguồn và thư mục uploads đều có mặt. Nhiều quy trình sao lưu chuyên nghiệp còn ghi thêm tổng số file trong gói để đối chiếu số lượng khi khôi phục.

Tách riêng bước kiểm tra và bước giải nén giúp quá trình giải nén file tar.gz luôn diễn ra trong một thư mục sạch và có kiểm soát.

6. Giải nén tar.gz bằng tar -xzvf và tùy chọn -C

Giải nén là thao tác ngược với tạo gói: đổi ký tự c thành x, cú pháp thành tar -xzvf tên-file.tar.gz. Mặc định, nội dung được bung vào thư mục hiện tại. Khi muốn giải nén vào một thư mục đích cụ thể, thêm tùy chọn -C thư-mục-đích, và thư mục đích đó phải tồn tại từ trước.

Giải nén file tar.gz vào thư mục riêng bằng tùy chọn -C và kiểm tra cây thư mục kết quả

Trong ảnh thực hành, thư mục giai-nen được tạo trước, file nén được giải vào đó và lệnh ls -R xác nhận cây thư mục du-an hoàn chỉnh đã xuất hiện đúng chỗ cùng đủ ba file thành phần. Đây là cách giải nén có kỷ luật: mọi thứ nằm gọn trong một thư mục kiểm soát được, không lẫn với dữ liệu đang có.

Một cảnh báo quen thuộc: giải nén sẽ lặng lẽ ghi đè các file trùng tên đã tồn tại mà không hỏi lại. Vì vậy với dữ liệu quan trọng, luôn giải nén vào thư mục trống để kiểm tra trước, đúng như bài vừa làm, thay vì bung trực tiếp lên thư mục đang chứa bản chạy thật. Tài liệu đầy đủ của tar có tại trang hướng dẫn GNU Tar.

Giải nén file tar.gz đúng quy trình là kiểm tra nội dung trước, chọn thư mục đích rõ ràng, rồi mới tiến hành bung gói.

Sự khác biệt giữa tar và gzip là điểm mấu chốt để dùng lệnh tar trong Linux đúng việc: gom nhiều file thì tar, nén một file thì gzip.

7. Nén từng file riêng lẻ bằng gzip

Khác với tar chuyên đóng gói thư mục, gzip nén đúng một file duy nhất theo cú pháp gzip tên-file, cho ra file có đuôi .gz. Điểm khác biệt sống còn: sau khi nén, gzip xóa file gốc và chỉ giữ lại file .gz. Giải nén bằng gzip -d tên-file.gz hoặc lệnh tương đương gunzip, file gốc quay trở lại và file .gz biến mất.

Nén một file bằng gzip, kiểm tra dung lượng rồi giải nén lại bằng gzip -d

Gzip là lựa chọn quen thuộc cho việc nén các file log đơn lẻ, vì log văn bản thuần có tỷ lệ nén rất cao, thường giảm xuống còn một phần mười dung lượng gốc. Nhiều hệ thống tự động nén log cũ bằng đúng cơ chế này trong quy trình luân chuyển log. Khi cần giữ lại file gốc sau khi nén, thêm tham số -k (keep) vào lệnh gzip.

Đây cũng là mối liên hệ giữa hai công cụ: tar.gz thực chất là file tar được chuyển qua gzip nén tiếp một lớp. Hiểu điều này giúp bạn xử lý được tình huống nhận một file .gz đơn thuần: nó chỉ chứa đúng một file bên trong, giải bằng gunzip là xong, không cần đến tar.

Đi cùng nhau, df và du biến việc kiểm tra dung lượng đĩa Linux từ phỏng đoán thành con số chính xác đến từng thư mục.

8. File zip trên Linux: zip và unzip

Định dạng zip là chuẩn của thế giới Windows nhưng xuất hiện thường xuyên khi trao đổi file với người dùng phổ thông. Trên Linux, tạo file zip bằng cú pháp zip -r tên-file.zip thư-mục, tham số -r để nén đệ quy cả thư mục con. Xem nội dung gói zip bằng unzip -l tên-file.zip và giải nén bằng unzip tên-file.zip.

Tạo file zip bằng zip -r và liệt kê nội dung file zip bằng unzip -l

Kết quả unzip -l trong ảnh hiển thị dung lượng từng file trước khi nén cùng tỷ lệ và tổng kết số file trong gói, thông tin hữu ích để ước lượng dung lượng sau khi bung. Khác với tar.gz, mỗi file trong gói zip được nén độc lập, nên tỷ lệ nén toàn gói thường kém hơn một chút, đổi lại việc trích xuất một file đơn lẻ trong gói rất nhanh.

Lựa chọn định dạng theo ngữ cảnh: trao đổi nội bộ giữa các máy Linux và sao lưu hệ thống thì dùng tar.gz; gửi file cho người dùng Windows hoặc đối tác không rành kỹ thuật thì dùng zip để họ mở bằng công cụ sẵn có. Cả hai công cụ zip và unzip đôi khi chưa được cài sẵn trên bản cài tối thiểu, chỉ cần cài thêm bằng apt là dùng được.

Thói quen nén file trong Linux kèm ngày tháng trong tên file giúp kho bản sao lưu luôn gọn gàng và dễ truy vết.

Một bản sao lưu tar.gz hoàn chỉnh luôn đi kèm một lần kiểm tra dung lượng đĩa Linux và một lần thử khôi phục thành công.

9. Kiểm tra dung lượng đĩa bằng df và du

Nén file thường đi đôi với câu hỏi dung lượng. Lệnh df -h (disk free) cho biết tổng dung lượng, phần đã dùng và phần còn trống của từng phân vùng, tham số -h hiển thị dạng GB, MB dễ đọc. Đây là lệnh đầu tiên cần chạy khi máy chủ báo lỗi hết đĩa hoặc ứng dụng không ghi được dữ liệu.

Kiểm tra dung lượng phân vùng bằng df -h và tổng dung lượng một thư mục bằng du -sh

Trong khi df nhìn ở tầm phân vùng, lệnh du -sh đường-dẫn đo chính xác một thư mục cụ thể đang chiếm bao nhiêu. Kết hợp hai lệnh theo hướng từ ngoài vào trong là quy trình tìm thủ phạm đầy đĩa kinh điển: df xác định phân vùng nào đầy, du khoanh vùng từng cấp thư mục, và cuối cùng thường thủ phạm là log phình to, bản sao lưu cũ hoặc thư mục uploads. Khi cần tìm đúng file cần nén hoặc dọn trong một cây thư mục lớn, hãy kết hợp thêm lệnh find trong Linux để lọc theo dung lượng và thời gian.

Với thư mục chứa nhiều thư mục con, biến thể du -h --max-depth=1 liệt kê dung lượng từng thư mục con một cấp, giúp bạn thấy ngay nhánh nào đang bất thường. Việc kiểm tra dung lượng đĩa Linux định kỳ bằng hai lệnh này giúp phát hiện sớm nguy cơ đầy đĩa, vốn là nguyên nhân thầm lặng gây sập hàng loạt dịch vụ trên máy chủ.

Khi đã thành thạo, lệnh tar trong Linux sẽ là công cụ bạn nghĩ đến đầu tiên mỗi khi cần đóng gói hay sao lưu dữ liệu.

10. Ứng dụng thực tế: sao lưu mã nguồn website bằng tar

Ghép toàn bộ kiến thức vào kịch bản phổ biến nhất: sao lưu thư mục mã nguồn web tại /var/www/html trước khi cập nhật. Lệnh mẫu gồm việc tạo file tar.gz kèm ngày tháng, loại trừ các thư mục không cần thiết như bộ nhớ đệm bằng tùy chọn --exclude, rồi liệt kê lại nội dung gói để kiểm chứng trước khi tiến hành cập nhật.

tar -czvf /backup/website-$(date +%F).tar.gz --exclude='html/cache' -C /var/www html
tar -tzf /backup/website-$(date +%F).tar.gz | head

Chi tiết đáng chú ý là tùy chọn -C /var/www kết hợp đường dẫn tương đối html: cách này khiến các đường dẫn lưu trong gói gọn và sạch, khi giải nén ở máy khác không bị dính cấu trúc tuyệt đối của máy gốc. Đây là thói quen của các script sao lưu chuyên nghiệp và là bước nâng tầm rõ rệt so với việc nén theo đường dẫn tuyệt đối mặc định.

Song song với mã nguồn, đừng quên cơ sở dữ liệu cần được xuất riêng bằng công cụ của hệ quản trị tương ứng rồi mới nén kèm. Một bản sao lưu hoàn chỉnh gồm cả hai phần và một lần thử khôi phục thành công trên môi trường thử nghiệm. Sao lưu chưa từng được kiểm chứng khôi phục chỉ là một file nén mang lại cảm giác an tâm giả tạo.

Trước mỗi lần đóng gói dữ liệu lớn, việc kiểm tra dung lượng đĩa Linux giúp tránh kịch bản nén dở dang vì hết chỗ chứa.

11. Lỗi thường gặp khi nén và giải nén file

Lỗi thứ nhất là quên kiểm tra nội dung trước khi giải nén, để file không có thư mục cha bung tung tóe vào thư mục làm việc. Chỉ một lệnh tar -tzf vài giây là phòng ngừa hoàn toàn được sự cố này. Đây là lỗi mà gần như quản trị viên nào cũng từng mắc đúng một lần trong sự nghiệp.

Lỗi thứ hai là nhầm lẫn hành vi của gzip: người mới thường bất ngờ khi file gốc biến mất sau khi nén, hoặc file .gz biến mất sau khi giải nén. Hãy nhớ gzip luôn thay thế file đầu vào bằng file đầu ra, muốn giữ cả hai phải thêm -k. Với tar thì ngược lại, file nguồn luôn được giữ nguyên.

Lỗi thứ ba là nén luôn cả file nén cũ và các thư mục rác vào gói mới, khiến bản sao lưu phình to vô ích qua từng ngày. Dùng –exclude để loại thư mục cache, thư mục tạm và chính thư mục chứa bản sao lưu ra khỏi gói. Cuối cùng, luôn kiểm tra dung lượng trống bằng df trước khi nén một thư mục lớn, tránh để quá trình nén chết giữa chừng vì hết đĩa.

12. Câu hỏi thường gặp về lệnh tar trong Linux

Tar và zip khác nhau thế nào? Tar là chuẩn đóng gói của thế giới Unix, thường bắt cặp với gzip thành tar.gz với tỷ lệ nén tốt và giữ nguyên được phân quyền file của Linux. Zip đến từ thế giới Windows, nén từng file độc lập và thân thiện với người dùng phổ thông. Sao lưu hệ thống Linux nên ưu tiên tar.gz vì quyền file được bảo toàn trọn vẹn.

Giải nén file tar.gz có làm mất file gốc đang có không? File nén nguồn không bị ảnh hưởng, nhưng các file tại thư mục đích trùng tên với nội dung trong gói sẽ bị ghi đè không hỏi lại. Vì vậy hãy giải nén vào thư mục trống để kiểm tra trước khi đưa vào vị trí sử dụng thật, như cách hướng dẫn trong bài.

Nén file bằng tar có giảm dung lượng nhiều không? Tùy loại dữ liệu. File văn bản, mã nguồn và log nén rất tốt, thường chỉ còn 20-40% dung lượng gốc. Ngược lại ảnh, video và các định dạng đã nén sẵn gần như không giảm thêm. Kiểm tra bằng cách so sánh dung lượng trước và sau bằng ls -lh như bài đã thực hành.

Vì sao giải nén xong quyền file bị thay đổi? Tar lưu kèm phân quyền trong gói và cố khôi phục chúng khi giải nén, đặc biệt khi chạy bằng quyền root. Khi giải nén bằng tài khoản thường, umask của hệ thống có thể can thiệp làm quyền thực tế khác đi đôi chút. Đây là lý do sau khi khôi phục website từ bản sao lưu, nên kiểm tra lại phân quyền bằng ls -l.

Dù là sao lưu website hay di chuyển dữ liệu giữa hai máy chủ, lệnh tar trong Linux vẫn là lựa chọn mặc định của quản trị viên.

13. Lời kết

Bài viết đã hệ thống trọn vẹn kỹ năng nén và giải nén file trong Linux: hiểu bản chất đóng gói và nén, giải mã các ký tự của lệnh tar trong Linux, tạo và kiểm tra file tar.gz, giải nén an toàn bằng -C, nén file lẻ bằng gzip, làm việc với file zip, và kiểm tra dung lượng đĩa bằng df, du. Đây là bộ kỹ năng sao lưu nền tảng xuất hiện trong gần như mọi công việc quản trị máy chủ.

Hãy thực hành ngay bằng cách đóng gói một thư mục thật trên máy của bạn, xem trước nội dung gói, giải nén vào một thư mục riêng rồi đối chiếu kết quả. Khi thao tác nén file trong Linux đã thành thạo, việc sao lưu hay di chuyển dữ liệu giữa các máy chủ sẽ trở thành công việc nhẹ nhàng và có kiểm soát, thay vì nỗi lo mỗi lần hệ thống báo đầy đĩa.

Chia sẻ bài viết này:
Zalo
phongdh

phongdh

Tác giả bài viết • Content Creator

Chào mọi người, mình là Phong - hiện đang công tác tại Phòng Kỹ thuật AZDIGI. Trong quá trình làm việc mình có cơ hội được tiếp xúc với khá nhiều các vấn đề liên quan đến Website/Email/Hosting/VPS/Server, do đó mình viết lại các hướng dẫn này nhằm chia sẻ kiến thức, cũng như tạo một môi trường để chúng ta giao lưu và học hỏi lẫn nhau.

Kết nối:

Bài viết liên quan

Những bài viết bạn có thể quan tâm

Thảo luận 0 bình luận Viết bình luận

Email được bảo mật và không hiển thị công khai.

Chưa có bình luận. Hãy là người mở đầu cuộc trò chuyện.

Zalo