From: "Dragomir, Daniel" <daniel.dragomir@windriver.com>
To: openembedded-core@lists.openembedded.org
Subject: [OE-core][PATCH] wic/engine: fix copying directories into wic image with ext* partition
Date: Fri, 3 Oct 2025 23:31:30 +0300 [thread overview]
Message-ID: <20251003203130.23843-1-daniel.dragomir@windriver.com> (raw)
wic uses debugfs to write on ext* partitions, but debugfs can only
write to the current working directory and it cannot copy complete
directory trees. Running 'wic ls' on a copied directory show this:
-l: Ext2 inode is not a directory
Fix this by creating a command list for debugfs (-f parameter) when
recursive parsing the host directory in order to create a similar
directory structure (mkdir) and copy files (write) on each level
into the destination directory from the wic's ext* partition.
Signed-off-by: Daniel Dragomir <daniel.dragomir@windriver.com>
---
scripts/lib/wic/engine.py | 63 ++++++++++++++++++++++++++++++---------
1 file changed, 49 insertions(+), 14 deletions(-)
diff --git a/scripts/lib/wic/engine.py b/scripts/lib/wic/engine.py
index b9e60cbe4e..9d596be3a7 100644
--- a/scripts/lib/wic/engine.py
+++ b/scripts/lib/wic/engine.py
@@ -345,29 +345,64 @@ class Disk:
path))
def copy(self, src, dest):
- """Copy partition image into wic image."""
- pnum = dest.part if isinstance(src, str) else src.part
+ """Copy files or directories to/from the vfat or ext* partition."""
+ pnum = dest.part if isinstance(src, str) else src.part
+ partimg = self._get_part_image(pnum)
if self.partitions[pnum].fstype.startswith('ext'):
- if isinstance(src, str):
- cmd = "printf 'cd {}\nwrite {} {}\n' | {} -w {}".\
- format(os.path.dirname(dest.path), src, os.path.basename(src),
- self.debugfs, self._get_part_image(pnum))
- else: # copy from wic
- # run both dump and rdump to support both files and directory
+ if isinstance(src, str): # host to image case
+ if os.path.isdir(src):
+ base = os.path.abspath(src)
+ base_parent = os.path.dirname(base)
+ cmds = []
+ made = set()
+
+ for root, dirs, files in os.walk(base):
+ for fname in files:
+ host_file = os.path.join(root, fname)
+ rel = os.path.relpath(host_file, base_parent)
+ dest_file = os.path.join(dest.path, rel)
+ dest_dir = os.path.dirname(dest_file)
+
+ # create dir structure (mkdir -p)
+ parts = dest_dir.strip('/').split('/')
+ cur = ''
+ for p in parts:
+ cur = cur + '/' + p
+ if cur not in made:
+ cmds.append(f'mkdir "{cur}"')
+ made.add(cur)
+
+ cmds.append(f'write "{host_file}" "{dest_file}"')
+
+ # write script to a temp file
+ with tempfile.NamedTemporaryFile(mode='w', delete=False,
+ prefix='wic-debugfs-') as tf:
+ for line in cmds:
+ tf.write(line + '\n')
+ scriptname = tf.name
+
+ cmd = f"{self.debugfs} -w -f {scriptname} {partimg}"
+
+ else: # single file
+ cmd = "printf 'cd {}\nwrite {} {}\n' | {} -w {}".\
+ format(os.path.dirname(dest.path), src,
+ os.path.basename(src), self.debugfs, partimg)
+
+ else: # image to host case
cmd = "printf 'cd {}\ndump /{} {}\nrdump /{} {}\n' | {} {}".\
format(os.path.dirname(src.path), src.path,
- dest, src.path, dest, self.debugfs,
- self._get_part_image(pnum))
+ dest, src.path, dest, self.debugfs, partimg)
+
else: # fat
if isinstance(src, str):
cmd = "{} -i {} -snop {} ::{}".format(self.mcopy,
- self._get_part_image(pnum),
- src, dest.path)
+ partimg,
+ src, dest.path)
else:
cmd = "{} -i {} -snop ::{} {}".format(self.mcopy,
- self._get_part_image(pnum),
- src.path, dest)
+ partimg,
+ src.path, dest)
exec_cmd(cmd, as_shell=True)
self._put_part_image(pnum)
--
2.25.1
next reply other threads:[~2025-10-04 12:16 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-03 20:31 Dragomir, Daniel [this message]
2025-10-06 20:08 ` [OE-core][PATCH] wic/engine: fix copying directories into wic image with ext* partition Ross Burton
2025-12-11 10:07 ` Richard Purdie
2025-12-17 13:15 ` Dragomir, Daniel
2025-12-17 14:48 ` Richard Purdie
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251003203130.23843-1-daniel.dragomir@windriver.com \
--to=daniel.dragomir@windriver.com \
--cc=openembedded-core@lists.openembedded.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.