diff options
author | Michael Brown | 2017-04-12 16:03:25 +0200 |
---|---|---|
committer | Michael Brown | 2017-04-12 16:58:05 +0200 |
commit | 84d406ccf48c8808b0bb30d526b758e4b58cacc8 (patch) | |
tree | e0d262d87136fcaf8f202ab7d6e51760a387fe78 /src/core | |
parent | [efi] Add efi_sprintf() and efi_vsprintf() (diff) | |
download | ipxe-84d406ccf48c8808b0bb30d526b758e4b58cacc8.tar.gz ipxe-84d406ccf48c8808b0bb30d526b758e4b58cacc8.tar.xz ipxe-84d406ccf48c8808b0bb30d526b758e4b58cacc8.zip |
[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 <vish.ishaya@oracle.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/dummy_sanboot.c | 5 | ||||
-rw-r--r-- | src/core/null_sanboot.c | 3 | ||||
-rw-r--r-- | src/core/settings.c | 9 |
3 files changed, 15 insertions, 2 deletions
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", |