Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ There are other options as well, as detailed below:
|`-l`, `--loader` | Create a `systemd-boot`-compatible loader config.* |
|`-n`, `--no-loader` | Turns off creating the loader configuration. |
|`-s`, `--stub` | Set up NVRAM entries for the copied kernel. |
|`--preserve-boot-order` | Do not change the boot order when updating NVRAM. |
|`-m`, `--manage-only` | Don't set up any NVRAM entries.* |
|`-f`, `--force-update` | Forcefully update the main loader.conf.** |

Expand Down
7 changes: 7 additions & 0 deletions bin/kernelstub
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,13 @@ def main(options=None): # Do the thing
help = 'Set up NVRAM entries for the copied kernel'
)

parser.add_argument(
'--preserve-boot-order',
action = 'store_true',
dest = 'preserve_boot_order',
help = 'Do not change the boot order when updating NVRAM.'
)

loader_stub.add_argument(
'-m',
'--manage-only',
Expand Down
6 changes: 5 additions & 1 deletion kernelstub/application.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,9 @@ def main(self, args): # Do the thing
if args.manage_mode:
configuration['manage_mode'] = True

if args.preserve_boot_order:
configuration['preserve_boot_order'] = True
preserve_boot_order = configuration["preserve_boot_order"] == True

log.debug('Checking configuration integrity...')
try:
Expand Down Expand Up @@ -315,6 +318,7 @@ def main(self, args): # Do the thing
all_config = (
' ESP Location:..................%s\n' % configuration['esp_path'] +
' Management Mode:...............%s\n' % configuration['manage_mode'] +
' Preserve NVRAM boot order (if not in management mode):..%s\n' % configuration['preserve_boot_order'] +
' Install Loader configuration:..%s\n' % configuration['setup_loader'] +
' Configuration version:.........%s\n' % configuration['config_rev'])
log.info('Configuration details: \n\n%s' % all_config)
Expand Down Expand Up @@ -346,7 +350,7 @@ def main(self, args): # Do the thing
installer.copy_cmdline(simulate=no_run)

if not manage_mode:
installer.setup_stub(kopts, simulate=no_run)
installer.setup_stub(kopts, preserve_boot_order=preserve_boot_order, simulate=no_run)

log.debug('Saving configuration to file')

Expand Down
10 changes: 7 additions & 3 deletions kernelstub/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,10 @@ class Config():
'esp_path': "/boot/efi",
'setup_loader': False,
'manage_mode': False,
'preserve_boot_order': False,
'force_update' : False,
'live_mode' : False,
'config_rev' : 3
'config_rev' : 4
}
}

Expand Down Expand Up @@ -120,8 +121,11 @@ def update_config(self, config):
config['user']['kernel_options'] = self.parse_options(config['user']['kernel_options'].split())
if type(config['default']['kernel_options']) is str:
config['default']['kernel_options'] = self.parse_options(config['default']['kernel_options'].split())
config['user']['config_rev'] = 3
config['default']['config_rev'] = 3
if config['user']['config_rev'] < 4:
config['user']['preserve_boot_order'] = False
config['default']['preserve_boot_order'] = False
config['user']['config_rev'] = 4
config['default']['config_rev'] = 4
return config

def parse_options(self, options):
Expand Down
10 changes: 8 additions & 2 deletions kernelstub/installer.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ def setup_kernel(self, kernel_opts, setup_loader=False, overwrite=False, simulat



def setup_stub(self, kernel_opts, simulate=False):
def setup_stub(self, kernel_opts, preserve_boot_order=False, simulate=False):
self.log.info("Setting up Kernel EFISTUB loader...")
self.copy_cmdline(simulate=simulate)
self.nvram.update()
Expand All @@ -212,7 +212,13 @@ def setup_stub(self, kernel_opts, simulate=False):
else:
self.log.debug("No old entry found, skipping removal.")

self.nvram.add_entry(self.opsys, self.drive, kernel_opts, simulate)
self.nvram.add_entry(
self.opsys,
self.drive,
kernel_opts,
preserve_boot_order=preserve_boot_order,
simulate=simulate
)
self.nvram.update()
nvram_lines = "\n".join(self.nvram.nvram)
self.log.info('NVRAM configured, new values: \n\n%s\n' % nvram_lines)
Expand Down
5 changes: 3 additions & 2 deletions kernelstub/nvram.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,16 +69,17 @@ def find_os_entry(self, nvram, os_label):
return find_index


def add_entry(self, this_os, this_drive, kernel_opts, simulate=False):
def add_entry(self, this_os, this_drive, kernel_opts, preserve_boot_order=False, simulate=False):
self.log.info('Creating NVRAM entry')
create_cmd = "-c" if not preserve_boot_order else "-C"
device = '/dev/%s' % this_drive.drive_name
esp_num = this_drive.esp_num
entry_label = '%s %s' % (this_os.name, this_os.version)
entry_linux = '\\EFI\\%s-%s\\vmlinuz.efi' % (this_os.name, this_drive.root_uuid)
entry_initrd = 'EFI/%s-%s/initrd.img' % (this_os.name, this_drive.root_uuid)
command = [
'efibootmgr',
'-c',
create_cmd,
'-d', device,
'-p', esp_num,
'-L', '%s' % entry_label,
Expand Down