linux挂载usb可移动磁盘成功但读取内容失败,是驱动的问题吗
一个类似数码相机的设备,在windows下连接usb能显示为可移动磁盘并能够正常读写里边SD卡的数据文件,但现场需要通过一块跑linux(OpenWrt)的板子通过usb读出机内sd卡的文件。试了一下openwrt的板子和fedora10的pc连接,都有问题。openwrt下能够挂载磁盘,但ls 磁盘内容时会出现部分文件/目录“No such file or directory”的异常,并且之后再ls 就没有任何内容了,如下图,启动后第一次ls总是除了DCIM其它目录文件和都异常:
vgsm_config,Manual,skin,SetApp,DCIM都是SD卡根目录下的文件和文件夹,
下图是fedora10的情况,fdisk -l能显示出设备“sdb1”,但是挂载失败,显示“can't read superblock”错误。
SD卡是FAT32格式,换一个SD卡的情况也和上边一样,问题肯定与此设备的USB口设计有关,但我们不能更改设备,目前只能从linux这头想办法。是否可以通过修改linux驱动的办法解决这个问题? 这个难度(工作量)多大?
RE: linux挂载usb可移动磁盘成功但读取内容失败
折腾了两天也没有好的进展{:mad:}使用dmesg看到很多读分区异常的log:
....
sd 33:0:0:0: CDB:
Read(10): 28 00 00 00 20 08 00 00 08 00
end_request: I/O error, dev sdb, sector 8200
Buffer I/O error on device sdb1, logical block 1
sd 33:0:0:0:
Result: hostbyte=DID_ERROR driverbyte=DRIVER_OK
sd 33:0:0:0: CDB:
Read(10): 28 00 00 00 20 08 00 00 08 00
end_request: I/O error, dev sdb, sector 8200
Buffer I/O error on device sdb1, logical block 1
....
为了查找问题原因,写了段代码直接open() /dev/sdb1设备然后反复read()不同位置不同大小的数据与windows下winhex的磁盘数据对比,发现:
1.读出的数据基本都是对的;
2.每次读数据量较少(比如不超过10个sector,5120byte)时没有问题,log无异常;读数据长度大时可能出现实际读出的字节数小于read()输入的字节数,log能看到 I/O error之类的异常;
3.在每次read()后加上几十毫秒的等待能较好的改善异常;
如果说是设备usb对sd的读写操作本身就太慢,但在windows复制文件速度与正常u盘也差不了多少。可能某个环节与linux系统的驱动配不好,想从linux驱动上入手,觉得应该可以通过修改linux(openwrt)的驱动让它每次读的secotor数量少一些,间隔时间长一些,去适应设备的方式。
没搞过linux内核驱动,如果是个串口之类的还有把握,这usb的还涉及文件系统就有难度了。有没有大神能给点意见? 或者有把握搞定能接这活的,有偿服务。
试试用PC端的Linux系统修复下U盘文件的文件系统,fsck.vfat -y /dev/sdb1, 修复完重新挂载试试
页:
[1]