Як SSH від хоста до гостя за допомогою QEMU?


30

Як встановити ssh від хоста до гостя за допомогою qemu? Я можу використовувати перенаправлення портів, коли я завантажую 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 не завантажується.


Відповіді:


37

Я думаю, що помилка походить не від оператора -net, а від:

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

В операторі вже використовується порт 7777. Для переадресації порту, с

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

він чудово працює, коли не налаштовує послідовний канал virtio.

Якщо я правильно розумію, ви хочете налаштувати послідовний канал virtio для передачі даних від хоста до VM за допомогою Unix Domain Socket?

У цьому випадку цю роботу можуть зробити наступні:

/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 localhost (хост) на порт 22 на VM. Як тільки VM запустився таким чином, ви можете отримати доступ до нього з localhost таким чином:

ssh vmuser@localhost -p10022

Команда -net nic ініціалізує дуже основну віртуальну мережеву карту інтерфейсу.


Так, ви маєте рацію, я намагаюся використовувати віріо-серіал для встановлення зв'язку від господаря до гостя. Віртуальний комп'ютер завантажився, попереджаючи на консолі хоста: 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-адреси, призначеної для першого завантаженого VM, якщо статичний IP не призначений. І тепер немає гостя в Інтернеті.
приєднатися

Що ви можете зробити, це зіставити порт 22, який використовується для ssh, на інший порт, а потім підключитись до нього з хост-машини для доступу до VM. Я відредагував свою відповідь прикладом.
mas_kur1

Відредагована відповідь прекрасно працює!
dbernard

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-запиту "як, чорт, я впадаю в qemu".
січня

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

1
Блискуче! Моя команда 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.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

4

Конфігурація OpenSSH перевірена на Buildroot 2016.05, QEMU 2.5.0, хості Ubuntu 16.04

Крім мережі переадресації QEMU, вам також потрібно правильно настроїти SSH, про що я розповім тут.

Почніть з qemu_x86_64_defconfigта ввімкніть пакет opensh:

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або Налаштування створеної цільової файлової системи | buildroot.orgBR2_ROOTFS_POST_BUILD_SCRIPT


-1

Я вважаю, що вам потрібно використовувати hostfwd=tcp::7777-:8001абоhostfwd=tcp::7777:8001

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.