Linux grub命令介绍

grub命令是GRUB(GRand Unified Bootloader)的命令行工具,它可以让你在启动时修改、恢复或安装GRUB配置。GRUB是一个多操作系统启动管理器,它可以让你在同一台电脑上选择不同的操作系统或内核来启动。GRUB有两个版本,GRUB Legacy和GRUB 2,它们的命令和配置有一些差异,本文主要介绍GRUB 2的命令。

Linux grub命令适用的Linux版本

grub命令适用于大多数Linux发行版,如Ubuntu, Debian, Fedora, CentOS等,它们都使用GRUB 2作为默认的启动管理器。如果你的Linux发行版没有安装GRUB 2,你可以使用以下命令来安装:

  • Ubuntu/Debian: [linux@bashcommandnotfound.cn ~]$ sudo apt-get install grub-pc
  • Fedora/CentOS: [linux@bashcommandnotfound.cn ~]$ sudo yum install grub2

安装完成后,你需要运行以下命令来更新GRUB配置,并将GRUB安装到你的硬盘的主引导记录(MBR)上:

  • Ubuntu/Debian: [linux@bashcommandnotfound.cn ~]$ sudo update-grub && sudo grub-install /dev/sda
  • Fedora/CentOS: [linux@bashcommandnotfound.cn ~]$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg && sudo grub2-install /dev/sda

其中,/dev/sda是你的硬盘的设备名,你可以用fdisk -l命令来查看你的硬盘信息。

Linux grub命令的基本语法

grub命令的基本语法如下:

1
grub [options] [device]

其中,options是可选的参数,device是可选的设备名。如果不指定device,grub命令会尝试自动检测你的硬盘和分区,并进入交互式模式,让你输入GRUB命令来修改或恢复GRUB配置。

Linux grub命令的常用选项或参数说明

grub命令的常用选项或参数如下表所示:

选项或参数 说明
-h, –help 显示帮助信息
-v, –version 显示版本信息
–boot-directory=DIR 指定GRUB的启动目录,通常是/boot
–modules=MODULES 指定要加载的GRUB模块,用逗号分隔
–install-modules=MODULES 指定要安装的GRUB模块,用逗号分隔
–compress=gzip 指定压缩GRUB模块的方式,可以是gzip, lzop, xz, lzo, lzma, none
–no-compress 不压缩GRUB模块
–grub-mkdevicemap=FILE 指定GRUB设备映射文件,通常是/boot/grub/device.map
–grub-probe=FILE 指定GRUB探测工具,通常是grub-probe
–target=TARGET 指定GRUB的目标平台,可以是i386-pc, x86_64-efi, ia64-efi, arm-efi, arm64-efi, sparc64-ieee1275, mips-arc, mips-qemu_mips, mipsel-arc, mipsel-qemu_mips, mips64-arc, mips64-qemu_mips64, mips64el-arc, mips64el-qemu_mips64, powerpc-ieee1275, s390x-emu等
–directory=DIR 指定GRUB模块的目录,通常是/usr/lib/grub
–verbose 显示详细的输出信息
–allow-floppy 允许将GRUB安装到软盘上
–force 强制执行GRUB命令,即使有一些错误或警告
–recheck 重新检查设备和分区的信息
–removable 将GRUB安装到可移动设备上,如U盘
–no-nvram 不更新NVRAM中的启动顺序,只适用于EFI平台
–no-floppy 不检查软盘设备
–disk-module=MODULE 指定GRUB的磁盘驱动模块,可以是biosdisk, native, ata, ahci, usb, ieee1275, scsi等

常用参数:

–batch 使用批处理模式
–boot-drive 设置stage2的引导驱动器
–config-file 设置stage2的配置文件
–device-map 设置设备的映射文件
–help 显示帮助信息
–install-partition 设置stage2的安装分区
–no-config-file 不使用配置文件
–no-pager 不使用内部分页器
–preset-menu 使用预设菜单
–probe-second-floppy 检测第二个软盘驱动器
–read-only 使用只读模式

