Como você não destrutivamente verifica se o grub2 está instalado no setor de inicialização ou está sendo carregado em cadeia pelo grub1, sem reinicializar?

6

Estamos atualizando vários sistemas do Debian Lenny para o Squeeze e eu gostaria de garantir que eu não tenha perdido nenhuma instalação do grub2. Por padrão, Squeeze chain-boot-loads do grub1 e você tem que executar upgrade-from-grub-legacy para atualizar. Portanto, gostaria de poder verificar remotamente se o grub2 foi instalado no setor de inicialização de disco sem reinicializar e sem sobrescrever o setor de inicialização.

Existe algo mais fácil do que fazer um hexdump dos primeiros blocos do disco rígido e tentar identificar bytes específicos do grub2?

    
por chrishiestand 13.04.2011 / 06:39

1 resposta

4

Eu tropecei na resposta no pacote fonte grub2 debian. Acontece que ele exige um despejo do setor de inicialização - portanto, um script empacotado separadamente pode ser útil. Aqui está um script (apenas um wrapper em torno da função oficial) que irá dizer se o grub2 foi ou não instalado no setor de inicialização. Pode ser facilmente modificado para usos similares.

#!/bin/bash
set -e

if [ "$UID" -ne "0" ]; then
  echo Must be run as root
  exit 99
fi

scan_grub2()
{
  if ! dd if="$1" bs=512 count=1 2>/dev/null | grep -aq GRUB; then
    # No version of GRUB is installed.
    echo Grub could not be found
    return 1
  fi

  # The GRUB boot sector always starts with a JMP instruction.
  initial_jmp="$(dd if="$1" bs=2 count=1 2>/dev/null | od -Ax -tx1 | \
                 head -n1 | cut -d' ' -f2,3)"
  [ "$initial_jmp" ] || return 1
  initial_jmp_opcode="${initial_jmp%% *}"
  [ "$initial_jmp_opcode" = eb ] || return 1
  initial_jmp_operand="${initial_jmp#* }"
  case $initial_jmp_operand in
    47|4b|4c|63)
      # I believe this covers all versions of GRUB 2 up to the package
      # version where we gained a more explicit mechanism.  GRUB Legacy
      # always had 48 here.
      return 0
    ;;
  esac

  return 1
}

if scan_grub2 "/dev/sda"; then
  echo Found grub 2
else
  echo Did not find grub 2
  #Uncomment the next line to upgrade
  #upgrade-from-grub-legacy
fi
    
por 15.04.2011 / 05:50