Cắt giảm sự rườm rà: Tại sao mạng tối giản lại quan trọng
Hầu hết các bản phân phối Linux hiện đại đều đi kèm với các ngăn xếp mạng (networking stacks) nặng nề đến mức ngạc nhiên. Nếu bạn từng mất 20 phút để gỡ lỗi thụt đầu dòng YAML trong Netplan hoặc chờ NetworkManager khởi tạo trên một máy chủ không màn hình (headless), bạn sẽ cảm nhận được sự cồng kềnh đó. Trong khi NetworkManager rất tuyệt vời cho laptop thường xuyên chuyển đổi Wi-Fi, nó thường tiêu tốn từ 30MB đến 50MB RAM—một con số đáng kể đối với các thiết bị IoT nhỏ hoặc các instance VPS cấu hình thấp.
Các công cụ cấp cao này về cơ bản là các lớp bao bọc (wrappers). Khi mất kết nối, cuối cùng bạn lại phải đi khắc phục sự cố cho lớp bao bọc thay vì ngăn xếp mạng thực tế. systemd-networkd thay đổi điều đó. Đây là một dịch vụ tích hợp sẵn, quản lý cấu hình một cách trực tiếp. Nó cực kỳ nhẹ, thường sử dụng ít hơn 8MB bộ nhớ và khởi động chỉ trong tích tắc.
Tôi nhận thấy rằng việc chuyển sang systemd-networkd là một bước ngoặt cho các môi trường mật độ cao. Trên một cụm 500 node Raspberry Pi, quá trình chuyển đổi này đã giảm thời gian khởi động trung bình 4 giây cho mỗi thiết bị. Nó mang lại mức độ ổn định và dự đoán được mà các trình quản lý cồng kềnh đơn giản là không thể sánh kịp.
Ba trụ cột: Cách thức hoạt động của systemd-networkd
Hiểu được tư duy của systemd-networkd dễ dàng hơn nhiều so với việc ghi nhớ các tham số CLI phức tạp. Hãy quên các cơ sở dữ liệu hay các script ẩn đi. Daemon này dựa trên các tệp văn bản đơn giản nằm trong /etc/systemd/network/.
Bạn chỉ cần nắm vững ba loại tệp:
- .link: Chúng xử lý việc khớp phần cứng ở cấp độ thấp. Hãy sử dụng chúng nếu bạn cần đổi tên
eth0thành một tên cụ thể dựa trên địa chỉ MAC. - .netdev: Dùng để tạo các thiết bị ảo. Nếu bạn cần một Bridge cho container hoặc một thẻ VLAN, hãy bắt đầu từ đây.
- .network: Đây là công cụ bạn dùng hàng ngày. Nó xác định cách một interface hoạt động, bao gồm DHCP, IP tĩnh và định tuyến (routing).
Hệ thống xử lý các tệp này theo thứ tự từ điển. Một tệp có tên 10-static.network sẽ được ưu tiên hơn 20-dhcp.network. Khi một interface đã khớp với một quy tắc trong tệp trước đó, hệ thống sẽ ngừng tìm kiếm. Đây là một hệ thống phân cấp đơn giản giúp ngăn chặn xung đột cấu hình.
Hướng dẫn di chuyển: Chuyển đổi hệ thống của bạn
Hãy đi từ lý thuyết đến thực hành. Chúng ta sẽ vô hiệu hóa trình quản lý hiện tại và chuyển sang một thiết lập sạch sẽ, hiệu suất cao.
Bước 1: Dọn đường
Trước khi khởi chạy systemd-networkd, bạn phải ngăn các dịch vụ khác tranh giành quyền kiểm soát phần cứng. Trên Ubuntu hoặc Debian, NetworkManager thường là tác nhân chính.
# Dừng và vô hiệu hóa các dịch vụ nặng nề
sudo systemctl stop NetworkManager
sudo systemctl disable NetworkManager
# Người dùng Netplan: Chúng ta sẽ bỏ qua hoàn toàn Netplan bằng cách viết
# các tệp cấu hình systemd gốc.
Bước 2: Xác định phần cứng
Bạn cần tên chính xác của interface. Hãy chạy lệnh ip link để xem nhân (kernel) đã nhận diện được gì.
ip link show
Tìm các tên như enp3s0 hoặc eth0. Trong các ví dụ sau, chúng ta sẽ sử dụng enp3s0.
Bước 3: Thiết lập IP tĩnh
Tạo một tệp cấu hình mới. Sử dụng tiền tố bằng số giúp bạn kiểm soát mức độ ưu tiên của nhiều tệp sau này.
sudo nano /etc/systemd/network/10-static-enp3s0.network
Nhập cấu hình sau:
[Match]
Name=enp3s0
[Network]
Address=192.168.1.50/24
Gateway=192.168.1.1
DNS=8.8.8.8
DNS=1.1.1.1
Lệnh này yêu cầu hệ thống chọn enp3s0, gán cho nó một IP cố định và định tuyến lưu lượng qua các máy chủ DNS của Google và Cloudflare.
Bước 4: Thiết lập DHCP “Cài một lần dùng mãi mãi”
Nếu bạn muốn router tự cấp phát IP, cấu hình thậm chí còn ngắn hơn. Hãy tạo tệp /etc/systemd/network/20-dhcp-wired.network:
[Match]
Name=enp*
[Network]
DHCP=yes
Ký tự đại diện enp* là một mẹo rất hữu ích. Nó áp dụng quy tắc này cho bất kỳ cổng Ethernet nào bắt đầu bằng các chữ cái đó, giúp cấu hình của bạn có thể sử dụng linh hoạt trên các model phần cứng khác nhau.
Bước 5: Xây dựng Bridge cho ảo hóa
Nếu bạn chạy các container LXC hoặc máy ảo KVM, bạn cần một bridge. Theo cách truyền thống, việc này yêu cầu công cụ brctl và các script lộn xộn. Với systemd-networkd, đây là một quy trình hai bước sạch sẽ.
Đầu tiên, định nghĩa thiết bị bridge trong /etc/systemd/network/25-br0.netdev:
[NetDev]
Name=br0
Kind=bridge
Tiếp theo, liên kết cổng vật lý của bạn với bridge đó trong /etc/systemd/network/30-bind-br0.network:
[Match]
Name=enp3s0
[Network]
Bridge=br0
Bước 6: Kích hoạt
Bây giờ, hãy khởi động daemon. Bạn cũng nên bật systemd-resolved để xử lý các logic DNS một cách chính xác.
sudo systemctl enable --now systemd-networkd
sudo systemctl enable --now systemd-resolved
# Liên kết stub của resolved tới /etc/resolv.conf để hỗ trợ các ứng dụng cũ
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
Kiểm tra và khắc phục sự cố
Kiểm tra kết quả bằng lệnh networkctl. Nó cung cấp nhiều thông tin hơn hẳn lệnh ifconfig cũ.
networkctl status
networkctl list
Nếu trạng thái hiển thị là “routable” (có thể định tuyến) và “configured” (đã cấu hình), thiết lập của bạn đã ổn. Nếu gặp trục trặc, hãy kiểm tra log. Vì đây là dịch vụ systemd gốc, mọi sự kiện mạng đều được ghi lại trong journal trung tâm.
journalctl -u systemd-networkd -f
Lời kết
Chuyển sang systemd-networkd có thể giống như một bước nhảy vọt nếu bạn đã quen với các công cụ giao diện đồ họa (GUI). Tuy nhiên, hiệu quả về hiệu suất là không thể phủ nhận. Nó loại bỏ lớp “hộp đen” của mạng và cung cấp cho bạn khả năng kiểm soát trực tiếp, dễ dự đoán. Bằng cách sử dụng các tệp văn bản đơn giản và các dịch vụ gốc, bạn sẽ xây dựng được một hệ thống khởi động nhanh hơn, dễ tự động hóa hơn và bảo trì đơn giản hơn đáng kể theo thời gian.

