From patchwork Tue Oct 6 09:06:52 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrej Kozemcak X-Patchwork-Id: 100034 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 95808CA5FED for ; Tue, 6 Oct 2026 09:07:08 +0000 (UTC) Received: from mta-65-227.siemens.flowmailer.net (mta-65-227.siemens.flowmailer.net [185.136.65.227]) by mx.groups.io with SMTP id smtpd.msgproc01-g2.41211.1791277623840091861 for ; Tue, 06 Oct 2026 02:07:05 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=andrej.kozemcak@siemens.com header.s=fm1 header.b=Lz/6g3Ke; spf=pass (domain: rts-flowmailer.siemens.com, ip: 185.136.65.227, mailfrom: fm-1334352-20261006090700662e405645000207a3-anrhur@rts-flowmailer.siemens.com) Received: by mta-65-227.siemens.flowmailer.net with ESMTPSA id 20261006090700662e405645000207a3 for ; Tue, 06 Oct 2026 11:07:00 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=fm1; d=siemens.com; i=andrej.kozemcak@siemens.com; h=Date:From:Subject:To:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding:Cc; bh=mRSz5ylX5CGPTOFyK+qVYVOACV4jSCND9fnhgNogows=; b=Lz/6g3KezJAFlANmhqj85U8U1mSXJYxo/5e8P8ULDthWubnrNcgOaN0MjJjuzeoqaFrIur cd1JSqhpfMGdmGjKvuWUBzeIWOh+YkQ2esofYasg3mAhMtEvSHjxY3lFBxPuhogMt6kXbeOF /Ui6DMFHZSQdMJOfROmtoEtWIot2c6iJGvfgNcZ/K2hEhQWKfPDkbqNIPP1BHQMH4J42cOjx m3OwwL4wKeHZFpPW4DnxP42CTi027ufCdOyEl2Gd5LgB882tbOeHFalGKjowHKHaqNads5ha ES/ho1XygPGdyjf3XKHpw3M6f1hELksDRX8tadrH2si+Sznd5q5Z5Hfg==; From: Andrej Kozemcak To: openembedded-core@lists.openembedded.org Cc: Andrej Kozemcak Subject: [PATCH v2 1/3] qemu: enable pseudo for nfs rootfs export Date: Tue, 6 Oct 2026 11:06:52 +0200 Message-ID: <20261006090654.3445576-1-andrej.kozemcak@siemens.com> MIME-Version: 1.0 X-Flowmailer-Platform: Siemens Feedback-ID: 519:519-1334352:519-21489:flowmailer List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Tue, 06 Oct 2026 09:07:08 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/247279 Testimage.bbclass can now boot from nfs, but pseudo is globally disabled by default in the environment. This corrupts file access rights when qemu boots from nfs, causing failures. Explicitly enable pseudo in runqemu-export-rootfs since it is required here. Explicitly enable pseudo during rootfs extraction so an inherited PSEUDO_DISABLED=1 does not lose archive ownership before NFS export. Also export OECORE_NATIVE_SYSROOT from qemurunner so runqemu-export-rootfs can locate pseudo without needing a second tinfoil connection. Skip the snapshot tmpfs copy for NFS rootfs directories, which cannot be copied as disk-image files. Signed-off-by: Andrej Kozemcak --- meta/lib/oeqa/utils/qemurunner.py | 4 ++++ scripts/lib/pseudo_rootfs_utils.py | 1 + scripts/runqemu | 2 +- scripts/runqemu-export-rootfs | 2 ++ 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/meta/lib/oeqa/utils/qemurunner.py b/meta/lib/oeqa/utils/qemurunner.py index 5979b52650..1a83c01ea8 100644 --- a/meta/lib/oeqa/utils/qemurunner.py +++ b/meta/lib/oeqa/utils/qemurunner.py @@ -166,6 +166,10 @@ class QemuRunner: if self.tmpfsdir: env["RUNQEMU_TMPFS_DIR"] = self.tmpfsdir + if self.native_sysroot: + # Needed by runqemu-export-rootfs (avoid a second tinfoil connection) + env["OECORE_NATIVE_SYSROOT"] = self.native_sysroot + if not launch_cmd: launch_cmd = 'runqemu %s' % ('snapshot' if discard_writes else '') if self.use_kvm: diff --git a/scripts/lib/pseudo_rootfs_utils.py b/scripts/lib/pseudo_rootfs_utils.py index 12431e2080..e539a69f82 100644 --- a/scripts/lib/pseudo_rootfs_utils.py +++ b/scripts/lib/pseudo_rootfs_utils.py @@ -97,6 +97,7 @@ def extract_sdk_rootfs(rootfs_tarball, rootfs_dir, pseudo_cmd, environment): environment = dict(environment) environment['PSEUDO_LOCALSTATEDIR'] = state_dir environment['PSEUDO_INCLUDE_PATHS'] = rootfs_dir + environment['PSEUDO_DISABLED'] = '0' command = list(pseudo_cmd) + ['tar', '-C', rootfs_dir] + tar_options + [rootfs_tarball] print('Extracting rootfs tarball using pseudo...') diff --git a/scripts/runqemu b/scripts/runqemu index 2c126e7f54..74a00e5481 100755 --- a/scripts/runqemu +++ b/scripts/runqemu @@ -1289,7 +1289,7 @@ to your build configuration. rootfs_format = self.fstype if self.fstype in ('vmdk', 'vhd', 'vhdx', 'qcow2', 'vdi') else 'raw' tmpfsdir = os.environ.get("RUNQEMU_TMPFS_DIR", None) - if self.snapshot and tmpfsdir: + if self.snapshot and tmpfsdir and self.fstype != 'nfs': newrootfs = os.path.join(tmpfsdir, os.path.basename(self.rootfs)) + "." + str(os.getpid()) logger.info("Copying rootfs to %s" % newrootfs) copy_start = time.time() diff --git a/scripts/runqemu-export-rootfs b/scripts/runqemu-export-rootfs index 150513bc50..ff19a0ccc9 100755 --- a/scripts/runqemu-export-rootfs +++ b/scripts/runqemu-export-rootfs @@ -58,6 +58,8 @@ PSEUDO_LOCALSTATEDIR="$NFS_EXPORT_DIR/../$(basename $NFS_EXPORT_DIR).pseudo_stat export PSEUDO_LOCALSTATEDIR PSEUDO_INCLUDE_PATHS="$NFS_EXPORT_DIR" export PSEUDO_INCLUDE_PATHS +# Enable pseudo +export PSEUDO_DISABLED=0 if [ ! -d "$PSEUDO_LOCALSTATEDIR" ]; then echo "Error: $PSEUDO_LOCALSTATEDIR does not exist."