Android4.0 ext disk auto mount [including sd mmc sata udisk]

USB挂载配置详解
本文详细介绍了如何通过修改vold.fstab、init.rc及storage_list.xml等文件来配置USB挂载,确保Android设备能正确识别并使用USB存储设备。

http://blog.youkuaiyun.com/airk000/article/details/7890182


总结    在分析完USB挂载相关内核驱动之后,显然最最重要的地方是mass_storage_function_init函数中的参数配置过程,定好有几个LUN,各自属性是什么样子的。然后就可以在内核结构中初始化完成了,

剩下的工作就是跟VOLD相关的处理。
    关于挂载,首先是由init.rc创建文件,由vold.fstab进行链接,然后只要提供给VOLD正确的参数(或默认),最终再在framework的overlay中将storage_list.xml配置好,就可以实现USB挂载没有问题了。



一、修改vold.fstab
添加一条dev_mount udisk /mnt/udisk auto /devices/platform/mt_usb/usb1
二、修改init.rc
1、

# create mountpoints
下添加一条
 mkdir /mnt/udisk 0076 system system
2、

# Backwards Compat
下添加一条
 symlink /mnt/udisk /udisk

三、修改storage_list.xml,此文件在frameworks/base/services/java/com/android/server/MountService.javareadStorageList方法里调用到。

 private void readStorageList(Resources resources) {
        mVolumes.clear();
        mVolumeMap.clear();
        int id = com.android.internal.R.xml.storage_list;
        XmlResourceParser parser = resources.getXml(id);
        AttributeSet attrs = Xml.asAttributeSet(parser);
        //在这里会解析storage_list.xml,并将外置存储间设备的路径(如"mnt/sdcard")通过广播的方式发给上层,上层收到广播后就会根据路径去扫描设备。
        。。。
}

系统自带的storage_list.xml在frameworks/base/core/res/res/xml目录下,内容如下
<StorageList xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- removable is not set in nosdcard product -->
    <storage android:mountPoint="/mnt/sdcard"
                 android:storageDescription="@string/storage_sd_card"
                 android:removable="true"
                 android:primary="true" />

</StorageList>
第一次我在这个文件里加了一条
    <storage android:mountPoint="/mnt/udisk"
                 android:storageDescription="@string/storage_sd_card"
                 android:removable="true"
                 android:primary="false" />
重新编译后测试无效,因为用的是MTK的平台代码所以storage_list.xml有可能被其他的代码覆盖了,于是在源码下搜索storage_list.xml,果然在以下目录中找到了

./mediatek/custom/{project name}/resource_overlay/generic/frameworks/base/core/res/res/xml/storage_list.xml

./mediatek/custom/{project name}/resource_overlay/generic_emmc/frameworks/base/core/res/res/xml/storage_list.xml

./mediatek/custom/{project name}/resource_overlay/generic_nand/frameworks/base/core/res/res/xml/storage_list.xml
为了保险起见我在这三个文件里都加上了下面一句代码
<storage android:mountPoint="/mnt/udisk"
                 android:storageDescription="@string/storage_usb"
                 android:removable="true"
                 android:primary="false" />

重新new以后测试可以识别disk,不同的平台修改方式会存在一些差异,这里的方法仅供参考。




<think>嗯,用户遇到了一个问题,就是在使用mdev自动挂载U盘或SD卡时,出现了“sh etc mdev udisk_insert.sh not found”的错误。首先,我需要理解这个错误的原因。根据用户提供的引用内容,特别是引用[1]和[3],问题可能出在脚本文件的位置或权限上。 首先,根据引用[1],/etc/mdev.conf文件中配置了当检测到sd设备插入时执行@/etc/mdev/udisk_insert.sh脚本。但错误提示显示系统找不到这个脚本,可能的原因有几个: 1. **脚本路径是否正确**:用户可能将脚本放在了错误的目录下。例如,正确的路径应该是/etc/mdev/udisk_insert.sh,但实际可能被放到了其他位置,比如/bin或/usr/local/bin。 2. **脚本是否存在**:可能用户根本没有创建这个脚本文件,或者文件名拼写错误,比如udisk_insert.sh和udisk_insert.sh是否一致。 3. **脚本的执行权限**:即使脚本存在,如果没有执行权限,mdev也无法运行它。需要检查脚本是否有可执行权限,比如使用chmod +x来添加。 4. **文件系统权限问题**:可能整个/etc/mdev目录的权限设置不正确,导致mdev无法访问其中的脚本。需要确认目录和文件的权限是否允许执行。 接下来,根据引用[3],mdev需要sysfs挂载在/sys,并且配置了hotplug。用户可能已经正确设置了这些,但问题可能出现在脚本本身。比如,脚本中的语法错误,或者没有指定正确的解释器(如#!/bin/sh)。 另外,引用[2]提到udev和mdev在处理设备驱动加载时的不同,但这里的问题更侧重于脚本的执行,所以可能需要检查mdev的配置是否正确触发了脚本。 可能的解决方案包括: - 确认脚本的存放位置是否正确,是否在/etc/mdev/目录下。 - 检查脚本是否有执行权限,使用chmod +x添加权限。 - 检查脚本内容是否正确,比如是否包含正确的挂载命令。 - 检查/etc/mdev.conf的配置是否正确,特别是设备匹配规则和脚本路径。 - 确保系统支持hotplug,并且已经正确配置了mdev作为hotplug处理程序。 用户可能需要逐步排查这些问题,例如先确认脚本是否存在,再检查权限,然后查看mdev.conf的配置,最后测试脚本是否能独立运行。此外,查看系统日志(如dmesg或/var/log/messages)可能提供更多错误信息,帮助定位问题。</think>### 问题分析 当出现`sh etc mdev udisk_insert.sh not found`错误时,通常由以下原因导致: 1. **脚本文件路径错误**:`/etc/mdev/udisk_insert.sh`未正确创建或路径配置错误[^1] 2. **脚本权限不足**:脚本未添加可执行权限 3. **mdev配置语法错误**:`/etc/mdev.conf`中的设备匹配规则或动作定义有误 4. **热插拔机制未生效**:未正确启用内核热插拔支持或未将mdev设为热插拔处理程序[^3] --- ### 逐步解决方案 #### 1. 确认脚本路径与权限 ```bash # 检查脚本是否存在 ls -l /etc/mdev/udisk_insert.sh # 若不存在则创建脚本 sudo touch /etc/mdev/udisk_insert.sh sudo chmod +x /etc/mdev/udisk_insert.sh # 添加基础挂载逻辑(示例) echo '#!/bin/sh mkdir -p /mnt/usb mount $MDEV_ROOT /mnt/usb' | sudo tee /etc/mdev/udisk_insert.sh ``` #### 2. 验证mdev配置文件 检查`/etc/mdev.conf`的配置是否符合规范: ```bash # 正确格式应为: sd[a-z][0-9] 0:0 666 @/etc/mdev/udisk_insert.sh sd[a-z] 0:0 666 $/etc/mdev/udisk_remove.sh ``` 注意: - `@`表示插入事件,`$`表示移除事件 - 设备匹配模式`sd[a-z][0-9]`需与内核设备名匹配[^1] #### 3. 检查热插拔配置 确保系统初始化时已执行: ```bash # 挂载sysfs mount -t sysfs sysfs /sys # 设置mdev为热插拔处理程序 echo /bin/mdev > /proc/sys/kernel/hotplug # 扫描现有设备 mdev -s ``` 该配置需写入`/etc/init.d/rcS`等初始化脚本[^3] #### 4. 调试技巧 ```bash # 查看内核消息 dmesg | tail # 手动触发mdev事件 echo add > /sys/block/sda/sda1/uevent ``` --- ### 关键配置文件示例 `/etc/mdev/udisk_insert.sh`基础内容: ```bash #!/bin/sh # $MDEV: 设备节点名 (如sda1) # $ACTION: 事件类型 (add/remove) if [ "$ACTION" = "add" ]; then mkdir -p /mnt/$MDEV mount /dev/$MDEV /mnt/$MDEV fi ``` --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值