web-dev-qa-db-ja.com

QEMUを使用してホストからゲストにSSHで接続する方法は?

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

VMなしで-netパラメータに問題はありませんが、ホストからゲストにsshをセットアップしたいと思います。ゲストからホストへのsshは期待どおりに正常に動作します。

編集する

私は使ってみました

-Net User,hostfwd=tcp::7777-:8001

と同様

-Net User,hostfwd=tcp::7777:8001

それでもエラーは解決せず、VMは起動しません。

31
jobin

エラーは-netステートメントではなく、

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

ステートメントはすでにポート7777を使用しています。ポート転送の場合、

-Net User,hostfwd=tcp::7777-:8001

virtioシリアルチャネルを設定しない場合は問題なく機能します。

私が正しく理解している場合、UNIXドメインソケットを使用してホストから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がこのように起動されたら、次のようにローカルホストからアクセスできます:

ssh vmuser@localhost -p10022

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

39
mas_kur1

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

$ ssh -p 2222 localhost

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

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

21
mikeschuld

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

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を使用してそのログファイルの作成を自動化する必要があります。 生成されたターゲットファイルシステムのカスタマイズ| buildroot.org