Linux

Linux 控制台 - 以程式方式檢測 USB 儲存分配給哪個設備

  • February 1, 2013

每天早上 9 點,我們將外部 HD 插入我們的辦公室伺服器(始終連接到同一個 USB 埠)。

HD 每天都是新的,但它們都是由同一製造商 (Freecom) 製造的。

每天上午 12 點,都會執行一個腳本,將所有內容備份到 HD。

第一步是以這種方式安裝 HD:

mount /dev/sdc1 /mnt/backup

問題是有時設備文件不是 /dev/sdc1 而是其他文件(即 /dev/sdd1)。我仍然無法弄清楚為什麼我們沒有插入其他任何東西並且我們總是使用相同的埠。

所以我的問題是如何以非常安全的方式以程式方式檢測正確的設備文件。到目前為止,我唯一的想法是 grep /dev/disk/by-id 目錄的內容以從該行中查找並提取 /dev/xxx:

lrwxrwxrwx 1 root root 10 Sep 24 11:03 usb-Freecom_ToughDrive_1A90102657FF-part1 -> ../../sdc1

有更好的建議嗎?對我的方式有任何擔憂嗎?

我很驚訝 lsusb 怎麼幫不了我那麼多。

by-id條目是一個連結,在大多數情況下,您可以簡單地使用它而不是/dev/sdc1. 如果沒有,你可以取消引用它readlink

readlink -f /dev/disk/by-id/usb-Freecom_ToughDrive_1A90102657FF-part1
/dev/sdc1

您可以使用 udev 規則輕鬆修復。udev 規則在啟動時和各種熱插拔事件中執行,以執行特殊處理程序/服務或設置設備命名。聽起來您希望 udev 規則始終將驅動器命名為 /dev/backup 之類的名稱,因此 mtab 條目可以始終將 /dev/backup 掛載到 /mnt/backup (如果您甚至可以自動掛載設備)我喜歡。

這是編寫 udev 規則的較舊但仍然主要相關的指南。在最近的 Linux 發行版udevinfo功能已被折疊到udevadm命令中。使用這樣的命令應該可以幫助您確定要匹配的特定欄位:

udevadm info -q all --path=/sys/block/sdc

一旦您知道哪些欄位足以進行映射,您將需要在其中創建一個 udev 規則文件/etc/udev/rules.d/(注意,規則文件是按自然排序順序評估的,並且您的分發可能有它自己的規則儲存在某處,例如/lib/udev/rules.d/相應的名稱)。您需要創建一個看起來像這樣的規則,它將創建一個/dev/backup指向設備名稱的符號連結:

ENV{DEVTYPE}=="disk", ID_SERIAL=="Freecom_ToughDrive_1A90102657FF", SYMLINK+="backup"
ENV{DEVTYPE}=="partition", ID_SERIAL=="Freecom_ToughDrive_1A90102657FF", SYMLINK+="backup%n"

注意:我根據/dev/disk/by-id/您上面的列表猜測上面的序列號。這可能與正確的欄位或正確的值不匹配。進一步注意,這與特定序列號匹配,因此與特定設備匹配,如果您更改設備,則需要更改此設置。

希望有幫助!

簡單的方法:由於我一直使用 udev 來打磨產品以供客戶消費,這通常是我最先接觸到的東西。/dev/disk/by-idudev 已經通過創建設備唯一條目來做您想做的事情。只需將您/etc/mtab的安裝/dev/disk/by-id/Freecom_ToughDrive_1A90102657FF-part1/mnt/backup. 腳本中的Amount /mnt/backup就足夠了。

引用自:https://serverfault.com/questions/184321