TEKFix / TEKWiki · #TEKLink212

Sửa lỗi VMware Disk needs repair sau mất điện: Phục hồi VMDK Snapshot

TEKLink212: đọc DISKLIB, kiểm tra CID/parentCID, repair đúng descriptor VMDK và xác minh 3/3 chain consistent. Windows/SQL chưa được xác nhận.

Case thực tế đã ẩn danh · VMware Workstation 17.x · Host Windows · Guest Windows Server 2008 R2

Tóm tắt 30 giây

  • Đọc log trước khi chọn descriptor cần repair.
  • Không đoán thứ tự snapshot từ hậu tố số.
  • -R có ghi; làm trên bản sao đầy đủ. -e kiểm tra chain.
Khắc phục VMware Disk needs repair sau mất điện — TEKFix TUNGTEKXem lớn ↗
Hình 01 — Khắc phục VMware Disk needs repair sau mất điện — TEKFix TUNGTEK. Minh họa đã chuẩn hóa; chữ ký raster gốc được giữ nguyên.
Mục lục

01. Tóm tắt nhanh cho kỹ sư IT#

Một máy ảo Windows Server vận hành trên VMware Workstation không thể khởi động sau sự cố mất điện. Giao diện báo “The parent of this virtual disk could not be opened”, làm người vận hành dễ nghi ngờ thiếu VMDK cha hoặc sai liên kết snapshot. Tuy nhiên, khi lần theo vmware.log, nguyên nhân gần nhất được phát hiện là một extent SPARSE trong snapshot trung gian báo “Disk needs repair (14)”.

Sau khi xác minh chuỗi CID/parentCID không có sai lệch, kỹ sư áp dụng vmware-vdiskmanager -R lên đúng descriptor của snapshot lỗi. VMware xác nhận sửa thành công. Kiểm tra -e với cả ba VMDK đang gắn vào VM đều trả về “Disk chain is consistent” và Exit Code 0. Đây là kết quả ở lớp ảo hóa, chưa thay thế việc hậu kiểm Windows, SQL Server và dữ liệu ứng dụng.

Điều cần nhớ trong 30 giây#

  • Thông báo “parent could not be opened” là biểu hiện; lỗi thực tế có thể nằm sâu ở một extent thuộc snapshot tổ tiên.
  • Không chỉnh CID/parentCID chỉ vì thấy lỗi parent — phải đối chiếu descriptor và log trước.
  • Với VMDK split sparse, Repair bằng descriptor .vmdk của snapshot lỗi, không chỉ định file -s001.vmdk làm đầu vào.
  • Chạy -R là thao tác sửa có ghi. Sao lưu đủ bộ file VM/chuỗi snapshot sang thiết bị khác trước khi sửa.
  • Kết quả -e nhất quán không chứng minh dữ liệu hệ điều hành và cơ sở dữ liệu ứng dụng hoàn toàn nguyên vẹn.

02. Triệu chứng và bối cảnh sự cố#

Diễn biến ghi nhận#

Giai đoạnQuan sátÝ nghĩa kỹ thuật
Trước sự cốVM từng báo một tiến trình khác đang khóa file VMDK; mở Workstation với quyền Administrator đã giúp xử lý tạm thời.Không được suy diễn đó là nguyên nhân của lỗi tiếp theo.
Mất điệnHost dừng đột ngột trong thời gian VM có chuỗi snapshot nhiều tầng.Có nguy cơ ghi dở metadata, hệ thống file hoặc SQL transaction.
Khởi động lại VMThông báo: The parent of this virtual disk could not be opened.Lỗi tại lớp mở đĩa, cần đọc DISKLIB trong log.
Điều traMột SPARSE extent thuộc 000006 báo Disk needs repair (14).Đã khoanh vùng nguồn lỗi trực tiếp.
Khắc phụcRepair -R trên descriptor snapshot 000006 thành công; -e của 3 chuỗi trả về consistent.Khôi phục được tính nhất quán ở lớp virtual disk.
Phân biệt thông báo parent VMDK và lỗi DISKLIB-SPARSE trong logXem lớn ↗
Hình 03 — Phân biệt thông báo parent VMDK và lỗi DISKLIB-SPARSE trong log. Minh họa đã chuẩn hóa; chữ ký raster gốc được giữ nguyên.

Ba loại lỗi cần phân biệt#

Thông báoNguyên nhân thường gặpỨng xử
The process cannot access the file / lockedTiến trình VM, backup, mount disk, antivirus hoặc quyền truy cập.Tìm handle/PID; không xóa .lck tùy tiện.
The parent of this virtual disk could not be openedLỗi bất kỳ mắt xích nào trong chuỗi, gồm thiếu file, sai CID hoặc metadata hỏng.Đọc log và descriptor cha.
Disk needs repairVMware không chấp nhận cấu trúc một VMDK sparse.Bảo vệ dữ liệu, kiểm tra file, cân nhắc -R đúng descriptor.

03. Cấu trúc snapshot chain: lý do không được đoán theo số thứ tự#

Trong nhánh snapshot của ca này, chuỗi phụ thuộc đã được xác minh qua parentFileNameHint, CID và parentCID theo thứ tự BASE → 000004 → 000006 → 000007 → 000005 → 000008. Số hậu tố không nhất thiết tăng đều theo nhánh đang vận hành.

Sơ đồ CID/parentCID theo chuỗi BASE → 000004 → 000006 → 000007 → 000005 → 000008Xem lớn ↗
Hình 02 — Sơ đồ CID/parentCID theo chuỗi BASE → 000004 → 000006 → 000007 → 000005 → 000008. Minh họa đã chuẩn hóa; chữ ký raster gốc được giữ nguyên.

CID và parentCID hoạt động như thế nào?#

Mỗi descriptor VMDK ghi CID của nó và parentCID dự kiến của disk cha. Để liên kết hợp lệ, parentCID của VMDK con phải bằng CID của descriptor VMDK cha mà parentFileNameHint chỉ tới. Base disk có parentCID=ffffffff. Đây là kiểm tra tính nhất quán liên kết, không phải kiểm tra checksum toàn bộ extent.

VMDK ví dụCID đã thay thếparentCID đã thay thếParent
ServerOS.vmdk10ac20feffffffff—
ServerOS-000004.vmdk20bd31ef10ac20feBase
ServerOS-000006.vmdk30ce42dd20bd31ef000004
ServerOS-000007.vmdk40df53cc30ce42dd000006
ServerOS-000005.vmdk50e064bb40df53cc000007
ServerOS-000008.vmdk60f175aa50e064bb000005

Các CID trong bảng là giá trị giả lập nhất quán để dùng công khai, không phải CID gốc của hệ thống.

Split sparse VMDK gồm những gì?#

Với createType="twoGbMaxExtentSparse", snapshot có một descriptor văn bản nhỏ và nhiều file extent như ServerOS-000006-s001.vmdk, ServerOS-000006-s002.vmdk… Mỗi RW/SPARSE trong descriptor mô tả một vùng dung lượng logic của đĩa. File s001 đang tồn tại và có dung lượng vật lý khác 0 vẫn có thể chứa metadata sparse cần sửa.

ini · MẪU DESCRIPTOR · KHÔNG DÙNG TÁI TẠO ĐĨA
# Minh họa descriptor VMDK đã thay tên/CID
CID=30ce42dd
parentCID=20bd31ef
createType="twoGbMaxExtentSparse"
parentFileNameHint="ServerOS-000004.vmdk"
RW 33554432 SPARSE "ServerOS-000006-s001.vmdk"
RW 33554432 SPARSE "ServerOS-000006-s002.vmdk"
Descriptor và các extent VMDK split sparseXem lớn ↗
Hình 04 — Descriptor và các extent VMDK split sparse. Minh họa đã chuẩn hóa; chữ ký raster gốc được giữ nguyên.

04. Điều tra chính xác bằng vmware.log và PowerShell#

Bước 1 — Giữ hiện trạng#

  • Tắt VM và ngừng thử Power On lặp lại. Ghi nhận phiên bản Workstation, danh sách VMDK đang gắn và dung lượng trống host.
  • Nếu nghi ngờ ổ nguồn có dấu hiệu lỗi đọc, ưu tiên tạo image/bản sao có kiểm soát trước mọi công cụ repair.
  • Không Revert/Delete Snapshot, không Consolidate, không chỉnh CID và không chạy CHKDSK /f trên nguồn ngay lập tức.

Bước 2 — Đọc lỗi có ý nghĩa trong vmware.log#

powershell · CHỈ ĐỌC / KIỂM TRA
$vmDir = 'D:\VM-Lab\WindowsServer-VM'
$log = Join-Path $vmDir 'vmware.log'
Get-Content -LiteralPath $log -Tail 500 |
  Select-String -Pattern 'DISKLIB-SPARSE|DISKLIB-CHAIN|Disk needs repair|Failed to open|000006' |
  Select-Object -Last 60

Đoạn log tiêu biểu đã ẩn danh:

text · KẾT QUẢ MẪU ĐÃ ẨN DANH
DISKLIB-SPARSE: "...ServerOS-000006-s001.vmdk"
  failed to open (14): Disk needs repair.
DISKLIB-LINK: Failed to open "...ServerOS-000006.vmdk"
  The specified virtual disk needs repair.
DISKLIB-CHAIN: "...ServerOS-000008.vmdk"
  Failed to open parent "...ServerOS-000006.vmdk".

Suy luận: vùng lỗi trực tiếp được chỉ tên là extent 000006-s001; lỗi parent trên snapshot đỉnh là hệ quả truyền qua chuỗi. Không được khẳng định chắc nội dung file bị mất hoặc bad sector chỉ từ thông báo này.

Bước 3 — Liệt kê descriptor và đối chiếu liên kết#

powershell · CHỈ ĐỌC / KIỂM TRA
$vmDir = 'D:\VM-Lab\WindowsServer-VM'
$stem = 'ServerOS'
$ids = @('', '-000004', '-000006', '-000007', '-000005', '-000008')
foreach ($id in $ids) {
    $file = Join-Path $vmDir ($stem + $id + '.vmdk')
    Write-Host "===== $([IO.Path]::GetFileName($file)) ====="
    if (Test-Path -LiteralPath $file -PathType Leaf) {
        Get-Content -LiteralPath $file -TotalCount 12 |
          Select-String '^(CID|parentCID|parentFileNameHint)='
    } else { Write-Host 'MISSING DESCRIPTOR' }
}

Chỉ đọc những file descriptor đã biết tên. Không dùng Get-Content để trích text từ file nhị phân extent -sNNN.vmdk.

Bước 4 — Kiểm tra extent được khai báo#

powershell · CHỈ ĐỌC / KIỂM TRA
$desc = Join-Path $vmDir 'ServerOS-000006.vmdk'
$extents = @(Get-Content -LiteralPath $desc | ForEach-Object {
    if ($_ -match '^RW\s+\d+\s+SPARSE\s+"([^"]+)"') {
        $Matches[1]
    }
})
$missing = @($extents | Where-Object {
    -not (Test-Path -LiteralPath (Join-Path $vmDir $_) -PathType Leaf)
})
"Declared extents: $($extents.Count)"
"Missing extents: $($missing.Count)"
$missing

Nếu extent thiếu, cần truy tìm/khôi phục trước. Nếu không thiếu, vẫn chưa chứng minh nội dung và metadata của từng extent hợp lệ.

05. Quy trình khôi phục an toàn, có thể kiểm toán#

Bảo toàn → sao lưu → điều tra → repair → verify → hậu kiểmXem lớn ↗
Hình 05 — Bảo toàn → sao lưu → điều tra → repair → verify → hậu kiểm. Minh họa đã chuẩn hóa; chữ ký raster gốc được giữ nguyên.

