Xen의 프로파일링을 위해 guest의 kernel에 trace point를 넣어서 빌드했다. 수정한 커널을 domU에 설치해야 하는데, 직접 데비안 패키지를 VM에 복사하는 것은 할 줄 몰라서 SCP(secure copy)를 이용하기로 했다. 서버에 linux-image-3.15.8_3.15.8_amd64.deb 파일을 올려두고, VM에서 그 파일을 다운로드받았다.

  VM에는 데비안 7(wheezy)가 설치되어 있었다. 새 커널을 적용해 보았다.

sudo dpkg –i linux-image-3.15.8_3.15.8_amd64.deb

update-grub


  이제 설치가 끝났으니 VM을 halt한 뒤 호스트에서 다시 VM 을 생성하여 새로운 커널을 적용하려고 했다. 그러나 부팅이 되지 않았다.


  원인을 검색해보니 다음과 같다. 데비안 계열은 새로운 커널을 설치할 때 기존의 커널을 지우지 않고 그대로 남겨두어 사용자가 부팅 시 커널을 선택할 수 있게 하는데, XEN의 pygrub은 어떤 커널을 선택할 지 알 수 없어 에러를 내고 멈춘다는 것이다.

  일단 VM의 부팅이 안 되니까, 어떻게든 부팅을 시켜야 해결을 할 수 있다. 임시 방편으로 Dom0의 커널을 빌려서 DomU를 부팅한다.

vim XEN_GUEST0.cfg

기존의 bootloader 부분은 주석 처리


  스크립트에 kernel, ramdisk, extra 추가 (자기 시스템의 설정에 맞게 적절히 고칠 것)

kernel = "/boot/vmlinuz-3.15.8"

ramdisk = "/boot/initrd.img-3.15.8"

extra = "root=/dev/xvda2"


  호스트의 커널을 빌려서 일단 VM 부팅에 성공했다. 이런 꼼수를 알려주신 외국의 능력자에게 감사를 드리며...

  이제 부팅이 되었으니, 옛날 커널을 제거해야 한다. 
  자동 제거를 원하면 apt-get autoremove를 사용하고, 수동 제거를 하려면 직접 검색해서 지워야 한다.

dpkg –l | grep "linux"

  이렇게 설치된 데비안 패키지 중에서 옛날 커널 패키지의 이름을 발견할 수 있다.

dpkg --remove package_name 혹은 dpkg --purge package_name

  이제 제거가 끝났으면, update-grub을 한 뒤 /boot/ 아래를 찬찬히 살펴본다. 오직 하나의 커널만 검색되는지 확인한 뒤, halt 명령으로 VM을 종료한다.


  다시 VM 부팅 설정을 원래대로 복원한다.

vim XEN_GUEST0.cfg

기존의 bootloader 부분 복원 (주석 해제)

임시로 추가했던 kernel, ramdisk, extra를 주석 처리

  이렇게 하면 문제 없이 VM이 부팅되어야 한다. 그러나 여전히 pygrub 에러가 발생한다. 아마 update-grub의 버그인 것 같은데 정확한 원인은 알 수 없다. 어쩌면 apt-get autoremove를 안하고 수동 제거를 해서 발생한 문제일지도 모른다.

  일단 다음과 같이 해결했다.

vim XEN_GUEST0.cfg

bootloader 부분을 주석 해제 (pygrub 사용)

kernel, ramdisk, extra 부분 모두 주석 해제 (호스트 부팅 커널 이용)

  이런 식으로 꼼수를 썼다. 이렇게 하면 호스트 커널의 도움을 받아서 XEN 부팅 스크립트의 오류를 피해가고, 그 뒤에는 pygrub을 사용해서 게스트의 커널을 정상적으로 실행하게 된다. 이렇게 한동안은 잘 돌아갔다. 내가 VM에 파티션을 추가할 때까지...


  요약하면 다음과 같다. fio 실험을 할 때 ftrace가 섞이는 문제가 발생했다. fio 실험을 하면서 동시에 ftrace 결과를 trace.txt에 저장한다고 할 때, ftrace를 파일에 쓰는 것 자체가 ftrace로 기록되었던 것이다. 순수하게 fio에 관련된 trace만을 뽑기 위해서, fio가 실행되는 디스크 파티션과 ftrace 파일이 기록되는 디스크 파티션을 분리해야 했다. 그래서 VM에 새로운 파티션을 추가했는데, 그 이후로는 또 부팅이 되지 않았다. 위의 해결책이 먹히지 않자, 그래도 일단 부팅은 시켜야 하니까, 다시 원점으로 돌아가기로 했다.

vim XEN_GUEST0.cfg

기존의 bootloader 부분은 주석 처리 (pygrub을 사용하지 않기로 결정)

kernel = "/boot/vmlinuz-3.15.8"

ramdisk = "/boot/initrd.img-3.15.8"

extra = "root=/dev/xvda2"

  호스트의 커널을 빌려서 부팅에 성공은 했지만, 이렇게 하면 내가 수정한 커널이 아니라서 실험에 사용할 수 없다. 

  그 순간 깨달았다. 

  게스트 VM의 커널과 ramdisk를 호스트에 복사해두고 부팅할 때마다 이용하면 될 것 같다. 그래서 VM에서 /boot로 이동하여 "/boot/vmlinuz-3.15.8"와 "/boot/initrd.img-3.15.8"를 발견하고는 얘들을 호스트로 가져오기로 했다. 그런데 어떻게? VM에서 호스트로 바로 파일 복사를 할 수 있나? 그냥 아까 하던대로 SCP를 사용하기로 했다. 두 파일을 서버에 올려두고, 호스트에서 SCP로 다운로드 받았다. 그리고 다시 스크립트를 고쳤다.

vim XEN_GUEST0.cfg

기존의 bootloader 부분은 주석 처리 (pygrub을 사용하지 않기로 결정)

kernel = "내가 방금 다운로드 받은 경로"

ramdisk = "내가 방금 다운로드 받은 경로"

extra = "root=/dev/xvda2"

  이제 된다. 이제 domU 부팅도 잘 되고, 내가 수정한 커널도 잘 적용이 되어 있다.



'XEN' 카테고리의 다른 글

domU 강제 종료  (0) 2014.09.19
XEN USB mount  (0) 2014.09.19
DomU partitioning  (0) 2014.09.18

+ Recent posts