debian 的u盤自動掛載
參考用指令碼實現U盤的自動掛載
板子是用的debian,插上U盤時會自動掛載U盤到/media/root/
下,還自動彈出視窗,需求是想換個地方,不彈窗,名字固定下來,所以才想到自己更改配置檔案。
查了下板子上的debian的檔案系統使用的動態裝置管理工具是udev,(mdev是udev的精簡版,適用於嵌入式的)。
背景知識
man udev看了看,
udev的配置在/etc/udev下,udev有兩類檔案,
- 1.Configuration file
/etc/udev/udev.conf
—main configuration file ,不用改動- 2.Rules files
-
顧名思義,就是定義匹配規則的檔案,udev依照這些檔案的匹配執行相應程式,該檔案必須以.rules
default rules directory
/lib/udev/rules.d/
the custom rules directory
/etc/udev/rules.d/
the temporary rules directory
/run/udev/rules.d/
所有rules檔案(無論在哪個目錄下)依lexical order規則(由小到大)優先執行,同名檔案,優先權:/etc/ > /run >/lib ,
其它具體自己找man吧,這裡以u盤說明
U盤自動掛載操作
step 1. 在/etc/udev/rules.d/
10-usbdisk.rules
,內容如下KERNEL=="sd[a-e]*", SUBSYSTEM=="block", RUN+="/path/to/script.sh"
規則檔案每一行都至少有一對
key-value
,多對用“,”分隔,
key==value:指條件相等的match,
key+=value:KEY中新增值。KERNEL
Match the name of the event device.SUBSYSTEM
Match the subsystem of the event device.RUN
Add a program to the list of programs to be executed for a specific device.step 2. 寫匹配後的執行指令碼script.sh,放置到上述指定的絕對路徑中,相對路徑預設通常是/lib/udev/,指令碼內容如下:
#!/bin/sh # log日誌 LOG=/var/log/usb-hotplug.log logtime=$(date) # 掛載位置 MDIR=/mnt/udisk echo "$logtime:$DEVPATH requesting $ACTION" >> $LOG if [ "$ACTION" = "add" ]; then if [ ! -d $MDIR ]; then echo "the $MDIR is not exist,mkdir" >>$LOG mkdir -p $MDIR fi mount $DEVNAME $MDIR echo "$logtime:mount $DEVNAME $MDIR" >> $LOG elif [ "$ACTION" = "remove" ]; then umount $MDIR rmdir $MDIR echo "$logtime:umount $DEVNAME -$ACTION" >> $LOG fi
ACTION
Match the name of the event action.DEVPATH
Match the devpath of the event device.step 3 注意指令碼加上執行許可權,
chmod a+x path/to/script
,基本上就OK了,不需要重啟機子,如果不行再重啟試試吧。
u盤強拔後的儲存問題
linux下在沒有umount時直接拔出U盤,會使得寫入U盤的資料消失。度娘了下U盤拔出注意事項
注意事項:
- 如果不解除安裝直接拔,可能讓正在使用檔案的程序崩潰。
- 如果正在寫入,直接拔會損壞檔案,嚴重者會損壞快閃記憶體。
- linux有寫入快取機制(將需要寫入到磁碟的資料先在記憶體中快取起來,在合適的時候才真正寫入到磁碟中,用以提高磁碟操作效率),直接拔會讓看似寫入完畢的檔案消失。
因此:
- 拔出U盤前必需先umount /dir
- 拔出U盤後,確保刪除mount目錄,檢查下/dev/sd*之類裝置是否自刪了。
所以回頭看指令碼中的自動解除安裝發生的太遲了點。等你拔出U盤時,umount那條命令以經沒意義了,所以無法儲存寫入的資料 ,只能做做掃尾工作了(刪除mount 目錄)。
那如何在直接拔U前資料能儲存進去呢?
測試了下使用sync函式可行。每次儲存資料後跟著執行一次發現直接拔除也能儲存了。也可以在確定要拔出前執行一次就好。
sync作用就是強制將有改變的blocks塊內容寫到磁碟,更新super blocks.
後續 疑惑:
debian下將掛載位置弄到/media/下,總是自動彈窗,在/mnt位置就沒有這現象,看來d-bus還有其它操作了。