linux嵌入式系統下實現U盤、SD卡自動掛載功能

在 Linux的嵌入式系統中我們經常用到U盤、SD卡的掛載,而每次都手動掛載或卸載非常麻煩,我們可以採取以下方法實現自動掛載或卸載U盤、SD卡
這就要用到mdev了
其具體操作如下:
1、首先在/etc/init.d/rsC中加入以下語句
echo /sbin/mdev > /proc/sys/kernel/hotplug


2、在/etc/下簡歷medv.conf的文件,包含以下內容
sd[a-z][0-9]      0:0 666        @(/etc/hotplug/insert.sh $MDEV $SUBSYSTEM)
sd[a-z]           0:0 666        $(/etc/hotplug/remove.sh $MDEV $SUBSYSTEM)
ub[a-z][0-9]      0:0 666        @(/etc/hotplug/insert.sh $MDEV $SUBSYSTEM)
ub[a-z]           0:0 666        $(/etc/hotplug/remove.sh $MDEV $SUBSYSTEM)
mmcblk[0-9]p[0-9] 0:0 666        @(/etc/hotplug/insert.sh $MDEV $SUBSYSTEM)
mmcblk[0-9]       0:0 666        $(/etc/hotplug/remove.sh $MDEV $SUBSYSTEM)


3、在/etc/下建立以下文件夾hotplug,並在hotplug目錄下建立以下文件,包含以下內容
insert.sh:
if [ -n "$1" ] ; then
    if [ -b /dev/$1 ]; then
        if [ ! -d /media ]; then
            mkdir -p /media
        fi
        if [ ! -d /media/$1 ]; then
            mkdir -p /media/$1
        fi
             mount /dev/$1 /media/$1
if [ $? -ne 0 ]; then
    rm -rf /media/$1
        fi
    fi
fi
remove.sh:
MOUNTS=$(mount | grep $1 | cut -d' ' -f3)
umount $MOUNTS
rm -rf $MOUNTS
(特別提醒:上面的代碼在實際使用中可以直接複製,但注意換行符)


插入U盤、SD等設備,即可在根目錄的/media目錄下建立相應的文件夾,掛載對用的磁盤文件


而其原理是:
mdev是busybox自帶的一個簡化版的udev,適合於嵌入式的應用場合。其具有使用簡單的特點。它的作用,就是在系統啓動和熱插拔或者動態加載驅動程序時,自動產生驅動程序所需的節點文件。在以busybox爲基礎構建嵌入式linux的根文件系統時,使用它是最優的選擇。


mdev的使用在busybox中的mdev.txt文檔已經將得很詳細了。但作爲例子,我簡單講講我的使用過程:
(1)在編譯時加上對mdev的支持:
    Linux System Utilities  --->             
                           mdev      
          
   Support /etc/mdev.conf         
   Support command execution at device addition/removal
(2)在啓動時加上使用mdev的命令:
我在自己創建的根文件系統(nfs)中的/linuxrc文件中添加了如下指令:
#掛載/sys爲sysfs文件系統
    echo "----------mount /sys as sysfs"
    /bin/mount -t tmpfs mdev /dev
    /bin/mount -t sysfs sysfs /sys
    echo "----------Starting mdev......"
    /bin/echo /sbin/mdev > /proc/sys/kernel/hotplug
    mdev -s
注意:是/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug,並非/bin/echo /bin/mdev > /proc/sys/kernel/hotplug。
 
(3)在你的驅動中加上對類設備接口的支持。
  在驅動程序的初始化函數中,使用下述的類似語句,就能在類設備目錄下添加包含設備號的名爲“dev”的屬性文件。並通過mdev
在/dev目錄下產生gpio_dev0的設備節點文件。
  my_class = class_create(THIS_MODULE, "gpio_class");
  if(IS_ERR(my_class)) {
    printk("Err: failed in creating class./n");
    return -1;
  }
 
  class_device_create(my_class, MKDEV(gpio_major_number, 0), NULL, "gpio_dev%d" ,0);
  在驅動程序的清除程序段,加入以下語句,以完成清除工作。
  class_device_destroy(my_class, MKDEV(gpio_major_number, 0));
  class_destroy(my_class);
  需要的頭文件是linux/device.h,因此程序的開始應加入下句
  #include
  另外,my_class是class類型的結構體指針,要在程序開始時聲明成全局變量。
  struct class *my_class;
  上述程序中的gpio_major_number是設備的主節點號。可以換成需要的節點號。gpio_dev是最終生成的設備節點文件的名子。%d是用於以相同設備自動編號的。gpio_class是建立的class的名稱,當驅動程序加載後,可以在/sys/class的目錄下看到它。上述語句也不一定要在初始化和清除階段使用,可以根據需要在其它地方使用。
(4)至於/etc/mdev.conf文件,可有可無,不影響使用,只是添加了些功能。
執行mdev -s:
以‘-s’爲參數調用位於/sbin目錄寫的mdev(其實是個鏈接,作用是傳遞參數給/bin目錄下的busybox程序並調用它),mdev掃描 /sys/class 和/sys/block中所有的類設備目錄,如果在目錄中含有名爲“dev”的文件,且文件中包含的是設備號,則mdev就利用這些信息爲這個設備在/dev下創建設備節點文件。一般只在啓動時才執行一次 “mdev -s”。
熱插拔事件:
由於啓動時運行了命令:echo /sbin/mdev > /proc/sys/kernel/hotplug ,那麼當有熱插拔事件產生時,內核就會調用位於/sbin目錄的mdev。這時mdev通過環境變量中的 ACTION 和DEVPATH,(這兩個變量是系統自帶的)來確定此次熱插拔事件的動作以及影響了/sys中的那個目錄。接着會看看這個目錄中是否有“dev”的屬性文件,如果有就利用這些信息爲這個設備在/dev 下創建設備節點文件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章