백그라운드에서 실행되는 VM에 IP 주소를 할당하는 방법은 무엇입니까?

백그라운드에서 실행되는 VM에 IP 주소를 할당하는 방법은 무엇입니까?

다음 명령을 사용하여 백그라운드에서 Virtual Box에서 Ubuntu 인스턴스를 실행합니다.

VBoxManage startvm ${VM_NAME} --type headless

GUI를 통해 실행하는 것과 주요 차이점은 GUI가 시작된 후 GUI에 있을 때 호스트의 터미널에서 IP 주소에 접속할 ifconfig수 있도록 IP 주소가 무엇인지 확인할 수 있다는 것입니다. ssh백그라운드에서는 그렇게 하지 마세요.

네트워크에서 IP 주소의 동적 할당을 가정할 때 SSH 목적으로 새로 생성된 인스턴스에 할당된 IP를 추출하는 방법이 있습니까? 아니면 IP를 모르고(예: 호스트의 백도어 포트를 통해) 인스턴스에 SSH를 통해 연결하는 방법이 있습니까? )?

답변1

다음과 같이 VBoxManage 명령을 사용하여 IP 주소를 추출할 수 있습니다.이 포럼 게시물virtualbox.org에서:

VBoxManage guestproperty enumerate <vmname>

그러나 아주 좋은 이유가 있지 않는 한 게스트 VM에 고정 IP 주소를 할당하는 것을 강력히 고려해 볼 것입니다. 이는 DHCP를 사용하는 경우에도 가능합니다. DHCP 서버가 할당하는 범위 밖의 IP 주소를 선택하면 됩니다.

답변2

먼저 설치했는지 확인하세요.VirtualBox 확장 팩그렇지 않은 경우 설치하십시오.

예를 들어(Ubuntu의 경우)

> wget http://download.virtualbox.org/virtualbox/4.2.12/Oracle_VM_VirtualBox_Extension_Pack-4.2.12-84980.vbox-extpack
> sudo VBoxManage extpack install ./Oracle_VM_VirtualBox_Extension_Pack-4.2.12-84980.vbox-extpack

또는에서

https://www.virtualbox.org/wiki/Downloads

그 후에는 VM의 IP를 얻을 수 있습니다

VBoxManage guestproperty enumerate <_name_of_VM_> | grep IP | grep -o -w -P -e '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'

답변3

게스트 추가를 설치하지 않고도 할 수 있습니다

하지만 네트워크를 알아야 합니다.
예를 들어 어댑터가 2개 있는 VM이 ​​있습니다.
네트워크 어댑터 2개

하나는 인터넷 통신용이고
두 번째는 호스트 전용 통신용입니다.

명령으로 네트워크를 볼 수 있습니다VBox관리 목록

NAT 네트워크:

% VBoxManage 목록 natnets
네트워크 이름: NatNetwork
IP: 10.10.12.1
네트워크: 10.10.12.0/24
DHCP 활성화: 예
활성화됨: 예

호스트 전용 네트워크

% VBoxManage 목록 호스트 전용 ifs
이름: vboxnet0
DHCP: 비활성화됨
IP 주소: 192.168.6.1
네트워크마스크: 255.255.255.240

여기
VM을 실행하는 주요 부분이 나와 있습니다.

vms를 실행 중인 % vboxmanage 목록
"centos7 node0 IP 테스트" {46ec9075-f49b-4d16-9867-d56710b6a3da}

VM uuid가 필요합니다.
46ec9075-f49b-4d16-9867-d56710b6a3da입니다.

이제 MAC 주소를 가져올 수 있습니다

% vboxmanage showvminfo --details 46ec9075-f49b-4d16-9867-d56710b6a3da | fgrep 맥
NIC 1: MAC: 08002783E8BB, 첨부 파일: NAT 네트워크 'NatNetwork', 연결된 케이블: 켜짐, 추적: 꺼짐(파일: 없음), 유형: 82540EM, 보고된 속도: 0Mbps, 부팅 우선 순위: 0, Promisc 정책: 거부, 대역폭 그룹: 없음
NIC 2: MAC: 080027D992F0, 첨부 파일: 호스트 전용 인터페이스 'vboxnet0', 연결된 케이블: 켜짐, 추적: 꺼짐(파일: 없음), 유형: 82540EM, 보고된 속도: 0Mbps, 부팅 우선 순위: 0, Promisc 정책: 거부 , 대역폭 그룹: 없음

'NatNetwork'의 첫 번째 어댑터에 대한 08002783E8BB회로망
'vboxnet0'에 대한 두 번째 어댑터의 경우 080027D992F0상호 작용

이제 첫 번째 어댑터에 대해 DHCP 테이블에서 IP를 얻을 수 있습니다.

% vboxmanage dhcpserver findlease --network NatNetwork --mac-address=08002783E8BB
IP 주소: 10.10.12.4                     
MAC 주소: 08:00:27:83:e8:bb
상태: 확인됨
발행일: 2020-07-13T13:31:20Z (1594647080)
만료: 2020-07-13T13:41:20Z (1594647680)
TTL: 600초, 현재 586초 남음

그리고 두 번째로

% vboxmanage dhcpserver findlease --interface vboxnet0 --mac-address=080027D992F0
IP 주소: 192.168.6.3
MAC 주소: 08:00:27:d9:92:f0
상태: 확인됨
발행일: 2020-07-13T13:29:06Z (1594646946)
만료: 2020-07-13T13:39:06Z (1594647546)
TTL: 600초, 현재 399초 남음


NAT 네트워크의 경우 호스트 전용 어댑터에 --net 옵션을 사용합니다. 우리
는 --interface 옵션을 사용합니다.

이제 SSH를 통해 호스트에서 이 VM에 연결합니다.

% SSH[이메일 보호됨]
[이메일 보호됨]님의 비밀번호:
마지막 로그인: 2020년 7월 13일 월요일 09:05:33
[루트@노드0 ~]#

답변4

이것이 내가 손으로나 앤서블을 사용하여 수행하는 방법입니다. "/Net/0/"은 첫 번째 네트워크 인터페이스이고, "/Net/1/"은 두 번째입니다. "/V4/"는 IPv4용이고 "/V6/"는 IPv6입니다.

IPv4 버전

VBoxManage guestproperty get <uuid|vmname> "/VirtualBox/GuestInfo/Net/0/V4/IP" | sed -e 's/Value: //g'

IPV6 버전

VBoxManage guestproperty get <uuid|vmname> "/VirtualBox/GuestInfo/Net/0/V6/IP" | sed -e 's/Value: //g'

간단한 스크립트를 작성해 보세요.

#!/bin/sh
for VM in $(VBoxManage list runningvms | awk -F\{ '{print $2}' | sed -e 's/}//g');
do {
  VMNAME="$(VBoxManage showvminfo ${VM} --machinereadable | awk -F\= '/^name/{print $2}')"
  VMIP=$(VBoxManage guestproperty get ${VM} "/VirtualBox/GuestInfo/Net/0/V4/IP" | sed -e 's/Value: //g')
  printf "VM-IP: %-16s VM-Name: %-50s\n" "${VMIP}" "${VMNAME}"
} done

실행 중인 모든 VM과 유사한 출력을 제공합니다.

VM-IP: 10.13.172.82     VM-Name: "Ansible Lab VM1 Master"
VM-IP: 10.13.172.84     VM-Name: "Ansible Lab VM2 Slave CentOS"
VM-IP: 10.13.172.83     VM-Name: "Ansible Lab VM3 Slave Win10"
...etc

참고: 게스트 추가를 설치해야 합니다.

관련 정보