在之前編程首先語音刷抖音的博文里提到過udev,現(xiàn)在回顧一下:
什么是udev?
- udev是一個設備管理工具,udev以守護進程的形式運行,通過偵聽內(nèi)核發(fā)出來的uevent來管理/dev目錄下的設備文件。udev在用戶空間運行,而不在內(nèi)核空間 運行。它能夠根據(jù)系統(tǒng)中的硬 件設備的狀態(tài)動態(tài)更新設備文件,包括設備文件的創(chuàng)建,刪除等。設備文件通常放在/dev目錄下。使用udev后,在/dev目錄下就只包含系統(tǒng)中真正存在的設備。
?本節(jié)就深入學習以下udev相關的知識,以下是一些參考鏈接:
[Linux 基礎] -- udev 和 rules 使用規(guī)則_udev rules_BestW2Y的博客-CSDN博客
udev概述
在之前多次提到過:Linux中一切皆文件。在早期的 Linux 版本中,/dev 目錄包含了所有可能出現(xiàn)的設備的設備文件。很難想象 Linux 用戶如何在這些大量的設備文件中找到匹配條件的設備文件。現(xiàn)在 udev 只為那些連接到 Linux 操作系統(tǒng)的設備產(chǎn)生設備文件。并且 udev 能通過定義一個 udev 規(guī)則(rule)來產(chǎn)生匹配設備屬性的設備文件,這些設備屬性可以是內(nèi)核設備名稱、總線路徑、廠商名稱、型號、序列號或者磁盤大小等等。
udev 添加/刪除 設備文件的過程
udev的規(guī)則(rule)?
規(guī)則文件是 udev 里最重要的部分,默認是存放在 /etc/udev/rule.d/ 下。所有的規(guī)則文件必須以 ".rules" 為后綴名。
下面是一個簡單的規(guī)則:(規(guī)則就是規(guī)則文件里的內(nèi)容)
KERNEL=="sda", NAME="my_root_disk", MODE="0660"
其中:KERNEL 是匹配鍵,NAME 和 MODE 是賦值鍵。這條規(guī)則的意思是:如果有一個設備的內(nèi)核名稱為 sda,則該條件生效,執(zhí)行后面的賦值:在 /dev 下產(chǎn)生一個名為my_root_disk 的設備文件,并把設備 文件的權限設為 0660。?
同時,在語音刷抖音項目中,手機接入香橙派不能識別的解決辦法,也是在udev的rules文件夾下創(chuàng)建規(guī)則文件“ 51-android.rules ”,并寫入以下規(guī)則:
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0666"
為什么此處的規(guī)則要這么寫?
首先,插入的手機usb設備對應的設備文件在“/dev/bus/usb/001”下:
可見,這個文件的名字是063(001是系統(tǒng)的)
通過“ udevadm info --attribute-walk --name=/dev/bus/usb/001/設備名字?” 可以看到設備的詳細信息,此處設備名字就寫063:
其中,就可以找到剛剛規(guī)則中第一句“?SUBSYSTEM=="usb"?”的由來:
、
- 這也是為什么規(guī)則第一句寫上“?SUBSYSTEM=="usb"?”,udev就能知道:這條規(guī)則是針對手機這個設備。
- 第二句的“ ENV{DEVTYPE}=="usb_device" ”,和第一句一樣,都是匹配鍵:用來設置環(huán)境變量;
- 最后一句的“ MODE="0666"?”才是賦值鍵,用來賦予權限
所以其實,想要通過規(guī)則來匹配一個設備文件,方法不止一種,我同樣可以用其他的屬性來進行匹配:
比如,在上圖打印的信息中注意到了VID和PID的值,用他們來寫規(guī)則:
SUBSYSTEM=="usb", ATTR{idProduct}=="ff08", ATTR{idVendor}=="2717", MODE="0666"
那么現(xiàn)在這條規(guī)則實現(xiàn)的效果 和 “之前那條使用環(huán)境變量來匹配的規(guī)則實現(xiàn)的效果” 是一樣的。
為了驗證,我修改 “ /etc/udev/rules.d/ ” 下的 “51-android.rules”:
然后再次插入手機。并查看“/dev/bus/usb/001”路徑:
可見,多了一個078
然后調(diào)用“adb devices”:
可見可以成功臉上,說明用新的規(guī)則確實可以成功匹配到手機的設備文件
udev 規(guī)則的匹配鍵
- ACTION:事件(uevent)的行為,例如:add(添加設備)、remove(刪除設備)
- KERNEL:內(nèi)核設備名稱,例如:sda,cdrom
- DEVPATH:設備的 devpath 路徑?
- SUBSYSTEM:設備的子系統(tǒng)名稱,例如:sda 的系統(tǒng)為 block
- BUS:設備在 devpath 里的總線名稱,例如:usb
- DRIVER:設備在 devpath 的設備驅動名稱,例如:ide-cdrom
- ID:設備在 devpath 里的識別號
- SYSFS{filename}:設備的 devpath 路徑下,設備的屬性文件 "filename" 里的內(nèi)容
- ENV{key}:環(huán)境變量。在一條規(guī)則中,可以設定最多五條環(huán)境變量的 匹配鍵
- PROGRAM:調(diào)用外部命令
- RESULT:外部命令 PROGRAM 的返回結果
?
U盤的自動掛載
拿出我的U盤,它同樣有一個USB口,將它接入香橙派:
然后執(zhí)行“ dmesg ”指令:
可見,內(nèi)核識別到了這個設備!且顯示是sda4
然后執(zhí)行“sudo mount /dev/sda4 /mnt/” 再 “cd /mnt” 就可以查看U盤中的內(nèi)容:
(亂碼是因為文件名是中文)
但是這樣很麻煩,每次U盤插入后還要執(zhí)行兩個指令,可以用udev來實現(xiàn)U盤的自動掛載:
首先,執(zhí)行“?udevadm info --attribute-walk --name=/dev/sda4 ”來查看U盤的信息:
在里面可以選取用于匹配U盤的udev規(guī)則,通常使用KERNAL 或 SUBSYSTEM來匹配U盤
那么話不多說,直接再次 “ cd /etc/udev/rules.d/ ” 然后 “ sudo vim my_storage.rules ”
規(guī)則具體為:
ACTION=="add", SUBSYSTEMS=="block", SUBSYSTEM=="block", RUN{program}+="/bin/mkdir
/media/%k" ,RUN{program}+="/usr/bin/systemd-mount --no-block --collect $devnode
/media/%k"
- ACTION:匹配鍵,匹配添加設備的動作
- SUBSYSTEMS:匹配鍵,匹配為block(此處也可以是usb)
- SUBSYSTEM:匹配鍵,匹配為block
通過這三個匹配鍵,匹配到U盤
- RUN:運行命令,此處執(zhí)行“?/bin/mkdir ”指令創(chuàng)建一個名為“media“的文件夾,里面有名為“%k” 的文件,%k是sda/sdb的通配符
- RUN:運行命令,此處執(zhí)行“ /usr/bin/systemd-mount ”指令掛載U盤到“%k”文件夾下
實現(xiàn)效果
重新拔插U盤,并“sudo service udev restart”重啟udev后,查看media文件夾:
可見此時沒有輸入任何命令,就可以訪問U盤的文件了,成功實現(xiàn)了U盤的自動掛載!
另外,可以安裝一個tree指令來查看U盤文件,使用“sudo apt-get install tree”來安裝;
安裝完成后,進入media文件夾后,直接輸入" tree ”,就可以清晰的看到文件結構了:
此時拔掉U盤,再次輸入“tree”:?
文章來源:http://www.zghlxwxcb.cn/news/detail-753907.html
可見,此時就沒有任何文件了!文章來源地址http://www.zghlxwxcb.cn/news/detail-753907.html
到了這里,關于使用香橙派學習Linux udev的rules 并實現(xiàn)U盤的自動掛載的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!