Android usb client mass-storage 多存储设备挂载问题解决

来源:互联网 发布:淘宝清仓在哪里 编辑:程序博客网 时间:2024/04/30 05:37

       这是写的第三篇文章,废话不多说,接着上次的问题--不能同一时间挂载多个存储设备,继续探讨。

昨天,和一位linux 达人,在交流,无意中提到了这个问题,然后让他看了看现象,他说我的/devices/platform/tegra-udc.0/gadget这个目录,可能有问题。

于是查了下LUN是什么(Logical units)逻辑单元,跟SCSI有关,仔细查了下f_mass_storage.c的代码,里面的代码是fsg什么的,继续查了下

========================================================================

The File-backed Storage Gadget (FSG) provides support for the USB Mass Storage class. It can appear to a host as a set of up to 8 SCSI disk drives (called Logical UNits orLUNs), although most of the time a single LUN is all you will need. The information stored for each LUN must be maintained by the gadget somewhere, either in a normal file or in a block device such as a disk partition or even a ramdisk. This file or block device is called the backing storage for the gadget, and you tell FSG where the backing storage is when you load the gadget driver:

来自:http://www.linux-usb.org/gadget/file_storage.html

翻译一下:文件备份存储装置提供usb mass storage类的支持。它在主机端显示一连串最多高达8个的SCSI驱动盘符(被称作逻辑单元或者LUN),不过大多数时间里你只需要用到一个LUN。每个LUN的信息必须被保存在某个gadget中,信息不是存在一个普通文件,就是存在一个块设备中,例如一个盘分区,甚至是一个ramdisk。这个文件或者块设备对于gadget被称作“backing storage”, 而当你试图加载gadget驱动的时候,你可以告诉FSG"backing storage"在哪里。(英文不行,翻译可能有问题,达人请指正)。

 

==========================================================================

okay 大概知道,怎么回事了,应该是存储设备对应lun的多少的问题。按照linux的那套,其实一个client口 对应一个lun是正确的,但是现在情况是需要让client去把自己作为host,处理挂载自己身上的N个存储设备,所以按照道理来说,一个设备应该有一个lun,多个设备就多个lun

 

进行验证,尝试去利用现在已经有的唯一的一个lun/file,向里面写挂载存储设备的路径,并且追加,证明确实只支持一个设备的写入,不支持什么追加。

 

现在有两种解决方式:

1.在主机端,模拟个文件 系统,将client的所有设备都挂载到这个文件系统上(那位达人给我的建议),客观的说,这应该是最科学的,在不该原有设计思路的最好的方式。不过实在是能力有限,无从下手。。于是想了下面一个方法。

2.就是假设,模拟多个lun节点,根据代码/drivers/usb/gadget/f_mass_storage.c中的MAX_LUNS 8的定义,先模拟8个lun设备看看情况

看代码:

 

 

原来的i = fsg->nluns给我改成了MAX_LUNS,这只是临时改的,应该按照道理来说 需要判断有多少个存储设备被挂载,然后给i的值赋多少。不过后来想想这样该貌似有问题,于是继续跟踪,发现在/arch/arm/mach-xxx/xx-board.c文件中有

 

nluns = 1;看来是这个问题阿。所以改动成3,

然后编译驱动,加载之,发现/sys/devices/platform/tegra-udc.0/gadget下会出现lun0-lun7的3个节点,

尝试把client端的每个存储设备的挂载信息写到对应的lun中的file下,如echo "/dev/block/vold/179:0">file

结果证明全能挂载了okay.

 

如果需要自动挂载这些存储设备,而不是手动,需要改vold代码中的volmgr.c在auto_add_volume()函数里,当每往链表中添加设备信息时候,给ums_path的值添上相应的lun路径 就行了。

==========================================================================

不过这种方法虽然可以作出来,但是并不是好的方法,只是投机取巧,会被人鄙视的,在这因为研究学习用,所以写了出来。现在还在继续研究模拟文件系统如何挂载的方式,希望能有所突破

 

原创粉丝点击