linux 實現U盤自動掛載


某些場景下,服務器可能沒有必要的鍵盤等輸入設備、屏幕等輸出設備。此時需要在沒有人為干預的情況下實現當插入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的運行方式改為共享。
修改方式如下:

    1. 拷貝一份 /usr/lib/systemd/system/systemd-udevd.service/etc/systemd/system/ (推薦)
    2. 編輯/etc/systemd/system/MountFlags 改為 shared
    3. 重啟即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM