Làm Chủ rpm-build và rpmlint: Đưa Script ‘Nhà Làm’ Lên Chuẩn Fedora

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

Vấn đề: Triển khai thủ công – “Hố đen” thời gian của SysAdmin

Nghĩ mà xem. Bạn vừa viết xong một công cụ backup log cực xịn bằng Python. Sếp yêu cầu triển khai ngay lập tức lên 50 server Fedora trong hạ tầng công ty. Bạn sẽ làm gì?

Cách nhanh nhất là dùng scp đẩy file, rồi ssh vào từng máy để chmod +x và tạo symlink trong /usr/bin. Nghe thì ổn, nhưng thực tế lại khác. Chỉ cần vài máy thiếu thư viện (dependencies) hoặc cần update bản mới, việc mò mẫm sửa từng server sẽ là một thảm họa.

Mình dùng Fedora làm máy chính đã 2 năm. Khi đối mặt với bài toán phân phối tool nội bộ, mình từng đắn đo giữa việc dùng Ansible để copy file hay tìm một cách “chuẩn chỉ” hơn. Và đóng gói RPM chính là câu trả lời giúp mình tiết kiệm 80% thời gian bảo trì.

Tại sao copy file thủ công lại khiến bạn mệt mỏi?

Khi bạn cài phần mềm theo kiểu “copy-paste”, trình quản lý gói DNF hoàn toàn không biết sự tồn tại của chúng. Điều này gây ra 4 rắc rối lớn:

  • Loạn phiên bản: Rất khó để kiểm tra xem server nào đang chạy bản v1.0, máy nào đã lên v1.2.
  • Lỗi thiếu thư viện: Tool của bạn cần curl hoặc jq, nhưng script copy file không thể tự động lôi chúng về được.
  • Gỡ cài đặt cực hình: Bạn phải nhớ chính xác từng vị trí file đã ném vào để xóa thủ công.
  • Tính toàn vẹn: Không có checksum, không có chữ ký số. Ai dám chắc file trên server không bị sửa đổi?

Các giải pháp thay thế có thực sự tốt?

Trước khi chọn RPM, mình đã cân nhắc vài phương án:

  1. Tarballs (.tar.gz): Đơn giản nhưng vẫn vướng lỗi quản lý dependencies và cực khó để rollback khi có sự cố.
  2. Flatpak: Tuyệt vời cho app Desktop nhưng lại quá cồng kềnh cho các CLI tool cần can thiệp sâu vào hệ thống.
  3. Container (Podman/Docker): Lựa chọn tốt để cách ly môi trường. Tuy nhiên, với những script nhẹ nhàng, chạy container đôi khi giống như “dùng dao mổ trâu để giết gà”.

Đóng gói chuyên nghiệp với rpm-build và rpmlint

Trong hệ sinh thái Fedora/RHEL, RPM là “ngôn ngữ gốc”. Đóng gói .rpm giúp bạn tận dụng sức mạnh của dnf: tự động cài dependencies, quản lý version và triển khai hàng loạt qua Repo nội bộ chỉ với một lệnh duy nhất.

Bước 1: Thiết lập môi trường

Đầu tiên, hãy cài đặt bộ công cụ xây dựng và kiểm tra gói. Mở terminal và chạy lệnh:

sudo dnf install -y rpm-build rpmlint rpmdevtools

Ngay sau đó, hãy khởi tạo cấu trúc thư mục làm việc của RPM bằng lệnh:

rpmdev-setuptree

Lệnh này tạo ra thư mục ~/rpmbuild với các ngăn chứa chuyên dụng: SOURCES (mã nguồn), SPECS (file cấu hình build), và RPMS (thành phẩm cuối cùng).

Bước 2: Chuẩn bị mã nguồn

Giả sử mình có script itfromzero-hello.sh. Mình sẽ nén nó lại theo đúng chuẩn phiên bản 1.0.

# Tạo cấu trúc thư mục
mkdir -p itfromzero-hello-1.0
cat <<EOF > itfromzero-hello-1.0/itfromzero-hello.sh
#!/bin/bash
echo "Chào mừng bạn đến với itfromzero.com!"
EOF

# Đóng gói tarball
tar -czvf itfromzero-hello-1.0.tar.gz itfromzero-hello-1.0/
mv itfromzero-hello-1.0.tar.gz ~/rpmbuild/SOURCES/

Bước 3: Viết file SPEC – Linh hồn của gói RPM

Di chuyển vào ~/rpmbuild/SPECS và tạo file itfromzero-hello.spec. Đây là nơi bạn định nghĩa “chứng minh thư” cho phần mềm.

Name:           itfromzero-hello
Version:        1.0
Release:        1%{?dist}
Summary:        Script chào hỏi từ itfromzero

License:        MIT
URL:            https://itfromzero.com
Source0:        %{name}-%{version}.tar.gz

BuildArch:      noarch
Requires:       bash, curl

%description
Ví dụ đóng gói RPM chuẩn chỉnh cho SysAdmin và Developer.

%prep
%setup -q

%install
mkdir -p %{buildroot}/usr/bin
install -m 0755 itfromzero-hello.sh %{buildroot}/usr/bin/itfromzero-hello

%files
/usr/bin/itfromzero-hello

%changelog
* Sun May 17 2026 Admin <[email protected]> - 1.0-1
- Initial package

Lưu ý quan trọng: Mục Requires là nơi bạn liệt kê dependencies. Nếu máy đích thiếu curl, DNF sẽ tự động tải về trước khi cài tool của bạn.

Bước 4: Kiểm tra với rpmlint

Đừng vội build ngay. Hãy để rpmlint soi lỗi cú pháp giúp bạn. Đây là thói quen của các package maintainer chuyên nghiệp.

rpmlint ~/rpmbuild/SPECS/itfromzero-hello.spec

Nếu xuất hiện lỗi (Error), bạn bắt buộc phải sửa. Các cảnh báo (Warning) có thể xem xét bỏ qua tùy trường hợp.

Bước 5: Xuất bản gói RPM

Khoảnh khắc mong chờ nhất đã đến. Dùng lệnh rpmbuild để nhào nặn ra file cài đặt:

rpmbuild -ba ~/rpmbuild/SPECS/itfromzero-hello.spec

Sau vài giây, file RPM sẽ nằm gọn gàng trong thư mục ~/rpmbuild/RPMS/noarch/, sẵn sàng để phân phối.

Bước 6: Kiểm tra thành quả

Hãy thử cài đặt gói vừa tạo như một phần mềm thực thụ:

sudo dnf install ~/rpmbuild/RPMS/noarch/itfromzero-hello-1.0-1.fc40.noarch.rpm

itfromzero-hello và tận hưởng kết quả. Thật chuyên nghiệp phải không?

Lời kết

Làm quen với rpm-build lúc đầu có thể thấy hơi “ngợp” vì đống cú pháp trong file .spec. Nhưng tin mình đi, khi bạn quản lý hàng chục server, việc sở hữu một Repo RPM nội bộ sẽ giúp bạn kê cao gối ngủ ngon. Thay vì tốn 2 giờ gõ lệnh thủ công, bạn chỉ mất 2 phút để dnf update trên toàn bộ hệ thống. Đừng ngại thử sai, vì đó là cách nhanh nhất để nâng cấp kỹ năng Linux của bạn!

Share: