《Linux就该这么学》是由全国多名红帽架构师(RHCA)基于最新Linux系统共同编写的高质量Linux技术自学教程,极其适合用于Linux技术入门教程或讲课辅助教材。
分类: LINUX
2016-05-12 07:51:29
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 共享在你的发行版的论坛上,让其他人可以分析你的硬盘布局以便给你建议。
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’ 选项从菜单中移除。
sudo mount /dev/sda1 /mnt/boot/efi接着在 chroot 到安装完毕的发行版前之前,使用 modprobe efivars 加载 efivars 模块。 Fedora 用户可以使用如下命令重新安装 bootloader
grub2-mkconfig -o /boot/grub2/grub.cfg yum reinstall grub2-efi shimgrub2-mkconfig -o /boot/grub2/grub.cfg 命令是来产生新的配置文件。 Ubuntu 用户则改用以下命令
apt-get install --reinstall grub-efi-amd64一旦 bootloader 正确就位,退出 chroot ,卸载所有分区,重启到 Grub 2 菜单。
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 添加进启动菜单。
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。
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技术教程书籍,为开源技术爱好者努力做得更多更好: