早就听说 Gentoo 是一个高度可定制,能够很好的发挥机器性能的 linux 系统,作死的我来安装试试。

因为 Gentoo 是基于源码分发的系统,所有软件均需要自己编译,不想在自己电脑上折腾,就在百度云的云主机BCC上实验。

使用的云服务器情况如下,使用云服务器的 VNC 功能可以连接到云服务器的图形化桌面

  • 系统盘: /dev/vda1 大小40G 系统格式ext4
  • 数据盘: /dev/vdb1 大小20G 系统格式ext4

系统盘(/dev/vda1)中已经安装有 ubuntu20.04系统,将 Gentoo 安装到数据盘(/dev/vdb2)。

服务器架构

查看服务器架构是 kvm 还是 zen 等,后续编译内核有用,百度云BCC 的是 kvm 架构。

Debian/ubuntu 安装 virt-what

  1. apt-get install virt-what

 安装完直接运行命令

  1. virt-what

image.png

安装

官方的安装教程写的十分详细,按照教程来就行,一次不行就多试几次,自己也是安装了很多次才成功

https://wiki.gentoo.org/wiki/Handbook:AMD64/Installation/Media/zh-cn

系统下载

去阿里云镜像站下载就好,国内下载速度快一点,根据自己系统下载 install-xxx.iso 和 stage3-xxx 两个文件。

http://mirrors.aliyun.com/gentoo/releases/

64 位的下载地址如下:

http://mirrors.aliyun.com/gentoo/releases/amd64/autobuilds/current-install-amd64-minimal/

下载下面两个文件
image.png

从iso启动

由于是服务器,没法使用 U 盘,这里直接从 iso 启动,将下载的 iso 文件放在根目录下,然后编辑启动项:

编辑 /etc/grub/40_custom

  1. menuentry 'Gentoo' --class gnu-linux --class iso {
  2. search --no-floppy --fs-uuid --set=root 07329829-7140-41f8-a844-80722c167f39
  3. set isofile="/gentoo.iso"
  4. loopback loop $isofile
  5. linux (loop)/boot/gentoo root=/dev/ram0 init=/linuxrc dokeymap looptype=squashfs loop=/image.squashfs cdroot initrd=gentoo.igz isoboot=/gentoo.iso
  6. initrd (loop)/boot/gentoo.igz
  7. }

下面这些选项一定不要写错或者漏掉,否则无法加载成功

root=/dev/ram0 init=/linuxrc dokeymap looptype=squashfs loop=/image.squashfs cdroot initrd=gentoo.igz isoboot=/gentoo.iso

更新 grub

update-grub

使用阿里源

在 /etc/portage/make.conf 中添加或修改

  1. GENTOO_MIRRORS="http://mirrors.aliyun.com/gentoo/"

并行编译

使用 lscpu 查看当前cpu 有多少核心,即 cpus 后面的数字

在 /etc/portage/make.conf 中添加或修改

  1. MAKEOPTS="-j2"

编译内核

内核构建基础

https://zhuanlan.zhihu.com/p/110765457

由于是在 kvm 虚拟机上编译内核,所以虚拟相关的支持一定要打开,不然会无法识别虚拟硬盘和设备,导致系统无法启动。

Gentoo 内核配置手册

https://wiki.gentoo.org/wiki/Handbook:AMD64/Installation/Kernel/zh-cn

查看硬件

lspci

可以看到当前服务器上虚拟的各种设备,包括虚拟网卡、磁盘等,所以编译内核时一定要将虚拟化支持编译进内核。
image.png

内核配置

进入内核源码目录后,使用 make menuconfig 命令进入内核设置的图形化界面
(*代表编译到内核,M代表编译但只在需要时候才加载)

除了Gentoo 手册中列出的,下面的选项一定要开启(不同内核版本入口可能不同,多找找)

启用devtmpfs支持

Device Drivers —-> Generic Driver Options —-> [*] Maintain a devtmpfs filesystem to mount at /dev [ ] Automount devtmpfs at /dev, after the kernel mounted the rootfs

启用SCSI 磁盘支持

Device Drivers —-> SCSI device support —-> <> SCSI disk support <> NVIDIA SATA support

启用文件系统支持

File systems —-> <> Second extended fs support <> The Extended 3 (ext3) filesystem <> The Extended 4 (ext4) filesystem <> Reiserfs support <> JFS filesystem support <> XFS filesystem support <> Btrfs filesystem support DOS/FAT/NT Filesystems —-> <> MSDOS fs support <*> VFAT (Windows-95) fs support

Pseudo Filesystems —-> [] /proc file system support [] Tmpfs virtual memory file system support (former shm fs)

启用多核处理功能(现在的CPU基本上都是多核的)

Processor type and features —-> [*] Symmetric multi-processing support

启用虚拟化支持

—- Virtualization
<> Kernel-based Virtual Machine (KVM) support
<
> KVM for Intel processors support
<> KVM for AMD processors support
[
] Audit KVM MMU

<*> Host kernel accelerator for virtio net

[*] Cross-endian support for vhost

启用虚拟硬件支持(百度云服务器使用了 qemu)

Firmware Drivers —->

<> QEMU fw_cfg device support in sysfs [] QEMU fw_cfg device parameter parsing

Device Drivers —->

[] Virtualization drivers —-> [] Virtio drivers —->

根据自己硬件和需要配置其他选项,选项越多,编译需要的时间以及编译得到的内核就越大。

参考安装virtio驱动 & 升级内核

https://www.cnblogs.com/dissipate/p/13749422.html

配置完后保存,会保存在当前目录的 .config 文件中

配置文件

内核配置这一步很容易出问题,如果没有配置合适,可能找不到硬件系统无法启动。

使用下面命令更新上一步的 .config 文件,确保现在使用的模块被编译进内核,开启 kvm 支持。

  1. make localyesconfig # 将当前使用的模块编译进内核
  2. make kvmconfig # 开启 kvm 支持

检查是否开启了虚拟磁盘支持

  1. cat .config | grep CONFIG_VIRTIO

检查输出中是否有下面两项

CONFIG_VIRTIO_BLK=y

CONFIG_VIRTIO_PCI=y

编译安装内核

配置完成后编译安装内核

  1. make -j4 && make modules_install
  2. make install

问题

报错1

Please append a correct “root=” boot option

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown block(0,0)

出现上面的提示的话,一般是内核编译过程中编译配置不对,没有开启相应硬件的支持,需要重新编译内核,或者是grub 文件配置不对,可以参考

  1. https://wiki.gentoo.org/wiki/Knowledge_Base:Unable_to_mount_root_fs

  2. https://forums.gentoo.org/viewtopic-t-473695-highlight-unknownblock+0+0.html