介绍
GRUB 2 通过运行/etc/grub.d/folder 目录下的脚本来 建立配置文件 (grub.cfg) ,并且/etc/default/grub这个文件也可以配置。update-grub命令(手动运行,或更新内核的时候会被执行) 可以自动更新grub.cfg .这个命令会激活上面的脚本,并且会寻找系统中存在的操作系统和内核。一旦发现操作系统或内核,那么它们会被加入到 GRUB 2 的启动菜单当中。
通过以下两个命令中的任意一个 可以知道,GRUB2被安装在了哪个分区:
-
Device: sudo grub-probe -t device /boot/grub
-
UUID: sudo grub-probe -t fs_uuid /boot/grub
例如:
$ grub-probe -t device /boot/grub/
/dev/sda1
$ sudo grub-probe -t fs_uuid /boot/grub/
efa0f8fd-d69d-4931-8275-d25f8871511d
$ sudo grub-probe -t device /boot/grub/
/dev/sda1
$
$ df -h
文件系统 容量 已用 可用 已用%% 挂载点
/dev/sda5 19G 16G 2.3G 87% /
none 1.5G 672K 1.5G 1% /dev
none 1.5G 104K 1.5G 1% /dev/shm
none 1.5G 356K 1.5G 1% /var/run
none 1.5G 0 1.5G 0% /var/lock
/dev/sda1 3.7G 132M 3.4G 4% /boot # 我这台机的 grub2是装在 /boot 分区的
/dev/sda8 426G 303G 102G 75% /home
/dev/sda7 5.6G 417M 4.9G 8% /opt
df: "/home/swtd1/.gvfs": 无效的跨设备连接
/home 426G 303G 102G 75% /home
安装 在 sda1 的操作系统接管 grub2。
主目录和文件 -- Main Directories & Files
The Menu: /boot/grub/grub.cfg
grub.cfg 这个文件,在以前的grub版本( GRUB 0.97')是 menu.lst 。grub.cfg这个文件不像 menu.list这个文件, menu.list是直接编辑的。
而grub.cfg是用命令(每个命令负责这个配置文件中的某一块的更新)来更新的。
grub.cfg 通过运行update-grub 来更新的。update-grub 其实就跟如下命令是一个作用。
grub-mkconfig -o /boot/grub/grub.cfg.
如果用户希望在一个不同的位置创建一个不同名字的启动菜单的话,就需要通过 “-o” 选项来指定新的路径。
当 grub-install 命令运行的时候,并不创建或者更新 grub.cfg 文件。
直接修改 grub.cfg --- Editing grub.cfg directly
手动修改 grub.cfg 需要注意:
如果其他的任务会运行 update-grub ,那么应该在 update-grub 运行之后, 再编辑 grub.cfg 。也就是说在编辑grub.cfg之前,应该所有需要的内核和相关资源已经有了。
当然,你手动编辑的内容,一般来说在下次运行update-grub 之后,都会被覆盖掉。update-grub 是根据它自己的规则来更新grub.cfg。
grub.cfg的部分内容 是/etc/grub.d 下的脚本生成的。用户可以根据需要编辑这个目录下的脚本。
用户设置: /etc/default/grub
/etc/default/grub 文件包含了很多默认配置。
/usr/sbin$ ls grub-*
grub-install grub-mkdevicemap grub-probe grub-set-default
grub-mkconfig grub-mknetdir grub-reboot grub-setup
在 /usr/sbin 目录下,以 grub- 开头的文件都是 脚本文件,并非二进制可执行文件。
很多预定义的变量包含在/usr/sbin/grub-mkconfig 这个文件中,用如下命令可以列出这些预定义的变量:
grep "export GRUB_DEFAULT" -A50 /usr/sbin/grub-mkconfig | grep GRUB_
/usr/sbin$ grep "export GRUB_DEFAULT" -A50 /usr/sbin/grub-mkconfig | grep GRUB_
export GRUB_DEFAULT \
GRUB_HIDDEN_TIMEOUT \
GRUB_HIDDEN_TIMEOUT_QUIET \
GRUB_TIMEOUT \
GRUB_DEFAULT_BUTTON \
GRUB_HIDDEN_TIMEOUT_BUTTON \
GRUB_TIMEOUT_BUTTON \
GRUB_BUTTON_CMOS_ADDRESS \
GRUB_BUTTON_CMOS_CLEAN \
GRUB_DISTRIBUTOR \
GRUB_CMDLINE_LINUX \
GRUB_CMDLINE_LINUX_DEFAULT \
GRUB_CMDLINE_XEN \
GRUB_CMDLINE_XEN_DEFAULT \
GRUB_CMDLINE_NETBSD \
GRUB_CMDLINE_NETBSD_DEFAULT \
GRUB_TERMINAL_INPUT \
GRUB_TERMINAL_OUTPUT \
GRUB_SERIAL_COMMAND \
GRUB_DISABLE_LINUX_UUID \
GRUB_DISABLE_RECOVERY \
GRUB_VIDEO_BACKEND \
GRUB_GFXMODE \
GRUB_BACKGROUND \
GRUB_THEME \
GRUB_GFXPAYLOAD_LINUX \
GRUB_DISABLE_OS_PROBER \
GRUB_INIT_TUNE \
GRUB_SAVEDEFAULT \
GRUB_BADRAM
脚本: /etc/grub.d/
$ ls /etc/grub.d/
00_header 10_linux 20_memtest86+ 40_custom README
05_debian_theme 20_linux_xen 30_os-prober 41_custom
在 /etc/grub.d/ 目录下的脚本,当 update-grub执行的时候,会被读取,并合并到 /boot/grub/grub.cfg 这个文件中。
grub.cfg文件中的 菜单条目的放置,是由 /etc/grub.d/ 目录下的脚本运行的顺序来决定的。文件名以数字开头的的脚本会被先执行,并且数字小的先执行。比如10_linux 在20_memtest之前执行。而20_memtest 会在40_custom 之前执行。文件名以字母开头的(alphabetic)的脚本在数字命名的脚本之后运行。
自定义的 启动菜单入口(menu entries)可以被添加到40_custom 这个文件中,或者单独创建一个文件。40_custom 中的菜单入口将会出现在启动菜单的最底部。一个以“06_”开头的自定义文件,将出现在 启动菜单的最顶部。
update-grub执行的时候, /etc/grub.d/ 下的脚本会被执行。
脚本描述:
-
00_header
-
设置环境变量,比如 系统文件位置、video设置和之前保存的入口(previously saved entries) 。这个也导入了一些相关的东西(存储在/etc/default/grub)。用户通常不需要改变这个文件。
-
-
05_debian_theme
-
这个文件的主要目的是设置GRUB2的背景图片,文本颜色,选择高亮和主题。这些文件初始化菜单显示。关于如何设置字体和显示等请参考:Grub2/Displays (https://help.ubuntu.com/community/Grub2/Displays)
-
-
10_linux
-
识别在 root device中操作系统正在使用的内核,并且为这些内核创建(menu entries) . 这个包含了相应的“recovery mode (恢复模式)”选项。在GRUB 1.99和之后的版本中, 在 启动主菜单页面,仅显示最新的内核。其他的内核被包含在了子启动菜单中( submenu)。 更多submenu相关信息请参考Grub2/Submenus 。
Note:对于早期的GRUB 2版本, 所有位于 boot目录的内核都包含在 main menu 中. 如果要减少显示的内核,那就要删除/boot文件夹下的旧内核,或者使用一个有效的的grub2自定义应用。