얼마 전, 저는 두 개의 Xen 트러블슈팅 기사들을 드렸습니다, 그것들은 당신이 Xen 기술을 사용하여 당신의 환경을 프로비저닝하려고 할 때 당신이 마주칠 수 있는 더 일반적인 문제들 중 일부를 논의했습니다. 오늘, 우리는 KVM으로 같은 것을 할 것입니다. p>
개인적으로, 저는 KVM이 Python 구토 장황함과 전반적인 복잡성에 관해서는 훨씬 더 우아하다고 생각하지만, 당신은 여전히 때때로 당신의 삶을 더 어렵게 만들 추한 에러들을 마주칠 수 있습니다. 이 튜토리얼은 당신이 그것들을 우회하는 방법, 가능한 구성과 설정 충돌들을 식별하는 방법, 그리고 다양한 다른 깔끔한 트릭들을 가르칠 것입니다. 저를 따라오세요. p>
팁 1: 브리지 네트워킹 인터페이스가 나타나지 않음
당신이 br0라고 불리는 커스텀 브리지 장치를 사용하고 싶다고 가정해 봅시다. 그러나, 당신이 당신의 네트워크를 설정하고 당신의 게스트들이 특정 인터페이스를 사용하게 하려고 할 때, 그것은 Virtual Machine Manager의 드롭다운 메뉴에 나타나지 않습니다. 아래 이미지는 정반대를 보여주지만, 당신의 원하는 장치가 사용 가능한 어댑터들의 목록에 없다고 상상해 보세요. 이것은 일어날 수 있고, 저는 이것을 보았습니다, 그래서 저를 믿으세요, 인터넷 시민들. p>
p>
해결책은 매우 간단합니다 - 당신의 도메인을 위한 구성 파일을 수동으로 편집하세요. 기본적으로, KVM은 파일들을 두 위치에 저장합니다, /etc/kvm/vm 또는 /etc/libvirt/qemu, 그래서 당신은 당신의 XML 파일들을 거기서 가장 가능성이 높게 찾을 것입니다. 관련된 것을 열고 <source bridge> 아래에서 브리지 어댑터 세부 사항들을 수동으로 변경하세요. 파일을 닫고, 가상 머신을 시작하고 즐기세요. p>
<interface type='bridge'>
<source bridge='br0'/>
<mac address='52:54:00:0d:e6:4a'/>
</interface> p>
팁 2: Biosdevname & 네트워크 없음
Biosdevname은 장치들에 BIOS-주어진 이름들을 할당하려는 유틸리티로, 공통성을 보존하고 하드웨어 관리의 로직을 단순화합니다, 특히 네트워크 장치들에 대해. 만약 당신이 그들 중 많은 것을 가지고 있다면, 독특한 능력이나 기능들과 함께, 당신은 일반 ethX 이름들로 그것들을 식별하는 것이 더 어려울 것을 발견할 것이지만, 만약 그들이 독특한 문자열들을 부여받았다면, 당신은 1Gbps와 10Gbps 어댑터들 등을 쉽게 구별할 수 있을 것입니다. 자연스럽게, 이것은 대부분 엔터프라이즈 시스템들에 유용합니다, 집에서 사람들은 이 딜레마를 거의 가지지 않기 때문입니다. p>
그러나, biosdevname을 사용하는 것의 부작용은, 만약 그것이 당신의 KVM-생성 가상 머신들 내의 게스트 운영 체제들 내부에서 사용된다면, 당신은 네트워크 없이 끝날 수 있습니다, 왜냐하면 가상화된 장치들이 거의 일치하지 않는 물리적 이름들을 얻을 것이기 때문입니다. p>
이 문제를 우회하는 여러 방법들이 있습니다. 하나, 유틸리티의 일부 버전들은 그들이 가상 환경 내부에서 호출되고 있음을 감지하고 어떤 변경도 만들지 않고 종료할 수 있습니다. 또 다른 하나는 GRUB 메뉴에서 커널 인수를 전달하는 것입니다; biosdevname=0은 유틸리티가 실행되지 않게 비활성화할 것입니다. p>
세 번째 옵션은 네트워크 카드들에 이름들을 할당하는 데 사용되는 udev 규칙들을 해킹하는 것입니다. 여기 매우 기초적인 예가 있습니다; 이것은 단일 네트워크 어댑터를 가진 기계를 위해 설계되었으므로, 당신은 여러 카드들을 위해 더 동적인 로직이 필요할 것입니다. 또는, 주석 텍스트가 말하는 것처럼, 당신은 각 규칙을 위해 별도의 단일 라인을 생성해야 할 것입니다. p>
p>
당신은 고전적인 할당을 얻기 위해 수동 변경을 할 수 있습니다: p>
vi /etc/udev/rules.d/70-persistent-net.rules p>
NAME 문자열을 "eth_biosname"에서 "ethX" 또는 당신이 필요로 하는 어떤 것으로 대체하세요: p>
# PCI device ...
SUBSYSTEM=="net", ACTION=="add", ATTR(type)=="1",
KERNEL=="eth*", NAME="eth_biosname" p>
# PCI device ...
SUBSYSTEM=="net", ACTION=="add", ATTR(type)=="1",
KERNEL=="eth*", NAME="eth0" p>
당신은 당신의 가상 머신들에서 사용하는 가상 하드웨어에 따라 다른 규칙들을 얻을 것입니다. 예를 들어, 당신은 Realtek, e1000 또는 virtio 가상 하드웨어를 선택할 수 있습니다, 결과적으로 다른 문자열들. 주의를 기울이고 당신의 특정 환경에 해결책을 맞추도록 하세요. p>
팁 3: 도메인이 이미 존재함
당신이 새로운 도메인을 정의하려고 시도하고 그것이 이미 존재하는 경우, 당신은 그것의 구성 파일이나 선언을 찾는 데 어려움을 겪고 있습니다. virsh list에는 없고, virt-manager는 어디에도 그것을 보여주지 않습니다. 그래서 당신은 무엇을 합니까? p>
virsh define machine.xml
error: Failed to define domain from machine.xml
error: operation failed: domain 'machine' already exists
with uuid 883ab02f-1a67-7430-ef9a-2b59af52210e7 p>
당신은 구성 파일을 찾아서 삭제해야 할 것입니다. 그리고 libvirtd 서비스를 재시작하세요. p>
updatedb
locate machine.xml
rm <full path to machine.xml>
/etc/init.d/libvirtd restart p>
팁 4: 내부 에러 cgroup을 찾을 수 없음
이 문제는 위의 예처럼 libvirtd 재시작 후에 나타날 수 있습니다, 또는 완전히 무관할 수 있습니다. 전체 에러 메시지는 다음과 같을 수 있습니다: p>
virsh create machine.xml
error: Failed to create domain from machine.xml
error: internal error Unable to find cgroup for machine p>
이 버그의 이유는 Bugzilla 리포트에 명시된 대로 systemd와 관련될 수 있지만, 그것은 systemd를 사용하지 않는 당신의 깨끗한 기계들에서도 일어날 수 있습니다. 대부분의 경우, 그것은 cgroups와 libvirtd 사이의 매우 섬세하지 않은 경주입니다, libvirtd 서비스가 cgroups보다 먼저 올라오게 하여, cgroups 중 하나가 삭제되었거나 처음부터 존재하지 않게 만듭니다. p>
당신은 libvirtd 구성을 편집함으로써 이 문제를 해결할 수 있습니다, /etc/libvirt/qemu.conf. 이 파일 내부에서, 당신은 cgroups_controllers 지시어를 편집해야 합니다 그래서 그것은 어떤 cgroups도 나열하지 않게, 이 경우, libvirtd가 그들 없이 실행될 수 있게. p>
cgroups_controllers = [ ] p>
이 후, 당신은 libvirtd를 다시 재시작해야 할 것입니다. 대안적으로, 당신은 필요한 cgroups를 수동으로 생성하고 libvirtd 프로세스를 관련 서브시스템에 할당해야 할 것입니다. p>
팁 5: 가상 머신이 halt/reboot 시 VMM에서 사라짐
이것은 사실 매우 간단한 이슈일 수 있습니다. 당신이 가상 머신을 중지하거나 재부팅한 후, 가상 머신 콘솔이 닫힙니다. 당신의 구성들은 제자리에 있지만, 이것은 주요 불편입니다, 왜냐하면 당신은 머신 관리 주기에 개입해야 하기 때문입니다. p>
당신은 당신의 가상 머신을 위한 관련 XML 파일에서 on_reboot 절을 찾아보고 액션이 destroy 대신 restart로 설정되어 있는지 확인해야 합니다. 그게 다입니다. p>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash> p>
팁 6: 재부팅 액션 없음; 함수가 지원되지 않음
다시, 이전 팁과 매우 관련이 있습니다. 만약 당신이 restart 대신 reboot를 지정하면, 당신은 이것이 KVM이 실행할 수 없는 유효하지 않은 명령임을 배울 것입니다. 그러나, 당신은 꽤 다작의 에러를 볼 가능성이 높습니다: p>
libvirtError: this function is not supported by the hypervisor: virDomainReboot p>
만약 당신이 restart를 사용하면, 모든 것이 잘 될 것입니다. p>
팁 7: 설치 후 부트로더 에러
때때로, 당신은 GRUB 에러를 볼 수 있습니다, 가장 가능성이 높은 번호 15, 외부 미디어 소스로부터 설치 후 첫 재부팅에서. 이것은 당신이 CD/DVD 이미지를 가상 머신에 연결된 채로 두고 당신의 XML 파일에서 첫 부팅 장치로 선택한 경우에 일어날 수 있습니다. 이 문제는 몇몇 리눅스 배포판들에 영향을 미치는 이 VirtualBox 버그와 유사합니다. 예를 들어: p>
root (hd0,1)
Filesystem type is ext2fs, partition type 0x83
kernel /boot/vmlinuz
Error 15: File not found
Press any key to continue... p>
당신은 ISO 이미지를 언마운트하고 게스트를 재부팅함으로써 해결할 수 있습니다. 이 번에는, 그것은 잘 작동해야 합니다. 당신이 하드 디스크를 첫 부팅 가능 장치로 설정하면 이 이슈가 나타나지 않을 것임을 주목하세요, 왜냐하면 KVM이 디스크에서 유효한 파티션 테이블을 찾을 수 없다면 자동으로 두 번째 사용 가능한 소스, 가장 가능성이 높은 PXE 또는 CD/DVD로 건너뛸 것이기 때문입니다, 만약 당신이 지금 설치만 한다면 그것이 그래야 할 경우입니다. p>
그리고 저는 오늘 우리는 여기서 끝났다고 추측합니다. p>
추가 자료
당신은 몇 가지 더 많은 KVM 기사들에 관심이 있을 수 있습니다: p>
KVM 스토리지와 네트워크 가이드들, 플러스 브리지드 네트워킹 p>
KVM + Virtualbox 나란히 사용 howto p>
KVM 클로닝 가이드 p>
결론
첫 트러블슈팅 가이드를 위한 반 다즌 팁들, 나쁘지 않다고 생각합니다. 이 튜토리얼은 브리지드 네트워킹 설정, biosdevname 우회, cgroups + libvirtd 문제들, virt-manager에 의해 자동 생성된 중복 도메인들 등록 해제, 게스트 운영 체제 재시작 문제들 해결에 초점을 맞춥니다. p>
대부분의 작업은 구성 파일들을 편집하고 서비스들을 재시작함으로써 수행됩니다. 우리는 GUI에 의존하지 않습니다, 왜냐하면 명령줄로 번역될 수 있는 어떤 액션도 그때 더 쉽고 완전히 자동화된 관리를 위해 스크립트화될 수 있기 때문입니다. 어쨌든, 당신이 그것을 좋아했기를 바랍니다; 만약 당신이 속편을 위한 아이디어들이 있다면, 저에게 핑하세요. p>
치어스. p>