我有一个 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 完成所有操作。(此外,由于它们是用户空间实用程序,因此预计您(用户)只会在适当类型的设备上使用它们。)这就是为什么您最终会在不同的地方获得不同的容量。