Frank Asked: 2021-09-18 11:44:06 +0800 CST2021-09-18 11:44:06 +0800 CST 2021-09-18 11:44:06 +0800 CST 查看紧凑型闪存时 fdisk 的 Start 和 End 值是什么意思 772 我正在使用 fdisk 分析紧凑型闪存,并将其与 CF 主引导记录上的分区表的内容进行比较。我不明白“开始”和“结束”列的含义。我阅读的一些文档说它表示该分区的起始扇区和结束扇区,但是当我将 fdisk 输出与 MBR 分区表中的分区地址进行比较时,结果似乎不一致。 fdisk -l 报告第一个分区从 3 开始,但在 2241 结束。 然而,MBR 中分区表的 hexdump 显示,根据 LBA 地址,分区从扇区 0x800 开始。而 CHS 地址显示气缸 1,头部 1,扇区 3。 那么 fdisk 的 Start 3 和 End 2241 是什么意思呢? fdisk mbr 1 个回答 Voted Best Answer telcoM 2021-09-18T16:56:31+08:002021-09-18T16:56:31+08:00 CentOS 6fdisk在显示分区表时仍然默认使用柱面作为默认单位。正如 zevzek 所评论的那样,这已经过时了,您应该使用它fdisk -u=sectors -l来更好地匹配现代存储设备的现实以及fdisk默认情况下更高版本的显示方式。 实际分区表中的 CHS 值具有非常严格的最大值: 圆柱体字段只有 10 位宽(= 值 0-1023 ) 头字段为 8位宽(= 值 0-255) 扇区字段为6 位宽(= 值 0-63) 因此,从您的分区表中,开始 CHS(3 个字节)从位置 0x1bf 开始,开始 H = 1、S = 3 和 C = 1。这看起来不正确。 位置 0x1c2 是分区类型 (0x83),紧随其后的是位置 0x1c3 以后的结束 CHS 值(3 个字节)。 十六进制转储中的第二个红框未指向正确的位置:0x1c3 处的值是结束 H 值 (0x14 = 20)。 0x1c4 处的值指定低 6 位中的结束扇区值,以及前 2 位中结束柱面值的两个最高有效位。所以二进制的 0xe8 = 11 101000,所以结尾的 S 将是 40。结尾 C 值的前两位代表十六进制数字 3。 0x1c5 处的值指定结束 C 值的低字节:与前一个字节的高两位一起,结束柱面值是 0x3b4 = 948。 (这些值代表的分区只有大约 378 MB,因此与分区表后面的 4 字节分区大小值相比,分区表中的结尾 CHS 值显然完全是一派胡言。) 但无论你如何切片,这都会产生 7.87 GiB / 8.45 GB 的限制,此时分区表中 CHS 字段的位值变为全 1,并且这些字段不能表示任何大于该值的值。 IDE 磁盘控制器规范具有一组不同的 CHS 限制,这进一步复杂化了:IDE 控制器可以接受最多 65536 个柱面 (0-65535) 和 255 (1-255) 个扇区的 CHS 值,但最多只能接受 16 ( 0-15) 头。如果您只是按原样使用 CHS 值,那么连同 MBR 限制,这将导致限制为 504 MiB / 528.4 MB。 因此,自 1994 年 7 月以来,已经有一个几何转换约定来使 CHS 值适应当前的用例。所以 2242 个柱面、21 个磁头和 40 个扇区是硬件所说的真实几何图形,而分区表中使用的值是基于转换后的假几何图形,以使值适合分区表的字段和最早的 BIOS 系统调用。这种转换通常涉及选择一个数字 N,将物理 C 值除以 N,然后将物理 H 值乘以 N。N 的值通常是 2、4、8 或 15。(是的,15 而不是 16,解决 MS-DOS、旧版本 Windows 和一些旧 BIOS 中的错误。) 当超过 8.45 GB 时,CHS 值无论如何都是无用的,因此任何现代操作系统通常会直接忽略 CHS 值,而是使用分区第一个块的 LBA 编号的 4 字节值和总数分区中的块数以实际定义分区的位置和大小。这些 4 字节值应始终准确无误。 在使用经典的 512 字节扇区大小时,这些 4 字节值对于大小高达 (2^32 - 1) 个块的磁盘来说就足够了,或者换句话说,小于 2 TiB 或 2.19 TB。 对于您的分区,十六进制转储中的第二个红框实际上指向 0x1c6 之后,这是分区第一个块的 LBA#:因为它以 little-endian 格式表示,所以值是 0x800 十六进制,或十进制的 2048。这遵循现代标准约定,即在距磁盘开头正好 1 MiB 处启动第一个分区。 分区的长度从偏移量 0x1ca 开始指定,为 0x1cb000 = 1 880 064 个块,或 918 MiB / 940 MB。 您可以看到,即使是硬件报告的 CHS 几何21 heads, 40 sectors/track, 2242 cylinders结果也只有 2242 * 40 * 21 = 1 883 280 个扇区或 1883280 * 512 = 964 249 360 字节,而实际磁盘容量报告为 964 583 424字节。 这是另一个迹象,表明 CHS“几何”只是旧设备和操作系统的近似值,而确切的容量是不同的。 我猜fdisk只是使用 LBA 表示做所有事情,当被要求将分区开始和结束值显示为柱面时,只需根据 LBA 位置和大小值计算它们,完全忽略分区表中的开始/结束 CHS 值。同样,该Blocks列似乎实际上以 2 KB 为单位显示分区的大小。
CentOS 6
fdisk
在显示分区表时仍然默认使用柱面作为默认单位。正如 zevzek 所评论的那样,这已经过时了,您应该使用它fdisk -u=sectors -l
来更好地匹配现代存储设备的现实以及fdisk
默认情况下更高版本的显示方式。实际分区表中的 CHS 值具有非常严格的最大值:
因此,从您的分区表中,开始 CHS(3 个字节)从位置 0x1bf 开始,开始 H = 1、S = 3 和 C = 1。这看起来不正确。
位置 0x1c2 是分区类型 (0x83),紧随其后的是位置 0x1c3 以后的结束 CHS 值(3 个字节)。
十六进制转储中的第二个红框未指向正确的位置:0x1c3 处的值是结束 H 值 (0x14 = 20)。
0x1c4 处的值指定低 6 位中的结束扇区值,以及前 2 位中结束柱面值的两个最高有效位。所以二进制的 0xe8 = 11 101000,所以结尾的 S 将是 40。结尾 C 值的前两位代表十六进制数字 3。
0x1c5 处的值指定结束 C 值的低字节:与前一个字节的高两位一起,结束柱面值是 0x3b4 = 948。
(这些值代表的分区只有大约 378 MB,因此与分区表后面的 4 字节分区大小值相比,分区表中的结尾 CHS 值显然完全是一派胡言。)
但无论你如何切片,这都会产生 7.87 GiB / 8.45 GB 的限制,此时分区表中 CHS 字段的位值变为全 1,并且这些字段不能表示任何大于该值的值。
IDE 磁盘控制器规范具有一组不同的 CHS 限制,这进一步复杂化了:IDE 控制器可以接受最多 65536 个柱面 (0-65535) 和 255 (1-255) 个扇区的 CHS 值,但最多只能接受 16 ( 0-15) 头。如果您只是按原样使用 CHS 值,那么连同 MBR 限制,这将导致限制为 504 MiB / 528.4 MB。
因此,自 1994 年 7 月以来,已经有一个几何转换约定来使 CHS 值适应当前的用例。所以 2242 个柱面、21 个磁头和 40 个扇区是硬件所说的真实几何图形,而分区表中使用的值是基于转换后的假几何图形,以使值适合分区表的字段和最早的 BIOS 系统调用。这种转换通常涉及选择一个数字 N,将物理 C 值除以 N,然后将物理 H 值乘以 N。N 的值通常是 2、4、8 或 15。(是的,15 而不是 16,解决 MS-DOS、旧版本 Windows 和一些旧 BIOS 中的错误。)
当超过 8.45 GB 时,CHS 值无论如何都是无用的,因此任何现代操作系统通常会直接忽略 CHS 值,而是使用分区第一个块的 LBA 编号的 4 字节值和总数分区中的块数以实际定义分区的位置和大小。这些 4 字节值应始终准确无误。
在使用经典的 512 字节扇区大小时,这些 4 字节值对于大小高达 (2^32 - 1) 个块的磁盘来说就足够了,或者换句话说,小于 2 TiB 或 2.19 TB。
对于您的分区,十六进制转储中的第二个红框实际上指向 0x1c6 之后,这是分区第一个块的 LBA#:因为它以 little-endian 格式表示,所以值是 0x800 十六进制,或十进制的 2048。这遵循现代标准约定,即在距磁盘开头正好 1 MiB 处启动第一个分区。
分区的长度从偏移量 0x1ca 开始指定,为 0x1cb000 = 1 880 064 个块,或 918 MiB / 940 MB。
您可以看到,即使是硬件报告的 CHS 几何
21 heads, 40 sectors/track, 2242 cylinders
结果也只有 2242 * 40 * 21 = 1 883 280 个扇区或 1883280 * 512 = 964 249 360 字节,而实际磁盘容量报告为 964 583 424字节。这是另一个迹象,表明 CHS“几何”只是旧设备和操作系统的近似值,而确切的容量是不同的。
我猜
fdisk
只是使用 LBA 表示做所有事情,当被要求将分区开始和结束值显示为柱面时,只需根据 LBA 位置和大小值计算它们,完全忽略分区表中的开始/结束 CHS 值。同样,该Blocks
列似乎实际上以 2 KB 为单位显示分区的大小。