Mageia Bugzilla – Attachment 4137 Details for
Bug 10503
Grub2 doesn't get installed & Grub is not adding other Linux distros correctly.
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
New Account
|
Forgot Password
mk-grub2-rescue script
mk-grub2-rescue (text/plain), 8.37 KB, created by
Barry Jackson
on 2013-06-13 12:39:34 CEST
(
hide
)
Description:
mk-grub2-rescue script
Filename:
MIME Type:
Creator:
Barry Jackson
Created:
2013-06-13 12:39:34 CEST
Size:
8.37 KB
patch
obsolete
>#!/bin/bash ># mk-grub2-rescue >########################################################### ># Author - Barry Jackson (barjac) ># Latest version is available here: ># http://mtf.no-ip.co.uk/pub/linux/barjac/soft/mk-grub2-rescue >########################################################### ># Description: ># This script creates a bootable Mageia rescue iso using grub2, ># and offers to write it to CD or USB. ># All systems on the machine should be bootable from the CD and ># included in the menu. ># It does not matter whether grub, lilo, grub2 or whatever is ># the current bootloader. ># Grub2 is temporarily installed to create the files, but this ># makes no changes to your current bootloader installation. ># os-prober is used to probe for all systems, however if it is ># already disabled in /etc/default/grub then it will not be used. ># The theme may cause the menu to be too slow on old hardware, ># in this case you can opt to not use it. >########################################################### ># Use: ># Save this script as mk-grub2-rescue in your home folder. ># Make it executable: chmod +x mk-grub2-rescue ># Run it as root from your home directory. ># su ># ./mk-grub2-rescue >########################################################### >ver=0.7 ># Changelog ># 0.1 06/06/2013 First release ># 0.2 07/06/2013 Add options to burn CD or write USB. ># 0.3 09/06/2013 Don't add theme. Better usb detection ># 0.4 09/06/2013 Fix bug in udiskinfo(), improved listusbdrives() ># 0.5 10/06/2013 Use array in devlst() not tmp file ># 0.6 10/06/2013 Option to use theme or not ># 0.7 10/06/2013 Force umount of CDROM before write >########################################################### ># Configuration: ># None required :) >########################################################### ># License: ># Totally free with no warranty whatsoever. >########################################################### > ># Functions------------------------------------------------ > ># Talk to user >confirm() { >params=( "$1" "$2" "$3" "$4" "$5" ) >let rval=3 >while [ $rval -gt 2 ];do > echo -ne ${params[0]}" "${params[1]}" " > ans= > rval= > read ans > if [ -z "$ans" ] || [ ${#ans} -gt 1 ];then > rval=3 > else > case "$ans" in > [${params[2]}]*) > rval=0 > ;; > [${params[3]}]*) > rval=1 > ;; > [${params[4]}]*) > rval=2 > ;; > *) > rval=3 > ;; > esac > fi >done > return $rval >} > ># Get udisks info >udiskinfo() { >output=$(udisks --show-info $1|grep -m1 $2:|cut -d: -f2) >echo $output >} > ># List all usb devices >listusbdrives () { >for dev in $(udisks --enumerate |rev|cut -d/ -f1|rev|tr -d [:digit:]|sort -u ); do > int=$(udiskinfo /dev/$dev "interface") > [[ $int = "usb" ]] && echo "$dev" >done >} > ># Detect USB >detectusb() { >unset d >if confirm "Unplug the usb stick now. Continue?" "[y/n]" "Yy" "Nn";then >a=$(listusbdrives) > echo -n -e "Plug in the usb stick now.\nDetecting." > while [[ ${#d[@]} = 0 ]]; do >b=$(listusbdrives) > d=($( echo -n "${a[@]} ${b[@]}"|tr ' ' '\n'|sort|uniq -u )) > sleep 1 > echo -n "." > done > echo >fi >} > ># Detect CDROM >detectcd() { >echo -n -e "Insert blank CD now. (CTRL/c to abort)\nDetecting..." >cdlst=($(udisks --enumerate | grep "devices/sr"|rev|cut -d/ -f1|rev)) >[[ ${#cdlst} = 0 ]] && { echo "No CDROM found"; cdr=''; return 0; } >blank=0 >while [[ $blank != 1 ]]; do >echo -n "." >sleep 1 >for cdr in ${cdlst[@]}; do >blank=$(udiskinfo /dev/$cdr "blank") >[[ $blank = 1 ]] && { echo; break; } >done >done >} > ># Write USB >writeusb() { >detectusb >if [[ ${#d} != 0 ]]; then > if confirm "Found /dev/$d ( $(udiskinfo /dev/$d "model") ) All data on /dev/$d will be lost - OK ?" "[y/n]" "Yy" "Nn"; then > echo "Please wait - writing to USB..." > dd if=grub2-rescue.iso of=/dev/$d bs=1M > [[ $? = 0 ]] && echo "USB write complete - wait for USB light to stop flashing before removing device." > fi >fi >} > ># Burn CD >burncd() { >detectcd >if [[ ${#cdr} > 0 ]]; then ># Unmount CDROM in case a disk was swapped >umount $(df | grep /dev/$cdr | cut -d% -f2) > /dev/null 2>&1 > if confirm "Burn iso to CDROM /dev/$cdr - OK?" "[y/n]" "Yy" "Nn"; then > wodim speed=16 -eject dev=/dev/$cdr grub2-rescue.iso > [[ $? = 0 ]] && echo "Disk write complete" > fi >fi >} > ># Get numeric position of letter in alphabet (a=0, b=1) >alphapos() { >y=0 >for x in {a..z}; do > [[ $1 = $x ]] && { echo $y; break; } > y=$((y+1)) >done >} > ># Get array of root devices for all systems >devlst() { >devs=($(df -h /boot |(read; awk '{print $1;exit}'))" "$(os-prober|cut -d: -f1)) >} > ># Create 'hdx,msdosy' from /dev/sdxy >mkhdpart() { >hdalpha=$(echo $1 |tr -d [:digit:] | cut -dd -f3) >hdn=$(alphapos $hdalpha) >part=$(echo $1 | grep -P -o "[0-9]+") >hdstr="'"hd$hdn",msdos"$part"'" >} > ># Get uuid from /dev/sdxy >getuuid() { >uuidstr=$(udiskinfo $1 "uuid") >} > ># Modify grub.cfg and theme for rescue iso >configedit() { >if confirm "Do you want to use the Mageia theme for the rescue boot menu ?" "[y/n]" "Yy" "Nn"; then > sed -i 's/"Mageia Grub 2 Menu"/"Mageia Grub 2 Rescue"/' grub2-rescue/boot/grub/themes/maggy/theme.txt >else > rm grub2-rescue/boot/grub/themes -rf > sed -i "s/^set theme=.*//" grub2-rescue/boot/grub/grub.cfg > sed -i "s/^export theme//" grub2-rescue/boot/grub/grub.cfg >fi ># Add colours to text menu >cat>>grub2-rescue/boot/grub/grub.cfg<<EOF >set menu_color_normal=cyan/blue >set menu_color_highlight=yellow/blue >EOF ># Remove root assignment as disk id will change if using usb >sed -i "s/^set root=.*//" grub2-rescue/boot/grub/grub.cfg ># Change refs to 'grub2' as upstream uses 'grub' >sed -i 's/grub2/grub/g' grub2-rescue/boot/grub/grub.cfg ># Remove more indirect references to original root >sed -i '/x$feature_platform_search_hint/,+4d' grub2-rescue/boot/grub/grub.cfg ># Remove and replace memtest entry to remove root and add better title >sed -i '/93_memtest/,+8d' grub2-rescue/boot/grub/grub.cfg >cat >> grub2-rescue/boot/grub/grub.cfg <<EOF >menuentry 'Memtest' { > insmod part_msdos > insmod ext2 > echo 'Loading Memtest ...Loading memtest.bin ...' > linux16 /boot/memtest.bin >} >EOF ># Change all device references to cater for usb and replace with uuid search instead. >devlst >for dv in ${devs[@]}; do > getuuid $dv > mkhdpart $dv > sed -i "s/set root=$hdstr/search --no-floppy --fs-uuid --set=root $uuidstr/g" grub2-rescue/boot/grub/grub.cfg >done >} > ># Main script---------------------------------------------- > ># Check we are root >(((UID))) && { echo "Must be root to run $0"; exit 0; } > ># Say hello >clear >echo -e "Welcome to mk-grub2-rescue - version $ver\n" > ># Create or skip >if confirm "(C)reate iso or (S)kip to Burn/Write ?" "[c/s]" "Cc" "Ss"; then > ># Start with clean iso dir >[[ -d grub2-rescue ]] && rm -rf grub2-rescue > ># Create iso tree >mkdir grub2-rescue >mkdir grub2-rescue/boot >mkdir grub2-rescue/boot/grub > ># Check memtest86+ is installed or install it >rpm -q memtest86+ > /dev/null >[[ $? = 0 ]] || { urpmi --auto memtest86+; memtest=1; } > ># Add memtest to tree >cp /boot/memtest.bin grub2-rescue/boot/ > >rpm -q udisks > /dev/null >[[ $? = 0 ]] || { urpmi --auto udisks; udisks=1; } >rpm -q xorriso > /dev/null >[[ $? = 0 ]] || { urpmi --auto xorriso; xorriso=1; } > ># If grub2 or grub2-efi is installed >if [[ -e /boot/grub2/grub.cfg ]]; then > rpm -q os-prober > /dev/null > [[ $? = 0 ]] || { urpmi --auto os-prober; probe=1; } > rpm -q grub2-mageia-theme > /dev/null > [[ $? = 0 ]] || { urpmi --auto grub2-mageia-theme; theme=1; } > ># Copy grub2 files to tree > cp -r /boot/grub2/* grub2-rescue/boot/grub/ > configedit > ># Create iso > grub2-mkrescue -o grub2-rescue.iso grub2-rescue/ && ok=1 > ># Remove what was not previously installed > [[ $probe = 1 ]] && urpme --auto os-prober > [[ $theme = 1 ]] && urpme --auto grub2-mageia-theme > >else > ># Grub2 is not installed, so install it > urpmi --auto grub2 > ># Copy grub2 files to tree > cp -r /boot/grub2/* grub2-rescue/boot/grub/ > configedit > ># Create iso > grub2-mkrescue -o grub2-rescue.iso grub2-rescue/ && ok=1 > ># Uninstall grub2, os-prober, grub2-mageia-theme > urpme --auto grub2 os-prober grub2-mageia-theme > >fi > ># Clean up >[[ $xorriso = 1 ]] && urpme --auto xorriso >[[ $memtest = 1 ]] && urpme --auto memtest86+ >[[ $udisks = 1 ]] && urpme --auto udisks >rm -rf grub2-rescue > >[[ $ok = 1 ]] && echo -e "\n$(pwd)/grub2-rescue.iso was written sucessfully :)\n" >fi > ># Burn disk or write usb >while true; do > if confirm "\nWould you like to (B)urn a CD, (W)rite a USB stick or (Q)uit?" "[b/w/q]" "Bb" "Ww" "Qq"; then > burncd >elif [[ $? = 1 ]]; then > writeusb >else > exit 0 >fi >done
#!/bin/bash # mk-grub2-rescue ########################################################### # Author - Barry Jackson (barjac) # Latest version is available here: # http://mtf.no-ip.co.uk/pub/linux/barjac/soft/mk-grub2-rescue ########################################################### # Description: # This script creates a bootable Mageia rescue iso using grub2, # and offers to write it to CD or USB. # All systems on the machine should be bootable from the CD and # included in the menu. # It does not matter whether grub, lilo, grub2 or whatever is # the current bootloader. # Grub2 is temporarily installed to create the files, but this # makes no changes to your current bootloader installation. # os-prober is used to probe for all systems, however if it is # already disabled in /etc/default/grub then it will not be used. # The theme may cause the menu to be too slow on old hardware, # in this case you can opt to not use it. ########################################################### # Use: # Save this script as mk-grub2-rescue in your home folder. # Make it executable: chmod +x mk-grub2-rescue # Run it as root from your home directory. # su # ./mk-grub2-rescue ########################################################### ver=0.7 # Changelog # 0.1 06/06/2013 First release # 0.2 07/06/2013 Add options to burn CD or write USB. # 0.3 09/06/2013 Don't add theme. Better usb detection # 0.4 09/06/2013 Fix bug in udiskinfo(), improved listusbdrives() # 0.5 10/06/2013 Use array in devlst() not tmp file # 0.6 10/06/2013 Option to use theme or not # 0.7 10/06/2013 Force umount of CDROM before write ########################################################### # Configuration: # None required :) ########################################################### # License: # Totally free with no warranty whatsoever. ########################################################### # Functions------------------------------------------------ # Talk to user confirm() { params=( "$1" "$2" "$3" "$4" "$5" ) let rval=3 while [ $rval -gt 2 ];do echo -ne ${params[0]}" "${params[1]}" " ans= rval= read ans if [ -z "$ans" ] || [ ${#ans} -gt 1 ];then rval=3 else case "$ans" in [${params[2]}]*) rval=0 ;; [${params[3]}]*) rval=1 ;; [${params[4]}]*) rval=2 ;; *) rval=3 ;; esac fi done return $rval } # Get udisks info udiskinfo() { output=$(udisks --show-info $1|grep -m1 $2:|cut -d: -f2) echo $output } # List all usb devices listusbdrives () { for dev in $(udisks --enumerate |rev|cut -d/ -f1|rev|tr -d [:digit:]|sort -u ); do int=$(udiskinfo /dev/$dev "interface") [[ $int = "usb" ]] && echo "$dev" done } # Detect USB detectusb() { unset d if confirm "Unplug the usb stick now. Continue?" "[y/n]" "Yy" "Nn";then a=$(listusbdrives) echo -n -e "Plug in the usb stick now.\nDetecting." while [[ ${#d[@]} = 0 ]]; do b=$(listusbdrives) d=($( echo -n "${a[@]} ${b[@]}"|tr ' ' '\n'|sort|uniq -u )) sleep 1 echo -n "." done echo fi } # Detect CDROM detectcd() { echo -n -e "Insert blank CD now. (CTRL/c to abort)\nDetecting..." cdlst=($(udisks --enumerate | grep "devices/sr"|rev|cut -d/ -f1|rev)) [[ ${#cdlst} = 0 ]] && { echo "No CDROM found"; cdr=''; return 0; } blank=0 while [[ $blank != 1 ]]; do echo -n "." sleep 1 for cdr in ${cdlst[@]}; do blank=$(udiskinfo /dev/$cdr "blank") [[ $blank = 1 ]] && { echo; break; } done done } # Write USB writeusb() { detectusb if [[ ${#d} != 0 ]]; then if confirm "Found /dev/$d ( $(udiskinfo /dev/$d "model") ) All data on /dev/$d will be lost - OK ?" "[y/n]" "Yy" "Nn"; then echo "Please wait - writing to USB..." dd if=grub2-rescue.iso of=/dev/$d bs=1M [[ $? = 0 ]] && echo "USB write complete - wait for USB light to stop flashing before removing device." fi fi } # Burn CD burncd() { detectcd if [[ ${#cdr} > 0 ]]; then # Unmount CDROM in case a disk was swapped umount $(df | grep /dev/$cdr | cut -d% -f2) > /dev/null 2>&1 if confirm "Burn iso to CDROM /dev/$cdr - OK?" "[y/n]" "Yy" "Nn"; then wodim speed=16 -eject dev=/dev/$cdr grub2-rescue.iso [[ $? = 0 ]] && echo "Disk write complete" fi fi } # Get numeric position of letter in alphabet (a=0, b=1) alphapos() { y=0 for x in {a..z}; do [[ $1 = $x ]] && { echo $y; break; } y=$((y+1)) done } # Get array of root devices for all systems devlst() { devs=($(df -h /boot |(read; awk '{print $1;exit}'))" "$(os-prober|cut -d: -f1)) } # Create 'hdx,msdosy' from /dev/sdxy mkhdpart() { hdalpha=$(echo $1 |tr -d [:digit:] | cut -dd -f3) hdn=$(alphapos $hdalpha) part=$(echo $1 | grep -P -o "[0-9]+") hdstr="'"hd$hdn",msdos"$part"'" } # Get uuid from /dev/sdxy getuuid() { uuidstr=$(udiskinfo $1 "uuid") } # Modify grub.cfg and theme for rescue iso configedit() { if confirm "Do you want to use the Mageia theme for the rescue boot menu ?" "[y/n]" "Yy" "Nn"; then sed -i 's/"Mageia Grub 2 Menu"/"Mageia Grub 2 Rescue"/' grub2-rescue/boot/grub/themes/maggy/theme.txt else rm grub2-rescue/boot/grub/themes -rf sed -i "s/^set theme=.*//" grub2-rescue/boot/grub/grub.cfg sed -i "s/^export theme//" grub2-rescue/boot/grub/grub.cfg fi # Add colours to text menu cat>>grub2-rescue/boot/grub/grub.cfg<<EOF set menu_color_normal=cyan/blue set menu_color_highlight=yellow/blue EOF # Remove root assignment as disk id will change if using usb sed -i "s/^set root=.*//" grub2-rescue/boot/grub/grub.cfg # Change refs to 'grub2' as upstream uses 'grub' sed -i 's/grub2/grub/g' grub2-rescue/boot/grub/grub.cfg # Remove more indirect references to original root sed -i '/x$feature_platform_search_hint/,+4d' grub2-rescue/boot/grub/grub.cfg # Remove and replace memtest entry to remove root and add better title sed -i '/93_memtest/,+8d' grub2-rescue/boot/grub/grub.cfg cat >> grub2-rescue/boot/grub/grub.cfg <<EOF menuentry 'Memtest' { insmod part_msdos insmod ext2 echo 'Loading Memtest ...Loading memtest.bin ...' linux16 /boot/memtest.bin } EOF # Change all device references to cater for usb and replace with uuid search instead. devlst for dv in ${devs[@]}; do getuuid $dv mkhdpart $dv sed -i "s/set root=$hdstr/search --no-floppy --fs-uuid --set=root $uuidstr/g" grub2-rescue/boot/grub/grub.cfg done } # Main script---------------------------------------------- # Check we are root (((UID))) && { echo "Must be root to run $0"; exit 0; } # Say hello clear echo -e "Welcome to mk-grub2-rescue - version $ver\n" # Create or skip if confirm "(C)reate iso or (S)kip to Burn/Write ?" "[c/s]" "Cc" "Ss"; then # Start with clean iso dir [[ -d grub2-rescue ]] && rm -rf grub2-rescue # Create iso tree mkdir grub2-rescue mkdir grub2-rescue/boot mkdir grub2-rescue/boot/grub # Check memtest86+ is installed or install it rpm -q memtest86+ > /dev/null [[ $? = 0 ]] || { urpmi --auto memtest86+; memtest=1; } # Add memtest to tree cp /boot/memtest.bin grub2-rescue/boot/ rpm -q udisks > /dev/null [[ $? = 0 ]] || { urpmi --auto udisks; udisks=1; } rpm -q xorriso > /dev/null [[ $? = 0 ]] || { urpmi --auto xorriso; xorriso=1; } # If grub2 or grub2-efi is installed if [[ -e /boot/grub2/grub.cfg ]]; then rpm -q os-prober > /dev/null [[ $? = 0 ]] || { urpmi --auto os-prober; probe=1; } rpm -q grub2-mageia-theme > /dev/null [[ $? = 0 ]] || { urpmi --auto grub2-mageia-theme; theme=1; } # Copy grub2 files to tree cp -r /boot/grub2/* grub2-rescue/boot/grub/ configedit # Create iso grub2-mkrescue -o grub2-rescue.iso grub2-rescue/ && ok=1 # Remove what was not previously installed [[ $probe = 1 ]] && urpme --auto os-prober [[ $theme = 1 ]] && urpme --auto grub2-mageia-theme else # Grub2 is not installed, so install it urpmi --auto grub2 # Copy grub2 files to tree cp -r /boot/grub2/* grub2-rescue/boot/grub/ configedit # Create iso grub2-mkrescue -o grub2-rescue.iso grub2-rescue/ && ok=1 # Uninstall grub2, os-prober, grub2-mageia-theme urpme --auto grub2 os-prober grub2-mageia-theme fi # Clean up [[ $xorriso = 1 ]] && urpme --auto xorriso [[ $memtest = 1 ]] && urpme --auto memtest86+ [[ $udisks = 1 ]] && urpme --auto udisks rm -rf grub2-rescue [[ $ok = 1 ]] && echo -e "\n$(pwd)/grub2-rescue.iso was written sucessfully :)\n" fi # Burn disk or write usb while true; do if confirm "\nWould you like to (B)urn a CD, (W)rite a USB stick or (Q)uit?" "[b/w/q]" "Bb" "Ww" "Qq"; then burncd elif [[ $? = 1 ]]; then writeusb else exit 0 fi done
View Attachment As Raw
Actions:
View
Attachments on
bug 10503
:
4137
|
4139