diff options
Diffstat (limited to 'scripts/lib/wic/plugins/imager/direct.py')
| -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: |
