Về /dev trong Embedded Linux

Đây là nội dung pick up từ manual của Buildroot.

Nó mô tả khá rõ về /dev trong hệ thống Linux, cùng
với các giải pháp dành cho hệ thống Embedded Linux.

6.2 /dev management

Trên 1 hệ thống Linux, thư mục /dev chứa các file đặc biệt, được gọi là
device files (hay các file thiết bị), cho phép ứng dụng phía user truy cập
đến các thiết bị phần cứng mà Linux kernel quản lý. Nếu không có những file đặc
biệt này, ứng dụng phía user không thể sử dụng được các thiết bị phần cứng, thậm
chí chú có được Linux kernel nhận ra một cách đúng đắn đi chăng nữa.

Dưới System configuration của Buildroot, có /dev management, có 4 giải pháp
khác nhau để hangle thư mục /dev này:

  • Solution 1: Tĩnh sử dụng bảng thiết bị
    Đây là cách khá cũ để handle các file thiết bị trong Linux. Bằng cách này, các file
    thiết bị sẽ được lưu trữ không đổi (persistently)trên hệ thống file gốc
    (root filesystem) (chúng luôn không đổi qua mỗi lần reboot), và không có quá trình
    tự động thêm, xóa những file thiết bị này khi phần được thêm, gỡ từ hệ thống. Buildroot
    cho phép tạo ra một tập các file thiết bị này sử dụng bảng thiết bị (device table),
    mặc định chúng sẽ nằm ở system/device_table_dev.txt trong source code của Buildroot.
    File này sẽ được sử dụng khi Buildroot tạo ảnh hệ thống file cuối cùng
    (final root filesystem image), vì thế nó sẽ không xuất hiện trong thư mục
    output/target. Tùy chọn BR2_ROOTFS_STATIC_DEVICE_TABLE cho phép thay đổi bảng
    thiết bị mặc định mà Buildroot sẽ sử dụng. Bạn có thể tạo bảng thiết bị của riêng
    cho dự án của mình.

  • Solution 2: Động chỉ sử dụng devtmpfs thôi
    devtmpfs là một hệ thống file “ảo” (chỉ nằm trên RAM) trong Linux kernel, được
    được vào ở phiên bản kernel 2.6.32 (nếu bạn sử dụng kernel cũ hơn, thì không thể
    sử dụng option này). Khi được mount vào /dev hệ thống file ảo này sẽ tự động làm
    cho các file thiết bị xuất hiện hoặc không xuất hiện tương ứng với thiết bị phần
    cứng được thêm hay được rút khỏi hệ thống. Hệ thống file này sẽ không được bảo
    toàn sau mỗi lần reboot, đơn giản vì nó được thay đổi động bởi kernel. Khi muốn
    sử dụng devtmpfs, trong cấu hình kernel, các tham số sau phải được bật:
    CONFIG_DEVTMPFSCONFIG_DEVTMPFS_MOUNT. Khi Buildroot thực hiện việc build
    Linux kernel cho hệ thống của bạn thì nó sẽ đảm bảo chắc chắn 2 option trên được
    bật. Còn khi bạn tự build Linux kernel bên ngoài Buildroot, bạn phải có trách nhiệm
    bật 2 option đó (Nếu không làm thế, hệ thống sau khi build sẽ không khởi động được
    đâu)

  • Solution 3: Động sử dụng devtmpfs + mdev
    Cách này vẫn dựa trên hệ thống file ảo devtmpfs đã nói ở trên (vì thế để sử dụng
    được thì phải bật 2 option: CONFIG_DEVTMPFSCONFIG_DEVTMPFS_MOUNT) khi
    cấu hình Linux kernel, và nó thêm một tiện ích phía userspace, đó là mdev phía
    trên của devtmpfs. mdev là một chương trình, một phần của Busybox, chương trình
    này sẽ được kernel gọi mỗi khi 1 thiết bị được thêm hoặc loại bỏ khỏi hệ thống.
    Nhờ file cấu hình tại /etc/mdev.conf, mdev có thể được cấu hình một cách linh
    hoạt. Ví dụ, set quyền hoặc ownership cho file thiết bị, gọi một script hoặc ứng
    dụng bất cứ khi nào một thiết bị xuất hiện hoặc biến mất, etc. Về cơ bản, nó cho
    phép phía userspace tham gia vào sự kiện thêm hoặc loại bỏ thiết bị. Ví dụ, việc
    load tự động kernel modules khi thiết bị xuất hiện trên hệ thống. mdev cũng đóng
    vai trò quan trọng nếu bạn có thiết bị yêu cầu firmware để hoạt động được, nó sẽ
    chịu trách nhiệm đẩy nội dung chuyển nội dung firmware cho kernel. mdev là phiên
    nhẹ nhàng của udev. Thông tin chi tiết về mdev và cú pháp file cấu hình có
    thể xem tại đây

  • Solution 4: Động sử dụng devtmpfs + eudev
    Cách này cũng tiếp tục dựa trên hệ thống file ảo devtmpfs đã nói ở trên, nhưng
    thêm một ứng dụng chạy daemon (ngầm) bên trên devtmpfs, đó là eudev. eudev
    là ứng dụng chạy ngầm nhận lời gọi từ kernel khi một thiết bị được thêm hoặc loại
    bỏ khỏi hệ thống. Nó nặng hơn so với mdev, nhưng cung cấp tính mềm dẻo tốt hơn.
    eudev là một phiên bản chạy độc lập của udev - chính là ứng dụng chạy ngầm phía
    userspace được sử dụng trong hầu hết các bản phân phối Linux desktop. Hiện tại nó
    cũng là 1 phần của systemd nữa.

Các developer của Buildroot khuyến nghị sử dụng Solution 2 (Động chỉ sử dụng
devtmpfs). Nếu bạn cần phía userspace được thông báo khi có sự kiện thêm/loại bỏ
thiết bị hoặc firmware khi cần, thì Solution 3 là một lựa chọn tốt.

Có 1 chú ý ở đây, nếu systemd được chọn làm init system, thì /dev sẽ được
thực hiện bởi udev cung cấp từ chính systemd.