經過昨天的底層探險,我們的 EdgeNode 已經成功掛載了 dwc2 驅動,硬體上完全具備了變身為 USB Device 的能力。
在十年前,要讓 Linux 變成一顆隨身碟,教學文都會叫你敲這行指令: sudo modprobe g_mass_storage file=/path/to/disk.img 要變成網卡,就敲: sudo modprobe g_ether
這種把功能「寫死在單一核心模組 (Monolithic Module)」的做法,在早期非常流行,但隨著 EdgeNode 這種複雜的邊緣運算場景出現,它很快就暴露了致命的缺點。
[錯誤嘗試] 魚與熊掌不可兼得的悲劇
在我們的專案中,我們希望當 EdgeNode 插上醫療用 Windows 電腦時:
它是一顆 FAT32 隨身碟,裡面放著擷取下來的 CSV 報表。
它同時也是一個 虛擬序列埠 (COM Port),允許工程師透過終端機敲指令進去 Debug。
如果你用傳統的模組載入法:
bash
sudo modprobe g_mass_storage file=/pi.img
sudo modprobe g_serial
第二行絕對會報錯。因為在 USB 協定的世界裡,g_mass_storage 在初始化的時候,就會向底層的 dwc2 控制器宣告:「這個 USB 插座歸我管了,其他人滾開!」 這導致你無法在同一條 USB 實體線上,同時擁有兩個功能。這對於需要「複合裝置 (Composite Device)」的現代應用來說是不可接受的。
[底層原理] ConfigFS:把作業系統當成樂高積木
為了解決這個問題,Linux 核心引進了一個極具革命性的概念:ConfigFS (Configuration Filesystem),並搭配 libcomposite 模組。
什麼是虛擬檔案系統? 在 Linux 哲學中,「一切皆檔案」。ConfigFS 是存在於 RAM 中的虛擬目錄,通常掛載在 /sys/kernel/config/。 它最神奇的地方在於:當你在這個目錄下新建一個資料夾 (mkdir) 時,Linux Kernel 就在底層實體化了一個對應的 C 語言結構體 (Struct)!
這徹底改變了開發者與核心互動的方式。我們不再需要像以前那樣,用晦澀的 C 語言寫死模組參數然後重新編譯核心。現在,我們只需要寫一個 Shell Script,透過 mkdir 和 echo 寫入文字檔,就能在 User Space (使用者空間) 「動態組合」出我們想要的 USB 設備。
[最終解決方案] libcomposite 初體驗
想要體驗把作業系統當樂高玩的快感嗎?我們來看看用 ConfigFS 捏出一顆隨身碟的概念腳本:
bash
# 1. 載入 libcomposite 核心模組 (這是一個空的複合裝置容器)
modprobe libcomposite
# 2. 在 ConfigFS 中建立我們的自訂 USB 設備目錄
cd /sys/kernel/config/usb_gadget/
mkdir edge_node
cd edge_node
# 3. 定義這顆設備的「身分證號」(PID/VID 決定了 Windows 怎麼辨識它)
echo 0x1d6b > idVendor # Linux Foundation
echo 0x0104 > idProduct # Multifunction Composite Gadget
# 4. 建立一組隨身碟功能 (Mass Storage)
mkdir functions/mass_storage.usb0
echo /home/pi/fat32.img > functions/mass_storage.usb0/lun.0/file
# 5. 建立一組序列埠功能 (CDC ACM)
mkdir functions/acm.usb0
# 6. 將這兩個功能「掛載」到這條 USB 虛擬線上
mkdir configs/c.1
ln -s functions/mass_storage.usb0 configs/c.1/
ln -s functions/acm.usb0 configs/c.1/
# 7. 開啟開關:把設定綁定到實體的 dwc2 控制器上!
ls /sys/class/udc > UDC
當你執行完最後一行 echo ... > UDC 的瞬間,Windows 電腦就會同時發出兩次「叮咚」聲。 一次,它看到了一顆新的隨身碟;另一次,裝置管理員裡多出了一個 COM Port。
這就是 ConfigFS 帶來的魔法:動態、彈性、強大!
預告
雖然上面的腳本看起來很完美,但在實戰中,如果照抄這段腳本,你的隨身碟可能只能讀不能寫,或者拔插幾次後就崩潰了。 明天,我們將實戰探討隨身碟參數的秘密:ro, removable, cdrom 與防呆設計,讓這顆虛擬隨身碟變得跟真的一樣堅固!