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シリアルチャネルを設定しない場合は正常に機能します。

私の理解が正しければ、virtioシリアルチャネルをセットアップして、Unixドメインソケットを使用してホストからVMに通信したいですか?

この場合、次の作業を実行できます。

/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がこのように開始されると、次のようにローカルホストからアクセスできます。

ssh vmuser@localhost -p10022

-net nicコマンドは、非常に基本的な仮想ネットワークインターフェイスカードを初期化します。


はい、あなたは正しいです、私はvirtio-serialを使用してホストからゲストへの通信を確立しようとしています。VMが起動し、ホストコンソールで警告が表示されます。Warning: vlan 0 with no nicsただしifconfig、ゲストで実行すると、sshを実行しようとすると表示されますが、loまだ表示さssh: connect to host 10.0.2.15 port 22: Connection timed outれます。sshに使用したIPは10.0.2.15です。これman qemu-system-x86_64は、静的IPが割り当てられていない場合に起動される最初のVMに割り当てられたIPです。そして今、ゲストにはインターネット接続がありません。
ジョバン

あなたがしたいことは、sshに使用されるポート22を別のポートにマッピングし、ホストマシンからVMに接続してVMにアクセスすることです。例で答えを編集しました。
mas_kur1 14

編集した回答は完璧に機能します!
dbernard

19

起動時にこれを試してください qemu -redir tcp:2222::22

$ ssh -p 2222 localhost

qemu launchコマンドのtcp:2222 :: 22フラグは、ホストマシンの2222ポートを仮想マシンのポート22(デフォルトのsshポート)にマップします。

次に、ローカルホスト(ホストマシン)の2222ポートに単純にsshingすると、仮想マシンのssh 22ポートにトラフィックがリダイレクトされ、他のマシンと同様にsshできるようになります。


3
Unix&Linuxへようこそ!いくつかの説明とコンテキストを提供する長い答えを探しています。「これを試して...」とだけ言ってはいけません。答えが正しい理由を説明します。理想的には引用を使用します。説明を含まない回答は削除される場合があります。
G-Manは「Reinstate Monica」と言います

3
この答えが上記の他のすべての答えよりも私を助けたと言う必要性を感じています。余分な情報はなく、何よりも機能します。google-queryから「qemuにsshする方法」から着陸するときに最適です。
1月

1
この回答は、99.9%の人々が実際に望んでいることを実行します。つまり、ホストマシンは仮想マシンへのsshアクセスを取得します。これには、ホストがscpなどを使用して仮想マシンとの間でファイルをコピーする機能が含まれます。
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
enthusiasticgeek

2
man qemu-system-x86_642.5.0:注:従来のスタンドアロンオプション-tftp、-bootp、-smb、および-redirは引き続き処理され、-netユーザーに適用されます。
Ciro Santilli新疆改造中心法轮功六四事件

4

Buildroot 2016.05、QEMU 2.5.0、Ubuntu 16.04ホストでテストされたOpenSSH構成

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-:8001hostfwd=tcp::7777:8001

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.