我在将文件复制到外部硬盘时突然出现错误。可用空间充足:3.63TB 中剩余 1.64TB。我可以通过以下两种方式之一完成文件复制:
- 首先从外部硬盘中删除一些大文件
- 或者将 HDD 放入不同的 USB 外壳中
此外,除非使用不同的 USB 外壳,否则 Windows 8 错误检查工具会失败并显示错误(在这种情况下删除大文件无济于事)。CHKDSK 命令行工具始终有效并且不会报告磁盘上的错误。
我如何确认问题出在 USB HDD 外壳上?(我想确认一下问题出在不是我的硬盘可以安全地继续使用。)那么如何确定USB HDD 外壳支持的容量呢?
详细信息:
复制大文件时出现错误:
- 代码 0x80070057 似乎是一个相当通用的代码。
- 收到此错误后,我成功复制了一个 2GB 的文件。我尝试再次复制同一个文件(总共 4TB),但出现同样的错误。
- 在系统事件日志中,每次复制失败时似乎都会记录以下信息:“由于卷 D:上的 IO 故障,卷 D:的卷影副本被中止。”
Windows 8错误检查工具错误:
- 失败后,它会打开 Windows 事件查看器,并显示一些与卷影复制相关的错误。(忘记记录这个的详细信息了)
硬件:
文件系统:
- GPT(2TB MBR 驱动器被克隆到 4TB 驱动器,然后分区表转换为 GPT)
- NTFS
系统:
- Windows 8
- 联想 X1 Carbon 笔记本电脑
更新:来自“卷 D:的卷影副本已中止...”记录事件的更多详细信息:
系统 - 提供者 [ 名称] volsnap - 事件 ID 14 [ 预选赛] 49158 2 级 任务 0 关键字 0x80000000000000 - 创建时间 [系统时间] 2015-01-24T21:23:54.296013300Z 事件记录 ID 1063256374 渠道体系 电脑 X1-碳 安全 - 事件数据 \设备\HarddiskVolumeShadowCopy6 答案: 答案: 0000000003003000000000000E0006C00A0000000D0000C002000000000000000000000000000000
更新2:
使用在 Windows 上运行的扩展坞在 Ubuntu 中安装 4TB 硬盘时出错:
在 /media/daniel/DeskStar 安装 /dev/sdc1 时出错:命令行“mount -t“ntfs”-o“uhelper=udisks2,nodev,nosuid,uid=1000,gid=1000,dmask=0077,fmask=0177”“/dev/sdc1”“/media/daniel/DeskStar”' 以非零退出状态 13 退出:ntfs_attr_pread_i:ntfs_pread 失败:输入/输出错误 无法读取 NTFS $Bitmap:输入/输出错误 NTFS 不一致,或者存在硬件故障,或者 SoftRAID/FakeRAID 硬件。第一种情况下,在 Windows 上运行 chkdsk /f 然后重新启动进入 Windows 两次。/f 参数的使用非常 重要!如果设备是 SoftRAID/FakeRAID,则首先激活 并在 /dev/mapper/ 目录下安装不同的设备(例如 /dev/mapper/nvidia_eahaabcc1)。请参阅“dmraid”文档 更多细节。
该驱动器未在中列出fdisk -l
,因此无法尝试dd
...我尝试重新连接到 Windows:没问题;Windows 磁盘属性错误检查工具未报告任何错误。
还:
尝试dd
在(问题?)外壳上使用不同的2TB 硬盘:
- 读数无错误
skip=0
- 读数无错误
skip=SOMEWHERE_NEAR_MIDDLE_OF_DRIVE
- 读取驱动器末端或接近末端的扇区时出错:
daniel@computer:~$ sudo dd bs=512 if=/dev/sdb1 of=test skip=3907026942 count=1 dd:'/dev/sdb1':无法跳过:参数无效 0+0 条记录 0+0 条记录 已复制 0 字节(0 B),0.000210598 秒,0.0 kB/s
答案1
如果是 USB 驱动器的问题,并且与大小有关,则 USB 驱动器无法正确处理扇区写入(可能还有读取)请求。文件大小无关紧要。原因是较大文件的“碎片”超出了可寻址边界。
由于磁盘碎片,很难确认或否认这一假设,但你可以尝试使用任何显示磁盘碎片图的工具。这应该会显示一个很大的磁盘,开头部分正在填满,然后没有什么超过某个点。特别是不是在最后。
在 FAT32 磁盘上,您可以尝试用小文件(每个文件大小为 8Kb)填充磁盘,直到“可访问”区域被填满并且磁盘无法写入。但是磁盘是 NTFS,而且该方法并不是非常精确或确定。
如果可能的话,我会将磁盘安装在 Linux Live 发行版上。此时,您可以尝试一次读取磁盘的一个扇区:
fdisk -l
会告诉你外部磁盘中有多少个 512 字节块。然后
dd bs=512 if=/dev/sdc of=test skip=NNNNN count=1
将请求读取扇区 NNNNN(从一开始:-) )。
如果这是对 NNNNN 的限制问题,您会发现:
N=1 it works
N=MAX_NUM it fails
N=MAX_NUM/2 it fails
...
你可以从经典开始二分算法并确定关键扇区“C”的位置(C 之前的扇区均可读取,C 之后的扇区不可读取)。如果存在这样的扇区,则要么是出现了非常奇怪的硬件损坏,要么就是您要找的机箱故障证据。
更新 - 通过二分法找到边界:一个例子
假设磁盘为 4TB,那么有 8,000,000,000 个扇区。我们知道扇区 1 是可读的,而第 80 亿个扇区不可读。令 READABLE 为 1,令 UNREADABLE 为 8。那么算法就是:
let TESTING be (READABLE + UNREADABLE)/2
if sector TESTING is readable then READABLE becomes equal to TESTING
else, UNREADABLE becomes equal to TESTING.
Lather, rinse, repeat with the new values of (UN)READABLE.
When two consecutive values of TESTING are obtained, that's your boundary.
假设由于机柜中存在一些奇怪的错误,边界位于扇区 3,141,592,653。
first pass: testing = (1 + 8000000000)/2 = 4000000000.
4,000,000,000 is unreadable, so replace 8,000,000,000 with 4,000,000,000
second pass: testing (1 + 4M)/2 = 2M
sector 2M is readable, so replace 1 with 2,000,000,000
third pass: testing (2M + 4M)/2 = 3M
sector 3,000,000,000 is readable
fourth pass: testing (3M + 4M)/2 = 3,500,000,000 which is UNREADABLE
fifth: (3 + 3.5) / 2 = 3,250,000,000 UNREADABLE
...
因此,READABLE 和 UNREADABLE 从两个方向越来越接近未知边界。当它们足够接近时,您甚至可以尝试它们之间的所有区域。
要找到边界,只需读取 log2(max - min) = log2(4TB - 0) = log2(4TB) = log2(2 40 ) = 40(实际上我认为可能是 42)个扇区。考虑到发生读取错误时机箱上的 30 英寸重置延迟,最多应该是 20 分钟;可能要少得多。
一旦你有了边界B,就可以确认是边界之外,您可以在 B 之前顺序读取大块(这不会花费太长时间),大概每 GB 读取 1MB 左右;然后对 B 之外的扇区进行随机抽样。例如,边界之外的前 4*63 个扇区,然后每 3905 个扇区(或每个 RAND(4000, 4100) )读取一个扇区,以尽量避免总是击中同一个磁盘。
但实际上,如果你确实发现了类似边界的行为,并用另一个外壳确认这一点不存在这样的界限——好吧,我宣布此案结案。
答案2
好的,我想我明白了:
- 检查
dmesg
日志以验证 USB 设备支持的可寻址内存。 - 如果硬盘超出了 USB 设备的可寻址内存,Linux 似乎会阻止使用硬盘。(有几个错误)。
- 即使硬盘超出了 USB 设备的可寻址内存,Windows 也允许使用硬盘。(直到达到地址限制。)(所以问题是……Windows?)
同一驱动器,不同的外壳会导致两种不同的报告容量:
7814037168 512-byte logical blocks: (4.00 TB/3.63 TiB)
3519069872 512-byte logical blocks:(1.80 TB/1.63 TiB)
详细信息:
1.dmesg
将“现代”底座与 4TB 驱动器连接时:
[93507.922275] usb 1-1.2: 使用 ehci-pci 的新高速 USB 设备编号 17 [93508.087948] usb 1-1.2:发现新的 USB 设备,idVendor=067b,idProduct=2773 [93508.087959] usb 1-1.2:新的 USB 设备字符串:Mfr=1、Product=2、SerialNumber=3 [93508.087964] usb 1-1.2:产品:ATAPI-6 桥接控制器 [93508.087969] usb 1-1.2:制造商:Prolific Technology Inc. [93508.087973] usb 1-1.2:序列号:0123456789000000110 [93508.088621] usb-storage 1-1.2:1.0:检测到 USB 大容量存储设备 [93508.089092] scsi24: USB 存储 1-1.2:1.0 [93509.087318] scsi 24:0:0:0:直接访问多产 ATAPI-6 桥接 C MPAO PQ:0 ANSI:0 [93509.087836] sd 24:0:0:0:附加 scsi 通用 sg2 类型 0 [93509.088684] sd 24:0:0:0: [sdb] 设备非常大。尝试使用 READ CAPACITY(16)。 [93509.089837] sd 24:0:0:0:[sdb] 7814037168 512 字节逻辑块:(4.00 TB/3.63 TiB) [93509.090945] sd 24:0:0:0: [sdb] 写保护已关闭 [93509.090958] sd 24:0:0:0:[sdb] 模式感知:03 00 00 00 [93509.092819] sd 24:0:0:0: [sdb] 未找到缓存模式页面 [93509.092832] sd 24:0:0:0:[sdb] 假设驱动器缓存:直写 [93509.094321] sd 24:0:0:0: [sdb] 设备非常大。尝试使用 READ CAPACITY(16)。 [93509.100539] sd 24:0:0:0: [sdb] 未找到缓存模式页面 [93509.100545] sd 24:0:0:0:[sdb] 假设驱动器缓存:直写 [93509.170090] sdb:sdb1 [93509.171931] sd 24:0:0:0: [sdb] 设备非常大。尝试使用 READ CAPACITY(16)。 [93509.176059] sd 24:0:0:0: [sdb] 未找到缓存模式页面 [93509.176078] sd 24:0:0:0:[sdb] 假设驱动器缓存:直写 [93509.176086] sd 24:0:0:0: [sdb] 连接的 SCSI 磁盘
2.dmesg
将旧硬盘盒与 4TB 硬盘连接时:
[89939.561869] usb 1-1.2: 使用 ehci-pci 的新高速 USB 设备编号 14 [89939.656581] usb 1-1.2:发现新的 USB 设备,idVendor=152d,idProduct=2338 [89939.656592] usb 1-1.2:新的 USB 设备字符串:Mfr=1,Product=2,SerialNumber=5 [89939.656598] usb 1-1.2:产品:USB 转 ATA/ATAPI 桥接器 [89939.656602] usb 1-1.2:制造商:JMicron [89939.656606] usb 1-1.2:序列号:0613316A1498 [89939.658334] usb-storage 1-1.2:1.0:检测到 USB 大容量存储设备 [89939.658805] scsi20: USB 存储 1-1.2:1.0 [89940.659147] scsi 20:0:0:0:直接访问 HGST HMS 5C4040ALE640 A580 PQ:0 ANSI:2 CCS [89940.659959] sd 20:0:0:0:附加 scsi 通用 sg2 类型 0 [89940.661373] sd 20:0:0:0:[sdb] 3519069872 512 字节逻辑块:(1.80 TB/1.63 TiB) [89940.662410] sd 20:0:0:0: [sdb] 写保护已关闭 [89940.662424] sd 20:0:0:0:[sdb] 模式感知:00 38 00 00 [89940.663438] sd 20:0:0:0: [sdb] 请求缓存数据失败 [89940.663446] sd 20:0:0:0: [sdb] 假设驱动器缓存:直写 [89940.667752] sd 20:0:0:0: [sdb] 请求缓存数据失败 [89940.667761] sd 20:0:0:0:[sdb] 假设驱动器缓存:直写 [89940.684862] sdb:未知分区表 [89940.687887] sd 20:0:0:0: [sdb] 请求缓存数据失败 [89940.687893] sd 20:0:0:0:[sdb] 假设驱动器缓存:直写 [89940.687897] sd 20:0:0:0: [sdb] 连接的 SCSI 磁盘
答案3
测试硬盘的方法有几种,下载一个名为“HDTune”的软件。这是一个付费程序,但有一个试用版,试用期为 30 天,功能齐全。您可以使用它来检查坏扇区,检查硬盘健康状况。无论如何,如果您有坏扇区,您可以尝试使用 HDD 再生器进行修复,雇用 下载我个人使用的。
确保除了要测试的硬盘之外,没有插入任何硬盘。它是可启动的,您可以将其刻录到 CD 或 USB 驱动器中。
接下来我建议检查一下电缆。特别是在外置驱动器上,通常这些错误是由电源不足引起的,尝试将其插入另一台计算机或更换电缆(如果有多余的电缆),然后查看是否仍然失败。
答案4
奇怪的是,超过 4GB 的文件就会出错。由于文件系统是 NTFS,因此不存在这个限制。
我怀疑这是一个缓冲区不同步错误。
尝试以下操作:转到 regedit -->HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\System
创建一个名为 的新 DWORD 值CopyFileBufferedSynchronousIo
。将其值从默认的 0 更改为 1。
其他需要考虑的事项:您的路径和文件名是否非常大(例如超过 255 个字符)?您是否在操作系统上使用其他语言或默认区域/键盘或时间/日期格式设置以外的语言?(听起来很奇怪,这些可能会破坏 Windows 中的很多东西)。或者,外部驱动器的控制器可能无法处理超过 2.0 TB 的空间。-编辑-您可以发布当前使用的确切空间的屏幕截图吗?