很早以前,我就有写了一篇安装 Gentoo Linux 的文章( Gentoo Linux 安装 —— 带硬盘加密 ),只是那篇文章存在局限性。因为一些原因,我打算写一篇更详细更完整,适合新手且可以无缝进阶的 Gentoo Linux 安装及使用指南。

  • 本文面向新手,十分精简,配置正确

  • 本文以 AMD64(x86_64) 平台为例进行说明

  • 本文以安装到实体机为目的(也适用于虚拟机)

  • 本文以一条相对单一的路线指导安装使用 Gentoo Linux,亦可前往 Gentoo Wiki 页 以获取更多更详细内容

  • 本文唯一原始链接: https://bitbili.net/gentoo-linux-installation-and-usage-tutorial.html

  • 本文源码在 这里 ,欢迎纠错

  • 若遇难题,可使用 邮件列表 (gentoozh@googlegroups.com) 以寻求帮助

    • 问题描述需尽量完整,同时避免 X-Y 问题

    • 有日志需完整贴出,尽量避免使用图片,尽可能使用文本(尽可能使用贴到 Pastebin 的形式)

正文开始:

开始之前,建议了解一下 Gentoo Linux 的哲学(英文): https://www.gentoo.org/get-started/philosophy/

准备工作

确保有

至少一台可以正常使用且能连接互联网的电脑 (用于

  • 下载 LiveCD 系统

  • 写入 LiveCD 到 U 盘

  • 安装 Gentoo Linux)

一个可以工作的 U 盘 (用于装载 LiveCD 系统)

  1. 打开 北外镜像地址 ,进入目录 releases/amd64/autobuilds/current-install-amd64-minimal/ 下载最小化安装系统镜像,名字为 install-amd64-minimal-{日期}.iso

  2. .iso 文件写入到 U 盘。

    • Windows 上可以使用工具 Rufus 进行写入(写入前配置默认无需更改,即 MBR 分区,BIOS 或 UEFI,FAT32 系统)

    • Linux 上则可以使用自带的 dd 命令来写入,具体命令为

      dd bs=4M if=「.iso 文件的路径」 of=/dev/sdX status=progress oflag=sync
      # 命令中 sdX 为 U 盘这个块设备的路径名,需要根据你的实际情况来修改
      # 注意,U 盘内数据将丢失
      
  3. 将准备好的 U 盘插上需要安装 Gentoo Linux 的电脑后重启/开启该电脑,通过按键(Esc/Del/F2/F10/F12)进入启动选项,选择后进入到 U 盘内的 LiveCD 环境。

    如需配置 UEFI 启动,务必同样以 UEFI 方式启动 U 盘内的系统(选择时会有带 [U]EFI 和不带 [U]EFI 字样的两种 U 盘启动选项)。

配置安装环境

连接网络

有线

  1. 网络环境带 DHCP 服务的(比如家用路由器连接的),livecd 默认会运行 dhcpcd 服务,不出意外,进入环境后直接可以联网。可通过下述的 ping 测试 判断。

  2. 网络环境无 DHCP 服务或 DHCP 无效需要手动配置网络的,需要知道网关 IP,可用的网络地址,然后执行如下命令:

    # 先列出到当前使用的网卡
    ip link
    # 有线网卡的格式一般为 enpXsX, X 是一个数字
    # 假设这里看到了正在使用的网卡为 enp5s0
    ip link set dev enp5s0 up # 确保其开启
    # 这里假设 网关地址为: 10.0.1.1
    #    可用网络地址为: 10.0.1.2
    #      子网掩码为: 255.255.255.0 (即 CIDR 符号为 /24)
    ip address add 10.0.1.2/24 dev enp5s0
    ip route add default via 10.0.1.1 dev enp5s0
    # 这样就配置好了网卡的 IP 和默认路由
    # 未假设的内容即为固定参数,无需变动
    
  3. 拨号网络,执行 pppoe-setup 根据提示配置好对应的值后,执行 pppoe-start 进行连接。

  4. 若仅存在 IPv6 环境,那么默认进入安装环境后,会直接进行路由协商获取可用的 IPv6 地址。如若无效,同样使用 ip 命令自行配置(正常无需配置路由;因环境所限,没有更多 IPv6 环境测试,便不再说明)。

无线

  • 确定无线网卡设备,使用 iw dev 进行查询, Interface 后显示的即为无线网卡名,这里以 wlpXsX 代替

  • 确保清楚无线网络的 SSID(即无线网络名称),若不知,可以执行如下命令获取当前能检测到的所有 SSID:

    iw dev wlpXsX scan | grep SSID
    # 其它信息可自行尝试
    
  • 确保无线网卡设备开启

    ip link set wlpXsX up
    

然后开始连接到无线网络:

  1. 无认证的无线网络,执行如下命令连接

    iw dev wlpXsX connect -w 「SSID」
    
  2. WEP 认证的无线网络,执行如下命令连接

    # 假设密码为 mypass
    iw dev wlpXsX connect -w 「SSID」 key 0:mypass
    # 若密码是十六进制的,比如为 6162636465,则
    iw dev wlpXsX connect -w 「SSID」 key d:0:6162636465
    
  3. WPA/WPA2/WPA3 认证的无线网络(如今常用的认证方式),执行如下命令连接

    wpa_supplicant -i wlpXsX -c <(wpa_passphrase 「SSID」 「密码」)
    

认证通过连接上无线网络后,再采取和有线一样的方式进行联网配置,一般会直接由 DHCP 服务器给本机分配上 IP,如果没有,参考有线配置段落,将有线网卡替换为对应无线网卡即可。

DNS 及测试

执行

cat /etc/resolv.conf

查看 DNS 配置信息,通常使用 DHCP 配置的网络会自动获取到 DNS 地址后配置,如若没有,请执行

echo 'nameserver 223.5.5.5' >/etc/resolv.conf

写入 DNS 配置,这里我选用的阿里云的公共 DNS 地址,也可以改成其它的。

再执行

ping -c3 baidu.com
# IPv6 使用 ping -6 -c3

查看返回信息,输出如下类似信息及联网成功

PING baidu.com (220.181.38.251) 56(84) bytes of data.
64 bytes from 220.181.38.251 (220.181.38.251): icmp_seq=1 ttl=53 time=28.5 ms
64 bytes from 220.181.38.251 (220.181.38.251): icmp_seq=2 ttl=53 time=30.4 ms
64 bytes from 220.181.38.251 (220.181.38.251): icmp_seq=3 ttl=53 time=29.6 ms

--- baidu.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 28.509/29.519/30.413/0.781 ms

如果长时间得不到响应或者直接显示失败,再自查网络配置或寻求帮助。

准备好分区

作为新手教程,在这里往往会遇到在装有 Windows 系统的情况下安装 Linux 的情况,而硬盘也有可能是共用的,这些都无需担心,可以不影响到 Windows 一丝一毫,慢慢往下看。

*注意备份好资料*

确保有一片比较大的空闲硬盘空间或者一个完整的无用硬盘

  • 仅用于测试,5G 空间够用

  • 日常使用,至少 30G 空间,越大越好

本文不会涉及到硬盘加密, RAID 和 LVM

如果熟悉分区,可自行配置,只要确保满足以下条件即可跳过本节:

  1. BIOS 启动,GPT 分区情况下,需要有一个 2M 大小的 BIOS boot 分区,无需配置文件系统。

  2. 配置 UEFI 启动情况下,需要有一个 100M (建议大小)的 EFI 分区,并格式化为 FAT32 文件系统。

  3. 一个可以挂载到 / 目录的格式化完成的分区。

如果不熟悉,请看以下内容

执行

lsblk

列出当前所有的块设备,硬盘对应的名称一般为 sdXnvmeXnX 这种(虚拟机下可能为 vdX ),其中 X 为英文字母或阿拉伯数字。

确定好需要操作的块设备,这里假设为 sdX ,然后执行自带的 fdisk 命令进行分区(分区工具很多,这里仅以该工具为例)

fdisk /dev/sdX

若硬盘是与其它系统共用,仅有部分空闲空间的用于安装 Gentoo Linux 的,有些命令可能是无需操作的,对于这些命令,我会在命令后使用 #!!! 这样的注释进行提醒,并说明;如果你是在一块完整的硬盘上安装,可以输入以下完整的命令

执行上述命令后,进入了 fdisk 交互界面,继续执行如下操作

# [1]号命令
p # 列出当前的分区情况

# [2]号命令
g #!!! 确保当前分区表为 GPT 格式
  #      此操作最终会破坏硬盘原有数据
  #      共用硬盘情况下不要操作!!!

# [3]号命令
n #!!! 先新建一个 2M 的 BIOS boot 分区
  #      这对于以 BIOS 启动的情景是必须的
  #      对于 UEFI 启动的情景也是无害的(此情景下可以不建)
  #      在系统共用硬盘情况,若已经存在,则无需再建
「回车以选择默认值」 # 这里是当前分区的分区号,选择默认值并记住
「回车以选择默认值」
+2M

# [4]号命令
t #!!! 更改分区类型,[3]号命令执行情况下执行
「数字」 # 输入[3]号命令记录分区号以选择该分区
     #   当仅存在一个分区的情况下,这个步骤会略过,注意提示信息
4 # 4 号即为 BIOS boot 类型,也可以输入 L 列出所有类型进行确认

