[OE-core] [PATCH] runqemu: Fix TAP='TUNSETGROUP: Invalid argument' by falling back to tunctl -u
Scott Garman
scott.a.garman at intel.com
Wed May 2 15:54:29 UTC 2012
On 05/02/2012 04:30 AM, Jason Wessel wrote:
> By default the runqemu script tries to set the group permissions on any
> tap device it creates. The TUNSETGROUP ioctl is not implemented on some
> popular host enterprise linux distributions.
Thanks for this, looks good to me without having done any testing on it.
Acked-by: Scott Garman <scott.a.garman at intel.com>
>
> Internally the script will exit as follows:
>
> ++ /opt/qemux86/bitbake_build/tmp/sysroots/x86_64-linux/usr/bin/tunctl -b -g 100
> + TAP='TUNSETGROUP: Invalid argument'
> + STATUS=1
> + '[' 1 -ne 0 ']'
> + echo 'tunctl failed:'
> tunctl failed:
> + echo TUNSETGROUP: Invalid argument
>
> This patch implements a fallback to using the userid as the owner of
> the tap device which is supported by all 2.6 kernels, the default remains
> to try and use the groupid first.
>
> Signed-off-by: Jason Wessel<jason.wessel at windriver.com>
> ---
> scripts/runqemu-ifup | 20 +++++++++++++-------
> scripts/runqemu-internal | 5 +++--
> 2 files changed, 16 insertions(+), 9 deletions(-)
>
> diff --git a/scripts/runqemu-ifup b/scripts/runqemu-ifup
> index f80538f..e4c3daf 100755
> --- a/scripts/runqemu-ifup
> +++ b/scripts/runqemu-ifup
> @@ -34,7 +34,7 @@
> # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>
> usage() {
> - echo "sudo $(basename $0)<gid> <native-sysroot-basedir>"
> + echo "sudo $(basename $0)<uid> <gid> <native-sysroot-basedir>"
> }
>
> if [ $EUID -ne 0 ]; then
> @@ -42,13 +42,14 @@ if [ $EUID -ne 0 ]; then
> exit 1
> fi
>
> -if [ $# -ne 2 ]; then
> +if [ $# -ne 3 ]; then
> usage
> exit 1
> fi
>
> -GROUP="-g $1"
> -NATIVE_SYSROOT_DIR=$2
> +USERID="-u $1"
> +GROUP="-g $2"
> +NATIVE_SYSROOT_DIR=$3
>
> TUNCTL=$NATIVE_SYSROOT_DIR/usr/bin/tunctl
> if [ ! -x "$TUNCTL" ]; then
> @@ -59,9 +60,14 @@ fi
> TAP=`$TUNCTL -b $GROUP 2>&1`
> STATUS=$?
> if [ $STATUS -ne 0 ]; then
> - echo "tunctl failed:"
> - echo $TAP
> - exit 1
> +# If tunctl -g fails, try using tunctl -u, for older host kernels
> +# which do not support the TUNSETGROUP ioctl
> + TAP=`$TUNCTL -b $USERID 2>&1`
> + STATUS=$?
> + if [ $STATUS -ne 0 ]; then
> + echo "tunctl failed:"
> + exit 1
> + fi
> fi
>
> IFCONFIG=`which ifconfig 2> /dev/null`
> diff --git a/scripts/runqemu-internal b/scripts/runqemu-internal
> index 1831a09..fb0d806 100755
> --- a/scripts/runqemu-internal
> +++ b/scripts/runqemu-internal
> @@ -173,13 +173,14 @@ if [ "$TAP" = "" ]; then
> 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 $GROUPID $OECORE_NATIVE_SYSROOT 2> /dev/null`
> + tap=`sudo $QEMUIFUP $USERID $GROUPID $OECORE_NATIVE_SYSROOT 2> /dev/null`
> if [ $? -ne 0 ]; then
> # Re-run standalone to see verbose errors
> - sudo $QEMUIFUP $GROUPID $OECORE_NATIVE_SYSROOT
> + sudo $QEMUIFUP $USERID $GROUPID $OECORE_NATIVE_SYSROOT
> return
> fi
> LOCKFILE="$LOCKDIR/$tap"
--
Scott Garman
Embedded Linux Engineer - Yocto Project
Intel Open Source Technology Center
More information about the Openembedded-core
mailing list