某些場景下,服務器可能沒有必要的鍵盤等輸入設備、屏幕等輸出設備。此時需要在沒有人為干預的情況下實現當插入U盤或者硬盤后自動掛載,並執行某些腳本動作。以下是我的實踐過程。
必要組件
- udev,udisks
- busybox (需要用到blkid)可以直接獲取到設備的卷標,這樣就可以指定掛載路徑名稱了。
實現
規則編寫
編寫udev規則實現U盤插入時候的動作。規則文件寫在/etc/udev/rules.d 下。
如上, 通過規則定義U盤插入與拔出的動作即可,動作的具體實現可以在規則中編寫,也可以通過指定執行腳本來實現。本文的規則中僅指定執行腳本。
規則如下:
ENV{DEVTYPE}="partition",RUN+="/lib/udev/automount.sh",ENV{REMOVE_CMD}="/lib/udev/autounmount.sh"
- 1
腳本編寫
將腳本文件寫在/lib/udev 下,根據上文規則,應該分別實現插入的動作腳本和拔出的動作腳本。
插入動作腳本
主要在於需要獲取到設備的卷標,來確定掛載的路徑(即$ID_FS_LABEL)
#!/bin/sh mount_point=$ID_FS_LABEL if [ -z $mount_point ];then mount_point=${DEVNAME##*/} fi if [ -n $mount_point ];then mkdir -p /media/$mount_point mount -t $ID_FS_TYPE -o gid=100,dmask=000,fmask=111,utf8,flush,rw,noatime,users $DEVNAME /media/$mount_point fi
拔出動作腳本
在U盤拔出時候,及時刪掉掛載的路徑
mount_point=$ID_FS_LABEL if [ -z $mount_point ];then mount_point=${DEVNAME##*/} fi if [ -n $mount_point ];then umount -l /media/$mount_point rm -r /media/$mount_point fi
自動執行動作腳本
這樣,當U盤插入時,/media/ 下就會出現於卷標相同的文件夾,並掛載上了U盤。因此,需要實現U盤插入自動執行的話,通過輪詢探測/media/ 下相應目錄是否存在即可。
如:
UDISK=$1 # ---------------main control area --------------- while (true) do # probe mounted disk if [ -e "$UDISK" ];then echo "Mounted device [$UDISK] found !" else echo "Device not found [$UDISK] !" fi echo "Sleep for sometime..." sleep 3s done
需要注意的問題
新版本的udev可能會遇到mount失效的問題,通過查詢資料可知,udev的rules運行於獨立的文件空間上,與用戶的文件空間不同,因此及時掛載上了,用戶也無法訪問。因此需要將udev的運行方式改為共享。
修改方式如下:
- 拷貝一份
/usr/lib/systemd/system/systemd-udevd.service到/etc/systemd/system/(推薦) - 編輯
/etc/systemd/system/將MountFlags改為shared - 重啟即可。
