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.
Mục lục bài viết:
- 1. Vì sao cần nén file trên Linux
- 2. Chuẩn bị thư mục thực hành
- 3. Lệnh tar trong Linux: giải mã các ký tự c, z, v, f
- 4. Tạo file nén tar.gz bằng tar -czvf
- 5. Xem nội dung file nén mà không giải nén: tar -tzf
- 6. Giải nén tar.gz bằng tar -xzvf và tùy chọn -C
- 7. Nén từng file riêng lẻ bằng gzip
- 8. File zip trên Linux: zip và unzip
- 9. Kiểm tra dung lượng đĩa bằng df và du
- 10. Ứng dụng thực tế: sao lưu mã nguồn website bằng tar
- 11. Lỗi thường gặp khi nén và giải nén file
- 12. Câu hỏi thường gặp về lệnh tar trong Linux
- 13. Lời kết
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.

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 |
|---|---|---|
| c | create | Tạo file đóng gói mới |
| x | extract | Giải nén file đóng gói |
| t | list | Liệt kê nội dung bên trong mà không giải nén |
| z | gzip | Nén hoặc giải nén bằng gzip, cho file .tar.gz |
| v | verbose | Hiển thị danh sách file đang xử lý |
| f | file | Chỉ định tên file đóng gói, luôn đứng cuối cụm tùy chọn |
| C | change dir | Chuyể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.

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.

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.

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.

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.

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.

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.

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