Giải cứu server lúc 2h sáng: Hướng dẫn chi tiết DNF Package Manager trên RHEL/Rocky Linux

Quick Start: Đêm 2 giờ sáng cần gì, DNF có ngay!

Kể cho các bạn nghe, có đợt server production của công ty mình báo lỗi sau một bản vá bảo mật. Lúc đó đã 2 giờ sáng, tim đập thình thịch. Điều đầu tiên mình nghĩ tới là phải nhanh chóng xác định và xử lý gói phần mềm gây ra lỗi. Và DNF chính là vị cứu tinh. Nếu bạn đang ở trong tình huống tương tự, hoặc chỉ muốn làm quen với DNF, đây là những kiến thức bạn cần nắm vững. Đừng để mình phải vật lộn khi sự cố ập đến!

DNF (Dandified YUM) là trình quản lý gói mặc định trên các hệ điều hành dựa trên RPM như RHEL 8+, CentOS Stream, Rocky Linux và AlmaLinux. Nó là phiên bản kế nhiệm của YUM, mang lại hiệu suất vượt trội, khả năng giải quyết phụ thuộc ổn định hơn và nhiều tính năng hữu ích hơn.

Các lệnh DNF cơ bản để bạn sống sót qua đêm:

# 1. Cập nhật hệ thống (luôn là ưu tiên hàng đầu)
sudo dnf update

# 2. Cài đặt một gói phần mềm (ví dụ: nginx)
sudo dnf install nginx

# 3. Gỡ bỏ một gói phần mềm
sudo dnf remove nginx

# 4. Tìm kiếm một gói (khi bạn không nhớ tên chính xác)
dnf search "php-fpm"

# 5. Tìm gói chứa một file cụ thể (cực kỳ hữu ích khi debug "command not found")
dnf provides /usr/bin/htpasswd

Chỉ với 5 lệnh trên, bạn đã có thể thực hiện phần lớn các tác vụ quản lý phần mềm cơ bản. Nắm vững chúng sẽ giúp bạn tự tin hơn rất nhiều khi làm việc với server.

Giải thích chi tiết: DNF khác YUM thế nào và làm việc ra sao?

Nếu bạn từng làm việc với CentOS 7 hoặc các phiên bản RHEL cũ hơn, chắc hẳn bạn đã quá quen thuộc với YUM. Khi chuyển sang RHEL 8+ và các bản phân phối kế nhiệm như Rocky Linux hay AlmaLinux, DNF đã trở thành một giải pháp thay thế mới. Nó không chỉ là một cái tên mới mà còn là một bước tiến lớn về công nghệ.

DNF vs YUM: Tại sao lại là DNF?

  • Công nghệ backend mới: DNF sử dụng thư viện libsolv từ openSUSE, giúp giải quyết phụ thuộc (dependencies) nhanh chóng và đáng tin cậy hơn YUM rất nhiều. Đây là yếu tố cực kỳ quan trọng, đặc biệt khi bạn cần cập nhật các gói phần mềm phức tạp.
  • Quản lý Module: DNF giới thiệu khái niệm module và stream, cho phép cài đặt nhiều phiên bản của cùng một phần mềm (ví dụ: PHP 7.4 và PHP 8.0) trên cùng một hệ thống mà không xung đột. YUM không có tính năng này.
  • API ổn định: DNF có một API được định nghĩa rõ ràng, hỗ trợ các công cụ bên thứ ba dễ dàng tích hợp hơn.

Về cơ bản, bạn có thể coi DNF là YUM tốt hơnthông minh hơn.

Quản lý Repository: Nguồn cung cấp phần mềm

Repository (kho chứa) là nơi DNF tìm kiếm và tải về các gói phần mềm. Các file cấu hình repository thường nằm trong thư mục /etc/yum.repos.d/. Mỗi file .repo sẽ định nghĩa một hoặc nhiều repository.

# Liệt kê các repository đang hoạt động trên hệ thống của bạn
dnf repolist

# Xem chi tiết các repository đã kích hoạt và chưa kích hoạt
dnf repolist all

Để thêm một repository mới (ví dụ: EPEL – Extra Packages for Enterprise Linux, một repo rất hữu ích cho các gói không có sẵn trong repo chính):

# Cài đặt gói chứa cấu hình EPEL repo
sudo dnf install epel-release

# Sau đó, kiểm tra lại danh sách repo
dnf repolist

Đôi khi, bạn cần kích hoạt hoặc vô hiệu hóa một repo thủ công. Có hai cách: chỉnh sửa file .repo tương ứng hoặc sử dụng lệnh:

# Kích hoạt repo
sudo dnf config-manager --set-enabled <repo_id>

# Vô hiệu hóa repo
sudo dnf config-manager --set-disabled <repo_id>

Tìm kiếm thông tin gói và nhóm gói

Ngoài dnf search, còn có các lệnh khác để tìm hiểu sâu hơn về các gói phần mềm:

# Xem thông tin chi tiết của một gói (phiên bản, kích thước, mô tả, v.v.)
dnf info nginx

# Liệt kê tất cả các gói có sẵn hoặc đã cài đặt
dnf list

dnf list installed
dnf list available

# DNF cũng hỗ trợ cài đặt các nhóm gói (group), rất tiện lợi cho các tác vụ cụ thể
dnf group list

dnf group install "Development Tools"

Cập nhật và quản lý hệ thống: An toàn là trên hết

# Chỉ kiểm tra có bản cập nhật nào không, không cài đặt
dnf check-update

# Cập nhật tất cả các gói lên phiên bản mới nhất
sudo dnf upgrade

Một tính năng mình thấy cực kỳ giá trịdnf history. Nó lưu lại mọi thao tác bạn đã thực hiện với DNF – một cứu cánh không biết bao nhiêu lần rồi!

# Xem lịch sử các giao dịch DNF
dnf history

# Xem chi tiết một giao dịch cụ thể (ví dụ: transaction ID 50)
dnf history info 50

# Hoàn tác một giao dịch (nếu có gì đó sai)
sudo dnf history undo 50

# Hoàn tác lại thao tác undo
sudo dnf history redo 50

Nói thật, có lần 2 giờ sáng server bị treo sau khi mình update một package. May mắn thay, dnf history undo đã giúp mình hoàn tác. Nếu không, chắc mình mất ngủ cả tuần mất.

Nâng cao: Khi DNF không chỉ là cài đặt và gỡ bỏ

Quản lý Module và Stream: Sức mạnh linh hoạt

Như đã đề cập, khả năng quản lý module là một điểm sáng của DNF. Nó cho phép bạn cài đặt các phiên bản phần mềm khác nhau mà không lo xung đột. Ví dụ, bạn cần PHP 7.4 cho một ứng dụng cũ và PHP 8.0 cho một ứng dụng mới.

# Liệt kê tất cả các module và stream có sẵn
dnf module list

# Kích hoạt stream PHP 8.0 và cài đặt
sudo dnf module enable php:8.0
sudo dnf install php php-fpm

# Nếu muốn chuyển sang PHP 7.4 (cần reset stream hiện tại trước)
sudo dnf module reset php
sudo dnf module enable php:7.4
sudo dnf install php php-fpm

Tính năng này cực kỳ quan trọng trong môi trường phát triển và production, nơi bạn phải đối mặt với nhiều yêu cầu về phiên bản phần mềm khác nhau.

Sử dụng DNF offline: Chuẩn bị cho những tình huống khó khăn

Có những lúc server của bạn không có kết nối internet (ví dụ: server trong mạng nội bộ, môi trường air-gapped). Trong những trường hợp này, việc tải gói và cài đặt offline trở nên vô cùng cần thiết.

# Tải gói nginx và tất cả các phụ thuộc của nó vào thư mục hiện tại
sudo dnf download --resolve --destdir=./ nginx

# Sau đó, bạn có thể copy các gói .rpm này sang server offline và cài đặt thủ công
sudo rpm -ivh *.rpm

Tối ưu hóa DNF: Tăng tốc độ và hiệu quả

Bạn có thể tinh chỉnh hành vi của DNF thông qua file cấu hình /etc/dnf/dnf.conf:

# Ví dụ một số tùy chỉnh hữu ích trong dnf.conf
[main]
kecache=True  # Giữ lại các gói đã tải về trong cache, giúp cài đặt lại nhanh hơn
max_parallel_downloads=10 # Tải về đồng thời 10 gói, tăng tốc độ cập nhật
deltarpm=True # Chỉ tải về phần thay đổi của gói, tiết kiệm băng thông

