From aed3308c1b5a60546f04de91561c816cc8ec99f4 Mon Sep 17 00:00:00 2001 From: "Juan Manuel Bardallo juanmanuel.bardallo@sic.uhu.es" Date: Fri, 8 Nov 2019 09:01:09 +0100 Subject: Modificación para tratar discos nvme, la sintaxis generada por grub_probe no es la adecuada para arrancar este tipo de discos, se detecta y renombra la entrada del disco correspondiente con la nomenclatura: hd0,0 para discos nvme con tabla MSDOS y hd0,gpt1 para discos nvme con tabla GPT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/shared/scripts/grubSyntax | 512 ++++++++++++++++++++------------------- 1 file changed, 265 insertions(+), 247 deletions(-) (limited to 'client') diff --git a/client/shared/scripts/grubSyntax b/client/shared/scripts/grubSyntax index aa1adb2e..8997c97b 100755 --- a/client/shared/scripts/grubSyntax +++ b/client/shared/scripts/grubSyntax @@ -34,11 +34,11 @@ grub_probe=${grub_probe:-$OGBIN/grub-probe1.99_$(arch)} #librerias del osProber para kernel antiguos: detecta e identifica sistema operativos. if grub-install --version | grep 1.99 ; then - cp -r /opt/opengnsys/lib/os-probes/* /usr/lib/os-probes/ + cp -r /opt/opengnsys/lib/os-probes/* /usr/lib/os-probes/ else - # Librería os-probe para cargador de microsoft en dir part-x-y (uefi) - OSPROBE_MS_PART="/opt/opengnsys/lib/os-probes/mounted/efi/31part-x-y" - [ -f $OSPROBE_MS_PART ] && cp $OSPROBE_MS_PART /usr/lib/os-probes/mounted/efi + # Librería os-probe para cargador de microsoft en dir part-x-y (uefi) + OSPROBE_MS_PART="/opt/opengnsys/lib/os-probes/mounted/efi/31part-x-y" + [ -f $OSPROBE_MS_PART ] && cp $OSPROBE_MS_PART /usr/lib/os-probes/mounted/efi fi @@ -60,62 +60,80 @@ fi OG_prepare_grub_to_access_device () { - device="$1" - loop_file= - case ${device} in - /dev/loop/*|/dev/loop[0-9]) - grub_loop_device="${device#/dev/}" - loop_file=`losetup "${device}" | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"` - case $loop_file in - /dev/*) ;; - *) - loop_device="${device}" - device=`"${grub_probe}" --target=device "${loop_file}"` || return 0 - ;; - esac - ;; - esac - if dmsetup status $device 2>/dev/null | grep -q 'crypt[[:space:]]$'; then - grub_warn \ - "$device is a crypto device, which GRUB cannot read directly. Some" \ - "necessary modules may be missing from /boot/grub/grub.cfg. You may" \ - "need to list them in GRUB_PRELOAD_MODULES in /etc/default/grub. See" \ - "http://bugs.debian.org/542165 for details." - return 0 - fi - # Abstraction modules aren't auto-loaded. - abstraction="`"${grub_probe}" --device "${device}" --target=abstraction`" - for module in ${abstraction} ; do - echo "insmod ${module}" - done - partmap="`"${grub_probe}" --device "${device}" --target=partmap`" - for module in ${partmap} ; do - case "${module}" in - netbsd | openbsd) - echo "insmod part_bsd";; - *) - echo "insmod part_${module}";; - esac - done - fs="`"${grub_probe}" --device "${device}" --target=fs`" - for module in ${fs} ; do - echo "insmod ${module}" - done - # If there's a filesystem UUID that GRUB is capable of identifying, use it; - # otherwise set root as per value in device.map. - #OG modificacion - echo "set root='`"${grub_probe}" --device "${device}" --target=drive`'" - #if fs_uuid="`"${grub_probe}" --device "${device}" --target=fs_uuid 2> /dev/null`" ; then - # echo "search --no-floppy --fs-uuid --set=root ${fs_uuid}" - #fi - - if [ "x${loop_file}" != x ]; then - loop_mountpoint="$(awk '"'${loop_file}'" ~ "^"$2 && $2 != "/" { print $2 }' /proc/mounts | tail -n1)" - if [ "x${loop_mountpoint}" != x ]; then - echo "loopback ${grub_loop_device} ${loop_file#$loop_mountpoint}" - echo "set root=(${grub_loop_device})" - fi - fi + device="$1" + loop_file= + case ${device} in + /dev/loop/*|/dev/loop[0-9]) + grub_loop_device="${device#/dev/}" + loop_file=`losetup "${device}" | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"` + case $loop_file in + /dev/*) ;; + *) + loop_device="${device}" + device=`"${grub_probe}" --target=device "${loop_file}"` || return 0 + ;; + esac + ;; + esac + if dmsetup status $device 2>/dev/null | grep -q 'crypt[[:space:]]$'; then + grub_warn \ + "$device is a crypto device, which GRUB cannot read directly. Some" \ + "necessary modules may be missing from /boot/grub/grub.cfg. You may" \ + "need to list them in GRUB_PRELOAD_MODULES in /etc/default/grub. See" \ + "http://bugs.debian.org/542165 for details." + return 0 + fi + # Abstraction modules aren't auto-loaded. + abstraction="`"${grub_probe}" --device "${device}" --target=abstraction`" + for module in ${abstraction} ; do + echo "insmod ${module}" + done + partmap="`"${grub_probe}" --device "${device}" --target=partmap`" + for module in ${partmap} ; do + case "${module}" in + netbsd | openbsd) + echo "insmod part_bsd";; + *) + echo "insmod part_${module}";; + esac + done + fs="`"${grub_probe}" --device "${device}" --target=fs`" + for module in ${fs} ; do + echo "insmod ${module}" + done + # If there's a filesystem UUID that GRUB is capable of identifying, use it; + # otherwise set root as per value in device.map. + #OG modificacion + # PARCHE UHU ...SI el disco es nvme se cambia su nomenclatura, ya que grub_probe no funciona bien + if [[ $DEVICE == *"nvme"* ]]; then + #DEVICE=`echo $DEVICE | sed -e "s/\/dev\/nvme/hd/g" | sed -e "s/n.*p/,gpt/g"` + #TODO Detectar si es GPT o no... + read -r D P <<< `ogDevToDisk $DEVICE` + if [ "`ogGetPartitionTableType $D`" == "GPT" ]; then + # Si es gpt se sustituye por "hd(X-1),gptY" + #device=`echo $device | sed -e "s/\/dev\/nvme/hd/g" | sed -e "s/n.*p/,gpt/g"` + nvmeDevice=`echo "hd"$(expr $D - 1)",gpt$P"` + + else + # Sino se sustituye por hd(X-1),(Y-1) + nvmeDevice=`echo "hd"$(expr $D - 1)","$(expr $P - 1)` + fi + echo "set root='$nvmeDevice'" + else + echo "set root='`"${grub_probe}" --device "${device}" --target=drive`'" + fi + + #if fs_uuid="`"${grub_probe}" --device "${device}" --target=fs_uuid 2> /dev/null`" ; then + # echo "search --no-floppy --fs-uuid --set=root ${fs_uuid}" + #fi + + if [ "x${loop_file}" != x ]; then + loop_mountpoint="$(awk '"'${loop_file}'" ~ "^"$2 && $2 != "/" { print $2 }' /proc/mounts | tail -n1)" + if [ "x${loop_mountpoint}" != x ]; then + echo "loopback ${grub_loop_device} ${loop_file#$loop_mountpoint}" + echo "set root=(${grub_loop_device})" + fi + fi } @@ -148,16 +166,16 @@ libdir=${exec_prefix}/lib found_other_os= make_timeout () { - if [ "x${found_other_os}" = "x" ] ; then - if [ "x${1}" != "x" ] ; then - if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xtrue" ] ; then - verbose= - else - verbose=" --verbose" - fi - - if [ "x${1}" = "x0" ] ; then - cat < /dev/null`" -o -z "`which linux-boot-prober 2> /dev/null`" ] ; then - # missing os-prober and/or linux-boot-prober - adjust_timeout - exit 0 + # missing os-prober and/or linux-boot-prober + adjust_timeout + exit 0 fi case "$1" in @@ -233,59 +251,59 @@ fi if [ -z "${OSPROBED}" ] ; then - # empty os-prober output, nothing doing - adjust_timeout - exit 0 + # empty os-prober output, nothing doing + adjust_timeout + exit 0 fi osx_entry() { found_other_os=1 - cat << EOF + cat << EOF menuentry "${LONGNAME} (${2}-bit) (on ${DEVICE})" --class osx --class darwin --class os { EOF - save_default_entry | sed -e "s/^/\t/" - prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/" - cat << EOF - load_video - set do_resume=0 - if [ /var/vm/sleepimage -nt10 / ]; then - if xnu_resume /var/vm/sleepimage; then - set do_resume=1 - fi - fi - if [ \$do_resume = 0 ]; then - xnu_uuid ${OSXUUID} uuid - if [ -f /Extra/DSDT.aml ]; then - acpi -e /Extra/DSDT.aml - fi - $1 /mach_kernel boot-uuid=\${uuid} rd=*uuid - if [ /System/Library/Extensions.mkext -nt /System/Library/Extensions ]; then - xnu_mkext /System/Library/Extensions.mkext - else - xnu_kextdir /System/Library/Extensions - fi - if [ -f /Extra/Extensions.mkext ]; then - xnu_mkext /Extra/Extensions.mkext - fi - if [ -d /Extra/Extensions ]; then - xnu_kextdir /Extra/Extensions - fi - if [ -f /Extra/devprop.bin ]; then - xnu_devprop_load /Extra/devprop.bin - fi - if [ -f /Extra/splash.jpg ]; then - insmod jpeg - xnu_splash /Extra/splash.jpg - fi - if [ -f /Extra/splash.png ]; then - insmod png - xnu_splash /Extra/splash.png - fi - if [ -f /Extra/splash.tga ]; then - insmod tga - xnu_splash /Extra/splash.tga - fi - fi +save_default_entry | sed -e "s/^/\t/" +prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/" +cat << EOF + load_video + set do_resume=0 + if [ /var/vm/sleepimage -nt10 / ]; then + if xnu_resume /var/vm/sleepimage; then + set do_resume=1 + fi + fi + if [ \$do_resume = 0 ]; then + xnu_uuid ${OSXUUID} uuid + if [ -f /Extra/DSDT.aml ]; then + acpi -e /Extra/DSDT.aml + fi + $1 /mach_kernel boot-uuid=\${uuid} rd=*uuid + if [ /System/Library/Extensions.mkext -nt /System/Library/Extensions ]; then + xnu_mkext /System/Library/Extensions.mkext + else + xnu_kextdir /System/Library/Extensions + fi + if [ -f /Extra/Extensions.mkext ]; then + xnu_mkext /Extra/Extensions.mkext + fi + if [ -d /Extra/Extensions ]; then + xnu_kextdir /Extra/Extensions + fi + if [ -f /Extra/devprop.bin ]; then + xnu_devprop_load /Extra/devprop.bin + fi + if [ -f /Extra/splash.jpg ]; then + insmod jpeg + xnu_splash /Extra/splash.jpg + fi + if [ -f /Extra/splash.png ]; then + insmod png + xnu_splash /Extra/splash.png + fi + if [ -f /Extra/splash.tga ]; then + insmod tga + xnu_splash /Extra/splash.tga + fi + fi } EOF } @@ -293,156 +311,156 @@ EOF wubi= for OS in ${OSPROBED} ; do - DEVICE="`echo ${OS} | cut -d ':' -f 1`" - LONGNAME="`echo ${OS} | cut -d ':' -f 2 | tr '^' ' '`" - LABEL="`echo ${OS} | cut -d ':' -f 3 | tr '^' ' '`" - BOOT="`echo ${OS} | cut -d ':' -f 4`" + DEVICE="`echo ${OS} | cut -d ':' -f 1`" + LONGNAME="`echo ${OS} | cut -d ':' -f 2 | tr '^' ' '`" + LABEL="`echo ${OS} | cut -d ':' -f 3 | tr '^' ' '`" + BOOT="`echo ${OS} | cut -d ':' -f 4`" - if [ -z "${LONGNAME}" ] ; then - LONGNAME="${LABEL}" - fi + if [ -z "${LONGNAME}" ] ; then + LONGNAME="${LABEL}" + fi - echo "Found ${LONGNAME} on ${DEVICE}" >&2 - - case ${BOOT} in - chain) - - case ${LONGNAME} in - Windows*) - if [ -z "$wubi" ]; then - if [ -x /usr/share/lupin-support/grub-mkimage ] && \ - /usr/share/lupin-support/grub-mkimage --test; then - wubi=yes - else - wubi=no - fi - fi - if [ "$wubi" = yes ]; then - echo "Skipping ${LONGNAME} on Wubi system" >&2 - continue - fi - ;; - esac - #adv - LABELCLASS=$(echo "${LONGNAME}" | awk '{print tolower($1$2);}') - - found_other_os=1 - cat << EOF + echo "Found ${LONGNAME} on ${DEVICE}" >&2 + + case ${BOOT} in + chain) + + case ${LONGNAME} in + Windows*) + if [ -z "$wubi" ]; then + if [ -x /usr/share/lupin-support/grub-mkimage ] && \ + /usr/share/lupin-support/grub-mkimage --test; then + wubi=yes + else + wubi=no + fi + fi + if [ "$wubi" = yes ]; then + echo "Skipping ${LONGNAME} on Wubi system" >&2 + continue + fi + ;; + esac + #adv + LABELCLASS=$(echo "${LONGNAME}" | awk '{print tolower($1$2);}') + + found_other_os=1 + cat << EOF menuentry "${LONGNAME} (on ${DEVICE})" --class $LABELCLASS --class windows { EOF - save_default_entry | sed -e "s/^/\t/" +save_default_entry | sed -e "s/^/\t/" #ADV prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/" - OG_prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/" +OG_prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/" - case ${LONGNAME} in +case ${LONGNAME} in Windows\ Vista*|Windows\ 7*|Windows\ Server\ 2008*) - ;; + ;; *) -#ADV cat << EOF -#ADV drivemap -s (hd0) \${root} -#ADV EOF - ;; - esac + #ADV cat << EOF + #ADV drivemap -s (hd0) \${root} + #ADV EOF + ;; +esac - cat <&2 - ;; + echo " ${LONGNAME} is not yet supported by grub-mkconfig." >&2 + ;; esac done -- cgit v1.2.3-18-g5258