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 下建立裝置節點檔案。