常用动作:

blocklist 显示文件所在分区位置
boot 启动系统
cat 显示文件内容
chainloader 把启动控制权软交给其他的引导装载程序
clear 清屏
cmp 比较两个文件
color 设置菜单界面的颜色
configfile 加载已经存在的GRUB配置文件
debug 设置开启或关闭调试模式
device 指定设备文件作为驱动器
displayapm 显示APM BIOS信息
displaymem 显示内存配置
embed 嵌入STAGE1_5设备
find 查找包括文件的所有设备
fstest 使用文件系统测试模式
geometry 显示驱动器的物理信息
halt 关闭系统
help 显示GRUB命令的帮助信息
hide 隐藏分区
impsprobe 查询SMP信息
initrd 加载initrd/initramfs文件
install 安装GRUB
ioprobe 查询驱动器的I/O端口
kernel 引导系统内核
lock 锁定GRUB引导菜单项
makeactive 激活主分区
map 虚拟映射驱动器
md5crypt 使用MD5算法加密口令
module 设置加载模块
modulenounzip 加载模块但不进行解压
pager 改变内部页程序的状态
partnew 创建一个主分区
parttype 改变分区类型
password 设置菜单界面口令
pause 暂停并等待按键
quit 退出GRUB命令行界面
reboot 重启系统
read 读取内存中的内容
root 设置GRUB的root设备
rootnoverify 设置GRUB的root设备但不装载文件系统
savedefault 保存当前的启动菜单项为默认启动
serial 设置串口设备
setkey 设置键盘映射
setup 自动安装GRUB
splashimage 设置GRUB启动的背景图形文件
terminal 设置终端的类型
terminfo 设置终端的功能
testload 从文件系统中测试读取文件
testvbe 测试VESA BIOS EXTENSION
unhide 还原隐藏分区
uppermem 强制设备计算机上位内存大小
vbeprobe 查询VESA BIOS EXTENSION信息

语法格式:grub [参数] [动作] [对象] 常用参数:

1
2
3
4
5
6
7
8
9
10
11
--batch:打开批处理模式;
--boot-drive=<驱动器>:指定stage2的引导驱动器;
--config-file<配置文件>:指定stage2的配置文件;
--device-map=<文件>:指定设备的映射文件;
--help:显示帮助信息;
--install-partition=<分区>:指定stage2安装分区;
--no-config-file:不使用配置文件;
--no-pager:不使用内部分页器;
--preset-menu:使用预设菜单;
--probe-second-floppy:检测第二个软盘驱动器;
--read-only:只读模式。

实例

利用grub命令来启动损坏的Linux系统,可能你的电脑因为某些原因损坏不能自动启动了。当然原因很多,可能的现象也很多。

这里说一下这种情况下的处理方法,即:屏幕上提示grub>,但你的硬盘上数据没有丢失,各分区都是好的。这种情况是你的grub信息损坏了,但比较严重的是系统启动不了。

当然,在正常启动情况下,屏幕上出现grub的启动项选择菜单时按c键也是可以进入grub>状态的。这时候我们需要用grub的命令来手工启动系统。

只需要用到四个命令boot、kernel、initrd、boot。

但grub本身命令很多,比如查看文件内容的cat ,你输入help会得到。