Những tùy chỉnh nhỏ này có thể tạo ra sự khác biệt lớn về hiệu suất khi bạn làm việc với DNF thường xuyên.

Kinh nghiệm xương máu: Di cư CentOS 7 sang AlmaLinux và vai trò của DNF

Công ty mình vẫn còn vài server chạy CentOS 7. Mình đã trực tiếp xử lý bài toán di cư chúng sang AlmaLinux. Trong quá trình chuyển đổi đó, DNF đóng vai trò then chốt. Sau khi chuyển hệ điều hành, mình cần cài đặt lại rất nhiều dịch vụ và phần mềm. Nhờ khả năng giải quyết phụ thuộc mạnh mẽ và quản lý module linh hoạt, DNF đã giúp quá trình này diễn ra mượt mà hơn rất nhiều.

Mình nhớ có vài dịch vụ cũ trên CentOS 7 với phụ thuộc phức tạp. Tuy nhiên, khi chuyển qua AlmaLinux và sử dụng DNF, mọi thứ trở nên dễ kiểm soát hơn hẳn. Mình có thể dễ dàng cài đặt lại các phiên bản PHP, MySQL mong muốn mà không phải loay hoay với các lỗi phụ thuộc lằng nhằng như trước đây với YUM. DNF thực sự giảm bớt gánh nặng trong một quá trình vốn đã rất căng thẳng.

Tips thực tế: Để DNF là đồng minh đắc lực của bạn

Làm sysadmin thì ai cũng biết, lý thuyết và thực tế khác xa nhau. Dưới đây là vài tips mình đã đúc kết, giúp bạn dùng DNF hiệu quả hơn:

  1. Luôn đọc kỹ output: DNF thường đưa ra danh sách các gói sẽ được cài đặt, cập nhật hoặc gỡ bỏ. Đừng bao giờ gõ y và Enter một cách vô thức. Mình từng suýt gỡ nhầm một dependency quan trọng chỉ vì không đọc kỹ danh sách gói sẽ bị xóa.
  2. Dọn dẹp cache định kỳ: Cache của DNF nằm ở /var/cache/dnf. Nếu không dọn dọn dẹp, nó có thể chiếm khá nhiều dung lượng đĩa.
  3. sudo dnf clean all
    
  4. Hiểu về dependency: DNF tự động giải quyết các phụ thuộc. Tuy nhiên, bạn vẫn cần hiểu rõ gói nào phụ thuộc vào gói nào, đặc biệt khi cài đặt phần mềm từ nguồn bên ngoài hoặc khi gặp lỗi. Các lệnh dnf providesdnf repoquery --requires (cần cài đặt dnf-utils) sẽ rất hữu ích.
  5. # Cài đặt dnf-utils để có repoquery
    sudo dnf install dnf-utils
    
    # Xem các dependency của một gói
    dnf repoquery --requires nginx
    
  6. Backup là vàng: Trước khi thực hiện bất kỳ bản cập nhật hệ thống lớn nào (ví dụ: từ Rocky 8 lên Rocky 9), hãy luôn backup server hoặc tạo snapshot máy ảo. DNF có thể giúp bạn rollback gói, nhưng nó không thể cứu bạn nếu toàn bộ hệ điều hành gặp sự cố nghiêm trọng.
  7. Khi DNF gặp lỗi:
    • Kiểm tra kết nối mạng: Đôi khi lỗi chỉ đơn giản là không thể kết nối đến repo.
    • Kiểm tra cấu hình repo: Đảm bảo các file .repo của bạn không bị lỗi cú pháp hoặc trỏ sai đường dẫn.
    • Xóa cache và thử lại: Đôi khi cache bị hỏng.
    • Tìm kiếm lỗi trên Google/Stack Overflow: Rất nhiều lỗi DNF đã được người khác gặp và giải quyết.
  8. dnf history là người bạn tốt nhất của bạn: Mình đã nhấn mạnh rồi, nhưng phải nhắc lại: đây là cứu cánh khi bạn cần debug hoặc quay lại trạng thái trước đó. Đừng bao giờ quên nó!

DNF rất mạnh mẽ và linh hoạt. Hy vọng với những chia sẻ này, bạn sẽ tự tin hơn khi làm việc với DNF trên RHEL/Rocky Linux, không còn cảm thấy “tim đập chân run” khi server báo lỗi lúc nửa đêm nữa.

Share: