Khám phá hệ thống quản lý mạng netifd trong OpenWrt qua ubus và script Shell

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

Thẻ: openwrt netifd ubus shell-script network-automation

Đăng vào ngày 22 tháng 7 lúc 03:36