#!/bin/bash set -e #grubSyntax #version 1.1.0 #autoconfigurador de items de menu para grub/brg #basado en scripts del paquete de grub #Antonio Doblas Viso #Universidad de Málaga #@version 1.1.1 - En los parámetros del kernel se sustituye el UUID por el dispositivo. #@version 1.1.1 - Detecta cargador de Windows en directorio Part-xx-yy dentro de ESP (#802 #888) DISK= PART= if [ $# == 3 ]; then DISK=$1;PART=$2;KERNELPARAM=$3 fi if [ $# == 2 ]; then DISK=$1;PART=$2 fi if [ $# == 1 ]; then KERNELPARAM=$1 fi #Versión de scripts compatible con la versión 1.99 de grub-probe #Uso del grub-probe 1.99 según arquitectura 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/ 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 fi #Autoreconocimiento del ogLive en cache #fichero de reconocimeinto de grub #fichero de lsb-release en la cache (al final de este scripts se elimina esta entrada para que el browser no lo muestre if [ $(ls /opt/opengnsys/cache/boot/$oglivedir/ogvmlinuz 2>/dev/null) ]; then sed -i 's|/boot/\${oglivedir}/ogvmlinuz |/vmlinuz |i' /usr/lib/linux-boot-probes/mounted/90fallback sed -i 's|/vmlinuz |/vmlinuz /boot/\${oglivedir}/ogvmlinuz |1' /usr/lib/linux-boot-probes/mounted/90fallback mkdir -p /opt/opengnsys/cache/etc/ echo "DISTRIB_ID=Ubuntu" > /opt/opengnsys/cache/etc/lsb-release echo "DISTRIB_RELEASE= " >> /opt/opengnsys/cache/etc/lsb-release echo $oglivedir | awk -F- ' {print "DISTRIB_CODENAME="$2 }' >> /opt/opengnsys/cache/etc/lsb-release echo "DISTRIB_DESCRIPTION=OpenGnsys Live" >> /opt/opengnsys/cache/etc/lsb-release fi #ver linea 195 detección de los os en variable OSPROBED 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 # 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 } # grub-mkconfig helper script. # Copyright (C) 2006,2007,2008,2009 Free Software Foundation, Inc. # # GRUB is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GRUB is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GRUB. If not, see . prefix=/usr exec_prefix=${prefix} libdir=${exec_prefix}/lib . ${libdir}/grub/grub-mkconfig_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 fi case "$1" in esac # ADV OSPROBED if [ -n "${DISK}" ]; then #Si $DISK esta definido buscar en el disco y la particion parametro 1 y 2 OSSEARCH=$(ogDiskToDev $DISK $PART) OSPROBED="`os-prober | grep $OSSEARCH | tr ' ' '^' | paste -s -d ' '`" else #si no esta definido OSPROBED="`os-prober | tr ' ' '^' | paste -s -d ' '`" fi #DISK=${DISK:-"1"} #echo $OSSEARCH #echo "$OSPROBED" if [ -z "${OSPROBED}" ] ; then # empty os-prober output, nothing doing adjust_timeout exit 0 fi osx_entry() { found_other_os=1 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 } 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`" 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 menuentry "${LONGNAME} (on ${DEVICE})" --class $LABELCLASS --class windows { EOF 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/" case ${LONGNAME} in Windows\ Vista*|Windows\ 7*|Windows\ Server\ 2008*) ;; *) #ADV cat << EOF #ADV drivemap -s (hd0) \${root} #ADV EOF ;; esac cat <&2 ;; esac done adjust_timeout rm /opt/opengnsys/cache/etc/lsb-release &>/dev/null