diff options
author | Ed Bartosh <ed.bartosh@linux.intel.com> | 2017-07-25 14:26:36 +0300 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-07-30 08:46:19 +0100 |
commit | c4f9d8151fb680570d89bdbc9f969c8d9760091c (patch) | |
tree | 6852ad973b343d00ed52b32e6d9d340170f93455 /scripts | |
parent | a9cab2f0edf693d336935c4f915c22fa5870b423 (diff) | |
download | poky-c4f9d8151fb680570d89bdbc9f969c8d9760091c.tar.gz |
wic: copy rootfs directory before changing fstab
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
using copyhardlinktree before updating fstab to avoid conflicts with
other tasks working with the same rootfs directory.
(From OE-Core rev: 92e1c7d47e695eb4ce1a863cd0f6c49dca1c2339)
Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/lib/wic/plugins/imager/direct.py | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/scripts/lib/wic/plugins/imager/direct.py b/scripts/lib/wic/plugins/imager/direct.py index f20d8433f1..4f441c1ae5 100644 --- a/scripts/lib/wic/plugins/imager/direct.py +++ b/scripts/lib/wic/plugins/imager/direct.py | |||
@@ -32,6 +32,8 @@ import uuid | |||
32 | 32 | ||
33 | from time import strftime | 33 | from time import strftime |
34 | 34 | ||
35 | from oe.path import copyhardlinktree | ||
36 | |||
35 | from wic import WicError | 37 | from wic import WicError |
36 | from wic.filemap import sparse_copy | 38 | from wic.filemap import sparse_copy |
37 | from wic.ksparser import KickStart, KickStartError | 39 | from wic.ksparser import KickStart, KickStartError |
@@ -115,12 +117,18 @@ class DirectPlugin(ImagerPlugin): | |||
115 | fstab_lines = fstab.readlines() | 117 | fstab_lines = fstab.readlines() |
116 | 118 | ||
117 | if self._update_fstab(fstab_lines, self.parts): | 119 | if self._update_fstab(fstab_lines, self.parts): |
118 | shutil.copyfile(fstab_path, fstab_path + ".orig") | 120 | # copy rootfs dir to workdir to update fstab |
121 | # as rootfs can be used by other tasks and can't be modified | ||
122 | new_rootfs = os.path.realpath(os.path.join(self.workdir, "rootfs_copy")) | ||
123 | copyhardlinktree(image_rootfs, new_rootfs) | ||
124 | fstab_path = os.path.join(new_rootfs, 'etc/fstab') | ||
125 | |||
126 | os.unlink(fstab_path) | ||
119 | 127 | ||
120 | with open(fstab_path, "w") as fstab: | 128 | with open(fstab_path, "w") as fstab: |
121 | fstab.writelines(fstab_lines) | 129 | fstab.writelines(fstab_lines) |
122 | 130 | ||
123 | return fstab_path | 131 | return new_rootfs |
124 | 132 | ||
125 | def _update_fstab(self, fstab_lines, parts): | 133 | def _update_fstab(self, fstab_lines, parts): |
126 | """Assume partition order same as in wks""" | 134 | """Assume partition order same as in wks""" |
@@ -156,7 +164,10 @@ class DirectPlugin(ImagerPlugin): | |||
156 | filesystems from the artifacts directly and combine them into | 164 | filesystems from the artifacts directly and combine them into |
157 | a partitioned image. | 165 | a partitioned image. |
158 | """ | 166 | """ |
159 | fstab_path = self._write_fstab(self.rootfs_dir.get("ROOTFS_DIR")) | 167 | new_rootfs = self._write_fstab(self.rootfs_dir.get("ROOTFS_DIR")) |
168 | if new_rootfs: | ||
169 | # rootfs was copied to update fstab | ||
170 | self.rootfs_dir['ROOTFS_DIR'] = new_rootfs | ||
160 | 171 | ||
161 | for part in self.parts: | 172 | for part in self.parts: |
162 | # get rootfs size from bitbake variable if it's not set in .ks file | 173 | # get rootfs size from bitbake variable if it's not set in .ks file |
@@ -172,12 +183,7 @@ class DirectPlugin(ImagerPlugin): | |||
172 | if rsize_bb: | 183 | if rsize_bb: |
173 | part.size = int(round(float(rsize_bb))) | 184 | part.size = int(round(float(rsize_bb))) |
174 | 185 | ||
175 | try: | 186 | self._image.prepare(self) |
176 | self._image.prepare(self) | ||
177 | finally: | ||
178 | if fstab_path: | ||
179 | shutil.move(fstab_path + ".orig", fstab_path) | ||
180 | |||
181 | self._image.layout_partitions() | 187 | self._image.layout_partitions() |
182 | self._image.create() | 188 | self._image.create() |
183 | 189 | ||