QEMU를 사용하여 호스트에서 게스트로 SSH하는 방법은 무엇입니까?


29

qemu를 사용하여 호스트에서 게스트로 ssh를 어떻게 설정합니까? 다음과 같이 특별한 매개 변수없이 VM을 부팅 할 때 포트 리디렉션을 사용할 수 있습니다.

/usr/bin/qemu-system-x86_64 -hda ubuntu1204 -m 512 -redir tcp:7777::8001

그러나 다음을 사용하여 부팅하려고하면 :

/usr/bin/qemu-system-x86_64 \
-m 1024 \
-name vserialtest \
-hda ubuntu1204 \
-chardev socket,host=localhost,port=7777,server,nowait,id=port1-char \
-device virtio-serial \
-device virtserialport,id=port1,chardev=port1-char,name=org.fedoraproject.port.0 \
-net user,hostfwd=tcp:7777::8001

다음과 같은 오류가 발생하고 VM이 부팅되지 않습니다.

qemu-system-x86_64: -net user,hostfwd=tcp:7777::8001: invalid host
forwarding rule 'tcp:7777::8001'
qemu-system-x86_64: -net user,hostfwd=tcp:7777::8001: Device 'user'
could not be initialized

-net아무런 문제없이 매개 변수없이 VM을 부팅 할 수 있지만 호스트에서 게스트로 ssh를 설정하고 싶습니다. 게스트에서 호스트로의 ssh가 정상적으로 작동합니다.

편집하다

나는 사용을 시도했다

-net user,hostfwd=tcp::7777-:8001

만큼 잘

-net user,hostfwd=tcp::7777:8001

그러나 여전히 오류가 지속되고 VM이 부팅되지 않습니다.


답변:


37

오류는 -net 문이 아니라 다음과 같습니다.

-chardev socket,host=localhost,port=7777,server,nowait,id=port1-char

이 명령문은 이미 포트 7777을 사용합니다. 포트 전달의 경우

-net user,hostfwd=tcp::7777-:8001

virtio 직렬 채널을 설정하지 않으면 정상적으로 작동합니다.

올바르게 이해한다면 유닉스 도메인 소켓을 사용하여 호스트에서 VM으로 통신하도록 virtio 직렬 채널을 설정하고 싶습니까?

이 경우 다음이 작업을 수행 할 수 있습니다.

/usr/bin/qemu-system-x86_64 \
-m 1024 \
-name vserialtest \
-hda ubuntu1204 \
-chardev socket,path=/tmp/port1,server,nowait,id=port1-char \
-device virtio-serial \
-device virtserialport,id=port1,chardev=port1-char,name=org.fedoraproject.port.0 \
-net user,hostfwd=tcp::7777-:8001

편집하다:

ssh를 사용하여 호스트에서 VM에 연결하는 방법의 예 :

-net user,hostfwd=tcp::10022-:22
-net nic

이 호스트 전달은 로컬 호스트 (호스트) 포트 10022를 VM의 포트 22에 매핑합니다. VM이 이와 같이 시작되면 다음과 같이 로컬 호스트에서 VM에 액세스 할 수 있습니다.

ssh vmuser@localhost -p10022

-net nic 명령은 매우 기본적인 가상 네트워크 인터페이스 카드를 초기화합니다.


네, 맞습니다. 저는 virtio-serial을 사용하여 호스트에서 게스트로 통신을 설정하려고합니다. VM은 호스트 콘솔에서 경고를 표시하면서 부팅되었습니다. Warning: vlan 0 with no nics그러나 ifconfig게스트에서 작업 할 때만 볼 수 lo있으며 ssh: connect to host 10.0.2.15 port 22: Connection timed outssh를 시도 할 때 여전히 나타납니다. ssh에 사용한 IP는 10.0.2.15이며 man qemu-system-x86_64고정 IP가 할당되지 않은 경우 부팅 된 첫 번째 VM에 할당 된 IP입니다. 그리고 이제 손님의 인터넷 연결이 없습니다.
jobin

다른 포트에서 ssh에 사용되는 포트 22를 매핑 한 다음 호스트 시스템에서 연결하여 VM에 액세스하는 것이 좋습니다. 예를 들어 답변을 편집했습니다.
mas_kur1

편집 된 답변은 완벽하게 작동합니다!
dbernard

19

