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.
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.
Xem lớ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ạn | Quan 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ện | Host 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 VM | Thô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 tra | Mộ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ục | Repair -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. |
Xem lớn ↗Ba loại lỗi cần phân biệt#
| Thông báo | Nguyên nhân thường gặp | Ứng xử |
|---|---|---|
| The process cannot access the file / locked | Tiế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 opened | Lỗ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 repair | VMware 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.
Xem lớ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.vmdk | 10ac20fe | ffffffff | — |
| ServerOS-000004.vmdk | 20bd31ef | 10ac20fe | Base |
| ServerOS-000006.vmdk | 30ce42dd | 20bd31ef | 000004 |
| ServerOS-000007.vmdk | 40df53cc | 30ce42dd | 000006 |
| ServerOS-000005.vmdk | 50e064bb | 40df53cc | 000007 |
| ServerOS-000008.vmdk | 60f175aa | 50e064bb | 000005 |
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.
# 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"
Xem lớ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#
$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:
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#
$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#
$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)"
$missingNế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#
Xem lớ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#
$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 đủ.
$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:
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#
$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#
Xem lớn ↗| Tiêu chí | Kết quả đã kiểm chứng | Chưa thể suy ra |
|---|---|---|
| Descriptor 000006 repair | VMware 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 000008 | Disk chain is consistent; Exit Code 0. | Không bảo đảm Windows khởi động được. |
| Đĩa dữ liệu thứ hai | Disk chain is consistent; Exit Code 0. | Không bảo đảm SQL MDF/LDF nguyên vẹn. |
| Đĩa dữ liệu thứ ba | Disk 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#
- 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.
- 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.
- Kiểm tra SQL Server service, SQL Error Log, trạng thái từng database (ONLINE/SUSPECT/RECOVERY_PENDING).
- Ư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.
- 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.
- 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.
-- 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#
Xem lớn ↗Split 2 GB hay single-file VMDK?#
| Khía cạnh | Single-file | Split 2 GB |
|---|---|---|
| Số file cần giữ | Ít hơn, tiện quản lý trên NTFS hiện đại | Nhiều extent; phải giữ đủ các file |
| Backup/copy | Đơn giản về danh sách file, nhưng file lớn | Thuận tiện hệ thống giới hạn kích thước file |
| Độ an toàn | Không tự động an toàn hơn | Không tự động kém an toàn hơn |
| Snapshot | Vẫn phát sinh delta/snapshot riêng | Vẫ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ống | Hành động ưu tiên |
|---|---|
| -R thất bại hoặc lặp lại Disk needs repair | Dừ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 extent | Tìm bản extent bị thiếu đúng chuỗi; không tạo placeholder rỗng. |
| Repair xong, Windows BSOD | Chuyể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 SUSPECT | Giữ 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