mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2024-08-22 07:51:16 +00:00
Having the virtual IOMMU created with --iommu is one thing, but we also need a way to decide if a virtio-blk device should be attached to this virtual IOMMU or not. That's why we introduce an extra option "iommu" with the value "on" or "off". By default, the device is not attached, which means "iommu=off". One side effect of this new option is that we had to introduce a new option for the disk path, simply called "path=". Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
176 lines
7.0 KiB
Markdown
176 lines
7.0 KiB
Markdown
# How to use networking
|
|
|
|
cloud-hypervisor can emulate one or more virtual network interfaces, represented at the hypervisor host by [tap devices](https://www.kernel.org/doc/Documentation/networking/tuntap.txt"). This guide briefly describes, in a manual and distribution neutral way, how to setup and use networking with cloud-hypevisor.
|
|
|
|
## Start cloud-hypervisor with net devices
|
|
|
|
Use one `--net` command-line argument from cloud-hypervisor to specify the emulation of one or more virtual NIC's. The example below instructs cloud-hypervisor to emulate for instance 2 virtual NIC's:
|
|
|
|
```bash
|
|
./cloud-hypervisor \
|
|
--cpus 4 \
|
|
--memory "size=512M" \
|
|
--disk path=my-root-disk.img \
|
|
--kernel my-vmlinux.bin \
|
|
--cmdline "console=ttyS0 reboot=k panic=1 nomodules root=/dev/vda3" \
|
|
--net tap=ich0,mac=a4:a1:c2:00:00:01,ip=192.168.4.2,mask=255.255.255.0 \
|
|
tap=ich1,mac=a4:a1:c2:00:00:02,ip=10.0.1.2,mask=255.255.255.0
|
|
```
|
|
|
|
The `--net` argument takes 1 or more space-separated strings of key value pairs containing the following 4 keys or fields:
|
|
|
|
| Name | Purpose | Optional |
|
|
| -------- |----------------------------| ----------|
|
|
| tap | tap device name | Yes |
|
|
| mac | vNIC mac address | Yes |
|
|
| ip | tap IP IP address | yes |
|
|
| mask | tap IP netmask | Yes |
|
|
|
|
## Configure the tap devices
|
|
|
|
After starting cloud-hypervisor as shown above, 2 tap devices with state down will become available at the host:
|
|
|
|
```bash
|
|
root@host:~# ip link show ich0
|
|
78: ich0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
|
|
link/ether 72:54:12:ff:ce:6f brd ff:ff:ff:ff:ff:ff
|
|
root@host:~# ip link show ich1
|
|
79: ich1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
|
|
link/ether 06:7a:fc:1b:9a:67 brd ff:ff:ff:ff:ff:ff
|
|
```
|
|
|
|
Set the tap devices to up state:
|
|
|
|
```bash
|
|
root@host:~# ip link set up ich0
|
|
root@host:~# ip link set up ich1
|
|
|
|
root@host:~# ip link show ich0
|
|
78: ich0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000
|
|
link/ether 72:54:12:ff:ce:6f brd ff:ff:ff:ff:ff:ff
|
|
root@host:~# ip link show ich1
|
|
79: ich1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000
|
|
link/ether 06:7a:fc:1b:9a:67 brd ff:ff:ff:ff:ff:ff
|
|
```
|
|
|
|
## Connect tap devices
|
|
|
|
Different networking models can be used to provide external connectivity. In this example we will
|
|
use 2 linux bridges emulating 2 different networks. The integration bridge (ich-int) in this example will also be used
|
|
for external connectivity.
|
|
|
|
Create the bridges and connect the cloud-hypervisor tap devices to the bridges:
|
|
|
|
```bash
|
|
root@host:~# brctl addbr ich-int
|
|
root@host:~# brctl addbr ich-dpl
|
|
root@host:~# ip link set up ich-int
|
|
root@host:~# ip link set up ich-dpl
|
|
root@host:~# brctl addif ich-int ich0
|
|
root@host:~# brctl addif ich-dpl ich1
|
|
root@host:~# brctl show
|
|
bridge name bridge id STP enabled interfaces
|
|
ich-dpl 8000.067afc1b9a67 no ich1
|
|
ich-int 8000.725412ffce6f no ich0
|
|
```
|
|
This completes the layer 2 wiring: The cloud-hypervisor is now connected to the hypervisor host via the 2 linux bridges.
|
|
|
|
## IP (Layer 3) provisioning
|
|
|
|
### Hypervisor host
|
|
|
|
On the hypervisor host add the network gateway IP address of each network to the 2 linux bridges:
|
|
|
|
```bash
|
|
root@host:~# ip addr add 192.168.4.1/24 dev ich-int
|
|
root@host:~# ip addr add 10.0.1.1/24 dev ich-dpl
|
|
```
|
|
The routing table of the hypervisor host should now also have corresponding routing entries:
|
|
|
|
```bash
|
|
root@host:~# route -n
|
|
Kernel IP routing table
|
|
Destination Gateway Genmask Flags Metric Ref Use Iface
|
|
0.0.0.0 192.168.178.1 0.0.0.0 UG 600 0 0 wlan1
|
|
10.0.1.0 0.0.0.0 255.255.255.0 U 0 0 0 ich-dpl
|
|
192.168.4.0 0.0.0.0 255.255.255.0 U 0 0 0 ich-int
|
|
192.168.178.0 0.0.0.0 255.255.255.0 U 600 0 0 wlan1
|
|
```
|
|
### Virtual Machine
|
|
|
|
Within the virtual machine set the vNIC's to up state and provision the corresponding IP addresses on the 2 vNIC's. The steps outlined below use the ip command as an example. Alternative distribution specific procedures can also apply.
|
|
|
|
```bash
|
|
root@guest:~# ip link set up enp0s2
|
|
root@guest:~# ip link set up enp0s3
|
|
root@guest:~# ip addr add 192.168.4.2/24 dev enp0s2
|
|
root@guest:~# ip addr add 10.0.1.2/24 dev enp0s3
|
|
```
|
|
|
|
IP connectivity between the virtual machine and the hypervisor-host can be verified by sending
|
|
ICMP requests to the hypervisor-host for the gateway IP address from within the virtual machine:
|
|
|
|
```bash
|
|
root@guest:~# ping 192.168.4.1
|
|
PING 192.168.4.1 (192.168.4.1) 56(84) bytes of data.
|
|
64 bytes from 192.168.4.1: icmp_seq=1 ttl=64 time=0.456 ms
|
|
64 bytes from 192.168.4.1: icmp_seq=2 ttl=64 time=0.226 ms
|
|
root@guest:~# ping 10.0.1.1
|
|
PING 10.0.1.1 (10.0.1.1) 56(84) bytes of data.
|
|
64 bytes from 10.0.1.1: icmp_seq=1 ttl=64 time=0.449 ms
|
|
64 bytes from 10.0.1.1: icmp_seq=2 ttl=64 time=0.393 ms
|
|
```
|
|
|
|
The connection can now be used for instance to log into the virtual machine with
|
|
ssh under the precondition that the machine has an ssh daemon provisioned:
|
|
|
|
```bash
|
|
root@host:~# ssh root@192.168.4.2
|
|
The authenticity of host '192.168.4.2 (192.168.4.2)' can't be established.
|
|
ECDSA key fingerprint is SHA256:qNAUmTtDMW9pNuZARkpLQhfw+Yc1tqUDBrQp7aZGSjw.
|
|
Are you sure you want to continue connecting (yes/no)? yes
|
|
Warning: Permanently added '192.168.4.2' (ECDSA) to the list of known hosts.
|
|
root@192.168.4.2's password:
|
|
Linux cloud-hypervisor 5.2.0 #2 SMP Thu Jul 11 08:08:16 CEST 2019 x86_64
|
|
|
|
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
|
|
permitted by applicable law.
|
|
|
|
|
|
Last login: Fri Jul 12 13:27:56 2019 from 192.168.4.1
|
|
root@guest:~#
|
|
```
|
|
|
|
## Internet connectivity
|
|
|
|
To enable internet connectivity a default gw and a nameserver has to be set within
|
|
the virtual machine:
|
|
|
|
```bash
|
|
root@guest:~# ip route add default via 192.168.4.1
|
|
root@guest:~# cat /etc/resolv.conf
|
|
options timeout:2
|
|
domain vallis.nl
|
|
search vallis.nl
|
|
nameserver 192.168.178.1
|
|
```
|
|
|
|
make sure that the default gateway of the hypervisor host (in this example host 192.168.178.1 which is an adsl router) has an entry in the routing table for the 192.168.4.0/24 network otherwise IP connectivity will not work.
|
|
|
|
```bash
|
|
root@guest:~# nslookup ftp.nl.debian.org
|
|
Server: 192.168.178.1
|
|
Address: 192.168.178.1#53
|
|
|
|
Non-authoritative answer:
|
|
cdn-fastly.deb.debian.org canonical name = prod.debian.map.fastly.net.
|
|
Name: prod.debian.map.fastly.net
|
|
Address: 151.101.36.204
|
|
|
|
root@guest:~# apt-get update
|
|
Ign:1 http://cdn-fastly.deb.debian.org/debian stretch InRelease
|
|
Get:2 http://cdn-fastly.deb.debian.org/debian stretch Release [118 kB]
|
|
Get:3 http://cdn-fastly.deb.debian.org/debian stretch Release.gpg [2434 B]
|
|
Fetched 120 kB in 1s (110 kB/s)
|
|
```
|