wic: Allow to user defined files as config for bootloaders
cover wic: Allow to user defined files as config for bootloaders
From: Mariano Lopez <[email protected]>
These two patches add a new option for the bootloaders. This new option is to have a configuration file as the bootloader config and it can be used with "configfile" variable in the bootloader line. This is very useful when there is need to create a multiboot image or when there is need to use scripting in the bootloader.
This change doesn't include the changes in the documentation but once the patches are commited to master, I will work on the documentation of this new feature.
The following changes since commit d9aabf9639510fdb3e2ccc21ba5ae4aa9f6e4a57:
gcc: Drop 4.8 (2015-11-16 14:59:18 +0000)
are available in the git repository at:
git://git.yoctoproject.org/poky-contrib mariano/bug8003
http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=mariano/bug8003
Mariano Lopez (2):
wic: Prepare wicboot to allow custom bootloader config
wic: Allow to use a custom config for bootloaders
scripts/lib/wic/kickstart/__init__.py | 7 +++ .../lib/wic/kickstart/custom_commands/wicboot.py | 5 ++ scripts/lib/wic/plugins/source/bootimg-efi.py | 66 ++++++++++++++-------- scripts/lib/wic/plugins/source/bootimg-pcbios.py | 66 +++++++++++++--------- 4 files changed, 95 insertions(+), 49 deletions(-)
Signature · 1 line
1.8.4.5
PATCH 1/2 wic: Prepare wicboot to allow custom bootloader config
From: Mariano Lopez <[email protected]>
Currently wic does the bootloader configuration file on the fly. This change introduce a configfile variable for the bootloader; this is to have a user defined configuration file for the bootloaders (grub, syslinux, and gummiboot). This is particular useful when having a multiboot system or scripts embedded in the configuration file.
[YOCTO #8003]
--- scripts/lib/wic/kickstart/__init__.py | 7 +++++++ scripts/lib/wic/kickstart/custom_commands/wicboot.py | 5 +++++ 2 files changed, 12 insertions(+)
scripts/lib/wic/kickstart/__init__.py +7 -0
@@ -97,6 +97,13 @@ def get_timeout(kickstart, default=None): return default return int(kickstart.handler.bootloader.timeout) +def get_bootloader_file(kickstart, default=None): + if not hasattr(kickstart.handler.bootloader, "configfile"): + return default + if kickstart.handler.bootloader.configfile is None: + return default + return kickstart.handler.bootloader.configfile + def get_kernel_args(kickstart, default="ro rd.live.image"): if not hasattr(kickstart.handler.bootloader, "appendLine"): return default
scripts/lib/wic/kickstart/custom_commands/wicboot.py +5 -0
@@ -35,6 +35,7 @@ class Wic_Bootloader(F8_Bootloader): self.menus = "" self.ptable = "msdos" self.source = "" + self.configfile = "" def _getArgsAsStr(self): retval = F8_Bootloader._getArgsAsStr(self)
@@ -45,6 +46,8 @@ class Wic_Bootloader(F8_Bootloader): retval += " --ptable=\"%s\"" %(self.ptable,) if self.source: retval += " --source=%s" % self.source + if self.configfile: + retval += " --configfile=%s" % self.configfile return retval
@@ -56,5 +59,7 @@ class Wic_Bootloader(F8_Bootloader): # use specified source plugin to implement bootloader-specific methods parser.add_option("--source", type="string", action="store", dest="source", default=None) + parser.add_option("--configfile", type="string", action="store", + dest="configfile", default=None) return parser
Signature · 1 line
1.8.4.5
PATCH 2/2 wic: Allow to use a custom config for bootloaders
In reply to [email protected]From: Mariano Lopez <[email protected]>
This change will allow to use a user defined file as the configuration for the bootloaders (grub, gummiboot, syslinux).
The config file is defined in the wks file with the "configfile" option in the bootloader line.
[YOCTO #8003]
--- scripts/lib/wic/plugins/source/bootimg-efi.py | 66 ++++++++++++++++-------- scripts/lib/wic/plugins/source/bootimg-pcbios.py | 66 ++++++++++++++---------- 2 files changed, 83 insertions(+), 49 deletions(-)
scripts/lib/wic/plugins/source/bootimg-efi.py +44 -22
@@ -45,22 +45,33 @@ class BootimgEFIPlugin(SourcePlugin): """ Create loader-specific (grub-efi) config """ - options = creator.ks.handler.bootloader.appendLine - - grubefi_conf = "" - grubefi_conf += "serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1\n" - grubefi_conf += "default=boot\n" - timeout = kickstart.get_timeout(creator.ks) - if not timeout: - timeout = 0 - grubefi_conf += "timeout=%s\n" % timeout - grubefi_conf += "menuentry 'boot'{\n" - - kernel = "/bzImage" - - grubefi_conf += "linux %s root=%s rootwait %s\n" \ - % (kernel, creator.rootdev, options) - grubefi_conf += "}\n" + configfile = kickstart.get_bootloader_file(creator.ks) + + if configfile and os.path.exists(configfile): + # Use a custom configuration file for grub + msger.info("Using custom configuration file " + "%s for grub.cfg" % configfile) + user_conf = open(configfile, "r") + grubefi_conf = user_conf.read() + user_conf.close() + else: + # Create grub configuration using parameters from wks file + options = creator.ks.handler.bootloader.appendLine + + grubefi_conf = "" + grubefi_conf += "serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1\n" + grubefi_conf += "default=boot\n" + timeout = kickstart.get_timeout(creator.ks) + if not timeout: + timeout = 0 + grubefi_conf += "timeout=%s\n" % timeout + grubefi_conf += "menuentry 'boot'{\n" + + kernel = "/bzImage" + + grubefi_conf += "linux %s root=%s rootwait %s\n" \ + % (kernel, creator.rootdev, options) + grubefi_conf += "}\n" msger.debug("Writing grubefi config %s/hdd/boot/EFI/BOOT/grub.cfg" \ % cr_workdir)
@@ -95,12 +106,23 @@ class BootimgEFIPlugin(SourcePlugin): cfg.write(loader_conf) cfg.close() - kernel = "/bzImage" - - boot_conf = "" - boot_conf += "title boot\n" - boot_conf += "linux %s\n" % kernel - boot_conf += "options LABEL=Boot root=%s %s\n" % (creator.rootdev, options) + configfile = kickstart.get_bootloader_file(creator.ks) + + if configfile and os.path.exists(configfile): + # Use a custom configuration file for gummiboot + msger.info("Using custom configuration file " + "%s for gummiboot's boot.conf" % configfile) + user_conf = open(configfile, "r") + boot_conf = user_conf.read() + user_conf.close() + else: + # Create gummiboot configuration using parameters from wks file + kernel = "/bzImage" + + boot_conf = "" + boot_conf += "title boot\n" + boot_conf += "linux %s\n" % kernel + boot_conf += "options LABEL=Boot root=%s %s\n" % (creator.rootdev, options) msger.debug("Writing gummiboot config %s/hdd/boot/loader/entries/boot.conf" \ % cr_workdir)
scripts/lib/wic/plugins/source/bootimg-pcbios.py +39 -27
73 lines not on this page · raw message
Signature · 1 line
1.8.4.5
Re: [PATCH 2/2] wic: Allow to use a custom config for bootloaders
Hi Mariano,
Thank you for the patchset!
Would it be better to put content of configuration file into .wks instead of just referring to it?
It would be also nice to have this code covered by oe-selftest.
Regards,
Ed
Quoted 181 lines · On Wed, Nov 18, 2015 at 08:25:54AM +0000, [email protected] wrote:
From: Mariano Lopez <[email protected]>
This change will allow to use a user defined file as the configuration for the bootloaders (grub, gummiboot, syslinux).
The config file is defined in the wks file with the "configfile" option in the bootloader line.
[YOCTO #8003]
Signed-off-by Mariano Lopez <[email protected]>--- scripts/lib/wic/plugins/source/bootimg-efi.py | 66 ++++++++++++++++-------- scripts/lib/wic/plugins/source/bootimg-pcbios.py | 66 ++++++++++++++---------- 2 files changed, 83 insertions(+), 49 deletions(-)scripts/lib/wic/plugins/source/bootimg-efi.py +44
-22@@ -45,22 +45,33 @@ class BootimgEFIPlugin(SourcePlugin): """ Create loader-specific (grub-efi) config """ - options = creator.ks.handler.bootloader.appendLine - - grubefi_conf = "" - grubefi_conf += "serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1\n" - grubefi_conf += "default=boot\n" - timeout = kickstart.get_timeout(creator.ks) - if not timeout: - timeout = 0 - grubefi_conf += "timeout=%s\n" % timeout - grubefi_conf += "menuentry 'boot'{\n" - - kernel = "/bzImage" - - grubefi_conf += "linux %s root=%s rootwait %s\n" \ - % (kernel, creator.rootdev, options) - grubefi_conf += "}\n" + configfile = kickstart.get_bootloader_file(creator.ks) + + if configfile and os.path.exists(configfile): + # Use a custom configuration file for grub + msger.info("Using custom configuration file " + "%s for grub.cfg" % configfile) + user_conf = open(configfile, "r") + grubefi_conf = user_conf.read() + user_conf.close() + else: + # Create grub configuration using parameters from wks file + options = creator.ks.handler.bootloader.appendLine + + grubefi_conf = "" + grubefi_conf += "serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1\n" + grubefi_conf += "default=boot\n" + timeout = kickstart.get_timeout(creator.ks) + if not timeout: + timeout = 0 + grubefi_conf += "timeout=%s\n" % timeout + grubefi_conf += "menuentry 'boot'{\n" + + kernel = "/bzImage" + + grubefi_conf += "linux %s root=%s rootwait %s\n" \ + % (kernel, creator.rootdev, options) + grubefi_conf += "}\n" msger.debug("Writing grubefi config %s/hdd/boot/EFI/BOOT/grub.cfg" \ % cr_workdir)@@ -95,12 +106,23 @@ class BootimgEFIPlugin(SourcePlugin): cfg.write(loader_conf) cfg.close() - kernel = "/bzImage" - - boot_conf = "" - boot_conf += "title boot\n" - boot_conf += "linux %s\n" % kernel - boot_conf += "options LABEL=Boot root=%s %s\n" % (creator.rootdev, options) + configfile = kickstart.get_bootloader_file(creator.ks) + + if configfile and os.path.exists(configfile): + # Use a custom configuration file for gummiboot + msger.info("Using custom configuration file " + "%s for gummiboot's boot.conf" % configfile) + user_conf = open(configfile, "r") + boot_conf = user_conf.read() + user_conf.close() + else: + # Create gummiboot configuration using parameters from wks file + kernel = "/bzImage" + + boot_conf = "" + boot_conf += "title boot\n" + boot_conf += "linux %s\n" % kernel + boot_conf += "options LABEL=Boot root=%s %s\n" % (creator.rootdev, options) msger.debug("Writing gummiboot config %s/hdd/boot/loader/entries/boot.conf" \ % cr_workdir)scripts/lib/wic/plugins/source/bootimg-pcbios.py +39
-27@@ -83,34 +83,46 @@ class BootimgPcbiosPlugin(SourcePlugin): install_cmd = "install -d %s" % hdddir exec_cmd(install_cmd) - splash = os.path.join(cr_workdir, "/hdd/boot/splash.jpg") - if os.path.exists(splash): - splashline = "menu background splash.jpg" + configfile = kickstart.get_bootloader_file(creator.ks) + + if configfile and os.path.exists(configfile): + # Use a custom configuration file for syslinux + msger.info("Using custom configuration file " + "%s for syslinux.cfg" % configfile) + user_conf = open(configfile, "r") + syslinux_conf = user_conf.read() + user_conf.close() + else: - splashline = "" - - options = creator.ks.handler.bootloader.appendLine - - syslinux_conf = "" - syslinux_conf += "PROMPT 0\n" - timeout = kickstart.get_timeout(creator.ks) - if not timeout: - timeout = 0 - syslinux_conf += "TIMEOUT " + str(timeout) + "\n" - syslinux_conf += "\n" - syslinux_conf += "ALLOWOPTIONS 1\n" - syslinux_conf += "SERIAL 0 115200\n" - syslinux_conf += "\n" - if splashline: - syslinux_conf += "%s\n" % splashline - syslinux_conf += "DEFAULT boot\n" - syslinux_conf += "LABEL boot\n" - - kernel = "/vmlinuz" - syslinux_conf += "KERNEL " + kernel + "\n" - - syslinux_conf += "APPEND label=boot root=%s %s\n" % \ - (creator.rootdev, options) + # Create syslinux configuration using parameters from wks file + splash = os.path.join(cr_workdir, "/hdd/boot/splash.jpg") + if os.path.exists(splash): + splashline = "menu background splash.jpg" + else: + splashline = "" + + options = creator.ks.handler.bootloader.appendLine + + syslinux_conf = "" + syslinux_conf += "PROMPT 0\n" + timeout = kickstart.get_timeout(creator.ks) + if not timeout: + timeout = 0 + syslinux_conf += "TIMEOUT " + str(timeout) + "\n" + syslinux_conf += "\n" + syslinux_conf += "ALLOWOPTIONS 1\n" + syslinux_conf += "SERIAL 0 115200\n" + syslinux_conf += "\n" + if splashline: + syslinux_conf += "%s\n" % splashline + syslinux_conf += "DEFAULT boot\n" + syslinux_conf += "LABEL boot\n" + + kernel = "/vmlinuz" + syslinux_conf += "KERNEL " + kernel + "\n" + + syslinux_conf += "APPEND label=boot root=%s %s\n" % \ + (creator.rootdev, options) msger.debug("Writing syslinux config %s/hdd/boot/syslinux.cfg" \ % cr_workdir)Signature · 1 line
1.8.4.5
Signature · 3 lines
-- Regards, Ed
Re: [PATCH 2/2] wic: Allow to use a custom config for bootloaders
Quoted 6 lines · Ed Bartosh
Hi Mariano,
Thank you for the patchset!
Would it be better to put content of configuration file into .wks instead of just referring to it?
If the configuration is simple I agree with you; however if the configuration have scripts I think it's better to have separated file. The file can growth and would be a real mess inside a wks file.
Quoted 2 lines
It would be also nice to have this code covered by oe-selftest.
Yes, I plan do create a test and update the documentation once it is integrated in master.
Quoted 186 lines
Regards,
EdQuoted 181 lines · On Wed, Nov 18, 2015 at 08:25:54AM +0000, [email protected] wrote:
From: Mariano Lopez <[email protected]>
This change will allow to use a user defined file as the configuration for the bootloaders (grub, gummiboot, syslinux).
The config file is defined in the wks file with the "configfile" option in the bootloader line.
[YOCTO #8003]
Signed-off-by Mariano Lopez <[email protected]>--- scripts/lib/wic/plugins/source/bootimg-efi.py | 66 ++++++++++++++++-------- scripts/lib/wic/plugins/source/bootimg-pcbios.py | 66 ++++++++++++++---------- 2 files changed, 83 insertions(+), 49 deletions(-)scripts/lib/wic/plugins/source/bootimg-efi.py +44
-22@@ -45,22 +45,33 @@ class BootimgEFIPlugin(SourcePlugin): """ Create loader-specific (grub-efi) config """ - options = creator.ks.handler.bootloader.appendLine - - grubefi_conf = "" - grubefi_conf += "serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1\n" - grubefi_conf += "default=boot\n" - timeout = kickstart.get_timeout(creator.ks) - if not timeout: - timeout = 0 - grubefi_conf += "timeout=%s\n" % timeout - grubefi_conf += "menuentry 'boot'{\n" - - kernel = "/bzImage" - - grubefi_conf += "linux %s root=%s rootwait %s\n" \ - % (kernel, creator.rootdev, options) - grubefi_conf += "}\n" + configfile = kickstart.get_bootloader_file(creator.ks) + + if configfile and os.path.exists(configfile): + # Use a custom configuration file for grub + msger.info("Using custom configuration file " + "%s for grub.cfg" % configfile) + user_conf = open(configfile, "r") + grubefi_conf = user_conf.read() + user_conf.close() + else: + # Create grub configuration using parameters from wks file + options = creator.ks.handler.bootloader.appendLine + + grubefi_conf = "" + grubefi_conf += "serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1\n" + grubefi_conf += "default=boot\n" + timeout = kickstart.get_timeout(creator.ks) + if not timeout: + timeout = 0 + grubefi_conf += "timeout=%s\n" % timeout + grubefi_conf += "menuentry 'boot'{\n" + + kernel = "/bzImage" + + grubefi_conf += "linux %s root=%s rootwait %s\n" \ + % (kernel, creator.rootdev, options) + grubefi_conf += "}\n" msger.debug("Writing grubefi config %s/hdd/boot/EFI/BOOT/grub.cfg" \ % cr_workdir)@@ -95,12 +106,23 @@ class BootimgEFIPlugin(SourcePlugin): cfg.write(loader_conf) cfg.close() - kernel = "/bzImage" - - boot_conf = "" - boot_conf += "title boot\n" - boot_conf += "linux %s\n" % kernel - boot_conf += "options LABEL=Boot root=%s %s\n" % (creator.rootdev, options) + configfile = kickstart.get_bootloader_file(creator.ks) + + if configfile and os.path.exists(configfile): + # Use a custom configuration file for gummiboot + msger.info("Using custom configuration file " + "%s for gummiboot's boot.conf" % configfile) + user_conf = open(configfile, "r") + boot_conf = user_conf.read() + user_conf.close() + else: + # Create gummiboot configuration using parameters from wks file + kernel = "/bzImage" + + boot_conf = "" + boot_conf += "title boot\n" + boot_conf += "linux %s\n" % kernel + boot_conf += "options LABEL=Boot root=%s %s\n" % (creator.rootdev, options) msger.debug("Writing gummiboot config %s/hdd/boot/loader/entries/boot.conf" \ % cr_workdir)scripts/lib/wic/plugins/source/bootimg-pcbios.py +39
-27@@ -83,34 +83,46 @@ class BootimgPcbiosPlugin(SourcePlugin): install_cmd = "install -d %s" % hdddir exec_cmd(install_cmd) - splash = os.path.join(cr_workdir, "/hdd/boot/splash.jpg") - if os.path.exists(splash): - splashline = "menu background splash.jpg" + configfile = kickstart.get_bootloader_file(creator.ks) + + if configfile and os.path.exists(configfile): + # Use a custom configuration file for syslinux + msger.info("Using custom configuration file " + "%s for syslinux.cfg" % configfile) + user_conf = open(configfile, "r") + syslinux_conf = user_conf.read() + user_conf.close() + else: - splashline = "" - - options = creator.ks.handler.bootloader.appendLine - - syslinux_conf = "" - syslinux_conf += "PROMPT 0\n" - timeout = kickstart.get_timeout(creator.ks) - if not timeout: - timeout = 0 - syslinux_conf += "TIMEOUT " + str(timeout) + "\n" - syslinux_conf += "\n" - syslinux_conf += "ALLOWOPTIONS 1\n" - syslinux_conf += "SERIAL 0 115200\n" - syslinux_conf += "\n" - if splashline: - syslinux_conf += "%s\n" % splashline - syslinux_conf += "DEFAULT boot\n" - syslinux_conf += "LABEL boot\n" - - kernel = "/vmlinuz" - syslinux_conf += "KERNEL " + kernel + "\n" - - syslinux_conf += "APPEND label=boot root=%s %s\n" % \ - (creator.rootdev, options) + # Create syslinux configuration using parameters from wks file + splash = os.path.join(cr_workdir, "/hdd/boot/splash.jpg") + if os.path.exists(splash): + splashline = "menu background splash.jpg" + else: + splashline = "" + + options = creator.ks.handler.bootloader.appendLine + + syslinux_conf = "" + syslinux_conf += "PROMPT 0\n" + timeout = kickstart.get_timeout(creator.ks) + if not timeout: + timeout = 0 + syslinux_conf += "TIMEOUT " + str(timeout) + "\n" + syslinux_conf += "\n" + syslinux_conf += "ALLOWOPTIONS 1\n" + syslinux_conf += "SERIAL 0 115200\n" + syslinux_conf += "\n" + if splashline: + syslinux_conf += "%s\n" % splashline + syslinux_conf += "DEFAULT boot\n" + syslinux_conf += "LABEL boot\n" + + kernel = "/vmlinuz" + syslinux_conf += "KERNEL " + kernel + "\n" + + syslinux_conf += "APPEND label=boot root=%s %s\n" % \ + (creator.rootdev, options) msger.debug("Writing syslinux config %s/hdd/boot/syslinux.cfg" \ % cr_workdir)Signature · 1 line
1.8.4.5
Signature · 1 line
Mariano Lopez
Re: [PATCH 2/2] wic: Allow to use a custom config for bootloaders
Quoted 7 lines · Mariano Lopez
Quoted 4 lines · Ed Bartosh
Hi Mariano,
Thank you for the patchset!
Quoted 8 lines
Quoted 2 lines
Would it be better to put content of configuration file into .wks instead of just referring to it?
If the configuration is simple I agree with you; however if the configuration have scripts I think it's better to have separated file. The file can growth and would be a real mess inside a wks file.
What bothers me here is that reference to the external entity (config file in this case) which may or may not exist. This makes wic more fragile than it is now.
Can we put bootloader configs to some predefined place, e.g. to the same directory where .wks is?
Quoted 6 lines
Quoted 2 lines
It would be also nice to have this code covered by oe-selftest.
Yes, I plan do create a test and update the documentation once it is integrated in master.
I'd prefer to have tests in the same patchset with the code. It would help to understand better how to handle external configs. Can you do that?
Regards,
Ed
Quoted 181 lines
Quoted 178 lines · On Wed, Nov 18, 2015 at 08:25:54AM +0000, [email protected] wrote:
Quoted 176 lines
From: Mariano Lopez <[email protected]>
This change will allow to use a user defined file as the configuration for the bootloaders (grub, gummiboot, syslinux).
The config file is defined in the wks file with the "configfile" option in the bootloader line.
[YOCTO #8003]
Signed-off-by Mariano Lopez <[email protected]>--- scripts/lib/wic/plugins/source/bootimg-efi.py | 66 ++++++++++++++++-------- scripts/lib/wic/plugins/source/bootimg-pcbios.py | 66 ++++++++++++++---------- 2 files changed, 83 insertions(+), 49 deletions(-)scripts/lib/wic/plugins/source/bootimg-efi.py +44
-22@@ -45,22 +45,33 @@ class BootimgEFIPlugin(SourcePlugin): """ Create loader-specific (grub-efi) config """ - options = creator.ks.handler.bootloader.appendLine - - grubefi_conf = "" - grubefi_conf += "serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1\n" - grubefi_conf += "default=boot\n" - timeout = kickstart.get_timeout(creator.ks) - if not timeout: - timeout = 0 - grubefi_conf += "timeout=%s\n" % timeout - grubefi_conf += "menuentry 'boot'{\n" - - kernel = "/bzImage" - - grubefi_conf += "linux %s root=%s rootwait %s\n" \ - % (kernel, creator.rootdev, options) - grubefi_conf += "}\n" + configfile = kickstart.get_bootloader_file(creator.ks) + + if configfile and os.path.exists(configfile): + # Use a custom configuration file for grub + msger.info("Using custom configuration file " + "%s for grub.cfg" % configfile) + user_conf = open(configfile, "r") + grubefi_conf = user_conf.read() + user_conf.close() + else: + # Create grub configuration using parameters from wks file + options = creator.ks.handler.bootloader.appendLine + + grubefi_conf = "" + grubefi_conf += "serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1\n" + grubefi_conf += "default=boot\n" + timeout = kickstart.get_timeout(creator.ks) + if not timeout: + timeout = 0 + grubefi_conf += "timeout=%s\n" % timeout + grubefi_conf += "menuentry 'boot'{\n" + + kernel = "/bzImage" + + grubefi_conf += "linux %s root=%s rootwait %s\n" \ + % (kernel, creator.rootdev, options) + grubefi_conf += "}\n" msger.debug("Writing grubefi config %s/hdd/boot/EFI/BOOT/grub.cfg" \ % cr_workdir)@@ -95,12 +106,23 @@ class BootimgEFIPlugin(SourcePlugin): cfg.write(loader_conf) cfg.close() - kernel = "/bzImage" - - boot_conf = "" - boot_conf += "title boot\n" - boot_conf += "linux %s\n" % kernel - boot_conf += "options LABEL=Boot root=%s %s\n" % (creator.rootdev, options) + configfile = kickstart.get_bootloader_file(creator.ks) + + if configfile and os.path.exists(configfile): + # Use a custom configuration file for gummiboot + msger.info("Using custom configuration file " + "%s for gummiboot's boot.conf" % configfile) + user_conf = open(configfile, "r") + boot_conf = user_conf.read() + user_conf.close() + else: + # Create gummiboot configuration using parameters from wks file + kernel = "/bzImage" + + boot_conf = "" + boot_conf += "title boot\n" + boot_conf += "linux %s\n" % kernel + boot_conf += "options LABEL=Boot root=%s %s\n" % (creator.rootdev, options) msger.debug("Writing gummiboot config %s/hdd/boot/loader/entries/boot.conf" \ % cr_workdir)scripts/lib/wic/plugins/source/bootimg-pcbios.py +39
-27@@ -83,34 +83,46 @@ class BootimgPcbiosPlugin(SourcePlugin): install_cmd = "install -d %s" % hdddir exec_cmd(install_cmd) - splash = os.path.join(cr_workdir, "/hdd/boot/splash.jpg") - if os.path.exists(splash): - splashline = "menu background splash.jpg" + configfile = kickstart.get_bootloader_file(creator.ks) + + if configfile and os.path.exists(configfile): + # Use a custom configuration file for syslinux + msger.info("Using custom configuration file " + "%s for syslinux.cfg" % configfile) + user_conf = open(configfile, "r") + syslinux_conf = user_conf.read() + user_conf.close() + else: - splashline = "" - - options = creator.ks.handler.bootloader.appendLine - - syslinux_conf = "" - syslinux_conf += "PROMPT 0\n" - timeout = kickstart.get_timeout(creator.ks) - if not timeout: - timeout = 0 - syslinux_conf += "TIMEOUT " + str(timeout) + "\n" - syslinux_conf += "\n" - syslinux_conf += "ALLOWOPTIONS 1\n" - syslinux_conf += "SERIAL 0 115200\n" - syslinux_conf += "\n" - if splashline: - syslinux_conf += "%s\n" % splashline - syslinux_conf += "DEFAULT boot\n" - syslinux_conf += "LABEL boot\n" - - kernel = "/vmlinuz" - syslinux_conf += "KERNEL " + kernel + "\n" - - syslinux_conf += "APPEND label=boot root=%s %s\n" % \ - (creator.rootdev, options) + # Create syslinux configuration using parameters from wks file + splash = os.path.join(cr_workdir, "/hdd/boot/splash.jpg") + if os.path.exists(splash): + splashline = "menu background splash.jpg" + else: + splashline = "" + + options = creator.ks.handler.bootloader.appendLine + + syslinux_conf = "" + syslinux_conf += "PROMPT 0\n" + timeout = kickstart.get_timeout(creator.ks) + if not timeout: + timeout = 0 + syslinux_conf += "TIMEOUT " + str(timeout) + "\n" + syslinux_conf += "\n" + syslinux_conf += "ALLOWOPTIONS 1\n" + syslinux_conf += "SERIAL 0 115200\n" + syslinux_conf += "\n" + if splashline: + syslinux_conf += "%s\n" % splashline + syslinux_conf += "DEFAULT boot\n" + syslinux_conf += "LABEL boot\n" + + kernel = "/vmlinuz" + syslinux_conf += "KERNEL " + kernel + "\n" + + syslinux_conf += "APPEND label=boot root=%s %s\n" % \ + (creator.rootdev, options) msger.debug("Writing syslinux config %s/hdd/boot/syslinux.cfg" \ % cr_workdir)Signature · 1 line
1.8.4.5Signature · 1 line
Mariano Lopez
Signature · 3 lines
-- Regards, Ed
Re: [PATCH 2/2] wic: Allow to use a custom config for bootloaders
Quoted 14 lines · Ed Bartosh
Quoted 4 lines · Mariano Lopez
Quoted 2 lines · Ed Bartosh
Hi Mariano,
Quoted 9 lines
Quoted 4 lines
Thank you for the patchset!
Would it be better to put content of configuration file into .wks instead of just referring to it?
If the configuration is simple I agree with you; however if the configuration have scripts I think it's better to have separated file. The file can growth and would be a real mess inside a wks file.
Quoted 5 lines
What bothers me here is that reference to the external entity (config file in this case) which may or may not exist. This makes wic more fragile than it is now.
Can we put bootloader configs to some predefined place, e.g. to the same directory where .wks is?
I see your point now. I'll change the code to have the configuration in the wks file.
Quoted 8 lines
Quoted 5 lines
Quoted 2 lines
It would be also nice to have this code covered by oe-selftest.
Yes, I plan do create a test and update the documentation once it is integrated in master.
I'd prefer to have tests in the same patchset with the code. It would help to understand better how to handle external configs. Can you do that?
I'll work on that and send the series again.
Quoted 183 lines
Regards,
EdQuoted 179 lines
Quoted 177 lines · On Wed, Nov 18, 2015 at 08:25:54AM +0000, [email protected] wrote:
Quoted 176 lines
From: Mariano Lopez <[email protected]>
This change will allow to use a user defined file as the configuration for the bootloaders (grub, gummiboot, syslinux).
The config file is defined in the wks file with the "configfile" option in the bootloader line.
[YOCTO #8003]
Signed-off-by Mariano Lopez <[email protected]>--- scripts/lib/wic/plugins/source/bootimg-efi.py | 66 ++++++++++++++++-------- scripts/lib/wic/plugins/source/bootimg-pcbios.py | 66 ++++++++++++++---------- 2 files changed, 83 insertions(+), 49 deletions(-)scripts/lib/wic/plugins/source/bootimg-efi.py +44
-22@@ -45,22 +45,33 @@ class BootimgEFIPlugin(SourcePlugin): """ Create loader-specific (grub-efi) config """ - options = creator.ks.handler.bootloader.appendLine - - grubefi_conf = "" - grubefi_conf += "serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1\n" - grubefi_conf += "default=boot\n" - timeout = kickstart.get_timeout(creator.ks) - if not timeout: - timeout = 0 - grubefi_conf += "timeout=%s\n" % timeout - grubefi_conf += "menuentry 'boot'{\n" - - kernel = "/bzImage" - - grubefi_conf += "linux %s root=%s rootwait %s\n" \ - % (kernel, creator.rootdev, options) - grubefi_conf += "}\n" + configfile = kickstart.get_bootloader_file(creator.ks) + + if configfile and os.path.exists(configfile): + # Use a custom configuration file for grub + msger.info("Using custom configuration file " + "%s for grub.cfg" % configfile) + user_conf = open(configfile, "r") + grubefi_conf = user_conf.read() + user_conf.close() + else: + # Create grub configuration using parameters from wks file + options = creator.ks.handler.bootloader.appendLine + + grubefi_conf = "" + grubefi_conf += "serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1\n" + grubefi_conf += "default=boot\n" + timeout = kickstart.get_timeout(creator.ks) + if not timeout: + timeout = 0 + grubefi_conf += "timeout=%s\n" % timeout + grubefi_conf += "menuentry 'boot'{\n" + + kernel = "/bzImage" + + grubefi_conf += "linux %s root=%s rootwait %s\n" \ + % (kernel, creator.rootdev, options) + grubefi_conf += "}\n" msger.debug("Writing grubefi config %s/hdd/boot/EFI/BOOT/grub.cfg" \ % cr_workdir)@@ -95,12 +106,23 @@ class BootimgEFIPlugin(SourcePlugin): cfg.write(loader_conf) cfg.close() - kernel = "/bzImage" - - boot_conf = "" - boot_conf += "title boot\n" - boot_conf += "linux %s\n" % kernel - boot_conf += "options LABEL=Boot root=%s %s\n" % (creator.rootdev, options) + configfile = kickstart.get_bootloader_file(creator.ks) + + if configfile and os.path.exists(configfile): + # Use a custom configuration file for gummiboot + msger.info("Using custom configuration file " + "%s for gummiboot's boot.conf" % configfile) + user_conf = open(configfile, "r") + boot_conf = user_conf.read() + user_conf.close() + else: + # Create gummiboot configuration using parameters from wks file + kernel = "/bzImage" + + boot_conf = "" + boot_conf += "title boot\n" + boot_conf += "linux %s\n" % kernel + boot_conf += "options LABEL=Boot root=%s %s\n" % (creator.rootdev, options) msger.debug("Writing gummiboot config %s/hdd/boot/loader/entries/boot.conf" \ % cr_workdir)scripts/lib/wic/plugins/source/bootimg-pcbios.py +39
-27@@ -83,34 +83,46 @@ class BootimgPcbiosPlugin(SourcePlugin): install_cmd = "install -d %s" % hdddir exec_cmd(install_cmd) - splash = os.path.join(cr_workdir, "/hdd/boot/splash.jpg") - if os.path.exists(splash): - splashline = "menu background splash.jpg" + configfile = kickstart.get_bootloader_file(creator.ks) + + if configfile and os.path.exists(configfile): + # Use a custom configuration file for syslinux + msger.info("Using custom configuration file " + "%s for syslinux.cfg" % configfile) + user_conf = open(configfile, "r") + syslinux_conf = user_conf.read() + user_conf.close() + else: - splashline = "" - - options = creator.ks.handler.bootloader.appendLine - - syslinux_conf = "" - syslinux_conf += "PROMPT 0\n" - timeout = kickstart.get_timeout(creator.ks) - if not timeout: - timeout = 0 - syslinux_conf += "TIMEOUT " + str(timeout) + "\n" - syslinux_conf += "\n" - syslinux_conf += "ALLOWOPTIONS 1\n" - syslinux_conf += "SERIAL 0 115200\n" - syslinux_conf += "\n" - if splashline: - syslinux_conf += "%s\n" % splashline - syslinux_conf += "DEFAULT boot\n" - syslinux_conf += "LABEL boot\n" - - kernel = "/vmlinuz" - syslinux_conf += "KERNEL " + kernel + "\n" - - syslinux_conf += "APPEND label=boot root=%s %s\n" % \ - (creator.rootdev, options) + # Create syslinux configuration using parameters from wks file + splash = os.path.join(cr_workdir, "/hdd/boot/splash.jpg") + if os.path.exists(splash): + splashline = "menu background splash.jpg" + else: + splashline = "" + + options = creator.ks.handler.bootloader.appendLine + + syslinux_conf = "" + syslinux_conf += "PROMPT 0\n" + timeout = kickstart.get_timeout(creator.ks) + if not timeout: + timeout = 0 + syslinux_conf += "TIMEOUT " + str(timeout) + "\n" + syslinux_conf += "\n" + syslinux_conf += "ALLOWOPTIONS 1\n" + syslinux_conf += "SERIAL 0 115200\n" + syslinux_conf += "\n" + if splashline: + syslinux_conf += "%s\n" % splashline + syslinux_conf += "DEFAULT boot\n" + syslinux_conf += "LABEL boot\n" + + kernel = "/vmlinuz" + syslinux_conf += "KERNEL " + kernel + "\n" + + syslinux_conf += "APPEND label=boot root=%s %s\n" % \ + (creator.rootdev, options) msger.debug("Writing syslinux config %s/hdd/boot/syslinux.cfg" \ % cr_workdir)Signature · 1 line
1.8.4.5Signature · 1 line
Mariano Lopez
Signature · 1 line
Mariano Lopez
Re: [PATCH 2/2] wic: Allow to use a custom config for bootloaders
Quoted 17 lines · Mariano Lopez
Quoted 14 lines · Ed Bartosh
Quoted 13 lines · Mariano Lopez
Quoted 6 lines · Ed Bartosh
Hi Mariano,
Thank you for the patchset!
Would it be better to put content of configuration file into .wks instead of just referring to it?
If the configuration is simple I agree with you; however if the configuration have scripts I think it's better to have separated file. The file can growth and would be a real mess inside a wks file.
Quoted 7 lines
Quoted 5 lines
What bothers me here is that reference to the external entity (config file in this case) which may or may not exist. This makes wic more fragile than it is now.
Can we put bootloader configs to some predefined place, e.g. to the same directory where .wks is?
I see your point now. I'll change the code to have the configuration in the wks file.
I was checking in the kickstart code and the parser is a state machine that reads line by line, so a multi line bootloader config file is not currently and option. I was about to modify the code when I saw the comment for this class:
"Methods that don't need to do anything may just pass. However, _stateMachine should never be overridden."
So, in order to have the config file inside the wks file we would need to hack in kickstart code; I would like to avoid that. What do you think?
Quoted 209 lines
Quoted 9 lines
Quoted 6 lines
Quoted 3 lines
It would be also nice to have this code covered by oe-selftest.
Yes, I plan do create a test and update the documentation once it is integrated in master.
I'd prefer to have tests in the same patchset with the code. It would help to understand better how to handle external configs. Can you do that?
I'll work on that and send the series again.
Quoted 196 lines
Regards,
EdQuoted 192 lines
Quoted 190 lines · On Wed, Nov 18, 2015 at 08:25:54AM +0000, [email protected] wrote:
Quoted 189 lines
From: Mariano Lopez <[email protected]>
This change will allow to use a user defined file as the configuration for the bootloaders (grub, gummiboot, syslinux).
The config file is defined in the wks file with the "configfile" option in the bootloader line.
[YOCTO #8003]
Signed-off-by Mariano Lopez <[email protected]>--- scripts/lib/wic/plugins/source/bootimg-efi.py | 66 ++++++++++++++++-------- scripts/lib/wic/plugins/source/bootimg-pcbios.py | 66 ++++++++++++++---------- 2 files changed, 83 insertions(+), 49 deletions(-)scripts/lib/wic/plugins/source/bootimg-efi.py +11
-17@@ -45,22 +45,33 @@ class BootimgEFIPlugin(SourcePlugin): """ Create loader-specific (grub-efi) config """ - options = creator.ks.handler.bootloader.appendLine - - grubefi_conf = "" - grubefi_conf += "serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1\n" - grubefi_conf += "default=boot\n" - timeout = kickstart.get_timeout(creator.ks) - if not timeout: - timeout = 0 - grubefi_conf += "timeout=%s\n" % timeout - grubefi_conf += "menuentry 'boot'{\n" - - kernel = "/bzImage" - - grubefi_conf += "linux %s root=%s rootwait %s\n" \ - % (kernel, creator.rootdev, options) - grubefi_conf += "}\n" + configfile = kickstart.get_bootloader_file(creator.ks) + + if configfile and os.path.exists(configfile): + # Use a custom configuration file for grub + msger.info("Using custom configuration file " + "%s for grub.cfg" % configfile) + user_conf = open(configfile, "r") + grubefi_conf = user_conf.read() + user_conf.close() + else: + # Create grub configuration using parameters from wksfile
scripts/lib/wic/plugins/source/bootimg-efi.py +16
-1+ options = creator.ks.handler.bootloader.appendLine + + grubefi_conf = "" + grubefi_conf += "serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1\n" + grubefi_conf += "default=boot\n" + timeout = kickstart.get_timeout(creator.ks) + if not timeout: + timeout = 0 + grubefi_conf += "timeout=%s\n" % timeout + grubefi_conf += "menuentry 'boot'{\n" + + kernel = "/bzImage" + + grubefi_conf += "linux %s root=%s rootwait %s\n" \ + % (kernel, creator.rootdev, options) + grubefi_conf += "}\n" msger.debug("Writing grubefi config%s/hdd/boot/EFI/BOOT/grub.cfg" \
%cr_workdir)scripts/lib/wic/plugins/source/bootimg-efi.py +11
-6@@ -95,12 +106,23 @@ class BootimgEFIPlugin(SourcePlugin): cfg.write(loader_conf) cfg.close() - kernel = "/bzImage" - - boot_conf = "" - boot_conf += "title boot\n" - boot_conf += "linux %s\n" % kernel - boot_conf += "options LABEL=Boot root=%s %s\n" % (creator.rootdev, options) + configfile = kickstart.get_bootloader_file(creator.ks) + + if configfile and os.path.exists(configfile): + # Use a custom configuration file for gummiboot + msger.info("Using custom configuration file " + "%s for gummiboot's boot.conf" % configfile) + user_conf = open(configfile, "r") + boot_conf = user_conf.read() + user_conf.close() + else: + # Create gummiboot configuration using parametersfrom wks file
scripts/lib/wic/plugins/source/bootimg-efi.py +6
-0+ kernel = "/bzImage" + + boot_conf = "" + boot_conf += "title boot\n" + boot_conf += "linux %s\n" % kernel + boot_conf += "options LABEL=Boot root=%s %s\n" %(creator.rootdev, options)
msger.debug("Writing gummiboot config
%s/hdd/boot/loader/entries/boot.conf" \
%cr_workdir)scripts/lib/wic/plugins/source/bootimg-pcbios.py +11
-27@@ -83,34 +83,46 @@ class BootimgPcbiosPlugin(SourcePlugin): install_cmd = "install -d %s" % hdddir exec_cmd(install_cmd) - splash = os.path.join(cr_workdir, "/hdd/boot/splash.jpg") - if os.path.exists(splash): - splashline = "menu background splash.jpg" + configfile = kickstart.get_bootloader_file(creator.ks) + + if configfile and os.path.exists(configfile): + # Use a custom configuration file for syslinux + msger.info("Using custom configuration file " + "%s for syslinux.cfg" % configfile) + user_conf = open(configfile, "r") + syslinux_conf = user_conf.read() + user_conf.close() + else: - splashline = "" - - options = creator.ks.handler.bootloader.appendLine - - syslinux_conf = "" - syslinux_conf += "PROMPT 0\n" - timeout = kickstart.get_timeout(creator.ks) - if not timeout: - timeout = 0 - syslinux_conf += "TIMEOUT " + str(timeout) + "\n" - syslinux_conf += "\n" - syslinux_conf += "ALLOWOPTIONS 1\n" - syslinux_conf += "SERIAL 0 115200\n" - syslinux_conf += "\n" - if splashline: - syslinux_conf += "%s\n" % splashline - syslinux_conf += "DEFAULT boot\n" - syslinux_conf += "LABEL boot\n" - - kernel = "/vmlinuz" - syslinux_conf += "KERNEL " + kernel + "\n" - - syslinux_conf += "APPEND label=boot root=%s %s\n" % \ - (creator.rootdev, options) + # Create syslinux configuration using parameters fromwks file
+ splash = os.path.join(cr_workdir,
"/hdd/boot/splash.jpg")scripts/lib/wic/plugins/source/bootimg-pcbios.py +27
-0+ if os.path.exists(splash): + splashline = "menu background splash.jpg" + else: + splashline = "" + + options = creator.ks.handler.bootloader.appendLine + + syslinux_conf = "" + syslinux_conf += "PROMPT 0\n" + timeout = kickstart.get_timeout(creator.ks) + if not timeout: + timeout = 0 + syslinux_conf += "TIMEOUT " + str(timeout) + "\n" + syslinux_conf += "\n" + syslinux_conf += "ALLOWOPTIONS 1\n" + syslinux_conf += "SERIAL 0 115200\n" + syslinux_conf += "\n" + if splashline: + syslinux_conf += "%s\n" % splashline + syslinux_conf += "DEFAULT boot\n" + syslinux_conf += "LABEL boot\n" + + kernel = "/vmlinuz" + syslinux_conf += "KERNEL " + kernel + "\n" + + syslinux_conf += "APPEND label=boot root=%s %s\n" % \ + (creator.rootdev, options) msger.debug("Writing syslinux config%s/hdd/boot/syslinux.cfg" \
%cr_workdir)Signature · 1 line
1.8.4.5Signature · 1 line
Mariano Lopez
Signature · 1 line
Mariano Lopez
Re: [PATCH 2/2] wic: Allow to use a custom config for bootloaders
Quoted 35 lines · Mariano Lopez
Quoted 21 lines · Mariano Lopez
Quoted 18 lines · Ed Bartosh
Quoted 4 lines · Mariano Lopez
Quoted 2 lines · Ed Bartosh
Hi Mariano,
Quoted 9 lines
Quoted 4 lines
Thank you for the patchset!
Would it be better to put content of configuration file into .wks instead of just referring to it?
If the configuration is simple I agree with you; however if the configuration have scripts I think it's better to have separated file. The file can growth and would be a real mess inside a wks file.
What bothers me here is that reference to the external entity (config file in this case) which
may or may not exist. This makes wic more fragile than it is now.Quoted 5 lines
Quoted 2 lines
Can we put bootloader configs to some predefined place, e.g. to the same directory where .wks is?
I see your point now. I'll change the code to have the configuration in the wks file.
I was checking in the kickstart code and the parser is a state machine that reads line by line, so a multi line bootloader config file is not currently and option. I was about to modify the code when I saw the comment for this class:
Quoted 7 lines
"Methods that don't need to do anything may just pass. However,
_stateMachineshould never be overridden."So, in order to have the config file inside the wks file we would need to hack in kickstart code; I would like to avoid that. What do you think?
I agree with you. Let's not touch kickstart code.
Let's put bootloader config at the same location where .wks is then. It's also not the best solution though as it can be inconvenient for the user, but it's better than pointing to the file which might not exist.
--
Regards,
Ed