Как SSH от хоста к гостю, используя QEMU?


30

Как настроить ssh с хоста на гостя с помощью qemu? Я могу использовать перенаправление портов при загрузке виртуальной машины без каких-либо специальных параметров, а именно:

/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

Обратите внимание, что я могу загружать виртуальную машину без -netпараметров без каких-либо проблем, однако я хочу настроить ssh с хоста на гостя. Ssh от гостя к хосту работает нормально, как и ожидалось.

редактировать

Я пытался использовать

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

так же как

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

но ошибка все еще сохраняется, и виртуальная машина не загружается.


Ответы:


37

Я думаю, что ошибка не в выражении -net, а в:

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

Оператор уже использует порт 7777. Для переадресации порта, с

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

он работает нормально, если не настроить последовательный канал virtio.

Если я правильно понимаю, вы хотите настроить последовательный канал virtio для связи от хоста к виртуальной машине с помощью доменного сокета Unix?

В этом случае следующее может сделать работу:

/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 к виртуальной машине:

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

Эта переадресация хоста сопоставляет порт 10022 локального хоста (хоста) с портом 22 на виртуальной машине. Как только виртуальная машина была запущена следующим образом, вы можете получить к ней доступ с локального хоста следующим образом:

ssh vmuser@localhost -p10022

Команда -net nic инициализирует очень простую виртуальную сетевую карту.


Да, вы правы, я пытаюсь использовать virtio-serial для установления связи между хостом и гостем. ВМ загрузилась, выдав предупреждение на консоли хоста: Warning: vlan 0 with no nicsно когда я делаю ifconfigна гостевой, я вижу только, loи я все еще получаю, ssh: connect to host 10.0.2.15 port 22: Connection timed outкогда я пытаюсь ssh; IP-адрес, который я использовал для ssh, равен 10.0.2.15, который в соответствии с man qemu-system-x86_64IP-адресом, назначенным первой виртуальной машине, загружается, если статический IP-адрес не назначен. И сейчас нет гостевого подключения к интернету.
Jobin

Вам может потребоваться сопоставить порт 22, используемый для ssh, с другим портом, а затем подключиться к нему с хост-компьютера для доступа к ВМ. Я отредактировал свой ответ на примере.
mas_kur1

Отредактированный ответ работает отлично!
Дбернард

19

Попробуйте это при запуске qemu -redir tcp:2222::22

$ ssh -p 2222 localhost

Флаг tcp: 2222 :: 22 в команде запуска qemu отображает порт 2222 хост-машины на порт 22 (порт ssh по умолчанию) на виртуальной машине.

Затем, просто подключившись к порту 2222 на вашем локальном хосте (хост-машине), вы перенаправите любой трафик на порт ssh 22 на виртуальной машине, что позволит вам использовать ssh, как обычно, на любой другой машине.


3
Добро пожаловать в Unix и Linux! Мы ищем длинные ответы, которые дают некоторое объяснение и контекст. Не просто говорите "Попробуйте это ..."; объясните, почему ваш ответ правильный, в идеале с цитатами. Ответы, не содержащие объяснений, могут быть удалены.
G-Man говорит: «Восстановите Монику»

3
Я просто чувствую необходимость сказать, что этот ответ помог мне больше, чем все остальные ответы выше. Никакой лишней информации и прежде всего она работает. Идеально подходит при посадке из Google-запроса "как, черт возьми, я ssh в qemu".
Январь

1
Этот ответ делает то, что на самом деле хотят 99,9% людей. Т.е. хост-машина получает ssh-доступ к виртуальной машине, включая возможность для хоста копировать файлы на виртуальную машину и с нее, используя scp или аналогичный.
nullUser

1
Brilliant! Моя команда Raspberry Pi теперь выглядит следующим образом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.
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

4

Конфигурация 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: Настройка созданной целевой файловой системы | buildroot.org


-1

Я считаю, что вам нужно использовать hostfwd=tcp::7777-:8001илиhostfwd=tcp::7777:8001

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.