# [5]号命令
n #!!! 再新建一个 100M 的 EFI 分区
  #      这对于以 UEFI 启动的情景是必须的
  #      对于 BIOS 启动的情景也是无害的(若后续无更换为 UEFI 打算,则可以不建)
  #      在系统共用硬盘情况,若已经存在(类型标记为 EFI System),可无需再建
「回车以选择默认值」 # 这里是当前分区的分区号,选择默认值并记住
「回车以选择默认值」
+100M

# [6]号命令
t #!!! 更改分区类型,[5]号命令执行情况下执行
「数字」 # 输入[5]号命令记录分区号以选择该分区
     #   当仅存在一个分区的情况下,这个步骤会略过,注意提示信息
uefi # uefi 为 EFI System 类型的别名,也可以输入 L 列出所有类型进行确认

# [7]号命令
n # 建立启动分区
  #   建立一个独立于根分区的系统启动分区(一般也建议这样做)
  #   这里选择 500M 的大小,作为 Gentoo Linux,这个大小可以放下很多的内核供玩耍
「回车以选择默认值」
「回车以选择默认值」
+500M

# [X]号命令
n # 建立交换分区「可选」
  #   根据自己的需求判断是否需要建立此交换分区(在硬盘足够大的情况下,推荐建立)
  #   交换分区用于在电脑内存不足时,代替内存存储数据,用于弥补内存不足的问题
  #       也用于在内存足够时,将一部分不常用的数据写入到这个分区下,以提高内存命中率
  #       还用于保存电脑休眠时内存下的数据
  #   当然,即使没有交换分区,也可以创建交换文件以起到相同的作用,性能一样,还更灵活
  #   但在某些情况下,交换文件会阻碍一些功能,比如 BtrFS 的快照
  # 【参考建议】
  #   如果,CPU 有 8 核 16 线程,内存 16G 或者更低
  #      那么建议建立至少 8G 的交换分区(也可以选择之后再建立交换文件)
「回车以选择默认值」 # 这里是当前分区的分区号,选择默认值并记住
「回车以选择默认值」
+6G # 这里的 6G 我输入的是一个较为通用的值,实际上你可以根据自己的情况来给
    # 比如你内存有 32G,日常占用 20G,需要休眠功能,那么这里至少也得 20G

# [X1]号命令
t #!!! 更改分区类型,[X]号命令执行情况下执行
「数字」 # 输入[X]号命令记录分区号以选择该分区
     #   当仅存在一个分区的情况下,这个步骤会略过,注意提示信息
swap # swap 为 Linux swap 类型的别名,也可以输入 L 列出所有类型进行确认

# [8]号命令
n # 建立根目录分区
  #   个人建议这里把剩余空间都分给根目录分区
「回车以选择默认值」
「回车以选择默认值」
「回车以选择默认值」 # 这里的默认值是可以选择的最大值

# [9]号命令
w # 最后写入此次修改后的分区表

这样一个分区表就准备好了,接下来格式化分区,除了 EFI 分区必须为 FAT32 格式外,其它分区的可选格式范围很广。一般来说 ext4 适用性最广,这里就用 ext4 为例。

执行

fdisk -l /dev/sdX

查看现在的分区表,记住现在的 EFI 分区( EFI System ,若有),启动分区( 500M 的 Linux filesystem ),交换分区( Linux swap ,若有)以及根分区(最大的 Linux filesystem )的设备名。这里假设

  • EFI 分区设备为 /dev/sdX2

  • 启动分区设备为 /dev/sdX3

  • 交换分区设备为 /dev/sdX4

  • 根分区设备为 /dev/sdX5

那么执行

# 格式化 EFI 分区为 FAT32(若有)
# 如果和其它系统共用的 EFI 分区,这一步跳过
mkfs.vfat -F 32 /dev/sdX2

# 格式化启动分区为 ext4
mkfs.ext4 /dev/sdX3

# 设置交换分区(若有)
mkswap /dev/sdX4

# 格式化根分区为 ext4
mkfs.ext4 /dev/sdX5

挂载分区

最后,挂载好准备的分区

# 挂载根分区
mount /dev/sdX5 /mnt/gentoo

# 挂载启动分区
mkdir /mnt/gentoo/boot
mount /dev/sdX3 /mnt/gentoo/boot

# 起用交换分区(若有)
swapon /dev/sdX4

# 如果你是 UEFI 环境,安装 UEFI 启动,则挂载上 EFI 分区
# 这里我设定 EFI 分区挂载到启动目录下的 efi 路径上
mkdir /mnt/gentoo/boot/efi
mount /dev/sdX2 /mnt/gentoo/boot/efi

至此,分区准备完成,到这就准备好了所需的安装环境。

进行安装

获取基本系统

首先调整好当前的系统时间,偏差的时间会导致后续一些问题(比如编译过程依赖系统时间)。执行

chronyd

成功后使用 links 命令访问镜像服务器,执行

links https://mirrors.bfsu.edu.cn/gentoo/

打开后,使用方向及回车键定位到 releases/amd64/autobuilds/ 目录。

在这里,你需要确定你想要安装 Gentoo Linux 的哪个 profile ,关于 profile 的详细说明可以看 对应的 wiki ,简单说明即,它是一个完整的系统配置集合,不同的 profile 在安装完成后可以自行切换,但在安装过程中,只能使用下载好的 stage3 所用的 profile 进行。常用的几个 profile 属性说明:

  • openrc: 带此单词表示,其默认的初始化程序为 openrc

  • systemd: 带此单词表示,其默认的初始化程序为 systemd (不带该单词所有 profile ,默认初始化程序都是 openrc)

  • desktop: 带此单词表示,其包含了一些适用于桌面环境的基础包

  • llvm: 带此单词表示,其使用 LLVM 作为默认的 toolchain

  • nomultilib: 带此单词表示,其不包含 32 位的系统库文件

  • selinux: 带此单词表示,其默认包含 SELinux 相关配置,启用 SELinux

  • hardened: 带此单词表示,其默认包含强化安全性相关的配置

正常使用情况下,推荐可以在如下多个 stage3 包中选择:

  • current-stage3-amd64-systemd

  • current-stage3-amd64-openrc

  • current-stage3-amd64-openrc-splitusr

  • current-stage3-amd64-nomultilib-systemd

  • current-stage3-amd64-nomultilib-openrc

  • current-stage3-amd64-llvm-systemd

  • current-stage3-amd64-llvm-openrc

openrc 是 Gentoo Linux 官方维护且默认的初始化程序,而 systemd 则是如今大多数发行版使用的初始化程序,各有优劣,二者均可,自行选择。

这里以 current-stage3-amd64-openrc 为例,那么

  1. 选择进入该目录

  2. 选中 stage3-amd64-openrc-{日期}.tar.xz 文件,回车进行下载

  3. 这里请同时下载其校验文件 stage3-amd64-openrc-{日期}.tar.xz.DIGESTS

默认存储路径为执行 links 的当前目录,下载完成后,按 q 退出,执行

# 列出当前目录下的内容,确保两个下载的文件存在
ls

# 使用 sha512sum 校验文件
sha512sum -c --ignore-missing stage3-amd64-openrc-{日期}.tar.xz.DIGESTS

确保无错误提示后继续。如果出错,说明下载的文件不完整,请重新下载。

解压 stage3 到根目录

执行

# 切换到挂载根分区的目录下
cd /mnt/gentoo

# 解压 stage3 文件,这里默认之前执行 links 的目录为家目录(没进行切换的话)
#              若之前是切换了目录后执行的 links,请自行修改
tar xpvf /root/stage3-amd64-openrc-{日期}.tar.xz --xattrs-include='*.*' --numeric-owner

配置镜像地址

为了更快速的下载文件,配置一个离自己近的镜像服务器地址很重要,执行

mirrorselect -i -o >>/mnt/gentoo/etc/portage/make.conf

会打开一个界面供选择镜像地址,比如在中国的话,可选 tsinghua/ustc/aliyun/netease 的,使用空格选中,回车保存。

chroot 到目标系统

执行

# 复制 DNS 配置到目标系统环境
cp -L /etc/resolv.conf /mnt/gentoo/etc/

# 挂载必要的文件系统
# /proc 是一个由内核暴露信息到环境下的伪文件系统
mount --types proc /proc /mnt/gentoo/proc
# /sys 是类似 /proc 但比其更结构化的伪文件系统
mount --rbind /sys /mnt/gentoo/sys
# /dev 是由 udev 管理,包含所有设备文件的普通文件系统
mount --rbind /dev /mnt/gentoo/dev

之后执行如下进入到目标系统环境:

# chroot 到目标系统环境
chroot /mnt/gentoo
# 导入环境信息
. /etc/profile
# 修改提示符以便于区分
PS1=(chroot)$PS1

获取 portage 数据库

执行

emerge-webrsync

该命令会从之前配置好的镜像地址下载最近打包好的 portage 数据库到本地,并解压后使用。 portage 是 Gentoo Linux 的包管理器,这个数据库是安装各种软件的基础。

确定首选编辑器

Gentoo Linux 默认安装的编辑器为 nano ,这是一个初始设置下就很适合新手的编辑器,如果你有其它的要求,比如想使用 vim 或者 emacs ,可以先安装

# 若安装 vim 则执行
emerge -vj app-editors/vim

