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:
parent
600f4e38ad
commit
52c9f6650f
|
@ -173,6 +173,9 @@ while true; do
|
||||||
KVM_ENABLED="yes"
|
KVM_ENABLED="yes"
|
||||||
KVM_CAPABLE=`grep -q 'vmx\|svm' /proc/cpuinfo && echo 1`
|
KVM_CAPABLE=`grep -q 'vmx\|svm' /proc/cpuinfo && echo 1`
|
||||||
;;
|
;;
|
||||||
|
"slirp")
|
||||||
|
SLIRP_ENABLED="yes"
|
||||||
|
;;
|
||||||
"publicvnc")
|
"publicvnc")
|
||||||
SCRIPT_QEMU_OPT="$SCRIPT_QEMU_OPT -vnc 0.0.0.0:0"
|
SCRIPT_QEMU_OPT="$SCRIPT_QEMU_OPT -vnc 0.0.0.0:0"
|
||||||
;;
|
;;
|
||||||
|
|
|
@ -104,135 +104,152 @@ fi
|
||||||
|
|
||||||
NFSRUNNING="false"
|
NFSRUNNING="false"
|
||||||
|
|
||||||
acquire_lock() {
|
if [ "$SLIRP_ENABLED" = "yes" ]; then
|
||||||
lockfile=$1
|
KERNEL_NETWORK_CMD=""
|
||||||
if [ -z "$lockfile" ]; then
|
QEMU_TAP_CMD=""
|
||||||
echo "Error: missing lockfile arg passed to acquire_lock()"
|
QEMU_UI_OPTIONS="-show-cursor -usb -usbdevice wacom-tablet"
|
||||||
return 1
|
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
|
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
|
else
|
||||||
echo "Using preconfigured tap device '$TAP'"
|
acquire_lock() {
|
||||||
fi
|
lockfile=$1
|
||||||
|
if [ -z "$lockfile" ]; then
|
||||||
|
echo "Error: missing lockfile arg passed to acquire_lock()"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
cleanup() {
|
touch $lockfile.lock
|
||||||
if [ ! -e "$NOSUDO_FLAG" ]; then
|
exec 8>$lockfile.lock
|
||||||
# Redirect stderr since we could see a LD_PRELOAD warning here if pseudo is loaded
|
flock -n -x 8
|
||||||
# but inactive. This looks scary but is harmless
|
if [ $? -ne 0 ]; then
|
||||||
sudo $QEMUIFDOWN $TAP $OECORE_NATIVE_SYSROOT 2> /dev/null
|
exec 8>&-
|
||||||
fi
|
return 1
|
||||||
echo "Releasing lockfile of preconfigured tap device '$TAP'"
|
fi
|
||||||
release_lock $LOCKFILE
|
|
||||||
|
|
||||||
if [ "$NFSRUNNING" = "true" ]; then
|
return 0
|
||||||
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//')
|
release_lock() {
|
||||||
n1=$(($n0 * 2 + 1))
|
lockfile=$1
|
||||||
n2=$(($n1 + 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"
|
rm -f $lockfile.lock
|
||||||
QEMU_TAP_CMD="-net tap,vlan=0,ifname=$TAP,script=no,downscript=no"
|
exec 8>&-
|
||||||
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//'`
|
LOCKDIR="/tmp/qemu-tap-locks"
|
||||||
export NFS_INSTANCE
|
if [ ! -d "$LOCKDIR" ]; then
|
||||||
|
mkdir $LOCKDIR
|
||||||
|
chmod 777 $LOCKDIR
|
||||||
|
fi
|
||||||
|
|
||||||
SERIALOPTS=""
|
IFCONFIG=`which ip 2> /dev/null`
|
||||||
if [ "x$SERIAL_LOGFILE" != "x" ]; then
|
if [ -z "$IFCONFIG" ]; then
|
||||||
SERIALOPTS="-serial file:$SERIAL_LOGFILE"
|
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
|
fi
|
||||||
|
|
||||||
case "$MACHINE" in
|
case "$MACHINE" in
|
||||||
|
@ -414,7 +431,11 @@ if [ "$MACHINE" = "qemuppc" ]; then
|
||||||
MACHINE_SUBTYPE=mac99
|
MACHINE_SUBTYPE=mac99
|
||||||
CPU_SUBTYPE=G4
|
CPU_SUBTYPE=G4
|
||||||
QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS"
|
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
|
if [ "${FSTYPE:0:3}" = "ext" -o "$FSTYPE" = "btrfs" ]; then
|
||||||
KERNCMDLINE="root=/dev/hda rw console=ttyS0 console=tty $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
|
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"
|
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
|
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
|
LD_PRELOAD="$GL_LD_PRELOAD" $QEMUBIN $QEMUOPTIONS $SERIALOPTS -no-reboot $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT
|
||||||
else
|
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"
|
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
|
fi
|
||||||
ret=$?
|
ret=$?
|
||||||
|
if [ "$SLIRP_ENABLED" != "yes" ]; then
|
||||||
cleanup
|
cleanup
|
||||||
|
fi
|
||||||
|
|
||||||
trap - INT TERM QUIT
|
trap - INT TERM QUIT
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue