.vdi 디스크를 사용하여 VirtualBox에서 Ubuntu 12.04 32비트 가상 머신을 만들었습니다. 그런 다음 qemu-nbd를 사용하여 디스크를 마운트하고 모든 파일을 디스크에서 옮긴 다음 다시 디스크로 옮깁니다. 가상 머신을 다시 시작하면 다른 결과가 나타납니다.
- 우분투는 오류가 있다고 알려주며 수정/건너뛰기/무시/수동으로 수정할 것인지 묻습니다. 이 문제를 해결하면 재부팅되어 tty로 부팅됩니다. 무시하면 tty로 부팅됩니다. 아직 건너뛰기/수동 수정을 시도하지 않았습니다.
- 빈 보라색 화면으로 부팅됩니다. 꼭 매달리게 하다. 이후 재설정 시 깜박이는 텍스트 커서로 부팅됩니다.
- Ubuntu 시작 화면으로 부팅하면 정지됩니다. 재설정 후 이 목록의 항목 1을 참조하십시오.
내 질문은: 왜 이런 일이 일어나는 걸까요? Grub에서 /boot/를 참조하는 디스크 하드웨어 주소가 있습니까? 이 문제 없이 VHD의 파일을 삭제하고 교체할 수 있는 방법이 있습니까?
이 결과를 재현하는 방법(희망합니다):
- 8GB .vdi 가상 디스크(나머지 질문에서는 ub.vdi라고 함)를 사용하여 VirtualBox에서 가상 머신을 만듭니다.
- Ubuntu 12.04.3 32비트 설치 ISO를 사용하여 부팅
- "우분투를 사용해 보세요".
- MSDOS 파티션 테이블과 두 개의 기본 파티션(하나는 2048MiB 스왑 공간이 있고 나머지 하나는 ext4 파티션)을 설정합니다. (gparted 사용).
- ext4 파티션에 Ubuntu 설치
- 가상 머신 종료
- VM 디렉터리로 이동하여 다음 스크립트를 실행합니다.
#!bin/bash
# load the nbd module
sudo modprobe nbd
# make a folder for our virtual disk files
mkdir os_files
# load the virtual disk as a device (nbd0)
sudo qemu-nbd -c /dev/nbd0 ub.vdi
sleep 1
# create a directory and mount the os partition to it
MNT_DIR=$(mktemp -d)
sudo mount /dev/nbd0p2 $MNT_DIR
# move the os files off, then back onto the virtual disk
find $MNT_DIR -maxdepth 1 -mindepth 1 | xargs -I{} sudo mv {} os_files/
find os_files/ -maxdepth 1 -mindepth 1 | xargs -I{} sudo mv {} $MNT_DIR
# clean up
sudo umount $MNT_DIR
sudo qemu-nbd -d /dev/nbd0
rm os_files/ $MNT_DIR -r
unset MNT_DIR
왜 이런 짓을하는?
계약 요구 사항의 일부로 버전 제어에 가상 디스크를 저장해야 합니다. 버전 제어에 거대한 바이너리 blob(가상 디스크)이 있다는 것은 주로 복제(git)/체크아웃(svn)의 경우뿐만 아니라 diff의 경우에도 고통스러운 일입니다. 여러 파일로 분할하는 것을 고려했는데, 위의 (5)에서 추출한 OS/데이터를 조작할 수 있어야 합니다. 내 VCS 저장소에는 전체 VM을 구축하는 데 필요한 모든 정보가 여전히 필요합니다.
또한보십시오:https://superuser.com/questions/641971/manual-clone-recreate-virtual-disk. 다시 게시하는 것이 무례하거나, 배은망덕하거나, 관용적이거나, 무례한 것처럼 보인다면 사과드립니다. SU에서 받은 답변은 유용했지만 실제로 문제를 해결하기 위한 전문 지식이 부족했습니다. 여기서 제가 묻는 질문은 링크된 질문보다 좀 더 구체적이지만 문제를 완전히 우회할 수 있는 아이디어는 매우 환영합니다.
답변1
부트로더는 특정 위치에서 특정 파일을 찾아야 합니다. Ubuntu는 Grub을 기본 부트 로더로 사용합니다. Grub에는 Linux 커널을 로드하기 위한 파일 시스템 드라이버가 포함되어 있지만 Grub은 해당 파일 시스템 드라이버를 찾아야 합니다. 또한,
빈 디스크를 만들고 파티션을 나누어 가상 머신을 처음부터 다시 만들려고 하면 상황은 더욱 악화됩니다. 디스크에는 부트로더가 포함되지 않습니다.
추가 복구 단계로 부트로더를 다시 설치해야 합니다. 다음 명령이 트릭을 수행해야 한다고 생각합니다(Grub에 필요한 장치 드라이버가 포함되도록 하려면 몇 가지 추가 옵션이 필요할 수 있습니다).
/usr/sbin/grub-install --root-directory="$MNT_DIR" /dev/nbd
그리고 반드시 /boot/grub/device.map
포함하세요
(hd0) /dev/nbd
device.map
가상 머신에서 실행 중인 경우에는 작동하지 않습니다 . grub-install
이것이 중요한 경우 device.map
저장 및 복원 호출을 래핑하거나 최종적으로 실행되는 하위 수준 명령을 수동으로 호출합니다 grub-install
.grub-install
또 다른 접근 방식은 부트로더만 포함된 작은 부팅 디스크로 VM을 설정하는 것입니다. 이는 항상 처음부터 빌드해도 괜찮습니다. 또는 부트로더가 변경될 때마다 빌드 복사본을 캐시할 수 있습니다. ) 약간의).