[arch-releng] [PATCH 2/3] Provides Syslinux as a possible bootloader
pyther at pyther.net
pyther at pyther.net
Sun Feb 20 23:09:36 EST 2011
interactive_syslinux depends on the syslinux-install_update script that
is in the Arch Syslinux package.
---
src/core/libs/lib-blockdevices-filesystems.sh | 1 +
src/core/libs/lib-ui-interactive.sh | 159 +++++++++++++++++++++++--
src/core/procedures/base | 1 +
3 files changed, 153 insertions(+), 8 deletions(-)
diff --git a/src/core/libs/lib-blockdevices-filesystems.sh b/src/core/libs/lib-blockdevices-filesystems.sh
index ac749a3..0ba2070 100644
--- a/src/core/libs/lib-blockdevices-filesystems.sh
+++ b/src/core/libs/lib-blockdevices-filesystems.sh
@@ -76,6 +76,7 @@ fs_on[dm_crypt]=${fs_on_dm_crypt[@]}
fs_mountable=(ext2 ext3 ext4 nilfs2 xfs jfs vfat reiserfs)
fs_label_mandatory=('lvm-vg' 'lvm-lv' 'dm_crypt')
fs_label_optional=('swap' 'ext2' 'ext3' 'ext4' 'reiserfs' 'nilfs2' 'xfs' 'jfs' 'vfat')
+syslinux_supported_fs=('ext2' 'ext3' 'ext4' 'btrfs' 'vfat')
# list needed packages per filesystem
declare -A filesystem_pkg=(["lvm-pv"]="lvm2" ["xfs"]="xfsprogs" ["jfs"]="jfsutils" ["reiserfs"]="reiserfsprogs" ["nilfs2"]="nilfs-utils" ["vfat"]="dosfstools" ["dm_crypt"]="cryptsetup" ["btrfs"]=btrfs-progs-unstable)
diff --git a/src/core/libs/lib-ui-interactive.sh b/src/core/libs/lib-ui-interactive.sh
index 85a3a5f..16a9600 100644
--- a/src/core/libs/lib-ui-interactive.sh
+++ b/src/core/libs/lib-ui-interactive.sh
@@ -3,6 +3,7 @@
# Global Variables
grubmenu="/boot/grub/menu.lst" # be sure to override this if you have it somewhere else
+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
@@ -845,12 +846,16 @@ interactive_runtime_network() {
interactive_install_bootloader () {
ask_option Grub "Choose bootloader" "Which bootloader would you like to use? Grub is the Arch default." required \
"Grub" "Use the GRUB bootloader (default)" \
+ "Syslinux" "Use the Syslinux bootloader (ext2/3/4, btrfs, and vfat)" \
"None" "\Zb\Z1Warning\Z0\ZB: you must install your own bootloader!" || return 1
bl=`tr '[:upper:]' '[:lower:]' <<< "$ANSWER_OPTION"`
- [ "$bl" != grub ] && return 0
- GRUB_OK=0
- interactive_grub
+ if [[ $bl == grub ]]; then
+ GRUB_OK=0
+ interactive_grub
+ elif [[ $bl == syslinux ]]; then
+ interactive_syslinux
+ fi
}
interactive_grub() {
@@ -883,7 +888,7 @@ interactive_grub() {
fi
fi
# Create and edit the grub menu.lst
- interactive_bootloader_menu "GRUB" $grubmenu
+ interactive_bootloader_menu "grub" $grubmenu
DEVS="$(findblockdevices '_ ')"
if [ "$DEVS" = " " ]; then
@@ -1111,12 +1116,150 @@ EOF
fi
}
-interactive_bootloader_menu() {
- # $1 - Bootloader Name
- # $2 - Bootloader Configuration Files
+interactive_syslinux() {
+ # Check if Syslinux in installed
+ [[ ! -f "$var_TARGET_DIR/sbin/extlinux" ]] && show_warning "No Syslinux?" "Error: Couldn't find $var_TARGET_DIR/sbin/extlinux. Is SYSLINUX installed?" && return 1
+
+ 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 [[ $1 = GRUB ]]; then
+ if ! check_is_in "$filesystem" "${syslinux_supported_fs[@]}"; then
+ show_warning "Invalid FS" "Error: Syslinux only supports EXT2/3/4, BTRFS, and VFAT"
+ 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
+ # Notify the user or trust the scripts?
+ fi
+
+ debug FS "Installing Syslinux ($var_TARGET_DIR/usr/lib/syslinux/syslinux-install_update)"
+ inform "Installing Syslinux..."
+ if ! "$var_TARGET_DIR/usr/lib/syslinux/syslinux-install_update" -i -c /mnt; 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
+ "$var_TARGET_DIR/usr/lib/syslinux/syslinux-install_update" -a -c /mnt
+ rt=$?
+ case "$rt" in
+ 0)
+ debug FS "Successfully set boot flag(s)"
+ ;;
+ 1)
+ debug FS "Failed to set boot flag. Function in syslinux-install_update exited with status $rt"
+ notify "Failed to set boot flag. MBR not installed!" && return 1
+ ;;
+ 3)
+ debug FS "Failed to set boot flag(s). syslinux-install_update -a exited with status $rt"
+ notify "Failed to set boot flag(s)! MBR not installed!" && return 1
+ ;;
+ *)
+ debug FS "Failde to set boot flag(s). syslinux-install_update -a failed with an unkown Error Code - $rt"
+ notify "Failed to set boot flag(s). MBR not installed" && return 1
+ ;;
+ esac
+
+ inform "Installing Syslinux MBR..." syslinuxprog
+ "$var_TARGET_DIR/usr/lib/syslinux/syslinux-install_update" -m -c /mnt
+ rt=$?
+ case "$rt" in
+ 0)
+ debug FS "Successfully installed MBR(s)"
+ ;;
+ 1)
+ debug FS "Failed install MBR. Function in syslinux-install_update -m exited with status $rt"
+ notify "Failed to install the MBR!." && return 1
+ ;;
+ 4)
+ debug FS "Failed to install MBR. syslinux-install_update -m exited with status $rt"
+ notify "Failed to install MBR!" && return 1
+ ;;
+ *)
+ debug FS "Failed to install MBR. syslinux-install_update -m failed with an unkown Error Code - $rt"
+ notify "Failed to install the MBR!" && return 1
+ ;;
+ esac
+ fi
+ notify "Syslinux Installation Successful"
+}
+
+generate_syslinux_menu () {
+ get_kernel_parameters
+
+ cat >>$syslinuxmenu <<EOF
+
+# (0) Arch Linux
+LABEL arch
+ MENU LABEL Arch Linux
+ LINUX ../vmlinuz26
+ APPEND $kernel_parameters
+ INITRD ../kernel26.img
+
+# (1) Arch Linux Fallback
+LABEL archfallback
+ MENU LABEL Arch Linux Fallback
+ LINUX ../vmlinuz26
+ APPEND $kernel_parameters
+ INITRD ../kernel26-fallback.img
+
+# (2) Windows
+#LABEL windows
+#COM32 chain.c32
+#APPEND hd0 0
+
+LABEL hdt
+ MENU LABEL HDT (Hardware Detection Tool)
+ COM32 hdt.c32
+
+LABEL reboot
+ MENU LABEL Reboot
+ COM32 reboot.c32
+
+LABEL off
+ MENU LABEL Power Off
+ COMBOOT poweroff.com
+EOF
+}
+
+# $1 - Bootloader Name
+# $2 - Bootloader Configuration Files
+interactive_bootloader_menu() {
+ if [[ $1 = grub ]]; then
generate_grub_menulst
+ elif [[ $1 = syslinux ]]; then
+ generate_syslinux_menu
fi
grep -q '^/dev/mapper' $TMP_FSTAB && local helptext=" /dev/mapper/ users: Pay attention to the kernel line!"
diff --git a/src/core/procedures/base b/src/core/procedures/base
index 3ff66b4..bab079b 100644
--- a/src/core/procedures/base
+++ b/src/core/procedures/base
@@ -11,6 +11,7 @@ var_UI_TYPE="cli" # set to cli or dia for dialog
var_ARCH=`uname -m` #i686 or x86_64. NOTE: this assumes you want to install the same arch as the installation environment you're using. maybe we could decouple those someday..
[ -z "$var_ARCH" ] && die_error "Could not determine your architecture"
grubmenu="$var_TARGET_DIR$grubmenu"
+syslinuxmenu="$var_TARGET_DIR$syslinuxmenu"
###### Phases ( can be overridden by more specific procedures) ######
phase_preparation=(\
--
1.7.4.1
More information about the arch-releng
mailing list