- 출처 / 참고: VMware Broadcom Knowledge Base (Recreating a missing virtual machine disk descriptor file .vmdk - KB 1002511, VMware Virtual Disk Format 1.1 Specification)
명령어:
vmkfstools,hexdump,cat,grep,ls,stat
키워드: VMDK Descriptor, *-flat.vmdk, Corrupted Descriptor, Recreating vmdk, ddb.geometry, CID, vmkfstools -c, ddb.adapterType
사용처: 가상 머신 부팅 시 ‘Cannot open the disk’ 또는 디스크립터 유실로 인한 VMDK 인식 실패 장애 긴급 복구
실행예제
가상 머신 부팅 시 Cannot open the disk '...vmdk' or one of the snapshot disks it depends on 오류가 발생하고, 실제 데이터 본체인 *-flat.vmdk는 존재하지만 텍스트 헤더 역할을 하는 디스크립터(.vmdk) 파일이 0바이트로 깨지거나 유실되었을 때의 진단 과정입니다.
# 1. 가상 머신 vmware.log에서 디스크립터 파일 읽기 실패 로그 확인
$ tail -n 30 /vmfs/volumes/datastore1/Web-Server-02/vmware.log | grep -iE "disklib|cannot open"
# [출력 예시]
# DISKLIB-VMFS : "/vmfs/volumes/datastore1/Web-Server-02/Web-Server-02.vmdk" : failed to open (The file specified is not a virtual disk):
# DISKLIB-LINK : "/vmfs/volumes/datastore1/Web-Server-02/Web-Server-02.vmdk" : failed to open (The file specified is not a virtual disk).
# Msg_Post: Error
# [msg.disk.fileNotFound] Cannot open the disk '/vmfs/volumes/datastore1/Web-Server-02/Web-Server-02.vmdk' or one of the snapshot disks it depends on.
# 2. 데이터스토어 디렉터리 내 실제 파일 목록 및 크기 확인
$ cd /vmfs/volumes/datastore1/Web-Server-02/
$ ls -la *-flat.vmdk *.vmdk
# -rw------- 1 root root 0 Oct 31 10:20 Web-Server-02.vmdk <-- 크기가 0 Byte(손상/깨짐)
# -rw------- 1 root root 42949672960 Oct 31 10:15 Web-Server-02-flat.vmdk <-- 데이터 본체는 정상 보존됨 (40GB)
# 3. 플랫(flat) 파일의 정확한 바이트(Byte) 크기 측정
$ ls -ln Web-Server-02-flat.vmdk | awk '{print $5}'
# 42949672960
# 4. 가상 머신 VMX 파일에서 사용 중인 가상 SCSI 컨트롤러 타입 확인
$ grep -iE "scsi.*virtualdev" Web-Server-02.vmx
# scsi0.virtualDev = "lsilogic" (또는 "pvscsi", "buslogic")
스크립트
ESXi 호스트 셸에서 실행되어 손상되거나 사라진 가상 디스크의 *-flat.vmdk 파일 크기를 읽어 정확한 섹터(Sector) 수를 계산하고, 임시 디스크 생성을 통해 올바른 지오메트리(Geometry)를 가진 신규 디스크립터(.vmdk) 파일을 무손실 자동 복원하는 쉘 스크립트입니다.
#!/bin/sh
# recreate_vmdk_descriptor.sh - Recreate missing or corrupted VMware ESXi VMDK descriptor file
FLAT_FILE=${1:-""}
CONTROLLER_TYPE=${2:-"lsilogic"}
echo "=========================================="
echo " [VMware ESXi VMDK 디스크립터 자동 복구기]"
echo "=========================================="
if [ -z "$FLAT_FILE" ] || [ ! -f "$FLAT_FILE" ]; then
echo " [오류] 대상 *-flat.vmdk 파일 경로를 정확히 입력하십시오."
echo " 사용법: $0 <path_to_flat_vmdk> [lsilogic|pvscsi]"
exit 1
fi
FLAT_DIR=$(dirname "$FLAT_FILE")
FLAT_NAME=$(basename "$FLAT_FILE")
# 파일명이 -flat.vmdk 로 끝나는지 검증
if ! echo "$FLAT_NAME" | grep -q -- "-flat\.vmdk$"; then
echo " [오류] 지정한 파일은 '-flat.vmdk' 형식이 아닙니다: ${FLAT_NAME}"
exit 1
fi
BASE_NAME=$(echo "$FLAT_NAME" | sed 's/-flat\.vmdk$//')
DESCRIPTOR_FILE="${FLAT_DIR}/${BASE_NAME}.vmdk"
TEMP_BASE="${FLAT_DIR}/temp_dummy_recover"
echo " - 플랫 파일 대상 : ${FLAT_NAME}"
echo " - 복구될 디스크립터: ${BASE_NAME}.vmdk"
echo " - 컨트롤러 타입 : ${CONTROLLER_TYPE}"
# 1. 플랫 파일의 바이트 크기 추출 및 512바이트 섹터 수 계산
FLAT_SIZE_BYTES=$(ls -ln "$FLAT_FILE" | awk '{print $5}')
if [ -z "$FLAT_SIZE_BYTES" ] || [ "$FLAT_SIZE_BYTES" -le 0 ]; then
echo " [오류] 플랫 파일 크기를 읽을 수 없습니다."
exit 1
fi
SECTORS=$((FLAT_SIZE_BYTES / 512))
echo -e "\n[1] 파일 크기 분석:"
echo " - 실제 파일 바이트 : ${FLAT_SIZE_BYTES} Bytes"
echo " - 계산된 섹터 총수 : ${SECTORS} Sectors"
# 2. vmkfstools 명령어를 활용하여 임시 더미 디스크립터 생성 (-c)
echo -e "\n[2] 동일 규격 임시 더미 디스크 생성 중..."
cd "$FLAT_DIR" || exit 1
vmkfstools -c "$FLAT_SIZE_BYTES" -a "$CONTROLLER_TYPE" -d thin "${TEMP_BASE}.vmdk" >/dev/null 2>&1
if [ ! -f "${TEMP_BASE}.vmdk" ]; then
echo " [오류] 임시 디스크립터 생성에 실패했습니다. 데이터스토어 쓰기 권한을 확인하십시오."
exit 1
fi
# 3. 임시 디스크립터를 기반으로 원본 파일명 매핑 및 신규 디스크립터 생성
echo -e "\n[3] 디스크립터 헤더 재구성 중..."
# 기존 손상된 파일이 있다면 백업
if [ -f "$DESCRIPTOR_FILE" ]; then
mv -f "$DESCRIPTOR_FILE" "${DESCRIPTOR_FILE}.corrupted_bak"
echo " - 기존 손상 파일 백업 -> ${BASE_NAME}.vmdk.corrupted_bak"
fi
# 임시 디스크립터에서 파일명 치환하여 정식 디스크립터로 복사
sed "s/${TEMP_BASE}-flat\.vmdk/${FLAT_NAME}/g" "${TEMP_BASE}.vmdk" > "$DESCRIPTOR_FILE"
# 4. 임시 생성된 불필요한 더미 플랫 파일 삭제
rm -f "${TEMP_BASE}.vmdk" "${TEMP_BASE}-flat.vmdk"
# 5. 복구된 디스크립터 검증
echo -e "\n[4] 복구 결과 검증:"
if [ -s "$DESCRIPTOR_FILE" ]; then
echo " [성공] 디스크립터 파일이 복구되었습니다:"
echo "--------------------------------------------------"
cat "$DESCRIPTOR_FILE"
echo "--------------------------------------------------"
echo " -> 가상 머신 설정 편집에서 디스크가 정상 인식되는지 확인하십시오."
else
echo " [실패] 디스크립터 파일이 올바르게 생성되지 않았습니다."
fi
echo -e "\n=========================================="
echo " [복구 완료]"
echo "=========================================="
해설
VMware ESXi 환경의 가상 디스크(VMDK)는 단일 파일처럼 보이지만, 실제로는 1) 디스크 규격과 실린더 지오메트리를 정의하는 수 KB 크기의 텍스트 파일인 디스크립터(.vmdk)와 2) 실제 게스트 OS의 모든 원시 데이터가 저장되는 바이너리 파일인 플랫 파일(-flat.vmdk)의 2개 파일이 한 쌍(Pair)으로 구성되어 있습니다.
1. 주요 손상 및 유실 원인
- 파일 복사/이관 중 텍스트 디스크립터 누락:
- SCP나 웹 데이터스토어 브라우저로 파일을 다운로드/업로드하는 과정에서 작은
.vmdk파일이 누락되거나 덮어쓰여 0 Byte로 초기화되는 경우.
- SCP나 웹 데이터스토어 브라우저로 파일을 다운로드/업로드하는 과정에서 작은
- ESXi 호스트 비정상 셧다운으로 인한 파일 메타데이터 깨짐:
- 정전이나 커널 패닉으로 디스크립터 파일 본문이 손상되어
The file specified is not a virtual disk오류 발생.
- 정전이나 커널 패닉으로 디스크립터 파일 본문이 손상되어
- 스냅샷 체인 상의 CID(Content ID) 불일치:
- 부모-자식 스냅샷 체인에서 디스크립터 내부의
CID와parentCID링크가 어긋난 경우.
- 부모-자식 스냅샷 체인에서 디스크립터 내부의
2. VMDK 디스크립터 내부 구조 분석
정상적인 디스크립터 파일은 아래와 같은 표준 텍스트 구조를 갖습니다:
# Disk DescriptorFile
version=1
encoding="UTF-8"
CID=7f2a1b4c
parentCID=ffffffff
createType="vmfs"
# Extent description
RW 83886080 VMFS "Web-Server-02-flat.vmdk"
# The Disk Data Base
#DDB
ddb.adapterType = "lsilogic"
ddb.geometry.sectors = "63"
ddb.geometry.heads = "255"
ddb.geometry.cylinders = "5221"
ddb.virtualHWVersion = "14"
- Extent description (
RW 83886080 VMFS ...):83886080: 512바이트 기준 정확한 섹터 수입니다 ($40\text{GB} \times 1024 \times 1024 \times 1024 \div 512 = 83,886,080$).- 따옴표 안에 실제 데이터 본체 파일명(
*-flat.vmdk)이 1:1로 매핑되어 있어야 합니다.
ddb.adapterType:- 가상 머신 생성 시 지정된 컨트롤러(
lsilogic,pvscsi,ide등)와 완벽히 일치해야 부팅 에러가 발생하지 않습니다.
- 가상 머신 생성 시 지정된 컨트롤러(
3. 수동 복구 단계별 가이드 (수동 수행 시)
- 정확한 파일 바이트 수 확인:
ls -l Web-Server-02-flat.vmdk - 동일 크기의 임시 VMDK 생성 (
vmkfstools -c):vmkfstools -c 42949672960 -a lsilogic -d thin temp.vmdk - 임시 텍스트 파일(
temp.vmdk)을 원본 이름으로 복사 후 파일명 수정:- 텍스트 에디터(
vi)로temp.vmdk를 열어temp-flat.vmdk로 적힌 참조명을 실제 파일인Web-Server-02-flat.vmdk로 변경합니다.
- 텍스트 에디터(
- 더미 데이터 파일(
temp-flat.vmdk) 삭제:- 생성된 빈 더미 파일은 삭제하여 스토리지를 비웁니다.
주의사항
*-flat.vmdk파일 직접 수정 및 삭제 절대 금지:- 손상된 것은 텍스트 형태의 껍데기 파일(
.vmdk)일 뿐입니다. 수십~수백 GB 크기의-flat.vmdk파일은 사용자의 실제 운영 데이터베이스와 파일이 들어있는 본체이므로 절대로rm하거나 임의 변경해서는 안 됩니다.
- 손상된 것은 텍스트 형태의 껍데기 파일(
- 컨트롤러 타입(Adapter Type) 일치 필수:
- 실제 게스트 OS가 VMware Paravirtual(
pvscsi) 드라이버로 설치되었는데 디스크립터 복구 시lsilogic으로 지정하면, 부팅 중 블루스크린(BSOD)이나Inaccessible Boot Device, 리눅스의Kernel Panic - not syncing: VFS: Unable to mount root fs가 발생합니다. 반드시 VMX 파일의 컨트롤러 설정을 확인해야 합니다.
- 실제 게스트 OS가 VMware Paravirtual(
- 스냅샷 델타 디스크립터 복구 시 CID 체인 무결성 확인:
- 스냅샷이 물려있는 델타 디스크립터(
*-000001.vmdk)가 깨진 경우에는 단순 생성이 아닌 상위 부모 디스크의CID를 자식의parentCID와 정확히 연결해야 합니다. 잘못 연결할 경우 파일시스템 블록 인덱스가 뒤엉켜 데이터가 손상될 수 있습니다.
- 스냅샷이 물려있는 델타 디스크립터(