linux嵌入式系統下實現隨身碟、SD卡自動掛載功能

來源:互聯網
上載者:User

http://blog.sina.com.cn/s/blog_5f8665e701016le6.html

在 Linux的嵌入式系統中我們經常用到隨身碟、SD卡的掛載,而每次都手動掛載或卸載非常麻煩,我們可以採取以下方法實現自動掛載或卸載隨身碟、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
(特別提醒:上面的代碼在實際使用中可以直接複製,但注意分行符號)

插入隨身碟、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 下建立裝置節點檔案。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.