Điều kiện trước khi chạy -R#

  • VM phải tắt hoàn toàn, không ở trạng thái suspended; đóng Workstation, kiểm tra không có tiến trình nào dùng bộ VMDK liên quan.
  • Có bản sao đầy đủ, độc lập của VM ở thiết bị khác nếu có thể; không chỉ chép descriptor 000006 mà bỏ các extent/parent.
  • Đảm bảo nguồn điện ổn định và ổ lưu trữ không có dấu hiệu lỗi vật lý đang diễn tiến.
  • Nếu phải cứu gấp trên bản gốc, coi đó là phương án rủi ro cao; cần ghi nhận quyết định và không gọi là quy trình chuẩn.

Bước 5 — Định vị vmware-vdiskmanager#

powershell · CHỈ ĐỌC / KIỂM TRA
$tool = 'C:\Program Files (x86)\VMware\VMware Workstation\vmware-vdiskmanager.exe'
if (-not (Test-Path -LiteralPath $tool)) {
    throw 'Không tìm thấy vmware-vdiskmanager.exe; kiểm tra thư mục cài đặt.'
}

Bước 6 — Repair đúng descriptor snapshot lỗi#

Đoạn dưới minh họa thao tác trên thư mục bản sao độc lập. Đường dẫn E: chỉ là ví dụ; đừng chạy nếu E: không chứa bộ VM đã được sao lưu đầy đủ.

powershell · CÓ GHI DỮ LIỆU · BACKUP TRƯỚC REPAIR
$recoveryDir = 'E:\VM-Recovery-Copy\WindowsServer-VM'
$target = Join-Path $recoveryDir 'ServerOS-000006.vmdk'
if (-not (Test-Path -LiteralPath $target)) { throw 'Missing descriptor.' }
& $tool -R $target
"Repair exit code: $LASTEXITCODE"

Kết quả đã được ghi nhận trong ca thực tế, trình bày lại với đường dẫn ẩn danh:

text · KẾT QUẢ MẪU ĐÃ ẨN DANH
The virtual disk, '...\ServerOS-000006.vmdk',
was corrupted and has been successfully repaired.

Không chạy -R vào “ServerOS-000008.vmdk” chỉ vì tên ấy xuất hiện trên popup. Không chạy thẳng vào extent “-s001.vmdk”. Trong case này điểm hỏng đã được log xác nhận ở descriptor/snapshot 000006.

Bước 7 — Xác minh chuỗi snapshot đỉnh và các ổ còn lại#

powershell · CHỈ ĐỌC / KIỂM TRA
$disks = @(
  'ServerOS-000008.vmdk',
  'ServerData-000005.vmdk',
  'AdditionalDisk-000005.vmdk'
)
foreach ($disk in $disks) {
    Write-Host "Checking: $disk"
    & $tool -e (Join-Path $recoveryDir $disk)
    Write-Host "Exit Code: $LASTEXITCODE"
}

Trong dữ liệu ca thật, cả ba chuỗi đều trả “Disk chain is consistent.” với Exit Code 0. Kết quả này không thay thế kiểm tra boot, NTFS, ứng dụng và SQL Server.

06. Bằng chứng kết quả thực tế và giới hạn kết luận#

3/3 chuỗi VMDK consistent; Windows và SQL chưa được xác nhậnXem lớn ↗
Hình 06 — 3/3 chuỗi VMDK consistent; Windows và SQL chưa được xác nhận. Minh họa đã chuẩn hóa; chữ ký raster gốc được giữ nguyên.
Tiêu chíKết quả đã kiểm chứngChưa thể suy ra
Descriptor 000006 repairVMware thông báo successfully repaired.Không bảo đảm không có sector dữ liệu bị mất.
Đĩa hệ thống tại 000008Disk chain is consistent; Exit Code 0.Không bảo đảm Windows khởi động được.
Đĩa dữ liệu thứ haiDisk chain is consistent; Exit Code 0.Không bảo đảm SQL MDF/LDF nguyên vẹn.
Đĩa dữ liệu thứ baDisk chain is consistent; Exit Code 0.Không bảo đảm ứng dụng đã vận hành bình thường.

Tại thời điểm kết thúc log được cung cấp, chưa có biên bản hậu kiểm Windows/SQL hoặc bằng chứng database được xác nhận ONLINE. Do đó bài viết chỉ tuyên bố phục hồi thành công tính nhất quán chuỗi VMDK, không tuyên bố phục hồi hoàn tất hệ thống ứng dụng.

Checklist sau khi VM có thể khởi động#

  1. Power On từ bản sao đã kiểm chứng; ghi lại mọi cảnh báo I/O, filesystem hoặc tự động sửa đĩa.
  2. Xác nhận Windows boot, nhận đủ volume và dịch vụ thiết yếu; không cho người dùng ghi mới ngay nếu cần bảo tồn pháp y.
  3. Kiểm tra SQL Server service, SQL Error Log, trạng thái từng database (ONLINE/SUSPECT/RECOVERY_PENDING).
  4. Ưu tiên bản SQL backup hợp lệ ra nơi lưu trữ độc lập; đánh giá mức độ nhất quán giao dịch.
  5. Sau khi có bản bảo vệ và đánh giá I/O, chạy DBCC CHECKDB phù hợp để kiểm tra logic/physical integrity. Tuyệt đối không tự động dùng REPAIR_ALLOW_DATA_LOSS.
  6. Chỉ mở lại ứng dụng nghiệp vụ sau kiểm thử mẫu nghiệp vụ và phê duyệt vận hành.
sql · CHỈ ĐỌC / KIỂM TRA
-- Ví dụ kiểm tra trạng thái; thực hiện trên SQL instance được phép
SELECT name, state_desc, recovery_model_desc
FROM sys.databases ORDER BY name;
 
-- Đọc tính toàn vẹn DB khi đã có kế hoạch bảo vệ phù hợp
DBCC CHECKDB (N'<DatabaseName>') WITH NO_INFOMSGS;

07. Thiết kế phòng ngừa cho máy ảo lưu dữ liệu quan trọng#

Phòng ngừa bằng UPS, backup độc lập và quản lý snapshotXem lớn ↗
Hình 07 — Phòng ngừa bằng UPS, backup độc lập và quản lý snapshot. Minh họa đã chuẩn hóa; chữ ký raster gốc được giữ nguyên.

Split 2 GB hay single-file VMDK?#

Khía cạnhSingle-fileSplit 2 GB
Số file cần giữÍt hơn, tiện quản lý trên NTFS hiện đạiNhiều extent; phải giữ đủ các file
Backup/copyĐơn giản về danh sách file, nhưng file lớnThuận tiện hệ thống giới hạn kích thước file
Độ an toànKhông tự động an toàn hơnKhông tự động kém an toàn hơn
SnapshotVẫn phát sinh delta/snapshot riêngVẫn có snapshot và chuỗi phụ thuộc

Đề xuất vận hành: phân tách các VMDK theo chức năng (OS, SQL data, SQL log) nếu nhu cầu quản trị phù hợp; chọn một file VMDK lớn cho mỗi đĩa khi nền tảng lưu trữ cho phép. Không chuyển đổi định dạng trên máy ảo chưa được backup; dùng clone để migration, sau đó xác minh dữ liệu.

Snapshot không phải Backup#

AutoProtect có thể tạo nhiều nhánh snapshot theo thời gian. Đây là công cụ rollback trong thời gian ngắn, không thay thế bản backup độc lập, đặc biệt đối với SQL Server. Tránh giữ chuỗi snapshot kéo dài trên máy chủ thực tế; lên kế hoạch backup ứng dụng, backup VM, kiểm tra restore và nguồn UPS.

Khuyến nghị kỹ thuật triển khai#

  • UPS có giám sát và shutdown an toàn cho host; kiểm tra lại tình trạng pin định kỳ.
  • Theo dõi dung lượng host còn trống, độ tăng trưởng delta VMDK, SMART/RAID và Event Viewer theo đúng provider storage.
  • Backup SQL native (full/differential/log tùy recovery model) và bản sao VM độc lập.
  • Kiểm thử restore định kỳ và lưu nhật ký thao tác recovery để tái lập.
  • Không dựa vào việc Run as Administrator như cách sửa mặc định: thao tác này có thể vượt qua lỗi quyền, nhưng không sửa được sparse metadata hỏng.

08. Bảng quyết định nhanh khi kết quả không như mong đợi#

Tình huốngHành động ưu tiên
-R thất bại hoặc lặp lại Disk needs repairDừng ghi; giữ bản gốc; kiểm tra sức khỏe media/I/O và bản sao, dùng recovery chuyên sâu nếu cần.
-e báo CID mismatchĐọc đúng parent chain và chứng cứ thời điểm sửa file; không sửa CID bằng cách đoán.
-e báo missing extentTìm bản extent bị thiếu đúng chuỗi; không tạo placeholder rỗng.
Repair xong, Windows BSODChuyển sang chẩn đoán boot/storage driver/filesystem; không lặp lại -R không có lỗi mới.
Windows lên, SQL database SUSPECTGiữ hiện trạng, lấy SQL logs/backup và đánh giá restore; tránh REPAIR_ALLOW_DATA_LOSS.
Host có bad sector/unstable RAIDƯu tiên clone/image mức lưu trữ trước khi tiếp tục đọc nhiều lần.

09. FAQ — Câu hỏi kỹ thuật thường gặp#

Có phải lỗi parent luôn là CID mismatch?

Không. Parent có thể không mở được vì thiếu file, file bị khóa, metadata sparse hỏng hoặc I/O. Phải lấy thông báo DISKLIB gần nguyên nhân đầu tiên.

Tại sao snapshot 000005 nằm sau 000007?

Hậu tố số có thể phản ánh lịch sử nhánh snapshot, không phải thứ tự phụ thuộc hiện tại. Dùng parentFileNameHint và CID để xác minh.

-R khác -e như thế nào?

-R cố gắng sửa đĩa và có ghi; -e kiểm tra chain. Cần phân biệt lệnh có khả năng thay đổi dữ liệu với lệnh kiểm tra.

Repair 000008 hay 000006?

Trong case này log chỉ đích danh extent 000006-s001, do đó target sửa là descriptor 000006.vmdk. Không suy rộng quy tắc này cho ca khác.

Disk chain is consistent có nghĩa file SQL an toàn?

Không. Đây là xác minh liên kết/cấu trúc tại lớp VMware, không kiểm tra DBCC hoặc tính nhất quán giao dịch.

Có nên xóa .lck ngay khi thấy lỗi locked?

Không. Kiểm tra VM còn hoạt động, handle và các tiến trình liên quan trước. Xóa khóa khi VM thực sự đang chạy có thể gây thiệt hại.

VMDK split 2 GB có dễ hỏng hơn single-file?

Không có bằng chứng từ một ca để kết luận định dạng nào dễ hỏng hơn. Điểm khác biệt là số file cần bảo toàn và cách quản lý.

Nếu máy chủ không có backup mà cần sửa gấp?

Đó là tình huống chấp nhận rủi ro cao. Cố gắng tạo image/bản sao trước, ghi nhận quyết định và tránh các thao tác phá hủy. Không mặc định Repair luôn an toàn.

10. Nguồn tham khảo và phạm vi đối chiếu#

Tài liệu ca thực tế đã ẩn danh do TUNGTEK cung cấp là nguồn cho kết quả -R và 3/3 chain consistent, Exit Code 0. Tài liệu hãng bên dưới giải thích cơ chế và quy trình; không phải kiểm thử độc lập ca này.

Nguồn AutoProtect bên dưới dành cho VMware Fusion; dùng tham chiếu nguyên lý snapshot phụ thuộc, không coi là ma trận hỗ trợ Workstation 17.x.

11. Bước tiếp theo khi cần hỗ trợ#

Giữ bản gốc, ghi lại thao tác đã làm và chuẩn bị danh sách dữ liệu ưu tiên. TUNGTEK tiếp nhận hiện trạng để thống nhất bước khảo sát phù hợp. Không gửi log chứa dữ liệu nhận diện hoặc file VM nhạy cảm lên bình luận công khai.

🇻🇳 Sự cố dữ liệu? Gọi TUNGTEK.

Tư vấn theo hiện trạng; giữ bản gốc và thống nhất phạm vi trước khi xử lý.

0963 509 115

Mở ảnh đầy đủ ↗