Cần container siêu nhẹ trên Fedora? Hãy thử systemd-nspawn thay vì Docker

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

Tại sao systemd-nspawn là “vũ khí bí mật” của Sysadmin?

Sau 2 năm dùng Fedora làm máy chính, mình nhận ra Docker hay Podman đôi khi giống như việc dùng xe tải để đi chợ. Chúng rất mạnh, nhưng quá dư thừa nếu bạn chỉ cần một sandbox sạch để test script bash hoặc chạy thử app trên một bản distro cũ.

Đó là lúc systemd-nspawn tỏa sáng. Công cụ này thường được gọi vui là “chroot trên steroids”. Nó tận dụng kernel namespaces để ảo hóa file system, process tree và network nhưng lại tích hợp sâu vào systemd. Một container nspawn khởi động gần như tức thì, thường mất chưa đến 1 giây để bạn có một shell hoàn chỉnh.

Điểm khác biệt lớn nhất? Không daemon chạy ngầm, không storage driver phức tạp. Nó đơn giản, trực tiếp và cực kỳ nhẹ. Nếu Docker ngốn hàng trăm MB RAM để duy trì hạ tầng, thì một container nspawn rỗng gần như không làm kim đồng hồ tài nguyên suy chuyển.

Cài đặt và chuẩn bị môi trường

Trên Fedora, công cụ này nằm trong gói systemd-container. Bạn hãy mở terminal và gõ:

sudo dnf install systemd-container -y

Tiếp theo, chúng ta cần một root filesystem (bộ khung hệ điều hành). Thay vì kéo image từ Docker Hub, mình sẽ dùng dnf để cài một bản Fedora tối giản vào thư mục /var/lib/machines. Đây là nơi machinectl quản lý các container một cách tập trung.

# Tạo thư mục chứa máy ảo
sudo mkdir -p /var/lib/machines/fedora-sandbox

# Cài đặt Fedora 39 Minimal (chiếm khoảng 250-300MB disk space)
sudo dnf --installroot=/var/lib/machines/fedora-sandbox --releasever=39 \
    groupinstall "Minimal Install" -y

Quá trình này tải về các package cơ bản nhất. Bạn sẽ có một hệ điều hành Fedora thu nhỏ nằm gọn trong một thư mục.

Khởi chạy và cấu hình container

Để vào thẳng container, bạn chỉ cần một lệnh duy nhất. Tuy nhiên, để nó hoạt động như một máy ảo thực thụ với tiến trình init riêng, hãy thêm flag -b (boot).

Đặt mật khẩu Root

Trước khi boot lần đầu, hãy đặt mật khẩu để có thể đăng nhập. Đừng quên bước này nếu không bạn sẽ bị kẹt ở màn hình login:

sudo systemd-nspawn -D /var/lib/machines/fedora-sandbox passwd

Tiến hành Boot hệ thống

Bây giờ, hãy tận hưởng tốc độ của nó:

sudo systemd-nspawn -bD /var/lib/machines/fedora-sandbox

Màn hình boot sẽ hiện ra ngay lập tức. Để thoát ra ngoài, bạn nhấn phím Ctrl + ] ba lần liên tiếp. Đây là tổ hợp phím “thoát hiểm” đặc trưng của systemd.

Xử lý Network nhanh gọn

Mặc định container sẽ dùng chung mạng với máy host. Nếu muốn nó có IP riêng và tách biệt hoàn toàn, hãy dùng flag -n:

sudo systemd-nspawn -bD /var/lib/machines/fedora-sandbox -n

Lúc này, systemd tự tạo một cặp card mạng ảo (veth). Container của bạn giờ đây trông như một thực thể độc lập trong mạng nội bộ.

Quản lý chuyên nghiệp với machinectl

Nếu systemd-nspawn là động cơ, thì machinectl là vô lăng. Nó giúp bạn quản lý danh sách container cực kỳ nhàn nhã.

Xem các container đang chạy:

machinectl list

Mở một shell mới vào container (tương tự docker exec):

machinectl shell fedora-sandbox

Một tính năng mình cực thích là giới hạn tài nguyên. Vì mỗi container thực chất là một systemd service, bạn có thể giới hạn RAM trực tiếp mà không cần cấu hình file phức tạp:

# Ép container không được dùng quá 512MB RAM
sudo systemctl set-property [email protected] MemoryMax=512M

Kinh nghiệm thực tế: Khi nào nên chọn systemd-nspawn?

Dựa trên kinh nghiệm vọc vạch của mình, hãy dùng systemd-nspawn khi:

  • Build RPM package: Cần môi trường sạch để tránh xung đột dependency trên máy chính.
  • Chạy Systemd bên trong: Docker vốn rất “ghét” chạy systemd bên trong container. Với nspawn, đây là tính năng mặc định, không cần workaround.
  • Lab hệ thống: Khi bạn muốn thử xóa rm -rf / để xem hệ thống sụp đổ thế nào mà không sợ hỏng máy thật.

Tất nhiên, nếu dự án cần scale lên hàng trăm node với Kubernetes, Podman vẫn là lựa chọn số 1. Nhưng với nhu cầu cô lập ứng dụng nhẹ nhàng và hiệu năng cao nhất, systemd-nspawn thực sự không có đối thủ trên Fedora.

Anh em có gặp khó khăn khi cấu hình bridge network hay mount folder giữa host và container không? Để lại comment mình cùng thảo luận nhé!

Share: