Linux 文件系統採用異步寫入機制,數據先進緩衝區再刷入介質。若未 umount 直接拔除 USB 隨身碟,程序仍回傳成功,實際數據卻可能遺失。掌握可靠的連接狀態偵測方法,對資料安全至關重要。
USB 存儲驅動在設備插拔時會更新 /proc/scsi/usb-storage-0/0(路徑因內核版本與控制器編號而異),關鍵字段 Attached: Yes/No 直接反映連接狀態:
cat /proc/scsi/usb-storage-0/0
# 輸出片段
Attached: Yes # 已連接
Attached: No # 已拔除
注意:此狀態與是否 mount 無關,僅反映硬件連接層面。
# 列出所有 USB 設備
lsusb -t
# 針對存儲類設備(Class=08 Mass Storage)
lsusb -d : | grep -i "mass storage"
# 內核 sysfs 介面,實時監控
watch -n 1 'ls /sys/bus/usb/devices/ | grep -E "^[0-9]+-[0-9]+"'
/sys/bus/usb/devices/ 下每個設備目錄包含 idVendor、idProduct、manufacturer、product 等屬性文件,腳本可解析判斷特定隨身碟是否在線。
建立 /etc/udev/rules.d/99-usb-monitor.rules:
# USB 存儲設備插入
ACTION=="add", SUBSYSTEM=="block", SUBSYSTEMS=="usb", RUN+="/usr/local/bin/usb-notify.sh add %k %n"
# USB 存儲設備拔除
ACTION=="remove", SUBSYSTEM=="block", SUBSYSTEMS=="usb", RUN+="/usr/local/bin/usb-notify.sh remove %k %n"
配套腳本 /usr/local/bin/usb-notify.sh:
#!/bin/bash
ACTION=$1
DEV=$2
PART=$3
TIMESTAMP=$(date '+%F %T')
echo "[$TIMESTAMP] USB $ACTION: /dev/$DEV$PART" >> /var/log/usb-events.log
# 可擴展:發送郵件、推送 Webhook、觸發備份腳本等
此法無需輪詢,即時響應,並留存完整審計軌跡。
import psutil, time
def list_usb_disks():
return [p.device for p in psutil.disk_partitions()
if 'removable' in p.opts or 'usb' in p.device]
known = set(list_usb_disks())
while True:
time.sleep(2)
current = set(list_usb_disks())
added = current - known
removed = known - current
if added: print(f"[{time.ctime()}] 插入: {added}")
if removed: print(f"[{time.ctime()}] 拔除: {removed}")
known = current
最佳實踐:生產系統採用 方法三(udev 事件驅動) 作為核心,輔以 方法二 定期巡檢校驗,確保零遺漏。所有寫入操作務必 sync 後再 umount,養成「安全移除」肌肉記憶。