blob: 24299c1ece17963524bef079e92f45582c5af791 [file] [log] [blame]
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001#
Brad Bishopc342db32019-05-15 21:57:59 -04002# SPDX-License-Identifier: GPL-2.0-only
Patrick Williamsc124f4f2015-09-15 14:41:29 -05003#
4# DESCRIPTION
5# This implements the 'isoimage-isohybrid' source plugin class for 'wic'
6#
7# AUTHORS
8# Mihaly Varga <mihaly.varga (at] ni.com>
9
Brad Bishop6e60e8b2018-02-01 10:27:11 -050010import glob
11import logging
Patrick Williamsc124f4f2015-09-15 14:41:29 -050012import os
13import re
14import shutil
15
Brad Bishop6e60e8b2018-02-01 10:27:11 -050016from wic import WicError
17from wic.engine import get_custom_config
Patrick Williamsc124f4f2015-09-15 14:41:29 -050018from wic.pluginbase import SourcePlugin
Brad Bishopd7bf8c12018-02-25 22:55:05 -050019from wic.misc import exec_cmd, exec_native_cmd, get_bitbake_var
Brad Bishop6e60e8b2018-02-01 10:27:11 -050020
21logger = logging.getLogger('wic')
Patrick Williamsc124f4f2015-09-15 14:41:29 -050022
23class IsoImagePlugin(SourcePlugin):
24 """
25 Create a bootable ISO image
26
27 This plugin creates a hybrid, legacy and EFI bootable ISO image. The
28 generated image can be used on optical media as well as USB media.
29
30 Legacy boot uses syslinux and EFI boot uses grub or gummiboot (not
31 implemented yet) as bootloader. The plugin creates the directories required
32 by bootloaders and populates them by creating and configuring the
33 bootloader files.
34
35 Example kickstart file:
36 part /boot --source isoimage-isohybrid --sourceparams="loader=grub-efi, \\
Brad Bishop1a4b7ee2018-12-16 17:11:34 -080037 image_name= IsoImage" --ondisk cd --label LIVECD
Patrick Williamsc124f4f2015-09-15 14:41:29 -050038 bootloader --timeout=10 --append=" "
39
40 In --sourceparams "loader" specifies the bootloader used for booting in EFI
41 mode, while "image_name" specifies the name of the generated image. In the
42 example above, wic creates an ISO image named IsoImage-cd.direct (default
43 extension added by direct imeger plugin) and a file named IsoImage-cd.iso
44 """
45
46 name = 'isoimage-isohybrid'
47
48 @classmethod
49 def do_configure_syslinux(cls, creator, cr_workdir):
50 """
51 Create loader-specific (syslinux) config
52 """
Patrick Williamsc0f7c042017-02-23 20:41:17 -060053 splash = os.path.join(cr_workdir, "ISO/boot/splash.jpg")
Patrick Williamsc124f4f2015-09-15 14:41:29 -050054 if os.path.exists(splash):
55 splashline = "menu background splash.jpg"
56 else:
57 splashline = ""
58
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050059 bootloader = creator.ks.bootloader
Patrick Williamsc124f4f2015-09-15 14:41:29 -050060
61 syslinux_conf = ""
62 syslinux_conf += "PROMPT 0\n"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050063 syslinux_conf += "TIMEOUT %s \n" % (bootloader.timeout or 10)
Patrick Williamsc124f4f2015-09-15 14:41:29 -050064 syslinux_conf += "\n"
65 syslinux_conf += "ALLOWOPTIONS 1\n"
66 syslinux_conf += "SERIAL 0 115200\n"
67 syslinux_conf += "\n"
68 if splashline:
69 syslinux_conf += "%s\n" % splashline
70 syslinux_conf += "DEFAULT boot\n"
71 syslinux_conf += "LABEL boot\n"
72
Brad Bishop15ae2502019-06-18 21:44:24 -040073 kernel = get_bitbake_var("KERNEL_IMAGETYPE")
Brad Bishop96ff1982019-08-19 13:50:42 -040074 if get_bitbake_var("INITRAMFS_IMAGE_BUNDLE") == "1":
75 if get_bitbake_var("INITRAMFS_IMAGE"):
76 kernel = "%s-%s.bin" % \
77 (get_bitbake_var("KERNEL_IMAGETYPE"), get_bitbake_var("INITRAMFS_LINK_NAME"))
78
Brad Bishop15ae2502019-06-18 21:44:24 -040079 syslinux_conf += "KERNEL /" + kernel + "\n"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050080 syslinux_conf += "APPEND initrd=/initrd LABEL=boot %s\n" \
81 % bootloader.append
Patrick Williamsc124f4f2015-09-15 14:41:29 -050082
Brad Bishop6e60e8b2018-02-01 10:27:11 -050083 logger.debug("Writing syslinux config %s/ISO/isolinux/isolinux.cfg",
84 cr_workdir)
85
Patrick Williamsc124f4f2015-09-15 14:41:29 -050086 with open("%s/ISO/isolinux/isolinux.cfg" % cr_workdir, "w") as cfg:
87 cfg.write(syslinux_conf)
88
89 @classmethod
Brad Bishopd7bf8c12018-02-25 22:55:05 -050090 def do_configure_grubefi(cls, part, creator, target_dir):
Patrick Williamsc124f4f2015-09-15 14:41:29 -050091 """
92 Create loader-specific (grub-efi) config
93 """
Patrick Williamsc0f7c042017-02-23 20:41:17 -060094 configfile = creator.ks.bootloader.configfile
95 if configfile:
96 grubefi_conf = get_custom_config(configfile)
97 if grubefi_conf:
Brad Bishop6e60e8b2018-02-01 10:27:11 -050098 logger.debug("Using custom configuration file %s for grub.cfg",
99 configfile)
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600100 else:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500101 raise WicError("configfile is specified "
102 "but failed to get it from %s", configfile)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500103 else:
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500104 splash = os.path.join(target_dir, "splash.jpg")
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600105 if os.path.exists(splash):
106 splashline = "menu background splash.jpg"
107 else:
108 splashline = ""
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500109
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600110 bootloader = creator.ks.bootloader
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500111
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600112 grubefi_conf = ""
113 grubefi_conf += "serial --unit=0 --speed=115200 --word=8 "
114 grubefi_conf += "--parity=no --stop=1\n"
115 grubefi_conf += "default=boot\n"
116 grubefi_conf += "timeout=%s\n" % (bootloader.timeout or 10)
117 grubefi_conf += "\n"
118 grubefi_conf += "search --set=root --label %s " % part.label
119 grubefi_conf += "\n"
120 grubefi_conf += "menuentry 'boot'{\n"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500121
Brad Bishop15ae2502019-06-18 21:44:24 -0400122 kernel = get_bitbake_var("KERNEL_IMAGETYPE")
Brad Bishop96ff1982019-08-19 13:50:42 -0400123 if get_bitbake_var("INITRAMFS_IMAGE_BUNDLE") == "1":
124 if get_bitbake_var("INITRAMFS_IMAGE"):
125 kernel = "%s-%s.bin" % \
126 (get_bitbake_var("KERNEL_IMAGETYPE"), get_bitbake_var("INITRAMFS_LINK_NAME"))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500127
Brad Bishop15ae2502019-06-18 21:44:24 -0400128 grubefi_conf += "linux /%s rootwait %s\n" \
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600129 % (kernel, bootloader.append)
130 grubefi_conf += "initrd /initrd \n"
131 grubefi_conf += "}\n"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500132
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600133 if splashline:
134 grubefi_conf += "%s\n" % splashline
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500135
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500136 cfg_path = os.path.join(target_dir, "grub.cfg")
137 logger.debug("Writing grubefi config %s", cfg_path)
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500138
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500139 with open(cfg_path, "w") as cfg:
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500140 cfg.write(grubefi_conf)
141
142 @staticmethod
143 def _build_initramfs_path(rootfs_dir, cr_workdir):
144 """
145 Create path for initramfs image
146 """
147
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500148 initrd = get_bitbake_var("INITRD_LIVE") or get_bitbake_var("INITRD")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500149 if not initrd:
150 initrd_dir = get_bitbake_var("DEPLOY_DIR_IMAGE")
151 if not initrd_dir:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500152 raise WicError("Couldn't find DEPLOY_DIR_IMAGE, exiting.")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500153
154 image_name = get_bitbake_var("IMAGE_BASENAME")
155 if not image_name:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500156 raise WicError("Couldn't find IMAGE_BASENAME, exiting.")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500157
158 image_type = get_bitbake_var("INITRAMFS_FSTYPES")
159 if not image_type:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500160 raise WicError("Couldn't find INITRAMFS_FSTYPES, exiting.")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500161
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500162 machine = os.path.basename(initrd_dir)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500163
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500164 pattern = '%s/%s*%s.%s' % (initrd_dir, image_name, machine, image_type)
165 files = glob.glob(pattern)
166 if files:
167 initrd = files[0]
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500168
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500169 if not initrd or not os.path.exists(initrd):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500170 # Create initrd from rootfs directory
171 initrd = "%s/initrd.cpio.gz" % cr_workdir
172 initrd_dir = "%s/INITRD" % cr_workdir
173 shutil.copytree("%s" % rootfs_dir, \
174 "%s" % initrd_dir, symlinks=True)
175
176 if os.path.isfile("%s/init" % rootfs_dir):
177 shutil.copy2("%s/init" % rootfs_dir, "%s/init" % initrd_dir)
178 elif os.path.lexists("%s/init" % rootfs_dir):
179 os.symlink(os.readlink("%s/init" % rootfs_dir), \
180 "%s/init" % initrd_dir)
181 elif os.path.isfile("%s/sbin/init" % rootfs_dir):
182 shutil.copy2("%s/sbin/init" % rootfs_dir, \
183 "%s" % initrd_dir)
184 elif os.path.lexists("%s/sbin/init" % rootfs_dir):
185 os.symlink(os.readlink("%s/sbin/init" % rootfs_dir), \
186 "%s/init" % initrd_dir)
187 else:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500188 raise WicError("Couldn't find or build initrd, exiting.")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500189
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800190 exec_cmd("cd %s && find . | cpio -o -H newc -R root:root >%s/initrd.cpio " \
191 % (initrd_dir, cr_workdir), as_shell=True)
192 exec_cmd("gzip -f -9 %s/initrd.cpio" % cr_workdir, as_shell=True)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500193 shutil.rmtree(initrd_dir)
194
195 return initrd
196
197 @classmethod
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500198 def do_configure_partition(cls, part, source_params, creator, cr_workdir,
199 oe_builddir, bootimg_dir, kernel_dir,
200 native_sysroot):
201 """
202 Called before do_prepare_partition(), creates loader-specific config
203 """
204 isodir = "%s/ISO/" % cr_workdir
205
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500206 if os.path.exists(isodir):
207 shutil.rmtree(isodir)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500208
209 install_cmd = "install -d %s " % isodir
210 exec_cmd(install_cmd)
211
212 # Overwrite the name of the created image
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500213 logger.debug(source_params)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500214 if 'image_name' in source_params and \
215 source_params['image_name'].strip():
216 creator.name = source_params['image_name'].strip()
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500217 logger.debug("The name of the image is: %s", creator.name)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500218
219 @classmethod
220 def do_prepare_partition(cls, part, source_params, creator, cr_workdir,
221 oe_builddir, bootimg_dir, kernel_dir,
222 rootfs_dir, native_sysroot):
223 """
224 Called to do the actual content population for a partition i.e. it
225 'prepares' the partition to be incorporated into the image.
226 In this case, prepare content for a bootable ISO image.
227 """
228
229 isodir = "%s/ISO" % cr_workdir
230
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500231 if part.rootfs_dir is None:
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500232 if not 'ROOTFS_DIR' in rootfs_dir:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500233 raise WicError("Couldn't find --rootfs-dir, exiting.")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500234 rootfs_dir = rootfs_dir['ROOTFS_DIR']
235 else:
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500236 if part.rootfs_dir in rootfs_dir:
237 rootfs_dir = rootfs_dir[part.rootfs_dir]
238 elif part.rootfs_dir:
239 rootfs_dir = part.rootfs_dir
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500240 else:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500241 raise WicError("Couldn't find --rootfs-dir=%s connection "
242 "or it is not a valid path, exiting." %
243 part.rootfs_dir)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500244
245 if not os.path.isdir(rootfs_dir):
246 rootfs_dir = get_bitbake_var("IMAGE_ROOTFS")
247 if not os.path.isdir(rootfs_dir):
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500248 raise WicError("Couldn't find IMAGE_ROOTFS, exiting.")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500249
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500250 part.rootfs_dir = rootfs_dir
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500251 deploy_dir = get_bitbake_var("DEPLOY_DIR_IMAGE")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500252 img_iso_dir = get_bitbake_var("ISODIR")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500253
254 # Remove the temporary file created by part.prepare_rootfs()
255 if os.path.isfile(part.source_file):
256 os.remove(part.source_file)
257
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500258 # Support using a different initrd other than default
259 if source_params.get('initrd'):
260 initrd = source_params['initrd']
261 if not deploy_dir:
262 raise WicError("Couldn't find DEPLOY_DIR_IMAGE, exiting")
263 cp_cmd = "cp %s/%s %s" % (deploy_dir, initrd, cr_workdir)
264 exec_cmd(cp_cmd)
265 else:
266 # Prepare initial ramdisk
267 initrd = "%s/initrd" % deploy_dir
268 if not os.path.isfile(initrd):
269 initrd = "%s/initrd" % img_iso_dir
270 if not os.path.isfile(initrd):
271 initrd = cls._build_initramfs_path(rootfs_dir, cr_workdir)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500272
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500273 install_cmd = "install -m 0644 %s %s/initrd" % (initrd, isodir)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500274 exec_cmd(install_cmd)
275
276 # Remove the temporary file created by _build_initramfs_path function
277 if os.path.isfile("%s/initrd.cpio.gz" % cr_workdir):
278 os.remove("%s/initrd.cpio.gz" % cr_workdir)
279
Brad Bishop15ae2502019-06-18 21:44:24 -0400280 kernel = get_bitbake_var("KERNEL_IMAGETYPE")
Brad Bishop96ff1982019-08-19 13:50:42 -0400281 if get_bitbake_var("INITRAMFS_IMAGE_BUNDLE") == "1":
282 if get_bitbake_var("INITRAMFS_IMAGE"):
283 kernel = "%s-%s.bin" % \
284 (get_bitbake_var("KERNEL_IMAGETYPE"), get_bitbake_var("INITRAMFS_LINK_NAME"))
Brad Bishop15ae2502019-06-18 21:44:24 -0400285
286 install_cmd = "install -m 0644 %s/%s %s/%s" % \
287 (kernel_dir, kernel, isodir, kernel)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500288 exec_cmd(install_cmd)
289
290 #Create bootloader for efi boot
291 try:
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500292 target_dir = "%s/EFI/BOOT" % isodir
293 if os.path.exists(target_dir):
294 shutil.rmtree(target_dir)
295
296 os.makedirs(target_dir)
297
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500298 if source_params['loader'] == 'grub-efi':
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500299 # Builds bootx64.efi/bootia32.efi if ISODIR didn't exist or
300 # didn't contains it
301 target_arch = get_bitbake_var("TARGET_SYS")
302 if not target_arch:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500303 raise WicError("Coludn't find target architecture")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500304
305 if re.match("x86_64", target_arch):
Brad Bishopc4ea0752018-11-15 14:30:15 -0800306 grub_src_image = "grub-efi-bootx64.efi"
307 grub_dest_image = "bootx64.efi"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500308 elif re.match('i.86', target_arch):
Brad Bishopc4ea0752018-11-15 14:30:15 -0800309 grub_src_image = "grub-efi-bootia32.efi"
310 grub_dest_image = "bootia32.efi"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500311 else:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500312 raise WicError("grub-efi is incompatible with target %s" %
313 target_arch)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500314
Brad Bishopc4ea0752018-11-15 14:30:15 -0800315 grub_target = os.path.join(target_dir, grub_dest_image)
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500316 if not os.path.isfile(grub_target):
Brad Bishopc4ea0752018-11-15 14:30:15 -0800317 grub_src = os.path.join(deploy_dir, grub_src_image)
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500318 if not os.path.exists(grub_src):
319 raise WicError("Grub loader %s is not found in %s. "
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800320 "Please build grub-efi first" % (grub_src_image, deploy_dir))
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500321 shutil.copy(grub_src, grub_target)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500322
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500323 if not os.path.isfile(os.path.join(target_dir, "boot.cfg")):
324 cls.do_configure_grubefi(part, creator, target_dir)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500325
326 else:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500327 raise WicError("unrecognized bootimg-efi loader: %s" %
328 source_params['loader'])
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500329 except KeyError:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500330 raise WicError("bootimg-efi requires a loader, none specified")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500331
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500332 # Create efi.img that contains bootloader files for EFI booting
333 # if ISODIR didn't exist or didn't contains it
334 if os.path.isfile("%s/efi.img" % img_iso_dir):
335 install_cmd = "install -m 0644 %s/efi.img %s/efi.img" % \
336 (img_iso_dir, isodir)
337 exec_cmd(install_cmd)
338 else:
339 du_cmd = "du -bks %s/EFI" % isodir
340 out = exec_cmd(du_cmd)
341 blocks = int(out.split()[0])
342 # Add some extra space for file system overhead
343 blocks += 100
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500344 logger.debug("Added 100 extra blocks to %s to get to %d "
345 "total blocks", part.mountpoint, blocks)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500346
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500347 # dosfs image for EFI boot
348 bootimg = "%s/efi.img" % isodir
349
350 dosfs_cmd = 'mkfs.vfat -n "EFIimg" -S 512 -C %s %d' \
351 % (bootimg, blocks)
352 exec_native_cmd(dosfs_cmd, native_sysroot)
353
354 mmd_cmd = "mmd -i %s ::/EFI" % bootimg
355 exec_native_cmd(mmd_cmd, native_sysroot)
356
357 mcopy_cmd = "mcopy -i %s -s %s/EFI/* ::/EFI/" \
358 % (bootimg, isodir)
359 exec_native_cmd(mcopy_cmd, native_sysroot)
360
361 chmod_cmd = "chmod 644 %s" % bootimg
362 exec_cmd(chmod_cmd)
363
364 # Prepare files for legacy boot
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500365 syslinux_dir = get_bitbake_var("STAGING_DATADIR")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500366 if not syslinux_dir:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500367 raise WicError("Couldn't find STAGING_DATADIR, exiting.")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500368
369 if os.path.exists("%s/isolinux" % isodir):
370 shutil.rmtree("%s/isolinux" % isodir)
371
372 install_cmd = "install -d %s/isolinux" % isodir
373 exec_cmd(install_cmd)
374
375 cls.do_configure_syslinux(creator, cr_workdir)
376
377 install_cmd = "install -m 444 %s/syslinux/ldlinux.sys " % syslinux_dir
378 install_cmd += "%s/isolinux/ldlinux.sys" % isodir
379 exec_cmd(install_cmd)
380
381 install_cmd = "install -m 444 %s/syslinux/isohdpfx.bin " % syslinux_dir
382 install_cmd += "%s/isolinux/isohdpfx.bin" % isodir
383 exec_cmd(install_cmd)
384
385 install_cmd = "install -m 644 %s/syslinux/isolinux.bin " % syslinux_dir
386 install_cmd += "%s/isolinux/isolinux.bin" % isodir
387 exec_cmd(install_cmd)
388
389 install_cmd = "install -m 644 %s/syslinux/ldlinux.c32 " % syslinux_dir
390 install_cmd += "%s/isolinux/ldlinux.c32" % isodir
391 exec_cmd(install_cmd)
392
393 #create ISO image
394 iso_img = "%s/tempiso_img.iso" % cr_workdir
395 iso_bootimg = "isolinux/isolinux.bin"
396 iso_bootcat = "isolinux/boot.cat"
397 efi_img = "efi.img"
398
399 mkisofs_cmd = "mkisofs -V %s " % part.label
400 mkisofs_cmd += "-o %s -U " % iso_img
401 mkisofs_cmd += "-J -joliet-long -r -iso-level 2 -b %s " % iso_bootimg
402 mkisofs_cmd += "-c %s -no-emul-boot -boot-load-size 4 " % iso_bootcat
403 mkisofs_cmd += "-boot-info-table -eltorito-alt-boot "
404 mkisofs_cmd += "-eltorito-platform 0xEF -eltorito-boot %s " % efi_img
405 mkisofs_cmd += "-no-emul-boot %s " % isodir
406
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500407 logger.debug("running command: %s", mkisofs_cmd)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500408 exec_native_cmd(mkisofs_cmd, native_sysroot)
409
410 shutil.rmtree(isodir)
411
412 du_cmd = "du -Lbks %s" % iso_img
413 out = exec_cmd(du_cmd)
414 isoimg_size = int(out.split()[0])
415
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500416 part.size = isoimg_size
417 part.source_file = iso_img
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500418
419 @classmethod
420 def do_install_disk(cls, disk, disk_name, creator, workdir, oe_builddir,
421 bootimg_dir, kernel_dir, native_sysroot):
422 """
423 Called after all partitions have been prepared and assembled into a
424 disk image. In this case, we insert/modify the MBR using isohybrid
425 utility for booting via BIOS from disk storage devices.
426 """
427
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500428 iso_img = "%s.p1" % disk.path
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500429 full_path = creator._full_path(workdir, disk_name, "direct")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500430 full_path_iso = creator._full_path(workdir, disk_name, "iso")
431
432 isohybrid_cmd = "isohybrid -u %s" % iso_img
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500433 logger.debug("running command: %s", isohybrid_cmd)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500434 exec_native_cmd(isohybrid_cmd, native_sysroot)
435
436 # Replace the image created by direct plugin with the one created by
437 # mkisofs command. This is necessary because the iso image created by
438 # mkisofs has a very specific MBR is system area of the ISO image, and
439 # direct plugin adds and configures an another MBR.
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500440 logger.debug("Replaceing the image created by direct plugin\n")
441 os.remove(disk.path)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500442 shutil.copy2(iso_img, full_path_iso)
443 shutil.copy2(full_path_iso, full_path)