Мы обновляем несколько систем с Debian Lenny до Squeeze, и я хотел бы убедиться, что я не пропустил ни одной установки grub2. По умолчанию Squeeze chain-boot-loaded от grub1, и вам нужно запустить upgrade-from-grub-legacy
усовершенствовать. Поэтому я хотел бы иметь возможность удаленно проверить, установлен ли grub2 в загрузочный сектор диска без перезагрузки и без перезаписи загрузочного сектора.
Есть ли что-нибудь проще, чем сделать шестнадцатеричный дамп первых блоков жесткого диска и попытаться идентифицировать байты, специфичные для grub2?
Я наткнулся на ответ в пакете исходного кода debian grub2. Оказывается, для этого требуется дамп загрузочного сектора, поэтому может пригодиться отдельно упакованный скрипт. Вот сценарий (просто оболочка для официальной функции), который сообщит вам, установлен ли grub2 в загрузочный сектор. Его можно легко модифицировать для аналогичных целей.
#!/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