GRUB2 迁移

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page GRUB2 Migration and the translation is 73% complete.

Other languages:
English • ‎español • ‎français • ‎polski • ‎português do Brasil • ‎čeština • ‎русский • ‎中文(中国大陆)‎ • ‎日本語 • ‎한국어

本指南的目标是为读者提供从GRUB LegacyGRUB2的顺利迁移。

背景

GRUB 是什么?

GRUB是在非嵌入式Linux机器上使用的最常见的引导加载程序之一。 GRUB的作用是使Linux内核从磁盘加载到内存中,并开始执行Linux内核。

为什么要迁移?

首先,GRUB Legacy已停止维护,因此将不会再收到更新。 GRUB Legacy被开发人员创建的时候是感到安全的,但是今后将不再适用。例如,GRUB Legacy无法从大于2 TB的磁盘进行引导并假设较新的文件系统不会代替/boot.。

GRUB2的目标是更强大,更便携,并保持更纯净的代码库。 GRUB2比其前身支持更多的硬件配置,更多的文件系统和更多的驱动器布局。

迁移到 GRUB2

迁移到GRUB2是非常简单的:它将在日常更新升级中被包管理器自动引入。如果没有自动引入,它总是可以通过sys-boot/grub:2源包来合并:

root #emerge --ask sys-boot/grub:2

引导驱动器

第一个重要的部分是理解哪个驱动器是可引导的。对于遵循Gentoo手册安装的人,应该是/dev/sda。对于那些不确定的人来说,最简单的方法是查看现有的GRUB Legacy配置。查看/boot/grub/grub.conf文件是检查的主要地方。

Note
确保/boot分区已挂载,以便能够查看这些文件。就像下面的命令一样简单
root #mount /boot

这个grub.conf看起来应该是这样的:

FILE /boot/grub/grub.conf
default 0
timeout 30
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
  
title Gentoo Linux 3.2.12
root (hd0,0)
kernel /boot/kernel-3.2.12-gentoo root=/dev/sda3 quiet dolvm
initrd /boot/initramfs-genkernel-x86_64-3.2.12-gentoo

基于上述文件,可以知道(hd0)是引导驱动器,但是我们必须将其映射到真实的驱动器。要想知道这一点,查看/boot/grub/device.map文件。下面提供一个例子。

FILE /boot/grub/device.map
(fd0) /dev/fd0
(hd0) /dev/sda
(hd1) /dev/sdb
Note
当你怀疑/boot/grub/device.map是不准确的, 运行下面的命令重建该文件:
root #grub-install --recheck /dev/sda

基于上述文件,我们知道/dev/sda是引导驱动器。

安装和配置 GRUB2

下一步是为/boot分区安装和配置GRUB2,而不从驱动器的主引导记录(MBR)中删除GRUB Legacy。以下示例使用/dev/sda — 将其替换为正确的引导驱动器路径。

首先必须安装GRUB2文件到/boot/grub

root #grub-install --grub-setup=/bin/true /dev/sda
Installation finished. No error reported.
Warning
选项--grub-setup=/bin/true告知grub-install 不要安装GRUB2到MBR. 如果省略此选项,则GRUB Legacy将被覆盖,并且稍后的从GRUB Legacy加载到GRUB2将不可能。

现在我们可以扫描可用的内核并生成一个合适的配置文件到/boot/grub/grub.cfg。当使用 手动配置时可以跳过这个步骤。

