Xen에서 가상 머신(게스트, domU)을 운영할 때 일반적으로는 virt-manager나 virt-viewer를 통해 콘솔을 확인하게 됩니다. 하지만 실제로 이 콘솔 버퍼는 상호작용이 불가능한 단순한 '애니메이션 이미지'에 불과하며, 부팅 후 그래픽 인터페이스로 진입하기 전까지는 아무런 조작도 할 수 없습니다.
그렇다면 콘솔 출력을 항상 확인하고 싶다면 어떻게 해야 할까요? 콘솔 출력을 호스트로 리디렉션하여 파싱 가능한 텍스트 형태로 변환할 수 있을까요? 답은 '예'입니다. 다만 간단하지는 않습니다. 이 글에서는 반가상화(Paravirtualized) 게스트와 완전가상화(Fully Virtualized) 게스트 두 경우 모두에 대해 이를 구현하는 방법을 살펴보겠습니다.
반가상화(PV) 게스트
기본적으로 반가상화 게스트의 콘솔은 별도의 설정 없이도 동작해야 합니다. 하지만 현실은 그리 녹록지 않아서, 약간의 수정과 시행착오가 필요할 수 있습니다. 몇 가지 대안적인 해결 방법을 소개합니다.
1. 구성 파일 편집
가상 머신 구성 파일에 다음과 같은 옵션을 추가해 보세요:
extra="console=hvc0 xencons=tty"
hvc0 대신 xvc0을 지정할 수도 있으며, 두 개의 extra 옵션 중 하나씩만 개별적으로 적용해 볼 수도 있습니다. 여러 조합으로 변경하고 테스트하면서 자신의 환경에 맞는 최적의 설정을 찾아야 할 수 있습니다.
2. 게스트의 inittab 편집
새로운 콘솔을 게스트에 등록해야 합니다. 이는 /etc/inittab 파일을 편집하여 다음과 같이 추가하는 방식으로 수행합니다:
x0:12345:respawn:/sbin/agetty -L 9600 xvc0 xterm
콘솔 이름은 가상 머신 구성 파일에 지정한 값에 맞게 조정하세요. 또한 /etc/securetty 파일에 새 콘솔(x0)을 추가해야 할 수도 있습니다. 변경 전에는 반드시 백업을 생성하세요. 필요에 따라 커널 명령줄에 extra 파라미터를 전달하거나 GRUB 메뉴를 수정해야 하는 경우도 있습니다(뒤에서 추가 예시를 보여드립니다).
이 방법이 동작할 수도 있고, 그렇지 않을 수도 있습니다. 만약 /var/log/messages에 다음과 같은 오류가 반복된다면:
init: Id "x0" respawning too fast: disabled for 5 minutes
init: Id "x0" respawning too fast: disabled for 5 minutes
init: Id "x0" respawning too fast: disabled for 5 minutes
init: Id "x0" respawning too fast: disabled for 5 minutes
게스트 OS의 udev가 해당 장치를 생성하지 못하고 있는 것일 가능성이 높습니다. 이 경우 /dev 아래에 장치 노드를 직접 생성해 주어야 합니다. 이상적인 해결책은 아니지만, 다른 모든 방법이 실패했을 때 콘솔을 확보하는 데 도움이 될 수 있습니다.
마지막으로 다음 명령어를 시도해 볼 수 있습니다:
virsh console <domain id>
도메인 ID는 xm list 명령으로 확인할 수 있습니다.
완전가상화(HVM) 게스트
매뉴얼 페이지에 따르면 xm console은 완전가상화 게스트에는 지원되지 않지만, 우회 방법을 통해 문제를 해결할 수 있습니다. 크게 두 가지 작업이 필요합니다.
먼저 호스트(dom0) 쪽에서 게스트의 구성 파일에 다음 지시문을 추가합니다:
serial="pty"
그다음 게스트 내부에서 /boot/grub/menu.lst 또는 /boot/grub/grub.conf 파일을 열어 다음 줄을 첫 번째 커널 엔트리 위쪽, 즉 default와 timeout 지시문 바로 아래 정도에 추가합니다:
serial --unit=0 --speed=9600
terminal --timeout=5 serial console
이후 해당 GRUB 엔트리의 kernel 라인에 다음 옵션을 추가합니다:
console=ttyS0
게스트를 재부팅하면 콘솔이 활성화됩니다. 확인하려면 dom0에서 게스트에 콘솔을 연결해야 합니다:
#xm console <domain name>
명령 실행 후 프롬프트가 사라지고 터미널이 멈춘 것처럼 보일 수 있습니다. 이 상태에서 게스트를 재부팅하면 종료/시작 메시지가 화면에 출력되는 것을 확인할 수 있습니다. 종료하려면 Ctrl + ]를 누르세요. 부팅·종료 과정과 매직 키(Magic Keys)로 유발한 커널 크래시 예시입니다:
#xm console test1
INIT: Switching to runlevel: 6
INIT: Sending processes the TERM signal
INIT: Sending processes the KILL signal
Boot logging started on /dev/ttyS0(/dev/console) at Thu Dec 1 2011
Master Resource Control: previous runlevel: 3, switching to runlevel: 6
Shutting down service at daemon done
Shutting down auditd done
Shutting down automount (force) done
주의할 점: 콘솔이 리디렉션되었기 때문에 더 이상 게스트 화면에는 콘솔 메시지가 표시되지 않습니다. 게스트 내부에서도 콘솔 메시지를 보려면 GRUB 메뉴에 console=tty1을 함께 추가해야 합니다.
추가 참고 자료
다음 자료들도 함께 참고하시길 권장합니다:
- Xen 트러블슈팅 기본편
- Xen 트러블슈팅 심화편
- Xen 환경에서 SLES11 설치하기
- Xen 게스트 콘솔이 부팅 시 멈출 때의 해결법
결론
간단한 주제는 아니지만 분명 유용한 내용이었습니다. 최소한 Xen 명령줄을 다루는 방법, 다양한 명령어 호출과 파라미터 확인, 부팅 메뉴를 포함한 시스템 구성 파일 편집 등에 대해 조금 더 배우셨기를 바랍니다. 무엇보다 반가상화와 완전가상화 게스트 양쪽 모두에 대한 여러 해결책과 우회 방법을 소개했습니다. Xen 콘솔 관련 고민에 도움이 되기를 바랍니다.
오늘은 여기까지입니다. 즐거운 하루 되세요!