做者:三十三重天html
博客:http://www.zhouhuibo.clublinux
經過學習和分享的過程,將本身工做中的問題和技術總結輸出,但願菜鳥和老鳥都能經過本身的文章收穫新的知識,並付諸實施。程序員
udev介紹
來源:https://linux.cn/article-10329-1.html微信
建立這樣一個腳本,當指定的設備插入時觸發你的計算機去作一個指定動做。編輯器
udev 是一個爲你的計算機提供設備事件的 Linux 子系統。通俗來說就是,當你的計算機上插入了像網卡、外置硬盤(包括 U 盤)、鼠標、鍵盤、遊戲操縱桿和手柄、DVD-ROM 驅動器等等設備時,代碼可以檢測到它們。這樣就能寫出不少可能很是有用的實用程序,而它已經很好了,普通用戶就能夠寫出腳本去作一些事情,好比當某個硬盤驅動器插入時,執行某個任務。工具
使用udev進行一個簡單的配置
使用udev進行一個簡單配置,配置後的實際表現爲:當U盤插入機器時,向系統/tmp目錄生成一個寫入當前系統時間的文本文件學習
執行腳本
cd /tmp
打開你喜歡的文本編輯器,而後輸入下面的簡單腳本:測試
echo `date` >> /tmp/trigger.log
向臨時目錄寫入當前時間,腳本名稱保存爲trigger.sh.並執行並運行 chmod +x
授予可運行權限ui
接下來就是經過udev的方式去觸發此腳本url
udev腳本
使用 udevadm monitor
命令你能夠實時利用 udev,而且能夠看到當你插入不一樣設備時發生了什麼。用 root 權限試一試。
$ su # udevadm monitor
udevadm monitor
命令提供了許多很好的信息,可是你可使用 udevadm info
命令以更好看的格式來看到。你也能夠經過fdisk -l
命令查看當前已經分配的卷標。
udev的規則都保存在/etc/udev/rules.d
目錄下,經過命令cd /etc/udev/rules.d`切換置當前目錄。
新增一個測試規則,規則後綴使用.rules纔可以被程序識別。
使用編輯器寫入以下內容,保存爲001.rules
SUBSYSTEM=="block", ACTION=="add", RUN+="/etc/udev/trigger.sh"
文件的內容解釋爲:當有一個usb設備新增的時候,執行定義的腳本文件。固然你也能夠經過更多的個性化配置讓觸發的範圍更加精細話,例如能夠指定某個品牌的設備,或者單獨的某個U盤。這些能夠經過百度查詢到內容,也能夠在上門的連接中得到內容。
啓動配置規則
udevadm control —reload
此時能夠經過插入u盤,查看系統盤符下是否會生成trigger文件,幷包含當前日期。若是不行,可能有倆個問題
一、腳本文件須要設置在/etc/udev/rules.d/
目錄下,我也不知道 爲何,當腳本放置在當前文件中就能夠執行,若是有知道的請在評論區告訴我
二、有些時候重置配置規則沒用,使用重啓
實戰
配置u盤插入自動掛載
執行過程:使用udev配置規則,規則是當檢測到u盤插入時執行一段腳本【自動掛載腳本】,當u盤拔出時也執行一段腳本【自動卸載u盤腳本】。在實際使用過程當中能夠將掛載和卸載腳本放置在一箇中,根據參數進行區分。首先開始配置規則
udev規則文件
010.rules,放置在/etc/udev/rules.d
目錄下
###########---USB---################ #----------------------------------# KERNEL=="sd[a-z]*", SUBSYSTEM=="block", ACTION=="add", RUN+="/etc/udev/rules.d/zhiyuan_udev.sh usb %k" KERNEL=="sd[a-z]*", SUBSYSTEM=="block", ACTION=="remove", RUN+="/etc/udev/rules.d/zhiyuan_udev.sh usb %k", OPTIONS="last_rule" ##########---CF card---############# #----------------------------------# KERNEL=="hd[a-z]*", SUBSYSTEM=="block", ACTION=="add", RUN+="/etc/udev/rules.d/zhiyuan_udev.sh cf %k" KERNEL=="hd[a-z]*", SUBSYSTEM=="block", ACTION=="remove", RUN+="/etc/udev/rules.d/zhiyuan_udev.sh cf %k", OPTIONS="last_rule" #########-----SD------############## #----------------------------------# KERNEL=="mmcblk[0-9]*", SUBSYSTEM=="block", ACTION=="add", RUN+="/etc/udev/rules.d/zhiyuan_udev.sh sd %k" KERNEL=="mmcblk[0-9]*", SUBSYSTEM=="block", ACTION=="remove", RUN+="/etc/udev/rules.d/zhiyuan_udev.sh sd %k", OPTIONS="last_rule"
而後編寫執行腳本內容[zhiyuan_udev.sh] ,也放置在相同的目錄
/etc/udev/rules.d
中,放在其餘的目錄就算給了777的執行權限也沒法執行
#! /bin/sh #通常U盤插入以後會在/dev下產生一個sda和一個sda1節點, #可是隻有sda1是能夠掛載的。sda是設備,sda1是分區 #有的U盤只會產生一個/dev/sda節點,此時就應該掛載sda。 #這個腳本不區分設備節點和分區節點,一概先掛載, #可是掛載失敗以後會當即清除創建的掛載點 #-------------------------------------------------# #磁盤種類 設備節點 設備分區節點 #U盤 sd[a-z] sd[a-z][0-9] #SD卡 mmcblk[0-9] mmcblk[0-9]p[0-9] #CF卡 hd[a-z] hd[a-z][0-9] #-------------------------------------------------# #說明:在這個腳本中的能夠把udev腳本的ACTION做爲環境變量來用, #可是沒法使用KERNEL #-------------------------------------------------# if [ $# -ne 2 ] ; then #輸入參數必須是兩個 exit 1 fi MNT_PATH=/media/ #掛載移動設備的目錄 #DEV_PRE=$1 #參數1:掛載點的前綴 DEV_NAME=$2 #參數2:設備在/dev下的名字 FS_TYPE=vfat #設備的文件系統類型 if [ $ACTION == "add" ] ; then #設備插入 # echo "=======add==========" >> /media/udev.txt wr /bin/mkdir -p $MNT_PATH$DEV_NAME /bin/mount /dev/$DEV_NAME $MNT_PATH$DEV_NAME >& /dev/null if [[ $? -ne 0 ]] ; then #mount失敗則清除剛剛創建的目錄 # echo "mount $DEV_NAME fialed" >> /media/udev.txt wr /bin/rmdir $MNT_PATH$DEV_NAME fi elif [ $ACTION == "remove" ] ; then # echo "=======remove==========" >> /media/udev.txt #設備移除 if [[ -e $MNT_PATH$DEV_NAME ]] ; then /bin/umount -l $MNT_PATH$DEV_NAME >& /dev/null wr /bin/rmdir $MNT_PATH$DEV_NAME fi fi exit 0
END
歡迎關注公衆號 程序員工具集 👍👍 致力於分享優秀的開源項目、學習資源 、經常使用工具
回覆關鍵詞「關注禮包」,送你一份最全的程序員技能圖譜。
回覆關鍵詞"wx"添加我的微信,勾搭做者,歡迎來聊^-^。