Add CI builds

This commit is contained in:
Gytis Stoškevičius 2025-03-31 07:16:25 +00:00
parent 505ab90bc0
commit 5e4aede455
11 changed files with 360 additions and 251 deletions

View file

@ -4,24 +4,17 @@ set -Eeuo pipefail
# Docker environment variables
: "${MAC:=""}"
: "${MAC_2:=""}"
: "${DHCP:="N"}"
: "${NETWORK:="bridge"}"
: "${NETWORK:="Y"}"
: "${USER_PORTS:=""}"
: "${HOST_PORTS:=""}"
: "${ADAPTER:="virtio-net-pci"}"
: "${ADAPTER_2:="virtio-net-pci"}"
: "${VM_NET_DEV:="eth0"}"
: "${VM_NET_DEV_2:="eth1"}"
: "${VM_NET_DEV:=""}"
: "${VM_NET_TAP:="qemu"}"
: "${VM_NET_TAP_2:="qemu_2"}"
: "${VM_NET_MAC:="$MAC"}"
: "${VM_NET_MAC_2:="$MAC_2"}"
: "${VM_NET_HOST:="QEMU"}"
: "${VM_NET_HOST_2:="QEMU_2"}"
: "${VM_NET_IP:="192.168.0.101"}"
: "${VM_NET_IP_2:="192.168.1.101"}"
: "${VM_NET_IP:="20.20.20.21"}"
: "${DNSMASQ_OPTS:=""}"
: "${DNSMASQ:="/usr/sbin/dnsmasq"}"
@ -33,28 +26,106 @@ ADD_ERR="Please add the following setting to your container:"
# Functions
# ######################################
configureDHCP() {
# Create the necessary file structure for /dev/vhost-net
if [ ! -c /dev/vhost-net ]; then
if mknod /dev/vhost-net c 10 238; then
chmod 660 /dev/vhost-net
fi
fi
# Create a macvtap network for the VM guest
{
msg=$(ip link add link "$VM_NET_DEV" name "$VM_NET_TAP" address "$VM_NET_MAC" type macvtap mode bridge 2>&1)
rc=$?
} || :
case "$msg" in
"RTNETLINK answers: File exists"*)
while ! ip link add link "$VM_NET_DEV" name "$VM_NET_TAP" address "$VM_NET_MAC" type macvtap mode bridge; do
info "Waiting for macvtap interface to become available.."
sleep 5
done
;;
"RTNETLINK answers: Invalid argument"*)
error "Cannot create macvtap interface. Please make sure that the network type of the container is 'macvlan' and not 'ipvlan'."
return 1
;;
"RTNETLINK answers: Operation not permitted"*)
error "No permission to create macvtap interface. Please make sure that your host kernel supports it and that the NET_ADMIN capability is set."
return 1
;;
*)
[ -n "$msg" ] && echo "$msg" >&2
if ((rc != 0)); then
error "Cannot create macvtap interface."
return 1
fi
;;
esac
while ! ip link set "$VM_NET_TAP" up; do
info "Waiting for MAC address $VM_NET_MAC to become available..."
sleep 2
done
local TAP_NR TAP_PATH MAJOR MINOR
TAP_NR=$(</sys/class/net/"$VM_NET_TAP"/ifindex)
TAP_PATH="/dev/tap${TAP_NR}"
# Create dev file (there is no udev in container: need to be done manually)
IFS=: read -r MAJOR MINOR < <(cat /sys/devices/virtual/net/"$VM_NET_TAP"/tap*/dev)
((MAJOR < 1)) && error "Cannot find: sys/devices/virtual/net/$VM_NET_TAP" && return 1
[[ ! -e "$TAP_PATH" ]] && [[ -e "/dev0/${TAP_PATH##*/}" ]] && ln -s "/dev0/${TAP_PATH##*/}" "$TAP_PATH"
if [[ ! -e "$TAP_PATH" ]]; then
{
mknod "$TAP_PATH" c "$MAJOR" "$MINOR"
rc=$?
} || :
((rc != 0)) && error "Cannot mknod: $TAP_PATH ($rc)" && return 1
fi
{
exec 30>>"$TAP_PATH"
rc=$?
} 2>/dev/null || :
if ((rc != 0)); then
error "Cannot create TAP interface ($rc). $ADD_ERR --device-cgroup-rule='c *:* rwm'" && return 1
fi
{
exec 40>>/dev/vhost-net
rc=$?
} 2>/dev/null || :
if ((rc != 0)); then
error "VHOST can not be found ($rc). $ADD_ERR --device=/dev/vhost-net" && return 1
fi
NET_OPTS="-netdev tap,id=hostnet0,vhost=on,vhostfd=40,fd=30"
return 0
}
configureDNS() {
# Create lease file for faster resolve
echo "0 $VM_NET_MAC $VM_NET_IP $VM_NET_HOST 01:$VM_NET_MAC" >/var/lib/misc/dnsmasq.leases
echo "0 $VM_NET_MAC_2 $VM_NET_IP_2 $VM_NET_HOST_2 01:$VM_NET_MAC_2" >>/var/lib/misc/dnsmasq.leases
chmod 644 /var/lib/misc/dnsmasq.leases
# dnsmasq configuration:
# eth0 - Provides both DNS and Default Gateway
DNSMASQ_OPTS+=" --dhcp-range=$VM_NET_IP,$VM_NET_IP"
DNSMASQ_OPTS+=" --dhcp-host=$VM_NET_MAC,,$VM_NET_IP,$VM_NET_HOST,infinite"
DNSMASQ_OPTS+=" --dhcp-option=option:netmask,255.255.255.0"
DNSMASQ_OPTS+=" --dhcp-option=option:dns-server,${VM_NET_IP%.*}.1"
DNSMASQ_OPTS+=" --dhcp-range=$VM_NET_IP,$VM_NET_IP --dhcp-host=$VM_NET_MAC,,$VM_NET_IP,$VM_NET_HOST,infinite --dhcp-option=option:netmask,255.255.255.0"
# Create lease file for faster resolve
echo "0 $VM_NET_MAC $VM_NET_IP $VM_NET_HOST 01:$VM_NET_MAC" >/var/lib/misc/dnsmasq.leases
chmod 644 /var/lib/misc/dnsmasq.leases
# Set DNS server and gateway
DNSMASQ_OPTS+=" --dhcp-option=option:dns-server,${VM_NET_IP%.*}.1 --dhcp-option=option:router,${VM_NET_IP%.*}.1"
# Add DNS entry for container
DNSMASQ_OPTS+=" --address=/host.lan/${VM_NET_IP%.*}.1"
# eth1 - Provides only DNS, no default gateway
DNSMASQ_OPTS+=" --dhcp-range=$VM_NET_IP_2,$VM_NET_IP_2"
DNSMASQ_OPTS+=" --dhcp-host=$VM_NET_MAC_2,,$VM_NET_IP_2,$VM_NET_HOST_2,infinite"
DNSMASQ_OPTS+=" --dhcp-option=option:netmask,255.255.255.0"
DNSMASQ_OPTS+=" --dhcp-option=option:dns-server,${VM_NET_IP_2%.*}.1"
DNSMASQ_OPTS+=" --address=/host.lan/${VM_NET_IP_2%.*}.1"
# Cleanup and start dnsmasq
DNSMASQ_OPTS=$(echo "$DNSMASQ_OPTS" | sed 's/\t/ /g' | tr -s ' ' | sed 's/^ *//')
if ! $DNSMASQ ${DNSMASQ_OPTS:+ $DNSMASQ_OPTS}; then
@ -116,9 +187,6 @@ configureUser() {
forward=$(getUserPorts "$USER_PORTS")
[ -n "$forward" ] && NET_OPTS+=",$forward"
NET_OPTS+=" -netdev user,id=hostnet1,host=${VM_NET_IP_2%.*}.1,net=${VM_NET_IP_2%.*}.0/24,dhcpstart=$VM_NET_IP_2,hostname=$VM_NET_HOST_2"
[ -n "$forward" ] && NET_OPTS+=",$forward"
return 0
}
@ -161,14 +229,6 @@ configureNAT() {
error "Failed to create bridge. $ADD_ERR --cap-add NET_ADMIN" && return 1
fi
{
ip link add dev dockerbridge_2 type bridge
rc=$?
} || :
if ((rc != 0)); then
error "Failed to create bridge. $ADD_ERR --cap-add NET_ADMIN" && return 1
fi
if ! ip address add "${VM_NET_IP%.*}.1/24" broadcast "${VM_NET_IP%.*}.255" dev dockerbridge; then
error "Failed to add IP address!" && return 1
fi
@ -178,15 +238,6 @@ configureNAT() {
sleep 2
done
if ! ip address add "${VM_NET_IP_2%.*}.1/24" broadcast "${VM_NET_IP_2%.*}.255" dev dockerbridge_2; then
error "Failed to add IP address!" && return 1
fi
while ! ip link set dockerbridge_2 up; do
info "Waiting for IP address to become available..."
sleep 2
done
# QEMU Works with taps, set tap to the bridge created
if ! ip tuntap add dev "$VM_NET_TAP" mode tap; then
error "$tuntap" && return 1
@ -201,19 +252,6 @@ configureNAT() {
error "Failed to set IP link!" && return 1
fi
if ! ip tuntap add dev "$VM_NET_TAP_2" mode tap; then
error "$tuntap" && return 1
fi
while ! ip link set "$VM_NET_TAP_2" up promisc on; do
info "Waiting for TAP to become available..."
sleep 2
done
if ! ip link set dev "$VM_NET_TAP_2" master dockerbridge_2; then
error "Failed to set IP link!" && return 1
fi
# Add internet connection to the VM
update-alternatives --set iptables /usr/sbin/iptables-legacy >/dev/null
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy >/dev/null
@ -233,19 +271,6 @@ configureNAT() {
error "Failed to configure IP tables!" && return 1
fi
if ! iptables -t nat -A POSTROUTING -o "$VM_NET_DEV_2" -j MASQUERADE; then
error "$tables" && return 1
fi
# shellcheck disable=SC2086
if ! iptables -t nat -A PREROUTING -i "$VM_NET_DEV_2" -d "$IP_2" -p tcp${exclude} -j DNAT --to "$VM_NET_IP_2"; then
error "Failed to configure IP tables!" && return 1
fi
if ! iptables -t nat -A PREROUTING -i "$VM_NET_DEV_2" -d "$IP_2" -p udp -j DNAT --to "$VM_NET_IP_2"; then
error "Failed to configure IP tables!" && return 1
fi
if ((KERNEL > 4)); then
# Hack for guest VMs complaining about "bad udp checksums in 5 packets"
iptables -A POSTROUTING -t mangle -p udp --dport bootpc -j CHECKSUM --checksum-fill >/dev/null 2>&1 || true
@ -263,24 +288,11 @@ configureNAT() {
NET_OPTS+=",script=no,downscript=no"
NET_OPTS+=" -netdev tap,id=hostnet1,ifname=$VM_NET_TAP_2"
if [ -c /dev/vhost-net ]; then
{
exec 41>>/dev/vhost-net
rc=$?
} 2>/dev/null || :
((rc == 0)) && NET_OPTS+=",vhost=on,vhostfd=41"
fi
NET_OPTS+=",script=no,downscript=no"
configureDNS || return 1
return 0/
return 0
}
configureBridge() {
local tuntap="TUN device is missing. $ADD_ERR --device /dev/net/tun"
@ -320,21 +332,21 @@ configureBridge() {
error "Failed to create bridge. $ADD_ERR --cap-add NET_ADMIN" && return 1
fi
{
ip link add dev dockerbridge_2 type bridge
rc=$?
} || :
if ((rc != 0)); then
error "Failed to create bridge. $ADD_ERR --cap-add NET_ADMIN" && return 1
fi
# {
# ip link add dev dockerbridge_2 type bridge
# rc=$?
# } || :
# if ((rc != 0)); then
# error "Failed to create bridge. $ADD_ERR --cap-add NET_ADMIN" && return 1
# fi
# We need freshly created bridge to have IP address of the container
# For this reason we need to migrate IP from eth0 to dockerbridge.
for addr in $(ip --json addr show dev $VM_NET_DEV | jq -c '.[0].addr_info[] | select(.family == "inet")'); do
cidr_addr=$(echo $addr | jq -r '[ .local, .prefixlen|tostring] | join("/")');
cidr_addr=$(echo $addr | jq -r '[ .local, .prefixlen|tostring] | join("/")')
if ! ip addr add dev dockerbridge $cidr_addr; then
error "Failed to add address for dockerbridge interface"
exit 30
error "Failed to add address for dockerbridge interface"
exit 30
fi
done
if ! ip addr flush dev $VM_NET_DEV; then
@ -347,24 +359,24 @@ configureBridge() {
sleep 2
done
# We need freshly created bridge to have IP address of the container
# For this reason we need to migrate IP from eth0 to dockerbridge.
for addr in $(ip --json addr show dev $VM_NET_DEV_2 | jq -c '.[0].addr_info[] | select(.family == "inet")'); do
cidr_addr=$(echo $addr | jq -r '[ .local, .prefixlen|tostring] | join("/")');
if ! ip addr add dev dockerbridge_2 $cidr_addr; then
error "Failed to add address for dockerbridge_2 interface"
exit 30
fi
done
if ! ip addr flush dev $VM_NET_DEV_2; then
error "Failed to clear $VM_NET_DEV_2 interface addresses"
exit 30
fi
# # We need freshly created bridge to have IP address of the container
# # For this reason we need to migrate IP from eth0 to dockerbridge.
# for addr in $(ip --json addr show dev $VM_NET_DEV_2 | jq -c '.[0].addr_info[] | select(.family == "inet")'); do
# cidr_addr=$(echo $addr | jq -r '[ .local, .prefixlen|tostring] | join("/")')
# if ! ip addr add dev dockerbridge_2 $cidr_addr; then
# error "Failed to add address for dockerbridge_2 interface"
# exit 30
# fi
# done
# if ! ip addr flush dev $VM_NET_DEV_2; then
# error "Failed to clear $VM_NET_DEV_2 interface addresses"
# exit 30
# fi
while ! ip link set dockerbridge_2 up; do
info "Waiting for IP address to become available..."
sleep 2
done
# while ! ip link set dockerbridge_2 up; do
# info "Waiting for IP address to become available..."
# sleep 2
# done
# QEMU Works with taps, set tap to the bridge created
if ! ip tuntap add dev "$VM_NET_TAP" mode tap; then
@ -384,18 +396,18 @@ configureBridge() {
error "Failed to attach docker interface to bridge"
fi
if ! ip tuntap add dev "$VM_NET_TAP_2" mode tap; then
error "$tuntap" && return 1
fi
# if ! ip tuntap add dev "$VM_NET_TAP_2" mode tap; then
# error "$tuntap" && return 1
# fi
while ! ip link set "$VM_NET_TAP_2" up promisc on; do
info "Waiting for TAP to become available..."
sleep 2
done
# while ! ip link set "$VM_NET_TAP_2" up promisc on; do
# info "Waiting for TAP to become available..."
# sleep 2
# done
if ! ip link set dev "$VM_NET_TAP_2" master dockerbridge_2; then
error "Failed to set IP link!" && return 1
fi
# if ! ip link set dev "$VM_NET_TAP_2" master dockerbridge_2; then
# error "Failed to set IP link!" && return 1
# fi
# add initial default route as well
if ! ip route add default dev dockerbridge via ${VM_NET_IP%.*}.1; then
@ -414,17 +426,17 @@ configureBridge() {
NET_OPTS+=",script=no,downscript=no"
NET_OPTS+=" -netdev tap,id=hostnet1,ifname=$VM_NET_TAP_2"
# NET_OPTS+=" -netdev tap,id=hostnet1,ifname=$VM_NET_TAP_2"
if [ -c /dev/vhost-net ]; then
{
exec 41>>/dev/vhost-net
rc=$?
} 2>/dev/null || :
((rc == 0)) && NET_OPTS+=",vhost=on,vhostfd=41"
fi
# if [ -c /dev/vhost-net ]; then
# {
# exec 41>>/dev/vhost-net
# rc=$?
# } 2>/dev/null || :
# ((rc == 0)) && NET_OPTS+=",vhost=on,vhostfd=41"
# fi
NET_OPTS+=",script=no,downscript=no"
# NET_OPTS+=",script=no,downscript=no"
return 0
@ -438,15 +450,13 @@ closeNetwork() {
[[ "$NETWORK" == [Nn]* ]] && return 0
exec 30<&- || true
exec 40<&- || true
exec 41<&- || true
if [[ "$DHCP" == [Yy1]* ]]; then
ip link set "$VM_NET_TAP" down || true
ip link delete "$VM_NET_TAP" || true
ip link set "$VM_NET_TAP_2" down || true
ip link delete "$VM_NET_TAP_2" || true
else
@ -457,13 +467,9 @@ closeNetwork() {
ip link set "$VM_NET_TAP" down promisc off || true
ip link delete "$VM_NET_TAP" || true
ip link set "$VM_NET_TAP_2" down promisc off || true
ip link delete "$VM_NET_TAP_2" || true
ip link set dockerbridge down || true
ip link delete dockerbridge || true
ip link set dockerbridge_2 down || true
ip link delete dockerbridge_2 || true
fi
@ -494,22 +500,28 @@ checkOS() {
getInfo() {
if [ -z "$VM_NET_DEV" ]; then
# Give Kubernetes priority over the default interface
[ -d "/sys/class/net/net0" ] && VM_NET_DEV="net0"
[ -d "/sys/class/net/net1" ] && VM_NET_DEV="net1"
[ -d "/sys/class/net/net2" ] && VM_NET_DEV="net2"
[ -d "/sys/class/net/net3" ] && VM_NET_DEV="net3"
# Automaticly detect the default network interface
[ -z "$VM_NET_DEV" ] && VM_NET_DEV=$(awk '$2 == 00000000 { print $1 }' /proc/net/route)
[ -z "$VM_NET_DEV" ] && VM_NET_DEV="eth0"
fi
if [ ! -d "/sys/class/net/$VM_NET_DEV" ]; then
error "Network interface '$VM_NET_DEV' does not exist inside the container!"
error "$ADD_ERR -e \"VM_NET_DEV=NAME\" to specify another interface name." && exit 27
fi
if [ ! -d "/sys/class/net/$VM_NET_DEV_2" ]; then
error "Network interface '$VM_NET_DEV_2' does not exist inside the container!"
error "$ADD_ERR -e \"VM_NET_DEV_2=NAME\" to specify another interface name." && exit 27
fi
if [ -z "$MAC" ]; then
local file="$STORAGE/$PROCESS.mac"
[ -s "$file" ] && MAC=$(<"$file")
if [ -z "$MAC" ]; then
# Generate MAC address based on Docker container ID in hostname
MAC=$(printf '02:%02x:%02x:%02x:%02x:%02x\n' \
$((RANDOM % 256)) $((RANDOM % 256)) $((RANDOM % 256)) $((RANDOM % 256)) $((RANDOM % 256)))
MAC=$(echo "$HOST" | md5sum | sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
echo "${MAC^^}" >"$file"
fi
fi
@ -526,34 +538,9 @@ getInfo() {
error "Invalid MAC address: '$VM_NET_MAC', should be 12 or 17 digits long!" && exit 28
fi
if [ -z "$MAC_2" ]; then
local file="$STORAGE/$PROCESS.mac"
if [ -z "$MAC_2" ]; then
# Generate MAC address based on Docker container ID in hostname
MAC_2=$(printf '02:%02x:%02x:%02x:%02x:%02x\n' \
$((RANDOM % 256)) $((RANDOM % 256)) $((RANDOM % 256)) $((RANDOM % 256)) $((RANDOM % 256)))
echo "${MAC_2^^}" >>"$file"
fi
fi
VM_NET_MAC_2="${MAC_2^^}"
VM_NET_MAC_2="${VM_NET_MAC_2//-/:}"
if [[ ${#VM_NET_MAC_2} == 12 ]]; then
m="$VM_NET_MAC_2"
VM_NET_MAC_2="${m:0:2}:${m:2:2}:${m:4:2}:${m:6:2}:${m:8:2}:${m:10:2}"
fi
if [[ ${#VM_NET_MAC_2} != 17 ]]; then
error "Invalid MAC address: '$VM_NET_MAC_2', should be 12 or 17 digits long!" && exit 28
fi
GATEWAY=$(ip route list dev "$VM_NET_DEV" | awk ' /^default/ {print $3}')
IP=$(ip address show dev "$VM_NET_DEV" | grep inet | awk '/inet / { print $2 }' | cut -f1 -d/)
GATEWAY_2=$(ip route list dev "$VM_NET_DEV_2" | awk ' /^default/ {print $3}')
IP_2=$(ip address show dev "$VM_NET_DEV_2" | grep inet | awk '/inet / { print $2 }' | cut -f1 -d/)
return 0
}
@ -574,67 +561,83 @@ if [[ "$DEBUG" == [Yy1]* ]]; then
[ -f /etc/resolv.conf ] && grep '^nameserver*' /etc/resolv.conf
echo
fi
if [[ "$DEBUG" == [Yy1]* ]]; then
info "Host: $HOST IP: $IP_2 Gateway: $GATEWAY_2 Interface: $VM_NET_DEV_2 MAC: $VM_NET_MAC_2"
[ -f /etc/resolv.conf ] && grep '^nameserver*' /etc/resolv.conf
echo
fi
if [[ "$IP" != "172."* ]] && [[ "$IP" != "10.8"* ]] && [[ "$IP" != "10.9"* ]]; then
if [[ "$DHCP" == [Yy1]* ]]; then
checkOS
fi
if [[ "${NETWORK,,}" == "user"* ]]; then
# Configure for usermode networking (slirp)
configureUser || exit 24
elif [[ "${NETWORK,,}" == "bridge"* ]]; then
# CONFIGURE Bridge
html "Configuring bridged network"
if ! configureBridge; then
error "Failed to setup bridge networking"
ip link set "$VM_NET_TAP" down promisc off &>null || true
ip link delete "$VM_NET_TAP" &>null || true
ip link set "$VM_NET_TAP_2" down promisc off &>null || true
ip link delete "$VM_NET_TAP_2" &>null || true
ip link set dockerbridge down &>null || true
ip link delete dockerbridge &>null || true
ip link set dockerbridge_2 down &>null || true
ip link delete dockerbridge_2 &>null || true
exit 25
if [[ "$IP" == "172."* ]]; then
warn "container IP starts with 172.* which is often a sign that you are not on a macvlan network (required for DHCP)!"
fi
# Configure for macvtap interface
configureDHCP || exit 20
else
# Configure for tap interface
if ! configureNAT; then
if [[ "$IP" != "172."* ]] && [[ "$IP" != "10.8"* ]] && [[ "$IP" != "10.9"* ]]; then
checkOS
fi
error "Failed to setup NAT networking"
if [[ "${NETWORK,,}" == [Yy1]* ]]; then
ip link set "$VM_NET_TAP" down promisc off &>null || true
ip link delete "$VM_NET_TAP" &>null || true
ip link set "$VM_NET_TAP_2" down promisc off &>null || true
ip link delete "$VM_NET_TAP_2" &>null || true
# Configure for tap interface
if ! configureNAT; then
ip link set dockerbridge down &>null || true
ip link delete dockerbridge &>null || true
ip link set dockerbridge_2 down &>null || true
ip link delete dockerbridge_2 &>null || true
NETWORK="user"
warn "falling back to usermode networking! Performance will be bad and port mapping will not work."
exit 25
ip link set "$VM_NET_TAP" down promisc off &>null || true
ip link delete "$VM_NET_TAP" &>null || true
ip link set dockerbridge down &>null || true
ip link delete dockerbridge &>null || true
fi
fi
if [[ "${NETWORK,,}" == "user"* ]]; then
# Configure for usermode networking (slirp)
configureUser || exit 24
fi
if [[ "${NETWORK,,}" == "bridge"* ]]; then
# Configure for usermode networking (slirp)
# CONFIGURE Bridge
html "Configuring bridged network"
if ! configureBridge; then
error "Failed to setup bridge networking"
ip link set "$VM_NET_TAP" down promisc off &>null || true
ip link delete "$VM_NET_TAP" &>null || true
# ip link set "$VM_NET_TAP_2" down promisc off &>null || true
# ip link delete "$VM_NET_TAP_2" &>null || true
ip link set dockerbridge down &>null || true
ip link delete dockerbridge &>null || true
# ip link set dockerbridge_2 down &>null || true
# ip link delete dockerbridge_2 &>null || true
exit 25
fi
fi
fi
NET_OPTS+=" -device $ADAPTER,romfile=,netdev=hostnet0,mac=$VM_NET_MAC,id=net0"
NET_OPTS+=" -device $ADAPTER_2,romfile=,netdev=hostnet1,mac=$VM_NET_MAC_2,id=net1"
# NET_OPTS+=" -device $ADAPTER_2,romfile=,netdev=hostnet1,mac=$VM_NET_MAC_2,id=net1"
NET_OPTS+=" -device virtio-serial-pci,id=virtserial0,bus=pcie.0,addr=0x6"
NET_OPTS+=" -chardev socket,id=qga0,path=/tmp/qga.sock,server=on,wait=off"
NET_OPTS+=" -device virtio-serial"
NET_OPTS+=" -device virtserialport,chardev=qga0,name=org.qemu.guest_agent.0"
html "Initialized network successfully..."
return 0