# 若安装 emacs 则执行
emerge -vj app-editors/emacs

无论是否有安装其它编辑器,这里都需要选择一下默认的编辑器

# 列出当前存在的编辑器
eselect editor list

# 根据所需要的编辑器对应的序号,设置默认
eselect editor set 「序号」

# 之后再运行一次
. /etc/profile
PS1=(chroot)$PS1

安装固件、内核及引导

执行

# 提示:对于虚拟机环境而言,以下步骤[1]一般无需进行,
#              步骤[2]内的 linux-firmware 也无需添加

# [1]
# 同意 Linux 固件的协议
# 先创建一个文件夹,以便于管理
mkdir -p /etc/portage/package.license
# 再创建文件以同意对应协议
echo 'sys-kernel/linux-firmware linux-fw-redistributable no-source-code' >/etc/portage/package.license/linux-firmware

# [2]
# 为方便在安装二进制内核时安装 initramfs,需添加如下 USE 配置(什么是 USE 见下文 USE 标记 一节)
echo 'sys-kernel/installkernel dracut' >/etc/portage/package.use/installkernel

# [3]
# 安装固件、内核及 grub 安装器
emerge -vj linux-firmware gentoo-kernel-bin grub

该命令会为系统安装 Linux 固件文件、二进制内核以及 Grub 安装器。

Linux 固件文件

这里的固件文件是一系列固件的集合,它们为某些硬件(无线网卡、蓝牙、显卡等)提供支持。因为其通常是私有的,所以这里需要同意额外的许可。

内核

它是系统软件与硬件的中间层,必要。

Grub 安装器

用于给计算机安装 Grub 引导程序,碍于篇幅,这里不打算介绍其它引导器,且 Grub 功能完善、成熟,建议安装。

配置 fstab

执行

注意替换下述命令中的设备名 sdXN

# 记录启动分区的 UUID 值到 fstab 文件
blkid /dev/sdX3 >>/etc/fstab

# 如果是配置 UEFI 启动记录,那么记录 EFI 分区的 UUID 值到 fstab 文件
blkid /dev/sdX2 >>/etc/fstab

# 记录交换分区的 UUID 值到 fstab 文件(若有)
blkid /dev/sdX4 >>/etc/fstab

# 记录根分区的 UUID 值到 fstab 文件
blkid /dev/sdX5 >>/etc/fstab

记住这个顺序,后使用编辑器打开 /etc/fstab 文件

# 比如 nano
nano /etc/fstab

