Câu chuyện từ thực tế: Tại sao cần hiểu yum và rpm?
Hồi CentOS 8 tuyên bố EOL vào cuối 2021, mình phải migrate gấp 5 server sang Rocky Linux trong vòng 1 tuần. Cái đau đầu nhất không phải là OS mới — mà là toàn bộ danh sách package đang chạy trên production cần cài lại, kiểm tra version, đảm bảo không thiếu dependency nào. Đó là lúc mình nhận ra: chỉ biết gõ yum install rồi thôi là không đủ.
Nếu bạn đang quản trị server CentOS (hoặc Rocky, AlmaLinux), yum là công cụ bạn dùng mỗi ngày. Còn rpm là lớp nền bên dưới — khi yum không đủ dùng, bạn cần xuống tầng rpm để làm thủ công.
Bối cảnh: yum và rpm khác nhau chỗ nào?
Một cách hình dung đơn giản: rpm giống cài app bằng file .exe trên Windows — có file, cài, xong. Nếu app cần thêm thư viện mà máy chưa có? Bạn tự lo. yum thì giống App Store hơn — nó tự tìm, tự tải về mọi thứ cần thiết, kể cả các dependency.
- rpm: thao tác trực tiếp với file
.rpm, không tự giải quyết dependency - yum: package manager cấp cao, kết nối repository online, tự xử lý dependency
Trong thực tế, 90% công việc hàng ngày dùng yum là đủ. Nhưng có những tình huống bạn buộc phải xuống rpm: cài package offline, truy ngược xem file nào thuộc package nào, hoặc gỡ một package cứng đầu không chịu gỡ qua yum.
Các lệnh yum cơ bản cần nắm
Cài đặt và gỡ bỏ package
# Cài package mới
yum install nginx
# Cài nhiều package cùng lúc
yum install nginx mysql-server php-fpm
# Gỡ bỏ package (giữ lại dependency)
yum remove nginx
# Gỡ bỏ cả dependency không dùng nữa
yum autoremove nginx
Cập nhật package
# Cập nhật tất cả package
yum update
# Cập nhật chỉ 1 package
yum update nginx
# Xem danh sách update có sẵn (chưa thực hiện)
yum check-update
Mẹo nhỏ: trước khi update production server, mình hay chạy yum check-update trước để xem có gì thay đổi. Nếu thấy kernel hoặc glibc trong danh sách, mình sẽ cân nhắc kỹ hơn thay vì update ào ào.
Tìm kiếm và xem thông tin package
# Tìm package theo tên
yum search nginx
# Xem thông tin chi tiết package
yum info nginx
# Xem package cung cấp file/command cụ thể
yum provides /usr/bin/python3
yum provides "*/nginx.conf"
Quản lý repository với yum
Repository (repo) là kho chứa package. CentOS mặc định kèm vài repo chính thức, nhưng nhiều phần mềm phổ biến như Nginx stable, Node.js LTS hay MariaDB lại có repo riêng do nhà phát triển duy trì — version mới hơn và được test kỹ hơn repo mặc định.
Xem danh sách repo đang bật
# Liệt kê tất cả repo
yum repolist
# Liệt kê cả repo đang tắt
yum repolist all
# Xem chi tiết một repo
yum repoinfo base
Thêm repo mới
EPEL là repo mở rộng phổ biến nhất cho RHEL-based, cung cấp hơn 8.000 package không có trong repo mặc định (htop, iftop, fail2ban, v.v.):
# Cài EPEL repository
yum install epel-release
# Xác nhận EPEL đã được thêm
yum repolist | grep epel
Nếu cần thêm repo thủ công, tạo file .repo trong /etc/yum.repos.d/:
# Tạo file repo cho Nginx stable
cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF
# Cài nginx từ repo vừa thêm
yum install nginx
Bật/tắt repo tạm thời
# Cài package từ repo cụ thể (không ảnh hưởng config vĩnh viễn)
yum --enablerepo=epel install htop
# Tắt repo khi cài (ví dụ tránh conflict)
yum --disablerepo=epel install nginx
Làm việc trực tiếp với rpm
Cài package từ file .rpm
Hay gặp nhất là khi bạn tải file .rpm về từ website nhà sản xuất, cần cài offline hoặc cài đúng version cụ thể không có trong repo.
# Cài từ file .rpm local
rpm -ivh package.rpm
# Flags phổ biến:
# -i = install
# -v = verbose (hiện chi tiết)
# -h = hiện progress bar (#####)
# Upgrade (nếu đã có version cũ)
rpm -Uvh package.rpm
# Cài nhưng bỏ qua kiểm tra dependency (KHÔNG khuyến khích)
rpm -ivh --nodeps package.rpm
Kiểm tra package đã cài
# Xem tất cả package đã cài
rpm -qa
# Tìm package theo tên
rpm -qa | grep nginx
# Xem thông tin chi tiết
rpm -qi nginx
# Xem danh sách file của package
rpm -ql nginx
# Biết file này thuộc package nào
rpm -qf /etc/nginx/nginx.conf
rpm -qf cực kỳ hữu ích khi debug. Lúc migrate 5 server đó, mình dùng lệnh này để truy ngược từ config file ra tên package, rồi ghi lại danh sách đầy đủ cần cài trên Rocky Linux mới.
Gỡ package bằng rpm
# Gỡ package (tên chính xác)
rpm -e nginx
# Gỡ nhưng bỏ qua kiểm tra dependency
rpm -e --nodeps nginx
Dùng --nodeps khi gỡ là con dao hai lưỡi. Mình đã từng gỡ một shared library với flag này và kéo sập cả loạt app phụ thuộc vào nó — mất 2 tiếng để dọn dẹp. Chỉ dùng khi chắc chắn biết mình đang làm gì.
Xử lý các tình huống thường gặp
Lỗi dependency khi cài package
# Xem dependency của package trước khi cài
yum deplist nginx
# Nếu bị lỗi dependency, thử clean cache rồi cài lại
yum clean all
yum makecache
yum install nginx
Rollback sau khi update
# Xem lịch sử các transaction yum
yum history
# Xem chi tiết transaction số 5
yum history info 5
# Undo transaction số 5 (rollback)
yum history undo 5
yum history undo đã cứu mình vài lần khi update kernel hoặc glibc làm server khởi động không lên. Thói quen của mình: trước khi update production, note lại transaction ID hiện tại. Khi có sự cố, rollback chạy chưa đến 30 giây.
Download package về mà không cài
# Download package (và dependency) về thư mục hiện tại
yum install --downloadonly --downloaddir=/tmp/packages nginx
# Sau đó cài offline
rpm -ivh /tmp/packages/*.rpm
Kiểm tra và bảo trì hệ thống package
Kiểm tra tính toàn vẹn của package đã cài
# Kiểm tra checksum và permission của tất cả file trong package
rpm -V nginx
# Nếu output trống = không có gì thay đổi (tốt)
# Nếu có dòng output = file đã bị sửa đổi so với khi cài
# Kiểm tra toàn bộ package đã cài (chạy lâu)
rpm -Va 2>/dev/null | grep -v "^.....UG"
Dọn dẹp cache
# Xóa cache package đã download
yum clean packages
# Xóa toàn bộ cache (header + metadata + packages)
yum clean all
# Rebuild metadata cache
yum makecache
Export danh sách package để tái cài đặt
Thủ thuật mình dùng mỗi lần chuẩn bị migrate — tiết kiệm được cả tiếng so với ngồi nhớ từng package:
# Export danh sách package đang cài (chỉ lấy tên)
rpm -qa --qf "%{NAME}\n" | sort > installed-packages.txt
# Trên server mới, cài lại từ danh sách
yum install $(cat installed-packages.txt)
Không phải package nào cũng cài được ngay — một số cần thêm repo trước. Nhưng ít nhất bạn có danh sách đầy đủ, không bỏ sót thứ gì.
Tổng kết nhanh
Quay lại chuyện migrate 5 server hồi đầu: nếu hồi đó không biết rpm -qf, yum history undo, và cách export danh sách package, thời gian hoàn thành có thể gấp đôi. Hiểu yum và rpm đúng nghĩa không phải là nhớ lệnh — mà là biết dùng đúng công cụ đúng lúc khi mọi thứ không như kế hoạch.
Một lưu ý nếu bạn đang dùng CentOS Stream 9 hoặc Rocky/Alma: yum thực ra là alias của dnf — cú pháp tương tự nhưng dnf có thêm module stream và dependency solver tốt hơn. Các lệnh trong bài này đều hoạt động bình thường.

