记一次安装 Gentoo 的曲折过程

in #linux8 years ago

安装这个 gentoo 从今早 11:00 开始, 一直到现在 (00:27) 才安装成功, 其中经历了几个曲折.

我的安装是按照 Gentoo 官方手册 http://www.gentoo.org/doc/en/handbook/handbook-amd64.xml 一步步来的, 使用安装介质不是宿主机, 而是同样依照官方教程制作的 LiveUSB: https://wiki.gentoo.org/wiki/LiveUSB/HOWTO, 目标介质是一块 SSD 硬盘.

这里不得不说, Gentoo 的官方手册内容组织的非常合理, 让人能够一口气从头看到尾不遗漏任何内容, 而不是看几节就被纵横交错的链接给绕晕了. Gentoo 的官方手册在安装过程中针对用户不同的情况给出不同的选择, 比如说, 手册既给出了用 fdisk 给磁盘划分 MBR 分区的方法, 也给出了用 parted 给磁盘划分 GPT 分区的方法. 这里我选择的是使用 GPT 分区格式.

继续看手册, 如果使用 GPT 分区格式这条安装途径的话, 那么还需要创建一个 BIOS Boot Partition, 这个分区是用来给 grub 存放 stage2 阶段代码的. 很显然, 手册里介绍的途径是针对 GPT/BIOS-legacy 的情景, 不过这点手册里没有说明, 我觉得需要说明一下, 因为 UEFI, BIOS-legacy 两种启动模式对分区的要求是不一样的, 如果用按照手册的途径安装好了, 但是主板设置的是 UEFI 启动模式, 那么他所安装的 gentoo 系统将会启动不了.

我照着手册一路顺利的装好了 gentoo, 然后重启进入新的系统. 这时候问题来了, 通过 BIOS 的临时启动介质菜单选择了我的 SSD 硬盘之后, 发现启动不了, 按回车后直接屏幕一闪然后回到临时启动介质的选择菜单界面. 一看就知道, 这是连 grub 引导程序都没进. 这是怎么回事呢?

起初我以为我粗心大意没有装好 grub, 比如没有把 grub 安装到 SSD 的第一扇区, 或者少了某一步配置. 于是我找回官方手册把可能遗漏的地方重新做了一遍, 仍然不行. 后来我又想到官方手册一句话:

Some buggy BIOSes or EFIs configured to boot in BIOS/CSM/legacy mode might also have problems with booting from GPT labeled disks. If that is the case, you might be able to work around the problem by adding the boot/active flag on the protective MBR partition which has to be done through fdisk (parted understands the GPT tables and would not show the protective MBR partition):

于是我打算用 fdisk 看一下 SSD 上 GPT 分区表里的 protective mbr 中第一个分区的 avtive/boot 标志是否打上了. 谁知我靠我制作 LiveUSB 用的 gentoo 镜像太新了, fdisk 已经能够认出 GPT 分区表了. 我 fdisk --help 一下, 果然, 可以通过 -t 选项来强制 fdisk 将硬盘认为是 mbr 分区表. 进去一看, active/boot 标识也打上了, 看来跟这也没关系.

然后我又想难道是我主板限制了只以 UEFI 启动? 重启 F1 进去一看, 靠, 选的启动方式是 Both, 而且是 Legacy First, 这个可能性也排除了.

fuck, 想不出别的原因了啊, 难道 chroot 的时候忘了挂载什么分区之类的? 我头皮一硬, 索性重装一遍吧!

此处省略上面的篇幅那些个字儿.

靠, 这次仔仔细细完全按手册重装了一遍还是不行! fuck! 惹我是吧, 真以为我没招了? 最后我决定 google.

观察到的症状明显的是 BIOS 加电自检成功完成, 但是无法从选定的 SSD 硬盘上引导, SSD 上的引导程序 (grub) 没有被执行, 如果被执行了的话, 肯定至少会出来个内核选择的菜单. 所以说这个问题和我编译的内核肯定没关系, 排除编译内核时少选了选项之类的可能. 那么仔细想想这个问题也就出在 GPT, grub 或者 BIOS 上, 于是我先 google 了 "GPT can not boot from bios", "gpt grub bios cant not boot", 在检索的结果中竟然发现了 X220 won't start grub 的字眼, 我擦, 我笔记本就是 Thinkpad X220, 难道这问题和 X220 有关? 于是我开始 google "X220 gpt bios", 擦, 果然如此, 让我搜到了问题的根源:

看楼主在 8 楼的总结: https://bbs.archlinux.org/viewtopic.php?id=122352, 以及前面那个链接里的楼主在他博客里的总结: http://blog.jamiek.it/2011/10/arch-linux-on-thinkpad-x220.html 里面有一个 Note 点名了 X220 无法从 BIOS-legacy 模式启动 GPT 分区的 SSD 硬盘, 所以这篇文章聚焦了如何以 GPT/UEFI 方式安装 Gentoo: http://www.thinkwiki.org/wiki/Installing_Gentoo_on_a_ThinkPad_X220

总之原因搞清楚了, 至于为什么 X220 不支持 BIOS-legacy 启动 GPT 就不想深究了, 或许找找联想官方有没有提供新版本的 BIOS 固件能够解决但是太麻烦且升级 BIOS 风险相对大.

那么问题来了, 电脑维修技术那家强? 哦不对, 真正的问题是如何绕过 GPT/BIOS 的方式, 有两个途径, 一是选择 msdos/BIOS-legacy, 一是选择 GPT/UEFI, 略微思考, 我选择了后者.

参照上面给出的那个链接: http://www.thinkwiki.org/wiki/Installing_Gentoo_on_a_ThinkPad_X220, 再加上下面这两个 Gentoo 官方的链接:

当然还有最开始提及的手册, 我终于差点就搞定了, 就在我以为我要搞定的时候, 在倒数第二步我又碰到了一个问题, 那就是执行 grub2-install --target=x86_64-efi --efi-directory=/boot/efi /dev/sdb 时报了这样一个错误:

Fatal: Couldn't open either sysfs or procfs directories for accessing EFI variables.
Try 'modprobe efivars' as root.

然后我照着运行了一下 modprobe efivars, 问题依旧, 我又 google 了一下, 在这个页面里得到了启发: http://superuser.com/questions/376470/how-to-reinstall-grub2-efi.

啊, 原来想要把 grub efi 引导程序装进目标介质, 当前安装介质必须是以 UEFI 模式启动的!! fuck! LiveUSB 为了能够从各种主板启动, 往往都是 MBR 分区格式的, 哪里支持从主板的 UEFI 模式启动!! 发行版出个这样的 LiveUSB 有个毛意义?!

但是转念一想, 这跟发行版一点关系没有, 导致我折腾到现在的归根结底的原因还是 ThinkPad X220 不支持从 BIOS-legacy 模式启动 GPT 硬盘! 所以我应该骂 X220 才对! 靠, 傻逼 X220!!

那么问题来了, 电脑维修... 啊不, 到底怎么解决这个问题呢? 这时我突然灵光一闪, 对了我本机的 debian 系统是 GPT 分区的呀, 当时安装 debian 时装的是 grub efi 模式呀, 虽然主板设的是 BIOS-legacy First, 但是启动 debian 时, 却是从 UEFI 启动的呀! 另一方面, grub 的二进制程序等等系统环境已经安装到 SSD 里了, 那么我只需要进入 debian, 然后挂载 SSD, chroot 进去, 执行 grub2-install --target=x86_64-efi --efi-directory=/boot/efi /dev/sdb 就可以啦!

...................., 几分钟后, 果然, 终于我新装的 Gentoo 启动起来了.

附记 1

最后补充一下, http://www.thinkwiki.org/wiki/Installing_Gentoo_on_a_ThinkPad_X220 这个链接给出的安装步骤很多都是不需要的, 因为实在不想写了, 所以我简单记录一下, 要使得 grub 以及磁盘分区支持 UEFI 启动模式, 只需要注意如下几个点:

  • 给目标介质 (我们这里是 SSD) 分区时, 分一个 200 MiB 的分区 (最大也不需要超过 512 MiB), 并加上 gpt 分区表的 boot 标识, 这个分区之后挂载到 /boot/efi 上
  • 那么 /boot 分区就不许要额外分了
  • emerge sys-boot/grub 之前, 修改 /etc/portage/make.conf 添加上 GRUB_PLATFORMS="efi-64"
  • grub2-install 时指定 --target 和 --efi-directory
  • grub 的配置文件, menu entry, 仍然安装到 /boot/grub 即可[1]: grub2-mkconfig -o /boot/grub/grub.cfg

[1]: 在不选择支持 UEFI 时 (BIOS-legacy 时), grub 的相关文件就是安装到 /boot/grub 目录的.

附记 2

系统如果是以 UEFI 模式启动的, /sys/firmware/efi/ 目录是存在的.

Sort:  

@cifer, 这是小可可我在steemit最好的邂逅,好喜欢你的贴(^∀^)哇~~~ img

@cifer, 你真是好写手啊!

顺祝狗年大发,赚10000个比特币哟!

好奇问下gentoo是什么?

一种Linux系统,特点是鼓励你把所有软件都从原始码建起 (*´_ゝ`) 属于对电脑要求比较高(要自己建软件)和比较难使用的Linux操作系统。

哦,就是给爱折腾的人准备的东西。

就…比较偏向学习工具吧 |・ω・`)

我安装Arch都已经快吐血了,在这里见证多一位高人成功装下难度更高的Gentoo。OTL

恭喜安装成功啊 (´∀`)

谢谢😜 arch 挺好的, gentoo 太烧 cpu 了。。。

我可以想象别人告诉我进行一次完整系统升级需要5小时的感受 (″ロ゛) 老实说Gentoo学习价值高过实用价值啊。

Coin Marketplace

STEEM 0.04
TRX 0.31
JST 0.074
BTC 63571.03
ETH 1680.88
USDT 1.00
SBD 0.41