好吧,我将尝试彻底解释我的情况,所以请耐心听我说完。我目前的情况是这样的。我有一个 500GB 的硬盘,以前放在服务器上 - 它托管虚拟机 - 并且是 RAID 1 中的两个驱动器之一。我假设此时两个驱动器是相同的,但如果出于某种原因这个驱动器无法正常工作,或者我需要使用它,我还有另一个驱动器。
该驱动器通过板载 SATA 连接到一个小型 Linux 盒(它是 Intel 服务器 MiniITX 主板),运行 Ubuntu Server 14.04 LTS,专门为此目的全新安装。我已经安装了vmfs-tools
,并授予了 访问权限vmfs-fuse
,我使用它来安装驱动器:
sudo vmfs-fuse /dev/sda1 /mnt/recovery
这可以作为只读挂载成功运行(请注意,/dev/sdb 是我的启动驱动器,它们被交换了,因为我混淆了 SATA 端口)。我的 fdisk 如下:
taylor@nas:~$ sudo fdisk -l /dev/sda
WARNING: GPT (GUID Partition Table) detected on '/dev/sda'! The util fdisk doesn't support GPT. Use GNU Parted.
Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders, total 976773168 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: 0x00000000
Device Boot Start End Blocks Id System
/dev/sda1 1 975699967 487849983+ ee GPT
我可以成功读取包含有问题的文件的文件夹的内容dot-flat.vmdk
:
taylor@nas:~$ sudo ls /mnt/recovery/dot
dot-flat.vmdk dot.vmdk dot.vmx vmware-1.log vmware-3.log vmware.log
dot.nvram dot.vmsd dot.vmxf vmware-2.log vmware-4.log
自然想测试一下以确保我能正确读取文件,希望内容没有被损坏,我尝试tail
了vmware.log
:
taylor@nas:~$ sudo tail /mnt/recovery/dot/vmware.log
2014-12-01T09:19:46.553Z| vmx| I120: VMIOP: Exit
2014-12-01T09:19:46.696Z| vmx| I120: Vix: [35957 mainDispatch.c:849]: VMAutomation_LateShutdown()
2014-12-01T09:19:46.696Z| vmx| I120: Vix: [35957 mainDispatch.c:799]: VMAutomationCloseListenerSocket. Closing listener socket.
2014-12-01T09:19:46.715Z| vmx| I120: Flushing VMX VMDB connections
2014-12-01T09:19:46.715Z| vmx| I120: VmdbDbRemoveCnx: Removing Cnx from Db for '/db/connection/#1/'
2014-12-01T09:19:46.715Z| vmx| I120: VmdbCnxDisconnect: Disconnect: closed pipe for pub cnx '/db/connection/#1/' (0)
2014-12-01T09:19:46.721Z| vmx| I120: VMX exit (0).
2014-12-01T09:19:46.721Z| vmx| I120: AIOMGR-S : stat o=1 r=3 w=0 i=0 br=49152 bw=0
2014-12-01T09:19:46.721Z| vmx| I120: OBJLIB-LIB: ObjLib cleanup done.
2014-12-01T09:19:46.721Z| vmx| W110: VMX has left the building: 0.
所以这没问题,可能不是驱动器问题。无论如何,我想检查 SMART 数据。在我将它们取出进行升级之前,驱动器运行良好。我安装了它,smartmontools
然后:
taylor@nas:~$ sudo smartctl -a /dev/sda
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.13.0-32-generic] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Model Family: Western Digital RE3 Serial ATA
Device Model: WDC WD5002ABYS-18B1B0
Serial Number: WD-WCASY4933732
LU WWN Device Id: 5 0014ee 202b597b2
Add. Product Id: DELL�
Firmware Version: 02.03B04
User Capacity: 500,107,862,016 bytes [500 GB]
Sector Size: 512 bytes logical/physical
Rotation Rate: 7200 rpm
Device is: In smartctl database [for details use: -P show]
ATA Version is: ATA8-ACS (minor revision not indicated)
SATA Version is: SATA 2.5, 3.0 Gb/s
Local Time is: Sun Dec 7 01:55:02 2014 PST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
General SMART Values:
Offline data collection status: (0x84) Offline data collection activity
was suspended by an interrupting command from host.
Auto Offline Data Collection: Enabled.
Self-test execution status: ( 0) The previous self-test routine completed
without error or no self-test has ever
been run.
Total time to complete Offline
data collection: ( 9480) seconds.
Offline data collection
capabilities: (0x7b) SMART execute Offline immediate.
Auto Offline data collection on/off support.
Suspend Offline collection upon new
command.
Offline surface scan supported.
Self-test supported.
Conveyance Self-test supported.
Selective Self-test supported.
SMART capabilities: (0x0003) Saves SMART data before entering
power-saving mode.
Supports SMART auto save timer.
Error logging capability: (0x01) Error logging supported.
General Purpose Logging supported.
Short self-test routine
recommended polling time: ( 2) minutes.
Extended self-test routine
recommended polling time: ( 112) minutes.
Conveyance self-test routine
recommended polling time: ( 5) minutes.
SCT capabilities: (0x303f) SCT Status supported.
SCT Error Recovery Control supported.
SCT Feature Control supported.
SCT Data Table supported.
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x002f 200 200 051 Pre-fail Always - 0
3 Spin_Up_Time 0x0027 194 185 021 Pre-fail Always - 3291
4 Start_Stop_Count 0x0032 100 100 000 Old_age Always - 196
5 Reallocated_Sector_Ct 0x0033 200 200 140 Pre-fail Always - 0
7 Seek_Error_Rate 0x002e 200 200 000 Old_age Always - 0
9 Power_On_Hours 0x0032 056 056 000 Old_age Always - 32738
10 Spin_Retry_Count 0x0032 100 100 000 Old_age Always - 0
11 Calibration_Retry_Count 0x0032 100 100 000 Old_age Always - 0
12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 106
192 Power-Off_Retract_Count 0x0032 200 200 000 Old_age Always - 99
193 Load_Cycle_Count 0x0032 200 200 000 Old_age Always - 196
194 Temperature_Celsius 0x0022 108 105 000 Old_age Always - 39
196 Reallocated_Event_Count 0x0032 200 200 000 Old_age Always - 0
197 Current_Pending_Sector 0x0032 200 200 000 Old_age Always - 0
198 Offline_Uncorrectable 0x0030 200 200 000 Old_age Offline - 0
199 UDMA_CRC_Error_Count 0x0032 200 200 000 Old_age Always - 0
200 Multi_Zone_Error_Rate 0x0008 200 200 000 Old_age Offline - 0
SMART Error Log Version: 1
No Errors Logged
SMART Self-test log structure revision number 1
Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error
# 1 Short offline Completed without error 00% 32447 -
SMART Selective self-test log data structure revision number 1
SPAN MIN_LBA MAX_LBA CURRENT_TEST_STATUS
1 0 0 Not_testing
2 0 0 Not_testing
3 0 0 Not_testing
4 0 0 Not_testing
5 0 0 Not_testing
Selective self-test flags (0x0):
After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.
至少对我来说,这看起来像是一份针对旧驱动器的相当直观的 SMART 报告,尤其是对于通电时间为 32638 小时(1352 天!)的驱动器。我之前在另一个驱动器(RAID 对)上运行过该报告,如果我没记错的话,结果非常相似。
有问题的驱动器包含大约 8 个虚拟机,我可以轻松地从驱动器中拉取它们。为此,我使用了一个cp
不同的驱动器的简单命令,就这样。该目标驱动器(操作系统正在运行的驱动器)有大约 700GB 的可用空间。问题始于cp
访问所有 VMDK 文件中最大的(相差很大)文件。大多数 VMDK 大约为 25-30GB,而有问题的 VMDK 大约为 300GB。大型 VMDK 最初是作为 THICK VMDK 创建的。以下是它的作用cp
:
taylor@nas:~$ sudo cp /mnt/recovery/dot/dot-flat.vmdk ~/dot-flat.vmdk
cp: error reading ‘/mnt/recovery/dot/dot-flat.vmdk’: Input/output error
cp: failed to extend ‘/home/taylor/dot-flat.vmdk’: Input/output error
我读到的关于这笔Input/output error
交易的所有信息都表明硬盘有问题。但我在两个硬盘上都遇到了同样的问题,而且 SMART 测试似乎没问题,所以我想可能是其他原因。文件大小也可能是一个因素。
因此,我决定尝试rsync
,因为逐位复制可能更适合我。这个有点奇怪。起初,它似乎rsync
运行良好,我可以访问ls -al
目标目录,并看到临时文件大小稳步增加。但是,一旦目标文件达到适当的大小,它就会Input/output error
像以前一样显示,然后rsync
重新开始整个过程,删除它刚刚传输的文件(或至少部分删除)。真是令人沮丧。输出如下所示:
已经完成了一半多一点,一切顺利:
taylor@nas:~$ sudo rsync -av --progress /mnt/recovery/dot/dot-flat.vmdk ~/dot-flat.vmdk
sending incremental file list
dot-flat.vmdk
201,769,451,520 62% 95.50MB/s 0:20:30
完成后:
taylor@nas:~$ sudo rsync -av --progress /mnt/recovery/dot/dot-flat.vmdk ~/dot-flat.vmdk
sending incremental file list
dot-flat.vmdk
322,122,547,200 100% 81.94MB/s 1:02:29 (xfr#1, to-chk=0/1)
rsync: read errors mapping "/mnt/recovery/dot/dot-flat.vmdk": Input/output error (5)
WARNING: dot-flat.vmdk failed verification -- update discarded (will try again).
dot-flat.vmdk
672,759,808 0% 85.96MB/s 1:00:52
真的,我最终想要的是 VMDK 中的一些文件。如果有办法直接挂载 VMDK,我很想知道,但我在网上看到的关于这个主题的所有内容都不起作用,主要是因为我有一个 VMFS 卷,而不是更直接的 EXT4。我想可能有一些解决方法,但我不太确定
我想我可以尝试将两个驱动器重新放入服务器,重新创建 ESXi VM 并以此方式提取数据吗?不行。它们所在的服务器是带有 SAS 6i/R RAID 控制器的 Dell Poweredge 1950,上面已经有一个不同的阵列。如果我愿意,我无法将驱动器重新放入并加载到 ESXi 中,至少要格式化它们。
所以这就是我求助于 SuperUser 的地方。有什么建议吗?有没有什么替代的复制实用程序?在驱动器格式化为 VMFS 的情况下,有没有什么方法可以挂载 VMDK?有没有什么方法可以修复我的输入/输出错误?也许甚至可以手动拆分 VMDK?我在映像本身上只有一个分区,因此很容易猜出给定的虚拟 EXT4 分区将从哪里开始,但我对 VMDK 文件的结构一无所知。
感谢您花时间阅读!
答案1
经过一些工作和@DanielB 的启发,我意识到我可以在服务器上的 USB 驱动器上设置另一个 ESXi 实例,从头开始安装,将旧驱动器连接到我用来运行 ESXi 主机驱动器的 SATA 端口,然后以这种方式重新创建 VM。
它直接启动、读取我的文件,一切都顺利进行。