首先,输入“ root (hd ” ,然后按两次 TAB 键; / 这会列出你电脑上可能的磁盘设备,硬盘为 hd0/hd1 或 sd0/sd1 等 /

然后,选择你的安装 Linux 系统的硬盘,比如 hd0 ,输入 “ root (hd0, ” 再按两次 TAB 键; / 这会列出你的第一块硬盘上的分区情况,你会知道哪个是 swap 交换分区, 0x82 ,哪个是 Linux 分区 0x83 /

选择你认为可能的 /boot 目录所在的分区, 输入root (hd0, 1)回车;

接着,输入cat /boot/vm, 按两次 TAB 键,如果出现一些 vm 开头的文件,比如 vmlinuz-2.6.15-26-386 说明这里是 /boot 所在的分区。

删除上一次的输入,再输入cat /boot/initrd,按两次 TAB 键,如果出现一些 initrd 开头的文件,比如 initrd.img-2.6.15-26-386 说明这个 /boot 所在的分区有 initrd ,即 ramdisk 镜像;

删除上一次的输入,再输入cat /sbin/init,按两次 TAB 键,如果出现一些 init 开头的文件,比如/sbin/init说明这个分区是/所在的分区;

如果没有出现/sbin/init文件,说明(hd0,1)分区仅仅是/boot分区而不是/分区。重新输入root (hd0,N)命令,这里 N 是某个 Linux 分区,然后再试cat /sbin/init, 直到屏幕上出现/sbin/init,说明你找到了/分区,严格来说,应该是/sbin目录所在的分区;

依次输入命令:

1
2
3
4
root (hd0,1)   /* 假设 /dev/hda2 是你的 /boot 所在的分区 */
kernel /boot/vmlinuz-2.6.15-26-386 ro dev=/dev/hda3 /* 假设 /dev/hda3 是你的 / 所在的分区 */
initrd /boot/initrd.img-2.6.15-26-386
boot

即可启动系统。

这里的关键问题是如何确定系统的几个分区:/boot / /sbin

Linux grub命令的实例

实例1:进入GRUB交互式模式

如果你想在启动时修改或恢复GRUB配置,你可以在GRUB菜单界面按c键,进入GRUB交互式模式,然后输入GRUB命令来操作。例如,你可以用set命令来查看或设置GRUB变量,用ls命令来列出设备和分区,用root命令来设置根分区,用linux命令来设置内核,用initrd命令来设置初始内存盘,用boot命令来启动系统等。以下是一个示例:

1
2
3
4
5
6
7
8
9
10
[linux@bashcommandnotfound.cn ~]$ grub
grub> set
prefix=(hd0,msdos1)/boot/grub
root=hd0,msdos1
grub> ls
(hd0) (hd0,msdos2) (hd0,msdos1)
grub> root=(hd0,msdos2)
grub> linux /vmlinuz root=/dev/sda2 ro
grub> initrd /initrd.img
grub> boot

实例2:安装GRUB到硬盘的MBR上

如果你想将GRUB安装到硬盘的MBR上,你可以使用grub命令的device参数来指定硬盘的设备名,例如/dev/sda。以下是一个示例:

1
2
3
[linux@bashcommandnotfound.cn ~]$ grub /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.

实例3:安装GRUB到U盘上

如果你想将GRUB安装到U盘上,你可以使用grub命令的–removable选项来指定U盘是可移动设备,然后用device参数来指定U盘的设备名,例如/dev/sdb。以下是一个示例:

1
2
3
[linux@bashcommandnotfound.cn ~]$ grub --removable /dev/sdb
Installing for i386-pc platform.
Installation finished. No error reported.

实例4:更新GRUB配置文件

如果你想更新GRUB配置文件,你可以使用grub-mkconfig命令来生成一个新的配置文件,并用-o选项来指定输出的文件名,通常是/boot/grub/grub.cfg。以下是一个示例:

1
2
3
4
5
6
7
8
[linux@bashcommandnotfound.cn ~]$ grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.4.0-58-generic
Found initrd image: /boot/initrd.img-5.4.0-58-generic
Found linux image: /boot/vmlinuz-5.4.0-56-generic
Found initrd image: /boot/initrd.img-5.4.0-56-generic
Found Windows 10 on /dev/sda1
done

实例5:恢复GRUB配置文件

如果你的GRUB配置文件被损坏或丢失,你可以使用grub-install命令来恢复它,它会自动检测你的系统和分区,并生成一个新的配置文件。你需要用device参数来指定硬盘的设备名,例如/dev/sda。以下是一个示例:

1
2
3
[linux@bashcommandnotfound.cn ~]$ grub-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.

如果你使用的是Live CD或USB启动,你需要先挂载你的根分区,然后用chroot命令来切换到你的系统环境,再执行grub-install命令。以下是一个示例:

1
2
3
4
5
[linux@bashcommandnotfound.cn ~]$ sudo mount /dev/sda2 /mnt # 假设你的根分区是/dev/sda2
[linux@bashcommandnotfound.cn ~]$ sudo chroot /mnt
[linux@bashcommandnotfound.cn ~]$ grub-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.

实例6:恢复GRUB配置文件

如果你的GRUB配置文件被损坏或丢失,你可以使用grub-install命令来恢复它,它会自动检测你的系统和分区,并生成一个新的配置文件。你需要用device参数来指定硬盘的设备名,例如/dev/sda。以下是一个示例:

1
2
3
[linux@bashcommandnotfound.cn ~]$ grub-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.

实例7:修改GRUB菜单的超时时间

如果你想修改GRUB菜单的超时时间,即在启动时显示GRUB菜单的秒数,你可以编辑GRUB配置文件中的GRUB_TIMEOUT变量,它的默认值是5秒。你可以用任意文本编辑器来编辑GRUB配置文件,通常是/boot/grub/grub.cfg,或者用grub-editenv命令来修改GRUB环境变量。以下是一个示例,将超时时间改为10秒:

1
[linux@bashcommandnotfound.cn ~]$ sudo grub-editenv - set GRUB_TIMEOUT=10

或者

1
2
3
[linux@bashcommandnotfound.cn ~]$ sudo vi /boot/grub/grub.cfg
# Edit the following line
GRUB_TIMEOUT=10

实例8:修改GRUB菜单的默认启动项

如果你想修改GRUB菜单的默认启动项,即在超时后自动启动的操作系统或内核,你可以编辑GRUB配置文件中的GRUB_DEFAULT变量,它的默认值是0,表示第一个菜单项。你可以用数字或者菜单项的标题来指定默认启动项,也可以用saved来表示上次启动的菜单项。以下是一个示例,将默认启动项改为Windows 10:

1
[linux@bashcommandnotfound.cn ~]$ sudo grub-editenv - set GRUB_DEFAULT="Windows 10"

或者

1
2
3
[linux@bashcommandnotfound.cn ~]$ sudo vi /boot/grub/grub.cfg
# Edit the following line
GRUB_DEFAULT="Windows 10"

实例9:隐藏GRUB菜单

如果你想隐藏GRUB菜单,即在启动时不显示GRUB菜单,只有按住Shift键才能显示,你可以编辑GRUB配置文件中的GRUB_HIDDEN_TIMEOUT和GRUB_HIDDEN_TIMEOUT_QUIET变量,它们的默认值是空,表示不隐藏GRUB菜单。你可以用GRUB_HIDDEN_TIMEOUT来指定隐藏GRUB菜单的秒数,用GRUB_HIDDEN_TIMEOUT_QUIET来指定是否显示倒计时信息,取值为true或false。以下是一个示例,将GRUB菜单隐藏10秒,并不显示倒计时信息:

1
2
[linux@bashcommandnotfound.cn ~]$ sudo grub-editenv - set GRUB_HIDDEN_TIMEOUT=10
[linux@bashcommandnotfound.cn ~]$ sudo grub-editenv - set GRUB_HIDDEN_TIMEOUT_QUIET=true

或者

1
2
3
4
[linux@bashcommandnotfound.cn ~]$ sudo vi /boot/grub/grub.cfg
# Edit the following lines
GRUB_HIDDEN_TIMEOUT=10
GRUB_HIDDEN_TIMEOUT_QUIET=true

实例10:修改GRUB菜单的分辨率和颜色

如果你想修改GRUB菜单的分辨率和颜色,即在启动时显示GRUB菜单的屏幕大小和背景色,你可以编辑GRUB配置文件中的GRUB_GFXMODE和GRUB_COLOR_NORMAL变量,它们的默认值是auto和white/black,表示自动适应屏幕分辨率和白色字体黑色背景。你可以用GRUB_GFXMODE来指定分辨率,格式为widthxheight,例如1024x768,用GRUB_COLOR_NORMAL来指定颜色,格式为foreground/background,例如red/green。以下是一个示例,将GRUB菜单的分辨率改为800x600,颜色改为蓝色字体黄色背景:

1
2
[linux@bashcommandnotfound.cn ~]$ sudo grub-editenv - set GRUB_GFXMODE=800x600
[linux@bashcommandnotfound.cn ~]$ sudo grub-editenv - set GRUB_COLOR_NORMAL=blue/yellow

或者

1
2
3
4
[linux@bashcommandnotfound.cn ~]$ sudo vi /boot/grub/grub.cfg
# Edit the following lines
GRUB_GFXMODE=800x600
GRUB_COLOR_NORMAL=blue/yellow

实例11:修改GRUB菜单的字体和主题

如果你想修改GRUB菜单的字体和主题,即在启动时显示GRUB菜单的字体样式和背景图片,你可以编辑GRUB配置文件中的GRUB_FONT和GRUB_BACKGROUND变量,它们的默认值是空,表示使用GRUB的默认字体和背景。你可以用GRUB_FONT来指定字体文件,格式为路径/文件名,例如/boot/grub/fonts/DejaVuSansMono.pf2,用GRUB_BACKGROUND来指定背景图片文件,格式为路径/文件名,例如/boot/grub/background.jpg。以下是一个示例,将GRUB菜单的字体改为DejaVuSansMono,背景图片改为background.jpg:

1
2
[linux@bashcommandnotfound.cn ~]$ sudo grub-editenv - set GRUB_FONT=/boot/grub/fonts/DejaVuSansMono.pf2
[linux@bashcommandnotfound.cn ~]$ sudo grub-editenv - set GRUB_BACKGROUND=/boot/grub/background.jpg

或者

1
2
3
4
[linux@bashcommandnotfound.cn ~]$ sudo vi /boot/grub/grub.cfg
# Edit the following lines
GRUB_FONT=/boot/grub/fonts/DejaVuSansMono.pf2
GRUB_BACKGROUND=/boot/grub/background.jpg

实例12:添加自定义的GRUB菜单项

如果你想添加自定义的GRUB菜单项,即在启动时显示你自己定义的操作系统或内核,你可以编辑GRUB配置文件中的40_custom文件,通常是/boot/grub/40_custom,或者创建一个新的文件,例如41_custom,放在/boot/grub目录下,然后用menuentry命令来定义你的菜单项,格式为:

1
2
3
4
5
menuentry 'title' {
set root=(device,partition)
linux /path/to/kernel [kernel options]
initrd /path/to/initrd
}

其中,title是你的菜单项的标题,device是你的硬盘设备名,partition是你的分区编号,kernel是你的内核文件,initrd是你的初始内存盘文件,kernel options是你的内核参数。以下是一个示例,添加一个自定义的Ubuntu 20.04 LTS菜单项:

1
2
3
4
5
6
7
[linux@bashcommandnotfound.cn ~]$ sudo vi /boot/grub/41_custom
# Add the following lines
menuentry 'Ubuntu 20.04 LTS' {
set root=(hd0,msdos2)
linux /boot/vmlinuz-5.4.0-58-generic root=/dev/sda2 ro quiet splash
initrd /boot/initrd.img-5.4.0-58-generic
}

实例13:删除或隐藏不需要的GRUB菜单项

如果你想删除或隐藏不需要的GRUB菜单项,即在启动时不显示你不想启动的操作系统或内核,你可以编辑GRUB配置文件中的10_linux文件,通常是/boot/grub/10_linux,或者其他相关的文件,例如30_os-prober,然后用#号来注释掉你不需要的菜单项,或者用submenu命令来将它们放在一个子菜单中,格式为:

1
2
3
4
5
6
submenu 'title' {
menuentry 'title' {
...
}
...
}

其中,title是你的子菜单或菜单项的标题,…是你的菜单项的内容。以下是一个示例,将不需要的内核菜单项放在一个子菜单中,标题为Old kernels:

1
2
3
4
5
6
7
8
9
10
[linux@bashcommandnotfound.cn ~]$ sudo vi /boot/grub/10_linux
# Edit the following lines
submenu 'Old kernels' {
menuentry 'Ubuntu, with Linux 5.4.0-56-generic' {
...
}
menuentry 'Ubuntu, with Linux 5.4.0-56-generic (recovery mode)' {
...
}
}

实例14:使用GRUB命令来启动其他操作系统

如果你想使用GRUB命令来启动其他操作系统,即在GRUB交互式模式下输入GRUB命令来加载其他操作系统的启动信息,你可以使用chainloader命令来指定其他操作系统的启动文件,例如Windows的/bootmgr或ntldr,然后用boot命令来启动。以下是一个示例,使用GRUB命令来启动Windows 10:

1
2
3
4
[linux@bashcommandnotfound.cn ~]$ grub
grub> set root=(hd0,msdos1) # 假设Windows 10的分区是/dev/sda1
grub> chainloader +1
grub> boot

实例15:使用GRUB命令来启动ISO镜像

如果你想使用GRUB命令来启动ISO镜像,即在GRUB交互式模式下输入GRUB命令来加载ISO镜像的启动信息,你可以使用loopback命令来指定ISO镜像的文件,然后用linux和initrd命令来指定内核和初始内存盘,然后用boot命令来启动。以下是一个示例,使用GRUB命令来启动Ubuntu 20.04 LTS的ISO镜像:

1
2
3
4
5
6
[linux@bashcommandnotfound.cn ~]$ grub
grub> set root=(hd0,msdos2) # 假设ISO镜像的分区是/dev/sda2
grub> loopback loop /ubuntu-20.04.1-desktop-amd64.iso
grub> linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=/ubuntu-20.04.1-desktop-amd64.iso
grub> initrd (loop)/casper/initrd
grub> boot

Linux grub命令的注意事项

  • grub命令是一个非常强大的工具,它可以让你管理你的系统的启动过程,但也有一些风险,如果你不小心操作,可能会导致你的系统无法启动或者损坏你的数据,所以在使用grub命令之前,你最好备份你的数据,或者使用Live CD或USB来测试你的修改。
  • grub命令有两个版本,GRUB Legacy和GRUB 2,它们的命令和配置有一些差异,本文主要介绍GRUB 2的命令,如果你使用的是GRUB Legacy,你可以参考[GRUB Legacy文档]或者[GRUB Legacy命令列表]。
  • grub命令有两种模式,交互式模式和非交互式模式,交互式模式是在启动时按c键进入的,你可以输入GRUB命令来修改或恢复GRUB配置,非交互式模式是在系统中运行的,你可以使用grub命令的选项和参数来安装或更新GRUB配置,你需要注意区分这两种模式,不要混淆它们的用法。
  • 如果你在使用grub命令时遇到了错误或问题,你可以使用grub-mkrescue命令来创建一个可启动的GRUB救援盘,然后用它来启动你的系统,或者使用grub-rescue命令来进入GRUB救援模式,然后输入GRUB命令来修复你的GRUB配置,你可以参考[GRUB救援模式]或者[GRUB救援命令]。
  • 如果你在使用grub命令时看到了bash: grub: command not found