Linux

檢測到設備已安裝到特定文件夾?

  • May 8, 2013

作為改進我的備份方案的一部分,我現在正在添加旋轉外部硬碟驅動器,讓一個始終安全地離開現場,而另一個則接收備份數據。自然,為了確保我的備份真正完成,備份將被編寫腳本和 cron’d。

我的計劃是手動插入並安裝硬碟驅動器,然後將其留在那裡直到需要解除安裝它(再次手動),將其拿走,帶入下一個,然後(手動)安裝那個。兩個驅動器都將安裝到例如 /mnt/backup。

現在,問題來了:如果我忘記插入或安裝硬碟驅動器,我不希望備份腳本執行。因此,我需要能夠在允許腳本執行之前檢測是否有設備安裝到 /mnt/backup。我的第一個想法是在(未掛載的)/mnt/backup 目錄中放置一個名為“NO_DRIVE_MOUNTED”的文件,然後在執行備份常式之前確保該文件存在,但這只是感覺很糟糕。(同樣,在每個外部硬碟驅動器中放置一個名為“BACKUP_DEVICE_READY”的文件並檢查該文件是否存在的相反感覺就像黑客一樣。)

有沒有更好的方法來檢測設備是否安裝到給定目錄?我寧願避免檢查設備本身,因為我的經驗是在 Linux 中插入驅動器只會將其分配給下一個可用的 /dev/sdX,所以雖然備份驅動器有一天可能是 /dev/sdf,如果我下次連接備份驅動器時插入了不同的驅動器,它將是 /dev/sdg,這意味著 /dev/sdf 的測試將失敗!我還希望避免特定於設備的辨識(例如通過 UUID),以便我可以更輕鬆、更透明地更換/升級驅動器。

這將在 Ubuntu 10.10 上(或者可能是 11.04,如果我拖得足夠長,因為我正在重建整個伺服器),理想情況下,我想要一個簡單的單行測試,我可以前綴我的備份命令直接在我的 crontab 中(但我也不害怕 Bash 腳本,如果這是必要的話)。

您可以像在 cron 中那樣執行備份腳本

fgrep -q /mnt/backup /proc/mounts && backup.sh

但最好在腳本中添加測試,以記錄失敗的嘗試

這裡有兩種檢查是否/mnt/backup是掛載點的方法。該/proc/mounts方法特定於Linux,該df方法可移植到所有unix系統;除此之外,沒有主要原因選擇其中一個。當掛載點包含空格時,兩者都可能在極端情況下失敗(只是……不要那樣做!)。

case $(df -P /var) in *" /var") echo mounted;; esac
if fgrep -q " /tmp " </proc/mounts; then echo mounted; fi

請注意,您可以根據設備序列號、文件系統 UUID 或文件系統標籤(後者可能是一個可靠的指標)等標準,將特定設備名稱分配給特定的可移動驅動器。只需要 udev 配置中的一行。但是,雖然這有助於在適當的掛載點上進行掛載是一個好主意,但依賴設備的存在並不好:設備可能存在但未掛載,因此如果您的腳本依賴於掛載的設備,它應該檢查掛載觀點。

引用自:https://unix.stackexchange.com/questions/10870