THIẾT LẬP GRUB CHỈ HIỆN MENU KHI BẤM PHÍM SHIFT

Chào các bạn hôm nay mình sẽ hướng dẫn các bạn thiết lập grub.  nếu bạn cài nhiều hệ điều hành trong  1 máy mà muốn bỏ qua màn hình grub và chỉ hiện menu grub khi nhấn phím shift ta làm như sau:


Đầu tiên chúng ta sẽ chỉnh sửa file /etc/grub.d/30_os-prober

Lưu ý: các bạn nhớ backup trước khi chỉnh sửa nễu lỗi chúng ta còn có thể khôi phục lại được bạn có thể chạy lệnh:

$ sudo cp /etc/grub.d/30_os-prober /etc/grub.d/30_os-prober.bak

Sau khi đã backup xong chúng sẽ chỉnh sửa file /etc/grub.d/30_os-prober:

$ sudo nano /etc/grub.d/30_os-prober


Đây là code gốc:

Code:


#! /bin/sh

set -e


# 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 <http://www.gnu.org/licenses/>.



prefix="/usr"

exec_prefix="${prefix}"

datarootdir="${prefix}/share"



. "${datarootdir}/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 <<EOF

if [ "x\${timeout}" != "x-1" ]; then

  if keystatus; then

    if keystatus --shift; then

      set timeout=-1

    else

      set timeout=0

    fi

  else

    if sleep$verbose --interruptible 3 ; then

      set timeout=0

    fi

  fi

fi

EOF

      else

    cat << EOF

if [ "x\${timeout}" != "x-1" ]; then

  if sleep$verbose --interruptible ${GRUB_HIDDEN_TIMEOUT} ; then

    set timeout=0

  fi

fi

EOF

      fi

    fi

  fi

}



adjust_timeout () { 

  if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then

    cat <<EOF

if cmostest $GRUB_BUTTON_CMOS_ADDRESS ; then

EOF

    make_timeout "${GRUB_HIDDEN_TIMEOUT_BUTTON}" "${GRUB_TIMEOUT_BUTTON}"

    echo else

    make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}"

    echo fi

  else

    make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}"

  fi

}



if [ "x${GRUB_DISABLE_OS_PROBER}" = "xtrue" ]; then

  adjust_timeout

  exit 0

fi



if [ -z "`which os-prober 2> /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



OSPROBED="`os-prober | tr ' ' '^' | paste -s -d ' '`"

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



      found_other_os=1

      cat << EOF

menuentry "${LONGNAME} (on ${DEVICE})" --class windows --class os {

EOF

      save_default_entry | sed -e "s/^/\t/"

      prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"



      case ${LONGNAME} in

    Windows\ Vista*|Windows\ 7*|Windows\ Server\ 2008*)

    ;;

    *)

      cat << EOF

    drivemap -s (hd0) \${root}

EOF

    ;;

      esac



      cat <<EOF

    chainloader +1

}

EOF

    ;;

    linux)

      LINUXPROBED="`linux-boot-prober ${DEVICE} 2> /dev/null | tr ' ' '^' | paste -s -d ' '`"

      prepare_boot_cache=



      for LINUX in ${LINUXPROBED} ; do

        LROOT="`echo ${LINUX} | cut -d ':' -f 1`"

        LBOOT="`echo ${LINUX} | cut -d ':' -f 2`"

        LLABEL="`echo ${LINUX} | cut -d ':' -f 3 | tr '^' ' '`"

        LKERNEL="`echo ${LINUX} | cut -d ':' -f 4`"

        LINITRD="`echo ${LINUX} | cut -d ':' -f 5`"

        LPARAMS="`echo ${LINUX} | cut -d ':' -f 6- | tr '^' ' '`"



        if [ -z "${LLABEL}" ] ; then

          LLABEL="${LONGNAME}"

        fi



    if [ "${LROOT}" != "${LBOOT}" ]; then

      LKERNEL="${LKERNEL#/boot}"

      LINITRD="${LINITRD#/boot}"

    fi



    if [ -z "${prepare_boot_cache}" ]; then

      prepare_boot_cache="$(prepare_grub_to_access_device ${LBOOT} | sed -e "s/^/\t/")"

      [ "${prepare_boot_cache}" ] || continue

    fi

    found_other_os=1

        cat << EOF

menuentry "${LLABEL} (on ${DEVICE})" --class gnu-linux --class gnu --class os {

EOF

    save_default_entry | sed -e "s/^/\t/"

    printf '%s\n' "${prepare_boot_cache}"

    cat <<  EOF

    linux ${LKERNEL} ${LPARAMS}

EOF

        if [ -n "${LINITRD}" ] ; then

          cat << EOF

    initrd ${LINITRD}

EOF

        fi

        cat << EOF

}

EOF

      done

    ;;

    macosx)

      OSXUUID="`grub-probe --target=fs_uuid --device ${DEVICE} 2> /dev/null`"

      osx_entry xnu_kernel 32

      osx_entry xnu_kernel64 64

    ;;

    hurd)

      found_other_os=1

      cat << EOF

menuentry "${LONGNAME} (on ${DEVICE})" --class hurd --class gnu --class os {

EOF

      save_default_entry | sed -e "s/^/\t/"

      prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"

      grub_device="`${grub_probe} --device ${DEVICE} --target=drive`"

      mach_device="`echo "${grub_device}" | sed -e 's/(\(hd.*\),msdos\(.*\))/\1s\2/'`"

      grub_fs="`${grub_probe} --device ${DEVICE} --target=fs`"

      case "${grub_fs}" in

    *fs)    hurd_fs="${grub_fs}" ;;

    *)    hurd_fs="${grub_fs}fs" ;;

      esac

      cat << EOF

    multiboot /boot/gnumach.gz root=device:${mach_device}

    module /hurd/${hurd_fs}.static ${hurd_fs} --readonly \\

            --multiboot-command-line='\${kernel-command-line}' \\

            --host-priv-port='\${host-port}' \\

            --device-master-port='\${device-port}' \\

            --exec-server-task='\${exec-task}' -T typed '\${root}' \\

            '\$(task-create)' '\$(task-resume)'

    module /lib/ld.so.1 exec /hurd/exec '\$(exec-task=task-create)'

}

EOF

    ;;

    *)

      echo "  ${LONGNAME} is not yet supported by grub-mkconfig." >&2

    ;;

  esac

done



adjust_timeout


Sau đó bạn sẽ sửa đoạn mình in đậm thành:


adjust_timeout () {

        cat <<EOF

        if keystatus --shift; then

          set timeout=-1

        else

          set timeout=0

        fi

EOF

}


Sau đó bạn lưu lại với nano:

CTRL+O để lưu
CTRL+X để thoát

Bây giờ bạn cập nhật lại grub là xong:

$ sudo update-grub


Ồ thế là xong, bây giờ bạn thưởng thức thành quả thôi:

# sudo reboot

Kết quả: không có timeout, và khi bạn nhấn shift menu grub sẽ được tải.

Chúc bạn thành công!


Reactions