如何寫入字元特殊設備?
由於
udev
我試圖從中拯救數據的機器上的設置損壞(請參閱我的這篇文章),我正在嘗試寫入與 USB 快閃記憶體驅動器相對應的“字元特殊”設備,但遇到了困難。我期望的是(具有root權限)我可以這樣做:
echo "test 123" > /dev/bus/usb/001/031
但我明白了
bash: echo: write error: Invalid argument
這是怎麼回事?如何寫入字元設備?
PS:這很有趣,因為我通常期望的塊設備(
/dev/sdb
, stuff in/dev/block
)由於某種原因沒有被創建。然而,我注意到當我插入 USB 驅動器時確實會創建一個字元設備(並在我移除它時移除它)。如果我能找到某種方法來寫入該設備,我就可以省去很多通過音頻電纜緩慢傳輸數據的麻煩(這是我目前最好的方法)。
這些是“原始 USB”設備。使用它們需要幾個特定於 USB 的
ioctl()
功能:僅從 shell 將原始數據寫入它們根本不可能完成很多工作。必須首先將數據格式化為有效的 USB 數據包,然後使用ioctl()
函式建立與該設備內正確 USB 端點的連接。由於我們討論的是 USB 儲存設備,因此該過程會更加複雜:使用這些 USB 數據包,應該有六種可能的儲存命令集之一。在實踐中,最常見的命令集是“SCSI 透明”命令集——一種封裝在 USB 中的 SCSI 協議。
/dev/sg*
因此,您首先必須通過製作自己的 SCSI 命令包來學習如何使用設備寫入磁碟設備。一旦實現了這一點,您就可以在該過程中添加特定於 USB 的包裝器,然後才能使用這些設備將原始塊寫入 USB 儲存/dev/bus/usb/<busnum>/<devnum>
設備。在大多數情況下,使用原始 USB
ioctl()
非常乏味,除非您需要一些非常具體的東西:大多數需要原始 USB 訪問的程序員將使用libusb
或其他一些庫(例如libftdi
硬體開發人員級訪問 FTDI USB 到串列轉換器晶片)來為他們處理 USB 的基本機制。簡而言之,您必須已經是一個相當成熟的 USB I/O 程序員才能在像您這樣的救援情況下成功使用原始 USB 儲存設備。話雖如此,您的另一篇文章看起來您必須完成一次真正史詩般的數據救援行動。為此,我尊重你的成就……但我也希望你已經了解了備份的重要性。