Skip to contentSkip to conversation

fixes for runqemu

PATCH In review Robert Yang 2 participants 12 messages Apr 11, 2017 – Apr 13, 2017

lore
Share & tools
lore
#0 lore raw

v3 cover fixes for runqemu

* V3:
- Fixed wic's test cases.
- Remove Qi's patch since it was broken, and there are other solutions in the

    mailing list:
    http://lists.openembedded.org/pipermail/openembedded-core/2017-April/135464.html

* V2:
- Fixed "ERROR - name 'p' is not defined"
- Add Qi's patch.

// Robert

The following changes since commit ec2931852b2a097c9c8cb0d7288f5ca1d79f401c:

Revert "staging: Fix sysroot problem with populate_sysroot dependencies on do_fetch" (2017-04-11 00:56:58 +0100)

are available in the git repository at:

git://git.openembedded.org/openembedded-core-contrib rbt/qemu
http://cgit.openembedded.org/openembedded-core-contrib/log/?h=rbt/qemu

Robert Yang (7):
runqemu: support env vars explicitly
runqemu: use self.rootfs to replace self.nfs_dir
runqemu: run without arguments
runqemu: do not rely on grepping images selftest/wic.py: vda -> sda wic-image-minimal.wks: vda -> sda qemux86-directdisk.wks: vda -> sda

 .../recipes-test/images/wic-image-minimal.wks      |   8 +-
 meta/classes/qemuboot.bbclass                      |   3 +
 meta/lib/oeqa/selftest/wic.py                      |   6 +-
 scripts/lib/wic/canned-wks/qemux86-directdisk.wks  |   2 +-
 scripts/runqemu                                    | 122 ++++++++++++---------
 5 files changed, 79 insertions(+), 62 deletions(-)
Signature · 1 line
2.11.0.rc2.dirty
#1 lore raw

PATCH v3 1/7 runqemu: support env vars explicitly

Use self.env_vars to support get vars from environment explicity. The MACHINE, ROOTFS and KERNEL was supported by shell based runqemu, and the help text says support them from env vars, so add them back.

