কম্পিউটার টিউটোরিয়াল

KVM 마스터하기: 일반적인 이슈 및 트러블슈팅 전문가 가이드

얼마 전, 저는 두 개의 Xen 트러블슈팅 기사들을 드렸습니다, 그것들은 당신이 Xen 기술을 사용하여 당신의 환경을 프로비저닝하려고 할 때 당신이 마주칠 수 있는 더 일반적인 문제들 중 일부를 논의했습니다. 오늘, 우리는 KVM으로 같은 것을 할 것입니다.

개인적으로, 저는 KVM이 Python 구토 장황함과 전반적인 복잡성에 관해서는 훨씬 더 우아하다고 생각하지만, 당신은 여전히 때때로 당신의 삶을 더 어렵게 만들 추한 에러들을 마주칠 수 있습니다. 이 튜토리얼은 당신이 그것들을 우회하는 방법, 가능한 구성과 설정 충돌들을 식별하는 방법, 그리고 다양한 다른 깔끔한 트릭들을 가르칠 것입니다. 저를 따라오세요.

팁 1: 브리지 네트워킹 인터페이스가 나타나지 않음

당신이 br0라고 불리는 커스텀 브리지 장치를 사용하고 싶다고 가정해 봅시다. 그러나, 당신이 당신의 네트워크를 설정하고 당신의 게스트들이 특정 인터페이스를 사용하게 하려고 할 때, 그것은 Virtual Machine Manager의 드롭다운 메뉴에 나타나지 않습니다. 아래 이미지는 정반대를 보여주지만, 당신의 원하는 장치가 사용 가능한 어댑터들의 목록에 없다고 상상해 보세요. 이것은 일어날 수 있고, 저는 이것을 보았습니다, 그래서 저를 믿으세요, 인터넷 시민들.

KVM 마스터하기: 일반적인 이슈 및 트러블슈팅 전문가 가이드

해결책은 매우 간단합니다 - 당신의 도메인을 위한 구성 파일을 수동으로 편집하세요. 기본적으로, KVM은 파일들을 두 위치에 저장합니다, /etc/kvm/vm 또는 /etc/libvirt/qemu, 그래서 당신은 당신의 XML 파일들을 거기서 가장 가능성이 높게 찾을 것입니다. 관련된 것을 열고 <source bridge> 아래에서 브리지 어댑터 세부 사항들을 수동으로 변경하세요. 파일을 닫고, 가상 머신을 시작하고 즐기세요.

<interface type='bridge'>
<source bridge='br0'/>
<mac address='52:54:00:0d:e6:4a'/>
</interface>

팁 2: Biosdevname & 네트워크 없음

Biosdevname은 장치들에 BIOS-주어진 이름들을 할당하려는 유틸리티로, 공통성을 보존하고 하드웨어 관리의 로직을 단순화합니다, 특히 네트워크 장치들에 대해. 만약 당신이 그들 중 많은 것을 가지고 있다면, 독특한 능력이나 기능들과 함께, 당신은 일반 ethX 이름들로 그것들을 식별하는 것이 더 어려울 것을 발견할 것이지만, 만약 그들이 독특한 문자열들을 부여받았다면, 당신은 1Gbps와 10Gbps 어댑터들 등을 쉽게 구별할 수 있을 것입니다. 자연스럽게, 이것은 대부분 엔터프라이즈 시스템들에 유용합니다, 집에서 사람들은 이 딜레마를 거의 가지지 않기 때문입니다.

그러나, biosdevname을 사용하는 것의 부작용은, 만약 그것이 당신의 KVM-생성 가상 머신들 내의 게스트 운영 체제들 내부에서 사용된다면, 당신은 네트워크 없이 끝날 수 있습니다, 왜냐하면 가상화된 장치들이 거의 일치하지 않는 물리적 이름들을 얻을 것이기 때문입니다.

이 문제를 우회하는 여러 방법들이 있습니다. 하나, 유틸리티의 일부 버전들은 그들이 가상 환경 내부에서 호출되고 있음을 감지하고 어떤 변경도 만들지 않고 종료할 수 있습니다. 또 다른 하나는 GRUB 메뉴에서 커널 인수를 전달하는 것입니다; biosdevname=0은 유틸리티가 실행되지 않게 비활성화할 것입니다.

세 번째 옵션은 네트워크 카드들에 이름들을 할당하는 데 사용되는 udev 규칙들을 해킹하는 것입니다. 여기 매우 기초적인 예가 있습니다; 이것은 단일 네트워크 어댑터를 가진 기계를 위해 설계되었으므로, 당신은 여러 카드들을 위해 더 동적인 로직이 필요할 것입니다. 또는, 주석 텍스트가 말하는 것처럼, 당신은 각 규칙을 위해 별도의 단일 라인을 생성해야 할 것입니다.

KVM 마스터하기: 일반적인 이슈 및 트러블슈팅 전문가 가이드

당신은 고전적인 할당을 얻기 위해 수동 변경을 할 수 있습니다:

vi /etc/udev/rules.d/70-persistent-net.rules

NAME 문자열을 "eth_biosname"에서 "ethX" 또는 당신이 필요로 하는 어떤 것으로 대체하세요:

# PCI device ...
SUBSYSTEM=="net", ACTION=="add", ATTR(type)=="1",
KERNEL=="eth*", NAME="eth_biosname"

# PCI device ...
SUBSYSTEM=="net", ACTION=="add", ATTR(type)=="1",
KERNEL=="eth*", NAME="eth0"

당신은 당신의 가상 머신들에서 사용하는 가상 하드웨어에 따라 다른 규칙들을 얻을 것입니다. 예를 들어, 당신은 Realtek, e1000 또는 virtio 가상 하드웨어를 선택할 수 있습니다, 결과적으로 다른 문자열들. 주의를 기울이고 당신의 특정 환경에 해결책을 맞추도록 하세요.

팁 3: 도메인이 이미 존재함

당신이 새로운 도메인을 정의하려고 시도하고 그것이 이미 존재하는 경우, 당신은 그것의 구성 파일이나 선언을 찾는 데 어려움을 겪고 있습니다. virsh list에는 없고, virt-manager는 어디에도 그것을 보여주지 않습니다. 그래서 당신은 무엇을 합니까?

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

당신은 구성 파일을 찾아서 삭제해야 할 것입니다. 그리고 libvirtd 서비스를 재시작하세요.

updatedb
locate machine.xml
rm <full path to machine.xml>
/etc/init.d/libvirtd restart

팁 4: 내부 에러 cgroup을 찾을 수 없음

이 문제는 위의 예처럼 libvirtd 재시작 후에 나타날 수 있습니다, 또는 완전히 무관할 수 있습니다. 전체 에러 메시지는 다음과 같을 수 있습니다:

virsh create machine.xml
error: Failed to create domain from machine.xml
error: internal error Unable to find cgroup for machine

이 버그의 이유는 Bugzilla 리포트에 명시된 대로 systemd와 관련될 수 있지만, 그것은 systemd를 사용하지 않는 당신의 깨끗한 기계들에서도 일어날 수 있습니다. 대부분의 경우, 그것은 cgroups와 libvirtd 사이의 매우 섬세하지 않은 경주입니다, libvirtd 서비스가 cgroups보다 먼저 올라오게 하여, cgroups 중 하나가 삭제되었거나 처음부터 존재하지 않게 만듭니다.

당신은 libvirtd 구성을 편집함으로써 이 문제를 해결할 수 있습니다, /etc/libvirt/qemu.conf. 이 파일 내부에서, 당신은 cgroups_controllers 지시어를 편집해야 합니다 그래서 그것은 어떤 cgroups도 나열하지 않게, 이 경우, libvirtd가 그들 없이 실행될 수 있게.

cgroups_controllers = [ ]

이 후, 당신은 libvirtd를 다시 재시작해야 할 것입니다. 대안적으로, 당신은 필요한 cgroups를 수동으로 생성하고 libvirtd 프로세스를 관련 서브시스템에 할당해야 할 것입니다.

팁 5: 가상 머신이 halt/reboot 시 VMM에서 사라짐

이것은 사실 매우 간단한 이슈일 수 있습니다. 당신이 가상 머신을 중지하거나 재부팅한 후, 가상 머신 콘솔이 닫힙니다. 당신의 구성들은 제자리에 있지만, 이것은 주요 불편입니다, 왜냐하면 당신은 머신 관리 주기에 개입해야 하기 때문입니다.

당신은 당신의 가상 머신을 위한 관련 XML 파일에서 on_reboot 절을 찾아보고 액션이 destroy 대신 restart로 설정되어 있는지 확인해야 합니다. 그게 다입니다.

<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>

팁 6: 재부팅 액션 없음; 함수가 지원되지 않음

다시, 이전 팁과 매우 관련이 있습니다. 만약 당신이 restart 대신 reboot를 지정하면, 당신은 이것이 KVM이 실행할 수 없는 유효하지 않은 명령임을 배울 것입니다. 그러나, 당신은 꽤 다작의 에러를 볼 가능성이 높습니다:

libvirtError: this function is not supported by the hypervisor: virDomainReboot

만약 당신이 restart를 사용하면, 모든 것이 잘 될 것입니다.

팁 7: 설치 후 부트로더 에러

때때로, 당신은 GRUB 에러를 볼 수 있습니다, 가장 가능성이 높은 번호 15, 외부 미디어 소스로부터 설치 후 첫 재부팅에서. 이것은 당신이 CD/DVD 이미지를 가상 머신에 연결된 채로 두고 당신의 XML 파일에서 첫 부팅 장치로 선택한 경우에 일어날 수 있습니다. 이 문제는 몇몇 리눅스 배포판들에 영향을 미치는 이 VirtualBox 버그와 유사합니다. 예를 들어:

root (hd0,1)
Filesystem type is ext2fs, partition type 0x83
kernel /boot/vmlinuz

Error 15: File not found

Press any key to continue...

당신은 ISO 이미지를 언마운트하고 게스트를 재부팅함으로써 해결할 수 있습니다. 이 번에는, 그것은 잘 작동해야 합니다. 당신이 하드 디스크를 첫 부팅 가능 장치로 설정하면 이 이슈가 나타나지 않을 것임을 주목하세요, 왜냐하면 KVM이 디스크에서 유효한 파티션 테이블을 찾을 수 없다면 자동으로 두 번째 사용 가능한 소스, 가장 가능성이 높은 PXE 또는 CD/DVD로 건너뛸 것이기 때문입니다, 만약 당신이 지금 설치만 한다면 그것이 그래야 할 경우입니다.

그리고 저는 오늘 우리는 여기서 끝났다고 추측합니다.

추가 자료

당신은 몇 가지 더 많은 KVM 기사들에 관심이 있을 수 있습니다:

KVM 스토리지와 네트워크 가이드들, 플러스 브리지드 네트워킹

KVM + Virtualbox 나란히 사용 howto

KVM 클로닝 가이드

결론

첫 트러블슈팅 가이드를 위한 반 다즌 팁들, 나쁘지 않다고 생각합니다. 이 튜토리얼은 브리지드 네트워킹 설정, biosdevname 우회, cgroups + libvirtd 문제들, virt-manager에 의해 자동 생성된 중복 도메인들 등록 해제, 게스트 운영 체제 재시작 문제들 해결에 초점을 맞춥니다.

대부분의 작업은 구성 파일들을 편집하고 서비스들을 재시작함으로써 수행됩니다. 우리는 GUI에 의존하지 않습니다, 왜냐하면 명령줄로 번역될 수 있는 어떤 액션도 그때 더 쉽고 완전히 자동화된 관리를 위해 스크립트화될 수 있기 때문입니다. 어쨌든, 당신이 그것을 좋아했기를 바랍니다; 만약 당신이 속편을 위한 아이디어들이 있다면, 저에게 핑하세요.

치어스.

  1. Prayaya V3: Windows-এ সুরক্ষিত, পোর্টেবল ভার্চুয়াল OS

  2. VMLite: الجيل القادم من منصات المحاكاة الافتراضية خفيفة الوزن

  3. ভিএমওয়্যার কনভার্টার (VMware Converter) দিয়ে সমস্যারহিত ভিএম রূপান্তর

  4. উইন্ডোজ ১১ অডিও সমস্যা সমাধান: ৭টি প্রমাণিত উপায়