Trong các hệ thống Linux nhúng, việc quản lý giao diện mạng luôn là chức năng then chốt. OpenWrt – bản phân phối phổ biến cho router – sử dụng netifd để cung cấp khả năng điều khiển linh hoạt và nhẹ nhàng thông qua kiến trúc sự kiện và giao diện RPC dựa trên ubus. Khác với cách tiếp cận truyền thống dùng ifup/ifdown, netifd cho phép can thiệp sâu vào quá trình cấu hình và tự động hóa nâng cao.
Cấu trúc netifd và tương tác qua ubus
Hệ thống netifd chia nhỏ chức năng mạng thành ba lớp: thiết bị (device), giao thức (proto) và giao diện (interface). Việc tách biệt này giúp dễ dàng mở rộng mà không cần thay đổi lõi hệ thống.
ubus list | grep network
network
network.device
network.interface
Mỗi namespace cung cấp các phương thức riêng. Ví dụ, kiểm tra trạng thái giao diện WAN:
ubus call network.interface.wan status | jsonfilter -e '@.up'
Tự động hóa cấu hình mạng động
Quản lý VLAN tự động
Tạo VLAN ảo ID 100 trên cổng eth0:
# Kiểm tra tồn tại trước khi tạo
ubus call network.device status '{"name":"eth0.100"}' || \
ubus call network add_dynamic_interface '{
"name": "vlan100",
"proto": "static",
"device": "eth0.100"
}'
Lập lịch kích hoạt VLAN hàng ngày:
0 18 * * * ubus call network.interface.vlan100 up
Kích hoạt lại DHCP chủ động
Buộc gia hạn hợp đồng DHCP ngay lập tức:
ubus call network.interface.wan renew
Kết hợp với giám sát kết nối để tự động khôi phục:
while ! ping -c1 8.8.8.8 >/dev/null; do
ubus call network.interface.wan down
sleep 2
ubus call network.interface.wan up
sleep 60
done
Xử lý sự kiện mạng theo thời gian thực
Giám sát trạng thái giao diện bằng lệnh ubus listen:
ubus listen network.interface | while read -r event; do
case "$event" in
*"\"up\":true"*) logger "Giao diện đã bật" ;;
*"\"up\":false"*) logger "Giao diện đã tắt" ;;
esac
done
Hoặc sử dụng cơ chế hotplug bằng cách tạo tập tin hook tại /etc/hotplug.d/iface/99-custom:
#!/bin/sh
[ "$ACTION" = "ifup" ] && {
logger "Giao diện $INTERFACE vừa được kích hoạt"
# Gọi script xử lý tiếp theo ở đây
}
Viết giao thức tùy chỉnh
Tạo giao thức mới bằng cách đặt script vào thư mục /lib/netifd/proto/. Ví dụ đơn giản:
cat > /lib/netifd/proto/custom_proto.sh << 'EOF'
#!/bin/sh
custom_init_config() {
proto_config_add_string "endpoint"
}
custom_setup() {
local iface="$1"
local target=$(uci get network.$iface.endpoint)
logger "Kết nối $iface tới $target..."
# Thực thi logic kết nối tại đây
}
proto_run_command() {
proto_add_default_handler
proto_send_update "$INTERFACE"
}
EOF
Sau đó khai báo trong /etc/config/network:
config interface 'mylink'
option proto 'custom_proto'
option endpoint 'gateway.local'
Gỡ lỗi và tối ưu hiệu năng
Theo dõi log thời gian thực:
logread -f | grep netifd
Điều chỉnh tham số hiệu năng trong UCI:
| Tham số | Mặc định | Đề xuất | Mô tả |
|---|---|---|---|
| retry_timeout | 5 | 2 | Khoảng chờ giữa các lần thử lại |
| req_timeout | 20 | 10 | Thời gian chờ yêu cầu DHCP |
| auto_retry | 1 | 0 | Tắt thử lại tự động để dùng logic tùy chỉnh |
uci set network.wan.retry_timeout=2
uci commit network
/etc/init.d/network reload