我们将几个系统从Debian Lenny升级到Squeeze,我想确保我没有错过任何grub2安装。 默认情况下,从grub1挤压chain-boot-loading,你必须运行upgrade-from-grub-legacy升级来升级。 所以我希望能够远程检查grub2是否已经安装在磁盘启动扇区而不需要重启,也不会覆盖启动扇区。
有没有什么比做硬盘的早期块的hexdump更容易,并试图确定grub2特定的字节?
我偶然发现了grub2 debian源码包中的答案。 事实certificate,它确实需要引导器的转储 – 所以单独打包的脚本可能是有用的。 这里是一个脚本(只是官方函数的一个包装),它会告诉你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