How do I tell if grub is installed on a device?
Solution 1:
Alternate Method
file -s
didn't work for me in Ubuntu Lucid because my file command's magic files were out of date. Another way to do this if your magic files haven't caught up with GRUB changes is to examine the first 512 bytes of the device using the dd
command like this:
user@host:~$ sudo dd bs=512 count=1 if=/dev/sda 2>/dev/null | strings
ZRr=
`|f
\|f1
GRUB
Geom
Hard Disk
Read
Error
This sends the output of the dd
command through the strings
command thus stripping out unprintable characters (transfer statistics get discarded to /dev/null
).
If you see any messages that GRUB would display when it encounters failure then you've got grub installed.
Hat tip to louib on ubuntuforums.org for answering in this password protected post: http://ubuntuforums.org/showthread.php?t=363372
For the curious this is what I got from file -s
:
user@host:~$ sudo file -s /dev/sda
/dev/sda: x86 boot sector; partition 1: ID=0x83, active, starthead 32, startsector 20
48, 337211392 sectors; partition 2: ID=0x5, starthead 254, startsector 337215486, 1434214
6 sectors, code offset 0x63
There's nothing about GRUB in there specifically.
Solution 2:
UPDATE:
This answer is from 2009 and applies to grub-legacy, not grub2.
You can use file
to identify GRUB in an MBR. e.g.
# file -s /dev/sda
/dev/sda: x86 boot sector; GRand Unified Bootloader, stage1 version 0x3
, stage2 address 0x2000, stage2 segment 0x200; partition 1:
ID=0xfd, starthead 1, startsector 63, 1044162 sectors; partition
2: ID=0x82, starthead 0, startsector 1044225, 1028160 sectors;
partition 3: ID=0xfd, starthead 0, startsector 2072385,
1951447680 sectors, code offset 0x48
The root=
paramater is not stored in the MBR, that's stored in GRUB's menu.lst
file which is stored on a file-system (typically in the /boot/grub directory of the root fs or the grub directory of the /boot filesystem - but not always, it could be anywhere).
You'll have to parse the output of file above, determine which disk/partition the menu.lst
file is on, mount it, read it in and parse it. You'll also want to read in the grub/default file to figure out which grub menu entry is the default, because that's probably the one that has the root= parameter that you're most interested in.
Solution 3:
You can use grub-emu
to see the menu that grub will show when the machine next reboots.
$ sudo apt-get install grub-emu
$ sudo grub-emu
On my desktop machine the menu was displayed as expected, although if I actually pretended to boot a kernel I got a "no such device" error. I think that is expected behaviour.
On my DigitalOcean VPS no entries were displayed in the grub menu, although the server did actually reboot fine. (This is a 2013 VPS, so your mileage may vary.)
Some notes when running grub-emu
:
- In X-windows, if you want to interact with grub, you need your keyboard focus to be on the terminal from which you ran grub-emu, and not on the window which popped up.
- You can exit the emulator by pressing
c
then typingexit
. - After exiting, your terminal emulator may be in a poor state (e.g. Enter will not display on a new line). Fix that by typing
reset
. (Don't worry it won't restart your machine. It will just clean up your terminal.)