• 让fdisk输出更准确合理


    注意:新版本的fdisk默认输出已经正确合理了,本文只适用于旧版本的fdisk.

    1 无option选项参数的输出

    [root@localhost ~]# fdisk -l
    
    Disk /dev/sda: 160.0 GB, 160041885696 bytes
    255 heads, 63 sectors/track, 19457 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0xf0b1ebb0
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1   *           1        7295    58592256   83  Linux
    /dev/sda2            7295       19458    97695745    5  Extended
    /dev/sda5            7295       17021    78124032   83  Linux
    /dev/sda6           17021       18966    15624192   83  Linux
    /dev/sda7           18967       19458     3945472   82  Linux swap / Solaris
    [root@localhost ~]#
    

    此时输出结果基于远古时代的CHS硬盘寻址模式,CHS早就被业界淘汰了,纯属历史遗留的概念,只有 可能在某些BIOS里还存在。但是目前还有很多资料或软件出现相关信息,比如fdisk -l的结果。为了顾及知识完整性,还是简单做一下介绍,有兴趣的同学可以去Internet上查找关键词CHS。话说最早的硬盘有多个盘片组成,每个盘片 都对应一个磁头(Head)来扫描它,一个盘片分成很多同心圆环,每一个圆环叫做一个轨道(Track),每个轨道又被平均分成多个弧段也叫扇区 (Sector)。需要注意的是,这里的同心圆环,不论半径大小,都被分成了相同数量的扇区,而每个扇区大大小是固定的512B。所以内环的数据密度一定 高于外环的数据密度了。所有盘片上对应的轨道(Track)共同组成一个柱面(Cylinder)。就我自己而言,没见过超过2个盘片的硬盘,所以这个柱 面其实是很矮的。

    CHS定位原理也很简单,首先找到柱面(C),然后在此柱面上找到盘面(H),最后在 柱面和盘面切割的轨道上找到扇区(S)。其实理论上也可以先找到盘面然后再找轨道和扇区。之所以是CHS这个顺序是因为当初的硬盘构造决定的,所有磁头都 固定在同一个装置上,相对位置不变,所以所有磁头都是一起移动的。这样如果相邻数据在同一柱面上的话,则无需移动磁头就能全部读写,所以效率最高。不扯这 些了,毕竟CHS早就淘汰了。回到上面的输出结果,第一行显示/dev/sda这个硬盘总容量为160G,第二行显示磁盘有255个磁头(盘面),每个磁 道有63个扇区,同心圆环有19457个。难道这个硬盘真的有255个盘面?显然这是不可能的。之所以会有这样的输出就是因为兼容CHS模式。而255个 磁头63个扇区都是CHS的极限值,在这里并不代表实际的硬盘物理结构。第三行的Units表示的是一个柱面能存储多少字节数据,即 255*63*512,这对于现在的硬盘显然也是没有什么意义的。然而在输出结果的分区列表中的start和end列却使用了unit作为度量单位,也就 是说分区的对齐单位是柱面,显得非常不够精确。Blocks列的单位是KB,与units无关。

    2 强烈建议给出的option参数

    如果我们不加参数运行fdisk,输出如下结果。

    [root@localhost ~]# fdisk /dev/sda
    
    WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
             switch off the mode (command 'c') and change display units to
             sectors (command 'u').
    
    Command (m for help):
    

    此处给出了警告信息:DOS兼容模式已经废弃,强烈建议执行c命令切换模式,并且使用u命令把输出的unit由柱面改为扇区。按照提示进行操作如下:

    Command (m for help): c
    DOS Compatibility flag is not set
    
    Command (m for help): u
    Changing display/entry units to sectors
    
    Command (m for help): p
    
    Disk /dev/sda: 160.0 GB, 160041885696 bytes
    255 heads, 63 sectors/track, 19457 cylinders, total 312581808 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0xf0b1ebb0
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1   *        2048   117186559    58592256   83  Linux
    /dev/sda2       117188606   312580095    97695745    5  Extended
    /dev/sda5       117188608   273436671    78124032   83  Linux
    /dev/sda6       273438720   304687103    15624192   83  Linux
    /dev/sda7       304689152   312580095     3945472   82  Linux swap / Solaris
    
    Command (m for help):
    
    

    可见此时的打印结果中分区列表的Unit不再以柱面为单位,而是以扇区了。而扇区确实是当前大多数硬 盘以及逻辑硬盘(LUN)的最小存储单位,而且也采用LBA这种线性寻址方式。既然fdisk能给出警告,为什么不把默认改为正确的方式呢?比较发现新版 本的fdisk确实默认已经能正确显示了,当遇到老版本的fdisk时,还是需要添加cu参数。

    在非交互的fdisk -l下,也只需使用 fdisk -cul 即可正确显示分区信息了。

    [root@localhost ~]# fdisk -cul
    
    Disk /dev/sda: 160.0 GB, 160041885696 bytes
    255 heads, 63 sectors/track, 19457 cylinders, total 312581808 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0xf0b1ebb0
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1   *        2048   117186559    58592256   83  Linux
    /dev/sda2       117188606   312580095    97695745    5  Extended
    /dev/sda5       117188608   273436671    78124032   83  Linux
    /dev/sda6       273438720   304687103    15624192   83  Linux
    /dev/sda7       304689152   312580095     3945472   82  Linux swap / Solaris
    
    

    顺便提一下,注意上面MBR和第一主分区,以及各分区之间并不是紧密相连的,而是有一些“未使用”的扇区。我能想到的一个原因就是,GRUB的一部分代码就是存在于分区之间的夹缝之中。

  • 相关阅读:
    软件常用图标大全
    SendMessage PostMessage ( hWnd, Msg, wParam, lParam) 四个参数是如何定义的,
    qt 中文 error: C2001: 常量中有换行符
    本周最新文献速递20220327
    linux: 删除列重复的行
    报错:ERROR: Failed to locate fastqtl_to_mash.ipynb.sos
    抵达理性之途的三十条建议
    碎碎念五八
    “驯服”业务流程:盘点业务开发中的常见流程模式
    基于jira数据开发一个质量看板
  • 原文地址:https://www.cnblogs.com/kluan/p/4810372.html
Copyright © 2020-2023  润新知