没有什么事情比 bootloader 坏掉更气人的了,充分发挥 Grub 2 的做用,让 bootloader 安分工做吧。为何这么说?linux
Grub 2 是一款功能强大的软件,它不是 bootloader 界的惟一,但却最受欢迎,几乎全部主流的桌面发行版都在使用它。shell
Grub 的工做有两个:首先,它用一个菜单展现计算机上全部已经安装的操做系统供你选择;其次,当你从启动菜单中选择了一个 Linux 操做系统后, Grub 便加载对应版本Linux 的内核,众所周知,使用 Linux 就离不开 bootloader ,然而它倒是 Linux 发行版内部不多有人充分了解的部分。ubuntu
/etc/default/grub安全
/etc/grub.dbash
/etc/default/grub架构
/boot工具
Linux、 Windows、 BSD布局
Mac OS Xui
/boot/grub/grub.cfg操作系统
/etc/grub.d
/etc/default/grub
图形化的引导修复
多亏了 Boot Repair的应用,咱们只须要点击按钮,Grub 2 就能帮咱们轻易解决不少问题,这个漂亮而小巧的应用有一个比较直观的用户界面,能够扫描并识别多种硬盘布局和分区方案,还能发现并正确识别安装的操做系统,这个应用既能够处理传统计算机里的主引导记录Master Boot Record (MBR),也能够处理新型 UEFI 计算机中的GUID 分区表GUID Partition Table(GPT)。
Boot Repair 最简单的使用方式是安装到 Live Ubuntu 会话中,在一个 bootloader 损坏的机器上启动 Ubuntu Live 发行版,先经过添加它的 PPA 版本库来安装 Boot Repair ,命令以下:
sudo add-apt-repository ppa:yannubuntu/Boot Repair
而后刷新版本库列表:
sudo apt-get update
安装应用,以下:
sudo apt-get install -y Boot Repair
安装完毕后就启动应用,在显示它的界面(由一对按键组成)以前它将会扫描你的硬盘,接下来用户能够根据工具的指示,只需按下 Recommended Repair推荐的修复按钮,便可修复大部分坏掉的 bootloader ,修复 bootloader 以后,这个工具会输出一个短小的 URL (建议把它记录下来),这个 URL 包含了硬盘详尽的信息:分区信息以及重要的 Grub 2 文件(如/etc/default/grub 和 /boot/grub/grub.cfg )的内容,若是工具不能解决 bootloader 的问题,能够把你这个 URL 共享在你的发行版的论坛上,让其余人能够分析你的硬盘布局以便给你建议。
Bootloader 急救
Grub 2 引导问题会让系统处于几种不一样状态,屏幕(本该显示 bootloader 菜单的地方)所展现的文本会指示出系统的当前状态:
你能够经过使用 live CD 或者在 Grub 2 shell 中修正此类错误,若是你够幸运, bootloader 出现了 grub> 提示符,你就能得到 Grub 2 shell 的支配权,来帮助你排错,接下来几个命令工做在 grub> 和 grub rescue> 提示符下, set pager=1 命令设置显示分页pager,防止文本在屏幕上一滚而过,你还可使用 ls 命令列出 Grub 识别出的全部分区,以下:
grub> ls (hd0) (hd0,msdos5) (hd0,msdos6) (hd1,msdos1)
如你所见,这个命令列出分区的同时一并列出了分区表方案(即 msdos)。
你还能够在每一个分区上面使用 ls 来查找你的根文件系统:
grub> ls (hd0,5)/ lost+found/ var/ etc/ media/ bin/ initrd.gz boot/ dev/ home/ selinux/ srv/ tmp/ vmlinuz
你能够不写上分区名的 msdos 部分,一样,若是你忘记了尾部的斜杠trailing slash只输入 ls (hd0,5) ,那你将得到分区的信息,好比文件系统类型、整体大小和最后修改时间,若是你有多个分区,可使用 cat 读取 /etc/issue 文件中的内容,来肯定发行版,格式如 :
cat (hd0,5)/etc/issue
假设你在 (hd0,5) 中找到根文件系统,请确保它包含 /boot/grub 目录,以及你想引导进入的内核镜像,如 vmlinuz-3.13.0-24-generic ,此时输入如下命令:
grub> set root=(hd0,5) grub> linux /boot/vmlinuz-3.13.0-24-generic root=/dev/sda5 grub> initrd /boot/initrd.img-3.13.0-24-generic
第一个命令把 Grub 指向咱们想引导进入的发行版所在的分区,接着第二个命令告知 Grub 内核镜像在分区中的位置,以及根文件系统的位置,最后一行设置虚拟文件系统initial ramdisk文件的位置,你可使用 tab 补全功能补全内核名字和虚拟文件系统initrd: initial ramdisk的名字,节省时间和精力,输入完毕,在下一个 grub> 提示符后输入 boot , Grub 将会引导进入指定的操做系统。
若是你在 grub rescue> 提示符下,状况会有些许不一样。由于 bootloader 未可以找到并加载任何须需的模块,你须要手动添加这些模块:
grub rescue> set root=(hd0,5) grub rescue> insmod (hd0,5)/boot/grub/normal.mod grub rescue> normal grub> insmod linux
如上所示,跟以前同样,使用 ls 命令列出全部分区以后,使用 set 命令标记起来,而后添加 normal 模块,此模块激活时将会恢复到标准 grub> 模式,若是 linux 模块没加载,接下来的命令会进行添加,若是这个模块已经加载,你能够跟以前同样,把引导加载程序指向内核镜像和虚拟文件系统initrd文件,而后使用 boot 启动发行版,prefect!
一旦成功启动发行版,别忘了为 Grub 从新产生新的配置文件,使用命令:
grub-mkconfig -o /boot/grub/grub.cfg
你还须要往 MBR 里安装一份 bootloader 的拷贝,使用命令:
sudo grub2-install /dev/sda
若是想要禁用 /etc/grub.d 目录下的脚本,你只需移除其可执行位,好比使用 chmod -x /etc/grub.d/20_memtest86+ 就能将 ‘Memory Test’ 选项从菜单中移除。
Grub 2 和 UEFI
在支持 UEFI 的机器(最近几年上市的机器大部分都是)调试坏掉的 Grub 2 增长了难度,恢复安装在 UEFI 机器上的 Grub 2 的和安装在非 UEFI 机器上的并没多大区别,只是新的固件处理方式不同,从而致使了不少种恢复结果,对于基于 UEFI 的系统,不要在 MBR 上安装任何东西,相反,你要在EFI 系统分区EFI System Partition( ESP )里安装 Linux EFI bootloader,而且借助工具把它设置为 EFI 的默认启动程序,这个工具对于 Linux 用户是 efibootmgr ,对于 window 用户则是 bcdedit 。
照目前状况看,在安装任何与 Windows 8 兼容的主流桌面 Linux 发行版前,应该正确安装好 Grub 2,若是 bootloader 损坏,你可使用 live 发行版修复机器,在启动 live 介质之时,请确保是以 UEFI 模式启动,计算机每一个可移动驱动器的启动菜单将会有两个: 一个普通的和一个以 EFI 标记的,使用后者会用到 /sys/firmware/efi/ 文件中的 EFI 变量。
在 live 环境中,挂载教程前面所提的安装挂掉系统的根文件系统,除此以外,还须要挂载 ESP 分区,假设分区是/dev/sda1 ,你能够以下所示挂载:
sudo mount /dev/sda1 /mnt/boot/efi
接着在 chroot 到安装完毕的发行版前以前,使用 modprobe efivars 加载 efivars 模块。
Fedora 用户可使用以下命令从新安装 bootloader
grub2-mkconfig -o /boot/grub2/grub.cfg yum reinstall grub2-efi shim
grub2-mkconfig -o /boot/grub2/grub.cfg
命令是来产生新的配置文件。
Ubuntu 用户则改用如下命令
apt-get install --reinstall grub-efi-amd64
一旦 bootloader 正确就位,退出 chroot ,卸载全部分区,重启到 Grub 2 菜单。
Grub 丢失
Grub 2 最好的特性是能够随时从新安装,所以,当其它像 Windows 之类的系统用它们本身的 bootloader 替换后,致使 Grub 2 丢失,你可使用 live 发行版,寥寥数步便可重装 Grub ,假设你在 /dev/sda5 安装了一个发行版,若要重装 Grub ,你只需首先使用如下命令为发行版建立一个挂载目录:
sudo mkdir -p /mnt/distro
而后挂载分区,以下:
mount /dev/sda5 /mnt/distro
接着就能重装 Grub 了,以下:
grub2-install --root-directory=/mnt/distro /dev/sda
这个命令会改写 /dev/sda 设备上的 MBR 信息,指向当前 Linux 系统,并重写一些 Grub 2 文件,如 grubenv 和device.map ,另外一个问题常见于装有多个发行版的计算机上:当你安装了新的 Linux 发行版,它的 bootloader 应当要能找到全部已经安装的发行版,一旦不行,只要引导进入新安装的发行版,并运行
grub2-mkconfig
在运行这个命令以前,请确保启动菜单中缺失的发行版的 root 分区已经挂载,若是你想添加的发行版有单独的 /root和 /home 分区,在运行 grub2-mkconfig 以前,只需挂载包含 /root 的分区,虽然 Grub 2 可以找到大部分发行版,可是在 Ubuntu 中尝试添加安装的 Fedora 系统须要额外的一个步骤:若是你以默认设置安装了 Fedora ,则发行版的安装器已经建立了 LVM 分区,此时你须要使用发行版的包管理系统安装 lvm2 驱动,以下
sudo apt-get install lvm2
执行以后才能使得 Grub 2 的 os-prober 脚本可以找到并将 Fedora 添加进启动菜单。
常见用户设置
Grub 2 有不少可配置变量, 这里有一些 /etc/default/grub 文件中你最可能会修改到的常见变量:
Grub 2 有个命令行模式,经过在 bootloader 菜单上按 C 进入。
完全的修复bootloader
若是 grub2-install 命令不能正常运做,使得你没法引导进入 Linux ,你须要完整地重装以及从新配置 bootloader ,须要用到强大的 chroot 功能将运行环境从 live CD 环境切换至咱们想修复的 Linux 的安装位置,任何拥有chroot 工具的 Linux live CD 均可以实现这个目的,不过须要确保 live 介质的系统架构和硬盘上系统的架构一致,所以若是你但愿 chroot 到 64 位系统,你必须使用 amd64 live 发行版。
启动进入 live 发行版以后,首先须要检查机器上的分区,使用 fdisk -l 列出磁盘上全部分区,记录你想修复的 Grub 2 系统所在的分区,假设咱们但愿从安装在 /dev/sda5 中的发行版中恢复 bootloader 。启动终端使用以下命令挂载分区:
sudo mount /dev/sda5 /mnt
此时须要绑定bindGrub 2 bootloader 须要进入的目录,以便检测其它操做系统:
$ sudo mount --bind /dev /mnt/dev $ sudo mount --bind /dev/pts /mnt/dev/pts $ sudo mount --bind /proc /mnt/proc $ sudo mount --bind /sys /mnt/sys
此时能够离开 live 环境进入安装在 /dev/sda5 分区中的发行版了,经过 chroot :
$ sudo chroot /mnt /bin/bash
如今能够安装、检测、以及升级 Grub 了,跟以前同样,使用以下命令来重装 bootloader :
sudo grub2-install /dev/sda
由于 grub2-install 命令不能建立grub.cfg 文件,须要手动建立,以下
sudo grub-mkconfig -o /boot/grub/grub.cfg
这样应该就能够了,如今你就有了 Grub 2 的一份全新拷贝,罗列了机器上全部的操做系统和发行版,在重启电脑以前,你须要依次退出 chroot 系统,卸载全部分区,以下所示:
$ exit $ sudo umount /mnt/sys $ sudo umount /mnt/proc $ sudo umount /mnt/dev/pts $ sudo umount /mnt/dev $ sudo umount /mnt
如今你能够安全地重启电脑了,而它应该会回退到 Grub 2 的控制之中,你已经修好了这个 bootloader。
添加自定义菜单项
若是但愿往 bootloader 菜单里添加菜单项,你须要在 40_custom 文件里添加一个启动段boot stanza,例如,你可使用它展现一个菜单项来启动安装在可移动 USB 驱动里的 Linux 发行版,假设你的 USB 驱动器是 sdb1 ,而且 vmlinuz 内核镜像和虚拟文件系统initrd都位于根 (/)目录下,在 40_custom 文件中添加如下内容:
menuentry “Linux on USB” { set root=(hd1,1) linux /vmlinuz root=/dev/sdb1 ro quiet splash initrd /initrd.img }
相比使用设备和分区名,使用它们的 UUID 能够得到更精确结果,好比
set root=UUID=54f22dd7-eabe
使用以下命令来得到全部已链接的驱动器和分区的 UUID :
sudo blkid
你还能够为你磁盘上没被 os-prober 脚本找到的发行版添加菜单项,只要你知道该发行版的安装位置以及其内核和虚拟文件系统initrd的位置便可。
免费提供最新Linux技术教程书籍,为开源技术爱好者努力作得更多更好:http://www.linuxprobe.com/