![在 Linux 中卸載可拆卸設備(eSATA、USB 儲存)](https://rvso.com/image/1288697/%E5%9C%A8%20Linux%20%E4%B8%AD%E5%8D%B8%E8%BC%89%E5%8F%AF%E6%8B%86%E5%8D%B8%E8%A8%AD%E5%82%99%EF%BC%88eSATA%E3%80%81USB%20%E5%84%B2%E5%AD%98%EF%BC%89.png)
像 eSATA、USB 驅動器這樣的可拆卸設備可以突然移除(只需拔掉插頭)。
如果分割區上有開啟的檔案句柄,則該分割區將不會卸載,即 Linuxumount
命令將失敗,即使在實體分離磁碟機之後也是如此。
如果卸載失敗,則重新連接裝置時mount
也會失敗。因此,您必須找出哪些進程正在使用該磁碟機並殺死它們或關閉所有句柄。如果兩者都做不到,則必須重新啟動盒子才能安裝驅動器。我絕對不能殺死使用它的進程。
我沒有看到“強制卸載”選項,有一個-f
選項,但它僅適用於 NFS。
這聽起來很奇怪,Linux 不適應用戶簡單地拉動驅動器的這種情況嗎?有誰知道如何在 Linux 中優雅地處理這種情況?
有什麼方法可以找出特定分割區/裝置上開啟的檔案句柄,或僅針對特定裝置選擇性地刷新和關閉所有檔案句柄?
注意:該lsof
命令在我使用的嵌入式Linux(busybox)中不可用。
“fuser”在我的嵌入式 Linux 中不可用。
我嘗試了惰性umount -l。然而,它似乎並不能始終如一地發揮作用。例如,我保持文件句柄開啟(在裝置上的某些文件上使用“tail -f”)。然後我分離一個驅動器,然後執行“umount -l”並將其卸載。然後我重新連接驅動器並嘗試將其再次安裝在同一安裝點上,同時尾部仍在運行。它並不能始終如一地發揮作用。有時會成功,有時則不會。這讓我在使用惰性選項時感到不舒服,如果它使檔案系統處於不一致的狀態呢?而且我也不確定這個惰性選項是否適用於這種情況。
我無法終止開啟文件句柄的進程。
似乎如果我已將設備安裝在/mnt/abc 上,並且如果我斷開驅動器連接然後重新連接,Linux 似乎會將設備的文件系統重新附加到同一安裝點“/mnt/abc”,而無需我們執行任何操作卸載或安裝。然後,相同的舊開啟檔案句柄似乎在重新附加後開始工作(至少對於檔案讀取操作)。這是我的觀察。我不確定這是否是預期的行為。
我有一個打開的文件句柄用於讀取(“tail -f”),我將其保持打開狀態,然後我分離並重新附加,然後修改了被尾隨的文件,我看到“tail -f”輸出隨著更改而更新。但是,如果我在裝置消失後嘗試修改檔案(它會按預期給出錯誤)然後重新附加,則裝置的檔案系統不會正確地重新附加到同一安裝點。如果進行檔案寫入(當設備不存在時),它似乎不起作用。
當突然移除磁碟機而沒有關閉所有句柄並正確卸載所有分割區時,Linux 是否遵循任何標準/一致的行為?
答案1
您可以編寫一個 bash 腳本來掃描 中列出的所有檔案描述符/proc
(假設您有)並列出/終止進程。
/proc/$m/fd/$n
是以符號連結形式呈現的 PID m 的第 n 個檔案描述符。busybox
確實有 readlink 支持,所以你應該能夠自動執行它。
編輯:只是說這本質上是重新實現lsof
,但實際上相當簡單。
答案2
您可以使用lsof
來列出某個目錄下開啟的檔案lsof +D /path/to/mountpoint
。
答案3
你有沒有嘗試過:
umount -l /path/to/mountpoint
fuser -km /path/to/mountpoint
好吧,所以我之前的建議沒有奏效。我知道這可能很愚蠢,但你真的嘗試過嗎:
umount -f /path/to/mountpoint
根據 Busybox 文檔,它應該是強制卸載選項(以 NFS 為例)。
如果這不起作用,您是否嘗試過:
eject -s /dev/my-sata-or-usb-device
答案4
當您缺少時,一個快速解決方案lsof
是將
find /proc/*/fd | xargs readlink | grep /mount_point
mount_point 替換為實際的安裝點。這是基於bilc.cn上面的回答。