libvirt를 사용하여 KVM/qemu에서 여러 가상 머신을 실행했는데 네트워크가 대부분 잘 작동합니다.
이제 가상 머신이 루트가 아닌 사용자로 실행되면 네트워크 작동이 중지됩니다. libvirt 및 유사한 문서 페이지에서 유용한 정보를 찾았습니다. 대부분의 사람들은 가상 머신을 시스템 사용자로 실행하고 싶다고 생각하는 것 같지만 그렇지 않습니다.
그래서:루트가 아닌 사용자로서 네트워킹(예: 게스트에서 웹 검색)을 사용하여 가상 머신을 실행하기 위한 전제 조건은 정확히 무엇입니까?
나는 다음과 같은 위치에 있습니다 myvm.xml
:
94 <interface type='user'>
95 <mac address='52:54:00:82:f1:27'/>
96 <model type='virtio'/>
97 <link state='up'/>
98 <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
99 </interface>
이 인터페이스는 게스트 내부에 표시되며 DHCP 클라이언트를 활성화하면 주소 10.0.2.5가 제공됩니다. 기본 경로는 10.0.2.2이며 네트워크 내부에서 ping할 수 있습니다. 이 범위를 벗어나는 것은 모두 실패합니다.
내 호스트에는 브리지(또는 libvirtd용 항목)가 없지만 user-libvirtd에서 사용자 모드 NAT를 수행할 필요는 없습니다. 그렇죠? 기술적으로 네트워크 액세스는 user-libvirtd에서 제공됩니까?
kvm
libvirtd를 실행하는 사용자는 및 그룹에 있습니다 libvirt
. 무엇을 위해 어느 것이 필요합니까? 후자는 가상 머신을 실행하는 데 필요하지 않으며 내 문제에 영향을 미치지 않습니다.
libvirtd
호스트 컴퓨터에서 루트로 활성화하고 시작했습니다 . 이는 브리지를 제공 virbr0
하지만 루트가 아닌 사용자는 이에 액세스할 수 없는 것 같으므로 별 차이가 없습니다. 나에게 그것이 필요 libvirtd
합니까 ?
VM은 루트로 실행되지 않을 수 있으므로 이는 나에게 적합한 솔루션이 아닙니다. 사용자는 동일한 호스트에 있는 다른 사람의 가상 머신에 대한 높은 권한이나 액세스 권한을 가질 수 없습니다.
답변1
우와! 3라운드를 해보자! 마침내 성공할 수 있는지 봅시다. 시작.
첫째, 내 가상 머신은 실제로예전에는qemu:///session이 아닌 qemu:///system에 있습니다. 그래서 루트 비밀번호를 입력하지 않아도 VM은 루트로 실행되어야 합니다(?! 왜 그러는 걸까요?!). 따라서 qemu:///session에서 가상 머신을 사용해 보려고 합니다. (문제를 재현하고 고칠 수 있는지 확인하기 위해 단계를 진행하면서 이것을 입력하고 있으므로, 수행할 때 조금 계획되지 않은 것처럼 보이면 그렇기 때문입니다.)
그래서 먼저 virt-manager에 가서 기본 연결과 다른 QEMU/KVM에 대한 새 연결을 만들기 시작했습니다. 이번에는 "QEMU/KVM User Session"을 사용했습니다. virt-manager에서 이를 선택하면 "네트워크 옵션이 매우 제한되어 있습니다"라는 메시지가 나타납니다. 문제는 여기서부터 시작되는 것 같습니다. 내가 그 문제를 해결할 수 있는지 봅시다.
연결이 설정되면 이제 새 KolibriOS VM을 생성하고 무슨 일이 일어나는지 살펴보겠습니다.
따라서 VM 생성 중에 virt-manager는 더 이상 VM 설치 프로그램이 포함된 ISO 파일 디렉터리를 볼 수 없습니다. 따라서 실제로 가상 머신을 생성할 수 있도록 ISO 파일을 가리키는 새 스토리지 풀을 추가하겠습니다. (디렉터리:/home/user/ISO 파일)
좋습니다. 이제 ISO에 액세스할 수 있습니다. 이제 "kolibri.iso" 파일을 사용하여 새 KolibriOS VM을 생성하겠습니다. (OS 유형: 범용 기본값, CPU 수: 1, 메모리: 256MB. Kolibri는 작은 운영 체제입니다.)
KolibriOS는 ISO 외부에서 직접 사용하도록 설계되었으므로 가상 머신에 디스크 저장소를 제공하지 않습니다.
자, 드디어 마지막에 흥미로운 사실을 발견했습니다. 사용자 모드 네트워킹을 사용하거나 장치 이름을 공유하는 옵션이 있습니다. 사용자 모드 네트워킹부터 시작하겠습니다. 그래도 작동하지 않으면 공유 장치 "virbr0"을 사용하여 다시 시도하고 무슨 일이 일어나는지 살펴보겠습니다.
저는 "완료" 버튼을 클릭했습니다. 이제 가상 머신이 빠르게 시작됩니다.
좋아, 시작되고 "이제 네트워크에 연결되었습니다"라는 메시지가 나타납니다. 유망해 보입니다.
이제 WebView가 열렸으므로 "Kolibri Stuff"로 이동하여 무슨 일이 일어나는지 살펴보겠습니다. 작동하면 Google에 액세스할 수 있는지 확인해 보겠습니다.
"Kolibri Stuff" 버튼이 작동했습니다. 이제 "http://store.kolibri-n.org/en.html" 페이지가 표시됩니다. 이제 Google을 사용해 보겠습니다.
물론 Google도 있고 개인정보 보호정책에 대한 링크도 있습니다. 클릭하면 어떻게 되는지 살펴보겠습니다.
글쎄요, 분명히 WebView는 이 페이지가 말하는 내용을 이해하지 못합니다. 하지만 화면에 복잡한 JavaScript가 많이 표시되어 있으므로 무언가를 다운로드한 것 같습니다. NSInstall을 시도해 보겠습니다.
좋습니다. NetSurf 애플리케이션을 다운로드해야 합니다. 다운로드가 가능하다면 네트워크는 정상이라고 생각됩니다.
다운로드가 완료되었습니다. 이제 다시 Google을 사용해 보겠습니다.
글쎄, NetSurf는 Google을 좋아하지 않습니다. 드 돔도를 시도해 봅시다. 이것은 기본적으로 Linux 리뷰와 관련된 내용입니다.
최종 평결 - NetSurf는 냄새가 납니다! WebView로 돌아갑니다. (http://www.dedoimedo.com/index.html). 마침내! 켜졌 어!
따라서 사용자 모드 VM 내부를 성공적으로 탐색할 수 있으므로 이것이 유효하다고 가정합니다. "virsh -c qemu:///session list"는 이제 내 "UserKolibriOS" VM이 실행 중임을 표시합니다. 이것이 보여주는 것입니다:
Id Name State
-------------------------------
1 UserKolibriOS running
이제 "virsh -c qemu:///system list"가 다음과 같이 표시됩니다.
Id Name State
--------------------
그래서 저는 인터넷에 잘 액세스할 수 있는 사용자 모드 가상 머신을 가지고 있습니다. 이제 다시 시도하고 동일한 작업을 수행해 보겠습니다. 단, 이번에는 Lubuntu 18.04를 사용하여 virtio 네트워크 어댑터를 얻습니다. (나는 많은 구성 파일을 덤프하기 전에 모든 것이 제대로 작동하는지 절대적으로 확인하고 싶기 때문에 이 일련의 테스트를 수행하고 있습니다.)
이것은 내 Lubuntu 18.04 VM 구성입니다. CPU 2개, 1024MB RAM, 사용자 모드 네트워킹, 가상 하드 디스크 없음.
알겠습니다. VM이 시작됩니다. 무슨 일이 일어나는지 봅시다.
가상 머신이 시작됩니다. 네트워크에 연결되어 있다고 생각되는 것 같습니다. 구글을 열고 "죽음의 블루 스크린"을 검색해서 무슨 일이 일어나는지 살펴보겠습니다.
우와! 가상 머신의 인터넷이 실제 시스템의 인터넷보다 빠르게 실행되는 것 같습니다. 내 검색에서 Wikipedia에서 "Blue Screen of Death"를 찾아서 열었습니다. 저는 현재 가상 머신 창에서 Windows 10의 상대적으로 암울한 이미지를 보고 있습니다. 그래서 저는 사용자 모드 네트워킹이 가상 머신에서 웹 검색에 적합하다는 결론을 내렸습니다. 이제 내 구성이 무엇을 하는지 살펴보겠습니다.
먼저 KolibriOS VM을 부팅하고 Lubuntu 18.04 VM을 부팅했을 때 "connected to tun vnet0"이 화면에 나타나지 않는 것을 확인했습니다.
이제 KolibriOS로 시작하는 네트워크 어댑터 구성은 다음과 같습니다.
<interface type="user">
<mac address="52:54:00:6f:ab:33"/>
<model type="e1000"/>
<address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x0"/>
</interface>
이제 Lubuntu 18.04는 다음과 같습니다.
<interface type="user">
<mac address="52:54:00:7d:63:ba"/>
<model type="virtio"/>
<address type="pci" domain="0x0000" bus="0x01" slot="0x00" function="0x0"/>
</interface>
이제 내 구성은 "link state="up""에 대한 비트가 누락된 점을 제외하면 귀하의 구성과 동일해 보입니다. 그러나 내 네트워크는 작동하지만 귀하의 네트워크는 작동하지 않습니다. 잘...
지금 생각나는 것은 가상머신 운영 체제의 네트워크 설정이 제대로 작동하지 않아야 하고, 가상머신 자체가 완벽하게 구성되어 있어야 한다는 것뿐입니다.
마지막으로 공유 장치 "virbr0"을 사용하여 마지막 테스트인 Lubuntu 18.04를 실행하겠습니다. 사용자 모드 VM이더라도 브리지와 함께 작동하는지 살펴보겠습니다.
완전 실패! 시도하면 화면에 다음과 같은 내용이 표시됩니다.
Unable to complete install: 'internal error: /usr/lib/qemu/qemu-bridge/helper
--br=virbr0 --fd=29: failed to communicate with bridge helper: Transport
endpoint is not connectedH001F007F stderr=failed to parse default acl file`/
-etc/qemu/bridge.conf''
무엇? ! 분명히 내 브리지에 연결하고 싶지 않은 것 같습니다. 내 생각에는 브리지 네트워킹이 사용자 모드 VM에서는 작동하지 않는 것이 맞습니다. 그러나 사용자 모드 네트워킹은 작동하므로 필요하지 않습니다.
사용자 모드 네트워킹 정보에 관해 귀하가 제공한 링크에서 뭔가를 발견했습니다. 여기에는 사용자 모드 네트워킹으로 끝나는 QEMU 네트워킹에 대한 페이지에 대한 링크가 있습니다. "이 옵션은 매우 유용한 기본값을 제공합니다. 게스트 운영 체제는 호스트에서 실행되는 다른 모든 애플리케이션과 마찬가지로 본질적으로 투명한 네트워크 액세스를 갖기 때문입니다."(이 옵션은 "https://people.gnome" 아래에 있음) .org/~markmc/qemu-networking.html".) QEMU는 실제로 인터넷 연결을 허용합니까? 아니면 어떻게든 막힌 걸까요? Linux에서 단일 프로세스가 인터넷에 액세스하는 것을 차단하는 것이 가능한지는 확실하지 않지만 그럴 수도 있습니다. QEMU를 연결할 수 없으면 VM도 연결할 수 없습니다.
그래서 최종 결론 - 이는 가상머신의 구성 문제가 아닌 가상 운영체제의 문제라고 생각됩니다. Lubuntu 18.04를 사용해 보세요. 즉시 사용 가능합니다. 여기에서 다운로드할 수 있습니다: "https://lubuntu.me/downloads/". 그곳의 네트워크가 작동하는지 확인하세요. 그 외에는 모든 일을 제대로 하고 있는 것 같습니다.
편집 - 이 문제는 가상 OS의 "/etc/resolv.conf"에서 일부 항목을 편집하여 결국 해결되었습니다. 이것은 Ubuntu 및 Arch Linux에서 작동합니다. 이제 사용자 모드 네트워킹이 작동합니다. 감사합니다 Ned64! (자세한 내용은 아래 Ned64의 설명을 참조하세요.)
도움이 되었기를 바랍니다!
답변2
최신 버전의 QEMU/KVM/LibVirt를 사용하고 있습니다. 내 네트워크는 루트가 아닌 사용자에서는 잘 작동하지만하다내 시스템에 네트워크 브리지가 있습니다. 또한 VM을 시작하면 VM이 시작될 때 호스트 시스템이 "tun vnet0"에 연결되었음을 나타내는 "연결 설정" 메시지가 표시됩니다. (물론, 동시에 실행하는 추가 VM마다 숫자가 늘어납니다. 두 번째 VM은 vnet1에 연결하는 등의 원인이 됩니다.) 브리지가 부족하여 문제가 될 수 있습니다.
제가 이 이론을 테스트했을 때 이런 일이 일어났습니다. KolibriOS를 실행하는 가상 머신이 있고(설치하는 것이 약간 힘들었지만 결국 작동했습니다!) 원래 브리지를 켠 상태에서 만들었습니다. 인터넷은 처음부터 훌륭하게 작동했습니다. 브리지가 켜져 있는 상태에서 KolibriOS를 시작한 다음 전체 부팅 후에 브리지를 껐습니다. 그러면 가상 머신 내에서 인터넷에 액세스할 수 없습니다. 호스트의 vnet0 연결이 끊어진 것을 확인했습니다. 브리지를 다시 켰는데 VM이 여전히 연결할 수 없습니다. 그런 다음 VM을 종료하고 브리지를 껐습니다. 그러면 "기본" 네트워크에 문제가 있기 때문에 가상 머신을 시작할 수도 없습니다. 브리지를 다시 켜고 VM을 시작해 보았습니다. 창이 열리고 인터넷에 다시 접속할 수 있습니다.
따라서 모든 종류의 네트워크에 액세스하려면 브리지가 필요하다는 결론에 도달했습니다. 다리를 열어보세요. 브리지를 사용하도록 VM의 가상 네트워크 어댑터(NAT)를 일부 변경해야 할 수도 있습니다.
또한 내 가상 컴퓨터는 가상 네트워크 어댑터의 링크 상태가 활성일 때만 네트워크에 연결할 수 있습니다. VM 창의 세부 정보 화면으로 이동하여 NIC 항목을 클릭하고 링크 상태: 활성 확인란이 선택되어 있는지 확인합니다. 그러나 XML 코드에 .
마지막으로 인터넷에 연결할 수 있게 해주는 KolibriOS VM의 가상 네트워크 어댑터에 있는 XML 코드는 다음과 같습니다.
<interface type="network">
<mac address="52:54:00:18:a8:56"/>
<source network="default" portid="2090855d-4e56-4e55-ad97-9fad39d782ba" bridge="virbr0"/>
<target dev="vnet0"/>
<model type="e1000"/>
<link state="up"/>
<alias name="net0"/>
<address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x0"/>
</interface>
이게 도움이 되길 바란다! 게스트에서의 웹 탐색은 이 설정에서 완벽하게 작동합니다. WebView 도구를 통해 KolibriOS 홈페이지와 Google에 액세스할 수 있지만 브리지가 다운되면 액세스할 수 없습니다.
나는 루트가 아닌 사용자로서 이 모든 작업을 수행했습니다. 전체 실험을 완료하기 위해 비밀번호를 입력할 필요가 없었으므로 루트 액세스 없이도 잘 작동할 것입니다.
답변3
이것은 내 이전 답변에 대한 Ned64의 두 가지 의견에 대한 응답입니다. 게스트로 글을 쓰다보니 댓글에 그냥 답글을 달 수가 없네요. 완전히 새로운 답글을 작성해야 하는데, "왜 그냥 댓글에 답글을 달면 되지?" 라고 궁금하신 분들은 이제 아실 겁니다. 또한 내 대답은 꽤 강력한 것으로 판명되었으므로 어차피 댓글 섹션에 맞지 않을 것입니다.
좋아요, 이제 갑니다.
도움이 될 수 있는 몇 가지 정보 - 저는 virt-manager를 사용하여 가상 머신을 관리하고 작업하고 있습니다. 내 컴퓨터에서는 Lubuntu 20.04 64비트 운영 체제를 사용하고 있습니다. 내 모든 가상 머신(KolibriOS, PuppyLinux 및 Lubuntu 18.04)은 인터넷에 액세스할 수 있습니다.
나를 위해 다리를 만들어줄 사람은 아무도 없습니다. QEMU, libvirt 및 virt-manager를 설치한 이후부터 존재했습니다. 그러나 이 모든 항목을 설치했을 때 새로운 사용자(libvirt-qemu라고 함)와 세 개의 새로운 그룹(libvirt, libvirt-qemu 및 libvirt-dnsmasq이라고 함)이 나타났습니다. 그리고 이 사용자가 /와 같은 일부 디렉터리에 액세스할 수 있다는 것을 알았습니다. var/lib/libvirt/images는 내 표준 사용자가 액세스할 수 없으므로 libvirt-qemu가 내 브리지를 담당한다고 가정합니다. 또한 내 기본 사용자는 libvirt 그룹에 있는데, 이는 내가 직접 수행할 필요가 없습니다. 다시 말하지만, 설치 루틴이 자동으로 이를 수행해 주었을 것입니다.
이것은 내 "brctl show"의 출력입니다.
bridge name bridge id STP enabled interfaces
virbr0 8000.5254006b64fb yes virbr0-nic
어쨌든 네트워크 아이콘을 클릭하면 활성 연결 목록에 "virbr0"이 표시되므로 실제 컴퓨터는 실제 이더넷처럼 "virbr0" 네트워크에 연결됩니다.
VM이 작동하고 인터넷에 연결되어 있는 동안 "brctl show"를 수행하면 다음과 같은 일이 발생하는 것으로 나타났습니다.
bridge name bridge id STP enabled interfaces
virbr0 8000.5254006b64fb yes virbr0-nic
vnet0
또한 VM이 켜져 있으면 활성 연결에 "vnet0"이 나타나고 VM을 종료하면 사라집니다.
가상 머신을 실행하지 않고 "virsh net-dumpxml default"에서 얻은 내용은 다음과 같습니다.
<network>
<name>default</name>
<uuid>940f02c2-f3ba-4f25-ad0f-5876a41b5d3b</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:6b:64:fb'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
VM이 실행되는 동안 "virsh net-dumpxml default"도 실행했는데 아무런 차이가 없었습니다.
도움이 될 수 있는 또 다른 참고 사항 - 내 사용자는 libvirt 그룹에 속하지만 kvm 그룹에는 속하지 않습니다. 이는 도움이 될 수도 있고 혼란스러울 수도 있습니다.
마지막 참고 사항 - "e1000" 모델 유형을 사용하는 올바른 네트워크의 VM에 대한 XML 코드가 표시되지만 VM에서는 "virtio"를 사용합니다. 다음은 virtio 네트워크 어댑터를 사용하여 인터넷이 작동하는 가상 머신의 코드입니다.
<interface type="network">
<mac address="52:54:00:97:df:ec"/>
<source network="default" portid="59b9b7c2-9453-43b6-8420-99961b5065c7" bridge="virbr0"/>
<target dev="vnet0"/>
<model type="virtio"/>
<alias name="net0"/>
<address type="pci" domain="0x0000" bus="0x01" slot="0x00" function="0x0"/>
</interface>
이것은 ISO 파일을 실행하는 라이브 Lubuntu 18.04 64비트 VM입니다. 이 VM에서는 인터넷에 정상적으로 액세스할 수 있습니다.
도움이 되었기를 바랍니다!