首页 > 代码库 > 调试经验--硬盘与U盘

调试经验--硬盘与U盘

 

调试经验--硬盘与U盘


    随着嵌入式设备功能的发展,对存储设备也有了需求:可能存在大量信息需要保存,需要进行数据的转存,还有U盘升级功能等。
    在使用存储设备的过程中,我们遇到一些问题,也总结了些经验,如下:

1,几个硬盘常用命令 
2,硬盘信息分析
3,U盘升级失败的原因分析
4,U盘识别的分区更改为/dev/sda


一,几个硬盘常用命令

硬盘分区: fdisk /dev/hda  (np1  w)

格式化硬盘:mkfs.ext2 /dev/hda1

设置UDMA 6 传输模式:hdparm -X70 /dev/hda

查看硬盘信息:smartctl -a /dev/hda

挂载硬盘:mount /dev/hda1 /mnt/hda1

修复ext格式硬盘:e2fsck -y /dev/hda1

查看超级块信息:tune2fs -l /dev/hda1

进行硬盘上1k数据替换:dd if=/dev/hda1 bs=1k skip=131072 count=1 of=/dev/hda1 seek=1

查看超级块备份位置:mke2fs -n /dev/hda1

查看硬盘详细信息(全):dumpe2fs /dev/hda1 |less


二,硬盘信息分析

    挂载上一个硬盘,系统启动识别后,可以使用fdisk -l查看到如下信息,如何解读?

 Disk /dev/hda: 500.1 GB, 500107862016 bytes
 255 heads, 63 sectors/track, 60801 cylinders
 Units = cylinders of 16065 * 512 = 8225280 bytes

 这其实是一个500G的希捷硬盘, 有255个磁头,每磁头管理60801个柱面,每柱面63个扇区,每扇区512字节,(CHS)
 怎么计算总容量?如下:
 255*60801*63*512 = 500107862016 = 500G


 按如下方法分区格式化后,再查看分区信息:
 分区命令(只分为一个区):
 fdisk /dev/hda   ( d,n,p,1,enter,enter,w, )

 格式化命令(ext2格式):
 mkfs.ext2 /dev/hda1

 使用命令查看分区的信息:
dumpe2fs /dev/hda1 |less

dumpe2fs 1.41.11 (14-Mar-2010)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          fbd1f044-491b-4cda-aaf1-a89c7bdc2726
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      filetype sparse_super
Default mount options:    (none)
Filesystem state:         not clean with errors
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              61063168
Block count:              122096000
Reserved block count:     6104800
Free blocks:              120076967
Free inodes:              61061072
First block:              0
Block size:               4096
Fragment size:            4096
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         16384
Inode blocks per group:   512
Filesystem created:       Thu Jan  1 08:01:35 1970
Last mount time:          Wed Dec  1 10:04:11 2010
Last write time:          Thu Jan  1 08:00:35 1970
Mount count:              586
Maximum mount count:      37
Last checked:             Thu Jan  1 08:01:35 1970
Check interval:           15552000 (6 months)
Next check after:         Tue Jun 30 08:01:35 1970
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               128
Default directory hash:   tea
Directory Hash Seed:      dea4f717-12bc-4cfb-b26c-50b95411a974


Group 0: (Blocks 0-32767)
  Primary superblock at 0, Group descriptors at 1-30
  Block bitmap at 31 (+31), Inode bitmap at 32 (+32)
  Inode table at 33-544 (+33)
  32210 free blocks, 16365 free inodes, 2 directories
  Free blocks: 551-4095, 4097-10239, 10241-18431, 18434-22527, 22530-28671, 28673-32767
  Free inodes: 20-16384

 文件幻数标志了文件系统格式,Filesystem magic number:  0xEF53,这个数代表ext2或ext3。
 block大小:4096字节
 inode大小:128字节
 每个block group中,有32768个block。

 Superblock 的备份位置(以block为单位):32768×N
 其中N值为3,5,7的幂(N=1,3,5,7,9,25,27,49,81,125,243,343,625,729,2187,2401,3125)
 

三,U盘升级失败的原因分析

  使用U盘升级的原因:
  设备提供了一个usb接口,平常并不使用,只在需要导出数据时使用。由于软件总有升级的需要,在通常使用的远程网络升级之外,就提供了一个U盘升级的途径。U盘升级不但升级安全快捷,弥补了网络不通情况下的升级问题,依赖的运行程序也更少,能解决部分更基础的运行问题。

  U盘升级的过程:
  插上U盘,重启设备,在启动过程中,有一个启动脚本,检查是否存在U盘,并判断U盘中是否存在升级文件。若有升级文件,就开始进行文件更新。升级完成后,设备再次重启,以升级后的程序进行正式的运行。 

  遇到一些U盘升级失败的情况,大概的原因分析:
1, U盘不能识别;
2, U盘识别的设备名与启动脚本中的设备名不匹配;
――通过在启动脚本添加补充,支持/dev/sda4,/dev/sda1,/dev/sda,解决部分问题。
3,flash满,导致不能复制程序
 ――升级前,删几个日志文件,能解决部分问题。 


  有一次还遇到一次奇怪的现象:
1,设备上的程序总是不能运行起来;
2,U盘也升级不了。

解决方法:
1,查看出错信息
/etc/rcS.d/S03udev: line 52: can‘t create /tmp/uname: No space left on device
即系统的启动脚本中已经出错。
2,想办法绕开S03udev。
系统启动到“Freeing init memory”之后,按住ctrl C,直到出现“login:”
3,输入root登陆
 此时又遇到一个问题:root登陆不了,报错:
 Unable to determine your tty name.
 修改uboot的启动配置:使用 init=/sbin/init 替换 noinitrd,
 可以登陆。
4,查看文件系统空间使用情况,使用df。
 发现使用率达到99%。
 在根目录下使用命令:du -d 1,查看是哪一个目录占空间过大,进行清理。
5,清理出空间后,就解决了问题,能正常进行U盘升级了。
6,后来多次遇到S03udev出错,跟踪出错语句,将其注释掉。在以后的再次升级时,覆盖原文件。


四,U盘识别的分区更改为sda
 由于第一批采购的U盘是在设备上默认为/dev/sda,所以升级脚本中也是依据是否存在这个设备文件来判断是否U盘已经失败到。可是在后来采购的U盘以及其它人使用的U盘,却大多都不是这样的。发现有如下几种情况:
最多的是识别为:
一个设备:/dev/sda
一个分区:/dev/sda1
第二种情况为:
一个设备:/dev/sda
一个分区:/dev/sda4
第三种情况:
设备与分区重合:/dev/sda

  发现这个问题后,我们就修改了U盘检测的判断,将这3种情况都考虑进去了。但是存在一个问题,有些早期设备判断U盘还是依赖于/dev/sda,而第一批的U盘又不容易找到,就需要将其它类型的U盘也转换到这种情况下来。经过一番测试,终于找到方法:

 在linux下,fdisk删掉所有分区,保存退出;
 强制格式化sda:mkfs.vfat /dev/sda -I  ;然后sda可用了。


 

调试经验--硬盘与U盘