모든 파일을 껐다가 VM 드라이브로 다시 옮긴 후 제대로 부팅할 수 없습니다.

모든 파일을 껐다가 VM 드라이브로 다시 옮긴 후 제대로 부팅할 수 없습니다.

.vdi 디스크를 사용하여 VirtualBox에서 Ubuntu 12.04 32비트 VM을 만들었습니다. 그런 다음 qemu-nbd를 사용하여 이 디스크를 마운트하고 모든 파일을 다른 곳으로 옮깁니다. 그런 다음 다시 시작하세요. VM을 다시 부팅하면 다양한 결과가 나타납니다.

  1. Ubuntu는 오류가 발생했다고 알려주며 수정/건너뛰기/무시/수동 수정을 원하는지 묻습니다. 수정하면 다시 시작되고 tty로 부팅됩니다. 무시하면 tty로 부팅됩니다. 아직 건너뛰기/수동 수정을 시도하지 않았습니다.
  2. 빈 보라색 화면으로 부팅합니다. 꼭 매달리게 하다. 이후 재설정 시 깜박이는 텍스트 커서로 부팅됩니다.
  3. Ubuntu 시작 화면으로 부팅하고 정지합니다. 재설정 시 이 목록의 1번을 참조하세요.

내 질문은: 왜 이런 일이 발생합니까? Grub에 /boot/를 참조하는 디스크 하드웨어 주소가 있습니까? 이 문제 없이 VHD의 파일을 제거하고 교체할 수 있는 방법이 있습니까?

이 결과를 재현하는 방법(희망합니다):

  1. 8GB .vdi 가상 디스크(나머지 질문의 목적을 위해 ub.vdi라고 함)를 사용하여 VirtualBox에서 VM을 만듭니다.
  2. Ubuntu 12.04.3 32비트 설치 ISO로 부팅
  3. "우분투를 사용해 보세요".
  4. MSDOS 파티션 테이블과 두 개의 기본 파티션, 2048MiB 스왑 공간, 나머지는 ext4 파티션을 설정합니다. (gparted를 사용함).
  5. ext4 파티션에 Ubuntu 설치
  6. VM 종료
  7. 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은 해당 파일 시스템 드라이버를 찾아야 합니다. 더욱이,

빈 디스크를 만들고 파티션을 나누어 VM을 처음부터 다시 만들려고 하면 상황은 더욱 악화됩니다. 디스크에 부트로더가 포함되지 않습니다.

추가 복원 단계로 부트로더를 다시 설치해야 합니다. 나는 다음 명령이 이를 수행해야 한다고 생각합니다(Grub에 필요한 장치 드라이버가 포함되어 있는지 확인하기 위해 몇 가지 다른 옵션이 필요할 수 있습니다):

/usr/sbin/grub-install --root-directory="$MNT_DIR" /dev/nbd

/boot/grub/device.map그리고 그 내용이 포함되어 있는지 확인하세요

(hd0) /dev/nbd

VM에서 device.map실행하는 경우에는 작동하지 않습니다 . grub-install이것이 중요한 경우 호출을 device.map중심으로 저장 및 복원하거나 최종적으로 실행되는 grub-install하위 수준 명령을 수동으로 호출하십시오 grub-install.

대안적인 접근 방식은 부트로더만 포함된 작은 부팅 디스크로 VM을 설정하는 것입니다. 이렇게 하면 항상 처음부터 빌드해도 괜찮습니다. 또는 부트로더가 변경될 때마다 빌드된 복사본을 캐시할 수 있습니다. 드물게).

관련 정보