[YOCTO #11141]

---
 scripts/runqemu | 71 ++++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 42 insertions(+), 29 deletions(-)
scripts/runqemu +42 -29
index b696202871..6234e811a7 100755
@@ -163,12 +163,18 @@ def check_free_port(host, port):
 
 class BaseConfig(object):
     def __init__(self):
-        # Vars can be merged with .qemuboot.conf, use a dict to manage them.
-        self.d = {
-            'MACHINE': '',
-            'DEPLOY_DIR_IMAGE': '',
-            'QB_KERNEL_ROOT': '/dev/vda',
-        }
+        # The self.d saved vars from self.set(), part of them are from qemuboot.conf
+        self.d = {'QB_KERNEL_ROOT': '/dev/vda'}
+
+        # Supported env vars, add it here if a var can be got from env,
+        # and don't use os.getenv in the code.
+        self.env_vars = ('MACHINE',
+                        'ROOTFS',
+                        'KERNEL',
+                        'DEPLOY_DIR_IMAGE',
+                        'OE_TMPDIR',
+                        'OECORE_NATIVE_SYSROOT',
+                        )
 
         self.qemu_opt = ''
         self.qemu_opt_script = ''
@@ -238,6 +244,8 @@ class BaseConfig(object):
     def get(self, key):
         if key in self.d:
             return self.d.get(key)
+        elif os.getenv(key):
+            return os.getenv(key)
         else:
             return ''
 
@@ -338,10 +346,13 @@ class BaseConfig(object):
 
     def check_arg_machine(self, arg):
         """Check whether it is a machine"""
-        if self.get('MACHINE') and self.get('MACHINE') != arg or re.search('/', arg):
-            raise Exception("Unknown arg: %s" % arg)
-        elif self.get('MACHINE') == arg:
+        if self.get('MACHINE') == arg:
             return
+        elif self.get('MACHINE') and self.get('MACHINE') != arg:
+            raise Exception("Maybe conflicted MACHINE: %s vs %s" % (self.get('MACHINE'), arg))
+        elif re.search('/', arg):
+            raise Exception("Unknown arg: %s" % arg)
+
         logger.info('Assuming MACHINE = %s' % arg)
 
         # if we're running under testimage, or similarly as a child
@@ -350,14 +361,14 @@ class BaseConfig(object):
         # FIXME: testimage.bbclass exports these two variables into env,
         # are there other scenarios in which we need to support being
         # invoked by bitbake?
-        deploy = os.environ.get('DEPLOY_DIR_IMAGE')
-        bbchild = deploy and os.environ.get('OE_TMPDIR')
+        deploy = self.get('DEPLOY_DIR_IMAGE')
+        bbchild = deploy and self.get('OE_TMPDIR')
         if bbchild:
             self.set_machine_deploy_dir(arg, deploy)
             return
         # also check whether we're running under a sourced toolchain
         # environment file
-        if os.environ.get('OECORE_NATIVE_SYSROOT'):
+        if self.get('OECORE_NATIVE_SYSROOT'):
             self.set("MACHINE", arg)
             return
 
@@ -430,20 +441,15 @@ class BaseConfig(object):
         if unknown_arg:
             if self.get('MACHINE') == unknown_arg:
                 return
-            if not self.get('DEPLOY_DIR_IMAGE'):
-                # Trying to get DEPLOY_DIR_IMAGE from env.
-                p = os.getenv('DEPLOY_DIR_IMAGE')
-                if p and self.is_deploy_dir_image(p):
-                    machine = os.path.basename(p)
-                    if unknown_arg == machine:
-                        self.set_machine_deploy_dir(machine, p)
-                        return
-                    else:
-                        logger.info('DEPLOY_DIR_IMAGE: %s' % p)
-                        self.set("DEPLOY_DIR_IMAGE", p)
+            if self.get('DEPLOY_DIR_IMAGE'):
+                machine = os.path.basename(self.get('DEPLOY_DIR_IMAGE'))
+                if unknown_arg == machine:
+                    self.set("MACHINE", machine)
+                    return
+
             self.check_arg_machine(unknown_arg)
 
-        if not (self.get('MACHINE') or self.get('DEPLOY_DIR_IMAGE')):
+        if not self.get('DEPLOY_DIR_IMAGE'):
             self.load_bitbake_env()
             s = re.search('^DEPLOY_DIR_IMAGE="(.*)"', self.bitbake_e, re.M)
             if s:
@@ -505,7 +511,16 @@ class BaseConfig(object):
     def check_rootfs(self):
         """Check and set rootfs"""
 
-        if self.fstype == 'nfs' or self.fstype == "none":
+        if self.fstype == "none":
+            return
+
+        if self.get('ROOTFS'):
+            if not self.rootfs:
+                self.rootfs = self.get('ROOTFS')
+            elif self.get('ROOTFS') != self.rootfs:
+                raise Exception("Maybe conflicted ROOTFS: %s vs %s" % (self.get('ROOTFS'), self.rootfs))
+
+        if self.fstype == 'nfs':
             return
 
         if self.rootfs and not os.path.exists(self.rootfs):
@@ -642,8 +657,6 @@ class BaseConfig(object):
         if not self.qemuboot:
             if self.get('DEPLOY_DIR_IMAGE'):
                 deploy_dir_image = self.get('DEPLOY_DIR_IMAGE')
-            elif os.getenv('DEPLOY_DIR_IMAGE'):
-                deploy_dir_image = os.getenv('DEPLOY_DIR_IMAGE')
             else:
                 logger.info("Can't find qemuboot conf file, DEPLOY_DIR_IMAGE is NULL!")
                 return
@@ -720,8 +733,8 @@ class BaseConfig(object):
                 # be able to call `bitbake -e`, then try:
                 # - get OE_TMPDIR from environment and guess paths based on it
                 # - get OECORE_NATIVE_SYSROOT from environment (for sdk)
-                tmpdir = os.environ.get('OE_TMPDIR', None)
-                oecore_native_sysroot = os.environ.get('OECORE_NATIVE_SYSROOT', None)
+                tmpdir = self.get('OE_TMPDIR', None)
+                oecore_native_sysroot = self.get('OECORE_NATIVE_SYSROOT', None)
                 if tmpdir:
                     logger.info('Setting STAGING_DIR_NATIVE and STAGING_BINDIR_NATIVE relative to OE_TMPDIR (%s)' % tmpdir)
                     hostos, _, _, _, machine = os.uname()
Signature · 1 line
2.11.0.rc2.dirty
#2 lore raw

PATCH v3 2/7 runqemu: use self.rootfs to replace self.nfs_dir

In reply to Robert Yang

We can use self.rootfs as self.nfs_dir when self.fstype is nfs, this can reduce the code's complexity and we can re-use the code of checking ROOTFS conflictions.

---
 scripts/runqemu | 28 +++++++++++++---------------
 1 file changed, 13 insertions(+), 15 deletions(-)
scripts/runqemu +13 -15
index 6234e811a7..4594173db7 100755
@@ -178,7 +178,6 @@ class BaseConfig(object):
 
         self.qemu_opt = ''
         self.qemu_opt_script = ''
-        self.nfs_dir = ''
         self.clean_nfs_dir = False
         self.nfs_server = ''
         self.rootfs = ''
@@ -284,12 +283,11 @@ class BaseConfig(object):
 
     def check_arg_nfs(self, p):
         if os.path.isdir(p):
-            self.nfs_dir = p
+            self.rootfs = p
         else:
             m = re.match('(.*):(.*)', p)
             self.nfs_server = m.group(1)
-            self.nfs_dir = m.group(2)
-        self.rootfs = ""
+            self.rootfs = m.group(2)
         self.check_arg_fstype('nfs')
 
     def check_arg_path(self, p):
@@ -759,7 +757,7 @@ class BaseConfig(object):
         print('MACHINE: [%s]' % self.get('MACHINE'))
         print('FSTYPE: [%s]' % self.fstype)
         if self.fstype  == 'nfs':
-            print('NFS_DIR: [%s]' % self.nfs_dir)
+            print('NFS_DIR: [%s]' % self.rootfs)
         else:
             print('ROOTFS: [%s]' % self.rootfs)
         if self.ovmf_bios:
@@ -804,13 +802,13 @@ class BaseConfig(object):
 
         self.unfs_opts="nfsvers=3,port=%s,mountprog=%s,nfsprog=%s,udp,mountport=%s" % (nfsd_port, mountd_rpcport, nfsd_rpcport, mountd_port)
 
-        # Extract .tar.bz2 or .tar.bz if no self.nfs_dir
-        if not self.nfs_dir:
+        # Extract .tar.bz2 or .tar.bz if no nfs dir
+        if not (self.rootfs and os.path.isdir(self.rootfs)):
             src_prefix = '%s/%s' % (self.get('DEPLOY_DIR_IMAGE'), self.get('IMAGE_LINK_NAME'))
             dest = "%s-nfsroot" % src_prefix
             if os.path.exists('%s.pseudo_state' % dest):
                 logger.info('Use %s as NFS_DIR' % dest)
-                self.nfs_dir = dest
+                self.rootfs = dest
             else:
                 src = ""
                 src1 = '%s.tar.bz2' % src_prefix
@@ -827,10 +825,10 @@ class BaseConfig(object):
                 if subprocess.call(cmd, shell=True) != 0:
                     raise Exception('Failed to run %s' % cmd)
                 self.clean_nfs_dir = True
-                self.nfs_dir = dest
+                self.rootfs = dest
 
         # Start the userspace NFS server
-        cmd = 'runqemu-export-rootfs start %s' % self.nfs_dir
+        cmd = 'runqemu-export-rootfs start %s' % self.rootfs
         logger.info('Running %s...' % cmd)
         if subprocess.call(cmd, shell=True) != 0:
             raise Exception('Failed to run %s' % cmd)
@@ -1001,7 +999,7 @@ class BaseConfig(object):
 
         if self.fstype == 'nfs':
             self.rootfs_options = ''
-            k_root = '/dev/nfs nfsroot=%s:%s,%s' % (self.nfs_server, self.nfs_dir, self.unfs_opts)
+            k_root = '/dev/nfs nfsroot=%s:%s,%s' % (self.nfs_server, self.rootfs, self.unfs_opts)
             self.kernel_cmdline = 'root=%s rw highres=off' % k_root
 
         if self.fstype == 'none':
@@ -1147,7 +1145,7 @@ class BaseConfig(object):
 
         if self.nfs_running:
             logger.info("Shutting down the userspace NFS server...")
-            cmd = "runqemu-export-rootfs stop %s" % self.nfs_dir
+            cmd = "runqemu-export-rootfs stop %s" % self.rootfs
             logger.info('Running %s' % cmd)
             subprocess.call(cmd, shell=True)
 
@@ -1156,9 +1154,9 @@ class BaseConfig(object):
             subprocess.call(cmd, shell=True)
 
         if self.clean_nfs_dir:
-            logger.info('Removing %s' % self.nfs_dir)
-            shutil.rmtree(self.nfs_dir)
-            shutil.rmtree('%s.pseudo_state' % self.nfs_dir)
+            logger.info('Removing %s' % self.rootfs)
+            shutil.rmtree(self.rootfs)
+            shutil.rmtree('%s.pseudo_state' % self.rootfs)
 
     def load_bitbake_env(self, mach=None):
         if self.bitbake_e:
Signature · 1 line
2.11.0.rc2.dirty
#3 lore raw

PATCH v3 3/7 runqemu: run without arguments

In reply to Robert Yang

Since we can get MACHINE and others from env vars and "bitbake -e", "runqemu" can work without any arguments.

---
 scripts/runqemu | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
scripts/runqemu +2 -2
index 4594173db7..a4036ae091 100755
@@ -83,6 +83,7 @@ of the following environment variables (in any order):
   help, -h, --help: print this text
 
 Examples:
+  runqemu
   runqemu qemuarm
   runqemu tmp/deploy/images/qemuarm
   runqemu tmp/deploy/images/qemux86/<qemuboot.conf>
@@ -1182,8 +1183,7 @@ class BaseConfig(object):
             logger.warn("Couldn't run 'bitbake -e' to gather environment information:\n%s" % err.output.decode('utf-8'))
 
 def main():
-    if len(sys.argv) == 1 or "help" in sys.argv or \
-            '-h' in sys.argv or '--help' in sys.argv:
+    if "help" in sys.argv or '-h' in sys.argv or '--help' in sys.argv:
         print_usage()
         return 0
     config = BaseConfig()
Signature · 1 line
2.11.0.rc2.dirty
#4 lore raw

PATCH v3 4/7 runqemu: do not rely on grepping images

In reply to Robert Yang

Fixed when the image is large and not enough memory:
grep: memory exhausted
Aborted

[YOCTO #11073]

---
 meta/classes/qemuboot.bbclass |  3 +++
 scripts/runqemu               | 19 +++++++++++--------
 2 files changed, 14 insertions(+), 8 deletions(-)
meta/classes/qemuboot.bbclass +3 -0
index 3ca97cad4c..2870388dfb 100644
@@ -64,6 +64,9 @@ QB_DEFAULT_FSTYPE ?= "ext4"
 QB_OPT_APPEND ?= "-show-cursor"
 QB_NETWORK_DEVICE ?= "-device virtio-net-pci,netdev=net0,mac=@MAC@"
 
+# This should be kept align with ROOT_VM
+QB_DRIVE_TYPE ?= "/dev/sd"
+
 # Create qemuboot.conf
 addtask do_write_qemuboot_conf after do_rootfs before do_image
 IMGDEPLOYDIR ?= "${WORKDIR}/deploy-${PN}-image-complete"
scripts/runqemu +11 -8
index a4036ae091..5b5d56b9ef 100755
@@ -978,23 +978,26 @@ class BaseConfig(object):
             self.kernel_cmdline = 'root=/dev/ram0 rw debugshell'
             self.rootfs_options = '-initrd %s' % self.rootfs
         else:
+            vm_drive = ''
             if self.fstype in self.vmtypes:
                 if self.fstype == 'iso':
                     vm_drive = '-cdrom %s' % self.rootfs
-                else:
-                    cmd1 = "grep -q 'root=/dev/sd' %s" % self.rootfs
-                    cmd2 = "grep -q 'root=/dev/hd' %s" % self.rootfs
-                    if subprocess.call(cmd1, shell=True) == 0:
+                elif self.get('QB_DRIVE_TYPE'):
+                    drive_type = self.get('QB_DRIVE_TYPE')
+                    if drive_type.startswith("/dev/sd"):
                         logger.info('Using scsi drive')
                         vm_drive = '-drive if=none,id=hd,file=%s,format=%s -device virtio-scsi-pci,id=scsi -device scsi-hd,drive=hd' \
                                        % (self.rootfs, rootfs_format)
-                    elif subprocess.call(cmd2, shell=True) == 0:
+                    elif drive_type.startswith("/dev/hd"):
                         logger.info('Using ide drive')
                         vm_drive = "%s,format=%s" % (self.rootfs, rootfs_format)
                     else:
-                        logger.warn("Can't detect drive type %s" % self.rootfs)
-                        logger.warn('Trying to use virtio block drive')
-                        vm_drive = '-drive if=virtio,file=%s,format=%s' % (self.rootfs, rootfs_format)
+                        logger.warn("Unknown QB_DRIVE_TYPE: %s" % drive_type)
+
+                if not vm_drive:
+                    logger.warn("Failed to figure out drive type, consider define or fix QB_DRIVE_TYPE")
+                    logger.warn('Trying to use virtio block drive')
+                    vm_drive = '-drive if=virtio,file=%s,format=%s' % (self.rootfs, rootfs_format)
                 self.rootfs_options = '%s -no-reboot' % vm_drive
             self.kernel_cmdline = 'root=%s rw highres=off' % (self.get('QB_KERNEL_ROOT'))
 
Signature · 1 line
2.11.0.rc2.dirty
#5 lore raw

Re: [PATCH 4/7] runqemu: do not rely on grepping images

Quoted 17 lines · Robert Yang

Fixed when the image is large and not enough memory:
grep: memory exhausted
Aborted

[YOCTO #11073]

---
 meta/classes/qemuboot.bbclass |  3 +++
 scripts/runqemu               | 19 +++++++++++--------
 2 files changed, 14 insertions(+), 8 deletions(-)
meta/classes/qemuboot.bbclass +0 -0
index 3ca97cad4c..2870388dfb 100644

meta/classes/qemuboot.bbclass QB_DEFAULT_FSTYPE ?= "ext4" · line 68

Quoted 5 lines
meta/classes/qemuboot.bbclass +2 -0
@@ -64,6 +64,9 @@ QB_DEFAULT_FSTYPE ?= "ext4"
 QB_OPT_APPEND ?= "-show-cursor"
 QB_NETWORK_DEVICE ?= "-device virtio-net-pci,netdev=net0,mac=@MAC@"
 
+# This should be kept align with ROOT_VM
+QB_DRIVE_TYPE ?= "/dev/sd"

Now that I am faced with the problem of selecting virtio I'm starting to wonder how to do that.

Our refkit image doesn't expect the image on a particular drive, using PARTUUID instead to find it. But when running under qemu, it would be nice to use virtio for performance reasons... if the kernel supports it. But that's not something that the image recipe or even the distro should make assumptions about.

It seems safer to let the machine configuration which chooses the kernel also set QB_DRIVE_TYPE, but with ?= so that it can still be changed elsewhere. In that case, we would need:

qemuboot.bbclass: QB_DRIVE_TYPE ??= "/dev/sd" qemuboot-intel.inc (from meta-intel): QB_DRIVE_TYPE ?= "/dev/vd" distro, local or image (optional): QB_DRIVE_TYPE = "/dev/..."

Quoted 10 lines
meta/classes/qemuboot.bbclass +4 -1
+                elif self.get('QB_DRIVE_TYPE'):
+                    drive_type = self.get('QB_DRIVE_TYPE')
+                    if drive_type.startswith("/dev/sd"):
                         logger.info('Using scsi drive')
                         vm_drive = '-drive if=none,id=hd,file=%s,format=%s -device virtio-scsi-pci,id=scsi -device scsi-hd,drive=hd' \
                                        % (self.rootfs, rootfs_format)
-                    elif subprocess.call(cmd2, shell=True) == 0:
+                    elif drive_type.startswith("/dev/hd"):
                         logger.info('Using ide drive')
                         vm_drive = "%s,format=%s" % (self.rootfs, rootfs_format)

meta/classes/qemuboot.bbclass QB_DEFAULT_FSTYPE ?= "ext4"

Quoted 10 lines
meta/classes/qemuboot.bbclass +6 -3
                     else:
-                        logger.warn("Can't detect drive type %s" % self.rootfs)
-                        logger.warn('Trying to use virtio block drive')
-                        vm_drive = '-drive if=virtio,file=%s,format=%s' % (self.rootfs, rootfs_format)
+                        logger.warn("Unknown QB_DRIVE_TYPE: %s" % drive_type)
+
+                if not vm_drive:
+                    logger.warn("Failed to figure out drive type, consider define or fix QB_DRIVE_TYPE")
+                    logger.warn('Trying to use virtio block drive')
+                    vm_drive = '-drive if=virtio,file=%s,format=%s' % (self.rootfs, rootfs_format)

Here "/dev/sd" should be treated as an explicit selection of virtio, without triggering warnings.

I'll send a patch for both if there are no objections.

Signature · 6 lines
Best Regards, Patrick Ohly

The content of this message is my personal opinion only and although
I am an employee of Intel, the statements I make here in no way
represent Intel's position on the issue, nor am I authorized to speak
on behalf of Intel on this matter.
#6 lore raw

Re: [PATCH 4/7] runqemu: do not rely on grepping images

Hi Patrick,

Quoted 33 lines · Patrick Ohly
Quoted 17 lines · Robert Yang

Fixed when the image is large and not enough memory:
grep: memory exhausted
Aborted

[YOCTO #11073]

---
 meta/classes/qemuboot.bbclass |  3 +++
 scripts/runqemu               | 19 +++++++++++--------
 2 files changed, 14 insertions(+), 8 deletions(-)
meta/classes/qemuboot.bbclass +0 -0
index 3ca97cad4c..2870388dfb 100644

meta/classes/qemuboot.bbclass QB_DEFAULT_FSTYPE ?= "ext4" · line 68

Quoted 5 lines
meta/classes/qemuboot.bbclass +2 -0
@@ -64,6 +64,9 @@ QB_DEFAULT_FSTYPE ?= "ext4"
 QB_OPT_APPEND ?= "-show-cursor"
 QB_NETWORK_DEVICE ?= "-device virtio-net-pci,netdev=net0,mac=@MAC@"
 
+# This should be kept align with ROOT_VM
+QB_DRIVE_TYPE ?= "/dev/sd"

Now that I am faced with the problem of selecting virtio I'm starting to wonder how to do that.

Our refkit image doesn't expect the image on a particular drive, using PARTUUID instead to find it. But when running under qemu, it would be nice to use virtio for performance reasons... if the kernel supports it. But that's not something that the image recipe or even the distro should make assumptions about.

Quoted 7 lines

It seems safer to let the machine configuration which chooses the kernel also set QB_DRIVE_TYPE, but with ?= so that it can still be changed elsewhere. In that case, we would need:

qemuboot.bbclass: QB_DRIVE_TYPE ??= "/dev/sd" qemuboot-intel.inc (from meta-intel): QB_DRIVE_TYPE ?= "/dev/vd" distro, local or image (optional): QB_DRIVE_TYPE = "/dev/..."

The "??=" is not needed, just "?=" in qemuboot.bbclass is OK, we have "?=" in other bbclass, too, and they can be overrided as expected. For example:

qemuboot-intel.inc (from meta-intel): QB_DRIVE_TYPE ?= "/dev/vd"

Then it would be vd, and if you set = /dev/hd in local.conf, the it would be /dev/hd.

// Robert

Quoted 22 lines
Quoted 11 lines
meta/classes/qemuboot.bbclass +4 -1
+                elif self.get('QB_DRIVE_TYPE'):
+                    drive_type = self.get('QB_DRIVE_TYPE')
+                    if drive_type.startswith("/dev/sd"):
                         logger.info('Using scsi drive')
                         vm_drive = '-drive if=none,id=hd,file=%s,format=%s -device virtio-scsi-pci,id=scsi -device scsi-hd,drive=hd' \
                                        % (self.rootfs, rootfs_format)
-                    elif subprocess.call(cmd2, shell=True) == 0:
+                    elif drive_type.startswith("/dev/hd"):
                         logger.info('Using ide drive')
                         vm_drive = "%s,format=%s" % (self.rootfs, rootfs_format)

meta/classes/qemuboot.bbclass QB_DEFAULT_FSTYPE ?= "ext4"

Quoted 10 lines
meta/classes/qemuboot.bbclass +6 -3
                     else:
-                        logger.warn("Can't detect drive type %s" % self.rootfs)
-                        logger.warn('Trying to use virtio block drive')
-                        vm_drive = '-drive if=virtio,file=%s,format=%s' % (self.rootfs, rootfs_format)
+                        logger.warn("Unknown QB_DRIVE_TYPE: %s" % drive_type)
+
+                if not vm_drive:
+                    logger.warn("Failed to figure out drive type, consider define or fix QB_DRIVE_TYPE")
+                    logger.warn('Trying to use virtio block drive')
+                    vm_drive = '-drive if=virtio,file=%s,format=%s' % (self.rootfs, rootfs_format)
Quoted 2 lines

Here "/dev/sd" should be treated as an explicit selection of virtio, without triggering warnings.

Did you mean /dev/vd ? If yes, I'm fine with that.

// Robert

Quoted 3 lines

I'll send a patch for both if there are no objections.

#7 lore raw

Re: [PATCH 4/7] runqemu: do not rely on grepping images

Quoted 40 lines · Robert Yang

Hi Patrick,

Quoted 37 lines · Patrick Ohly
Quoted 17 lines · Robert Yang

Fixed when the image is large and not enough memory:
grep: memory exhausted
Aborted

[YOCTO #11073]

---
 meta/classes/qemuboot.bbclass |  3 +++
 scripts/runqemu               | 19 +++++++++++--------
 2 files changed, 14 insertions(+), 8 deletions(-)
meta/classes/qemuboot.bbclass +0 -0
index 3ca97cad4c..2870388dfb 100644

meta/classes/qemuboot.bbclass QB_DEFAULT_FSTYPE ?= "ext4" · line 68

Quoted 5 lines
meta/classes/qemuboot.bbclass +2 -0
@@ -64,6 +64,9 @@ QB_DEFAULT_FSTYPE ?= "ext4"
 QB_OPT_APPEND ?= "-show-cursor"
 QB_NETWORK_DEVICE ?= "-device virtio-net-pci,netdev=net0,mac=@MAC@"
 
+# This should be kept align with ROOT_VM
+QB_DRIVE_TYPE ?= "/dev/sd"

Now that I am faced with the problem of selecting virtio I'm starting to wonder how to do that.

Our refkit image doesn't expect the image on a particular drive, using PARTUUID instead to find it. But when running under qemu, it would be nice to use virtio for performance reasons... if the kernel supports it. But that's not something that the image recipe or even the distro should make assumptions about.

It seems safer to let the machine configuration which chooses the kernel also set QB_DRIVE_TYPE, but with ?= so that it can still be changed elsewhere. In that case, we would need:

Quoted 6 lines
Quoted 3 lines

qemuboot.bbclass: QB_DRIVE_TYPE ??= "/dev/sd" qemuboot-intel.inc (from meta-intel): QB_DRIVE_TYPE ?= "/dev/vd" distro, local or image (optional): QB_DRIVE_TYPE = "/dev/..."

The "??=" is not needed, just "?=" in qemuboot.bbclass is OK, we have "?=" in other bbclass, too, and they can be overrided as expected.

Other classes might depend on a different order of setting values.

Quoted 3 lines

For example:

qemuboot-intel.inc (from meta-intel): QB_DRIVE_TYPE ?= "/dev/vd"

But you right, that works, because although that default gets set first, it does not get overwritten by the latter default from qemuboot.bbclass.

I thought defaults worked the same way as normal assignments, i.e.
foo ?= "a"
foo ?= "b"
would result in foo == "b". That's not the case.

Quoted 21 lines
Quoted 21 lines
Quoted 20 lines
meta/classes/qemuboot.bbclass +10 -4
+                elif self.get('QB_DRIVE_TYPE'):
+                    drive_type = self.get('QB_DRIVE_TYPE')
+                    if drive_type.startswith("/dev/sd"):
                         logger.info('Using scsi drive')
                         vm_drive = '-drive if=none,id=hd,file=%s,format=%s -device virtio-scsi-pci,id=scsi -device scsi-hd,drive=hd' \
                                        % (self.rootfs, rootfs_format)
-                    elif subprocess.call(cmd2, shell=True) == 0:
+                    elif drive_type.startswith("/dev/hd"):
                         logger.info('Using ide drive')
                         vm_drive = "%s,format=%s" % (self.rootfs, rootfs_format)
                     else:
-                        logger.warn("Can't detect drive type %s" % self.rootfs)
-                        logger.warn('Trying to use virtio block drive')
-                        vm_drive = '-drive if=virtio,file=%s,format=%s' % (self.rootfs, rootfs_format)
+                        logger.warn("Unknown QB_DRIVE_TYPE: %s" % drive_type)
+
+                if not vm_drive:
+                    logger.warn("Failed to figure out drive type, consider define or fix QB_DRIVE_TYPE")
+                    logger.warn('Trying to use virtio block drive')
+                    vm_drive = '-drive if=virtio,file=%s,format=%s' % (self.rootfs, rootfs_format)
Quoted 4 lines
Quoted 2 lines

Here "/dev/sd" should be treated as an explicit selection of virtio, without triggering warnings.

Did you mean /dev/vd ? If yes, I'm fine with that.

Yes.

Signature · 6 lines
Best Regards, Patrick Ohly

The content of this message is my personal opinion only and although
I am an employee of Intel, the statements I make here in no way
represent Intel's position on the issue, nor am I authorized to speak
on behalf of Intel on this matter.
#8 lore raw

Re: [PATCH 4/7] runqemu: do not rely on grepping images

In reply to Patrick Ohly

Hi Patrick,

Quoted 33 lines · Patrick Ohly
Quoted 17 lines · Robert Yang

Fixed when the image is large and not enough memory:
grep: memory exhausted
Aborted

[YOCTO #11073]

---
 meta/classes/qemuboot.bbclass |  3 +++
 scripts/runqemu               | 19 +++++++++++--------
 2 files changed, 14 insertions(+), 8 deletions(-)
meta/classes/qemuboot.bbclass +0 -0
index 3ca97cad4c..2870388dfb 100644

meta/classes/qemuboot.bbclass QB_DEFAULT_FSTYPE ?= "ext4" · line 68

Quoted 5 lines
meta/classes/qemuboot.bbclass +2 -0
@@ -64,6 +64,9 @@ QB_DEFAULT_FSTYPE ?= "ext4"
 QB_OPT_APPEND ?= "-show-cursor"
 QB_NETWORK_DEVICE ?= "-device virtio-net-pci,netdev=net0,mac=@MAC@"
 
+# This should be kept align with ROOT_VM
+QB_DRIVE_TYPE ?= "/dev/sd"

Now that I am faced with the problem of selecting virtio I'm starting to wonder how to do that.

Our refkit image doesn't expect the image on a particular drive, using PARTUUID instead to find it. But when running under qemu, it would be nice to use virtio for performance reasons... if the kernel supports it. But that's not something that the image recipe or even the distro should make assumptions about.

Quoted 7 lines

It seems safer to let the machine configuration which chooses the kernel also set QB_DRIVE_TYPE, but with ?= so that it can still be changed elsewhere. In that case, we would need:

qemuboot.bbclass: QB_DRIVE_TYPE ??= "/dev/sd" qemuboot-intel.inc (from meta-intel): QB_DRIVE_TYPE ?= "/dev/vd" distro, local or image (optional): QB_DRIVE_TYPE = "/dev/..."

The "??=" is not needed, just "?=" in qemuboot.bbclass is OK, we have "?=" in other bbclass, too, and they can be overrided as expected. For example:

qemuboot-intel.inc (from meta-intel): QB_DRIVE_TYPE ?= "/dev/vd"

Then it would be vd, and if you set = /dev/hd in local.conf, the it would be /dev/hd.

Quoted 22 lines
Quoted 11 lines
meta/classes/qemuboot.bbclass +4 -1
+                elif self.get('QB_DRIVE_TYPE'):
+                    drive_type = self.get('QB_DRIVE_TYPE')
+                    if drive_type.startswith("/dev/sd"):
                         logger.info('Using scsi drive')
                         vm_drive = '-drive if=none,id=hd,file=%s,format=%s -device virtio-scsi-pci,id=scsi -device scsi-hd,drive=hd' \
                                        % (self.rootfs, rootfs_format)
-                    elif subprocess.call(cmd2, shell=True) == 0:
+                    elif drive_type.startswith("/dev/hd"):
                         logger.info('Using ide drive')
                         vm_drive = "%s,format=%s" % (self.rootfs, rootfs_format)

meta/classes/qemuboot.bbclass QB_DEFAULT_FSTYPE ?= "ext4"

Quoted 10 lines
meta/classes/qemuboot.bbclass +6 -3
                     else:
-                        logger.warn("Can't detect drive type %s" % self.rootfs)
-                        logger.warn('Trying to use virtio block drive')
-                        vm_drive = '-drive if=virtio,file=%s,format=%s' % (self.rootfs, rootfs_format)
+                        logger.warn("Unknown QB_DRIVE_TYPE: %s" % drive_type)
+
+                if not vm_drive:
+                    logger.warn("Failed to figure out drive type, consider define or fix QB_DRIVE_TYPE")
+                    logger.warn('Trying to use virtio block drive')
+                    vm_drive = '-drive if=virtio,file=%s,format=%s' % (self.rootfs, rootfs_format)
Quoted 2 lines

Here "/dev/sd" should be treated as an explicit selection of virtio, without triggering warnings.

Did you mean /dev/vd ? If yes, I'm fine with that.

// Robert

Quoted 3 lines

I'll send a patch for both if there are no objections.

#9 lore raw

PATCH v3 5/7 selftest/wic.py: vda -> sda

In reply to Robert Yang

Previously, runqemu grep root=/dev/sd or root=/dev/hd on the image, and would use vda if no grep result, now we have set QB_DRIVE_TYPE to "/dev/sd" by default, and the device will be /dev/sda, so use sda to replace vda in the test case.

---
 meta/lib/oeqa/selftest/wic.py | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
meta/lib/oeqa/selftest/wic.py +3 -3
index 8030c35117..34de6808c4 100644
@@ -613,7 +613,7 @@ part /etc --source rootfs --ondisk mmcblk0 --fstype=ext4 --exclude-path bin/ --r
             cmd = "mount |grep '^/dev/' | cut -f1,3 -d ' '"
             status, output = qemu.run_serial(cmd)
             self.assertEqual(1, status, 'Failed to run command "%s": %s' % (cmd, output))
-            self.assertEqual(output, '/dev/root /\r\n/dev/vda3 /mnt')
+            self.assertEqual(output, '/dev/root /\r\n/dev/sda3 /mnt')
 
     @only_for_arch(['i586', 'i686', 'x86_64'])
     def test_qemu_efi(self):
@@ -625,7 +625,7 @@ part /etc --source rootfs --ondisk mmcblk0 --fstype=ext4 --exclude-path bin/ --r
 
         with runqemu('core-image-minimal', ssh=False,
                      runqemuparams='ovmf', image_fstype='wic') as qemu:
-            cmd = "grep vda. /proc/partitions  |wc -l"
+            cmd = "grep sda. /proc/partitions  |wc -l"
             status, output = qemu.run_serial(cmd)
             self.assertEqual(1, status, 'Failed to run command "%s": %s' % (cmd, output))
             self.assertEqual(output, '3')
@@ -700,7 +700,7 @@ part /etc --source rootfs --ondisk mmcblk0 --fstype=ext4 --exclude-path bin/ --r
             self.remove_config(config)
 
         with runqemu('core-image-minimal', ssh=False, image_fstype='wic') as qemu:
-            cmd = "grep vda. /proc/partitions  |wc -l"
+            cmd = "grep sda. /proc/partitions  |wc -l"
             status, output = qemu.run_serial(cmd)
             self.assertEqual(1, status, 'Failed to run command "%s": %s' % (cmd, output))
             self.assertEqual(output, '2')
Signature · 1 line
2.11.0.rc2.dirty
#10 lore raw

PATCH v3 6/7 wic-image-minimal.wks: vda -> sda

In reply to Robert Yang

Previously, runqemu grep root=/dev/sd or root=/dev/hd on the image, and would use vda if no grep result, now we have set QB_DRIVE_TYPE to "/dev/sd" by default, and the device will be /dev/sda, so use sda to replace vda in the test case.

---
 meta-selftest/recipes-test/images/wic-image-minimal.wks | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
meta-selftest/recipes-test/images/wic-image-minimal.wks +4 -4
index d55075d503..3e08cf4e43 100644
@@ -2,9 +2,9 @@
 # long-description: This image contains boot partition and 3 rootfs partitions
 # created from core-image-minimal and wic-image-minimal image recipes.
 
-part /boot --source bootimg-pcbios --ondisk vda --label boot --active --align 1024
-part / --source rootfs --ondisk vda --fstype=ext4 --label platform --align 1024 --use-uuid
-part /mnt --source rootfs --rootfs-dir=core-image-minimal --ondisk vda --fstype=ext4 --label core --align 1024
-part backup --source rootfs --rootfs-dir=wic-image-minimal --ondisk vda --fstype=ext4 --label backup --align 1024
+part /boot --source bootimg-pcbios --ondisk sda --label boot --active --align 1024
+part / --source rootfs --ondisk sda --fstype=ext4 --label platform --align 1024 --use-uuid
+part /mnt --source rootfs --rootfs-dir=core-image-minimal --ondisk sda --fstype=ext4 --label core --align 1024
+part backup --source rootfs --rootfs-dir=wic-image-minimal --ondisk sda --fstype=ext4 --label backup --align 1024
 
 bootloader --ptable gpt --timeout=0  --append="rootwait console=tty0"
Signature · 1 line
2.11.0.rc2.dirty
#11 lore raw

PATCH v3 7/7 qemux86-directdisk.wks: vda -> sda

In reply to Robert Yang

Previously, runqemu grep root=/dev/sd or root=/dev/hd on the image, and would use vda if no grep result, now we have set QB_DRIVE_TYPE to "/dev/sd" by default, and the device will be /dev/sda, so use sda to replace vda in the test case.

---
 scripts/lib/wic/canned-wks/qemux86-directdisk.wks | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/lib/wic/canned-wks/qemux86-directdisk.wks +1 -1
index a6518a0f45..db30bbced0 100644
@@ -4,5 +4,5 @@
 
 include common.wks.inc
 
-bootloader  --timeout=0  --append="vga=0 uvesafb.mode_option=640x480-32 root=/dev/vda2 rw mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 oprofile.timer=1 rootfstype=ext4 "
+bootloader  --timeout=0  --append="vga=0 uvesafb.mode_option=640x480-32 root=/dev/sda2 rw mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 oprofile.timer=1 rootfstype=ext4 "
 
Signature · 1 line
2.11.0.rc2.dirty