시작할 때 이것을 사용해보십시오 qemu -redir tcp:2222::22

$ ssh -p 2222 localhost

qemu launch 명령의 tcp : 2222 :: 22 플래그는 호스트 시스템의 2222 포트를 가상 시스템의 포트 22 (기본 ssh 포트)에 맵핑합니다.

그런 다음 로컬 호스트 (호스트 시스템)의 2222 포트로 간단히 ssh하면 트래픽이 가상 시스템의 ssh 22 포트로 리디렉션되므로 일반적으로 다른 시스템과 마찬가지로 ssh를 사용할 수 있습니다.


3
유닉스 및 리눅스에 오신 것을 환영합니다! 우리는 설명과 맥락을 제공하는 긴 답변을 찾고 있습니다. "이걸 시도해라 ..."라고 말하지 마십시오. 인용에 이상적으로 답이 적합한 이유를 설명하십시오. 설명이 포함되지 않은 답변은 제거 될 수 있습니다.
G-Man, 'Reinstate

3
이 답변이 위의 다른 모든 답변보다 더 도움이되었다고 말할 필요가 있다고 생각합니다. 불필요한 정보가 없으며 무엇보다도 작동합니다. 구글 쿼리에서 "도대체 내가 어떻게 qemu에 ssh ssh?"
jan

1
이 답변은 99.9 %의 사람들이 실제로 원하는 것을 수행합니다. 즉, 호스트 시스템은 호스트가 scp 등을 사용하여 가상 시스템과 파일을 복사하는 기능을 포함하여 가상 시스템에 대한 ssh 액세스 권한을 얻습니다.
nullUser

1
훌륭한! 내 라즈베리 파이 명령은 다음과 같습니다qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw console=ttyAMA0,115200" -hda 2014-01-07-wheezy-raspbian.img -nographic -redir tcp:2222::22
열광적 인

2
man qemu-system-x86_642.5.0 : 참고 : 레거시 독립형 옵션 -tftp, -bootp, -smb 및 -redir는 여전히 처리되어 -net 사용자에게 적용됩니다.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

4

OpenSSH 구성은 Buildroot 2016.05, QEMU 2.5.0, Ubuntu 16.04 호스트에서 테스트되었습니다.

QEMU 네트워크 전달 외에도 SSH를 올바르게 설정해야합니다. 여기에서 다룰 것입니다.

qemu_x86_64_defconfigopenssh 패키지로 시작 하고 활성화하십시오.

make qemu_x86_64_defconfig
echo 'BR2_PACKAGE_OPENSSH=y' >> .config
make BR2_JLEVEL=$(nproc)

그런 다음 QEMU를 시작하십시오.

qemu-system-x86_64 \
  -M pc \
  -append root=/dev/vda \
  -drive file=output/images/rootfs.ext2,if=virtio,format=raw \
  -enable-kvm \
  -kernel output/images/bzImage \
  -m 512 \
  -net nic,model=virtio \
  -net user,hostfwd=tcp::2222-:22

그런 다음 손님 :

vi /etc/ssh/sshd_config

다음 설정을 수정하십시오.

PermitRootLogin yes
PermitEmptyPasswords yes

그리고 서버를 다시 시작하십시오.

/etc/init.d/S50sshd restart

이 파일이 존재하기 때문에 기본적으로 sshd가 시작됩니다. https://github.com/buildroot/buildroot/blob/2018.02/package/openssh/S50sshd 는 다음과 같습니다. 키 시작 작업은 다음과 같습니다.

/usr/bin/ssh-keygen -A
/usr/sbin/sshd
touch /var/lock/sshd

그런 다음 호스트에서 :

ssh root@localhost -p 2222

장애가 발생한 경우 먼저 네트워킹 전달이 sshd보다 하위 레벨 도구와 함께 작동하는지 테스트 nc -l 하십시오 ( 예 : 여기 설명 참조) .

또한 게스트의 서버 로그를 확인하십시오.

less /var/log/messages

그런 다음 최종 시스템에 당신과 함께 해당 로그 파일의 생성을 자동화한다 BR2_ROOTFS_OVERLAY또는 BR2_ROOTFS_POST_BUILD_SCRIPT: 생성 된 대상 파일 시스템을 사용자 정의 | buildroot.org


-1

나는 당신이 hostfwd=tcp::7777-:8001또는hostfwd=tcp::7777:8001

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.