summaryrefslogtreecommitdiffstats
path: root/scripts/lib/wic/plugins/imager/direct.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/lib/wic/plugins/imager/direct.py')
-rw-r--r--scripts/lib/wic/plugins/imager/direct.py97
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
36from wic.pluginbase import ImagerPlugin 36from wic.pluginbase import ImagerPlugin
37from wic.utils.errors import CreatorError, ImageError 37from wic.utils.errors import CreatorError, ImageError
38from wic.utils.misc import get_bitbake_var, exec_cmd, exec_native_cmd 38from wic.utils.misc import get_bitbake_var, exec_cmd, exec_native_cmd
39from wic.utils.partitionedfs import Image 39from wic.utils.partitionedfs import PartitionedImage
40 40
41class 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
59class DirectPlugin(ImagerPlugin): 42class 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: