[OE-core] [PATCH 5/5] runqemu: set default device and hostfwd for slirp

Robert Yang liezhi.yang at windriver.com
Tue Nov 29 09:59:05 UTC 2016



On 11/29/2016 05:38 PM, Nathan Rossi wrote:
> On 29 November 2016 at 17:35, Robert Yang <liezhi.yang at windriver.com> wrote:
>> There is no network rather than lo whitout set device, so set it by
>> default. And set hostfwd: 2222 -> 22, 2323 -> 23
>>
>> [YOCTO #7887]
>>
>> Signed-off-by: Robert Yang <liezhi.yang at windriver.com>
>> ---
>>  meta/conf/machine/include/qemuboot-x86.inc |  1 -
>>  meta/conf/machine/qemuarm64.conf           |  1 -
>>  scripts/runqemu                            | 34 ++++++++++++++++++++++++++++--
>>  3 files changed, 32 insertions(+), 4 deletions(-)
>>
>> diff --git a/meta/conf/machine/include/qemuboot-x86.inc b/meta/conf/machine/include/qemuboot-x86.inc
>> index 0870294..06ac983 100644
>> --- a/meta/conf/machine/include/qemuboot-x86.inc
>> +++ b/meta/conf/machine/include/qemuboot-x86.inc
>> @@ -13,4 +13,3 @@ QB_AUDIO_OPT = "-soundhw ac97,es1370"
>>  QB_KERNEL_CMDLINE_APPEND = "vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1"
>>  # Add the 'virtio-rng-pci' device otherwise the guest may run out of entropy
>>  QB_OPT_APPEND = "-vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci"
>> -QB_SLIRP_OPT = "-net nic,model=e1000 -net user,hostfwd=tcp::2222-:22"
>> diff --git a/meta/conf/machine/qemuarm64.conf b/meta/conf/machine/qemuarm64.conf
>> index df2010c..7a5570c 100644
>> --- a/meta/conf/machine/qemuarm64.conf
>> +++ b/meta/conf/machine/qemuarm64.conf
>> @@ -18,7 +18,6 @@ QB_KERNEL_CMDLINE_APPEND = "console=ttyAMA0,38400"
>>  # Add the 'virtio-rng-pci' device otherwise the guest may run out of entropy
>>  QB_OPT_APPEND = "-show-cursor -device virtio-rng-pci -monitor null"
>>  QB_TAP_OPT = "-netdev tap,id=net0,ifname=@TAP@,script=no,downscript=no -device virtio-net-device,netdev=net0,mac=@MAC@"
>> -QB_SLIRP_OPT = "-netdev user,id=net0 -device virtio-net-device,netdev=net0"
>>  QB_ROOTFS_OPT = "-drive id=disk0,file=@ROOTFS@,if=none,format=raw -device virtio-blk-device,drive=disk0"
>>  QB_SERIAL_OPT = "-device virtio-serial-device -chardev null,id=virtcon -device virtconsole,chardev=virtcon"
>>  QB_TCPSERIAL_OPT = " -device virtio-serial-device -chardev socket,id=virtcon,port=@PORT@,host=127.0.0.1 -device virtconsole,chardev=virtcon"
>> diff --git a/scripts/runqemu b/scripts/runqemu
>> index a10270c..7123b8f 100755
>> --- a/scripts/runqemu
>> +++ b/scripts/runqemu
>> @@ -147,6 +147,19 @@ def get_first_file(cmds):
>>                      return f
>>      return ''
>>
>> +def check_free_port(host, port):
>> +    """ Check whether the port is free or not """
>> +    import socket
>> +    from contextlib import closing
>> +
>> +    with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock:
>> +        if sock.connect_ex((host, port)) == 0:
>> +            # Port is open, so not free
>> +            return False
>> +        else:
>> +            # Port is not open, so free
>> +            return True
>> +
>>  class BaseConfig(object):
>>      def __init__(self):
>>          # Vars can be merged with .qemuboot.conf, use a dict to manage them.
>> @@ -751,14 +764,31 @@ class BaseConfig(object):
>>
>>          self.nfs_running = True
>>
>> -
>>      def setup_slirp(self):
>>          """Setup user networking"""
>>
>>          if self.fstype == 'nfs':
>>              self.setup_nfs()
>>          self.kernel_cmdline_script += ' ip=dhcp'
>> -        self.set('NETWORK_CMD', self.get('QB_SLIRP_OPT'))
>> +        # Port mapping
>> +        hostfwd = ",hostfwd=tcp::2222-:22,hostfwd=tcp::2323-:23"
>> +        qb_slirp_opt_default = "-netdev user,id=net0%s -device virtio-net-pci,netdev=net0" % hostfwd
>> +        qb_slirp_opt = self.get('QB_SLIRP_OPT') or qb_slirp_opt_default
>> +        # Figure out the port
>> +        ports = re.findall('hostfwd=[^-]*:([0-9]+)-[^,-]*', qb_slirp_opt)
>> +        ports = [int(i) for i in ports]
>
> Should runqemu not just always supply "-netdev user,id=net0..." itself
> for slirp. And qemuboot should supply only the devices, e.g. the "-dev
> virtio-net-pci,netdev=net0" or "-net nic,netdev=net0". This could even

The problem is if runqemu only uses the part "-dev virtio-net-pci,netdev=net0",
and QB_SLIRP_OPT doesn't replace it, then the bsp,conf can't custom freely,
for example, its bsp may not support "-dev virtio-net-pci", then it would
cause troubles. So if bsp.conf wants to redfine the options, manage
the full options is better than part of them.


> allow for consolidation of the "QB_SLIRP_OPT" and "QB_TAP_OPT" into
> "QB_NETWORK".
>
> This way runqemu would not need to do any searching/substitution and

The searching/substitution is still needed, suppose you defined something
like: hostfwd=tcp::2222-:22 in bsp.conf, then they will go into qemuboot.conf,
and it would fail when you run more than one qemu targets since the port
is used by the first running qemu.

> could just build the user netdev arg itself. This would allow for easy
> extension of custom forwards (e.g gdbserver, etc), and also even
> setting up the in qemu user/slirp 'tftp=<dir>' server.
>
>> +        # Find a free port to avoid conflicts
>> +        for p in ports[:]:
>> +            p_new = p
>> +            while not check_free_port('127.0.0.1', p_new):
>
> Should this be 'localhost', since 127.0.0.1 will only check for ipv4 listeners.

Sounds good, updated in the repo.

// Robert

>
> Regards,
> Nathan
>
>> +                p_new += 1
>> +                while p_new in ports:
>> +                        p_new += 1
>> +            if p != p_new:
>> +                ports.append(p_new)
>> +                qb_slirp_opt = re.sub(':%s-' % p, ':%s-' % p_new, qb_slirp_opt)
>> +                logger.info("Port forward changed: %s -> %s" % (p, p_new))
>> +        self.set('NETWORK_CMD', qb_slirp_opt)
>>
>>      def setup_tap(self):
>>          """Setup tap"""
>> --
>> 2.9.0
>>
>> --
>> _______________________________________________
>> Openembedded-core mailing list
>> Openembedded-core at lists.openembedded.org
>> http://lists.openembedded.org/mailman/listinfo/openembedded-core
>



More information about the Openembedded-core mailing list