diff options
author | Ed Bartosh <ed.bartosh@linux.intel.com> | 2017-02-09 15:52:55 +0200 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-02-15 20:06:44 -0800 |
commit | adf5e2956ca4e3136be0ee785115a7e1941a135b (patch) | |
tree | f15fb103786bbf8437fee80c89956bbe5be60e02 /scripts/lib/wic/plugins/imager | |
parent | 47ee6c2153db204a9fda718b92616d4bf851057e (diff) | |
download | poky-adf5e2956ca4e3136be0ee785115a7e1941a135b.tar.gz |
wic: move disk operations to PartitionImage class
Disk operations were spread over DirectPlugin, DiskImage and Image
code making the code hard to understand.
Renamed Image class to PartitionedImage.
Removed DiskImage class.
Moved disk operations to PartitionedImage.
There was an implicit support for multiple disks: if different devices
were specified in .wks file (e.g. --ondisk sda and --ondisk sdb), wic
would theoretically generate multiple images. This is quite confusing
option and the code supporting it was broken for a long time. The same
effect (multiple output images) can be achieved in obvious and clear
way - by using multiple .wks files.
This functionality was removed. PartitionedImage works only with
one image. This makes the code less complex and easier to maintain.
(From OE-Core rev: 4dc9dbfc7fbc16d349a019e8973d50905cd28244)
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/plugins/imager')
-rw-r--r-- | scripts/lib/wic/plugins/imager/direct.py | 97 |
1 files changed, 30 insertions, 67 deletions
diff --git a/scripts/lib/wic/plugins/imager/direct.py b/scripts/lib/wic/plugins/imager/direct.py index a9144e2f4b..fefe88e0df 100644 --- a/scripts/lib/wic/plugins/imager/direct.py +++ b/scripts/lib/wic/plugins/imager/direct.py | |||
@@ -36,25 +36,8 @@ from wic.plugin import pluginmgr | |||
36 | from wic.pluginbase import ImagerPlugin | 36 | from wic.pluginbase import ImagerPlugin |
37 | from wic.utils.errors import CreatorError, ImageError | 37 | from wic.utils.errors import CreatorError, ImageError |
38 | from wic.utils.misc import get_bitbake_var, exec_cmd, exec_native_cmd | 38 | from wic.utils.misc import get_bitbake_var, exec_cmd, exec_native_cmd |
39 | from wic.utils.partitionedfs import Image | 39 | from wic.utils.partitionedfs import PartitionedImage |
40 | 40 | ||
41 | class DiskImage(): | ||
42 | """ | ||
43 | A Disk backed by a file. | ||
44 | """ | ||
45 | def __init__(self, device, size): | ||
46 | self.size = size | ||
47 | self.device = device | ||
48 | self.created = False | ||
49 | |||
50 | def create(self): | ||
51 | if self.created: | ||
52 | return | ||
53 | # create sparse disk image | ||
54 | with open(self.device, 'w') as sparse: | ||
55 | os.ftruncate(sparse.fileno(), self.size) | ||
56 | |||
57 | self.created = True | ||
58 | 41 | ||
59 | class DirectPlugin(ImagerPlugin): | 42 | class DirectPlugin(ImagerPlugin): |
60 | """ | 43 | """ |
@@ -189,9 +172,10 @@ class DirectPlugin(ImagerPlugin): | |||
189 | filesystems from the artifacts directly and combine them into | 172 | filesystems from the artifacts directly and combine them into |
190 | a partitioned image. | 173 | a partitioned image. |
191 | """ | 174 | """ |
192 | self._image = Image(self.native_sysroot) | 175 | image_path = self._full_path(self.workdir, self.parts[0].disk, "direct") |
176 | self._image = PartitionedImage(image_path, self.ptable_format, | ||
177 | self.native_sysroot) | ||
193 | 178 | ||
194 | disk_ids = {} | ||
195 | for num, part in enumerate(self.parts, 1): | 179 | for num, part in enumerate(self.parts, 1): |
196 | # as a convenience, set source to the boot partition source | 180 | # as a convenience, set source to the boot partition source |
197 | # instead of forcing it to be set via bootloader --source | 181 | # instead of forcing it to be set via bootloader --source |
@@ -203,10 +187,8 @@ class DirectPlugin(ImagerPlugin): | |||
203 | if self.ptable_format == 'gpt': | 187 | if self.ptable_format == 'gpt': |
204 | part.uuid = str(uuid.uuid4()) | 188 | part.uuid = str(uuid.uuid4()) |
205 | else: # msdos partition table | 189 | else: # msdos partition table |
206 | if part.disk not in disk_ids: | 190 | part.uuid = '%0x-%02d' % (self._image.identifier, |
207 | disk_ids[part.disk] = int.from_bytes(os.urandom(4), 'little') | 191 | self._get_part_num(num, self.parts)) |
208 | disk_id = disk_ids[part.disk] | ||
209 | part.uuid = '%0x-%02d' % (disk_id, self._get_part_num(num, self.parts)) | ||
210 | 192 | ||
211 | fstab_path = self._write_fstab(self.rootfs_dir.get("ROOTFS_DIR")) | 193 | fstab_path = self._write_fstab(self.rootfs_dir.get("ROOTFS_DIR")) |
212 | 194 | ||
@@ -225,11 +207,6 @@ class DirectPlugin(ImagerPlugin): | |||
225 | part.size = int(round(float(rsize_bb))) | 207 | part.size = int(round(float(rsize_bb))) |
226 | # need to create the filesystems in order to get their | 208 | # need to create the filesystems in order to get their |
227 | # sizes before we can add them and do the layout. | 209 | # sizes before we can add them and do the layout. |
228 | # Image.create() actually calls __format_disks() to create | ||
229 | # the disk images and carve out the partitions, then | ||
230 | # self.assemble() calls Image.assemble() which calls | ||
231 | # __write_partitition() for each partition to dd the fs | ||
232 | # into the partitions. | ||
233 | part.prepare(self, self.workdir, self.oe_builddir, self.rootfs_dir, | 210 | part.prepare(self, self.workdir, self.oe_builddir, self.rootfs_dir, |
234 | self.bootimg_dir, self.kernel_dir, self.native_sysroot) | 211 | self.bootimg_dir, self.kernel_dir, self.native_sysroot) |
235 | 212 | ||
@@ -238,26 +215,14 @@ class DirectPlugin(ImagerPlugin): | |||
238 | if fstab_path: | 215 | if fstab_path: |
239 | shutil.move(fstab_path + ".orig", fstab_path) | 216 | shutil.move(fstab_path + ".orig", fstab_path) |
240 | 217 | ||
241 | self._image.layout_partitions(self.ptable_format) | 218 | self._image.layout_partitions() |
242 | |||
243 | for disk_name, disk in self._image.disks.items(): | ||
244 | full_path = self._full_path(self.workdir, disk_name, "direct") | ||
245 | msger.debug("Adding disk %s as %s with size %s bytes" \ | ||
246 | % (disk_name, full_path, disk['min_size'])) | ||
247 | disk_obj = DiskImage(full_path, disk['min_size']) | ||
248 | self._image.add_disk(disk_name, disk_obj, disk_ids.get(disk_name)) | ||
249 | |||
250 | self._image.create() | 219 | self._image.create() |
251 | 220 | ||
252 | def assemble(self): | 221 | def assemble(self): |
253 | """ | 222 | """ |
254 | Assemble partitions into disk image(s) | 223 | Assemble partitions into disk image |
255 | """ | 224 | """ |
256 | for disk_name, disk in self._image.disks.items(): | 225 | self._image.assemble() |
257 | full_path = self._full_path(self.workdir, disk_name, "direct") | ||
258 | msger.debug("Assembling disk %s as %s with size %s bytes" \ | ||
259 | % (disk_name, full_path, disk['min_size'])) | ||
260 | self._image.assemble(full_path) | ||
261 | 226 | ||
262 | def finalize(self): | 227 | def finalize(self): |
263 | """ | 228 | """ |
@@ -267,26 +232,25 @@ class DirectPlugin(ImagerPlugin): | |||
267 | creating and installing a bootloader configuration. | 232 | creating and installing a bootloader configuration. |
268 | """ | 233 | """ |
269 | source_plugin = self.ks.bootloader.source | 234 | source_plugin = self.ks.bootloader.source |
235 | disk_name = self.parts[0].disk | ||
270 | if source_plugin: | 236 | if source_plugin: |
271 | name = "do_install_disk" | 237 | name = "do_install_disk" |
272 | methods = pluginmgr.get_source_plugin_methods(source_plugin, | 238 | methods = pluginmgr.get_source_plugin_methods(source_plugin, |
273 | {name: None}) | 239 | {name: None}) |
274 | for disk_name, disk in self._image.disks.items(): | 240 | methods["do_install_disk"](self._image, disk_name, self, self.workdir, |
275 | methods["do_install_disk"](disk, disk_name, self, self.workdir, | 241 | self.oe_builddir, self.bootimg_dir, |
276 | self.oe_builddir, self.bootimg_dir, | 242 | self.kernel_dir, self.native_sysroot) |
277 | self.kernel_dir, self.native_sysroot) | 243 | |
278 | 244 | full_path = self._image.path | |
279 | for disk_name, disk in self._image.disks.items(): | 245 | # Generate .bmap |
280 | full_path = self._full_path(self.workdir, disk_name, "direct") | 246 | if self.bmap: |
281 | # Generate .bmap | 247 | msger.debug("Generating bmap file for %s" % disk_name) |
282 | if self.bmap: | 248 | exec_native_cmd("bmaptool create %s -o %s.bmap" % (full_path, full_path), |
283 | msger.debug("Generating bmap file for %s" % disk_name) | 249 | self.native_sysroot) |
284 | exec_native_cmd("bmaptool create %s -o %s.bmap" % (full_path, full_path), | 250 | # Compress the image |
285 | self.native_sysroot) | 251 | if self.compressor: |
286 | # Compress the image | 252 | msger.debug("Compressing disk %s with %s" % (disk_name, self.compressor)) |
287 | if self.compressor: | 253 | exec_cmd("%s %s" % (self.compressor, full_path)) |
288 | msger.debug("Compressing disk %s with %s" % (disk_name, self.compressor)) | ||
289 | exec_cmd("%s %s" % (self.compressor, full_path)) | ||
290 | 254 | ||
291 | def print_info(self): | 255 | def print_info(self): |
292 | """ | 256 | """ |
@@ -294,13 +258,12 @@ class DirectPlugin(ImagerPlugin): | |||
294 | """ | 258 | """ |
295 | msg = "The new image(s) can be found here:\n" | 259 | msg = "The new image(s) can be found here:\n" |
296 | 260 | ||
297 | for disk_name in self._image.disks: | 261 | extension = "direct" + {"gzip": ".gz", |
298 | extension = "direct" + {"gzip": ".gz", | 262 | "bzip2": ".bz2", |
299 | "bzip2": ".bz2", | 263 | "xz": ".xz", |
300 | "xz": ".xz", | 264 | None: ""}.get(self.compressor) |
301 | None: ""}.get(self.compressor) | 265 | full_path = self._full_path(self.outdir, self.parts[0].disk, extension) |
302 | full_path = self._full_path(self.outdir, disk_name, extension) | 266 | msg += ' %s\n\n' % full_path |
303 | msg += ' %s\n\n' % full_path | ||
304 | 267 | ||
305 | msg += 'The following build artifacts were used to create the image(s):\n' | 268 | msg += 'The following build artifacts were used to create the image(s):\n' |
306 | for part in self.parts: | 269 | for part in self.parts: |