我正在開發一個應用程序,有時需要寫入 USB 驅動器單元。該應用程式以非超級用戶權限執行,我認為在驅動器上寫入的最佳方法是在插入驅動器後立即使用刷新選項安裝它,這樣,理論上我不需要使用以下 udev 規則執行任何 umount 操作:
ACTION="add", KERNEL="sd*[0-9]", SUBSYSTEMS="usb", RUN+="/bin/sh mymountscript.sh '%E{DEVNAME}'"
安裝腳本嘗試以這種方式呼叫命令:
mount -o --flush $1 /media/my-user/my-usb-unit
但我得到這個安裝錯誤:
mount: wrong fs type, bad option, bad superblock on /dev/sdb1,
missing codepage or helper program, or other error
令人好奇的是,只有在嘗試透過 udev 規則安裝它時,我才會收到此錯誤,如果我呼叫mymountscript.sh
自己,該單元就會正確安裝在該點上。
除了這個問題的解決方案之外,我想知道這樣做是否有風險(我理解這是因為我在寫入檔案後沒有卸載驅動器)。如果我採取另一種方式,我將需要應用程式腳本(代表使用者執行)能夠自行安裝/卸載單元。為此,我需要在插入設備名稱時將其保存在某處,並授予應用程式安裝權限。
作業系統是Xubuntu 16.04。
答案1
我的解決方法是這樣管理它:
一項用於 USB 插入操作的 udev 規則。
同時,腳本本身也會掛載/卸載驅動器。
一項用於 USB 刪除操作的 udev 規則。
USB 已插入
我執行一個腳本,該腳本僅將設備名稱儲存到文件中。我可以在此規則中附加任何其他腳本:
ACTION=”add”, KERNEL=”sd*[0-9]*”, SUBSYSTEMS=”usb”, RUN+=”/bin/sh my-usb-inserted.sh”, RUN+=”/bin/sh myownscript.sh”
在這裡,myownscript.sh
將使用安裝設備掛載,允許標準用戶安裝/卸載可移動驅動器。我可以在這些腳本之後調用任何其他腳本,只要我在下一個使用它之前卸載每個腳本中的單元。
USB 移除
在這裡,一個簡單的腳本刪除了創建的文件my-usb-inserted.sh
,因此我們知道腳本中沒有插入任何閃存單元。
ACTION=”remove”, KERNEL=”sd*[0-9]*”, SUBSYSTEMS=”usb”, RUN+=”/bin/sh usb-removed.sh”
這一解決方法沒有考慮到必須處理多個 USB 驅動器。
也可以看看: