SLiRP support in runqemu

runqemu script now takes argument "slirp" in order to
run networking on the qemu machine, without root privileges.

changed the runqemu-internal script in order not to activate
the tap devices if the option is set.

[YOCTO #1474]

(From OE-Core rev: fa7fd7b1cbcfbd01af1949d2ea09b880a0ae0175)

Signed-off-by: Andrei Dinu <andrei.adrianx.dinu@intel.com>
Signed-off-by: Saul Wold <sgw@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Andrei Dinu 2013-05-20 16:16:30 +03:00 committed by Richard Purdie
parent 600f4e38ad
commit 52c9f6650f
2 changed files with 149 additions and 124 deletions

View File

@ -173,6 +173,9 @@ while true; do
KVM_ENABLED="yes"
KVM_CAPABLE=`grep -q 'vmx\|svm' /proc/cpuinfo && echo 1`
;;
"slirp")
SLIRP_ENABLED="yes"
;;
"publicvnc")
SCRIPT_QEMU_OPT="$SCRIPT_QEMU_OPT -vnc 0.0.0.0:0"
;;

View File

@ -104,135 +104,152 @@ fi
NFSRUNNING="false"
acquire_lock() {
lockfile=$1
if [ -z "$lockfile" ]; then
echo "Error: missing lockfile arg passed to acquire_lock()"
return 1
if [ "$SLIRP_ENABLED" = "yes" ]; then
KERNEL_NETWORK_CMD=""
QEMU_TAP_CMD=""
QEMU_UI_OPTIONS="-show-cursor -usb -usbdevice wacom-tablet"
if [ "$KVM_ACTIVE" = "yes" ]; then
QEMU_NETWORK_CMD=""
DROOT="/dev/vda"
ROOTFS_OPTIONS="-drive file=$ROOTFS,if=virtio"
else
QEMU_NETWORK_CMD=""
DROOT="/dev/hda"
ROOTFS_OPTIONS="-hda $ROOTFS"
fi
touch $lockfile.lock
exec 8>$lockfile.lock
flock -n -x 8
if [ $? -ne 0 ]; then
exec 8>&-
return 1
fi
return 0
}
release_lock() {
lockfile=$1
if [ -z "$lockfile" ]; then
echo "Error: missing lockfile arg passed to release_lock()"
return 1
fi
rm -f $lockfile.lock
exec 8>&-
}
LOCKDIR="/tmp/qemu-tap-locks"
if [ ! -d "$LOCKDIR" ]; then
mkdir $LOCKDIR
chmod 777 $LOCKDIR
fi
IFCONFIG=`which ip 2> /dev/null`
if [ -z "$IFCONFIG" ]; then
IFCONFIG=/sbin/ip
fi
if [ ! -x "$IFCONFIG" ]; then
echo "$IFCONFIG cannot be executed"
exit 1
fi
POSSIBLE=`$IFCONFIG link | grep 'tap' | awk '{print $2}' | sed s/://`
TAP=""
LOCKFILE=""
for tap in $POSSIBLE; do
LOCKFILE="$LOCKDIR/$tap"
echo "Acquiring lockfile for $tap..."
acquire_lock $LOCKFILE
if [ $? -eq 0 ]; then
TAP=$tap
break
fi
done
if [ "$TAP" = "" ]; then
if [ -e "$NOSUDO_FLAG" ]; then
echo "Error: There are no available tap devices to use for networking,"
echo "and I see $NOSUDO_FLAG exists, so I am not going to try creating"
echo "a new one with sudo."
exit 1
fi
GROUPID=`id -g`
USERID=`id -u`
echo "Setting up tap interface under sudo"
# Redirect stderr since we could see a LD_PRELOAD warning here if pseudo is loaded
# but inactive. This looks scary but is harmless
tap=`sudo $QEMUIFUP $USERID $GROUPID $OECORE_NATIVE_SYSROOT 2> /dev/null`
if [ $? -ne 0 ]; then
# Re-run standalone to see verbose errors
sudo $QEMUIFUP $USERID $GROUPID $OECORE_NATIVE_SYSROOT
return 1
fi
LOCKFILE="$LOCKDIR/$tap"
echo "Acquiring lockfile for $tap..."
acquire_lock $LOCKFILE
if [ $? -eq 0 ]; then
TAP=$tap
fi
else
echo "Using preconfigured tap device '$TAP'"
fi
acquire_lock() {
lockfile=$1
if [ -z "$lockfile" ]; then
echo "Error: missing lockfile arg passed to acquire_lock()"
return 1
fi
cleanup() {
if [ ! -e "$NOSUDO_FLAG" ]; then
# Redirect stderr since we could see a LD_PRELOAD warning here if pseudo is loaded
# but inactive. This looks scary but is harmless
sudo $QEMUIFDOWN $TAP $OECORE_NATIVE_SYSROOT 2> /dev/null
fi
echo "Releasing lockfile of preconfigured tap device '$TAP'"
release_lock $LOCKFILE
touch $lockfile.lock
exec 8>$lockfile.lock
flock -n -x 8
if [ $? -ne 0 ]; then
exec 8>&-
return 1
fi
if [ "$NFSRUNNING" = "true" ]; then
echo "Shutting down the userspace NFS server..."
echo "runqemu-export-rootfs stop $ROOTFS"
runqemu-export-rootfs stop $ROOTFS
fi
# If QEMU crashes or somehow tty properties are not restored
# after qemu exits, we need to run stty sane
stty sane
}
return 0
}
n0=$(echo $TAP | sed 's/tap//')
n1=$(($n0 * 2 + 1))
n2=$(($n1 + 1))
release_lock() {
lockfile=$1
if [ -z "$lockfile" ]; then
echo "Error: missing lockfile arg passed to release_lock()"
return 1
fi
KERNEL_NETWORK_CMD="ip=192.168.7.$n2::192.168.7.$n1:255.255.255.0"
QEMU_TAP_CMD="-net tap,vlan=0,ifname=$TAP,script=no,downscript=no"
if [ "$KVM_ACTIVE" = "yes" ]; then
QEMU_NETWORK_CMD="-net nic,model=virtio $QEMU_TAP_CMD,vhost=on"
DROOT="/dev/vda"
ROOTFS_OPTIONS="-drive file=$ROOTFS,if=virtio"
else
QEMU_NETWORK_CMD="-net nic,vlan=0 $QEMU_TAP_CMD"
DROOT="/dev/hda"
ROOTFS_OPTIONS="-hda $ROOTFS"
fi
KERNCMDLINE="mem=$QEMU_MEMORY"
QEMU_UI_OPTIONS="-show-cursor -usb -usbdevice wacom-tablet"
rm -f $lockfile.lock
exec 8>&-
}
NFS_INSTANCE=`echo $TAP | sed 's/tap//'`
export NFS_INSTANCE
LOCKDIR="/tmp/qemu-tap-locks"
if [ ! -d "$LOCKDIR" ]; then
mkdir $LOCKDIR
chmod 777 $LOCKDIR
fi
SERIALOPTS=""
if [ "x$SERIAL_LOGFILE" != "x" ]; then
SERIALOPTS="-serial file:$SERIAL_LOGFILE"
IFCONFIG=`which ip 2> /dev/null`
if [ -z "$IFCONFIG" ]; then
IFCONFIG=/sbin/ip
fi
if [ ! -x "$IFCONFIG" ]; then
echo "$IFCONFIG cannot be executed"
exit 1
fi
POSSIBLE=`$IFCONFIG link | grep 'tap' | awk '{print $2}' | sed s/://`
TAP=""
LOCKFILE=""
for tap in $POSSIBLE; do
LOCKFILE="$LOCKDIR/$tap"
echo "Acquiring lockfile for $tap..."
acquire_lock $LOCKFILE
if [ $? -eq 0 ]; then
TAP=$tap
break
fi
done
if [ "$TAP" = "" ]; then
if [ -e "$NOSUDO_FLAG" ]; then
echo "Error: There are no available tap devices to use for networking,"
echo "and I see $NOSUDO_FLAG exists, so I am not going to try creating"
echo "a new one with sudo."
exit 1
fi
GROUPID=`id -g`
USERID=`id -u`
echo "Setting up tap interface under sudo"
# Redirect stderr since we could see a LD_PRELOAD warning here if pseudo is loaded
# but inactive. This looks scary but is harmless
tap=`sudo $QEMUIFUP $USERID $GROUPID $OECORE_NATIVE_SYSROOT 2> /dev/null`
if [ $? -ne 0 ]; then
# Re-run standalone to see verbose errors
sudo $QEMUIFUP $USERID $GROUPID $OECORE_NATIVE_SYSROOT
return 1
fi
LOCKFILE="$LOCKDIR/$tap"
echo "Acquiring lockfile for $tap..."
acquire_lock $LOCKFILE
if [ $? -eq 0 ]; then
TAP=$tap
fi
else
echo "Using preconfigured tap device '$TAP'"
fi
cleanup() {
if [ ! -e "$NOSUDO_FLAG" ]; then
# Redirect stderr since we could see a LD_PRELOAD warning here if pseudo is loaded
# but inactive. This looks scary but is harmless
sudo $QEMUIFDOWN $TAP $OECORE_NATIVE_SYSROOT 2> /dev/null
fi
echo "Releasing lockfile of preconfigured tap device '$TAP'"
release_lock $LOCKFILE
if [ "$NFSRUNNING" = "true" ]; then
echo "Shutting down the userspace NFS server..."
echo "runqemu-export-rootfs stop $ROOTFS"
runqemu-export-rootfs stop $ROOTFS
fi
# If QEMU crashes or somehow tty properties are not restored
# after qemu exits, we need to run stty sane
stty sane
}
n0=$(echo $TAP | sed 's/tap//')
n1=$(($n0 * 2 + 1))
n2=$(($n1 + 1))
KERNEL_NETWORK_CMD="ip=192.168.7.$n2::192.168.7.$n1:255.255.255.0"
QEMU_TAP_CMD="-net tap,vlan=0,ifname=$TAP,script=no,downscript=no"
if [ "$KVM_ACTIVE" = "yes" ]; then
QEMU_NETWORK_CMD="-net nic,model=virtio $QEMU_TAP_CMD,vhost=on"
DROOT="/dev/vda"
ROOTFS_OPTIONS="-drive file=$ROOTFS,if=virtio"
else
QEMU_NETWORK_CMD="-net nic,vlan=0 $QEMU_TAP_CMD"
DROOT="/dev/hda"
ROOTFS_OPTIONS="-hda $ROOTFS"
fi
KERNCMDLINE="mem=$QEMU_MEMORY"
QEMU_UI_OPTIONS="-show-cursor -usb -usbdevice wacom-tablet"
NFS_INSTANCE=`echo $TAP | sed 's/tap//'`
export NFS_INSTANCE
SERIALOPTS=""
if [ "x$SERIAL_LOGFILE" != "x" ]; then
SERIALOPTS="-serial file:$SERIAL_LOGFILE"
fi
fi
case "$MACHINE" in
@ -414,7 +431,11 @@ if [ "$MACHINE" = "qemuppc" ]; then
MACHINE_SUBTYPE=mac99
CPU_SUBTYPE=G4
QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS"
QEMU_NETWORK_CMD="-net nic,model=pcnet $QEMU_TAP_CMD"
if [ "$SLIRP_ENABLED" = "yes" ]; then
QEMU_NETWORK_CMD=""
else
QEMU_NETWORK_CMD="-net nic,model=pcnet $QEMU_TAP_CMD"
fi
if [ "${FSTYPE:0:3}" = "ext" -o "$FSTYPE" = "btrfs" ]; then
KERNCMDLINE="root=/dev/hda rw console=ttyS0 console=tty $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
QEMUOPTIONS="$QEMU_NETWORK_CMD -cpu $CPU_SUBTYPE -M $MACHINE_SUBTYPE -hda $ROOTFS -no-reboot $QEMU_UI_OPTIONS"
@ -560,12 +581,13 @@ elif [ "$FSTYPE" = "iso" ]; then
echo $QEMUBIN $QEMUOPTIONS $SERIALOPTS -no-reboot $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT
LD_PRELOAD="$GL_LD_PRELOAD" $QEMUBIN $QEMUOPTIONS $SERIALOPTS -no-reboot $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT
else
echo $QEMUBIN -kernel $KERNEL $QEMUOPTIONS $SERIALOPTS -no-reboot $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT --append '"'$KERNCMDLINE $SCRIPT_KERNEL_OPT'"'
echo $QEMUBIN -kernel $KERNEL $QEMUOPTIONS $SLIRP_CMD $SERIALOPTS -no-reboot $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT --append '"'$KERNCMDLINE $SCRIPT_KERNEL_OPT'"'
LD_PRELOAD="$GL_LD_PRELOAD" $QEMUBIN -kernel $KERNEL $QEMUOPTIONS $SERIALOPTS -no-reboot $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT --append "$KERNCMDLINE $SCRIPT_KERNEL_OPT"
fi
ret=$?
cleanup
if [ "$SLIRP_ENABLED" != "yes" ]; then
cleanup
fi
trap - INT TERM QUIT