VHD(Virtual Hard Disk) 파일은 VirtualBox를 비롯한 여러 x86/x86_64 가상화 프로그램에서 실제 저장 장치처럼 동작하도록 만들어진 대형 디스크 이미지 파일입니다. 이 파일을 활용하면 리눅스 배포판 안에서 Windows, macOS, MS-DOS, FreeBSD, OpenBSD, OS/2, 심지어 다른 버전의 리눅스까지 손쉽게 구동할 수 있습니다.
일반적인 ISO 이미지라면 dd 명령어 한 줄로 물리적 디스크에 바로 기록할 수 있지만, VHD 파일에는 그대로 적용되지 않습니다. 그렇다고 방법이 없는 것은 아닙니다. 일부 가이드에서는 VHD를 ISO로 변환한 뒤 작업할 것을 권하지만, 최신 리눅스에서 VirtualBox를 사용하고 있다면 변환 과정 없이도 충분히 처리할 수 있습니다. QEMU 사용자 역시 별도의 우회 경로가 있으며, 다만 절차가 조금 더 까다롭습니다.
작업 전 필수 확인 사항
가장 먼저 확인할 것은 대상 드라이브나 파티션이 현재 시스템이 부팅에 사용하는 디스크가 아니라는 점입니다. 이 글의 예제에서는 파티션을 나눈 NAND 메모리(SD 카드)를 테스트 용도로 사용했지만, 상황에 따라서는 라이브 DVD나 USB로 부팅한 환경에서 진행하는 편이 훨씬 안전합니다.
부팅 방식과 무관하게 터미널은 Ctrl + Alt + T 단축키, 우분투 Dash 검색, 또는 Xfce4·LXDE의 시스템 도구(System Tools) 하위 메뉴를 통해 실행할 수 있습니다.
경고: 이 작업은 대상 물리 디스크의 모든 데이터를 지우는 파괴적 명령을 포함합니다. 경우에 따라 원본 VHD/VHDX 파일이 손상될 위험도 있습니다. 어떤 방법을 선택하든 작업 전에 반드시 중요한 데이터를 백업하세요.
방법 1: VBoxManage로 RAW 이미지 변환 후 dd 기록
가장 간단한 방법은 일반적인 VirtualBox 설치 환경을 이용하는 것입니다. 대상 드라이브가 마운트 해제된 상태(예: 외장 하드디스크를 연결만 해두고 마운트하지 않은 상태, 또는 완전히 비어 있는 초기화 상태)임을 확인한 뒤, 아래 명령으로 VHD 파일을 RAW 이미지로 변환합니다. freeBSD.VHDX 부분은 실제 사용 중인 가상 디스크 파일명으로 바꿔 주세요.
VBoxManage clonehd freeBSD.VHDX --format RAW freeBSD.RAW
변환이 끝나면 dd 명령으로 RAW 이미지를 물리 디스크에 기록합니다. /dev/sde는 실제로 기록하려는 블록 디바이스 이름으로 반드시 교체해야 합니다.
sudo dd if=freeBSD.RAW of=/dev/sde
디바이스 이름이 확실하지 않다면 sudo fdisk -l 명령으로 연결된 디스크와 파티션 목록을 먼저 확인하세요. dd는 잘못된 디바이스에 기록하면 그 순간 데이터를 파괴하므로, 이 확인 과정은 절대 생략해서는 안 됩니다.
기록 도중 'no space left on device'(장치에 남은 공간 없음) 오류가 나타날 수 있습니다. 큰 파일을 더 작은 디스크에 쓰려 할 때와 같은 현상인데, 테스트 결과 특별한 문제는 발생하지 않았습니다. 이는 변환 과정에서 추가 제로(zero) 패딩이 붙기 때문으로 보입니다. 이 오류를 제외하면 단 두 단계만으로 가상 디스크를 물리 디스크에 복제할 수 있습니다.
방법 2: QEMU NBD(Network Block Device) 서버 활용
VBoxManage를 사용할 수 없고 QEMU(Quick Emulator)만 있는 환경이라면 NBD 커널 모듈을 활용해야 합니다. 절차가 다소 복잡하지만 순서대로 따라 하면 어렵지 않습니다.
먼저 nbd 모듈을 로드하고, VHD 파일을 읽기 전용 네트워크 블록 디바이스로 연결합니다. ourTest.vhd는 실제 파일명으로 바꾸세요.
sudo modprobe nbd
sudo qemu-nbd -r -c /dev/nbd0 -f vpc ourTest.vhd
설정에 따라 qemu-nbd 실행에 sudo가 필요할 수 있습니다. 여기의 명령을 복사해 붙여넣을 때는 파일명과 디바이스명을 반드시 자신의 환경에 맞게 수정한 뒤 실행하세요. 대부분의 경우 nbd0 디바이스 하나만 다루므로 큰 문제는 없습니다.
연결이 완료되면 특정 파티션을 지정해 디바이스를 열고, GNU ddrescue로 해당 파티션을 물리 디스크의 파티션에 기록합니다. /dev/nbd2와 /dev/sde2는 실제 사용할 디바이스로 교체하세요.
sudo qemu-nbd -P 2 -r -c /dev/nbd2 -f vpc ourTest.vhd
sudo ddrescue -v -f /dev/nbd2 /dev/sde2
참고로 이 예제의 /dev/sde는 실수로 데이터를 지우는 것을 막기 위해 테스트용으로 사용한 SDHC 카드였습니다. 설정에 따라 파티션 번호(P 옵션 값)를 조정해야 할 수도 있습니다. 이런 세부 조정 때문에 QEMU 방식은 VBoxManage 방식만큼 직관적이지는 않습니다.
VHDX 이미지를 사용하는 경우
Hyper-V 사용자라면 VHD가 아닌 VHDX 이미지를 갖고 있을 가능성이 높습니다. 이 경우 포맷 지정만 바꾸면 됩니다.
sudo qemu-nbd -c /dev/nbd0 -f vhdx ourTest.vhdx
VHDX는 Windows Server 2012에서 도입된 포맷으로, 기존 VHD의 2TB 용량 한계를 넘어 더 큰 스토리지를 지원합니다. 이 한계를 피하고자 VHDX로 전환하는 리눅스 사용자도 점점 늘고 있습니다. 파일 크기와 무관하게 위 절차는 동일하게 적용됩니다. GNU ddrescue는 dd와 비슷하게 동작하지만, 손상 위험이 적은 블록부터 우선 복사한다는 차이가 있습니다.
VHDX 이미지를 연결한 뒤에는 같은 방식으로 ddrescue를 실행합니다.
sudo ddrescue -v -f /dev/nbd2 /dev/sde2
모든 종류의 VirtualBox 이미지라면 아래 명령으로 해당 파티션을 일반 디스크처럼 마운트해 내용을 확인할 수도 있습니다.
sudo qemu-nbd -P 2 -r -c /dev/nbd2 -f vpc ourTest.vhd
마운트는 다음 명령으로 수행합니다. 실행 전에 /mnt 또는 /cdrom 디렉터리에 다른 것이 마운트되어 있지 않은지 확인하세요.
sudo mount /dev/nbd2 /mnt
방법 3: 이미지 마운트 해제 및 연결 종료
작업이 끝나면 umount로 이미지를 마운트 해제합니다. 리눅스 커널은 이 디바이스를 일반 볼륨처럼 취급하고 있으므로, 평소와 같은 방식으로 해제하면 됩니다.
sudo umount /mnt
sudo umount /cdrom
마운트 해제만으로는 부족하며, QEMU 시스템에서도 디바이스 연결을 끊어야 합니다. 아래 명령으로 NBD 연결을 분리하세요.
qemu-nbd -d /dev/nbd2
저자 소개

Kevin Arrows (케빈 애로우즈)
케빈 애로우즈는 10년 이상의 업계 경력을 지닌 베테랑 기술 전문가로, Microsoft Certified Technology Specialist(MCTS) 자격증을 보유하고 있습니다. 최신 기술 동향을 꾸준히 학습하는 것을 즐기며, 소프트웨어 개발, 사이버 보안, 클라우드 컴퓨팅 등 폭넓은 분야에서 방대한 양의 기술 글을 집필해 왔습니다. 복잡한 기술 개념을 명확하고 간결하게 설명하는 능력으로 업계 동료들의 인정과 신뢰를 받고 있습니다.