Message ID | 20251001175702.62563-2-jon.mason@arm.com |
---|---|
State | New |
Headers | show |
Series | [RESEND,1/2] runqemu: remove setting of mem on kernel command line for certain systems | expand |
On 10/1/25 19:57, Jon Mason via lists.openembedded.org wrote: > QEMU requires that SD and pflash images are sized to be a power of 2 > (e.g., 32M, 64M, etc). So, if the image being used is not a power of 2 > and it's being used for SD or pflash, increase it to the next power of 2 > size via the truncate command. > > This might not be an actual spec requirement, and is being investigated > in https://gitlab.com/qemu-project/qemu/-/issues/1754 > > Signed-off-by: Jon Mason <jon.mason@arm.com> > --- > scripts/runqemu | 24 ++++++++++++++++++++++-- > 1 file changed, 22 insertions(+), 2 deletions(-) > > diff --git a/scripts/runqemu b/scripts/runqemu > index a8144aa68c3d..cd2ded69916a 100755 > --- a/scripts/runqemu > +++ b/scripts/runqemu > @@ -421,7 +421,27 @@ class BaseConfig(object): > else: > raise RunQemuError("Unknown path arg %s" % p) > > - def uncompress_rootfs(self): > + def rootfs_fixups(self): > + > + """Resize rootfs image if needed""" Nit: the docstring now only describes the newly added behavior, but not the original. The original docstring is also present, but it is now in the middle of the method. > + qb_rootfs_opt = self.get('QB_ROOTFS_OPT') > + > + # Check if sdcard size is a power of 2, as that is currently a requirement for qemu > + # See https://gitlab.com/qemu-project/qemu/-/issues/1754 > + rootfs_size = os.path.getsize(self.rootfs) > + rootfs_size_pwr2 = 1 << (rootfs_size - 1).bit_length() > + if ("if=sd" in qb_rootfs_opt or "if=pflash" in qb_rootfs_opt) and rootfs_size != rootfs_size_pwr2: > + logger.info("Using sd-card or pflash and is not power of 2. File size %d, power of 2 size %d" %(rootfs_size, rootfs_size_pwr2)) > + logger.info("Attempting to use truncate to correct this.") > + > + # Ensure the 'truncate' tool is installed before attempting to make a power of 2. > + if not shutil.which('truncate'): > + raise RunQemuError(f"'truncate' is required to make {self.rootfs} a power of 2 in size but was not found in PATH") > + try: > + subprocess.check_call(['truncate', '-s', str(rootfs_size_pwr2), self.rootfs]) > + except subprocess.CalledProcessError as e: > + raise RunQemuError(f"Failed to make {self.rootfs} power of 2 in size: {e}") > + > """Decompress ZST rootfs image if needed""" > if not self.rootfs or not self.fstype.endswith('.zst'): > return > @@ -1808,7 +1828,7 @@ def main(): > config.check_args() > config.read_qemuboot() > config.check_and_set() > - config.uncompress_rootfs() > + config.rootfs_fixups() > # Check whether the combos is valid or not > config.validate_combos() > config.print_config() > > -=-=-=-=-=-=-=-=-=-=-=- > Links: You receive all messages sent to this group. > View/Reply Online (#224315): https://lists.openembedded.org/g/openembedded-core/message/224315 > Mute This Topic: https://lists.openembedded.org/mt/115538558/6084445 > Group Owner: openembedded-core+owner@lists.openembedded.org > Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [skandigraun@gmail.com] > -=-=-=-=-=-=-=-=-=-=-=- >
On Thu, Oct 2, 2025 at 1:29 PM Gyorgy Sarvari via lists.openembedded.org <skandigraun=gmail.com@lists.openembedded.org> wrote: > > On 10/1/25 19:57, Jon Mason via lists.openembedded.org wrote: > > QEMU requires that SD and pflash images are sized to be a power of 2 > > (e.g., 32M, 64M, etc). So, if the image being used is not a power of 2 > > and it's being used for SD or pflash, increase it to the next power of 2 > > size via the truncate command. > > > > This might not be an actual spec requirement, and is being investigated > > in https://gitlab.com/qemu-project/qemu/-/issues/1754 > > > > Signed-off-by: Jon Mason <jon.mason@arm.com> > > --- > > scripts/runqemu | 24 ++++++++++++++++++++++-- > > 1 file changed, 22 insertions(+), 2 deletions(-) > > > > diff --git a/scripts/runqemu b/scripts/runqemu > > index a8144aa68c3d..cd2ded69916a 100755 > > --- a/scripts/runqemu > > +++ b/scripts/runqemu > > @@ -421,7 +421,27 @@ class BaseConfig(object): > > else: > > raise RunQemuError("Unknown path arg %s" % p) > > > > - def uncompress_rootfs(self): > > + def rootfs_fixups(self): > > + > > + """Resize rootfs image if needed""" > > Nit: the docstring now only describes the newly added behavior, but not > the original. The original docstring is also present, but it is now in > the middle of the method. Thanks for the review, I'll fix this up and send out a v2 > > > + qb_rootfs_opt = self.get('QB_ROOTFS_OPT') > > + > > + # Check if sdcard size is a power of 2, as that is currently a requirement for qemu > > + # See https://gitlab.com/qemu-project/qemu/-/issues/1754 > > + rootfs_size = os.path.getsize(self.rootfs) > > + rootfs_size_pwr2 = 1 << (rootfs_size - 1).bit_length() > > + if ("if=sd" in qb_rootfs_opt or "if=pflash" in qb_rootfs_opt) and rootfs_size != rootfs_size_pwr2: > > + logger.info("Using sd-card or pflash and is not power of 2. File size %d, power of 2 size %d" %(rootfs_size, rootfs_size_pwr2)) > > + logger.info("Attempting to use truncate to correct this.") > > + > > + # Ensure the 'truncate' tool is installed before attempting to make a power of 2. > > + if not shutil.which('truncate'): > > + raise RunQemuError(f"'truncate' is required to make {self.rootfs} a power of 2 in size but was not found in PATH") > > + try: > > + subprocess.check_call(['truncate', '-s', str(rootfs_size_pwr2), self.rootfs]) > > + except subprocess.CalledProcessError as e: > > + raise RunQemuError(f"Failed to make {self.rootfs} power of 2 in size: {e}") > > + > > """Decompress ZST rootfs image if needed""" > > if not self.rootfs or not self.fstype.endswith('.zst'): > > return > > @@ -1808,7 +1828,7 @@ def main(): > > config.check_args() > > config.read_qemuboot() > > config.check_and_set() > > - config.uncompress_rootfs() > > + config.rootfs_fixups() > > # Check whether the combos is valid or not > > config.validate_combos() > > config.print_config() > > > > > > > > > -=-=-=-=-=-=-=-=-=-=-=- > Links: You receive all messages sent to this group. > View/Reply Online (#224377): https://lists.openembedded.org/g/openembedded-core/message/224377 > Mute This Topic: https://lists.openembedded.org/mt/115538558/3616920 > Group Owner: openembedded-core+owner@lists.openembedded.org > Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [jdmason@kudzu.us] > -=-=-=-=-=-=-=-=-=-=-=- >
diff --git a/scripts/runqemu b/scripts/runqemu index a8144aa68c3d..cd2ded69916a 100755 --- a/scripts/runqemu +++ b/scripts/runqemu @@ -421,7 +421,27 @@ class BaseConfig(object): else: raise RunQemuError("Unknown path arg %s" % p) - def uncompress_rootfs(self): + def rootfs_fixups(self): + + """Resize rootfs image if needed""" + qb_rootfs_opt = self.get('QB_ROOTFS_OPT') + + # Check if sdcard size is a power of 2, as that is currently a requirement for qemu + # See https://gitlab.com/qemu-project/qemu/-/issues/1754 + rootfs_size = os.path.getsize(self.rootfs) + rootfs_size_pwr2 = 1 << (rootfs_size - 1).bit_length() + if ("if=sd" in qb_rootfs_opt or "if=pflash" in qb_rootfs_opt) and rootfs_size != rootfs_size_pwr2: + logger.info("Using sd-card or pflash and is not power of 2. File size %d, power of 2 size %d" %(rootfs_size, rootfs_size_pwr2)) + logger.info("Attempting to use truncate to correct this.") + + # Ensure the 'truncate' tool is installed before attempting to make a power of 2. + if not shutil.which('truncate'): + raise RunQemuError(f"'truncate' is required to make {self.rootfs} a power of 2 in size but was not found in PATH") + try: + subprocess.check_call(['truncate', '-s', str(rootfs_size_pwr2), self.rootfs]) + except subprocess.CalledProcessError as e: + raise RunQemuError(f"Failed to make {self.rootfs} power of 2 in size: {e}") + """Decompress ZST rootfs image if needed""" if not self.rootfs or not self.fstype.endswith('.zst'): return @@ -1808,7 +1828,7 @@ def main(): config.check_args() config.read_qemuboot() config.check_and_set() - config.uncompress_rootfs() + config.rootfs_fixups() # Check whether the combos is valid or not config.validate_combos() config.print_config()
QEMU requires that SD and pflash images are sized to be a power of 2 (e.g., 32M, 64M, etc). So, if the image being used is not a power of 2 and it's being used for SD or pflash, increase it to the next power of 2 size via the truncate command. This might not be an actual spec requirement, and is being investigated in https://gitlab.com/qemu-project/qemu/-/issues/1754 Signed-off-by: Jon Mason <jon.mason@arm.com> --- scripts/runqemu | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-)