Gentoo Linux

(2022年7月17日修订)

如何正确使用本教程:起初这个教程主要适用于新手快速了解和安装 Gentoo,未曾想到会有越来越多的朋友开始使用,并且开始无脑复制粘贴。这令我十分担心,因为我并没有能力做到十全十美,所以,各位在使用本教程开始你的 Gentoo 之旅的时候,请小心行事。

  • 在你理解本教程的基础之后,请严格按照 Gentoo 官方 Wiki 操作;
  • 不要一味复制粘贴;
  • 用脑子思考,不是屁股;
  • 如果有任何问题,请在下方留言。

简短的介绍:

相信需要看这篇文章的朋友已经对这个基于源的发行版有初步了解。在整个 Linux 系统中,安装难度和维护的天花板是 LFS(关于 LFS 的问题请参考 LFS 的相关文档,此文并未提及)。之后就是 Gentoo Linux 了,那么为什么我们要用发行版呢?为什么这个 Linux 发行版值得大家作为自己的生产力操作系统呢?

  1. 灵活性,Gentoo Linux 通过一个叫做 USE 的功能实现对系统最优化配置,安装系统的人员(下面我叫系统管理员),要对自己需要什么,系统用来做什么,系统的构成,做到心中有数。而 USE 的意义就在于此,能够最大化帮助系统管理员管理系统,优化系统;
  2. 高效性,因为 Gentoo Linux 的安装决定了这个系统本身甚至比 Archlinux 更加 KISS(Keep It Simple And Stupid),因 USE 能够为系统减负,构建更小、更高效的系统;
  3. 时刻保持最新,这个观点因用户选择的更新通道不同而区别,在 ~amd 这个更新通道,大部分软件能够时刻保持最新,如果是 amd64 稳定分支,有时候软件不一定是最新版本。其余的情况就看 Gentoo 开发社区是否有人手能够维护。
  4. 开发者的天堂,Gentoo 和 Archlinux 都是最接近源代码的发行版。唯一的区别就是 Archlinux 的打包和对软件的测试是通过 PKGBUILD 在远程服务器完成的,而 Gentoo 则是在本地进行编译,那么对于开发者而言,本地测试编译其实更为方便。

有朋友会问,我是否适合使用 Gentoo?我的回答是,如果一个人愿意学习游泳,还是应该亲自到水里试一试。

目前在 Linux 社区回馈上游开发者最快,最高效的发行版有三个,Fedora,Archlinux 和 Gentoo Linux。在你选择使用 Gentoo 发行版作为自己的主力系统时,作为系统管理员应该要具备以下素质:

  1. 稳定的情绪
  2. 沟通的艺术
  3. 取舍的艺术
  4. 查询的艺术
  5. 强大的心脏

好了,大家是否准备好了?我们准备开始。

安装 Gentoo Linux 到你的计算机中

我把这个过程分为三阶段。

  1. 安装基本系统阶段;
  2. 完善系统安装阶段;
  3. 完成系统安装阶段。

安装基本系统阶段:

基础知识:

  • USE 是什么?软件从源代码成为可执行的二进制程序的过程中,需要编译,编译需要依赖,需要优化,需要补丁…这一切的目的是让软件为系统管理员服务。那么系统管理员需要什么?软件最佳运行状态,速度要快,稳定性强,bug尽可能少…USE就负责这个,让软件的源代码成为可执行的二进制程序的过程中尽可能的得到定制,最终让系统管理员使用方便、得心应手。我们常使用查看软件 USE 的工具是 equery 这个命令,这个命令可以后面通过 emerge 命令安装 gentoolkit 包实现安装和使用
  • portage 和 emerge 是什么?protage 是 Gentoo Linux 的核心,而 emerge 作为它的包管理器。
  • 理解目录 /etc/portage/package.use/这个目录里存放自己对每个软件的 USE 自定义,每个软件包根据自己的喜好进行取舍。可以创建一个文件,将所有自己定义的包和 USE 写入,也可以分别写,大概的格式保持 <包分类>/<包> <USE flags> 。每个 <USE flags> 用空格分开,如何在终端中查询每个包的 USE flags 呢?使用 equery u <包名> 查看。
1-1 这是我每个软件的 USE 定义
1-2 注意书写格式

每个你需要自定义的软件包,使用该软件的名字,明确的记录在 /etc/portage/package.use/ 这个目录下,而后写入这个包的完整名称,比方说上(图1-2)所示,需要打开的功能只需要将该 USE 名称写在包名后面即可,中间用空格分开,如果不需要该 USE 功能,用“-”号就可以了。

  • 理解目录 /etc/portage/package.mask/ 的内容,mask 的中文意思名词含义是“面具”,它的动词含义是“隐藏,伪装”。在 Gentoo 的安装和后续维护过程中,我们可能存在需要安装某一个特点版本的软件,比方说 foo-1.1(举例子,现实中并不存在这个软件) 这个软件,那么安装过程中 emerge 无法编译通过,然后我们知道 foo-1.0 的版本是可以用的,也能顺利通过 emerge 的编译,那么我们就可以通过在这个目录中添加包名,定义需要安装的版本就可以了。以刚才这个情况为例,我们就可以在 /etc/portage/package.mask/ 目录下创建一个名字叫做 foo 的文本,指定目前只能安装 foo-1.0,那么书写起来是这样的:

>=xxx/foo-1.1::gentoo

这样,包括 foo-1.1 在内以及以上版本都被 mask(隐藏了),对于 emerge 而言,它只会为你安装 foo-1.1 版本以前的软件。

  • 理解目录 /etc/portage/package.accept_keywords/ 的内容。默认情况下,这个目录需要用户自己创建。那么,这个目录有什么用?就像它的名字一样——“可接受的关键词”,里面可以添加我们需要安装的软件版本。还是用 foo-1.1 这个软件为例,假设默认情况下会安装 foo-1.1 这个版本的软件,我们可以通过在该文件夹下新建一个以 foo (以该报名取名,这样将来维护起来更加方便)为名的文本,里面的内容主要包括两种,一种是定义使用最新版本的 foo 软件,书写样子类似于 xxx/foo ~amd64 ,或者你对自己的维护能力非常有自信,可以定义最新的 Github 版本,书写样子类似于 =xxx/foo-9999 **
这是我自己定义 zfs 版本的内容
  • 理解 /etc/portage/make.conf 这个文件。这里定义整个系统在构建的过程中按照怎样的规则来进行编译,具有一定的全局属性。比方说编译器的选择,系统语言的设定,使用什么特性来编译,系统架构,显卡类型等等。稍后我们具体编辑的时候,再细谈。

好了,以上知识点只是能够安装和后续维护好 Gentoo 的冰山一角,还有很多细枝末节的内容,需要各位在具体操作过程中查阅官方文档。这里地址就不详细给出了,毕竟这里就是“查询的艺术”了。

选择一个靠谱的 ISO LiveUSB 作为引导和第一部分安装的基石:

这里推荐大家使用我做的 Archlinux LiveUSB ISO,现在已经更新为 xfce 的桌面,可以在启动完成之后,输入 startxfce4 即可进入桌面环境开始安装系统,详情可以到 github 下去看说明,下载地址在我的 Github 上,地址

为什么用我自己的 ISO 呢,一方面这个 ISO 里面自带了所有 zfs 文件系统的工具,另一方面,Archlinux 有个叫做 genfstab 的工具,能够非常快速的搞定 /etc/fstab 的编辑工作。非常方便。最后是我在这个 ISO 中集成了 nano, wget, sgdisk, fdisk 命令,主要是方便我自己的操作,如果你也习惯这几个工具那就太棒了。如果你使用其他发行版的 ISO,个人推荐 Fedora,这个发行版比较纯正,没有太多乱七八糟的东西。当然比方说 Debian,Ubuntu 或者 Manjaro 都是可以的。不过后来有朋友建议我加上 Ubuntu 的 ISO 作为启动镜像,原因是 Ubuntu 现在最新版本的ZFS已经开始使用 v2.0 版本了,所以,如果想选择具有 GUI 操作界面还能够使用到 ZFS ,可以考虑 Ubuntu 的 ISO;使用 manjaro 的 ISO 来创建,主要原因是 manjaro 的 ISO 自带了 nvidia 的似有驱动,这样能够避免不少朋友加载 nouveau 的时候出现问题。当然,如今 Nvidia 开源了内核模块的源代码,后续折腾会简单很多。

分区和创建文件系统:

接下来,就是为后续的 Gentoo Linux 系统进行磁盘分区和创建文件系统。这个过程我将会同时提到传统的 Linux 树内文件系统磁盘分区和 ZFS 文件系统的分区和创建。

传统的 Linux 树内文件系统分区和创建文件系统:

一般来说,目前的计算机引导都采用 UEFI 来实现启动,而传统的 BIOS 用的越来越少,这里就不谈后者。对于 UEFI 的引导,具体可以分为两种分区方案,一种是单独分区 “/efi“ “/boot” 和 ”/“ ,另一种是单独分区 “/boot" 和 “/” 两个目录。这里因为是树内文件系统,还有朋友需要单独分区 “/home” “/opt” 等等的就大家自行搞定了,其实很简单。

那么分区的工具有很多,我个人选择两个,一个是使用 sgdisk 来抹掉硬盘信息,一个是 cfdisk 来创建分区。假设你的硬盘是 sda 或者是 nvme0n1,那么首先保险的方法是用 sgdisk 来抹掉这个硬盘,命令是这样的:

sgdisk --zap-all /dev/sda 或者 sgdisk --zap-all /dev/nvme0n1

这一步很重要,不过,更重要的是,在这之前确定你的硬盘没有创建过 md 阵列和 lvm 阵列,如果使用过还需要额外的操作删除阵列设备(相关操作参考如下两个文档,md 删除阵列lvm 删除阵列),再进行硬盘设备的抹除操作。

好了,抹除之后我们使用 cfdisk 来对硬盘进行分区。这是一个 CLI 的工具。长相大概和下图一致:

这是盗图

大家注意实际操作是这样的:

cfdisk -z /dev/sda 或者 cfdisk -z /dev/nvme0n1

这时会弹出一个选择,我们使用 GPT 的磁盘分区列表(目前大部分 EFI 都可以选择 GPT),其他的就不用管了。

P.S 这里需要强调的是,如果系统采用 BIOS 传统引导,GPT 和 DOS 都是可以选择的。

下面就是对每个分区大小进行定义,/efi 这个目录一般存放都是证书什么的,空间大小一般是16KB的大小,如果各位是单独分区 /efi /boot / /home 这一类的,那么 /efi 的空间限定在 8KB 就足够了。那么 /boot 分区的小一般根据各位使用,具体考虑,一般512MB就够了,里面主要存放内核初始化镜像,还有相关的一些文件,如果不是把玩内核的朋友,1G足够了,如果喜欢把玩内核,多系统启动等等,就定义大于1GB,这样稳妥一些。而后关于 / /home 这些分区大小定义,我就不赘述了,大家根据自己的喜好随意搭配。

完成了这一步,就是设置分区类型,/efi 设置的分区类型选择顶部的 EFI 就可以了。其他的大家可以随意,只要选择 Linux 文件系统就行。

完成后,先选择 Write ,它会问题是否写入之类的,输入 yes,然后退出即可。

那么关于上面这个小部分,如果使用 ZFS 文件系统其实也差不多,唯一的区别在于 ZFS 文件系统的类型大家选择下面的 Solaris /usr & Apple ZFS 就可以了(不选择保持默认也没事)。另外根据我自己的使用习惯,没有必要单独分区 / /boot /efi ,后续维护太累,当然,如果各位有能力,可以单独分区的。

搞定了分区,我们开始创建分区对应使用的文件系统。

这里大家记住一个最重要的就足够了,/efi 分区使用 vfat 文件系统格式,如果不单独分区 /efi ,那么 /boot 分区使用 vfat 文件系统格式。

而关于 Linux 树内文件系统大家就按照自己的意愿进行格式化操作就可以,命令是 mkfs.xxx 来创建文件系统。

随后我们通过命令来将这一系列的分区挂载到 LiveUSB 下。首先是创建一个 /mnt/gentoo 目录。

mkdir -p /mnt/gentoo

首先将我们的 / 目录挂载到这里:

mount /dev/sdaX /mnt/gentoo

随后是创建 /mnt/gentoo 下的 /boot 目录(当然,如果你单独分区了 /efi ,还需要创建 /boot/efi 目录)

mkdir -p /mnt/gentoo/boot 或者 mkdir -p /mnt/gentoo/boot/efi

随后将相应的分区挂载上去。

mount /dev/sdaX /mnt/gentoo/boot 或者 mount /dev/sdaX /mnt/gentoo/boot/efi

而 ZFS 在这里就开始复杂了。

假设我们的只创建一个 / 目录的 ZFS 文件系统,/ 目录使用 /dev/sdaX ,那么就可以通过下面的命令来创建:

zpool create \
-o ashift=12 \
-o cachefile= \
-O compression=zstd-fast \
-O normalization=formD \
-O acltype=posixacl \
-O relatime=on \
-O xattr=sa \
-O mountpoint=none \
-R /mnt/gentoo \
rpool /dev/sdaX \  ## 最好是 /dev/disk/by-id 设备,这样后面设备出现问题,方便我们很快定位出问题的硬盘设备,方便更换
-f

这个是我常用的形式,如果各位想要根据自己的使用情况可以去查阅 OpenZFS 的文档,比方加密等等。

解释:

  1. 默认 ZFS 作为根目录的时候,不能使用 zstd 的透明压缩模式,目前还不支持
  2. rpool 是我自己给自己 ZFS 文件系统取得名字,大家可以根据自己的喜好重新定义
  3. 个人经过一年多的摸索,不建议小内存用户使用 ZFS 作为根目录

然后我们来通过以下命令完成 ZFS 在 LiveUSB 模式下的挂载:

zfs create -o canmount=off -o mountpoint=none rpool/ROOT

(rpool 下创建一个名字叫做 ROOT 的,没有挂载点的 dataset)

zfs create -o mountpoint=/ -o canmount=noauto rpool/ROOT/default

(rpool/ROOT/ 下创建一个 default 的 dataset,挂载点是 / 目录,不自动挂载)

这里就可以创建 /mnt/gentoo 目录了,命令还是:

mkdir -p /mnt/gentoo

再用命令将 rpool/ROOT/default 挂载到 /mnt/gentoo 下:

zfs mount rpool/ROOT/default

这里大家要明确一点,ZFS 文件系统是 Linux 树外文件系统,管理它的是 ZFS 本身,所以,如果你选择使用 ZFS 文件系统,fstab 对它是无效的,也不用把 zfs 文件系统相关挂载信息和定义写进去,因为 ZFS 自己处理自己。

下面就是创建 /boot 或者 /boot/efi 分区,这里再次强调,如果使用 ZFS 系统,单独分区 /boot/ 就可以了,单独分区 /efi /boot / 是没有必要的,反而增加后续维护难度。

mkdir -p /mnt/gentoo/boot

mount /dev/sdaX /mnt/gentoo/boot

完成了文件系统的挂载之后,可以使用 df -h 来查看下我们需要挂载的内容是否正确,如果是 zfs 文件系统,可以配合 zfs listdf -h 一起查看。

确认无误后,开始准备 stage3 和配置目标 Gentoo Linux 的配置,为下一步 chroot 做准备。

在国内,stage3 的镜像源有好多,我主要用的中科大的,清华的都可以。那么大家进入到这些镜像地址后,我们寻找 gentoo ,然后按照这个目录去寻找 stage3:

/gentoo/releases/amd64/autobuilds/

大家看到样子应该类似于下图1-3:

1-3 stage3

这里我默认大家使用 64 位系统,默认使用 systemd 而不是 openrc,当然,如果各位不喜欢 systemd 就选择 current-stage3-amd64 那个目录去下载对应的 stage3 包就可以了。

那么假定我们后续使用 systemdstage3,我们去 1-3 图红色箭头所指的目录下去下载 stage3 包到 /mnt/gentoo 目录下:

cd /mnt/gentoo
wget https://mirrors.ustc.edu.cn/gentoo/releases/amd64/autobuilds/current-stage3-amd64-systemd/stage3-amd64-systemd-XXXXXXXXXXXX.tar.xz ##不要完全复制粘贴,版本号会随时间改变

(这个地址不是永久有效,请各位看官根据实际情况修改地址)

下载完成后,我们解压这个包就成为我的根目录,命令是这样的:

tar xvpf stage3-amd64-systemd-XXXXXXXXXXXX.tar.xz
或者 xz --xattrs-include='*.*' --numeric-owner

解压完成后,我一般会删掉这个包,用 rm 命令就可以了,然后配置我们的 Gentoo Linux /etc/fstab 文件。

用 Archlinux 的 LiveUSB ISO 的小伙伴们这里就使用一条命令搞定:

genfstab -U /mnt/gentoo >> /mnt/gentoo/etc/fstab

完成后,你可以 cat 或着 nano 自定义下,因为我自己使用 ZFS 文件系统,所以用 nano 进去把 zfs 文件系统那个部分注释掉。

我自己的 fstab 是这样的:

1-4 我自己服务器的 fstab

如果各位的 ISO 不是我给大家制作的那个,比方你用 Fedora,Ubuntu 等等,那么这里可以模仿我的写。可以用空格,也可以用 Tab ,无所谓的。

解决了 fstab,我们的下一个目标就是定制自己的 Gentoo Linux 了,这里我们需要配置 /mnt/gentoo/etc/portage/make.conf /mnt/gentoo/etc/portage/package.use//mnt/gentoo/etc/portage/repos.conf/gentoo.conf 这些文件。《论语》中有句话,叫做“欲速则不达”,大家没有必要把自定义部分写的太死,我的意思是,放开一点,因为首要目标是先完成第一部分构建,完成 Gentoo Linux 的基础系统,尽快脱离 LiveUSB ISO ,后面进入系统配置才方便。

我给大家看看我的 make.conf没有 chroot 之前,位置在 /mnt/gentoo/etc/portage/make.conf ,chroot 之后,位置在 /etc/portage/make.conf文件内容:

1-5 我自己的 make.conf 配置

解释:

  1. 这里不需要一开始就 -Ofast ,我们 -O3 就可以了,要不 python 在编译的时候过不去。但是 -march= 一定要加上,这样 GCC 在编译软件的的时候,能够为 CPU 优化。关于 -march= 后面怎么加,大家可以参考这里
  2. 这里填写的是 CPU 的指令集,这些指令集能够在支持的时候,提供优化,那么怎么才知道这些指令集呢,这里先不着急,我们待会儿 chroot 完成之后再弄,这里大家可以不用填,或者先注释掉。
  3. MAKEOPTS="-jX" 的目的是让系统CPU实现多线程编译,这样后续安装软件能快很多(请注意,并不是将自己所有线程数全部填满,考虑到部分初学者使用配置较低的硬件安装系统,推荐写一半以下的线程数就可以了,比方说你的处理器是8核心16线程,就写一个8以下的数字就可以了)
  4. ACCEPT_KEYWORDS="~amd64" 是启用测试模式,我们后续安装的软件都会是最新版本,如果不添加,默认给你安装的软件是稳定版本,那么,如果各位的应用场景是服务器或者是求稳定的,就不要开这个,默认就好;ACCEPT_LICENSE="*" 这里推荐大家就这样填写,否则有些软件授权协议不同,影响安装进度。
  5. 这里设置的是语言环境和系统语言,这样将来系统安装 firefox,libreoffice之类的软件时,就不会将其他各种国家语言编译进去了。
  6. GRUB_PLATFORMS="efi-64" 强调了,系统是 efi-64 位的系统。如果默认大家使用 grub 作为 bootloader ,那么这里是需要填写的,如果使用 systemd-boot 就不需要了。
  7. VIDEO_CARDS="" 这个部分大家根据自己的计算机显卡类型选择,我这里给大家提点一下,Intel 的就写 intel i915 i965,如果是 Nvidia 就写 nvidia,如果是 AMD 的,大家要查一查是第几代 AMD GPU ,可以和通过这个地址查阅到,然后填写进去就可以了。
  8. 这里关于 ruby 的地方,RUBY_TARGETS="ruby30",这里大家是否定义可以随意。
  9. 这里定义虚拟机和交叉编译的环境,如果大家不需要折腾 KVM 虚拟机,也不折腾其他平台,这里就不用配置了。
  10. 最后这部分,大家根据自己的需要弄,比方说 LLVM_TARGETS="" 这里,如果你什么特殊需求,X86 就足够了。再往后是 ccache 的部分,目的是能够在后面减少编译所需要的时间,关于如何配置系统使用 ccache ,大家可以参考这里,我们可以在 chroot 之后再弄 ccache,这个不着急。

是不是大家有点晕了,而且好多东西要手动输入,哈哈,我给大家一个传送门,这里是我自己保留的一些我自己常用的配置,方便大家复制粘贴。

现在我们开始配置官方源。首先是创建一个目录。 mkdir -p /mnt/gentoo/etc/portage/repos.conf ,这个目录的意义是所有的源地址配置文件都会放到这里。于是在这个目录下创建 gentoo.conf 官方源文件。

[gentoo]
location = /var/db/repos/gentoo
sync-type = rsync
sync-uri = rsync://rsync.mirrors.ustc.edu.cn/gentoo-portage/
auto-sync = yes
sync-rsync-verify-metamanifest = no ## 我的网络问题,导致无法同步到密钥,如果各位朋友的网络好不要加这一行。

写好之后,保存退出就可以了。

注意:

  • 个人建议大家不要在 make.conf 中定义 USE,虽然不是不可以,但是发现很多新手翻车都发生在这里,还是尽量去 /etc/portage/package.use/ 定义。
  • 修改完成后,希望大家认真检查一下。
  • 注意:关于 PYTHON_TARGETS 的内容,社区中的有朋友建议不要默认设置各种 TARGETS ,那么为了满足各种人的习惯,各位可以不用设置下面关于 PYTHON_TARGET 的内容。如果设置了,再第一更新时会提示很多问题和错误,可以先将 python-3.10 添加到 mask 中解决,等待第一次更新完成,注视 mask 中的相关内容,再更新就好了。
  • 我们可以在下一步开始之前定义一些 USE,方便后续操作。新建一个/mnt/gentoo/etc/portage/package.use/python ,定义下自己的 python 版本,为后续编译工作打下基础。可以像我这样:
*/* PYTHON_TARGETS: -python2_7 -python3_9 python3_10 python3_11
*/* PYTHON_SINGLE_TARGET: python3_10
*/* -python_single_target_python3_9 python_single_target_python3_10

# (免责声明)在这样设置之前,请确定你能够自己解决问题,否则,不要修改
  • 打开 GCC ltopgo 优化,新建 /mnt/gentoo/etc/portage/package.use/gcc ,输入以下内容:sys-devel/gcc pgo lto
  • 因为我本人不喜欢桌面系统使用楷体字体,所以新建 /mnt/gentoo/etc/portage/package.use/ghostscript-gpl ,输入以下内容:app-text/ghostscript-gpl -l10n_zh-CN ,这样就不会桌面系统安装楷体了。
  • 如果你使用了 zfs 文件系统,记得新建两个文件,如果提示没有该目录就新建该目录:
nano /mnt/gentoo/etc/portage/package.accept_keywords/zfs
nano /mnt/gentoo/etc/portage/package.accept_keywords/zfs-kmod

内容分别是:

sys-fs/zfs ~amd64
=sys-fs/zfs-9999 **

sys-fs/zfs-kmod ~amd64
=sys-fs/zfs-kmod-9999 **

# (免责声明)使用 9999 版本很可能出现各种奇奇怪怪的问题,在使用之前请确定你能有能力解决。

目的是让我们后续使用系统以后,随时都能够用上最新的 zfs 文件系统内核模块和工具。

如果各位朋友使用 zfs 文件系统,并且碰巧你们也使用 grub 作为 bootloader,那么还需要额外在 /mnt/gentoo/etc/portage/package.use/ 中添加一个文件,以方便 grub 能够认识 zfs 文件系统,添加的文件名字就叫 grub,内容如下:

sys-boot/grub libzfs
  • 如果各位不喜欢使用 grub 作为默认的 bootloader ,而是选择 systemd-boot ,那么同样在上面那个目录创建一个文件,名字叫做 systemd,内容如下:
sys-apps/systemd gnuefi

这样后续在配置 systemd-boot 的时候,就会非常方便了。

  • gentoo.conf 文件中同步使用的地址可以根据你所在的地区更换成国内其它镜像源,写法类似,比方清华源镜像:sync-uri = rsync://mirrors.tuna.tsinghua.edu.cn/gentoo-portage/

完成了以上的内容,我们就可以开始准备 chroot 了。

chroot 的含义可以简单的理解为,将我们现在使用 LiveUSB ISO 运行环境完全切换到将来我们的 Gentoo Linux 中。整个步骤一气呵成:

cp --dereference /etc/resolv.conf /mnt/gentoo/etc/
mount -t proc /proc /mnt/gentoo/proc
mount --rbind /dev /mnt/gentoo/dev
mount --make-rslave /mnt/gentoo/dev
mount --rbind /sys /mnt/gentoo/sys
mount --make-rslave /mnt/gentoo/sys
mount --rbind /tmp /mnt/gentoo/tmp
mount --bind /run /mnt/gentoo/run
chroot /mnt/gentoo /bin/bash

#下面的部分根据自己的 LiveUSB 镜像而定
env-update && source /etc/profile
source /etc/profile

以上步骤是没有用 ZFS 文件系统的情况,如果你使用了 ZFS 文件系统,操作步骤是这样的:

mkdir -p /mnt/gentoo/etc/zfs
cp /etc/zfs/zpool.cache /mnt/gentoo/etc/zfs
cp --dereference /etc/resolv.conf /mnt/gentoo/etc/
mount -t proc /proc /mnt/gentoo/proc
mount --rbind /dev /mnt/gentoo/dev
mount --make-rslave /mnt/gentoo/dev
mount --rbind /sys /mnt/gentoo/sys
mount --make-rslave /mnt/gentoo/sys
mount --rbind /tmp /mnt/gentoo/tmp
mount --bind /run /mnt/gentoo/run
chroot /mnt/gentoo /bin/bash

#下面的部分根据自己的 LiveUSB 镜像而定
env-update && source /etc/profile
source /etc/profile

假设你使用的发行版是 Ubuntu 或者是 Debian,下面的命令可能需要加上:

test -L /dev/shm && rm /dev/shm && mkdir /dev/shm
mount --types tmpfs --options nosuid,nodev,noexec shm /dev/shm
chmod 1777 /dev/shm

好了,我们现在已经彻底进入到将来的 Gentoo Linux 系统环境了,是不是很兴奋,很开心,别急,我们完善下面三步检查工作再继续:

  1. 通过 df -h 命令查看你的磁盘挂载情况;
  2. 通过 cat 命令查看之前我们修改的 make.confgentoo.conf 还有 USE 是否都有了;
  3. 查看我们的 /etc/fstab 是否有内容,UUID 的值与我们通过命令 blkid 获取的值是否一致。

如果上面三点都检查没有问题了,我们就可开始下面的步骤,进行第一波系统更新。

直接把命令一气呵成给出,具体看解释:

emerge-webrsync
emerge --sync

两个的意义差不多,第一个是用快照同步 portage,后者是用 rsync 同步,可以都用,也可以选其一。我向来是都用。哈哈。有时候第二个运行会提示我们刚刚运行过来,上锁了,只需要把对应目录的 lock 删掉就可以运行第二个命令用 rsync 同步了。

完成同步,我们开始选择我们需要的 profile 。profile 是什么?你可以简单理解为它定义了后续要搭建的目标系统是什么,比方说大家看我的 profile :

1-6 我的 profile

举个例子,假设你的系统只是服务器,不需要图形化,那么选择 1 或者 15 就可以了;如果你想用桌面环境,但是不想用 Gnome 和 KDE ,要玩一玩 xfce 或者 lxqt 之类的,那么选择 5 或者 10 就可以了。

我自己因为是 Gnome 的死忠粉,所以就选择了 7 。

那么这里的操作的命令如下:

eselect profile list
eselect profile set X

这个时候大家可以先依次安装两个软件,来完善和优化后续编译更新:

  • 安装 cpuid2cpuflags 软件,命令如下:
emerge -av --oneshot app-portage/cpuid2cpuflags

然后运行 cpuid2cpuflags ,会输出你的 CPU_FLAGS_X86 的信息,把它们复制后填写到我们的 make.conf 对应位置。

  • 先重新安装一遍 gcc ,命令如下:
emerge -av --oneshot gcc

目的是安装最新版本的 gcc,这样才能优化后续我们更新的软件。使用如下命令切换到新版本GCC:

eselect gcc list
eselect gcc set X

比方 gcc 11.1 才支持 zen3 架构的 AMD 处理器,10.X 版本是不支持的,那么 gcc-10.X 在编译 gcc-11.1 的时候 -march= 就不能写 zven3 ,而是 native 就可以了。这样就能顺利编译出 gcc-11.1,随后,如果你像我一样追求极致的话,再把 -march=zven3 打开,用 gcc-11.1 编译 gcc-11.1 。这种优化可能毫无意义,不过,谁知道呢~

注:下面的内容本来想告诉大家,可以先设置,在安装完成 ccache 之后在开相关功能。不过很多朋友养成了复制粘贴,一路向北的习惯,遇到各种问题。所以,如果明白怎么弄的朋友可以参考,看的一头雾水的,跳过 ccache 部分,直接到更新环节。

这里我们来安装 ccache ,它的目的是为了将来我们更好的维护系统,加速编译过程,首先用下面的命令来安装:

emerge -av dev-util/ccache

完成安装后,用以下命令创建目录,设置权限:

mkdir -p /var/cache/ccache
chown root:portage -R /var/cache/ccache
chmod 2775 -R /var/cache/ccache

编辑我们的 ccache 配置文件 /var/cache/ccache/ccache.conf ,内容如下:

max_size = 1000.0G
umask = 002
hash_dir = false
compiler_check = %compiler% -v
cache_dir_levels = 3
compression = true
compression_level = 1

最后到 make.conf 中启用 ccache 就可以了。

FEATURES="ccache"
CCACHE_DIR="/var/cache/ccache"

完成上面三个可选操作,并且也选择好自己的 profile 之后,我们就可以开始更新系统了,这里大家要有耐心,开始之前确定你的网络不会断,确定宿舍不会停电,确定(男)女朋友不会来骚扰你,确定有个非常耗时间且毫无意义的事情你可以用来打发,比方说看电影或者午休。好了,开始~

emerge -auvDN --with-bdeps=y --autounmask-write @world

先别纠结这一堆东西有什么意义,一般来说这里会提示类似 /etc 下有些文件需要更新,或者出现循环依赖。这些都好办。出现 /etc 下需要更新的,直接运行:

etc-update --automode -3

出现循环依赖的,就目前几次我安装的经验来看都会提示 pyhon3.9 这个版本需要用 -bluetooth 这个 USE 编译一遍,那么首先我们去 mask 那里新建一个 python 文件,限定好只安装 python3.9 而不是 python3.10 这类的,写法类似上面介绍 mask 的部分,限定好版本然后用下面的命令重装 python3.9:

USE=-bluetooth emerge -av python

完成好这一切工作之后再跑刚才那个命令:

emerge -auvDN --with-bdeps=y --autounmask-write @world

这个时候应该就开始运行了。整个编译所需要的时间由你 CPU 性能决定,线程越多,内存越大,速度越快。

如果中途因为某个包挂了,可以尝试以下两个命令:

emerge @preserved-rebuild
perl-cleaner --all

运行完成上面这两个命令之后再运行:

emerge -auvDN --with-bdeps=y --autounmask-write @world

如果还是存在问题,就运行:

emerge -auvDN --with-bdeps=y --autounmask-write @world

把错误的代码发给我们。你需要登陆 IRC 或者 Telegram 中文 Gentoo 群,用以下命令实现粘贴大段代码:

<命令输出> | curl -F "c=@-" "https://fars.ee/"
emerge -auvDN --with-bdeps=y --autounmask-write @world | curl -F "c=@-" "https://fars.ee/"

完成了更新,我们就可以开始配置基础系统了,也是一样,我一次性把命令给大家,首先是时区和语言:

#openRC
echo "Asia/Shanghai" > /etc/timezone
emerge --config sys-libs/timezone-data

#systemd
ln -sf ../usr/share/zoneinfo/Asia/Shanghai /etc/localtime

echo "en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8" >> /etc/locale.gen

locale-gen

完成后,我们可以用以下两个命令来查看我们目前可选择的语言和设定该语言为我们系统语言:

eselect locale list
eselect locale set X

但是建议各位先不要定义语言为中文,因为目前的 TTY 下是不支持中文的,会以乱码呈现,所以运行第一个看看有没有中文就可以了。

开始基础系统配置工作,我们的文件系统,还有一些小工具,文件系统大家根据自己的情况决定( ZFS 的朋友可以不用管文件系统,这个完成内核编译才弄 )。

emerge -av sys-fs/btrfs-progs networkmanager app-admin/sysklogd sys-process/cronie doas grub dev-vcs/git

以上内容,针对树内文件系统的系统管理员;

emerge -av sys-fs/btrfs-progs networkmanager app-admin/sysklogd sys-process/cronie doas dev-vcs/git

以上内容,针对 ZFS 文件系统,有需要用到 btrfs 和 xfs 树内文件系统的系统管理员;

emerge -av networkmanager app-admin/sysklogd sys-process/cronie dev-vcs/git

以上内容,针对我这种使用 ZFS 文件系统,也不想用 btrfs 和 xfs,也不用 sudo ,而是用 doas 的玩家。

这里需要 ZFS 文件系统的玩家注意,grub 可以先不安装,因为 grub 的 USE 打开了 libzfs ,会默认开始安装 zfs 和 zfs-kmod ,而这需要内核已经完成编译,所以会报错,各位这里先不用着急操作。

完成之后,因为我使用 systemd ,所以我在这里就默认 systemctl enable NetworkManager ,如果是 OpenRC 的用户使用 rc-update add NetworkManager default 来默认开机启用联网。

如果你是 sudo 用户,使用以下代码给 wheel 用户组能够使用 sudo 的权限:

sed -i 's/\# \%wheel ALL=(ALL) ALL/\%wheel ALL=(ALL) ALL/g' /etc/sudoers

我们现在可以配置我们的 root 用户密码了,直接 passwd 就可以了,默认情况下 Gentoo 要求非常严格的密码,我也不清楚怎么修改这个严格程度,所以大家知道的可以留言告诉我。

非常感谢 crackself 朋友的留言给我提供了思路。具体设置 Gentoo Linux passwd 密码强度是这样的。首先我们可以查看两个配置文件, /etc/pam.d/passwd/etc/pam.d/system-auth 大家会注意到后者告诉我们相关配置文件在 /etc/security/passwdqc.conf 。所以,我们只需要设置这个配置文件就好了,那么默认的情况大概是这样的(之所以说是大概是因为我忘记默认配置文件了)。

min=disabled,24,11,8,7
max=40
passphrase=8
match=4
similar=deny
random=47
enforce=everyone
retry=3

我后面修改成:

min=3,3,3,3,3
max=8
passphrase=0
match=4
similar=permit
random=47
enforce=everyone
retry=3

这样就能设置简单的 passwd 密码了。具体这些值意味这什么,大家可以参考这篇文章获得启发。这里发散一下思维,假设你现在看到这篇文章的时候,已经完成了整个系统的安装,而且和我一样使用了 Gnome 桌面环境,那么通过上面的方法虽然你已经完成了登陆密码和 passwd 的密码修改,但是 gnome 的密码密钥却还是以前老的,如果你打开 chrome 或者 vivaldi 的时候,会要求你输入密码解锁。那么如何解决呢?需要你安装 app-crypt/seahorse 包,安装好之后,将默认的密码修改成你登录系统的密码,这样将来就不会要求重新输入密码了。

完善一下 grub 的配置,我并没有像 Yangmame 巨菊那样设置。只是在 /etc/default/grub 底部增加了一行,最后关于 grub 和 systemd-boot 的设置,我们第一部分结束前再弄,现在不急:

GRUB_DISABLE_OS_PROBER=false

再输入下面两行代码,以防万一,虽然不输入,好像也没有关系,因为有一次安装我忘记了,也能正常用。

ln -sf /proc/self/mounts /etc/mtab
systemd-machine-id-setup

如果你使用的是 OpenRC,那么输入:

rc-update add sysklogd default
rc-update add cronie default

完成了这些小工具,用户组修改和 root 密码设置之后,我们下一步就开始编译内核了。

到了大家认为看似非常难,其实最简单的部分。

有一下几个内核推荐:

gentoo-sources
ck-sources
gentoo-kernel-bin

上面两个是官方提供的,后面两个是我在维护。我们先聊怎么编译安装 gentoo-sources 和 ck-sources ,关于这两个内核编译的难点在于 config 文件怎么写。其实我也没有太好的建议给大家怎么选择你们想要的配置,一种方法就是去 copy 别人的,比方说在 Github 上搜索下,直接复制粘贴过来,或者从 livecd 中复制,另一种想要深度了解的,可以看我这一期视频。

如果无脑选择了默认的 config ,gnetoo-sources 启动的内核可能导致你的键盘不能用,触摸板不能驱动等等奇怪的问题。请重新寻找适合自己的 config 文件,重新编译。

油管

那么如何安装我维护的这两个内核呢?很简单,首先大家加入 Gentoo-zh 的源,新建一个源文件:

nano /etc/portage/repos.conf/gentoo-zh.conf

然后把下面的内容复制粘贴进去:

[gentoo-zh]
location = /var/db/repos/gentoo-zh
sync-type = git
sync-uri = https://github.com/microcai/gentoo-zh.git

# 是 uri 不是 url,请仔细

然后运行一下下面的命令:

# 如果之前你用任何方式添加过 gentoo-zh overlay,请先删掉这个目录。
rm -rf /var/db/repos/gentoo-zh
emerge --sync; emerge -auvDN --with-bdeps=y --autounmask-write @world

如果上面这种手动添加 overlay 的方法不会或者出现问题。就用 eselect-repository 来添加吧。

具体操作参考官方 wiki

这样再通过下面的命令就能安装内核源码了:

emerge -av sys-kernel/gentoo-sources

注意喜欢玩第三方内核,请按照不同的 CPU 算法提供了不同的性能一下内容仅供参考

  • BMQ, PDS, CaCULE 三种 CPU scheduling 是互不兼容的,三选一,默认提供的是 BMQ,这个性能最好,具体跑分看这个视频:
BMQ VS PDS VS MuQSS

(以下内容需要用我维护的 customkernel overly,如果出现问题,或者不会用还是用官方提供的 gentoo-sources 吧)

(地址:https://github.com/HougeLangley/customkernel)

那么问题回到了 config 文件怎么解决的地方了,这里因为控制权在我,所以给大家都准备好了。如果各位选择了 linux-tkg-sources 内核源码,注意在 /var/db/repos/gentoo-zh/sys-kernel/linux-tkg-sources/config 目录下找一找对应的配置文件。

如果大家选择的是 xanmod ,就更简单,config 文件位于内核源码目录的 CONFIG 文件夹中,有 gccclang 不同版本,大家根据自己的需要复制粘贴就可以了。

好了,大家准备好了吗?思路清晰吗?我们准备开始喽。

假设我们选择了 xanmod 内核,也修改好了自定义 USE ,就直接下面的命令:

emerge -av xanmod-edge

(以上内容不会用就暂时别用 gentoozh 里面免责声明)

安装好以后,我们运行下面的命令来选择我们的内核源码为默认值,并创建符号链接:

eselect kernel list
eselect kernel set X

现在到内核源码目录去:

cd /usr/src

到这个目录我们 ls -l 一下,看看 /linux 源码目录是否指向我们刚刚安装的目录,如果指向没问题可以开始下一步;如果指向有问题,可能 eselect kernel 这一步除了差错。

我们进入到内核源码目录,大家注意,这里进入的是 /usr/src/linux 目录,而不是我们刚刚安装的那个目录。

cd /usr/src/linux

因为 config 文件已经搞定了,所以就开始编译喽。

make menuconfig
make -jX
make modules_install
make install

恭喜,完成了内核的编译。

不过 menuconfig 部分可能有些初学者不知道怎么弄,可以回过头看我的视频,视频中的内核版本老一点,不过目前变化不大,不影响的。

希望大家顺利结束了这个部分。

好了,下面的部分分为树内文件系统阶段和 ZFS 文件系统阶段。先谈树内文件系统。

假设你选择的是 btrfs 文件系统作为自己的 root 目录的文件系统,那么首先你先确定下 sys-fs/btrfs-progs 包是否已经安装了(xfs 文件系统用户也是一样的,检查自己相关包是否已经安装完毕)。

如果无误,运行以下命令安装 genkernel 和对应你处理器的微码(大家注意,这里我与DR巨菊关于微码的分歧讨论,DR巨菊认为只要是是最新的 BIOS 就没有必要上微码;而我觉得一般情况下,使用 Linux 的系统管理员很少有能力给笔记本刷 BIOS 的),那这一步大家按照自己的实际需求选择是否安装微码,我这里按照安装微码的方式提供给大家。

首先是 intel 的

emerge -av genkernel sys-firmware/intel-microcode

如果是 AMD 的处理器,安装微码的方式是这样的:

  • 首先是将 linux-firmwareinitramfs 这个 USE 打开,方法这里就不赘述了。
  • 然后用命令安装以下包:
emerge -av genkernel linux-firmware

如果不出意外,大家的 /boot 目录下应该会有一个 amd-uc.img

现在开始用 genkernel 生成 initramfs 文件。如果是 Intel 的用下面的命令:

genkernel --install --microcode-initramfs --compress-initramfs-type=zstd initramfs

如果是 xfs 文件系统,记得是这样的:

genkernel --install --xfsprogs --microcode-initramfs --compress-initramfs-type=zstd initramfs

如果是 AMD 的处理器,用下面的命令:

genkernel --install --compress-initramfs-type=zstd initramfs

完成之后,ls -l /boot 目录下就应该生成了相应的 initramfs 了。类似我这样的。

1-9

现在我们来谈 ZFS 文件系统,那么完成了上面 genkernel 和微码的安装之后,我们不急着生成 initramfs 镜像,先把 zfs zfs-kmod 还有 grub(systemd-boot 用户不用安装 grub) 安装了。

emerge -av zfs zfs-kmod grub

安装完成后,我们需要用命令生成一个 zfs 的 hostid,用于验证 zfs 文件系统完整性。

zgenhostid
file /etc/hostid

没问题之后,我们生成 initramfs 文件:

genkernel --install --zfs --microcode-initramfs --compress-initramfs-type=zstd initramfs # Intel的
genkernel --install --zfs --compress-initramfs-type=zstd initramfs # AMD的

完成之后,我们用 systemd 默认启用 zfs 所有服务:

systemctl enable zfs-import-cache zfs-import.target zfs-mount zfs-zed zfs.target

如果使用的是 openrc ,也需要默认打开 zfs 所有服务,以避免第一次无法进入系统:

rc-update add zfs-import boot
rc-update add zfs-mount boot

上面的命令启用的 zfs 服务是肯定能够进入系统了,如果想再启用其他相关的 zfs 服务,可以使用下面的命令:

rc-update add zfs-import boot
rc-update add zfs-mount boot
rc-update add zfs-share boot
rc-update add zfs-zed boot

顺利完成之后,我们进入了第一阶段的收尾部分了。下面分两个部分来说,一个是传统的 grub,一个是 systemd-boot

传统的 grub 在树内文件系统和 ZFS 文件系统都只需要执行以下命令:

grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB
grub-mkconfig -o /boot/grub/grub.cfg

如果是systemd-boot,不论是树内文件系统还是 ZFS 文件系统执行的命令也是一样的:

bootctl install

应该很顺利。开始配置文件,一个是新建,一个是修改。新建启动项。

nano /boot/loader/entries/gentoo.conf

内容如下:

title   Gentoo Linux
linux   /vmlinuz-xxxx # 根据自己的实际情况填写
initrd  /amd-uc.img # 如果你的处理器是 AMD;如果是 Intel 就不用了,已经在 initramfs 中
initrd  /initramfs-xxxx.img # 根据自己的实际情况填写
options dozfs=force root=ZFS=rpool/ROOT/default rw loglevel=0 quiet splash audit=0 # 这是 ZFS 文件系统的
options root=UUID=#你的根目录# rw loglevel=0 quiet splash audit=0 # 这是树内文件系统的

修改的文件如下:

nano /boot/loader/loader.conf

修改成:

default gentoo.conf
timeout 3
console-mode max

这样保证能够第一次重启后能够进入 Gentoo Linux。

现在我们创建我们自己的用户了。用以下命令实现:

useradd -m -G users,wheel,portage,usb,kvm,video xxx #不能用大写字母
passwd xxx

第一阶段宣告结束。但是大家不要激动,不要马上退出重启,检查,检查,检查。

  • /etc/fstab 中的内容是否正确
  • /boot 目录下是否都生成了相关的文件,initramfs,vmlinuz 等等
  • /boot /efi 是否是挂载状态

如果你确定以上内容都有了,并且在整个操作过程中没有出错和报错,那么恭喜你,第一阶段完成,我们进入 Gentoo Linux 吧。

exit; reboot

完善系统安装阶段(最近 Nvdia 驱动开源了内核模块部分,后续可能要更新这个部分)

(以下内容默认大家使用 root 用户登陆的情况,否则请加上 sudo 或者 doas ,下面内容存在倒叙,请注意)

相信大家已经进入 TTY 了,如果你用的是我维护的内核,可以切换成中文语言环境了,用 eselect locale list 查看中文的代号,用 eselect locale set X 就可以了,别忘了 sources /etc/profile 。如果不是我维护的那两个内核,大家还是继续在英文环境下操作。

好了,底层都解决了,现在我们需要桌面环境,这里以 Gome 和 KDE 为例,另外,我们的显卡驱动只要是前面 make.conf 配置对了,这里会依靠依赖自动解决,不用单独去安装依赖。但是为了保证大家能够顺利搞定第一次 Gentoo Linux 安装体验,我们就分量部分讲解。

第一部分是显卡驱动安装,先说 Intel :

emerge -av xorg-server xf86-video-intel

然后是 AMD 的:

emerge -av xorg-server xf86-video-amdgpu

是不是觉得,我忘记了什么,哈哈,对,nvidia 这个烦人的显卡。如果各位是台式机,就不用纠结下面的内容了,因为台式机是基本没有人会用集成显卡的。

我先丢出我的结论,假设你的笔记本是 amdgpu(集成显卡)+ Nvidia (独立显卡),这类笔记本是支持 Nvidia 显卡直通的,我们毫不犹豫选择独立显卡直通模式,勇于放弃 amdgpu 和 wayland,投入 nvidia 和 xorg 的怀抱。理由如下:

  • amdgpu 目前有背光调节 bug,4000系列可以解决,但是仍然看人品,5000系列不能解决
  • amdgpu 集成显卡需要额外占用我们电脑内存,作为显存,Gentoo Linux 是一个很重视内存的系统,我推荐把更多的内存给 Gentoo Linux 而不是给集显
  • amdgpu 集显工作增加 CPU 的功耗和温度,对于 Gentoo Linux 这样很在乎 CPU 性能的操作系统,主动放弃集显是对的
  • amdgpu 和 nvidia 采用混合模式的时候,两者都要占用功耗,从我自己的使用来看混合模式和直连模式下功耗占用是差不多的,直连会高一点,但是对于那些喜欢不带电源适配器的朋友来说,续航时间是差不多的

所以,如果你的笔记本是 amdgpu + nvidia 的组合,老老实实用独显直通,省心,不折腾,只需要额外用以下命令安装 nvidia 私有驱动就可以了。如果各位看官还是不死心,一定要折腾 amdgpu + nvidia 等我将来补充,因为,这个组合不靠谱啊。

emerge -av nvidia-drivers

那么我们搞定了 amdgpu + nvidia 的组合,我们来看看 intel + nvidia 的组合,一般情况下,intel + nvidia 我个人认为用混合模式。配置很简单。首先安装 nvidia 私有驱动和xrandr工具:

emerge -av nvidia-drivers xrandr

然后我们就要配置 xorg 文件还有 gdm 和 sddm 了,但是这个时候我们还没有安装桌面环境,所以推荐各位在安装完成桌面环境后再来看这部分。我先写了,大家先看后面的安装桌面环境的部分。

如果看到这里,请先确定你的 gnome 或者 kde 已经没有任何报错的编译安装好了。

首先屏蔽 nouveau ,在你的 grub 或者是 systemd-boot 的相应 linux 启动选项中添加 modprobe.blacklist=nouveau ,完成后,grub 用户别忘了 grub-mkconfig -o /boot/grub/grub.cfg 这个命令刷新下,搞定后,我们先生成一个默认的 nvidia xorg 配置文件。用以下命令实现:

nvidia-xconfig --prime

如果运行成功,它会在 /etc/X11/ 目录下生成 xorg.conf 文件;如果没有运行成功,需要重新安装一遍 nvidia 的驱动,然后再运行生成 xorg.conf 。这个 xorg.conf 后续我们要修改,实现 offload 功能(就是混合模式)。而现在我们先编辑两个 desktop 文件。这里先以 gdm 为例:

/usr/share/gdm/greeter/autostart/optimus.desktop
/etc/xdg/autostart/optimus.desktop

写入的内容均一样:

[Desktop Entry]
Type=Application
Name=Optimus
Exec=sh -c "xrandr --setprovideroutputsource modesetting NVIDIA-0; xrandr --auto"
NoDisplay=true
X-GNOME-Autostart-Phase=DisplayServer

如果是 sddm,那么就用下面的方法:

编辑 /etc/sddm.conf 文件,内容如下:

[X11]
DisplayCommand=/etc/sddm/scripts/Xsetup

下面创建一个脚本目录:

mkdir -p /etc/sddm/scripts

创建我们的启动脚本,nano /etc/sddm/scripts/Xsetup ,内容如下:

#!/bin/sh
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

最后赋予权限:

chmod a+x /etc/sddm/scripts/Xsetup

好的,完成 gdm 和 sddm 上的配置工作,现在我们修改 /etc/X11/xorg.conf 文件,你们会看到 Device 那个部分,类似于下面这张截图:

2-1

全部注释,然后将下面的内容复制粘贴进去。

Section	"ServerLayout"
	Identifier	"layout"
	Screen 0	"iGPU"
	Option	"AllowNVIDIAGPUScreens"
EndSection

Section	"Device"
	Identifier	"iGPU"
	Driver	"modesetting"
	BusID	"PCI:0:2:0"
EndSection

Section	"Screen"
	Identifier	"iGPU"
	Device	"iGPU"
EndSection

Section	"Device"
	Identifier	"nvidia"
	Driver	"nvidia"
	BusID	"PCI:1:0:0"
EndSection

有朋友会问,BusID 是否需要根据自己的改一改,我觉得可能不用,我用过 intel + nvidia 的3台笔记本,这个 BusID 都没有变过,还来自不同厂家,小米,Thinkpad,雷蛇。

安装我们的桌面环境:

如果选择了 gnome 的朋友,使用下面的命令安装:

emerge -av gnome-base/gnome

如果选择 KDE 的朋友,使用下面的命令安装:

emerge -av kde-plasma/plasma-meta

这个过程会自动安装基本依赖和必要 USE ,有特殊需要的朋友要仔细查看这些包的 USE ,它们默认开了什么,关了什么,300多将近400个包,还是有的看的,一路上需要多次配置 etc-update ,建议没把握的 USE 就选择默认的,万一手贱,那就累死你…你…的电脑。

那么完成了安装之后,应该是第二天了,嗨,各位早上好啊。都没出错跑完了,厉害~

先别急着默认启用 sddmgdm,配置下显卡驱动,这个时候再去看上面的内容。

如果一切顺利,桌面环境安装完成,驱动搞定,gdmsddm 也能跑起来了,是不是突然发现你的登录界面全是方块,别慌,你忘记安装字体了。新建一个 USE:

nano /etc/portage/package.use/noto

内容如下:

media-fonts/noto cjk

然后,更新一下,安装 noto 字体就好了。

emerge -av media-fonts/noto

现在能正常登录和显示了吧,笔记本用户一定还关心蓝牙,默认是没有开的,用下面的命令默认启动:

systemctl enable bluetooth

好了,到目前为止,第二阶段结束。我们的系统算是安装完成了。最后是一些完善和总结。

完成系统安装阶段

以前这个部分其实并没有,是我后来临时加的。原因是大家全部弄好以后会感觉没有思路继续搞下去。

后续的任务包括基础软件的安装,包括了中文输入法,浏览器,邮箱客户端,聊天软件,图片编辑软件,文本编辑器,虚拟化等等。而这些就是各位自由选择了,比方说输入法,系统自带了 ibus,但是太卡,你可以用 gentoo-zh 中的 fcitx5,相关的配置要去抄 Archlinuxwiki

还有关于使用内存编译,降低使用硬盘编译的方法,大家可以参考这里

关于 doas 替代 sudo方法。看着好像麻烦,习惯了比 sudo 方便,而且 doas 源于 OpenBSD ,安全性做的更好。

如何更新内核呢?如果你使用的是我维护的部分,首先强调一下,下一个版本就是 5.13 及其以后,一般来说内核更新后,源码都会到 /usr/src 下,用 eselect kernel set 一下新的,然后 cd 进去。流程是这样的:

make modules_prepare
make menuconfig # 看大家的配置文件,如果是 linux-tkg-sources 记得复制过来
make -jX; make modules_install; make install
emerge -av @module-rebuild -j; emerge -av zfs -j # 如果没有用 ZFS 的后面这一句安装 zfs 的可以不加
genkernel --install --zfs --microcode-initramfs --compress-initramfs-type=zstd initramfs # 根据自己的情况决定
grub-mkconfig -o /boot/grub/grub.cfg
如果是 systemd-boot 的朋友改一改 /boot/loader/entries/gentoo.conf 对应的文件就可以重启了

如果后续我想到了或者有朋友提出更好的建议,我会再添加进来,完善好这篇指南。

在最后,感谢 YangmameYafa-Xena,早上好阿伟(他的文章显示在审核),MiraculousMoon 以及 Gentoo-wiki 文档,这里的内容后续还会更新,大家有问题直接留言。该文章,使用 CC 协议署名。

谢谢所有朋友,加油,所有的 Linuxer 们。

47 thoughts on “Gentoo 安装

      1. 这应该不是.. Gentoo wiki 写着要这么做,而 Gentoo wiki 默认我们的环境是再 Gentoo 的 live cd 里,所以我认为不是某些发行版的liveusb镜像造成的。(而且我觉得加不加上这个无所谓,我一次都没有加过,也是一样顺利地可以使用,编译)

        1. 以前试过不加这俩参数 好像是pam还是谁下的文件没有保留拓展属性出现了验证问题

  1. 求助!安装gnome错误:
    ninja: build stopped: subcommand failed.
    ERROR: net-libs/webkit-gtk-2.30.6::gentoo failed (compile phase):
    ninja -v -j3 -l0 failed

    Call stack:
    ebuild.sh, line 125: Called src_compile
    environment, line 3921: Called cmake_src_compile
    environment, line 1614: Called cmake_build
    environment, line 1583: Called eninja
    environment, line 2044: Called die
    The specific snippet of code:
    “$@” || die “${nonfatal_args[@]}” “${*} failed”

    If you need support, post the output of `emerge –info ‘=net-libs/webkit-gtk-2.30.6::gentoo’`,
    the complete build log and the output of `emerge -pqv ‘=net-libs/webkit-gtk-2.30.6::gentoo’`.
    The complete build log is located at ‘/var/tmp/portage/net-libs/webkit-gtk-2.30.6/temp/build.log’.
    The ebuild environment file is located at ‘/var/tmp/portage/net-libs/webkit-gtk-2.30.6/temp/environment’.
    Working directory: ‘/var/tmp/portage/net-libs/webkit-gtk-2.30.6/work/webkit-gtk-2.30.6_build’
    S: ‘/var/tmp/portage/net-libs/webkit-gtk-2.30.6/work/webkitgtk-2.30.6’

    emerge –info ‘=net-libs/webkit-gtk-2.30.6::gentoo’
    Portage 3.0.18 (python 3.8.9-final-0, default/linux/amd64/17.1/desktop/gnome/systemd, gcc-10.2.0, glibc-2.32-r7, 5.10.27-gentoo-x86_64 x86_64)
    =================================================================
    System Settings
    =================================================================
    System uname: Linux-5.10.27-gentoo-x86_64-x86_64-Intel_Core_Processor_-Haswell,_no_TSX,_IBRS-with-glibc2.2.5
    KiB Mem: 2030148 total, 1633516 free
    KiB Swap: 2096124 total, 1959844 free
    Timestamp of repository gentoo: Thu, 20 May 2021 01:15:01 +0000
    Head commit of repository gentoo: af8e155e686e80a6d14a5041ef528fd1dd29cdd9
    sh bash 5.1_p8
    ld GNU ld (Gentoo 2.35.2 p1) 2.35.2
    app-shells/bash: 5.1_p8::gentoo
    dev-lang/perl: 5.30.3::gentoo
    dev-lang/python: 3.8.9_p2::gentoo, 3.9.4_p1::gentoo
    dev-lang/rust: 1.51.0-r2::gentoo
    dev-util/cmake: 3.18.5::gentoo
    sys-apps/baselayout: 2.7::gentoo
    sys-apps/sandbox: 2.23::gentoo
    sys-devel/autoconf: 2.13-r1::gentoo, 2.69-r5::gentoo
    sys-devel/automake: 1.16.2-r1::gentoo
    sys-devel/binutils: 2.35.2::gentoo
    sys-devel/gcc: 10.2.0-r5::gentoo
    sys-devel/gcc-config: 2.4::gentoo
    sys-devel/libtool: 2.4.6-r6::gentoo
    sys-devel/make: 4.3::gentoo
    sys-kernel/linux-headers: 5.10::gentoo (virtual/os-headers)
    sys-libs/glibc: 2.32-r7::gentoo
    Repositories:

    gentoo
    location: /var/db/repos/gentoo
    sync-type: rsync
    sync-uri: rsync://mirrors.tuna.tsinghua.edu.cn/gentoo-portage
    priority: -1000
    sync-rsync-verify-metamanifest: yes
    sync-rsync-verify-max-age: 24
    sync-rsync-verify-jobs: 1
    sync-rsync-extra-opts:

    ACCEPT_KEYWORDS=”amd64″
    ACCEPT_LICENSE=”*”
    CBUILD=”x86_64-pc-linux-gnu”
    CFLAGS=”-march=haswell -O3 -pipe”
    CHOST=”x86_64-pc-linux-gnu”
    CONFIG_PROTECT=”/etc /usr/share/gnupg/qualified.txt”
    CONFIG_PROTECT_MASK=”/etc/ca-certificates.conf /etc/dconf /etc/env.d /etc/fonts/fonts.conf /etc/gconf /etc/gentoo-release /etc/sandbox.d /etc/terminfo”
    CXXFLAGS=”-march=haswell -O3 -pipe”
    DISTDIR=”/var/cache/distfiles”
    ENV_UNSET=”CARGO_HOME DBUS_SESSION_BUS_ADDRESS DISPLAY GOBIN GOPATH PERL5LIB PERL5OPT PERLPREFIX PERL_CORE PERL_MB_OPT PERL_MM_OPT XAUTHORITY XDG_CACHE_HOME XDG_CONFIG_HOME XDG_DATA_HOME XDG_RUNTIME_DIR”
    FCFLAGS=”-march=haswell -O3 -pipe”
    FEATURES=”assume-digests binpkg-docompress binpkg-dostrip binpkg-logs config-protect-if-modified distlocks ebuild-locks fixlafiles ipc-sandbox merge-sync multilib-strict network-sandbox news parallel-fetch pid-sandbox preserve-libs protect-owned qa-unresolved-soname-deps sandbox sfperms strict unknown-features-warn unmerge-logs unmerge-orphans userfetch userpriv usersandbox usersync xattr”
    FFLAGS=”-march=haswell -O3 -pipe”
    GENTOO_MIRRORS=”https://mirrors.tuna.tsinghua.edu.cn/gentoo”
    LANG=”zh_CN.utf8″
    LDFLAGS=”-Wl,-O1 -Wl,–as-needed”
    MAKEOPTS=”-j3″
    PKGDIR=”/var/cache/binpkgs”
    PORTAGE_CONFIGROOT=”/”
    PORTAGE_RSYNC_OPTS=”–recursive –links –safe-links –perms –times –omit-dir-times –compress –force –whole-file –delete –stats –human-readable –timeout=180 –exclude=/distfiles –exclude=/local –exclude=/packages –exclude=/.git”
    PORTAGE_TMPDIR=”/var/tmp”
    USE=”X a52 aac acl acpi alsa amd64 berkdb bluetooth branding bzip2 cairo cdda cdr cli colord crypt cups dbus dri dts dvd dvdr eds emboss encode evo exif flac fortran gdbm gif gnome gnome-keyring gnome-online-accounts gpm gstreamer gtk gui iconv icu introspection ipv6 jpeg lcms libglvnd libnotify libsecret libtirpc mad mng mp3 mp4 mpeg multilib nautilus ncurses networkmanager nls nptl ogg opengl openmp pam pango pcre pdf png policykit ppds pulseaudio readline sdl seccomp spell split-usr ssl startup-notification svg sysprof systemd tcpd tiff tracker truetype udev udisks unicode upower usb vorbis wayland wxwidgets x264 xattr xcb xml xv xvid zlib” ABI_X86=”64″ ADA_TARGET=”gnat_2018″ ALSA_CARDS=”ali5451 als4000 atiixp atiixp-modem bt87x ca0106 cmipci emu10k1x ens1370 ens1371 es1938 es1968 fm801 hda-intel intel8x0 intel8x0m maestro3 trident usb-audio via82xx via82xx-modem ymfpci” APACHE2_MODULES=”authn_core authz_core socache_shmcb unixd actions alias auth_basic authn_alias authn_anon authn_dbm authn_default authn_file authz_dbm authz_default authz_groupfile authz_host authz_owner authz_user autoindex cache cgi cgid dav dav_fs dav_lock deflate dir disk_cache env expires ext_filter file_cache filter headers include info log_config logio mem_cache mime mime_magic negotiation rewrite setenvif speling status unique_id userdir usertrack vhost_alias” CALLIGRA_FEATURES=”karbon sheets words” COLLECTD_PLUGINS=”df interface irq load memory rrdtool swap syslog” CPU_FLAGS_X86=”mmx mmxext sse sse2″ ELIBC=”glibc” GPSD_PROTOCOLS=”ashtech aivdm earthmate evermore fv18 garmin garmintxt gpsclock greis isync itrax mtk3301 nmea ntrip navcom oceanserver oldstyle oncore rtcm104v2 rtcm104v3 sirf skytraq superstar2 timing tsip tripmate tnt ublox ubx” GRUB_PLATFORMS=”efi-64″ INPUT_DEVICES=”libinput” KERNEL=”linux” LCD_DEVICES=”bayrad cfontz cfontz633 glk hd44780 lb216 lcdm001 mtxorb ncurses text” LIBREOFFICE_EXTENSIONS=”presenter-console presenter-minimizer” LUA_SINGLE_TARGET=”lua5-1″ LUA_TARGETS=”lua5-1″ OFFICE_IMPLEMENTATION=”libreoffice” PHP_TARGETS=”php7-3 php7-4″ POSTGRES_TARGETS=”postgres10 postgres11″ PYTHON_SINGLE_TARGET=”python3_8″ PYTHON_TARGETS=”python3_8″ RUBY_TARGETS=”ruby26″ USERLAND=”GNU” VIDEO_CARDS=”amdgpu fbdev intel nouveau radeon radeonsi vesa dummy v4l” XTABLES_ADDONS=”quota2 psd pknock lscan length2 ipv4options ipset ipp2p iface geoip fuzzy condition tee tarpit sysrq proto steal rawnat logmark ipmark dhcpmac delude chaos account”
    Unset: CC, CPPFLAGS, CTARGET, CXX, EMERGE_DEFAULT_OPTS, INSTALL_MASK, LC_ALL, LINGUAS, PORTAGE_BINHOST, PORTAGE_BUNZIP2_COMMAND, PORTAGE_COMPRESS, PORTAGE_COMPRESS_FLAGS, PORTAGE_RSYNC_EXTRA_OPTS, RUSTFLAGS

    emerge -pqv ‘=net-libs/webkit-gtk-2.30.6::gentoo’
    [ebuild N ] net-libs/webkit-gtk-2.30.6 USE=”X egl geolocation gnome-keyring gstreamer introspection jpeg2k jumbo-build libnotify opengl (seccomp) spell systemd (-aqua) -examples -game/pad -gles2-only -gtk-doc -test -wayland”
    怎么破?小白刚接触gentoo。就是看了您的视频才入的坑,没想到卡这里了,谢谢了!

    1. ACCEPT_KEYWORDS=”amd64″ 写错了,是 ACCEPT_KEYWORDS="~amd64"
      其他的内容我暂时没有找到问题,你可以尝试下运行:
      emerge @preserved-rebuild
      perl-cleaner --all

      再运行看看情况。

  2. liveCD 我一直用SystemRescueCD 5.3.2,就是因为喜欢 Gentoo,然后这是他们基于 Gentoo 的最后一个版本,我要用到死。

  3. gentoo passwd 密码强度配置文件在/etc/Pam.d/passwd里面设定,如果指定是system-auth就修改同目录下该文件,8,8,8,8,8改为3,3,3,3,3就可以使用3位的密码

  4. houge哥,我笔记本是机械硬盘和4G内存的,分了4G的SWAP,没设置ccache,按你方法第1步编译GCC时居然把SWAP给占满了,硬盘灯长亮,SSH的连接也卡得不得了,我想问问gentoo的最低内存要求是什么啊?

    1. 就目前社区使用下载没有最低的要求,但是很尴尬的是,目前使用16G内存都是群中最小内存。机械硬盘倒是不怕。

      P.S 我自己用的最低是64G内存,最高128G

      1. 问题解决,gcc的use那里去掉lto就好了,加上lto后编译慢不说,内存消耗也非常大,我感觉8G内存不加swap也跑不动

        1. 今天和群里的朋友了解了一下,lto可以缩小软件,所以在嵌入式里面用得比较多,如果不是可以不用。

  5. 求助 第一次跟新 一直卡着几次了
    * Error: circular dependencies:

    (media-libs/freetype-2.11.0:2/2::gentoo, ebuild scheduled for merge) depends on
    (media-libs/harfbuzz-2.8.2-r1:0/0.9.18::gentoo, ebuild scheduled for merge) (buildtime)
    (media-libs/freetype-2.11.0:2/2::gentoo, ebuild scheduled for merge) (buildtime_slot_op)

    * Note that circular dependencies can often be avoided by temporarily
    * disabling USE flags that trigger optional dependencies.

    The following USE changes are necessary to proceed:
    (see “package.use” in the portage(5) man page for more details)
    # required by x11-libs/pango-1.48.7-r1::gentoo
    # required by x11-libs/gtk+-2.24.33::gentoo
    # required by x11-themes/gtk-engines-adwaita-3.28::gentoo
    >=media-libs/freetype-2.11.0 harfbuzz

    Would you like to add these changes to your config files? [Yes/No]

    Autounmask changes successfully written.

    * IMPORTANT: 3 config files in ‘/etc/portage’ need updating.
    * See the CONFIGURATION FILES and CONFIGURATION FILES UPDATE TOOLS
    * sections of the emerge man page to learn how to update config files.

    * In order to avoid wasting time, backtracking has terminated early
    * due to the above autounmask change(s). The –autounmask-backtrack=y
    * option can be used to force further backtracking, but there is no
    * guarantee that it will produce a solution.

    1. >=media-libs/freetype-2.11.0 harfbuzz这个加了use 没提示了 ,上面循环依赖如何解决啊

      1. 这提示看看不懂。这2个相互依赖。freetype use -harfbuzz安装 在安装harfbuzz 最后在use harfbuzz重新编译freetype 在更新命令。就出现houge哥 教程python循环跟着教程走,就开始第一次更新了,感谢houge以及提到的各位大佬。感觉这提示第一次装真看不懂,最好查看官方包里面各种use标记,才可能有点思路。

      2. 先:USE=”-harfbuzz” emerge -av media-libs/freetype
        再:media-libs/freetype harfbuzz > /etc/portage/package.use/freetype
        然后:emerge -auvDN –with-bdeps=y @world -j
        试试!

      3. 先:USE=”-harfbuzz” emerge -av media-libs/freetype
        再:echo media-libs/freetype harfbuzz > /etc/portage/package.use/freetype
        然后:emerge -auvDN –with-bdeps=y @world -j
        试试!

  6. 猴哥,gnome依赖那边如果报错,我在reddit的gentoo版面找到了解决方法,可以尝试添加USE关键字安装这个依赖USE=-harfbuzz emerge –oneshot freetype

      1. 好的,哈哈哈,在数十次尝试过后,我终于在我的台式机上面弄好了gentoo,感谢猴哥出了一片这么好、详细的安装论文!!!!!!!

        1. 不客气的,后续可能还需要逐步完善,毕竟计算机方面的内容更新太快了

  7. 大佬帮忙看看:
    安装steam chrome fcitx 后跟新系统,又是同一个循环依赖,按前面办法还有查找很多资料都不知道如何解决,

    [ebuild R ] x11-libs/gtk+-2.24.33:2::gentoo USE=”cups introspection (-aqua) -examples -test -vim-syntax -xinerama” ABI_X86=”32* (64) (-x32)” 0 KiB
    [ebuild R ] gnome-base/librsvg-2.50.7:2::gentoo USE=”introspection vala” ABI_X86=”32* (64) (-x32)” 0 KiB
    [ebuild R ] x11-libs/pango-1.48.9::gentoo USE=”X introspection sysprof -debug” ABI_X86=”32* (64) (-x32)” 0 KiB
    [ebuild R ] x11-libs/libXft-2.3.4::gentoo USE=”-doc” ABI_X86=”32* (64) (-x32)” 0 KiB
    [ebuild R ] media-libs/harfbuzz-2.9.0:0/0.9.18::gentoo USE=”cairo glib graphite icu introspection truetype -debug -doc -experimental -test” ABI_X86=”32* (64) (-x32)” 0 KiB
    [ebuild R ] x11-libs/cairo-1.16.0-r4::gentoo USE=”X glib opengl svg (-aqua) -debug (-gles2-only) -static-libs -utils -valgrind” ABI_X86=”32* (64) (-x32)” 0 KiB
    [ebuild R ] media-libs/freetype-2.11.0-r1:2::gentoo USE=”X adobe-cff bzip2 cleartype-hinting harfbuzz png -brotli -debug -doc -fontforge (-infinality) -static-libs -utils” ABI_X86=”32* (64) (-x32)” 0 KiB
    [ebuild R ] media-libs/fontconfig-2.13.1-r2:1.0::gentoo USE=”-doc -static-libs” ABI_X86=”32* (64) (-x32)” 0 KiB

    Total: 9 packages (1 upgrade, 8 reinstalls), Size of downloads: 3,584 KiB

    * Error: circular dependencies:

    (media-libs/harfbuzz-2.9.0:0/0.9.18::gentoo, ebuild scheduled for merge) depends on
    (media-libs/freetype-2.11.0-r1:2/2::gentoo, ebuild scheduled for merge) (buildtime_slot_op)
    (media-libs/harfbuzz-2.9.0:0/0.9.18::gentoo, ebuild scheduled for merge) (buildtime)

    1. USE=”-harfbuzz” emerge -av –oneshot freetype

      上面这个试试能不能解决?

      如果不行强行删除一个或者两个包,比方说 emerge –unmerge media-libs/harfbuzz media-libs/freetype 然后再更新试试。

      1. 2个都删除才行。把需要的基本搞定了,顺便换了清华git源,速度好快!!

  8. * ERROR: net-libs/webkit-gtk-2.34.1-r1::gentoo failed (compile phase):
    * ninja -v -j2 -l0 failed
    *
    * Call stack:
    * ebuild.sh, line 127: Called src_compile
    * environment, line 4001: Called cmake_src_compile
    * environment, line 1696: Called cmake_build
    * environment, line 1665: Called eninja
    * environment, line 2177: Called die
    * The specific snippet of code:
    * “$@” || die “${nonfatal_args[@]}” “${*} failed”
    *
    * If you need support, post the output of `emerge –info ‘=net-libs/webkit-gtk-2.34.1-r1::gentoo’`,
    * the complete build log and the output of `emerge -pqv ‘=net-libs/webkit-gtk-2.34.1-r1::gentoo’`.
    * The complete build log is located at ‘/var/tmp/portage/net-libs/webkit-gtk-2.34.1-r1/temp/build.log’.
    * The ebuild environment file is located at ‘/var/tmp/portage/net-libs/webkit-gtk-2.34.1-r1/temp/environment’.
    * Working directory: ‘/var/tmp/portage/net-libs/webkit-gtk-2.34.1-r1/work/webkit-gtk-2.34.1_build’
    * S: ‘/var/tmp/portage/net-libs/webkit-gtk-2.34.1-r1/work/webkitgtk-2.34.1’

    1. emerge -av gnome- base/gnome 运行后出现以上错误,无数次emerge @preserved-rebuild
      perl-cleaner –all; etc-update;dispatch-conf 总是出错,无法通过,请问如何解决

      1. 在运行那些命令没有用的时候,你需要看看运行完成这些命令之后的提示。

        另外朋友你贴出来的内容,其实对我们都没有用,因为问题在日志里,在上面,你需要查看的是真正 failed 的地方,而不是给结尾。

        另外需要注意这些内容:

        * If you need support, post the output of `emerge –info ‘=net-libs/webkit-gtk-2.32.4::gentoo’`,
        * the complete build log and the output of `emerge -pqv ‘=net-libs/webkit-gtk-2.32.4::gentoo’`.
        * The complete build log is located at ‘/var/tmp/portage/net-libs/webkit-gtk-2.32.4/temp/build.log’.
        * The ebuild environment file is located at ‘/var/tmp/portage/net-libs/webkit-gtk-2.32.4/temp/environment’.
        * Working directory: ‘/var/tmp/portage/net-libs/webkit-gtk-2.32.4/work/webkit-gtk-2.32.4_build’
        * S: ‘/var/tmp/portage/net-libs/webkit-gtk-2.32.4/work/webkitgtk-2.32.4’

    2. 朋友如果可以进 telegram,可以加 https://t.me/gentoo_zh Gentoo 中文频道,大家能为你提供更多帮助。

      如果不方便使用 telegram,可以加 QQ 群,这是云南LUG,方便交流。QQ:533145897

  9. 然后,我又将编译选项 从 -O3 改成 -O2,然后用amd64稳定分支再次编译,还是出问题,求救,gnome装不下去了:

    —————————-
    * Working directory: ‘/var/tmp/portage/net-libs/webkit-gtk-2.32.4/work/webkit-gtk-2.32.4_build’
    * S: ‘/var/tmp/portage/net-libs/webkit-gtk-2.32.4/work/webkitgtk-2.32.4’

    >>> Failed to emerge net-libs/webkit-gtk-2.32.4, Log file:

    >>> ‘/var/tmp/portage/net-libs/webkit-gtk-2.32.4/temp/build.log’
    *** Resuming merge…
    Calculating dependencies… done!

    * Messages for package net-libs/webkit-gtk-2.32.4:

    * ERROR: net-libs/webkit-gtk-2.32.4::gentoo failed (compile phase):
    * ninja -v -j2 -l0 failed
    *
    * Call stack:
    * ebuild.sh, line 127: Called src_compile
    * environment, line 3997: Called cmake_src_compile
    * environment, line 1692: Called cmake_build
    * environment, line 1661: Called eninja
    * environment, line 2173: Called die
    * The specific snippet of code:
    * “$@” || die “${nonfatal_args[@]}” “${*} failed”
    *
    * If you need support, post the output of `emerge –info ‘=net-libs/webkit-gtk-2.32.4::gentoo’`,
    * the complete build log and the output of `emerge -pqv ‘=net-libs/webkit-gtk-2.32.4::gentoo’`.
    * The complete build log is located at ‘/var/tmp/portage/net-libs/webkit-gtk-2.32.4/temp/build.log’.
    * The ebuild environment file is located at ‘/var/tmp/portage/net-libs/webkit-gtk-2.32.4/temp/environment’.
    * Working directory: ‘/var/tmp/portage/net-libs/webkit-gtk-2.32.4/work/webkit-gtk-2.32.4_build’
    * S: ‘/var/tmp/portage/net-libs/webkit-gtk-2.32.4/work/webkitgtk-2.32.4’
    * One or more packages are either masked or have missing dependencies:
    *
    * virtual/notification-daemon pulled in by:
    * (x11-libs/libnotify-0.7.9-r1:0/0::gentoo, installed)
    *
    * The resume list contains packages that are either masked or have
    * unsatisfied dependencies. Please restart/continue the operation
    * manually, or use –skipfirst to skip the first package in the list and
    * any other packages that may be masked or have missing dependencies.
    *
    * The following package has failed to build, install, or execute postinst:
    *
    * (net-libs/webkit-gtk-2.32.4:4/37::gentoo, ebuild scheduled for merge), Log file:
    * ‘/var/tmp/portage/net-libs/webkit-gtk-2.32.4/temp/build.log’
    *

    * GNU info directory index is up-to-date.

    1. 试试这样:MAKEOPT=“-j1” NINJAOPTS=“-j1” sudo emerge –ask –with-bdeps=y net-libs/webkit-gtk

  10. 老师,遇到几个比较棘手的问题。
    1)我的R9000P(RTX3060+AMD5800H)的电脑触摸板无法使用。在make.conf中已经增加了INPUT_DEVICES=”libinput synaptics”,并重新自动编译了内核。
    2)使用桌面是kde环境,但是wifi可以搜到但一直无法链接,不知道问题,也不知道怎么看日志。
    3)使用独显直连后显示器的刷新率可以到165HZ了但是屏幕却只能占一半
    4)安装其他软件需要一些库文件不知道怎么去寻找。
    望老师指点下

    1. 案例来说,你用的这台计算机是非常容易安装 Gentoo 的,毕竟以前我也用这台笔电。

      1. 不需要重新编译内核,一般调整后,只需要重新更新后就能用;如果还是不行,你需要考虑你如何编译的内核,配置文件是否配全,不清楚去用 fedora 的 config 跑内核,别急于做减法,有时候减法害死人;
      2. 我看到你在 QQ 群里也提到,你需要考虑你的 USE 是否做了什么定制和修改,介于你上面提到的输入问题,你的内核配置估计有问题。
      3. 你需要重新理解下独显和集显如何搭配使用
      4. 你需要安装 app-portage/pfl ,学位使用 efile 搜索库文件,从而定位具体的包

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注