QEMUを使用してホストからゲストにSSHをどのように接続しますか?

QEMUを使用してホストからゲストにSSHをどのように接続しますか?

qemuを使用してホストからゲストとしてSSHを設定するには?仮想マシンを起動するときは、次の特別なパラメータなしでポートリダイレクトを使用できます。

/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

次のエラーが発生し、仮想マシンは起動しません。

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

パラメータなしでVMを問題なく起動できますが、-netホストからゲストとしてSSHを設定したいと思います。ゲストからホストへのSSHは期待どおりに機能します。

編集する

使ってみました。

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

また

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

ただし、エラーが持続し、仮想マシンが起動しません。

答え1

私の考えでは、エラーはドアで発生したのではなく、次のようなもの-netです。

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

このポートはこのステートメントですでに使用されています7777。ポート転送の場合

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

virtioシリアルチャンネルを設定しなくても正常に動作します。

私が正しく理解したら、Unixドメインソケットを使用してホストから仮想マシンに通信するためにvirtioシリアルチャネルを設定しますか?

この場合、次の操作が実行されます。

/usr/bin/qemu-system-x86_64 \
-m 1024 \
-name vserialtest \
-hda ubuntu1204 \
-chardev socket,path=/tmp/port1,server=on,wait=off,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

このホスト転送は、localhost(ホスト)ポート10022をVMのポート22にマッピングします。仮想マシンがこのように起動すると、次のようにlocalhostからアクセスできます。

ssh vmuser@localhost -p10022

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

答え2

これをqemuネットワーク構成に追加します。

,hostfwd=tcp::2222-:22

例えば

qemu -net nic -net user,hostfwd=tcp::2222-:22

このtcp::2222-:22フラグは、ホストのポート2222を仮想マシンのポート22(デフォルトのSSHポート)にマッピングします。

その後、SSHを介してローカルホスト(ホスト)のポート2222に接続するだけで、すべてのトラフィックが仮想マシンのSSHポートにリダイレクトされ、他のコンピュータで通常のようにSSHを使用できます。

$ ssh -p 2222 localhost

答え3

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

QEMUネットワーク配信に加えて、SSHを適切に設定する必要があります。これについてはここで取り上げます。

まずqemu_x86_64_defconfig、opensshパッケージを有効にします。

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カスタムビルドターゲットファイルシステム|

関連:https://stackoverflow.com/questions/23106012/how-to-access-raspberry-pi-qemu-vm-via-network

答え4

私はあなたが使うべきだと思いhostfwd=tcp::7777-:8001ますhostfwd=tcp::7777:8001

関連情報