From e3260d88ee68adbed97eea95e9395f611a156acf Mon Sep 17 00:00:00 2001 From: Silvan Calarco Date: Wed, 12 Jun 2013 01:05:37 +0200 Subject: [PATCH] installer: support for EFI grub bootloader installation (currently only target x86_64-efi) --- installer/installer.kmdr | 210 ++++++++++++++++++++------------------- installer/installer.sh | 115 +++++++-------------- 2 files changed, 147 insertions(+), 178 deletions(-) diff --git a/installer/installer.kmdr b/installer/installer.kmdr index 927a826..4448134 100755 --- a/installer/installer.kmdr +++ b/installer/installer.kmdr @@ -2106,57 +2106,6 @@ dcop @dcopid KommanderIf setText installhint "$insthint" - - - setlabel - - - - 540 - 40 - 32 - 32 - - - - - - - - @execBegin -function get_udisks_key() { - LANG=C udisks --show-info $1 | grep " $2:" | head -n1 | sed "s|[[:space:]]*$2:[[:space:]]*\(.*\)|\1|" -} -@if (@devicesbox.currentItem >= 0) - currdev=@String.section(@devicesbox.item(@devicesbox.currentItem)," ",0) - @showdevice.setText(@devicesbox.item(@devicesbox.currentItem)) - @dcop(@dcopid, KommanderIf, enableWidget(QString,bool), next, true) - @BackBox.setChecked(true) - - # - # set MBR combo box - # - dcop @dcopid KommanderIf "clear(QString)" mbrbox - devices=`udisks --enumerate-device-files | grep -v /dev/disk` - dcop @dcopid KommanderIf "addListItem(QString,QString,int)" mbrbox "$currdev (@i18n("System partition"))" 0 - - for device in $devices; do - native_path=`get_udisks_key $device native-path` - [ -e $native_path/partition ] && continue - is_system_internal=`get_udisks_key $device "system internal"` - partscheme=`get_udisks_key $device scheme` - if [ "$is_system_internal" == "1" -o "@removablebox.checked" == "1" ]; then - [ "$partscheme" == "mbr" ] && \ - dcop @dcopid KommanderIf "addListItem(QString,QString,int)" mbrbox "${device:5:5} (master boot record)" 0 - fi - done - dcop @dcopid KommanderIf "setCurrentItem(int)" 0 -@endif -@execEnd -@setBootableCheckbox.execute() - - - scanDevices @@ -2243,6 +2192,66 @@ done + + + setlabel + + + + 540 + 40 + 32 + 32 + + + + + + + + @execBegin +function get_udisks_key() { + LANG=C udisks --show-info $1 | grep " $2:" | head -n1 | sed "s|[[:space:]]*$2:[[:space:]]*\(.*\)|\1|" +} +function get_udisks_key_last() { + LANG=C udisks --show-info $1 | grep " $2:" | tail -n1 | sed "s|[[:space:]]*$2:[[:space:]]*\(.*\)|\1|" +} +@if (@devicesbox.currentItem >= 0) + currdev=@String.section(@devicesbox.item(@devicesbox.currentItem)," ",0) + @showdevice.setText(@devicesbox.item(@devicesbox.currentItem)) + @dcop(@dcopid, KommanderIf, enableWidget(QString,bool), next, true) + @BackBox.setChecked(true) + + # + # set MBR combo box + # + dcop @dcopid KommanderIf "clear(QString)" mbrbox + devices=`udisks --enumerate-device-files | grep -v /dev/disk` + dcop @dcopid KommanderIf "addListItem(QString,QString,int)" mbrbox "$currdev (@i18n("System partition"))" 0 + + for device in $devices; do + native_path=`get_udisks_key $device native-path` + if [ -e $native_path/partition ]; then + partition_label=`get_udisks_key_last $device label` + if [ "${partition_label:0:3}" = "EFI" ]; then + dcop @dcopid KommanderIf "addListItem(QString,QString,int)" mbrbox "${device:5:5} (@i18n("EFI system partition"))" 0 + fi + else + is_system_internal=`get_udisks_key $device "system internal"` + partscheme=`get_udisks_key $device scheme` + if [ "$is_system_internal" == "1" -o "@removablebox.checked" == "1" ]; then + [ "$partscheme" == "mbr" ] && \ + dcop @dcopid KommanderIf "addListItem(QString,QString,int)" mbrbox "${device:5:5} (master boot record)" 0 + fi + fi + done + dcop @dcopid KommanderIf "setCurrentItem(int)" 0 +@endif +@execEnd +@setBootableCheckbox.execute() + + + @@ -2644,45 +2653,6 @@ done AlignCenter - - - setlabel_2 - - - - 550 - 50 - 32 - 32 - - - - - - - - @execBegin -@format_home_box.setEnabled(false) -@if (@devicesbox_2.currentItem >= 0) - currdev=@String.section(@devicesbox_2.item(@devicesbox_2.currentItem)," ",0) - if [ "$currdev" != "none" -a "$currdev" != "nessuna" ]; then - dcop @dcopid KommanderIf "setText(QString,QString)" showdevice_2 "@devicesbox_2.item(@devicesbox_2.currentItem)" - dcop @dcopid KommanderIf "setEnabled(QString,bool)" format_home_box true - dcop @dcopid KommanderIf "setEnabled(QString,bool)" formathome_group @format_home_box.checked() - else - dcop @dcopid KommanderIf "setText(QString,QString)" showdevice_2 "" - dcop @dcopid KommanderIf "setEnabled(QString,bool)" format_home_box false - dcop @dcopid KommanderIf "setEnabled(QString,bool)" formathome_group false - fi - @dcop(@dcopid, KommanderIf, enableWidget(QString,bool), next, true) - @BackBox.setChecked(true) - dcop @dcopid KommanderIf "setCurrentItem(int)" 0 -@endif -@execEnd -@setBootableCheckbox.execute() - - - scanDevices_2 @@ -2750,6 +2720,45 @@ done + + + setlabel_2 + + + + 550 + 50 + 32 + 32 + + + + + + + + @execBegin +@format_home_box.setEnabled(false) +@if (@devicesbox_2.currentItem >= 0) + currdev=@String.section(@devicesbox_2.item(@devicesbox_2.currentItem)," ",0) + if [ "$currdev" != "none" -a "$currdev" != "nessuna" ]; then + dcop @dcopid KommanderIf "setText(QString,QString)" showdevice_2 "@devicesbox_2.item(@devicesbox_2.currentItem)" + dcop @dcopid KommanderIf "setEnabled(QString,bool)" format_home_box true + dcop @dcopid KommanderIf "setEnabled(QString,bool)" formathome_group @format_home_box.checked() + else + dcop @dcopid KommanderIf "setText(QString,QString)" showdevice_2 "" + dcop @dcopid KommanderIf "setEnabled(QString,bool)" format_home_box false + dcop @dcopid KommanderIf "setEnabled(QString,bool)" formathome_group false + fi + @dcop(@dcopid, KommanderIf, enableWidget(QString,bool), next, true) + @BackBox.setChecked(true) + dcop @dcopid KommanderIf "setCurrentItem(int)" 0 +@endif +@execEnd +@setBootableCheckbox.execute() + + + @@ -2942,9 +2951,10 @@ done @execBegin +mbrstring=@String.section(@mbrbox.item(@mbrbox.currentItem)," ",1) mbrdevice=@String.section(@mbrbox.item(@mbrbox.currentItem)," ",0) mbrpart=${mbrdevice:3:2} -if [ "$mbrpart" ]; then +if [ "$mbrpart" -a "${mbrstring/EFI}" = "${mbrstring}" ]; then if [ $mbrpart -le 4 ]; then dcop @dcopid KommanderIf setEnabled bootableBox true else @@ -3192,22 +3202,20 @@ _EOF @dcop(@dcopid, KommanderIf, enableWidget(QString,bool), back,false) installdevice=@String.section(@devicesbox.item(@devicesbox.currentItem)," ",0) -mbrdevice=@String.section(@mbrbox.item(@mbrbox.currentItem)," ",0) - +mbrstring="@mbrbox.item(@mbrbox.currentItem)" +if [ "${mbrstring/EFI}" != "${mbrstring}" ]; then + efidevice=/dev/@String.section(@mbrbox.item(@mbrbox.currentItem)," ",0) +else + mbrdevice=/dev/@String.section(@mbrbox.item(@mbrbox.currentItem)," ",0) +fi installhomedevice=@String.section(@devicesbox_2.item(@devicesbox_2.currentItem)," ",0) [ "$installhomedevice" = "none" ] && installhomedevice= -IFS=$'\n' -CHAINLOAD_SELECTED=(`dcop @dcopid KommanderIf selection chainloadbox`) -for i in ${CHAINLOAD_SELECTED[*]}; do - chainloaddevices="/dev/${i:0:4} $chainloaddevices" -done -IFS=$' \t\n' - cat >>$conffile << _EOF INSTALL_DEVICE='/dev/$installdevice' INSTALL_DRIVER='@driverlabel.text' -INSTALL_BOOTLOADER_DEVICE='/dev/$mbrdevice' +INSTALL_BOOTLOADER_DEVICE='$mbrdevice' +INSTALL_BOOTLOADER_DEVICE_EFI='$efidevice' INSTALL_BOOTLOADER_DEVICE_SETBOOTABLE=@bootableBox.checked INSTALL_BOOTLOADER_CHAINLOAD=($chainloaddevices) INSTALL_FSTYPE='@fstypebox.item(@fstypebox.currentItem)' diff --git a/installer/installer.sh b/installer/installer.sh index 90321de..1fadb97 100755 --- a/installer/installer.sh +++ b/installer/installer.sh @@ -1,5 +1,5 @@ # openmamba installation script -# Copyright (c) 2007-2011 by Silvan Calarco +# Copyright (c) 2007-2013 by Silvan Calarco # # For the devfs2gdev() function: # Copyright (c) 2006 by Davide Madrisan @@ -436,16 +436,7 @@ chroot $MOUNTPOINT \ } # --fstab=/etc/fstab || -if [ "$INSTALL_BOOTLOADER_DEVICE" ]; then - dcop_write $"Installing bootloader on $INSTALL_BOOTLOADER_DEVICE..." 85 - INSTALL_BOOTLOADER_DEVICE_BYID=$INSTALL_BOOTLOADER_DEVICE - for f in `ls /dev/disk/by-id/*`; do - if [ "$INSTALL_BOOTLOADER_DEVICE" = "`readlink -f $f`" ]; then - INSTALL_BOOTLOADER_DEVICE_BYID=$f - break - fi - done - +if [ "$INSTALL_BOOTLOADER_DEVICE" -o "$INSTALL_BOOTLOADER_DEVICE_EFI" ]; then CMDLINE=`cat /proc/cmdline` echo $"Current kernel command line is '$CMDLINE'" NOMODESET_ADD=`echo $CMDLINE | grep "nomodeset" | sed "s|.*\(nomodeset\).*|\1|"` @@ -456,6 +447,20 @@ if [ "$INSTALL_BOOTLOADER_DEVICE" ]; then if [ "$GRUB_CMDLINE_ADD" ]; then sed -i "s|GRUB_CMDLINE_LINUX=\"\(.*\)\"|GRUB_CMDLINE_LINUX=\"\1 $GRUB_CMDLINE_ADD\"|" $MOUNTPOINT/etc/default/grub fi +fi + +if [ "$INSTALL_BOOTLOADER_DEVICE" ]; then + # + # MBR/BOOT SECTOR + # + dcop_write $"Installing bootloader on $INSTALL_BOOTLOADER_DEVICE..." 85 + INSTALL_BOOTLOADER_DEVICE_BYID=$INSTALL_BOOTLOADER_DEVICE + for f in `ls /dev/disk/by-id/*`; do + if [ "$INSTALL_BOOTLOADER_DEVICE" = "`readlink -f $f`" ]; then + INSTALL_BOOTLOADER_DEVICE_BYID=$f + break + fi + done echo "GRUB_INSTALL_DEVICE=$INSTALL_BOOTLOADER_DEVICE_BYID" >> $MOUNTPOINT/etc/sysconfig/grub if [ "$INSTALL_BOOTLOADER_DEVICE_INTERNAL" != "1" ]; then @@ -471,25 +476,6 @@ if [ "$INSTALL_BOOTLOADER_DEVICE" ]; then grub-install $INSTALL_BOOTLOADER_DEVICE --root-directory=$MOUNTPOINT --target=i386-pc --recheck --no-floppy --force fi -# DEV_NAME_ORIG=(${DEV_NAME_ORIG[*]} $GRUB_DEV) -# DEV_NAME_DEST=(${DEV_NAME_DEST[*]} $NEW_GRUB_DEV) - -# # create a couple of conversion vectors to convert/dev/sd* devices names -# # into how they will appear on the installed system -# unset CURR_DRIVER LOAD_DRIVER_LIST -# CURR_SD_LETTER=0 -# while read line; do -# GRUB_DEV=`echo ${line/*[[:space:]]/}` -# if [ "${GRUB_DEV:0:7}" = "/dev/sd" ]; then -# NEW_GRUB_DEV=/dev/sd${LETTERS[CURR_SD_LETTER]} -# let CURR_SD_LETTER+=1 -# else -# NEW_GRUB_DEV=$GRUB_DEV -# fi -# DEV_NAME_ORIG=(${DEV_NAME_ORIG[*]} $GRUB_DEV) -# DEV_NAME_DEST=(${DEV_NAME_DEST[*]} $NEW_GRUB_DEV) -# done < /boot/grub/device.map - if [ "${INSTALL_BOOTLOADER_DEVICE:8:2}" = "" ]; then # MBR install: set /boot partition as bootable as required by grub2 # CHECK: this does not work when install device is an extended partition, but in this case @@ -505,54 +491,29 @@ if [ "$INSTALL_BOOTLOADER_DEVICE" ]; then echo $"Warning: there was an error setting bootloader partition as bootable." >&2 fi - [ "$INSTALL_BOOTLOADER_CHAINLOAD" ] && { - # configure boot chainloader for e.g. windows - GRUB_OTHER_TITLES=() - GRUB_OTHER_DEVICES=() - for i in ${INSTALL_BOOTLOADER_CHAINLOAD[*]}; do - # FIXME: missing conversion from device to grub (hdx,y) form - unset ID_FS_UUID ID_FS_TYPE ID_FS_LABEL - eval `blkid $i -o udev` - if [ "$ID_FS_UUID" ]; then - if [ "$ID_FS_TYPE" = "ntfs" ]; then - [ "$ID_FS_LABEL" ] && - ID_FS_LABEL="Windows ($ID_FS_LABEL)" || ID_FS_LABEL="Windows" - elif [ "${ID_FS_TYPE:0:3}" = "fat" ]; then - [ "$ID_FS_LABEL" ] && - ID_FS_LABEL="Win/DOS ($ID_FS_LABEL)" || ID_FS_LABEL="Windows/DOS" - else - [ "$ID_FS_LABEL" ] && - ID_FS_LABEL="Other OS ($ID_FS_LABEL)" || ID_FS_LABEL="Other OS" - fi - [ "$ID_FS_LABEL" ] || ID_FS_LABEL="Unknown" - GRUB_OTHER_DEVICES=(${GRUB_OTHER_DEVICES[*]} /dev/disk/by-uuid/$ID_FS_UUID) - GRUB_OTHER_TITLES=(${GRUB_OTHER_TITLES[*]} "\"$ID_FS_LABEL\"") - else - GRUB_OTHER_DEV=$i - for o in `seq 1 ${#DEV_NAME_ORIG[*]}`; do - [ "${DEV_NAME_ORIG[o-1]}" = "${i:5:3}" ] && { - GRUB_OTHER_DEV=${DEV_NAME_DEST[o-1]}${i:8:2} - break - } - done -# echo $"Renaming device "${DEV_NAME_ORIG[o-1]}$" to "${DEV_NAME_DEST[o-1]} -# sed -i "s|/dev/${DEV_NAME_ORIG[o-1]:5:3}|/dev/${DEV_NAME_DEST[o-1]:5:3}|" \ -# $MOUNTPOINT/boot/grub/devices.map \ -# $MOUNTPOINT/etc/sysconfig/grub -# CURR_ROOT_LETTER=0 -# sed -i "s|root=/dev/${INSTALL_DEVICE:5:5}|root=/dev/${DEV_NAME_DEST[o-1]:5:3}|" \ -# $MOUNTPOINT/boot/grub/grub.cfg -# done - GRUB_OTHER_DEVICES=(${GRUB_OTHER_DEVICES[*]} $GRUB_OTHER_DEV) - GRUB_OTHER_TITLES=(${GRUB_OTHER_TITLES[*]} "\"Windows on $GRUB_OTHER_DEV\"") - fi - done - cat >> $MOUNTPOINT/etc/sysconfig/grub << _EOF -GRUB_OTHER_DEVICES=(${GRUB_OTHER_DEVICES[*]}) -GRUB_OTHER_TITLES=(${GRUB_OTHER_TITLES[*]}) -_EOF - } +elif [ "$INSTALL_BOOTLOADER_DEVICE_EFI" ]; then + # + # EFI + # + dcop_write $"Installing bootloader on ""$INSTALL_BOOTLOADER_DEVICE_EFI (EFI)..." 85 + INSTALL_BOOTLOADER_DEVICE_EFI_BYID=$INSTALL_BOOTLOADER_DEVICE_EFI + for f in `ls /dev/disk/by-id/*`; do + if [ "$INSTALL_BOOTLOADER_DEVICE_EFI" = "`readlink -f $f`" ]; then + INSTALL_BOOTLOADER_DEVICE_EFI_BYID=$f + break + fi + done + echo "GRUB_INSTALL_DEVICE_EFI=$INSTALL_BOOTLOADER_DEVICE_EFI_BYID" >> $MOUNTPOINT/etc/sysconfig/grub + echo $"Installing grub bootloader on ""$INSTALL_BOOTLOADER_DEVICE_EFI (EFI)" + [ -e $MOUNTPOINT/boot/efi ] || mkdir -p $MOUNTPOINT/boot/efi + mount $INSTALL_BOOTLOADER_DEVICE_EFI $MOUNTPOINT/boot/efi + grub-install --root-directory=$MOUNTPOINT --efi-directory=$MOUNTPOINT/boot/efi --target=x86_64-efi \ + --bootloader-id="openmamba Boot Manager" --recheck --no-floppy + umount $MOUNTPOINT/boot/efi +fi + +if [ "$INSTALL_BOOTLOADER_DEVICE" -o "$INSTALL_BOOTLOADER_DEVICE_EFI" ]; then # mount all disks and dbus for Grub other linuxes detection to work (30_other_linux) mount -o bind /mnt $MOUNTPOINT/mnt mount -o bind /var/run/dbus $MOUNTPOINT/var/run/dbus