summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
authorMichael Brown2017-04-12 16:03:25 +0200
committerMichael Brown2017-04-12 16:58:05 +0200
commit84d406ccf48c8808b0bb30d526b758e4b58cacc8 (patch)
treee0d262d87136fcaf8f202ab7d6e51760a387fe78 /src/core
parent[efi] Add efi_sprintf() and efi_vsprintf() (diff)
downloadipxe-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.c5
-rw-r--r--src/core/null_sanboot.c3
-rw-r--r--src/core/settings.c9
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",