嵌入式Linux设备实现SD卡或U盘自动挂载

一、前言

        在Linux系统中常用udev或mdev来实现可移动存储设备的节点创建和挂载。这两者功能相似,但是mdev更精简。因此在空间受限的嵌入式设备中,mdev更常用。

二、mdev介绍

        mdev有两种用法:

        1)/sbin/mdev

        2)/sbin/mdev -s

        区别在于1是创建或删除发生变化的设备节点,通常在发生热插拔时调用;2是创建所有设备节点,通常在启动脚本中调用。我们看到的/dev下的所有设备,都是系统在启动时通过mdev -s创建的。Linux内核支持hotplug机制,当内核检测到热插拔事件时,会调用/proc/sys/kernel/hotplug这个文件中记录的程序,来处理热插拔事件。因此,只要将/sbin/mdev写入上述的文件,就能实现热插拔时设备节点文件自动更新。

三、实现自动挂载

有几个前提条件必须满足:

1)内核编译时需支持hotplug功能,默认是支持的,可以通过查看是否有/proc/sys/kernel/hotplug这文件来判断是否支持了hotplug。

2)使用Busybox制作rootfs时,需支持mdev

Linux System Utilities  --->   
           [*] mdev      
           [*]  Support /etc/mdev.conf
           [*]    Support command execution at device addition/removal

实现步骤:

1.在启动脚本/etc/init.d/rcS中,增加如下内容:

mount -t tmpfs mdev /dev 
mount -t sysfs sysfs /sys
mkdir /dev/pts
mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

需要注意是,上面的几个目录,可能有的文件系统在别处已经挂载了,这里再次挂载会报错。可以查看一下/etc/fstab这个文件,以及/etc/init.d/inittab文件。如有冲突,注释任何一方均可。

我的/etc/fstab文件:

# <file system>	<mount pt>	<type>	<options>	<dump>	<pass>
proc		/proc		proc	defaults	0	0
devpts		/dev/pts	devpts	defaults,gid=5,mode=620	0	0
#tmpfs		/dev/shm	tmpfs	mode=0777	0	0
tmpfs		/tmp		tmpfs	mode=1777	0	0
tmpfs		/run		tmpfs	mode=0755,nosuid,nodev	0	0
sysfs		/sys		sysfs	defaults	0	0

我的/etc/init.d/inittab文件:

# Startup the system
::sysinit:/sbin/swapoff -a
::sysinit:/bin/mount -t tmpfs tmpfs /dev
::sysinit:/bin/mkdir -p /dev/pts
::sysinit:/bin/mkdir -p /dev/shm
::sysinit:/bin/mount -a
::sysinit:/bin/hostname -F /etc/hostname

# now run any rc scripts
::sysinit:/etc/init.d/rcS

# 略...

2.编写mdev配置文件:/etc/mdev.conf

        这个文件的作用是,当发生热插拔事件时,告诉mdev除了更新设备节点文件之外,还需要做什么事情。我们可以在这里填入我们自定义的命令,实现例如自动挂载和卸载等功能。

该文件的格式为:

<device regex> <uid>:<gid> <octal permissions> [<@$*><cmd>]

@ 创建节点后执行的
$  删除节点前执行的
*  创建后和删除前都运行的

如果要实现SD卡和U盘插入自动挂载,拔出自动卸载,则配置文件如下:

sd[a-z][0-9]       0:0 0660  @/etc/hotplug/usb/udisk_insert.sh
sd[a-z]            0:0 0660  $/etc/hotplug/usb/udisk_remove.sh
mmcblk[0-9]p[0-9]  0:0 0660  @/etc/hotplug/sd/sd_insert.sh
mmcblk[0-9]        0:0 0660  $/etc/hotplug/sd/sd_remove.sh

sd_insert.sh脚本文件参考如下:

#!/bin/sh

mount -t vfat /dev/mmcblk0p1 /media/sd    # 挂载SD卡
kill -s SIGUSR1 `pidof ipc_ctc`           # 发信号给应用程序

sd_remove.sh脚本文件参考如下:

#!/bin/sh

umount /media/sd                          # 卸载SD卡目录           
kill -s SIGUSR2 `pidof ipc_ctc`           # 发信号给应用程序

需注意的是,上述脚本中命令是由内核调用,因此打印信息不会输出到stdout。我在调试时就被脚本中的打印给误导了,还以为脚本没被执行,后来才反应过来。

猜你喜欢

转载自blog.csdn.net/fun_tion/article/details/120135756
今日推荐