Create VM in google cloud:
gcloud compute instances create $INSTANCE --image-project=ubuntu-os-cloud --image-family ubuntu-2004-lts --min-cpu-platform="Intel Skylake" --machine-type="n1-standard-32" --zone=us-central1-c --network-interface='' --network-interface network=custom-network1,subnet=subnet1
Install libvirt:
sudo apt update && sudo apt install libvirt-daemon-system libvirt-clients virtinst
After installing libvirt. New interfaces virtbr0
and virtbr0-nic
will be created:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc mq state UP group default qlen 1000
link/ether 42:01:0a:80:00:4a brd ff:ff:ff:ff:ff:ff
altname enp0s4
inet 10.128.0.74/32 scope global dynamic ens4
valid_lft 3482sec preferred_lft 3482sec
inet6 2600:2d00:4004:3943:a80:4a::/128 scope global dynamic noprefixroute
valid_lft 3485sec preferred_lft 3485sec
inet6 fe80::4001:aff:fe80:4a/64 scope link
valid_lft forever preferred_lft forever
3: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc mq state UP group default qlen 1000
link/ether 42:01:0a:0a:00:38 brd ff:ff:ff:ff:ff:ff
altname enp0s5
inet 10.10.0.56/32 brd 10.10.0.56 scope global dynamic ens5
valid_lft 3498sec preferred_lft 3498sec
inet6 fe80::4001:aff:fe0a:38/64 scope link
valid_lft forever preferred_lft forever
4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:81:2d:68 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN group default qlen 1000
link/ether 52:54:00:81:2d:68 brd ff:ff:ff:ff:ff:ff
# Define ETH1 to be the interface to bridge for macvtap.
ETH1=eth1
cat > macvtap-net.xml <<EOF
<network>
<name>macvtap-net</name>
<forward mode="bridge">
<interface dev="$ETH1"/>
</forward>
</network>
EOF
virsh net-define ./macvtap-net.xml
virsh net-autostart macvtap-net
virsh net-start macvtap-net
# list should show the new net
virsh net-list
Name State Autostart Persistent
------------------------------------------------
default active yes yes
macvtap-net active yes yes
The following command will take quite a while to run and install the OS:
virt-install --name=cirros --ram=256 --vcpus=1 --disk path=./cirros-0.3.2-x86_64-disk.img,format=qcow2,size=2 --import --network network:macvtap-net,model=virtio --vnc
Then there will be a new interface:
6: macvtap0@ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc fq_codel state UP mode DEFAULT group default qlen 500
link/ether 52:54:00:fd:d9:f1 brd ff:ff:ff:ff:ff:ff
The device file is /dev/tap6
. lsof result shows that qemu opens the file.
lsof /dev/tap6
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
qemu-syst 8441 libvirt-qemu 33u CHR 238,1 0t0 403 /dev/tap6
# systemd-cgls # shows that it's managed under machine.slice.
└─machine.slice
└─machine-qemu\x2d2\x2dcirros.scope …
└─8441 /usr/bin/qemu-system-x86_64 -name guest=cirros,debug-threads=on -S -object secret,id=masterKey0,format=raw,file=/var/lib/libvirt/qemu/domain-2-cirros/master-key.aes -machine pc-i440fx-focal,accel=tcg,usb=off,dump-guest-core=off ->