Troubleshooting boot problems can be a very frustrating and
challenging process. Sometimes their repair requires the Linux rescue
environment, but what can be done if rescue media is not handy? If the
system gets past BIOS and loads the GRUB boot loader, often there is
much that can be done to get it up and running again.
Basic GRUB usage
Each time a Linux system boots, GRUB flashes by on the screen while it
performs a brief countdown. The default countdown on many systems is
five seconds but the actual countdown period can be adjusted. GRUB
loads the Linux kernel and initial RAM disk image into system memory
then fires the system up. When everything goes well and GRUB is
finished with its task, the system successfully boots into Linux.
Press any key to enter the menu
Booting Fedora Core (2.6.19-1.2911.fc6) in 5 seconds...
Typical GRUB countdown sequence
Occasionally, GRUB requires some simple intervention. Perhaps a new
kernel isn’t working correctly with your system or maybe you want to
bring the system into a different runlevel than the default. Hit the
ESCAPE key to interrupt the GRUB countdown and bring up GRUB’s main
menu.
GNU GRUB version 0.97 (640K lower / 3072K upper memory)
+---------------------------------------------------------------------
+
| Fedora Core (2.6.19-1.2911.fc6)
|
| Fedora Core (2.6.19-1.2895.fc6)
|
| Other
|
|
|
|
|
|
|
|
|
|
|
+---------------------------------------------------------------------
+
Use the ^ and v keys to select which entry is highlighted.
Press enter to boot the selected OS, 'e' to edit the
commands before booting, 'a' to modify the kernel arguments
before booting, or 'c' for a command-line.
GRUB main menu
At the GRUB main menu a different boot menu item can be selected using
the up arrow and down arrow keys. Once the desired menu item has been
highlighted, its existing kernel parameters can be changed or
additional parameters can be passed to the kernel using the ‘a’
command.
[ Minimal BASH-like line editing is supported. For the first word,
TAB
lists possible command completions. Anywhere else TAB lists the
possible completions of a device/filename. ESC at any time
cancels.
ENTER at any time accepts your changes.]
grub append> ro root=LABEL=/ rhgb quiet 1
Using ‘a’ to append a run level
Using the ‘e’ command to edit a GRUB menu item
Although the ‘a’ command meets most GRUB editing needs, sometimes more
extensive changes are required to get a system up and running. This is
where the ‘e’ command comes in handy.
At the GRUB main menu, select the menu option you want to correct then
boot from. When you use the ‘e’ command, a simple editing menu will
appear allowing you to select the line you wish to edit.
GNU GRUB version 0.97 (640K lower / 3072K upper memory)
+---------------------------------------------------------------------
+
| root (hd0,2)
|
| kernel /vmlinuz-2.6.19-1.2911.fc6 ro root=LABEL=/ rhgb quiet
|
| initrd /initrd-2.6.19-1.2911.fc6.img
|
|
|
|
|
|
|
+---------------------------------------------------------------------
+
Use the ^ and v keys to select which entry is highlighted.
Press 'b' to boot, 'e' to edit the selected command in the
boot sequence, 'c' for a command-line, 'o' to open a new line
after ('O' for before) the selected line, 'd' to remove the
selected line, or escape to go back to the main menu.
Editing a menu option with the ‘e’ GRUB command
Use the arrow keys to select the particular line you want to modify,
then type ‘e’ again to edit that line with the arrow keys, BACKSPACE,
INSERT, or DELETE key. Changes are accepted by hitting ENTER or they
can be thrown away by hitting ESCAPE. Once the correction has been
accepted, typing ‘b’ will cause GRUB to start the boot sequence using
the newly-made adjustments.
[ Minimal BASH-like line editing is supported. For the first word,
TAB
lists possible command completions. Anywhere else TAB lists the
possible completions of a device/filename. ESC at any time
cancels.
ENTER at any time accepts your changes.]
grub edit> initrd /initrd-2.6.19-1.2895.fc6.img
Adjusting the initrd line of a GRUB menu item
Note - All editing changes at boot time are temporary. As smart as
GRUB is, it isn’t an operating system so it won’t update the hard
drive and fix its configuration file - /boot/grub/grub.conf. That task
must be done using a text editor once the system has successfully
booted.
For example, let’s suppose an old IDE disk drive has been replaced
with a shiny new SATA drive. The new drive has been partitioned, file
systems have been formatted, and all of the old data has been copied
to the new drive. An initial RAM disk image has been created, but
someone forgot to update the /boot/grub/grub.conf configuration file
to point to the new RAM disk.
No need for the rescue CD–interrupt the boot sequence and use the ‘e’
command to edit the initrd line in the current GRUB menu item. Point
it to the new and improved RAM disk image. Once the system is up and
running, the original, obsolete file that got us into this mess in the
first place, /boot/grub/grub.conf, can be edited and corrected
permanently.
Ultimate GRUB control - the ‘c’ command
The majority of boot problems can be solved with the ‘a’ and ‘e’ GRUB
commands, but these two modes of GRUB are just the beginning of what
GRUB can do. At boot time, the ‘c’ command accesses the GRUB command
line, or shell. Thankfully, rebooting is not necessary to get to the
GRUB shell. Log into Linux as root and execute /sbin/grub from the
BASH prompt.
GNU GRUB version 0.97 (640K lower / 3072K upper memory)
[ Minimal BASH-like line editing is supported. For the first word,
TAB
lists possible command completions. Anywhere else TAB lists the
possible completions of a device/filename.]
grub>
The GRUB shell
Many boot-time GRUB command questions can be answered by using the
‘help’ command. Used by itself, ‘help’ displays a list of the most
useful GRUB commands. When used with an argument, it displays a brief
synopsis and description of the command specified.
grub> help
blocklist FILE boot
cat FILE chainloader [--force] FILE
clear color NORMAL [HIGHLIGHT]
configfile FILE device DRIVE DEVICE
displayapm displaymem
find FILENAME geometry DRIVE [CYLINDER HEAD
SECTOR [
halt [--no-apm] help [--all] [PATTERN ...]
hide PARTITION initrd FILE [ARG ...]
kernel [--no-mem-option] [--type=TYPE] makeactive
map TO_DRIVE FROM_DRIVE md5crypt
module FILE [ARG ...] modulenounzip FILE [ARG ...]
pager [FLAG] partnew PART TYPE START LEN
parttype PART TYPE quit
reboot root [DEVICE [HDBIAS]]
rootnoverify [DEVICE [HDBIAS]] serial [--unit=UNIT] [--
port=PORT] [--
setkey [TO_KEY FROM_KEY] setup [--prefix=DIR] [--
stage2=STAGE2_
terminal [--dumb] [--no-echo] [--no-ed terminfo [--name=NAME --cursor-
address
testvbe MODE unhide PARTITION
uppermem KBYTES vbeprobe [MODE]
grub> help help
help: help [--all] [PATTERN ...]
Display helpful information about builtin commands. Not all
commands aren't shown without the option `--all'.
grub>
Asking GRUB for help
As you can see, many GRUB commands take file names as arguments. The
full syntax for GRUB file names is (DEVICE,PARTITION)/PATH/NAME.
DEVICE can use ‘fd0′ to specify the floppy disk. In this case
PARTITION isn’t used because floppies usually contain a single file
system on the entire media. Most GRUB scenarios involve access to a
hard drive. Hard drives have GRUB names such as ‘hd0′ or ‘hd1′
regardless of their type–IDE vs. SCSI vs. SATA. Most of the time hard
drive path names require the PARTITION number to be specified. GRUB
counts partitions starting at zero so the Linux partition /dev/sda1
would be represented in GRUB as (hd0,0), /dev/sda2 would be (hd0,1)
and so on.
Let’s see if we can put this new GRUB pathname knowledge to good use.
The ‘cat’ GRUB command is similar to its Linux counterpart–it displays
the contents of text files to the screen. When used with large files,
the GRUB ‘cat’ command displays the file one screen at a time much
like the Linux command ‘less’.
grub> cat (hd0,2)/sample-file
Here is a small sample file of text located at
/boot/sample-file. It is not very interesting.
grub>
Viewing a small file with the GRUB ‘cat’ command
Typing full GRUB pathnames gets old fast–especially if you need to
view many files while looking for useful information. The ‘root’ GRUB
command instructs GRUB to search a single drive or partition when the
(DEVICE,PARTITION) portion of file pathnames is omitted.
grub> root (hd0,2)
Filesystem type is ext2fs, partition type 0x83
grub> cat /sample-file
Here is a small sample file of text located at
/boot/sample-file. It is not very interesting.
grub>
Using the ‘root’ command to shorten pathnames
Like the BASH shell, GRUB has command and filename completion that is
invoked by using the TAB key. The filename in the above example could
have been specified using /sa[TAB]. If more than one file starts with
“sa” the TAB key will complete the filename as much as it can then
display a list of all filenames that start with the given string. GRUB
is smart enough to put a trailing slash at the end of directories when
using filename completion.
Let’s put what we know together and use GRUB to help us determine
which partition contains the root filesystem:
grub> root (hd0,1)
Filesystem type is ext2fs, partition type 0x83
grub> cat /etc/passwd
Error 15: File not found
grub> root (hd0,2)
Filesystem type is ext2fs, partition type 0x83
grub> cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
...
grub>
If hd0 in the example is an IDE drive, Linux refers to the root
partition as /dev/hda3. This information can be passed as to the
kernel as the ‘root=/dev/hda3′ parameter when we boot our system.
GRUB has a command that makes finding pathnames in partitions even
easier. Amazingly enough, it’s called ‘find’. Although this command is
easier to use, it can often take a very long time to execute. It will
display all of the partitions that contain the filename specified.
grub> find /etc/passwd
(hd0,2)
grub>
Using the ‘find’ command to locate a file
GRUB will automatically invoke its shell at boot time if it cannot
locate its configuration file. This happens when the configuration
file is accidentally renamed or deleted. The ‘configfile’ command can
be used to load an alternate configuration file that conforms to the /
boot/grub/grub.conf GRUB syntax and commands. For example, the
following sequence of commands will locate a backup copy of the
grub.conf configuration file, assuming we have a backup copy. Before
the backup configuration file can be used, its name and location must
be determined:
grub> find /grub/grub.conf
Error 15: File not found
grub> find /grub/grub.conf.bak
(hd0,2)
grub> configfile (hd0,2)/grub/grub.conf.bak