• 调试经验--硬盘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盘又不easy找到,就须要将其他类型的U盘也转换到这样的情况下来。经过一番測试。最终找到方法,按例如以下步骤操作就可以:

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


     

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    SpringMVC 多文件上传
    get传参乱码问题
    springMVC配置
    带参sql$和#的区别(注解)
    java多线程--实现Runnable接口方式
    java复制文件夹及所有子目录和文件
    Angularjs 学习笔记
    springboot 项目 docker化部署
    docker 基础
    Java-马士兵动态代理模式
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4728898.html
Copyright © 2020-2023  润新知