From 84d406ccf48c8808b0bb30d526b758e4b58cacc8 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 12 Apr 2017 15:03:25 +0100 Subject: [block] Allow use of a non-default EFI SAN boot filename Some older operating systems (e.g. RHEL6) use a non-default filename on the root disk and rely on setting an EFI variable to point to the bootloader. This does not work when performing a SAN boot on a machine where the EFI variable is not present. Fix by allowing a non-default filename to be specified via the "sanboot --filename" option or the "san-filename" setting. For example: sanboot --filename \efi\redhat\grub.efi \ iscsi:192.168.0.1::::iqn.2010-04.org.ipxe.demo:rhel6 or option ipxe.san-filename code 188 = string; option ipxe.san-filename "\\efi\\redhat\\grub.efi"; option root-path "iscsi:192.168.0.1::::iqn.2010-04.org.ipxe.demo:rhel6"; Originally-implemented-by: Vishvananda Ishaya Abrams Signed-off-by: Michael Brown --- src/core/dummy_sanboot.c | 5 ++++- src/core/null_sanboot.c | 3 ++- src/core/settings.c | 9 +++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) (limited to 'src/core') diff --git a/src/core/dummy_sanboot.c b/src/core/dummy_sanboot.c index 08180852..e6293099 100644 --- a/src/core/dummy_sanboot.c +++ b/src/core/dummy_sanboot.c @@ -95,8 +95,11 @@ static void dummy_san_unhook ( unsigned int drive ) { * Boot from dummy SAN device * * @v drive Drive number + * @v filename Filename (or NULL to use default) + * @ret rc Return status code */ -static int dummy_san_boot ( unsigned int drive __unused ) { +static int dummy_san_boot ( unsigned int drive __unused, + const char *filename __unused ) { return -EOPNOTSUPP; } diff --git a/src/core/null_sanboot.c b/src/core/null_sanboot.c index b09562e2..7c0680f5 100644 --- a/src/core/null_sanboot.c +++ b/src/core/null_sanboot.c @@ -37,7 +37,8 @@ static void null_san_unhook ( unsigned int drive __unused ) { /* Do nothing */ } -static int null_san_boot ( unsigned int drive __unused ) { +static int null_san_boot ( unsigned int drive __unused, + const char *filename __unused ) { return -EOPNOTSUPP; } diff --git a/src/core/settings.c b/src/core/settings.c index f5be5c4e..87905722 100644 --- a/src/core/settings.c +++ b/src/core/settings.c @@ -2396,6 +2396,15 @@ const struct setting root_path_setting __setting ( SETTING_SANBOOT, root-path)={ .type = &setting_type_string, }; +/** SAN filename setting */ +const struct setting san_filename_setting __setting ( SETTING_SANBOOT, + san-filename ) = { + .name = "san-filename", + .description = "SAN filename", + .tag = DHCP_EB_SAN_FILENAME, + .type = &setting_type_string, +}; + /** Username setting */ const struct setting username_setting __setting ( SETTING_AUTH, username ) = { .name = "username", -- cgit v1.2.3-55-g7522