summaryrefslogtreecommitdiffstats
path: root/scripts/lib/wic
diff options
context:
space:
mode:
authorEd Bartosh <ed.bartosh@linux.intel.com>2017-07-25 14:26:36 +0300
committerRichard Purdie <richard.purdie@linuxfoundation.org>2017-07-30 08:46:19 +0100
commitc4f9d8151fb680570d89bdbc9f969c8d9760091c (patch)
tree6852ad973b343d00ed52b32e6d9d340170f93455 /scripts/lib/wic
parenta9cab2f0edf693d336935c4f915c22fa5870b423 (diff)
downloadpoky-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/lib/wic')
-rw-r--r--scripts/lib/wic/plugins/imager/direct.py24
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
33from time import strftime 33from time import strftime
34 34
35from oe.path import copyhardlinktree
36
35from wic import WicError 37from wic import WicError
36from wic.filemap import sparse_copy 38from wic.filemap import sparse_copy
37from wic.ksparser import KickStart, KickStartError 39from 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