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 下創建設備節點文件
這就要用到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 下創建設備節點文件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.