[arch-releng] [PATCH] Provide Syslinux as a possible bootloader
interactive_syslinux depends on the syslinux-install_update script that
is in the Arch syslinux package.
---
src/core/libs/lib-blockdevices-filesystems.sh | 3 +-
src/core/libs/lib-ui-interactive.sh | 118 ++++++++++++++++++++++++-
src/core/procedures/base | 1 +
3 files changed, 119 insertions(+), 3 deletions(-)
diff --git a/src/core/libs/lib-blockdevices-filesystems.sh b/src/core/libs/lib-blockdevices-filesystems.sh
index cb30a2e..13160c9 100644
--- a/src/core/libs/lib-blockdevices-filesystems.sh
+++ b/src/core/libs/lib-blockdevices-filesystems.sh
@@ -94,7 +94,8 @@ get_possible_fs () {
true
}
-supported_bootloaders=('grub')
+syslinux_supported_fs=('ext2' 'ext3' 'ext4' 'btrfs' 'vfat')
+supported_bootloaders=('syslinux' 'grub')
# procedural code from quickinst functionized and fixed.
# there were functions like this in the setup script too, with some subtle differences. see below
diff --git a/src/core/libs/lib-ui-interactive.sh b/src/core/libs/lib-ui-interactive.sh
index 29453cb..bd8cb8a 100644
--- a/src/core/libs/lib-ui-interactive.sh
+++ b/src/core/libs/lib-ui-interactive.sh
@@ -2,7 +2,9 @@
# A library which allows you to do backend stuff by using user interfaces
# Global Variables
-grubmenu="/boot/grub/menu.lst" # be sure to override this if you have it somewhere else
+# Be sure to override these if you have the configuration file elsewhere
+grubmenu="/boot/grub/menu.lst"
+syslinuxmenu="/boot/syslinux/syslinux.cfg"
# check if a worker has completed successfully. if not -> tell user he must do it + return 1
# if ok -> don't warn anything and return 0
@@ -737,7 +739,8 @@ If any previous configuration you've done until now (like fancy filesystems) req
done
ask_option no "Choose bootloader" "Which bootloader would you like to use?" optional \
- "grub" "GRUB bootloader"
+ "grub" "GRUB bootloader" \
+ "syslinux" "Syslinux bootloader (${syslinux_supported_fs[*]})"
bootloader=$ANSWER_OPTION
@@ -867,6 +870,8 @@ interactive_install_bootloader () {
if [[ $bootloader = grub ]]; then
GRUB_OK=0
interactive_grub || return 1
+ elif [[ $bootloader = syslinux ]]; then
+ interactive_syslinux || return 1
else
show_warning 'No Bootloader' 'You did not select a bootloader. No bootloader will be installed.'
fi
@@ -1131,11 +1136,120 @@ EOF
fi
}
+interactive_syslinux() {
+ debug FS "starting interactive_syslinux"
+
+ # Find and Store the device that has the root filesystem
+ get_device_with_mount '/' || return 1
+ PART_ROOT="$ANSWER_DEVICE"
+
+ # Gets booot device
+ get_device_with_mount '/boot'
+ bootdev="$ANSWER_DEVICE"
+
+ # Check to see if /boot or / (root) has a valid FS type and set bootpart
+ # bootpart == device with /boot dir
+ if [[ $bootdev ]]; then
+ filesystem="$(awk '/ \/boot /{print $4}' $TMP_FILESYSTEMS)"
+ debug FS "$bootdev - FS type: $filesystem"
+
+ local bootpart="$bootdev"
+ else
+ filesystem="$(awk '/ \/ /{print $4}' $TMP_FILESYSTEMS)"
+ debug FS "$PART_ROOT - FS type: $filesystem"
+
+ local bootpart="$PART_ROOT"
+ fi
+
+ if ! check_is_in "$filesystem" "${syslinux_supported_fs[@]}"; then
+ show_warning "Invalid FS" "Error: Syslinux does not support $filesystem.\n\nThe following filesystems are supported:\n ${syslinux_supported_fs[@]}"
+ return 1
+ fi
+
+ # remove default entries by truncating file at our little tag (#-*)
+ sed -i -e '/#-\*/q' "$syslinuxmenu"
+
+ # Generate menu and prompt user to edit it
+ interactive_bootloader_menu "syslinux" "$syslinuxmenu"
+
+ if device_is_raid "$bootpart"; then
+ debug FS "Software RAID detected"
+ local onraid=true
+ fi
+
+ debug FS "Installing Syslinux ($var_TARGET_DIR/usr/sbin/syslinux-install_update -i -c /mnt)"
+ inform "Installing Syslinux..."
+ if ! "$var_TARGET_DIR/usr/sbin/syslinux-install_update" -i -c /mnt >$LOG 2>&1; then
+ debug FS "FAILED: syslinux-install_update -i -c /mnt failed"
+ show_warning "FAILED" "syslinux-install_update -i -c /mnt failed"
+ return 1
+ fi
+
+ if ask_yesno "Set boot flag(s) and install the Syslinux MBR?" yes; then
+ inform "Setting Boot Flag(s)...\nThis could take a while. Please be patient.\n\n" syslinuxprog
+ if "$var_TARGET_DIR/usr/sbin/syslinux-install_update" -a -c /mnt >$LOG 2>&1; then
+ debug FS "Successfully set boot flag(s)"
+ else
+ debug FS "Failde to set boot flag(s). syslinux-install_update -a failed with Error Code - $?"
+ show_warning "FAILED" "Failed to set boot flag(s). MBR not installed" && return 1
+ fi
+
+ inform "Installing Syslinux MBR..." syslinuxprog
+ if "$var_TARGET_DIR/usr/sbin/syslinux-install_update" -m -c /mnt >$LOG 2>&1; then
+ debug FS "Successfully installed MBR(s)"
+ else
+ debug FS "Failed to install MBR. syslinux-install_update -m failed with Error Code - $?"
+ show_warning "FAILED" "Failed to install the MBR!" && return 1
+ fi
+ fi
+ notify "Syslinux Installation Successful"
+}
+
+generate_syslinux_menu () {
+ get_kernel_parameters || return
+
+ cat >>$syslinuxmenu <
good. i merged this one (with a minor typo fix). thanks for your work. the cool news is, I don't need to test this right now. newly built images will get aif from the develop branch, have this syslinux support, and people can try it out right away. any news on when the appropriate syslinux package will be in the extra/core repo (i.e. out of testing?) Dieter
Am 06.03.2011 16:43, schrieb Dieter Plaetinck:
good. i merged this one (with a minor typo fix). thanks for your work. the cool news is, I don't need to test this right now. newly built images will get aif from the develop branch, have this syslinux support, and people can try it out right away.
any news on when the appropriate syslinux package will be in the extra/core repo (i.e. out of testing?)
Dieter
We need one more update and signoffs.
participants (3)
-
Dieter Plaetinck
-
pyther@pyther.net
-
Thomas Bächler