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_DEVTMPFS và CONFIG_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_DEVTMPFS và CONFIG_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.