mirror of
https://github.com/qemu/qemu.git
synced 2026-02-17 05:45:07 +00:00
We don't ship the tarball and users should generally look to the distribution specific packaging. Resolves: https://gitlab.com/qemu-project/qemu/-/issues/560 Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-ID: <20250725154517.3523095-3-alex.bennee@linaro.org>
253 lines
9.5 KiB
ReStructuredText
253 lines
9.5 KiB
ReStructuredText
.. _Network_Emulation:
|
|
|
|
Network emulation
|
|
-----------------
|
|
|
|
QEMU can simulate several network cards (e.g. PCI or ISA cards on the PC
|
|
target) and can connect them to a network backend on the host or an
|
|
emulated hub. The various host network backends can either be used to
|
|
connect the NIC of the guest to a real network (e.g. by using a TAP
|
|
devices or the non-privileged user mode network stack), or to other
|
|
guest instances running in another QEMU process (e.g. by using the
|
|
socket host network backend).
|
|
|
|
Using TAP network interfaces
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
This is the standard way to connect QEMU to a real network. QEMU adds a
|
|
virtual network device on your host (called ``tapN``), and you can then
|
|
configure it as if it was a real ethernet card.
|
|
|
|
Linux host
|
|
^^^^^^^^^^
|
|
|
|
A distribution will generally provide specific helper scripts when it
|
|
packages QEMU. By default these are found at ``/etc/qemu-ifup`` and
|
|
``/etc/qemu-ifdown`` and are called appropriately when QEMU wants to
|
|
change the network state.
|
|
|
|
If QEMU is being run as a non-privileged user you may need properly
|
|
configure ``sudo`` so that network commands in the scripts can be
|
|
executed as root.
|
|
|
|
You must verify that your host kernel supports the TAP network
|
|
interfaces: the device ``/dev/net/tun`` must be present.
|
|
|
|
See :ref:`sec_005finvocation` to have examples of command
|
|
lines using the TAP network interfaces.
|
|
|
|
Windows host
|
|
^^^^^^^^^^^^
|
|
|
|
There is a virtual ethernet driver for Windows 2000/XP systems, called
|
|
TAP-Win32. But it is not included in standard QEMU for Windows, so you
|
|
will need to get it separately. It is part of OpenVPN package, so
|
|
download OpenVPN from : https://openvpn.net/.
|
|
|
|
Using the user mode network stack
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
By using the option ``-net user`` (default configuration if no ``-net``
|
|
option is specified), QEMU uses a completely user mode network stack
|
|
(you don't need root privilege to use the virtual network). The virtual
|
|
network configuration is the following::
|
|
|
|
guest (10.0.2.15) <------> Firewall/DHCP server <-----> Internet
|
|
| (10.0.2.2)
|
|
|
|
|
----> DNS server (10.0.2.3)
|
|
|
|
|
----> SMB server (10.0.2.4)
|
|
|
|
The QEMU VM behaves as if it was behind a firewall which blocks all
|
|
incoming connections. You can use a DHCP client to automatically
|
|
configure the network in the QEMU VM. The DHCP server assign addresses
|
|
to the hosts starting from 10.0.2.15.
|
|
|
|
In order to check that the user mode network is working, you can ping
|
|
the address 10.0.2.2 and verify that you got an address in the range
|
|
10.0.2.x from the QEMU virtual DHCP server.
|
|
|
|
Note that ICMP traffic in general does not work with user mode
|
|
networking. ``ping``, aka. ICMP echo, to the local router (10.0.2.2)
|
|
shall work, however. If you're using QEMU on Linux >= 3.0, it can use
|
|
unprivileged ICMP ping sockets to allow ``ping`` to the Internet. The
|
|
host admin has to set the ping_group_range in order to grant access to
|
|
those sockets. To allow ping for GID 100 (usually users group)::
|
|
|
|
echo 100 100 > /proc/sys/net/ipv4/ping_group_range
|
|
|
|
When using the built-in TFTP server, the router is also the TFTP server.
|
|
|
|
When using the ``'-netdev user,hostfwd=...'`` option, TCP or UDP
|
|
connections can be redirected from the host to the guest. It allows for
|
|
example to redirect X11, telnet or SSH connections.
|
|
|
|
Using passt as the user mode network stack
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
passt_ can be used as a simple replacement for SLIRP (``-net user``).
|
|
passt doesn't require any capability or privilege. passt has
|
|
better performance than ``-net user``, full IPv6 support and better security
|
|
as it's a daemon that is not executed in QEMU context.
|
|
|
|
passt_ can be used in the same way as the user backend (using ``-net passt``,
|
|
``-netdev passt`` or ``-nic passt``) or it can be launched manually and
|
|
connected to QEMU either by using a socket (``-netdev stream``) or by using
|
|
the vhost-user interface (``-netdev vhost-user``).
|
|
|
|
Using ``-netdev stream`` or ``-netdev vhost-user`` will allow the user to
|
|
enable functionalities not available through the passt backend interface
|
|
(like migration).
|
|
|
|
See `passt(1)`_ for more details on passt.
|
|
|
|
.. _passt: https://passt.top/
|
|
.. _passt(1): https://passt.top/builds/latest/web/passt.1.html
|
|
|
|
To use the passt backend interface
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
There is no need to start the daemon as QEMU will do it for you.
|
|
|
|
By default, passt will be started in the socket-based mode.
|
|
|
|
.. parsed-literal::
|
|
|qemu_system| [...OPTIONS...] -nic passt
|
|
|
|
(qemu) info network
|
|
e1000e.0: index=0,type=nic,model=e1000e,macaddr=52:54:00:12:34:56
|
|
\ #net071: index=0,type=passt,stream,connected to pid 24846
|
|
|
|
.. parsed-literal::
|
|
|qemu_system| [...OPTIONS...] -net nic -net passt,tcp-ports=10001,udp-ports=10001
|
|
|
|
(qemu) info network
|
|
hub 0
|
|
\ hub0port1: #net136: index=0,type=passt,stream,connected to pid 25204
|
|
\ hub0port0: e1000e.0: index=0,type=nic,model=e1000e,macaddr=52:54:00:12:34:56
|
|
|
|
.. parsed-literal::
|
|
|qemu_system| [...OPTIONS...] -netdev passt,id=netdev0 -device virtio-net,mac=9a:2b:2c:2d:2e:2f,id=virtio0,netdev=netdev0
|
|
|
|
(qemu) info network
|
|
virtio0: index=0,type=nic,model=virtio-net-pci,macaddr=9a:2b:2c:2d:2e:2f
|
|
\ netdev0: index=0,type=passt,stream,connected to pid 25428
|
|
|
|
To use the vhost-based interface, add the ``vhost-user=on`` parameter and
|
|
select the virtio-net device:
|
|
|
|
.. parsed-literal::
|
|
|qemu_system| [...OPTIONS...] -nic passt,model=virtio,vhost-user=on
|
|
|
|
(qemu) info network
|
|
virtio-net-pci.0: index=0,type=nic,model=virtio-net-pci,macaddr=52:54:00:12:34:56
|
|
\ #net006: index=0,type=passt,vhost-user,connected to pid 25731
|
|
|
|
To use socket based passt interface:
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
Start passt as a daemon::
|
|
|
|
passt --socket ~/passt.socket
|
|
|
|
If ``--socket`` is not provided, passt will print the path of the UNIX domain socket QEMU can connect to (``/tmp/passt_1.socket``, ``/tmp/passt_2.socket``,
|
|
...). Then you can connect your QEMU instance to passt:
|
|
|
|
.. parsed-literal::
|
|
|qemu_system| [...OPTIONS...] -device virtio-net-pci,netdev=netdev0 -netdev stream,id=netdev0,server=off,addr.type=unix,addr.path=~/passt.socket
|
|
|
|
Where ``~/passt.socket`` is the UNIX socket created by passt to
|
|
communicate with QEMU.
|
|
|
|
To use vhost-based interface:
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
Start passt with ``--vhost-user``::
|
|
|
|
passt --vhost-user --socket ~/passt.socket
|
|
|
|
Then to connect QEMU:
|
|
|
|
.. parsed-literal::
|
|
|qemu_system| [...OPTIONS...] -m $RAMSIZE -chardev socket,id=chr0,path=~/passt.socket -netdev vhost-user,id=netdev0,chardev=chr0 -device virtio-net,netdev=netdev0 -object memory-backend-memfd,id=memfd0,share=on,size=$RAMSIZE -numa node,memdev=memfd0
|
|
|
|
Where ``$RAMSIZE`` is the memory size of your VM ``-m`` and ``-object memory-backend-memfd,size=`` must match.
|
|
|
|
Migration of passt:
|
|
^^^^^^^^^^^^^^^^^^^
|
|
|
|
When passt is connected to QEMU using the vhost-user interface it can
|
|
be migrated with QEMU and the network connections are not interrupted.
|
|
|
|
As passt runs with no privileges, it relies on passt-repair to save and
|
|
load the TCP connections state, using the TCP_REPAIR socket option.
|
|
The passt-repair helper needs to have the CAP_NET_ADMIN capability, or run as root. If passt-repair is not available, TCP connections will not be preserved.
|
|
|
|
Example of migration of a guest on the same host
|
|
________________________________________________
|
|
|
|
Before being able to run passt-repair, the CAP_NET_ADMIN capability must be set
|
|
on the file, run as root::
|
|
|
|
setcap cap_net_admin+eip ./passt-repair
|
|
|
|
Start passt for the source side::
|
|
|
|
passt --vhost-user --socket ~/passt_src.socket --repair-path ~/passt-repair_src.socket
|
|
|
|
Where ``~/passt-repair_src.socket`` is the UNIX socket created by passt to
|
|
communicate with passt-repair. The default value is the ``--socket`` path
|
|
appended with ``.repair``.
|
|
|
|
Start passt-repair::
|
|
|
|
passt-repair ~/passt-repair_src.socket
|
|
|
|
Start source side QEMU with a monitor to be able to send the migrate command:
|
|
|
|
.. parsed-literal::
|
|
|qemu_system| [...OPTIONS...] [...VHOST USER OPTIONS...] -monitor stdio
|
|
|
|
Start passt for the destination side::
|
|
|
|
passt --vhost-user --socket ~/passt_dst.socket --repair-path ~/passt-repair_dst.socket
|
|
|
|
Start passt-repair::
|
|
|
|
passt-repair ~/passt-repair_dst.socket
|
|
|
|
Start QEMU with the ``-incoming`` parameter:
|
|
|
|
.. parsed-literal::
|
|
|qemu_system| [...OPTIONS...] [...VHOST USER OPTIONS...] -incoming tcp:localhost:4444
|
|
|
|
Then in the source guest monitor the migration can be started::
|
|
|
|
(qemu) migrate tcp:localhost:4444
|
|
|
|
A separate passt-repair instance must be started for every migration. In the case of a failed migration, passt-repair also needs to be restarted before trying
|
|
again.
|
|
|
|
Hubs
|
|
~~~~
|
|
|
|
QEMU can simulate several hubs. A hub can be thought of as a virtual
|
|
connection between several network devices. These devices can be for
|
|
example QEMU virtual ethernet cards or virtual Host ethernet devices
|
|
(TAP devices). You can connect guest NICs or host network backends to
|
|
such a hub using the ``-netdev
|
|
hubport`` or ``-nic hubport`` options. The legacy ``-net`` option also
|
|
connects the given device to the emulated hub with ID 0 (i.e. the
|
|
default hub) unless you specify a netdev with ``-net nic,netdev=xxx``
|
|
here.
|
|
|
|
Connecting emulated networks between QEMU instances
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Using the ``-netdev socket`` (or ``-nic socket`` or ``-net socket``)
|
|
option, it is possible to create emulated networks that span several
|
|
QEMU instances. See the description of the ``-netdev socket`` option in
|
|
:ref:`sec_005finvocation` to have a basic
|
|
example.
|