* [PATCH v4 1/6] wic: copy rootfs directory before changing fstab
2017-07-27 14:02 [PATCH v4 0/6] #11662 - wic should mount /boot Ed Bartosh
@ 2017-07-27 14:02 ` Ed Bartosh
2017-07-27 14:02 ` [PATCH v4 2/6] wic: use absolute paths in rootfs plugin Ed Bartosh
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Ed Bartosh @ 2017-07-27 14:02 UTC (permalink / raw)
To: openembedded-core
wic updates /etc/fstab on root partition if there are
valid mount points in .wks
When wic runs from bitbake this can cause incorrect results
or even breakage of other tasks working with the same rootfs
directory in parallel with do_image_wic.
Implemented copying rootfs directory to a temporary location
before updating fstab to avoid conflicts with other tasks working
with the same rootfs directory.
Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
---
scripts/lib/wic/plugins/imager/direct.py | 22 +++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)
diff --git a/scripts/lib/wic/plugins/imager/direct.py b/scripts/lib/wic/plugins/imager/direct.py
index f20d843..07e3f3e 100644
--- a/scripts/lib/wic/plugins/imager/direct.py
+++ b/scripts/lib/wic/plugins/imager/direct.py
@@ -115,12 +115,18 @@ class DirectPlugin(ImagerPlugin):
fstab_lines = fstab.readlines()
if self._update_fstab(fstab_lines, self.parts):
- shutil.copyfile(fstab_path, fstab_path + ".orig")
+ # copy rootfs dir to workdir to update fstab
+ # as rootfs can be used by other tasks and can't be modified
+ new_rootfs = os.path.realpath(os.path.join(self.workdir, "rootfs_copy"))
+ exec_cmd("cp -a %s %s" % (image_rootfs, new_rootfs),
+ self.native_sysroot)
+
+ fstab_path = os.path.join(new_rootfs, 'etc/fstab')
with open(fstab_path, "w") as fstab:
fstab.writelines(fstab_lines)
- return fstab_path
+ return new_rootfs
def _update_fstab(self, fstab_lines, parts):
"""Assume partition order same as in wks"""
@@ -156,7 +162,10 @@ class DirectPlugin(ImagerPlugin):
filesystems from the artifacts directly and combine them into
a partitioned image.
"""
- fstab_path = self._write_fstab(self.rootfs_dir.get("ROOTFS_DIR"))
+ new_rootfs = self._write_fstab(self.rootfs_dir.get("ROOTFS_DIR"))
+ if new_rootfs:
+ # rootfs was copied to update fstab
+ self.rootfs_dir['ROOTFS_DIR'] = new_rootfs
for part in self.parts:
# get rootfs size from bitbake variable if it's not set in .ks file
@@ -172,12 +181,7 @@ class DirectPlugin(ImagerPlugin):
if rsize_bb:
part.size = int(round(float(rsize_bb)))
- try:
- self._image.prepare(self)
- finally:
- if fstab_path:
- shutil.move(fstab_path + ".orig", fstab_path)
-
+ self._image.prepare(self)
self._image.layout_partitions()
self._image.create()
--
2.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v4 2/6] wic: use absolute paths in rootfs plugin
2017-07-27 14:02 [PATCH v4 0/6] #11662 - wic should mount /boot Ed Bartosh
2017-07-27 14:02 ` [PATCH v4 1/6] wic: copy rootfs directory before changing fstab Ed Bartosh
@ 2017-07-27 14:02 ` Ed Bartosh
2017-07-27 14:02 ` [PATCH v4 3/6] wic: rootfs: fix rootfs path reporting Ed Bartosh
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Ed Bartosh @ 2017-07-27 14:02 UTC (permalink / raw)
To: openembedded-core
Using relative paths can cause copyhardlinktree API to fail as
it changes current directory when working. Converted all paths
to absolute paths using os.path.realpath.
Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
---
scripts/lib/wic/plugins/source/rootfs.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/scripts/lib/wic/plugins/source/rootfs.py b/scripts/lib/wic/plugins/source/rootfs.py
index 4dc4cb8..c08f760 100644
--- a/scripts/lib/wic/plugins/source/rootfs.py
+++ b/scripts/lib/wic/plugins/source/rootfs.py
@@ -48,7 +48,7 @@ class RootfsPlugin(SourcePlugin):
@staticmethod
def __get_rootfs_dir(rootfs_dir):
if os.path.isdir(rootfs_dir):
- return rootfs_dir
+ return os.path.realpath(rootfs_dir)
image_rootfs_dir = get_bitbake_var("IMAGE_ROOTFS", rootfs_dir)
if not os.path.isdir(image_rootfs_dir):
@@ -56,7 +56,7 @@ class RootfsPlugin(SourcePlugin):
"named %s has been found at %s, exiting." %
(rootfs_dir, image_rootfs_dir))
- return image_rootfs_dir
+ return os.path.realpath(image_rootfs_dir)
@classmethod
def do_prepare_partition(cls, part, source_params, cr, cr_workdir,
--
2.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v4 3/6] wic: rootfs: fix rootfs path reporting
2017-07-27 14:02 [PATCH v4 0/6] #11662 - wic should mount /boot Ed Bartosh
2017-07-27 14:02 ` [PATCH v4 1/6] wic: copy rootfs directory before changing fstab Ed Bartosh
2017-07-27 14:02 ` [PATCH v4 2/6] wic: use absolute paths in rootfs plugin Ed Bartosh
@ 2017-07-27 14:02 ` Ed Bartosh
2017-07-27 14:02 ` [PATCH v4 4/6] wic: rootfs: make copied rootfs unique Ed Bartosh
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Ed Bartosh @ 2017-07-27 14:02 UTC (permalink / raw)
To: openembedded-core
wic gets rootfs paths from partition object property
'rootfs_dir' and shows them in final report.
rootfs plugin sets this property to the temporary path,
which causes temporary paths appearing in the report.
Changed the code to prevent storing temporary rootfs path
in part.rootfs_dir. This should fix the report.
Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
---
scripts/lib/wic/plugins/source/rootfs.py | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/scripts/lib/wic/plugins/source/rootfs.py b/scripts/lib/wic/plugins/source/rootfs.py
index c08f760..e438158 100644
--- a/scripts/lib/wic/plugins/source/rootfs.py
+++ b/scripts/lib/wic/plugins/source/rootfs.py
@@ -81,8 +81,9 @@ class RootfsPlugin(SourcePlugin):
raise WicError("Couldn't find --rootfs-dir=%s connection or "
"it is not a valid path, exiting" % part.rootfs_dir)
- real_rootfs_dir = cls.__get_rootfs_dir(rootfs_dir)
+ part.rootfs_dir = cls.__get_rootfs_dir(rootfs_dir)
+ new_rootfs = None
# Handle excluded paths.
if part.exclude_path is not None:
# We need a new rootfs directory we can delete files from. Copy to
@@ -92,9 +93,7 @@ class RootfsPlugin(SourcePlugin):
if os.path.lexists(new_rootfs):
shutil.rmtree(os.path.join(new_rootfs))
- copyhardlinktree(real_rootfs_dir, new_rootfs)
-
- real_rootfs_dir = new_rootfs
+ copyhardlinktree(part.rootfs_dir, new_rootfs)
for orig_path in part.exclude_path:
path = orig_path
@@ -123,6 +122,5 @@ class RootfsPlugin(SourcePlugin):
# Delete whole directory.
shutil.rmtree(full_path)
- part.rootfs_dir = real_rootfs_dir
part.prepare_rootfs(cr_workdir, oe_builddir,
- real_rootfs_dir, native_sysroot)
+ new_rootfs or part.rootfs_dir, native_sysroot)
--
2.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v4 4/6] wic: rootfs: make copied rootfs unique
2017-07-27 14:02 [PATCH v4 0/6] #11662 - wic should mount /boot Ed Bartosh
` (2 preceding siblings ...)
2017-07-27 14:02 ` [PATCH v4 3/6] wic: rootfs: fix rootfs path reporting Ed Bartosh
@ 2017-07-27 14:02 ` Ed Bartosh
2017-07-27 14:02 ` [PATCH v4 5/6] wic: add /boot mount point to fstab by default Ed Bartosh
2017-07-27 14:02 ` [PATCH v4 6/6] oe-selftest: wic: fix test_quemu Ed Bartosh
5 siblings, 0 replies; 7+ messages in thread
From: Ed Bartosh @ 2017-07-27 14:02 UTC (permalink / raw)
To: openembedded-core
Used unique suffix (line number from .wks file) for the
copied rootfs directory to avoid possible conflicts.
Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
---
scripts/lib/wic/plugins/source/rootfs.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/scripts/lib/wic/plugins/source/rootfs.py b/scripts/lib/wic/plugins/source/rootfs.py
index e438158..aec720f 100644
--- a/scripts/lib/wic/plugins/source/rootfs.py
+++ b/scripts/lib/wic/plugins/source/rootfs.py
@@ -88,7 +88,7 @@ class RootfsPlugin(SourcePlugin):
if part.exclude_path is not None:
# We need a new rootfs directory we can delete files from. Copy to
# workdir.
- new_rootfs = os.path.realpath(os.path.join(cr_workdir, "rootfs"))
+ new_rootfs = os.path.realpath(os.path.join(cr_workdir, "rootfs%d" % part.lineno))
if os.path.lexists(new_rootfs):
shutil.rmtree(os.path.join(new_rootfs))
--
2.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v4 5/6] wic: add /boot mount point to fstab by default
2017-07-27 14:02 [PATCH v4 0/6] #11662 - wic should mount /boot Ed Bartosh
` (3 preceding siblings ...)
2017-07-27 14:02 ` [PATCH v4 4/6] wic: rootfs: make copied rootfs unique Ed Bartosh
@ 2017-07-27 14:02 ` Ed Bartosh
2017-07-27 14:02 ` [PATCH v4 6/6] oe-selftest: wic: fix test_quemu Ed Bartosh
5 siblings, 0 replies; 7+ messages in thread
From: Ed Bartosh @ 2017-07-27 14:02 UTC (permalink / raw)
To: openembedded-core
wic avoided adding /boot to fstab for no reason.
This exception was hardcoded in the wic code.
There is no need for this as mountpoint in .wks file is an optional
field. It can be used only if user wants to have partitions
automatically mounted on system boot.
[YOCTO #11662]
Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
---
scripts/lib/wic/plugins/imager/direct.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/scripts/lib/wic/plugins/imager/direct.py b/scripts/lib/wic/plugins/imager/direct.py
index 07e3f3e..61500ab 100644
--- a/scripts/lib/wic/plugins/imager/direct.py
+++ b/scripts/lib/wic/plugins/imager/direct.py
@@ -133,7 +133,7 @@ class DirectPlugin(ImagerPlugin):
updated = False
for part in parts:
if not part.realnum or not part.mountpoint \
- or part.mountpoint in ("/", "/boot"):
+ or part.mountpoint == "/":
continue
# mmc device partitions are named mmcblk0p1, mmcblk0p2..
--
2.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v4 6/6] oe-selftest: wic: fix test_quemu
2017-07-27 14:02 [PATCH v4 0/6] #11662 - wic should mount /boot Ed Bartosh
` (4 preceding siblings ...)
2017-07-27 14:02 ` [PATCH v4 5/6] wic: add /boot mount point to fstab by default Ed Bartosh
@ 2017-07-27 14:02 ` Ed Bartosh
5 siblings, 0 replies; 7+ messages in thread
From: Ed Bartosh @ 2017-07-27 14:02 UTC (permalink / raw)
To: openembedded-core
This test case boots the image in qemu and checks for mounted
partitions. As /boot is mounted automatically the test case fails.
Fixed this by adding /boot to the list of mounted partitions.
Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
---
meta/lib/oeqa/selftest/cases/wic.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/meta/lib/oeqa/selftest/cases/wic.py b/meta/lib/oeqa/selftest/cases/wic.py
index 7c2c877..aaefd4f 100644
--- a/meta/lib/oeqa/selftest/cases/wic.py
+++ b/meta/lib/oeqa/selftest/cases/wic.py
@@ -637,7 +637,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/sda3 /mnt')
+ self.assertEqual(output, '/dev/root /\r\n/dev/sda1 /boot\r\n/dev/sda3 /mnt')
@only_for_arch(['i586', 'i686', 'x86_64'])
@OETestID(1852)
--
2.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread