为什么 3TB 磁盘显示为 746GiB

为什么 3TB 磁盘显示为 746GiB

我有一个 3TB 的硬盘,Ubuntu 14.04 live DVD 显示它的大小为 746.5GiB。我以前在其他情况下也见过其他磁盘出现此类问题,但一直找不到解决办法。我甚至让 Seagate 更换了一块硬盘,他们告诉我,在磁盘映像工具不知何故永久地告诉硬盘它是一个较小的磁盘后,他们无法修复硬盘。

两个问题:

  • 这怎么发生的?
  • 我如何解决它?

此案例的 HDD 背景

  • 该磁盘曾经是 ZFS RAIDZ 的一部分,使用裸盘而不是分区。
  • 它在架子上放了好几个月。
  • 我使用 GParted 尝试删除磁盘上的所有内容

我目前正在运行命令

dd if=/dev/zero of=/dev/sdd bs=16M

在此之前我跑过:

root@ubuntu:/home/ubuntu# dd if=/dev/zero of=/dev/sdd bs=10M count=128
128+0 条记录
128+0 条记录
复制了 1342177280 字节(1.3 GB),耗时 42.8214 秒,31.3 MB/s
root@ubuntu:/home/ubuntu# smartctl -i /dev/sdd
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.13.0-32-generic](本地构建)
版权所有 (C) 2002-13,Bruce Allen、Christian Franke,www.smartmontools.org

=== 信息部分开始 ===
型号系列:Western Digital Caviar Green(AF,SATA 6Gb/s)
设备型号:WDC WD30EZRX-00DC0B0
序列号:{空白}
LU WWN 设备 ID:5 0014ee 0036bc22d
固件版本:80.00A80
用户容量:3,000,592,982,016 字节 [3.00 TB]
扇区大小:512 字节逻辑扇区,4096 字节物理扇区
设备位于:在 smartctl 数据库中 [有关详细信息,请使用:-P show]
ATA 版本为:ACS-2(未标明小修订)
SATA 版本为:SATA 3.0,6.0 Gb/s(当前:1.5 Gb/s)
当地时间是: 2016 年 7 月 17 日 星期日 07:44:41 UTC
SMART 支持:可用 - 设备具有 SMART 功能。
SMART 支持:已启用
root@ubuntu:/home/ubuntu# gdisk -l /dev/sdd
GPT fdisk (gdisk) 版本 0.8.8

分区表扫描:
  MBR:不存在
  BSD:不存在
  APM:不存在
  GPT:不存在

创建新的 GPT 条目。
磁盘 /dev/sdd:1565565872 个扇区,746.5 GiB
逻辑扇区大小:512字节
磁盘标识符 (GUID):1F876634-0284-4A1C-8FDF-34A255B9DCCC
分区表最多可容纳 128 个条目
第一个可用扇区是 34,最后一个可用扇区是 1565565838
分区将按照 2048 个扇区边界对齐
总可用空间为 1565565805 个扇区 (746.5 GiB)

编号 起始(扇区) 结束(扇区) 大小 代码 名称
root@ubuntu:/home/ubuntu#

它通过 USB HDD 底座连接。也许这就是问题的根源。我会重新接线,以便将其直接插入主板上的 SATA 端口。与此同时,这里是请求的额外信息。

root@ubuntu:/home/ubuntu# sg_readcap --16 /dev/sdd
不支持读取容量(16)
root@ubuntu:/home/ubuntu# sg_readcap /dev/sdd
读取容量结果:
   最后一个逻辑块地址=1565565871(0x5d50a3af),块数=1565565872
   逻辑块长度=512字节
因此:
   设备大小:801569726464 字节,764436.5 MiB,801.57 GB
root@ubuntu:/home/ubuntu# hdparm -N /dev/sdd

/dev/sdd:
 最大扇区 = 5860533168/1(5860533168?),HPA 设置似乎无效(内核设备驱动程序有问题?)

答案1

root@ubuntu:/home/ubuntu# sg_readcap --16 /dev/sdd
READ CAPACITY (16) not supported

这意味着当您的 USB 扩展坞转换驱动器的 ATA IDENTIFY DEVICE 数据(在hdparm -I/中看到smartctl -i)的容量时,它最多可以报告 32 位大小(即 0xffffffff,4294967295)的逻辑扇区数。这是 SCSI READ CAPACITY (10) 的固有限制:

Logical Sector Size | Maximum capacity supported (TiB / TB)
         512        |              ~2.0 /  ~2.2
        4096        |             ~16.0 / ~17.6

由于您的驱动器是AF 512e驱动器总共有 5860533168 / 0x15d50a3b0 个 512 字节逻辑扇区,需要 33 位来表示,只有支持 SCSI READ CAPACITY (16) 的 SATA/USB 桥才能正确处理它。当大小被截断为 32 位时,它变为:

101011101010100001010001110110000 (5860533168)

 01011101010100001010001110110000 (1565565872)

Linux 内核,或者可能所有操作系统,基本上都不会“直接”向 USB 驱动器发出 ATA IDENTIFY DEVICE 命令(即封装在 SCSI ATA PASS-THROUGH 命令中),而是发出 SCSI READ CAPACITY 命令(您使用 手动发出sg_readcap),来获取它们的容量。

仅当驱动器实际上是通过 SATA/USB 桥接器连接的 SATA 驱动器时,命令才会由桥接器中实现的 SCSI-ATA 转换层处理,然后该转换层将向 SATA 驱动器发出 ATA IDENTIFY DEVICE 命令以获取所需的信息,以形成 READ CAPACITY 命令的响应数据。

但是像hdparm和这样的实用程序smartctl(几乎)是专门用于 ATA 驱动器的,因此它们几乎使用 ATA PASS-THROUGH 完成所有操作。(此外,由于它们是用户空间实用程序,因此预计您(用户)只会在适当类型的设备上使用它们。)这就是为什么您最终会在不同的地方获得不同的容量。

相关内容