1. 程式人生 > >debian 的u盤自動掛載

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/

    下新建U盤載入規則檔案,數字小點為了覆蓋掉原來的規則,也可以自己找到原本的U盤載入規則檔案,我是沒找到放棄。 中間名字任取,結尾一定要以.rules結束。如: 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盤拔出注意事項

注意事項:

  1. 如果不解除安裝直接拔,可能讓正在使用檔案的程序崩潰。
  2. 如果正在寫入,直接拔會損壞檔案,嚴重者會損壞快閃記憶體。
  3. linux有寫入快取機制(將需要寫入到磁碟的資料先在記憶體中快取起來,在合適的時候才真正寫入到磁碟中,用以提高磁碟操作效率),直接拔會讓看似寫入完畢的檔案消失。

因此:

  • 拔出U盤前必需先umount /dir
  • 拔出U盤後,確保刪除mount目錄,檢查下/dev/sd*之類裝置是否自刪了。

所以回頭看指令碼中的自動解除安裝發生的太遲了點。等你拔出U盤時,umount那條命令以經沒意義了,所以無法儲存寫入的資料 ,只能做做掃尾工作了(刪除mount 目錄)。

那如何在直接拔U前資料能儲存進去呢?
測試了下使用sync函式可行。每次儲存資料後跟著執行一次發現直接拔除也能儲存了。也可以在確定要拔出前執行一次就好。
sync作用就是強制將有改變的blocks塊內容寫到磁碟,更新super blocks.

後續 疑惑:
debian下將掛載位置弄到/media/下,總是自動彈窗,在/mnt位置就沒有這現象,看來d-bus還有其它操作了。