打开文件后可以看到示例配置,你需要删除之前新添加行(不被 # 注释的)的除了 UUID="XXXX...XXXX" 字段外其它的所有内容。

根据之前添加进去的顺序,依次配置到如下值:

# 启动分区
UUID="XXXXXXXX-...XXXX"  /boot       ext4  rw,noatime,errors=remount-ro 0 2
# EFI 分区(若有)
UUID="XXXX-XXXX"         /boot/efi   vfat  rw,noatime,errors=remount-ro 0 2
# 交换分区(若有)
UUID="XXXXXXXX-...XXXX"  none        swap  sw                           0 0
# 根分区
UUID="XXXXXXXX-...XXXX"  /           ext4  defaults,noatime             0 1

安装并配置引导

安装

这里区分为两种情况:

  1. BIOS 启动,执行

    grub-install --target=i386-pc /dev/sdX
    

    显示无报错即安装完成。

  2. UEFI 启动,执行

    grub-install --target=x86_64-efi --efi-directory=/boot/efi/ --bootloader-id=Gentoo
    

    显示无报错即安装完成。

配置

执行

# (可选)如果之前有分配交换分区,在这里可以执行如下命令以启用其休眠后唤醒的功能
sed -Ei "/GRUB_CMDLINE_LINUX_DEFAULT/s/^#*(GRUB.*DEFAULT=).*$/\1\"resume=UUID=$(blkid -o value /dev/sdX4 | head -1)\"/" /etc/default/grub
# 也可以手动修改,打开 /etc/default/grub 文件
#    找到 GRUB_CMDLINE_LINUX_DEFAULT 变量
#    去掉其注释标记 (#) 后
#    在其双引号内添加上内容:
#        resume=UUID=<UUID 值>
#    此 <UUID 值> 可由命令 blkid -o value /dev/sdX4 | head -1 显示

# (必要)创建配置
grub-mkconfig -o /boot/grub/grub.cfg

以完成引导的配置,该命令会自动根据 /etc/fstab 以及 /etc/default/grub 的内容来生成所需要的引导配置。

自此,一个基本的可以启动的系统安装完成。但还需要进行一些基本的收尾工作。

配置基础系统

设置用户

  1. 设置 root 用户密码,执行

    passwd root
    

    后根据提示,设置好 root 用户密码(如果你是第一次在 Linux 下输入密码,不要奇怪为何输入时无任何字符提示,这是正常的)。

  2. 创建一个平常使用的普通用户

    # 通常情况下,建议日常通过普通用户来使用系统
    # 创建普通用户,同时将其额外添加到 usb 组,以使其可以访问 USB 设备
    #                  wheel 组,以使其可以使用 su 命令
    # 这里的用户名只能是字母和数字,数字不能打头,不要给空格
    useradd -m -G usb,wheel 「用户名」
    # 这里可能有一个关于 mail 文件夹不存在的提醒
    #   Creating mailbox file: No such file or directory
    # 忽略即可
    
    # 设置普通用户密码
    passwd 「用户名」
    
    # (可选)
    # 安装 sudo 并修改配置文件
    # 使普通用户可以以超级权限执行命令
    emerge -vj app-admin/sudo
    visudo # 打开配置文件,找到 #%wheel 开头的几行设置
           # 根据说明去掉所需配置行的注释符号
    

配置网络

之前配置的是 LiveCD 环境下的网络,这里为新系统环境配置网络(如果你需要的话)。

最方便的支持多种联网方式的工具是 NetworkManager ,基本能满足所有需求,但同时它的依赖项会有一点多。如果此系统用来作为桌面环境,那么建议安装它,执行

# 添加必要的 USE 标记以解决依赖关系
echo "net-wireless/wpa_supplicant dbus" >>/etc/portage/package.use/nm
echo "net-misc/openssh -bindist" >>/etc/portage/package.use/nm
# (随着时间的推移,可能后续会有其它依赖关系问题,若出现,可使用本文开头邮件列表以寻求帮助)

# 安装 NetworkManager
# 这里为了处理依赖关系,所以稍有复杂
emerge -vj1 net-misc/openssh net-misc/networkmanager
emerge -On net-misc/networkmanager

安装完成后,由于此时处于 chroot 环境,所以暂时无法运行此工具,等之后重启后可进行可视化配置,下文会说。

之后添加开机启动服务

# 若你是安装的 openrc 系统,执行
rc-update add NetworkManager default

# 若你是安装的 systemd 系统,执行
systemctl enable NetworkManager

安装日志服务

这段仅针对 openrc 用户,systemd 则有自带的日志服务。

openrc 这里我推荐使用 app-admin/syslog-ng ,执行

# 安装
emerge -vj app-admin/syslog-ng

# 添加开机启动
rc-update add syslog-ng default

其默认的配置即可使用。

至此,一个基础的 Gentoo Linux 系统安装完成。

重启

重启进入新的系统环境:

# 同步一下当前的文件系统
sync

# 退出 chroot 环境
exit

# 卸载所有挂载的文件系统
umount -Rl /mnt/gentoo/{dev,proc,sys,}

# 重启
reboot

使用 Gentoo Linux

重启后会出现预期中的 Grub 菜单界面,倒计时后会自动进入首选引导项,加载内核,启动初始化程序,最后进入操作系统。

这时候的 Gentoo Linux 只有一个命令行界面,先使用 root 用户登陆到系统。

登陆后完成上述没有进行完的网络配置,执行 nmtui 进入到可视化的配置界面,根据提示把网络配置完成。

完成基础配置

配置时区

这里假设设置为国内时区,执行

# 通用操作
# 将时区信息写入指定文件
echo 'Asia/Shanghai' >/etc/timezone
# 删除旧的常规文件以避免警告
rm /etc/localtime
# 更新时区信息
emerge --config sys-libs/timezone-data

# systemd 用户可选的替换操作
#timedatectl set-timezone Asia/Shanghai

如果你需要添加其它的时区,对应的时区名字可以在 /usr/share/zoneinfo/ 目录下找到,将其替换到 Asia/Shanghai 的位置后执行命令即可。

语言环境

准备系统语言环境。对于 root 用户而言,一般使用默认的配置即可。但这里需要添加上自己所需其它语言设置以供普通用户使用。

使用编辑器打开 /etc/locale.gen 文件,在里面添加上你需要的语言环境配置,说明如下:

# 这个配置是默认存在的,不用去修改它
C.UTF8 UTF-8
# 空格前代表该语言环境的名字,后代表选择的编码
# 在这里,C 是一个为计算机适配的语言环境,英文,兼容性强,root 用户下推荐使用它

# 下面是推荐添加的语言环境

# 生活在中国则添加
zh_CN.UTF-8 UTF-8

# 若 生活在其它国家
#   或需要其它国家对应的 数字、货币、日期等表示格式,
# 则添加对应国家的语言环境配置
# 配置格式为 <语言>_<国家代码>[@可选的变体].<编码> <编码>
# 其中,
#   <语言>_<国家代码>[@可选的变体] 可以在 /usr/share/i18n/locales/ 文件夹下找到
#   而支持的 <编码> 可以在 /usr/share/i18n/charmaps/ 文件夹下找到
#   编码一般只推荐使用 UTF-8,除非有明确的其它需求

当添加了其它语言环境配置后,执行

locale-gen

该命令会根据 /etc/locale.gen 下配置的内容,生成所需语言环境列表。

时间同步

为保证时间的精准,

  1. 启用对网络的时间同步服务。这里我推荐使用 net-misc/chrony 这个同步软件,执行

    # 安装
    emerge -vj net-misc/chrony
    
    # 配置 chrony 以 UTC 对待硬件时钟
    echo $'\n'rtconutc >>/etc/chrony/chrony.conf
    

    安装完成后,执行

    # openrc 用户
    rc-service chronyd start
    rc-update add chronyd default
    
    # systemd 用户
    systemctl --now enable chronyd
    

    启动服务并开机启动。

  2. 确保与硬件时钟的同步。即在系统启动时将硬件时钟同步到系统时间,并在关闭系统时(或运行过程中定时)将系统时间同步回硬件时钟。

    (此节略显繁琐,如果你初入 Linux ,对此节略感迷惑,可以跳过,不影响大局)

    (如果你永不断互联网,那忽略这一节也可以)

    在 openrc 下,会有一个默认启用的名为 hwclock 的服务负责此功能。

    在 systemd 下却没有默认的服务用于将系统时间自动同步回硬件时钟。

    而自 3.8 及以上版本的 Linux 内核开始,可以配置交由内核来全权负责此功能。

    判断当前内核是否开启了对应功能,可以通过如下命令进行验证,执行

    zgrep 'CONFIG_RTC_[H|S]' /proc/config.gz
    

    当输出内容存在

    CONFIG_RTC_HCTOSYS=y
    CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
    

    表示开启了在启动或恢复系统时从硬件时钟同步时间的功能。

    当输出内容存在

    CONFIG_RTC_SYSTOHC=y
    CONFIG_RTC_SYSTOHC_DEVICE="rtc0"
    

    表示开启了通过 NTP 同步将系统时间每隔约 11 分钟同步到硬件时钟的功能。没错,这个需要 NTP(即上述的时间同步服务)来辅助,chrony 默认配置已经支持。

    当输出的内容存在被注释的情况(行首有一个 # )则代表对应功能未开启。

    systemd 用户

    确保以上两个功能均开启即可跳过。

    若未开启,那么此时有两个选择:

    一、 安装测试版内核,执行

    # 添加基于本机架构的测试用关键字以解除测试版软件的安装屏蔽
    echo 'virtual/dist-kernel' >>/etc/portage/package.accept_keywords
    echo 'sys-kernel/gentoo-kernel-bin' >>/etc/portage/package.accept_keywords
    
    # 更新到测试版二进制内核
    emerge -vuj gentoo-kernel-bin
    
    # 更新 Grub 引导信息
    grub-mkconfig -o /boot/grub/grub.cfg
    
    # 重启系统
    reboot
    

    后再次判断功能是否已经完整开启。若依旧未,说明包维护人员再次改动了默认配置,此时只能选择自行配置内核。

    二、 自行配置内核,请参考下文 内核配置 章节,若遇问题建议寻求帮助。

    这里略作说明,可以在内核源码目录下,执行 make menuconfig 进入菜单配置界面,确认开启如下选单下的选项:

    Device Drivers  --->
      [*] Real Time Clock  --->
        [*]   Set system time from RTC on startup and resume
        (rtc0)  RTC used to set the system time
        [*]   Set the RTC time based on NTP synchronization
        (rtc0)  RTC used to synchronize NTP adjustment
        ...
        [*]   /sys/class/rtc/rtcN (sysfs)
        [*]   /proc/driver/rtc (procfs for rtc0)
        [*]   /dev/rtcN (character devices)
        ...
        <*>   PC-style 'CMOS'
        ...

    后保存退出,编译并安装内核,最后更新引导重启。

    openrc 用户

    无论什么内核什么配置,openrc 默认都会有完好的与硬件时钟的同步功能。

    但,当完整地将同步功能交给内核后 (根据上文进行判断),建议关闭其自带的同步服务,执行

    #!!! 以下内容判断后操作
    
    # 删除 hwclock 开机启动
    rc-update delete hwclock boot
    
    # 添加一个空的时钟服务以满足其它服务的要求
    rc-update add osclock boot
    

    到此时,时间同步配置完毕。

Portage 配置

Portage 是 Gentoo Linux 默认的包管理器,用于更新系统,安装各种所需软件。

Gentoo Linux 上绝大部分的软件是自行从源码编译安装而来的,所以编译过程中的一些参数也可以自由调节,这里说明几个基础配置。

make.conf

/etc/portage/make.conf 这个文件是 portage 的主配置文件,它控制了 portage 系统的绝大部分变量,你可以执行 man make.conf 看到详细的说明。

它有一个预配置好的模板文件在 /usr/share/portage/config/make.globals ,而 make.conf 下的配置会覆盖该模板下对应变量,现在只需设置如下几个变量:

# 这是一组推荐的设置
# '#' 后内容代表注释

COMMON_FLAGS="-march=native -O2 -pipe"
# 这不是一个 portage 可以识别的变量,只是方便给其它变量赋值
# 说明:
#   -march=native, -march 用于指定编译目标架构
#                  native 用于自动识别当前的 CPU 架构,它并不是一个最终参数,但方便可用
#             -O2,     -O 用于指定编译优化等级,
#                       2 是当前推荐的优化等级,它隐性地开启了一系列 flags
#                         具体参阅: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options
#                           以及: https://wiki.gentoo.org/wiki/GCC_optimization#-O
#                           以及: https://stackoverflow.com/questions/15548023/clang-optimization-levels
#           -pipe, 这个标记对代码本身不会产生影响,它能加速编译过程但会消耗更多的内存
#                  内存充足情况下建议使用,否则去掉该标记

CFLAGS="${COMMON_FLAGS}"   # 传递给 C 编译器的变量,这里将上面统一设置的值给了 CFLAGS,下同
CXXFLAGS="${COMMON_FLAGS}" # 传递给 C++ 编译器的变量
FCFLAGS="${COMMON_FLAGS}"  # 传递给现代化编译系统下的 FORTRAN 编译器的变量
FFLAGS="${COMMON_FLAGS}"   # 传递给 FORTRAN 77 编译器的变量
# 可以根据实际需要添加/修改,并传递给编译器

#MAKEOPTS="-j16"
# 这是用来告知编译器同时执行任务数的变量(这里演示设置了 16 个并行任务数)
# 通常设置为总线程数(会在编译一些大任务时占满 CPU 时间)
# 当 CPU 线程够多(>=24)的时候,推荐可以小于总线程 1-2 个任务
# 当 CPU 线程够多,但内存不足时,推荐设置为更小值
#                   Gentoo Wiki 推荐取「内存大小/2G」与「CPU 线程数」中的较小者
#                   但就我个人使用情况经验来说,要看 CPU 线程数多少,
#                                 大于 10 线程我就建议替换上述比较为:
#                                 「内存大小/1G」与「CPU 线程数」中的较小者,
#                                 然后再根据日常使用情况进行调整。
# 请自行配置后删除注释符
# 如果变量未进行设置
# 那么 portage 会根据当前 CPU 的线程数自动赋予一个值
# 该自动值等于当前 CPU 线程数

其它当前存在的内容默认即可 无需更改。随着后续的使用,会有更多的内容写入这个配置文件。

数据库

默认情况下, Portage 自带一个官方的数据库同步配置,位于 /usr/share/portage/config/repos.conf ,会以 rsync 方式从官方服务器同步数据(手动)。

而还有一种同步方式—— git,两者的优劣区别很小:

  • rsync 方式可以使用命令校验本地改动,但本地同步时速度较慢;镜像站同步上游频率正常

  • git 方式可以使用命令结合人工介入判断以校验本地改动,本地同步时速度快;官方镜像点与原始仓库同步最及时,但国内镜像站同步上游频率低

无论选择哪种同步方式,均可(目前我推荐使用 git 方式)。为了使得更新更迅速,建议自定义一个靠近自己的镜像站点。方法为,

先创建一个自定义配置文件 /etc/portage/repos.conf/gentoo.conf ,后根据同步类型进行操作,

自定义 rsync 方式同步配置

将如下内容写入上述文件中:

[gentoo]
location   = /var/db/repos/gentoo
auto-sync  = yes
sync-type  = rsync
sync-uri   = rsync://mirrors.bfsu.edu.cn/gentoo-portage
# 国内我这里建议可以使用北外的镜像站,其负载小,带宽大,更新迅速。
# 其它国内的镜像站我所知的还有:
#   TUNA: rsync://mirrors.tuna.tsinghua.edu.cn/gentoo-portage
#    163: rsync://mirrors.163.com/gentoo-portage
#  中科大: rsync://rsync.mirrors.ustc.edu.cn/gentoo-portage/
自定义 git 方式同步配置

将如下内容写入上述文件中:

[gentoo]
location   = /var/db/repos/gentoo
auto-sync  = yes
sync-type  = git
sync-depth = 1
sync-uri   = https://mirrors.bfsu.edu.cn/git/gentoo-portage.git
# 国内我找到的 git 方式同步镜像只有北外和 TUNA 两家
#   TUNA 的地址: https://mirrors.tuna.tsinghua.edu.cn/git/gentoo-portage.git
# 但它们的同步上游的频率都很低(截至发文时确认为 11 小时一次)
# 所以若使用 git 方式同步,在网络流畅的情况,个人更建议直接同步官方镜像:
#   https://github.com/gentoo-mirror/gentoo.git
sync-git-verify-commit-signature = yes
# 设置校验最上层 commit 的签名,默认是不校验的

之后执行,

emerge -vj dev-vcs/git
# 以安装 git 工具,它并不是系统自带的

rm -rf /var/db/repos/gentoo
# 删除原有的不支持 git 方式的数据库

emerge --sync
# 初始化同步一次数据库

之后,无论 rsync 方式还是 git 方式都可以很顺畅地使用 emerge --sync 命令来对数据库进行日常同步,Gentoo Linux 官方有一份较为完整的 rsync 镜像列表

设置桌面环境

Gentoo Linux 既可以作为服务器,也可以作为个人电脑来使用。

如果作为服务器,那么至此基本配置已经全部完成,后续自行根据需要安装/配置服务即可,后文会继续说明如何使用 Gentoo Linux 的包管理系统等。

而作为个人电脑,则还需安装配置额外的软件,可以是 桌面环境(Desktop Environment) ,也可以是 窗口管理器(Window Manager) (其它极少数情景不在本文讨论范围内)。

桌面环境与窗口管理器的主要区别:它俩是包含与被包含的关系,桌面环境更庞大复杂,集成的功能全面(基本你需要的都有了),开箱即用,其包含了窗口管理器;而窗口管理器,顾名思义,纯粹用于管理窗口的,一个纯窗口管理器是连基本的任务栏、托盘等基础组件都不包括的(不过现在很多都包括了),需要额外的配置后使用,它的优势在于轻量(相对于桌面环境而言,特别轻量)、简洁、更方便定制。

如今主流的 桌面环境 有很多,这里我会介绍我熟悉的 KDE Plasma,它使用 QT 实现。主流的 窗口管理器 也很多,这里我会介绍我熟悉的 Awesome WM。

X? Wayland?

无论选择安装哪种环境,都需要显示服务器作为依托。而现今 Linux 下主流的显示服务器有两种, X Window System 以及 Wayland。

简单比较(2023 年,十月):

X Window System

它是最早开发的也是现如今依旧能稳定使用的,至近两年前,基本所有的图形化软件都是针对其开发的,扩展性强,兼容性好;但各窗口间无隔离,安全性较差。

Wayland

它是一个协议,实现该协议的显示服务器(也叫 Wayland 混成)有多种,目前大部分软件对 Wayland 的支持已经较为成熟;它性能比 X 更好,窗口有隔离安全性也更好。

现如今(2023 年,十月), Wayland 已经可以替代 X 作为日用。

显卡驱动

在之前安装 Gentoo Linux 的过程中,二进制内核本身已自带了大多数显卡的内核驱动部分,该部分负责接收用户空间发送的指令及数据,进行处理后传递给显卡。

对于 X 而言,它还需要配置对应的 2D 驱动,这里以现代化的 A 卡为例,编辑 /etc/portage/make.conf 文件,添加以下内容:

VIDEO_CARDS="amdgpu radeonsi"
# 其中,
#   amdgpu radeonsi 用于给 X 开启 2D 驱动(X 下必须)
#   radeonsi 用于给 OpenGL 的实现 mesa 开启对内核下 amdgpu 驱动的支持(无论 X 还是 Wayland 均需配置)
# 如果 A 卡比较老,则额外添加 radeon 值,详细查阅: https://wiki.gentoo.org/wiki/AMDGPU
# Intel 的一般设为 intel i965 iris, 详细查阅: https://wiki.gentoo.org/wiki/Intel
# N 卡开源驱动一般设为 nouveau, 详细查阅: https://wiki.gentoo.org/wiki/Nouveau
# 虚拟机下的驱动设置得具体看,比如现在的 VirtualBox 和 VMWare 都用 vmware 驱动,
#               那么就设置值为 vmware
#               再比如 QEMU 可选使用 virgl 驱动,那么就设置为 virgl
#               等等,请自行查阅相关资料

在这里,还需将之前配置的普通用户添加到 video 组下以使用硬件加速功能。执行

groupmod -a video -U 「用户名」

切换 Profile

在安装心仪的 DE/WM 之前,建议切换到的 desktop profile 下,执行

eselect profile list
# 以列出所有的 profiles
# 然后进行选择
# 例如:
#    openrc 下,可以选择 amd64/23.0/desktop
#                  amd64/23.0/desktop/gnome
#                  amd64/23.0/desktop/plasma
#                  等
#    systemd 下,可以选择 amd64/23.0/desktop/systemd
#                   amd64/23.0/desktop/gnome/systemd
#                   amd64/23.0/desktop/plasma/systemd
#                   等

# 如若只想安装轻量级的窗口管理器,那么可以选择类似 amd64/23.0/desktop 一样的纯 desktop profile
#eselect profile set 23

# 根据本文上下文环境,这里我选择 amd64/23.0/desktop/plasma 以准备好 KDE Plasma 的前期环境
# 随着时间的推移,序号可能会不同,请根据需要选择
eselect profile set 27

且,虽然 desktop profile 下已经配置启动了基本的 ALSA 声音接口功能,但一般建议再启用 pulseaudio USE 以获得更多功能(通过 libpulse 库)。只需编辑 /etc/portage/make.conf 文件,设置

USE="pulseaudio"

安装 DE/WM

此处以安装 KDE Plasma 为例,

先更新一下当前的 Portage 数据库,使其为最新,执行

emerge --sync
# 如果你使用的是 rsync 同步方式,那么同步开始时可能会卡在
#   Refershing keys from WKD ...
# 发生这种情况是网络不通畅导致的,请等待, Portage 需要先更新它的校验公钥

在准备完上述的准备工作后,执行以下命令,开始安装过程:

# 如需添加 Wayland 支持,请在 /etc/portage/make.conf 下的 USE 变量中加上 wayland

# 执行此命令将 plasma-meta 这个元包添加到 world set 中,关于 world set 后文使用 Portage 一节有指引
emerge -Ow kde-plasma/plasma-meta

# 处理下桌面环境下的依赖关系
echo "media-libs/freetype harfbuzz" >>/etc/portage/package.use/desktop
# (随着时间的推移,可能后续会有其它依赖关系问题,若出现,可使用本文开头的邮件列表以寻求帮助)

# 先安装一个 rust-bin 以避免待会儿依赖安装需要编译的 rust
# (因为完整编译 rust 会很久,除明确需要外没太大必要)
emerge -vj1 dev-lang/rust-bin

# 再整体更新一下整个系统
emerge -ajvuDN --keep-going @world
# 等待依赖计算完成后按回车以开始更新

此过程会比较漫长,由具体机器的性能而定。万一更新过程中失败,有可能为

  1. 偶然问题,尝试对出问题软件包单独安装,使用命令 emerge -vj1 <包名> 进行;成功后再次运行上述更新命令

  2. 因为内存太低导致的,尝试去除上述命令选项中的 j 重新更新

  3. 其它问题,请查看提醒的相应编译日志,如不能解决,可使用文章开头邮件列表以寻求帮助

上述安装完毕后,可选安装 KDE Plasma 的应用元包,执行

# 这是一个可选命令,它会引入 KDE 应用
# 个人建议没必要使用默认设置来安装 kde-apps/kde-apps-meta 包,
# 因为会引入太多不常用的应用
# 建议根据 USE 来管理(下文 USE 标记一节有说明),选择性安装,即
echo 'kde-apps/kde-apps-meta -*' >/etc/portage/package.use/kdeapps
# 同时取消 kdecore-meta 的 webengine 依赖,以减少当下的编译时间
echo 'kde-apps/kdecore-meta -webengine' >>/etc/portage/package.use/kdeapps
# 以安装最核心的 KDE 应用
emerge -vj kde-apps/kde-apps-meta
# 其它 KDE 应用根据需要安装即可

配置 DM 启动

到此时,用于启动桌面环境的必要组件都安装完毕了,接下来需要配置 DM 的开机启动,并启动它

openrc 下

先编辑 /etc/conf.d/display-manager ,设置

DISPLAYMANAGER="sddm"
# 这样就设置了 sddm 作为默认的 DM,如果你安装了别的 DM,那么根据提示做对应设置

然后执行

rc-update add display-manager default
# 设置其默认开机启动

rc-update add dbus default
# openrc 下请也同时设置 dbus 的开机启动
# 若不设置,虽然 display-manager 也会启动它,但有时候会出现奇怪的问题,原因我还未查明

# 以下步骤等待下次重启后会自动执行
rc-service dbus start
# 先启动 dbus
rc-service display-manager start
# 再启动 DM
systemd 下

则直接执行

systemctl --now enable sddm.service
# 以启用,如果是其它的 DM 也是启用对应的服务即可。

之后,确保 DM 界面选定了所需的 Plasma Session,再选择对应的普通用户,输入密码后登陆。

动画过渡后,就进入了人性化的桌面环境。

必要的桌面应用

以下操作需要在桌面的终端或者 TTY 下,以 root 权限进行。

如果是在桌面终端的话,打开终端后,执行 su - 或其它等同命令进入 root 用户下;如果之前安装并配置了 app-admin/sudo 工具,那么也可以以普通用户在下述的每一条命令前添加上 sudo「空格」 后执行。

中文字体

在应用之前,最好先安装好中文字体,官方仓库提供有中文字体的包有

  • media-fonts/arphicfonts

  • media-fonts/noto-cjk

  • media-fonts/source-han-sans

  • media-fonts/wqy-microhei

自行选择安装即可,比如,

emerge -vj media-fonts/noto-cjk

也可以将其它的字体文件复制到目录 ~/.local/share/fonts/ 下,然后执行 fc-cache 创建字体缓存。

输入法

作为中文用户,肯定需要款输入法,我推荐使用 fcitx (还有一款叫 ibus ,但是我不熟,就不介绍了)。 目前稳定维护的 fcitx 版本是 5,安装方法为:

# 这里示例一种尽可能全的方式

# 先配置下 fcitx-gtk:5 开启对 gtk2 的支持以避免有些程序无法使用(gtk3/4 默认开启了)
echo 'app-i18n/fcitx-gtk:5 gtk2' >>/etc/portage/package.use/fcitx

# 然后安装输入法框架主体
emerge -vj app-i18n/fcitx:5 app-i18n/fcitx-configtool:5 app-i18n/fcitx-qt:5 app-i18n/fcitx-gtk:5
# 其中, app-i18n/fcitx:5 是 fcitx 的主程序
#     app-i18n/fcitx-configtool:5 是它的配置工具
#     app-i18n/fcitx-qt:5 用于支持在 qt 程序上使用它
#     app-i18n/fcitx-gtk:5 用于支持在 gtk 程序上使用它

# 最后选择一个你需要的输入法,比如 RIME 或者 其他存在于 Chinese-addons 里面的
# 这里以安装 RIME 为例
emerge -vj app-i18n/fcitx-rime:5
# 之后等待安装完成即可。
# 如果不需要 rime,则可以考虑安装 app-i18n/fcitx-chinese-addons:5 这个包。

安装完成后,需要配置一下需要的环境变量,这里可以另开一个终端,以普通用户身份添加,

  • X 用户可以添加到 ~/.xsession 文件内(不存在则创建一个)

  • Wayland 用户根据不同的 DE/WM 有不同的添加位置,比如 KDE 可以添加到 ~/.config/plasma-workspace/env/fcitx.sh 文件内(不存在则创建一个)

添加的内容为:

export XMODIFIERS="@im=fcitx"
export QT_IM_MODULE=fcitx
export GTK_IM_MODULE=fcitx
export SDL_IM_MODULE=fcitx

之后,登出 KDE Plasma,后重新登陆,此时只需做最后的配置,以安装的为 fcitx-rime:5 为例,

  1. 右击托盘区输入法图标,选择 Configure

  2. 点击右下角 Add Input Method

  3. search 框下输入 rime

  4. 选中 Rime 后点击右下角的 Add

  5. Apply 后退出界面

  6. 右击托盘区输入法图标,选择 Restart

之后, Rime 会进入一个部署状态,等待片刻后即可使用。默认情况下, Rime 输出的为繁体中文,常规有两个方法切换成简体,

  • 临时选择简体,按下 Ctrl + ` 后在弹出的选框中选择。

  • 永久修改,这里区分 fcitx 的版本,版本 4 对应目录 ~/.config/fcitx/rime/ ;而版本 5 对应目录 ~/.local/share/fcitx5/rime/ ,在对应目录下(这里的 ~ 依旧是普通用户的家目录)创建文件 luna_pinyin.custom.yaml 并添加以下内容:

# 注意缩进
patch:
  switches:
    - name: ascii_mode
      reset: 0
      states: [ 中文, 西文 ]
    - name: full_shape
      states: [ 半角, 全角 ]
    - name: simplification
      reset: 1
      states: [ 漢字, 汉字 ]

后重启 fcitx 即可(详情见 Rime 的 CustomizationGuide )。

浏览器

关于浏览器的选择,有很多,比如

  • www-client/google-chrome (chrome 的官方二进制包)

  • www-client/google-chrome-beta (chrome 的官方二进制包, beta 分支)

  • www-client/chromium (chromium 源码包,需编译,时间很久很久)

  • www-client/firefox-bin (火狐官方二进制包,国际版)

  • www-client/firefox (火狐源码包,需编译,时间很久)

  • www-client/microsoft-edge-beta (Edge 官方二进制包, beta 分支)

可以自行选择安装。命令依旧是 emerge -vj <包名> 。安装个别浏览器时,可能会因为许可问题导致无法安装,如何解决看下文的 软件的许可 一节。

其它的应用自行发掘。这里有推荐应用列表:

至此,桌面配置告一段落。

使用 Portage

Portage 是 Gentoo Linux 的包管理系统,本文自开始至此,大部分时候都在围绕 Portage 操作,本段详细说明一下它的日常使用。

几个基础概念

  • ebuild 可以指文件,此文件是组成软件包的最小部分,定义了软件包如何安装,依赖关系等,存放在 portage 数据库路径下

  • ebuild 也可以指一个命令,该命令用于测试 ebuild 文件

  • emerge 是 portage 系统的主命令,它负责 portage 系统的几乎所有功能

  • distfile 是 portage 下载的软件包原始文件,它可能是源码包,也可能是二进制包,因软件包而异

  • 集(sets)是 Portage 用于管理软件包的一种方式,用户安装的软件一般会添加到 world 集中,详见 Package sets

  • Portage 拥有一个名为 gentoo 的主仓库,同时也能添加额外的仓库以作补充,额外的仓库优先级默认高于主仓库,详见 ebuild repository

几个基础命令

  • emerge --info 用于查询 Portage 的信息

  • emerge --sync 用于更新数据库

  • emerge -s <包名> 用于查询软件包

  • emerge <包名> 用于安装软件包

  • emerge -r 用于恢复上一次失败的 emerge

  • emerge -ac 自动清理系统下的软件包

  • emerge -vpc <包名> 用于查询当前所有对该包的依赖

  • emerge -avuDN @world 用于更新系统,这个是日常更新的基础命令,常见的组合为:

    # 先更新数据库
    emerge --sync
    # 再更新系统
    emerge -avuDN @world
    # 更新完毕后清理系统
    emerge -ac
    
  • emerge -C <包名> 用于卸载软件包,但是注意,这个命令可能会破坏掉系统的依赖关系,所以更合理的卸载方式为:

    # 先删除软件包的 world 集记录
    emerge --deselect <包名>
    # 再清理系统
    emerge -ac
    

emerge 常用选项

先解释上述基础命令中的选项,其中

  • -C, -c, --deselect, --info, -r, -s, --sync 都是执行的对应操作,不属于选项

  • -D 表示检查包的整个依赖树

  • -N 表示检查 USE 的任何改动

  • -a 代表询问以确认执行该操作

  • -u 表示升级,略过不升级的包

  • -v 表示显示详细信息

其它常用的选项有

  • -1/--oneshot 一般用在安装软件包时,不将该包添加到 world 集中

  • -O/--nodeps 不计算依赖关系,只操作指定的包(安装时可能会因为依赖不满足而导致安装失败)

  • -f/--fetchonly 仅下载指定包及其依赖的 distfiles 而不进行安装

  • -j/--jobs 设置 Portage 同时执行的最大任务数,如果未设置数量,那么 Portage 不会限制最大的任务数

  • --keep-going 它会在安装出错时,跳过安装失败的包,并重新计算依赖后继续安装剩余包

  • -n/--noreplace 不重复安装已经安装的包(默认会忽略掉 USE 的改动以及升级的查询,除非对应加上 -D/-U-u 选项)

  • -p/--pretend 假装进行该操作(实际不进行),一般只计算依赖关系,也可用于非特权用户查询信息用

  • -t/--tree 显示给定包的安装依赖树

USE 标记

USE 标记是 Portage 系统的一个核心功能,很多包都会有可选的 USE 标记,正如上文有地方会写入到 package.use 文件夹下的内容。Portage 使用它来管理每个包的功能,是一个很重要的特性。

在日常使用过程中,也会发现包与包之间关于对 USE 标记的依赖问题,比如当一个包 A 依赖另一个包 B 的 USE 非默认时,会出现无法安装的问题,此时需要对 B 包配置其 USE 标记。

USE 的配置可以分为全局的和局部的:

全局配置

自定义的全局配置可以编辑 /etc/portage/make.conf 文件下的 USE 变量,这个变量是一个增量型的,它会与默认的 /usr/share/portage/config/make.globals 文件下的 USE 配置,以及选定的 profile 下的 USE 配置组合,可以使用如下命令查看当前应用的全局 USE 标记:

emerge --info | grep '^USE'

全局的 USE 会应用给当前系统下支持该 USE 的所有包,谨慎配置。

局部配置

自定义的局部配置则编辑 /etc/portage/package.use 文件,如果这个路径是一个文件夹,那么编辑该文件夹下的任意文件即可,一般建议使用文件夹来进行管理。

其配置格式为

# 注释
<类>/<名> <USE>

# 亦可指定版本,比如对 21.04.3 及以上版本的 kde-apps-meta 进行配置
>=kde-apps/kde-apps-meta-21.04.3 -* admin
# USE 标记前加 - 代表去掉这个 USE,
# 上述 -* 代表去除该匹配的包的所有已经添加的以及默认的 USE
# 然后再启用 admin 这个 USE 标记

Portage 有一个 USE Expand 功能,即把指定变量的值扩展成 USE,这些指定的变量被设置在 Portage 数据库路径下的 profiles/base/make.defaults 文件的 USE_EXPAND 变量中。这个功能很实用,简化了配置值,还能进行归类,更便于管理。上文有一个 显卡的配置 其实就是一个 USE_EXPAND 值。其它会使用到它的地方不多,但也有,比如:

# 配置全局的本地化配置,就可以在 make.conf 文件下配置
L10N="zh-CN zh-TW zh en-GB-oxendict en"
# 这样,那么以后当有包支持上述的本地化配置时,就会自动添加

# 其它比如可以对 qemu 这个虚拟机添加额外的模拟平台,
# 可以往 /etc/portage/package.use/qemu 文件写
# app-emulation/qemu QEMU_SOFTMMU_TARGETS: aarch x86_64
# 以支持 arm64 及 x86_64 平台。等等

关键字

ACCEPT_KEYWORDS 这个是一个针对 CPU 架构及软件的稳定/测试分支的变量。 在上文我有写到 为何不建议全局 ~amd64 关键字,这里详细说明这个变量。

Portage 会默认启用针对当前 CPU 架构的关键字,即: AMD64(x86_64) 架构,默认启用 amd64 关键字; ARM64(AArch64) 默认启用 arm64 关键字,以此类推。

这个关键字是用于判断软件包稳定性的,软件的维护者会在维护软件(维护 ebuild)时,对该软件设定好对应架构的稳定程度,当该软件设定好的关键字在系统下未被接受时,该软件将无法被安装。

上述默认启用的关键字是一个稳定关键字,这里以 arch 来表示,而还有一个测试关键字 ~arch ,即在稳定关键字前加一个 ~ 符号。

默认情况下,系统都会接受当前架构的稳定关键字,你可以根据需要添加或者删除所需的关键字。

自定义 ACCEPT_KEYWORDS 变量同样分为全局和局部,全局配置依旧在 /etc/portage/make.conf 文件内。

可以按包进行局部配置则是在 /etc/portage/package.accept_keywords 文件,它和 package.use 一样,如果路径为文件夹,那么将配置写入该文件夹下的任意文件内即可。格式如下:

# 注释
<类>/<名> [可选的关键字配置]
# 当只指定了包,却未添加任何关键字时
#        默认添加当前架构的测试关键字:~arch,
#        比如 amd64 平台则默认添加 ~amd64
# 这里存在一种情况,当软件未设置任何关键字时,
#          这种情况一般出现在实时(live)包上(版本号通常以 9999 结尾的)
#          那么为了安装此包,需为其设置标记 **
#          代表忽略关键字检查
#       比如欲安装实时的 app-editors/vim 包,则配置
#          app-editors/vim **

# 亦可指定版本,比如对 21.04.3 及以上版本的 kde-apps-meta 进行配置
#>=kde-apps/kde-apps-meta-21.04.3

无论是全局配置还是局部配置,其都是一个增量值,如需去掉所有之前配置的关键字,同样使用 - 符号。

软件的许可

Portage 下的软件包很多,每个包所使用的许可也不尽相同。默认情况下,基础的 profile 配置已经接受了各种自由许可,使得安装自由软件不再需要额外的许可步骤。

而一些私有软件,所使用的许可默认是不接受的,于是安装他们的时候会出现无法安装的情况,这时候有两个方式来解决。

一是全局配置接受所有许可,这个方法一劳永逸,以后再也不会提示因为许可而导致的软件无法安装,方法是在 /etc/portage/make.conf 文件内添加

ACCEPT_LICENSE="*"

另一个则是当每次出现许可问题时,单独添加该软件的许可到 /etc/portage/package.license 文件内,或者该文件夹下的任意文件内(许可名会在出现问题时提醒)。格式为

# 注释
<类>/<名> <许可名称>

# 亦可指定版本,比如对 20210818 及以上版本的 sys-kernel/linux-firmware 进行配置
#>=sys-kernel/linux-firmware-20210818 linux-fw-redistributable no-source-code

请根据自己的喜好,自行选择。

emerge 默认选项

emerge 支持配置一组默认选项,用于在每次运行 emerge 时采用。这个储存默认选项的变量名为 EMERGE_DEFAULT_OPTS ,在 make.conf 文件下设置。

常见设置的默认选项有

-v/--verbose

显示详细信息

--keep-going

上文已交代

-j/--jobs

上文已交代,这里作补充。如果要将该选项添加到默认选项下,那么建议配合 -l/--load-average 使用, -l/--load-average 用于配置 emerge 的负载阈值,当当前负载到达设定值后, emerge 将不再开启新任务,以避免负载过高,这在 CPU 不够强悍或者内存不宽裕的机器上很需要。比如在一个 8 核 16 线程 16G 内存的机器上,可以设置成 -j -l 12 ,这样的设定使 portage 的并行任务数不由硬性规定的数目来限制,而是通过动态负载来进行限制。

--autounmask

这是一组在新装软件包时便于解除安装限制的选项。之前有介绍,在 Portage 安装软件的过程中,可能会因为 USE/License/Keywords 等因素导致无法直接安装,需要配置后再进行,而这组选项可以自动化这个过程。个人建议的相关选项组合为 --autounmask --autounmask-keep-masks --autounmask-write=n ,此组合不会完全自动写入配置到系统下,但是提示了如何配置,方便手动写入,既简化了处理限制的流程,又能保证掌握每次安装包时的改动。

那么这里一组比较推荐的默认选项配置为

EMERGE_DEFAULT_OPTS="--autounmask --autounmask-keep-masks --autounmask-write=n -j -l 12 --keep-going -v"
# 其中的 12 请根据实际情况修改
# 如果配置了上文的 binhost ,那么对应选项也添加进入。
# 设置默认 -v 选项会导致 emerge -ac 时输出额外非必要信息,不喜可取消默认 -v 选项

其它的选项请自行发现。

Portage 的内容太多,以上仅列出了几个经常会使用到的配置。更多内容,请通过执行 man portage , man emerge , man make.conf 查询,或者访问 Gentoo Linux 官方维基。

关于配置文件的更新

有时候在更新了某些软件包后你会发现出现了一个类似如下的提示信息:

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

正如提示所说,完全可以自行查阅手册获取帮助,这里简单说明一下。

一般出现这种情况的直接原因是你通过归属于一个软件包的文件修改了其默认配置,导致新安装的文件与现存文件不符,于是 Portage 出于保护现存文件的目的,将新文件重命名为了对应目录下的 ._cfgxxxx_<原名> 文件,这是一个很常见的情况。

而每当出现这种情况后,需要做的操作就是人工介入,判断一下保留哪个文件,还是将两个文件合并。而自带用于进行此操作的对应命令有 dispatch-confetc-update

dispatch-conf 为例,root 权限下执行后,它会逐个文件列出改动,然后提示你进行操作,比如按 z 保留旧的配置文件,按 u 使用新安装的配置文件替换旧的,等等。

常用工具

单纯 Portage 自带的工具对于日常管理其会显得有些吃力,这里推荐几个比较有用的软件用于辅助管理 Portage。

app-portage/eix

这个可以说是非常有用的软件,主要用于查询 Portage 数据库,其优势在于更快的速度、更人性化的显示格式以及更方便的查询模式。

使用前需执行 eix-update 以更新 eix 数据库,安装它之后,可以使用 eix-sync 命令来更新 Portage 数据库,更新完毕后会自动更新 eix 数据库,并显示更新前后的软件包对比情况。

使用 eix 查询所需软件,最基本的命令为

eix <包名匹配字符串>

# 也可只查询已安装的包
eix -I <包名匹配字符串>

# 也可查询属于一个特定分类下的所有包
eix -C <类名>

等等,执行 man eix 查看更多用法。

app-portage/gentoolkit

包含了 Gentoo 的一些管理脚本,常用的命令有用于查询依赖关系,文件归属,软件包内容的 equery ,以及用于清理 distfile 的 eclean-dist 。比如

equery d vim-core
# 可以查询依赖 vim-core 的软件包(仅根据 ebuild 文件内容查询)

equery g vim
# 可以查询 vim 下属的依赖关系图

equery f vim
# 可以查询 vim 安装了哪些文件到系统下

equery b /usr/bin/vim
# 可以查询这个文件属于哪个包

eclean-dist -d
# 可以清理未安装在系统下的 distfile 文件

等等,请自行发现。

app-portage/portage-utils

包含了 Portage 的帮助工具,与上面 gentoolkit 的功能有重合,他们具有互补性,常用的命令有用于分析 emerge 日志的 qlop 。它是用 C 写的,速度更快。

app-portage/pfl

Portage File List,可用于在线查询文件所归属的包,命令为 e-file <文件名>

多版本管理

Gentoo Linux 支持同一软件多版本同时存在于系统上,这归功于 Portage 系统的 slotting 机制。当你执行命令 eix dev-lang/python 会发现它有好多行可用版本,最前圆括号内的内容即对应的 slot 名,不同 slot 下的版本可同时安装到系统上( slot 名内 / 符号后的内容表示其 sub-slot,同 slot 但不同 sub-slot 的版本无法共存)。比如,sys-devel/gcc , sys-devel/clang , dev-lang/lua 等等都支持多版本共存。

对于一些多版本共存的工具, Gentoo Linux 准备了对应的 eselect 命令以方便用户选择使用。其会在对应的 $PATH 目录下创建一个指向当前选定版本命令的软链接。比如,

eselect lua list
# 列出当前所有已经安装的 lua 版本

eselect lua set {序号}
# 这样就设定了系统下用户交互环境的默认 lua 版本

其它的类似,执行 eselect help 以查看当前所有支持的模块。不是所有的多版本共存的包都会有 eselect 模块,它们并不存在强制的依赖关系。执行 eix -I2 可以显示当前系统下安装的可多版本共存的包。

Proxy

并不是所有的 distfile 都能从镜像站下载,当遇到 distfile 下载不下来(或者 git 仓库克隆不下来)需要使用代理的时候,如何为 Portage 正确地配置 Proxy 呢。关于这个问题,我之前有一篇文章详细谈到了: https://bitbili.net/set-proxy-for-gentoo-portage.html

至此, Gentoo Linux 所特有的用法(除内核外)大致说明完毕。

关于内核

自本文开始至此,我特意简略了所有关于内核的相关配置,原因是内核的配置非常复杂,需根据每台机器的环境而定,为了使读者可以在完全参照本文命令的情况下完整安装好 Gentoo Linux,我选择了预编译好的,适用范围最广的二进制内核。

而在这里,我会简述一些通用设定及操作。

可用内核版本

Gentoo Linux 所提供的可用内核都在 sys-kernel 类下,使用命令 eix -C sys-kernel 即可列出。而其中以下三个版本更通用:

sys-kernel/gentoo-sources

这是最高到内核主线版本的内核源码包,需要自行配置后,再自行编译后安装

sys-kernel/gentoo-kernel

这是最高到内核主线版本的内核源码包,但同时包含了通用的内核配置,可自动编译后安装

sys-kernel/gentoo-kernel-bin

这是最高到内核主线版本的内核二进制包,也是本文使用的内核,其使用的是最通用的内核配置

::gentoo 这个官方仓库内,能被定为稳定的内核版本,目前只有 长期支持(Long-term support) (LTS) 版本。但这并不意味着该仓库下的 test 版本内核就不稳定,以上三个版本的内核的 test 分支均可使用,追溯的是上游的主线版。

在这里,我以 sys-kernel/gentoo-sources 为例。

编译安装的整体流程

根据上下文环境,当前系统下只有一个二进制的内核,因此先安装上述内核,然后开始(以下操作需 root 用户进行,或自行使用 sudo 等命令)

# 安装源码版的内核,以及 genkernel 工具
emerge -vj sys-kernel/gentoo-sources sys-kernel/genkernel
# 此处的 genkernel 工具可用于生成内核的 initramfs 文件

# 安装完毕后使用 eselect 列出当前所有的内核
eselect kernel list

# 将源码版的内核设为选定
eselect kernel set {序号}
# 此时,路径 /usr/src/linux 会软链接到新安装的源码版内核目录下

# 切换到内核目录下
cd /usr/src/linux

# 创建/修改配置文件
make localmodconfig
# 此命令基于当前环境快速创建了一个可用配置文件
# 详细看下一节说明

# 编译内核
make -j {任务数}

# 无报错后安装模块及内核
make modules_install
make install

# 生成此内核对应的 initramfs 文件
genkernel --kernel-config=/usr/src/linux/.config initramfs

# 更新 Grub 菜单
grub-mkconfig -o /boot/grub/grub.cfg

以上即内核从配置到编译到安装再到更新启动菜单的整体流程。

关于内核配置

内核是否真的需要自定义配置?这个问题因人而异,有人想要一份精简的内核,有人只要功能完善即可。我个人建议则是,非嵌入式环境下,对内核体积没要求情况下量力而行即可。内核的配置系统太过庞与复杂,理解所有的配置很难。而纯粹使用通用的配置则会导致模块目录太大,无用的模块太多,也不妥。

上述步骤中的 make localmodconfig 生成了一份完整的内核配置文件。此命令的含义是,以当前系统环境为参考,禁用没有被加载的模块配置。可在纯模块加载的系统环境下,接上你有的设备,开启你需要用到的所有服务,然后执行它。一般用于首次配置内核,使得后续配置更轻松。

而进一步的配置可以在内核目录下使用 make menuconfig 命令打开一个界面化的配置菜单,根据界面内提示进行。也可以执行 make help 显示帮助信息,以方便根据需要自行选择。

自定义配置时,建议给该配置文件设定一个自定义版本,以便于区分,配置路径位于:

General setup  --->
  (-examplename) Local version - append to kernel release

其它的项目本文不会说明,建议查阅 官方内核配置文档 ,其它可查阅的资料有:

关于 initramfs

配置内核时,有一个重要的内容是 initramfs (initial ram file system) ,它用于解决如何在真正初始化系统运行前执行用户空间程序。类似的方案还有一种叫 initrd ,两者功能基本一致,实现方式有差异,这里只以 initramfs 为例说明。

它代表着一种方案,也代表着一个文件。它在一些基础情况下并不是必须的(比如本文的上下文环境)。

在说明它存在的意义前,先简单说明下 Linux 系统的基本启动流程:

  1. PC 加电,BIOS/UEFI 自检后载入系统引导程序

  2. 引导程序载入内核

  3. 内核挂载根目录所对应的分区

  4. 内核执行根目录下系统的初始化(init)命令

  5. 自此来到了用户空间下

这个基本的流程里面会出现问题,看步骤 3

  • 问题一、如果这个根目录的分区无法直接挂载怎么办(被加密了、使用了 RAID、它是一个 NFS,等情况)

  • 问题二、如果这个根目录的分区下的 /usr 又单独分区了,里面没所需文件怎么办(这个文件夹包含了系统的库文件等)

如果上述两种情况都未出现,那么只要把根目录分区所对应的文件系统驱动被编译进内核(而非模块的形式),就可以省略掉 initramfs ;如果出现了任意一种情况,这个时候就需要 initramfs 的参与。

正如前文所说, initramfs 提供了在真正系统初始化前提前进入用户空间的功能,它其实就是一个简略版的完整系统,通过它,可以把该解密的分区解密,该挂载的内核无法直接挂载的分区(包括模块未加载,额外的分区,需要联网等情况)都挂载好,之后再由根目录下真正的系统初始化程序接管。

了解了其功能,现在开始说如何制作它。

Gentoo Linux 提供了一个工具叫 sys-kernel/genkernel 可用于创建 initramfs ,并且有别于其它的 initramfs 创建工具, genkernel 会单独编译一个独立的 initramfs 环境(而非直接使用当前系统环境),并打包压缩。这会使得其相对于其它的工具(比如 dracut)创建过程更慢。

简单的使用例子 上文已有 ,其配置文件位于 /etc/genkernel.conf ,里面对每个变量的设置都有详细的说明。

总结及引导

本文以一条较为单一的路线讲述了 Gentoo Linux 的安装及使用,勾勒了一个大致的框架,以便于快速掌握。

当通读了安装几章后会发现, Gentoo Linux 的安装其实很简单,复杂的在它的使用上。同时还会发现,使用 Gentoo Linux 需要一定的耐心,Portage 的绝大部分的软件包都是从源码编译安装的,相对于其它二进制包的发行版,会比较花时间。

而使用源码进行安装的好处,可以在日常使用中来逐渐发现,举个例子,你可以很方便的给需要的软件包打 patch 后编译安装到系统上(还不会污染包管理系统),以满足自己的需要。使用源码进行安装使得 Gentoo Linux 可以只依赖于软件包的最上游,更安心。

由于 Portage 的依赖管理在本地,所以系统上的所有软件包都会处于自己的掌控范围内(比如可以在系统整体升级的情况下,设置某几个包不升级,只要处理好依赖关系)。

我对 Gentoo Linux 的评价是 随心所欲

至此,内容已全部结束。

若对本文有任何问题,都欢迎访问文章 开头 仓库,make PR or open issue

接下来,

  • 若想进一步学习 Gentoo Linux 的知识,请访问文章 开头 所指出的 Gentoo Wiki 页面。里面的内容非常之丰富。

  • 若对 Gentoo Linux 下的 Portage 包管理器感兴趣,请访问 开发手册

建议,

  • 善用搜索

  • 不在不明白某个配置/选项含义时使用它

  • 每次安装新的系统服务/系统工具时,都去查阅下 Gentoo wiki 对应词条

  • emerge 完成后,出现的提示信息要看

  • 新出的 news 要看

完。

题外话:

我有一个脚本,可以比较方便地将其它 Linux 发行版转为 Gentoo Linux,目前还是处于测试状态中,有需要的话可以使用,有问题可以找我反馈,但我不负责数据丢失等问题。

地址 https://gitlab.com/cwittlut/distro2gentoo

记录把 service worker 切换到由 Workbox 生成的过程 【流水帐】 GnuPG 2.3.2 与 yubikey-manager 的冲突
显示 Disqus 评论(需自备梯子)