root #grub-mkconfig -o /boot/grub/grub.cfg
Generating grub.cfg ...
Found linux image: /boot/kernel-3.2.12-gentoo
Found initrd image: /boot/initramfs-genkernel-x86_64-3.2.12-gentoo
done
Warning
GRUB2 使用如下配置文件 /boot/grub/grub.cfg 而 GRUB Legacy 使用的是 /boot/grub/grub.conf ,所以请确认没有错误的使用的旧的文件。 例如可以通过tab补全,假如旧文件仍然存在的话。
Note
grub-mkconfig 对 kernels 和 initramfs 镜像有严格的命名要求。 一个内核必须被命名为 kernel-${version} 或者 vmlinuz-${version} ,一个 initramfs 必须被命名为initramfs-${version}.img, initramfs-genkernel-${version}, initramfs-genkernel-${arch}-${version}, initrd-${version}.img, initrd.img-${version}, initrd-${version}.gz, or initrd-${version}. 这些文件必须是可用的在目录 /boot.
Note
这个文件 /etc/default/grub 操控着 grub-mkconfig. 如果需要传递参数给内核 (例如使用genkernel而且从LVM或者软RAID引导时), 在生成/boot/grub/grub.cfg之前你需要编辑配置文件, 像这样:
root #nano /etc/default/grub
看一下GRUB2 configuration在Gentoo Wiki 或者 official GRUB2 manual 来决定如何修改这个文件。 大多数用户需要修改 GRUB_CMDLINE_LINUX 来给内核命令行传递特殊的参数。

从GRUB Legacy加载到GRUB2来进行设置测试

因为一个错误的GRUB配置可能意味着无法引导你的系统,所以我们要测试我们的GRUB2配置,保证其可靠性。为此,我们将从GRUB Legacy中链接到GRUB2。这通过在/boot/grub/grub.conf中添加一个新的部分来完成。一个例子如下所示。

Note
注意,例子中的(hd0,0)根分区可能和你的不同,并确保从 /boot/grub/grub.conf 配置该文件。
FILE /boot/grub/grub.conf
default 0
timeout 30
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
  
title GRUB2 Chainload
root (hd0,0)
kernel /boot/grub/i386-pc/core.img
boot
  
title Gentoo Linux 3.2.12
root (hd0,0)
kernel /boot/kernel-3.2.12-gentoo root=/dev/sda3 quiet dolvm
initrd /boot/initramfs-genkernel-x86_64-3.2.12-gentoo

At this point the machine should be rebooted, and GRUB2 Chainload selected from the GRUB menu when the machine begins to boot. Another GRUB menu will be presented which should advertise itself as GRUB 2.0.0 or higher at the top and show the available kernel(s) to boot. Should this not work, simply reboot the system and pick the normal boot option instead of GRUB2 Chainload.

Replacing and removing GRUB Legacy

If everything worked successfully, replace GRUB Legacy and remove it from the system.

Warning
Since the system has been rebooted, it might be necessary to mount /boot again. Make sure to use the right boot drive path instead of /dev/sda as this is merely an example. If /boot is not mounted before running grub-install, the system will become unbootable.
Note
As previously mentioned, if GRUB2 was emerged with the multislot USE flag then grub2-install must be used instead of grub-install. In this case, after GRUB Legacy is removed from the system in the next step, GRUB2 should be re-emerged without the multislot USE flag so that grub-install and grub-mkconfig can become GRUB2 commands.
root #grub-install /dev/sda
Installation finished. No error reported.

At this point use the package manager to remove sys-boot/grub:0.

root #emerge --ask -vc sys-boot/grub:0

The migration is now complete.

Maintaining GRUB2

Whenever a new kernel is installed, perform the next step so that the GRUB2 configuration recognizes the new kernel (except when using a manual configuration).

Note
Make sure the /boot partition is mounted for this step.
root #grub-mkconfig -o /boot/grub/grub.cfg
Generating grub.cfg ...
Found linux image: /boot/kernel-3.3.8-gentoo
Found initrd image: /boot/initramfs-genkernel-x86_64-3.3.8-gentoo
Found linux image: /boot/kernel-3.2.12-gentoo
Found initrd image: /boot/initramfs-genkernel-x86_64-3.2.12-gentoo
done

This page is based on a document formerly found on our main website gentoo.org.
The following people contributed to the original document: Cardoe
They are listed here because wiki history does not allow for any external attribution. If you edit the wiki article, please do not add yourself here; your contributions are recorded on each article's associated history page.