跳至主内容
  1. 文章/

Gentoo Linux 安装指南(基础篇)

··约 33 分钟· loading · ·
Zakk
作者
Zakk
在澳洲念艺术,和 Paper 一起(她后来也来澳洲念大学),家里养着一窝天竺鼠,同时写 Linux 与日常随笔。
本页导航

说明
#

本文为 Gentoo Linux 安装指南 系列的第一部分:基础安装

系列导航

  1. 基础安装(本文):从零开始安装 Gentoo 基础系统
  2. 桌面配置:显卡驱动、桌面环境、输入法等

阅读顺序

  • 基础安装(第 0-11 节)→ 桌面配置(第 12 节)

指南说明
#

本文演示完整的 Gentoo 安装流程,并提供官方 Wiki 和技术文档链接,供查阅各步骤的原理和配置细节。

本文以官方手册为准,并附有参考链接。安装 Gentoo 时需要自行查阅 Wiki 和排查问题,可使用搜索引擎或 AI 工具查找资料。

如有疑问或发现问题,可通过以下渠道提出:

请以官方手册为准

内容已验证至 2025 年 11 月 25 日

Gentoo 简介
#

Gentoo Linux 是基于源代码的 Linux 发行版,支持高度定制和性能优化。与其他发行版不同,Gentoo 让用户从源代码编译所有软件,因此:

  • 硬件优化:软件针对硬件编译
  • 系统组成:决定系统包含和不包含的内容
  • 系统理解:通过亲手构建系统理解 Linux
  • 编译时间:初次安装需要较长时间(建议预留 3-6 小时)
  • 学习曲线:需要一定的 Linux 基础知识

适合人群

  • 想深入学习 Linux 的技术爱好者
  • 追求系统性能和定制化的用户
  • 喜欢 DIY 过程的用户

不适合人群

  • 需要快速安装并使用系统的新手(建议先尝试 Ubuntu、Fedora 等)
  • 没有时间配置和维护系统的用户
核心概念(点击展开)

安装前需要了解以下概念:

Stage3 (Wiki) 一个最小化的 Gentoo 基础系统压缩包,包含构建完整系统所需的基础工具链(编译器、库等)。将其解压到硬盘后,它成为新系统的基础。

Portage (Wiki) Gentoo 的包管理系统。它不直接安装预编译软件包,而是下载源代码并按配置编译后安装。核心命令是 emerge

USE Flags (Wiki) 控制软件功能的开关。例如,USE="bluetooth" 会让所有支持蓝牙的软件在编译时启用蓝牙功能。这是 Gentoo 定制化的核心。

Profile (Wiki) 预设的系统配置模板。例如 desktop/plasma/systemd profile 会自动启用适合 KDE Plasma 桌面的默认 USE flags。

Emerge (Wiki) Portage 的命令行工具。常用命令:

  • emerge --ask <包名> - 安装软件
  • emerge --sync - 同步软件仓库
  • emerge -avuDN @world - 更新整个系统
安装时间估算(点击展开)
步骤预计时间
准备安装媒介10-15 分钟
磁盘分区与格式化15-30 分钟
下载并解压 Stage35-10 分钟
配置 Portage 与 Profile15-20 分钟
编译内核(最耗时)30 分钟 - 2 小时
安装系统工具20-40 分钟
配置引导程序10-15 分钟
安装桌面环境(可选)1-3 小时
总计3-6 小时(取决于硬件性能)

提示

预编译内核和二进制包可以大幅缩短安装时间,但会牺牲部分定制性。

磁盘空间需求与开始前检查清单(点击展开)

磁盘空间需求
#

  • 最小安装:10 GB(无桌面环境)
  • 推荐空间:30 GB(轻量桌面)
  • 完整桌面:80 GB+(完整桌面 + 编译缓存)

开始前的检查清单
#

  • 已备份所有重要数据
  • 准备了 8GB+ 的 USB 闪存盘
  • 建议使用稳定的有线网络
  • 预留充足时间(建议完整的半天)
  • 具备一定的 Linux 命令行基础
  • 准备另一台设备查阅文档(或使用 GUI LiveCD)

内容概览
#

本文说明如何在 x86_64 UEFI 平台安装 Gentoo Linux。

涵盖内容

  • 从零开始安装 Gentoo 基础系统(分区、Stage3、内核、引导程序)
  • 配置 Portage 并优化编译参数(make.conf、USE flags、CPU flags)
  • 可选配置(LUKS 根文件系统加密)
  • 桌面配置 涵盖桌面环境、locale、字体、Fcitx5 输入法、Flatpak 和系统维护

重要提醒

关闭 Secure Boot
开始安装前,请在 BIOS 中暂时关闭 Secure Boot。启用 Secure Boot 可能导致安装介质无法启动,或导致安装后的系统无法引导。系统安装完成并成功启动后,可参考本指南后续章节重新配置并启用 Secure Boot。

数据备份
本指南包含磁盘分区操作。开始前请备份所有重要数据。


0. 准备安装媒介
#

0.1 下载 Gentoo ISO
#

下载页面提供的方式获取下载链接。

注意

以下命令从官方 current-install-amd64-minimal 目录读取当前 ISO 文件名。

下载 Minimal ISO:

ISO_DIR=https://distfiles.gentoo.org/releases/amd64/autobuilds/current-install-amd64-minimal
ISO=$(wget -qO- "$ISO_DIR/latest-install-amd64-minimal.txt" | grep -E '^install-amd64-minimal-[0-9]{8}T[0-9]{6}Z[.]iso ' | cut -d' ' -f1)
test -n "$ISO" || exit 1
wget "$ISO_DIR/$ISO" "$ISO_DIR/$ISO.asc"

新手可选:LiveGUI USB Image

安装时如需直接使用浏览器或更方便地连接 Wi-Fi,可选择 LiveGUI USB Image

建议新手从 Gentoo 官方下载页面 选择 LiveGUI USB Image。

Live ISO 登录凭据

  • 账号:live
  • 密码:live
  • Root 密码:live

系统支持

  • 支持中文显示、Fcitx5 输入法和 flclash 等

验证签名(推荐):

# 导入 Gentoo 官方发布签名公钥。
# 推荐方式:使用 Live media 或 sec-keys/openpgp-keys-gentoo-release 提供的本地副本
gpg --import /usr/share/openpgp-keys/gentoo-release.asc
# 备用方式:autobuild 由每周自动发布密钥签名;没有本地副本时,从 keyserver 获取:
#   gpg --keyserver hkps://keys.gentoo.org --recv-keys 13EBBDBEDE7A12775DFDB1BABB572E0E2D182910

# 验证 ISO 文件的数字签名
gpg --verify "$ISO.asc" "$ISO"
# "$ISO.asc":签名文件(ASCII armored)
# "$ISO":待验证的 ISO 文件

0.2 创建 USB 安装盘
#

Linux:

sudo dd if="$ISO" of=/dev/sdX bs=4M status=progress oflag=sync
# if=输入文件 of=输出设备 bs=块大小 status=显示进度

提示

请将 sdX 替换为 USB 设备名称,例如 /dev/sdb

**Windows:**推荐使用 Rufus → 选择 ISO → 写入时选择 DD 模式。


1. 进入 Live 环境并连接网络
#

目的

Gentoo 安装需要通过网络下载源码包(Stage3)和软件仓库(Portage)。在 Live 环境中配置网络是安装的第一步。

Gentoo Live media 默认启用 NetworkManager。有线网络通常通过 DHCP 自动连接;无线网络可通过 TUI 配置。

NetworkManager(Live media 默认):

nmtui   # 交互式:选择「Activate a connection」或「Edit a connection」

确认连通:

ping -c3 gentoo.org

如需手动配置,或使用不带 NetworkManager 的旧版 Minimal ISO,请参考下列两节。

1.1 有线网络(手动)
#

ip link              # 查看网卡接口名称 (如 eno1, wlan0)
dhcpcd eno1          # 对有线网卡启用 DHCP 自动获取 IP
ping -c3 gentoo.org  # 测试网络连通性

1.2 无线网络(手动)
#

交互式配置:

net-setup

wpa_supplicant(替换为实际接口、SSID 和密码):

wpa_passphrase "SSID" "PASSWORD" | tee /etc/wpa_supplicant/wpa_supplicant.conf
wpa_supplicant -B -i wlp0s20f3 -c /etc/wpa_supplicant/wpa_supplicant.conf
dhcpcd wlp0s20f3

注意

若 WPA3 不稳定,请先回退至 WPA2。

进阶设置:启动 SSH 以便远程操作(点击展开)
passwd                      # 设定 root 密码 (远程登录需要)
rc-service sshd start       # 启动 SSH 服务
rc-update add sshd default  # 设置 SSH 开机自启 (Live 环境中可选)
ip a | grep inet            # 查看当前 IP 地址
# 在另一台设备上:ssh root@<IP>

2. 规划磁盘分区
#

目的

需要为 Linux 系统划分独立的存储空间。UEFI 系统通常需要一个 ESP 分区(引导)和一个根分区(系统)。合理规划可简化后续维护。

EFI 系统分区(ESP)
#

在由 UEFI(而非 BIOS)启动的操作系统上安装 Gentoo 时,必须创建 EFI 系统分区(ESP)。ESP 必须使用 FAT 文件系统,在 Linux 中可能显示为 vfat。UEFI 规范规定固件可识别 FAT12、FAT16 或 FAT32,建议使用 FAT32。

警告
如果 ESP 未使用 FAT 文件系统格式化,系统 UEFI 固件将找不到引导加载程序(或 Linux 内核),系统很可能无法引导。

建议分区方案(UEFI)
#

下表提供 Gentoo 试用安装的默认分区方案。

设备路径挂载点文件系统描述
/dev/nvme0n1p1/efivfatEFI 系统分区 (ESP)
/dev/nvme0n1p2swapswap交换分区
/dev/nvme0n1p3/xfs根分区

cfdisk 分区示例
#

cfdisk 是图形化分区工具,操作直观。

cfdisk /dev/nvme0n1

操作

  1. 选择 GPT 标签类型。
  2. 创建 ESP:新建分区 → 大小 1G → 类型选择 EFI System
  3. 创建 Swap:新建分区 → 大小 4G → 类型选择 Linux swap
  4. 创建 Root:新建分区 → 剩余空间 → 类型选择 Linux filesystem(默认)。
  5. 选择 Write 写入更改,输入 yes 确认。
  6. 选择 Quit 退出。
                                                                 Disk: /dev/nvme0n1
                                              Size: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
                                            Label: gpt, identifier: 9737D323-129E-4B5F-9049-8080EDD29C02

    设备                                       Start                   终点                  扇区               Size 类型
    /dev/nvme0n1p1                                34                  32767                 32734                16M Microsoft reserved
    /dev/nvme0n1p2                             32768              879779839             879747072             419.5G Microsoft basic data
    /dev/nvme0n1p3                        1416650752             1418747903               2097152                 1G EFI System
    /dev/nvme0n1p4                        1418747904             1437622271              18874368                 9G Linux swap
    /dev/nvme0n1p5                        1437622272             1953523711             515901440               246G Linux filesystem
>>  /dev/nvme0n1p6                         879779840             1416650751             536870912               256G Linux filesystem

 ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
 │  Partition UUID: F2F1EF58-82EA-46A6-BF49-896AA40C6060                                                                                           │
 │  Partition type: Linux filesystem (0FC63DAF-8483-4772-8E79-3D69D8477DE4)                                                                        │
 │ Filesystem UUID: b4b0b42d-20be-4cf8-be81-9775efa6c151                                                                                           │
 │Filesystem LABEL: crypthomevar                                                                                                                   │
 │      Filesystem: crypto_LUKS                                                                                                                    │
 └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
                                   [ 删除 ]  [Resize]  [ 退出 ]  [ 类型 ]  [ 帮助 ]  [ 排序 ]  [ 写入 ]  [ 导出 ]


                                                        Quit program without writing changes
进阶设置:fdisk 命令行分区(点击展开)

fdisk 是功能完整的命令行分区工具。

fdisk /dev/nvme0n1

1. 查看当前分区布局

p 显示磁盘当前的分区配置。

Command (m for help): p
Disk /dev/nvme0n1: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: NVMe SSD
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 3E56EE74-0571-462B-A992-9872E3855D75

Device           Start        End    Sectors   Size Type
/dev/nvme0n1p1    2048    2099199    2097152     1G EFI System
/dev/nvme0n1p2 2099200   10487807    8388608     4G Linux swap
/dev/nvme0n1p3 10487808 1953523711 1943035904 926.5G Linux root (x86-64)

2. 创建新的磁盘标签

g 会立即删除所有现有磁盘分区并创建新的 GPT 磁盘标签:

Command (m for help): g
Created a new GPT disklabel (GUID: ...).

如要保留现有 GPT 磁盘标签,可按 d 逐个删除现有分区。

3. 创建 EFI 系统分区(ESP)

输入 n 创建新分区,选择分区号 1,使用默认起始扇区(2048),并在结束扇区输入 +1G

Command (m for help): n
Partition number (1-128, default 1): 1
First sector (2048-..., default 2048): <Enter>
Last sector, +/-sectors or +/-size{K,M,G,T,P} (...): +1G

Created a new partition 1 of type 'Linux filesystem' and of size 1 GiB.
Partition #1 contains a vfat signature.

Do you want to remove the signature? [Y]es/[N]o: Y
The signature will be removed by a write command.

将分区标记为 EFI 系统分区(类型代码 1):

Command (m for help): t
Selected partition 1
Partition type or alias (type L to list all): 1
Changed type of partition 'Linux filesystem' to 'EFI System'.

4. 创建 Swap 分区

创建 4 GB 的 Swap 分区:

Command (m for help): n
Partition number (2-128, default 2): 2
First sector (...): <Enter>
Last sector (...): +4G

Created a new partition 2 of type 'Linux filesystem' and of size 4 GiB.

Command (m for help): t
Partition number (1,2, default 2): 2
Partition type or alias (type L to list all): 19
Changed type of partition 'Linux filesystem' to 'Linux swap'.

(注:类型代码 19 是 Linux swap)

5. 创建根分区

将剩余空间分配给根分区:

Command (m for help): n
Partition number (3-128, default 3): 3
First sector (...): <Enter>
Last sector (...): <Enter>

Created a new partition 3 of type 'Linux filesystem' and of size 926.5 GiB.

注意

将根分区设为 "Linux root (x86-64)" 并非必需;设为 "Linux filesystem" 时,系统也能正常运行。只有使用支持该类型的引导程序(即 systemd-boot)且不需要 fstab 文件时,才需要此文件系统类型。

将分区类型设为 "Linux root (x86-64)"(类型代码 23):

Command (m for help): t
Partition number (1-3, default 3): 3
Partition type or alias (type L to list all): 23
Changed type of partition 'Linux filesystem' to 'Linux root (x86-64)'.

6. 写入更改

确认无误后,按 w 写入更改并退出:

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

3. 建立文件系统并挂载
#

目的

磁盘分区只划分空间,尚不能存储数据。建立文件系统(如 ext4、Btrfs)后,操作系统才能管理和访问这些空间。挂载将文件系统接入 Linux 文件树的指定位置。

3.1 格式化
#

mkfs.fat -F 32 /dev/nvme0n1p1  # 格式化 ESP 分区为 FAT32
mkswap /dev/nvme0n1p2          # 格式化 Swap 分区
mkfs.xfs /dev/nvme0n1p3        # 格式化 Root 分区为 XFS

若使用 Btrfs:

mkfs.btrfs -L gentoo /dev/nvme0n1p3

若使用 ext4:

mkfs.ext4 /dev/nvme0n1p3

其他文件系统

其他如 F2FSZFS 请参考相关 Wiki。

3.2 挂载(以 XFS 为例)
#

mount /dev/nvme0n1p3 /mnt/gentoo        # 挂载根分区
mkdir -p /mnt/gentoo/efi                # 创建 ESP 挂载点
mount /dev/nvme0n1p1 /mnt/gentoo/efi    # 挂载 ESP 分区
swapon /dev/nvme0n1p2                   # 启用 Swap 分区
进阶设置:Btrfs 子卷示例(点击展开)

1. 格式化

mkfs.fat -F 32 /dev/nvme0n1p1  # 格式化 ESP
mkswap /dev/nvme0n1p2          # 格式化 Swap
mkfs.btrfs -L gentoo /dev/nvme0n1p3 # 格式化 Root (Btrfs)

2. 创建子卷

mount /dev/nvme0n1p3 /mnt/gentoo
btrfs subvolume create /mnt/gentoo/@
btrfs subvolume create /mnt/gentoo/@home
umount /mnt/gentoo

3. 挂载子卷

mount -o compress=zstd,subvol=@ /dev/nvme0n1p3 /mnt/gentoo
mkdir -p /mnt/gentoo/{efi,home}
mount -o subvol=@home /dev/nvme0n1p3 /mnt/gentoo/home
mount /dev/nvme0n1p1 /mnt/gentoo/efi    # 注意:ESP 必须是 FAT32 格式
swapon /dev/nvme0n1p2

4. 验证挂载

lsblk

示例输出:

NAME             MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
nvme0n1          259:1    0 931.5G  0 disk  
├─nvme0n1p1      259:7    0     1G  0 part  /mnt/gentoo/efi
├─nvme0n1p2      259:8    0     4G  0 part  [SWAP]
└─nvme0n1p3      259:9    0 926.5G  0 part  /mnt/gentoo/home
                                            /mnt/gentoo

Btrfs 快照

可使用 Snapper 管理快照。将 @@home 分开可简化系统回滚。

进阶设置:加密分区(LUKS)(点击展开)

LUKS 专用分区方案

设备挂载点文件系统说明
/dev/nvme0n1p1/efivfatEFI 系统分区(ESP),1G
/dev/nvme0n1p2/bootext4未加密,存放内核和 initramfs,1G
/dev/nvme0n1p3swapswap交换分区
/dev/nvme0n1p4/btrfsLUKS 加密的根分区

GRUB 必须在解密前读取内核和 initramfs,因此它们必须存放在未加密的 /boot 中;根分区仍受 LUKS 加密。

1. 建立加密容器

cryptsetup luksFormat --type luks2 --pbkdf argon2id --hash sha512 --key-size 512 /dev/nvme0n1p4

此流程仅加密根分区 /dev/nvme0n1p4。ESP、独立的 /boot 分区和独立 Swap 分区未受 LUKS 保护;内存换出的页面会写入未加密的 Swap。

2. 打开加密容器

映射名 cryptroot 会在后续 dracut、fstab 和引导程序章节中重复使用。若改名,请保持一致。

cryptsetup luksOpen /dev/nvme0n1p4 cryptroot

3. 格式化

mkfs.fat -F 32 /dev/nvme0n1p1                   # 格式化 ESP
mkfs.ext4 /dev/nvme0n1p2                        # 格式化未加密的 /boot
mkswap /dev/nvme0n1p3                           # 格式化 Swap
mkfs.btrfs --label root /dev/mapper/cryptroot   # 在 LUKS 之上格式化 Root(Btrfs)

4. 挂载

mount /dev/mapper/cryptroot /mnt/gentoo
btrfs subvolume create /mnt/gentoo/@
btrfs subvolume create /mnt/gentoo/@home
umount /mnt/gentoo
mount -o compress=zstd,subvol=@ /dev/mapper/cryptroot /mnt/gentoo
mkdir -p /mnt/gentoo/boot
mount /dev/nvme0n1p2 /mnt/gentoo/boot
mkdir -p /mnt/gentoo/{efi,home}
mount -o subvol=@home /dev/mapper/cryptroot /mnt/gentoo/home
mount /dev/nvme0n1p1 /mnt/gentoo/efi
swapon /dev/nvme0n1p3

5. 验证挂载

lsblk

示例输出:

NAME             MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
nvme0n1          259:1    0 931.5G  0 disk
├─nvme0n1p1      259:7    0     1G  0 part  /mnt/gentoo/efi
├─nvme0n1p2      259:8    0     1G  0 part  /mnt/gentoo/boot
├─nvme0n1p3      259:9    0     4G  0 part  [SWAP]
└─nvme0n1p4      259:10   0 925.5G  0 part
  └─cryptroot    253:0    0 925.5G  0 crypt /mnt/gentoo

验证挂载

挂载完成后,运行 lsblk 确认挂载点。

lsblk

示例输出

NAME             MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
 nvme0n1          259:1    0 931.5G  0 disk  
├─nvme0n1p1      259:7    0     1G  0 part  /efi
├─nvme0n1p2      259:8    0     4G  0 part  [SWAP]
└─nvme0n1p3      259:9    0 926.5G  0 part  /

4. 下载 Stage3 并进入 chroot
#

目的

Stage3 是最小化的 Gentoo 基础系统环境。将它解压到硬盘后,通过 chroot 进入该环境进行后续配置。

4.1 选择 Stage3
#

  • OpenRCstage3-amd64-openrc-*.tar.xz
  • systemdstage3-amd64-systemd-*.tar.xz
  • Desktop 变种预设启用部分 USE,标准版更灵活。

4.2 下载并解压
#

cd /mnt/gentoo
# OpenRC:
BASE=https://distfiles.gentoo.org/releases/amd64/autobuilds
STAGE3=$(wget -qO- "$BASE/latest-stage3-amd64-openrc.txt" | grep -E '^[0-9]{8}T[0-9]{6}Z/stage3-amd64-openrc-[0-9]{8}T[0-9]{6}Z[.]tar[.]xz ' | cut -d' ' -f1)
# systemd:将上一行中的两个 openrc 替换为 systemd。
test -n "$STAGE3" || exit 1
wget "$BASE/$STAGE3"
wget "$BASE/$STAGE3.asc"
gpg --verify "${STAGE3##*/}.asc" "${STAGE3##*/}"
tar xpvf "${STAGE3##*/}" --xattrs-include='*.*' --numeric-owner

如同时下载了 .DIGESTS.CONTENTS,可使用 opensslgpg 验证。

4.3 复制 DNS 并挂载伪文件系统
#

cp --dereference /etc/resolv.conf /mnt/gentoo/etc/ # 复制 DNS 配置
mount --types proc /proc /mnt/gentoo/proc          # 挂载进程信息
mount --rbind /sys /mnt/gentoo/sys                 # 绑定挂载系统信息
mount --rbind /dev /mnt/gentoo/dev                 # 绑定挂载设备节点
mount --rbind /run /mnt/gentoo/run                 # 绑定挂载运行时信息
mount --make-rslave /mnt/gentoo/sys                # 设置为从属挂载 (防止卸载时影响宿主)
mount --make-rslave /mnt/gentoo/dev
mount --make-rslave /mnt/gentoo/run

使用 OpenRC 时可省略 /run

4.4 进入 chroot
#

chroot /mnt/gentoo /bin/bash    # 切换根目录到新系统
source /etc/profile             # 加载环境变量
export PS1="(chroot) ${PS1}"    # 修改提示符以区分环境

5. 初始化 Portage 与 make.conf
#

目的

Portage 是 Gentoo 的包管理系统。初始化 Portage 并配置 make.conf 后,可决定软件的编译方式、启用的功能和下载来源。

5.1 同步仓库
#

emerge-webrsync   # 获取最新的 Portage 快照 (比 rsync 快)
emerge --sync     # 同步 Portage 树 (获取最新 ebuild)
emerge --ask app-editors/vim # 安装 Vim 编辑器 (推荐)
eselect editor list          # 列出可用编辑器
eselect editor set vi        # 将 Vim 设置为默认编辑器 (vi 通常是指向 vim 的软链接)

设置镜像(任选其一):

emerge --ask --verbose --oneshot app-portage/mirrorselect
mirrorselect -i -o >> /etc/portage/make.conf
# 或手动:
#以 BFSU 镜像站为例
echo 'GENTOO_MIRRORS="https://mirrors.bfsu.edu.cn/gentoo/"' >> /etc/portage/make.conf

5.2 make.conf 示例
#

编辑 /etc/portage/make.conf

vim /etc/portage/make.conf

新手配置(可复制)

提示

请根据 CPU 核心数修改 MAKEOPTS 中的 -j 参数,例如 8 核 CPU 使用 -j8

# ========== 编译优化参数 ==========
# -march=native: 针对当前 CPU 架构优化,获得最佳性能
# -O2: 推荐的优化级别,平衡性能与编译时间
# -pipe: 使用管道加速编译过程
COMMON_FLAGS="-march=native -O2 -pipe"
CFLAGS="${COMMON_FLAGS}"    # C 编译器选项
CXXFLAGS="${COMMON_FLAGS}"  # C++ 编译器选项
FCFLAGS="${COMMON_FLAGS}"   # Fortran 编译器选项
FFLAGS="${COMMON_FLAGS}"    # Fortran 77 编译器选项

# ========== 并行编译设置 ==========
# -j 后面的数字 = CPU 线程数(运行 nproc 查看)
# 内存不足时可适当减少(如 -j4)
MAKEOPTS="-j8"

# ========== 语言与本地化 ==========
# LC_MESSAGES=C: 保持编译输出为英文,便于搜索错误信息
LC_MESSAGES=C
# L10N/LINGUAS: 支持的语言(影响软件翻译和文档)
L10N="en en-US zh zh-CN zh-TW"
LINGUAS="en en_US zh zh_CN zh_TW"

# ========== 镜像源设置 ==========
# 国内推荐:BFSU、TUNA、USTC 等
GENTOO_MIRRORS="https://mirrors.bfsu.edu.cn/gentoo/"

# ========== USE 标志 ==========
# 只写 profile 默认值以外的部分,其余由 profile 提供
USE="git dist-kernel"

# ========== 许可证设置 ==========
# "*" 接受所有许可证;"@FREE" 仅接受自由软件
ACCEPT_LICENSE="*"

确认 profile 提供的 USE 标志

systemd profile 提供 systemdudevdesktop profile 提供 dbuspolicykitbluetoothdesktop/plasma profile 提供 networkmanager 并强制启用 policykit。profile 是 USE 的主要来源,因此 make.confUSE 只应写入与 profile 默认值不同的部分;以下命令可确认当前 USE 集合及软件包的 USE 标志:

emerge --info | grep '^USE='
emerge -pv <package>
详细配置示例(点击展开)
# vim: set filetype=bash  # 告诉 Vim 使用 bash 语法高亮

# ========== 系统架构(勿手动修改) ==========
# 由 Stage3 预设,表示目标系统架构
CHOST="x86_64-pc-linux-gnu"

# ========== 编译优化参数 ==========
# -march=native    针对当前 CPU 架构优化,获得最佳性能
#                  注意:编译出的程序可能无法在其他 CPU 上运行
# -O2              推荐的优化级别,平衡性能与稳定性
#                  避免使用 -O3,可能导致部分软件编译失败
# -pipe            使用管道代替临时文件传递数据,加速编译
COMMON_FLAGS="-march=native -O2 -pipe"
CFLAGS="${COMMON_FLAGS}"      # C 编译器选项
CXXFLAGS="${COMMON_FLAGS}"    # C++ 编译器选项
FCFLAGS="${COMMON_FLAGS}"     # Fortran 编译器选项
FFLAGS="${COMMON_FLAGS}"      # Fortran 77 编译器选项

# CPU 指令集优化(运行 cpuid2cpuflags 自动生成,见下文 5.3)
# CPU_FLAGS_X86="aes avx avx2 f16c fma3 mmx mmxext pclmul popcnt sse sse2 ..."

# ========== 并行编译设置 ==========
# MAKEOPTS: 控制 make 的并行任务数
#   -j<N>   同时运行的编译任务数,建议 = CPU 线程数(nproc)
#   -l<N>   系统负载限制,防止系统过载(可选)
MAKEOPTS="-j8"  # 请根据实际 CPU 线程数调整

# 内存不足时的替代配置(例如 16GB 内存 + 8 核 CPU):
# MAKEOPTS="-j4 -l8"  # 减少并行数,限制负载

# ========== 语言与本地化设置 ==========
# 保持构建输出为英文,便于搜索错误信息和寻求帮助
LC_MESSAGES=C

# L10N: 本地化语言支持(影响软件翻译、文档等)
L10N="en en-US zh zh-CN zh-TW"

# LINGUAS: 旧式本地化变量(部分软件仍需要)
LINGUAS="en en_US zh zh_CN zh_TW"

# ========== 镜像源设置 ==========
# 国内常用镜像(任选其一):
#   BFSU:  https://mirrors.bfsu.edu.cn/gentoo/
#   TUNA:  https://mirrors.tuna.tsinghua.edu.cn/gentoo/
#   USTC:  https://mirrors.ustc.edu.cn/gentoo/
#   SJTU:  https://mirrors.sjtug.sjtu.edu.cn/gentoo/
GENTOO_MIRRORS="https://mirrors.bfsu.edu.cn/gentoo/"

# ========== Emerge 默认选项 ==========
# --ask              执行前询问确认
# --verbose          显示详细信息(USE 标志变化等)
# --with-bdeps=y     包含构建时依赖(更新时也检查)
# --complete-graph=y 完整依赖图分析(避免依赖问题)
EMERGE_DEFAULT_OPTS="--ask --verbose --with-bdeps=y --complete-graph=y"

# 可选的额外选项:
# --jobs=N           并行编译多个包(内存充足时可用)
# --load-average=N   系统负载限制
# EMERGE_DEFAULT_OPTS="--ask --verbose --jobs=2 --load-average=8"

# ========== USE 标志(全局功能开关) ==========
# 只写 profile 默认值以外的部分;此处仅启用 git 和 dist-kernel。
USE="git dist-kernel"

# 常用的可选 USE 标志:
#   pulseaudio / pipewire  音频服务器
#   wayland / X            显示服务器
#   vulkan                 Vulkan 图形 API
#   vaapi / vdpau          硬件视频解码
#   cups                   打印支持
#   flatpak                Flatpak 应用支持

# ========== 许可证设置 ==========
# "*"     接受所有许可证(包括闭源软件)
# "@FREE" 仅接受自由软件许可证
ACCEPT_LICENSE="*"

# ========== 视频卡配置(可选) ==========
# 根据你的显卡选择:
#   intel      Intel 集成显卡
#   amdgpu     AMD 显卡(GCN 1.2+)
#   radeonsi   AMD 显卡(OpenGL)
#   nvidia     NVIDIA 显卡(闭源驱动)
#   nouveau    NVIDIA 显卡(开源驱动)
# VIDEO_CARDS="intel"
# VIDEO_CARDS="amdgpu radeonsi"
# VIDEO_CARDS="nvidia"

# ========== 输入设备配置(可选) ==========
# libinput 是现代桌面的推荐选择
# INPUT_DEVICES="libinput"

# ========== Portage 功能配置(可选) ==========
# 启用拆分调试信息
# FEATURES="${FEATURES} splitdebug"

# ========== 编译日志配置(推荐) ==========
# PORTAGE_ELOG_CLASSES: 要记录的日志级别
#   info     一般信息
#   warn     警告信息(重要)
#   error    错误信息(重要)
#   log      普通日志
#   qa       质量保证警告
PORTAGE_ELOG_CLASSES="warn error log"

# PORTAGE_ELOG_SYSTEM: 日志输出方式
#   save          保存到 /var/log/portage/elog/(推荐)
#   echo          编译后直接显示
#   mail          通过邮件发送
#   syslog        发送到系统日志
#   custom        自定义处理
PORTAGE_ELOG_SYSTEM="save"

# 文件末尾保留换行符!

提示

  • MAKEOPTS="-j32" 中的数字应为 CPU 线程数,可通过 nproc 查看
  • 编译时内存不足可减少并行任务数,例如改为 -j16
  • USE 标志决定软件在编译时包含的功能
进阶设置:CPU 指令集配置(CPU_FLAGS_X86)(点击展开)

可参考CPU_FLAGS_*

配置 CPU_FLAGS_X86,使 Portage 获知 CPU 支持的指令集,例如 AES、AVX 和 SSE4.2。

安装检测工具:

emerge --ask app-portage/cpuid2cpuflags # 安装检测工具

运行检测并写入配置:

cpuid2cpuflags >> /etc/portage/make.conf # 将检测结果追加到配置文件

检查 /etc/portage/make.conf 末尾,应有类似的一行:

CPU_FLAGS_X86="aes avx avx2 f16c fma3 mmx mmxext pclmul popcnt rdrand sse sse2 sse3 sse4_1 sse4_2 ssse3"

5.3 二进制包(binhost)(可选)
#

目的

Gentoo 从源代码编译软件,时间表中最耗时的项目多为编译。官方 binhost 提供已签名的预编译二进制包。配置匹配时,Portage 直接安装;不匹配时仍从源代码编译。binhost 只改变软件包来源,不改变系统结构,因此可随时启用或停用。

确认仓库配置
#

Stage3 已在 /etc/portage/binrepos.conf/gentoo.conf 中预配置官方 binhost,可先查看现有内容:

cat /etc/portage/binrepos.conf/gentoo.conf

典型配置:

[gentoo]
priority = 1
sync-uri = https://distfiles.gentoo.org/releases/amd64/binpackages/23.0/x86-64
location = /var/cache/binhost/gentoo
verify-signature = true

sync-uri 应指向包含 Packages 索引的目录。更换镜像时仅修改主机部分,路径不变。可用地址见 gentoo-zh 镜像列表

选择指令集层级
#

sync-uri 路径的末段是指令集层级,Stage3 默认使用通用的 x86-64。改用更高层级可获得针对较新指令集优化的软件包。

先检查本机支持的层级:

ld.so --help

在输出中查找 Subdirectories of glibc-hwcaps directories 一节。标为 supported, searched 的层级即为本机可用层级:

Subdirectories of glibc-hwcaps directories, in priority order:
  x86-64-v4 (supported, searched)
  x86-64-v3 (supported, searched)
  x86-64-v2 (supported, searched)

官方 amd64 binhost 仅构建 x86-64x86-64-v3 两级,不含 v2v4。输出中有 x86-64-v3 (supported, searched) 时使用 x86-64-v3;否则保留 x86-64。上例机器虽支持 v4,可用的仍是 v3

确认后修改 sync-uri 的末段:

# /etc/portage/binrepos.conf/gentoo.conf
sync-uri = https://distfiles.gentoo.org/releases/amd64/binpackages/23.0/x86-64-v3

arm64 只有一个层级,路径为 /releases/arm64/binpackages/23.0/arm64,无需选择。

注意

层级仅决定二进制包使用的指令集,与本地编译无关。CPU 不支持所填层级时,取回的软件包会因非法指令崩溃。因此应以 ld.so --help 的输出为准,不应按 CPU 型号猜测。

自动启用
#

让 emerge 在有合适二进制包时自动使用:

# 追加到 /etc/portage/make.conf
FEATURES="${FEATURES} getbinpkg"

仅在单次命令中使用:

emerge --ask --getbinpkg sys-kernel/gentoo-kernel

-bin 软件包与二进制包不同

sys-kernel/gentoo-kernel-bin 等以 -bin 结尾的软件包使用上游发布的预编译产物。ebuild 仅负责下载和解压,仍遵循普通 ebuild 流程,emerge -pv 显示为 [ebuild]。本节的二进制包由 Portage 打包并通过 binhost 分发,格式为 .gpkg.tar,显示为 [binary]

因此第 7 章的 gentoo-kernel-bin 本身不编译,也不使用 binhost;从源代码构建的 sys-kernel/gentoo-kernel,以及桌面篇中的浏览器、LLVM、Rust 等大型软件,才可通过 binhost 节省编译时间。

确认是否已使用
#

emerge -pv 输出中前缀为 [binary] 才表示该项目使用二进制包,[ebuild] 表示需要从源代码编译:

emerge -pv sys-kernel/gentoo-kernel

配置正确但仍显示 [ebuild] 时,常见原因有三项:

  • USE 不匹配--binpkg-respect-use 默认开启。二进制包的 USE 与当前配置不一致时会被跳过。官方 binhost 按 profile 默认 USE 构建,因此 make.conf 中改动的 USE 越多,命中率越低。
  • 依赖变动--binpkg-changed-deps 默认开启。ebuild 的依赖在打包后变动时,该软件包会被跳过。
  • 版本不在索引中。binhost 只提供已构建的版本;同步树上的较新版本会从源代码编译。

CFLAGS 不参与匹配,因此 make.conf 中的 -march=native 不会使官方二进制包失效。本机编译的软件包按 native 优化,来自 binhost 的软件包使用通用指令集,两者可以共存。

相关选项
#

选项作用
-k / --usepkg本地 PKGDIR 里有就用
-g / --getbinpkg从远端 binhost 取,隐含 -k
-K / --usepkgonly只用本地二进制包,没有就报错
-G / --getbinpkgonly只用二进制包,远端优先于本地

安装阶段使用 -g 即可。-K-G 会关闭 --binpkg-respect-use--binpkg-changed-deps,安装的软件包可能与 make.conf 中的 USE 不一致,不建议在此步骤使用。

签名验证
#

verify-signature = true 表示该仓库的软件包必须带有可信签名。新版 Portage 默认验证远程二进制包,首次下载时自动执行 getuto,在 /etc/portage/gnupg 中建立信任密钥环。官方 binhost 用户无需再配置 FEATURES="binpkg-request-signature"。取回的软件包缓存在 location 指定的目录,与本机 FEATURES="buildpkg" 产出的软件包分开存放。这两项变化见 2026-05-03 的新闻条目。系统安装完成后,也可使用 eselect news read 查看。

进阶:gentoo-zh 二进制包、自建与局域网共享(点击展开)

gentoo-zh binhost

gentoo-zh overlay 为浏览器、办公套件和 Electron 应用等编译耗时较长的软件包提供预编译版本。目前仅支持 amd64,分为 stable 和 unstable 两个频道,需另外导入社区签名公钥。它是附加仓库,不替代官方 binhost。配置见 gentoo-zh Overlay 页。配置 overlay 的步骤在桌面配置篇的 12.9,因此请在完成该步骤后再配置。

自己构建二进制包

编译时同时产出二进制包,重装或安装第二台机器时可直接复用:

# 追加到 /etc/portage/make.conf
FEATURES="${FEATURES} buildpkg"
PKGDIR="/var/cache/binpkgs"

已安装的软件包可补充打包:

emerge --ask app-portage/gentoolkit
quickpkg --include-config=y sys-apps/portage

共享给其他机器

可通过任意 HTTP 服务器发布 PKGDIR。客户端在 /etc/portage/binrepos.conf/ 中添加一个指向该目录的仓库。需处理以下两项:

  • -march=native 编译出的包只能在同型号 CPU 上运行。要共享就把构建机的 COMMON_FLAGS 改成明确的架构,例如 -march=x86-64-v3
  • 自建的包默认没有签名,所以客户端要么给该仓库设 verify-signature = false,要么在构建机启用 FEATURES="binpkg-signing" 并把公钥导入客户端的 /etc/portage/gnupg

清理

二进制包会持续占用磁盘空间:

eclean-pkg -p       # 先看会删掉哪些
eclean-pkg          # 删除已被新版本取代的包
eclean-pkg -d       # 只保留重装所需的最小集合

6. Profile、系统设置与本地化
#

目的

Profile 定义系统的基础配置和预设 USE 标志。配置时区、语言、网络等基本参数后,Gentoo 系统才能正常运行并符合个人使用习惯。

6.1 选择 Profile
#

eselect profile list          # 列出所有可用 Profile
eselect profile set <编号>    # 设置选定的 Profile
emerge -avuDN @world          # 更新系统以匹配新 Profile (a:询问 v:详细 u:升级 D:深层依赖 N:新USE)

常见 profile:

  • default/linux/amd64/23.0/desktop/plasma/systemd
  • default/linux/amd64/23.0/desktop/gnome/systemd
  • default/linux/amd64/23.0/desktop(OpenRC 桌面)

6.2 时区和语言
#

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

echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
echo "zh_CN.UTF-8 UTF-8" >> /etc/locale.gen
locale-gen                      # 生成选定的语言环境
eselect locale set en_US.utf8   # 设置系统默认语言 (建议用英文以免乱码)

# 重新加载环境
env-update && source /etc/profile && export PS1="(chroot) ${PS1}"

6.3 主机名和网络设置
#

设置主机名

echo "gentoo" > /etc/hostname

选择网络管理工具

方案 A:NetworkManager(通用)

可参考NetworkManager

适用于大多数桌面用户,支持 OpenRC 和 systemd。

emerge --ask net-misc/networkmanager
# OpenRC:
rc-update add NetworkManager default
# systemd:
systemctl enable NetworkManager

配置

图形界面:运行 nm-connection-editor
命令行:使用 nmtui(TUI)或 nmcli

进阶提示:使用 iwd 后端(点击展开)

NetworkManager 支持使用 iwd 作为后端,速度快于 wpa_supplicant。

echo "net-misc/networkmanager iwd" >> /etc/portage/package.use/networkmanager
emerge --ask --newuse net-misc/networkmanager

然后编辑 /etc/NetworkManager/NetworkManager.conf,在 [device] 下添加 wifi.backend=iwd

方案 B:轻量网络工具(点击展开)

如不使用 NetworkManager,可选择以下轻量级工具:

  1. 有线网络(dhcpcd)

可参考dhcpcd

emerge --ask net-misc/dhcpcd
# OpenRC:
rc-update add dhcpcd default
# systemd:
systemctl enable dhcpcd
  1. 无线网络(iwd)

可参考iwd

emerge --ask net-wireless/iwd
# OpenRC:
rc-update add iwd default
# systemd:
systemctl enable iwd

提示:iwd 是轻量级无线守护进程。

方案 C:原生网络服务(点击展开)

使用 init 系统内置的网络管理功能,适合服务器或极简环境。

OpenRC 网卡服务

vim /etc/conf.d/net

注意

请将下文的 enp5s0 替换为实际网卡接口名称,可通过 ip link 查看。

添加以下内容:

config_enp5s0="dhcp"
ln -s /etc/init.d/net.lo /etc/init.d/net.enp5s0 # 创建网卡服务软链接
rc-update add net.enp5s0 default                # 设置开机自启

systemd 原生网卡服务

systemd 内置网络管理功能,适合服务器或极简环境:

systemctl enable systemd-networkd
systemctl enable systemd-resolved

注意:需要手动编写 .network 配置文件。

6.4 配置 fstab
#

目的

系统启动时需要知道要挂载哪些分区。/etc/fstab 定义:

  • 启动时自动挂载的分区
  • 每个分区的挂载目录
  • 文件系统类型

使用 UUID:设备路径(如 /dev/sda1)可能因硬件变化而改变;UUID 是文件系统的唯一标识符,不会因磁盘顺序变化而改变。


方法 A:使用 genfstab 自动生成
#

点击展开查看步骤

安装 genfstab

genfstabsys-fs/genfstab 提供,源自 Arch Linux 的 arch-install-scripts

  • Gig-OS / Arch LiveISO:已预装,可直接使用
  • Gentoo Minimal ISO:需要先安装 emerge --ask sys-fs/genfstab
genfstab 参数说明
参数说明推荐度
-U使用文件系统 UUID 标识推荐
-L使用文件系统 LABEL 标识需预设标签
-t PARTUUID使用 GPT 分区 PARTUUIDGPT 专用
无参数使用设备路径(/dev/sdX不推荐

建议使用 -U 参数。UUID 是文件系统的唯一标识符,不会因磁盘顺序变化而改变。

标准用法(在 chroot 外执行)

# 1. 确认所有分区已正确挂载
lsblk
mount | grep /mnt/gentoo

# 2. 生成 fstab(使用 UUID)
genfstab -U /mnt/gentoo >> /mnt/gentoo/etc/fstab

# 3. 检查生成的文件
cat /mnt/gentoo/etc/fstab
chroot 环境下的替代方案

如果已 chroot 进入新系统(/mnt/gentoo 变为 /),可使用以下方法:

方法一:在 chroot 内执行

# 在 chroot 内安装
emerge --ask sys-fs/genfstab

# 直接对根目录生成
genfstab -U / >> /etc/fstab

# 检查并清理多余条目(可能包含 /proc、/sys、/dev 等)
vim /etc/fstab

方法二:打开新终端窗口(LiveGUI)

使用 Gig-OS 等带图形界面的 Live 环境时,可直接打开新终端窗口,默认处于 Live 环境:

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

方法三:通过 TTY 切换(Minimal ISO)

  1. Ctrl+Alt+F2 切换到新 TTY(Live 环境)
  2. 安装并执行:
    emerge --ask sys-fs/genfstab
    genfstab -U /mnt/gentoo >> /mnt/gentoo/etc/fstab
  3. Ctrl+Alt+F1 切回 chroot 环境

genfstab 兼容性

genfstab 会自动检测当前挂载点下的所有文件系统。其源代码明确支持:

  • Btrfs 子卷:自动识别 subvol= 参数(不会误判为 bind mount)
  • LUKS 加密分区:自动使用解密后设备(/dev/mapper/xxx)的 UUID
  • 普通分区:ext4、xfs、vfat 等常规文件系统

前提条件:执行 genfstab 前,必须确保所有分区已正确挂载,包括 Btrfs 子卷和已解密的 LUKS 分区。


方法 B:手动配置
#

点击展开查看手动配置方法

不使用 genfstab 时,可手动编辑 /etc/fstab

1. 获取分区 UUID

blkid

示例输出:

/dev/nvme0n1p1: UUID="7E91-5869" TYPE="vfat" PARTLABEL="EFI"
/dev/nvme0n1p2: UUID="7fb33b5d-..." TYPE="swap" PARTLABEL="swap"
/dev/nvme0n1p3: UUID="8c08f447-..." TYPE="xfs" PARTLABEL="root"

2. 编辑 fstab

vim /etc/fstab

基本配置示例(ext4/XFS):

# <UUID>                                   <挂载点>     <类型> <选项>            <dump> <fsck>
UUID=7E91-5869                             /efi         vfat   umask=0077,tz=UTC  0      2
UUID=7fb33b5d-4cff-47ff-ab12-7b461b5d6e13  none         swap   sw                0      0
UUID=8c08f447-c79c-4fda-8c08-f447c79ce690  /            xfs    defaults,noatime  0      1

fstab 字段

字段说明
UUID分区的唯一标识符(通过 blkid 获取)
挂载点文件系统挂载位置(swap 使用 none
类型文件系统类型:vfatext4xfsbtrfsswap
选项挂载选项,多个用逗号分隔
dump备份标志,通常为 0
fsck启动时检查顺序:1=根分区,2=其他,0=不检查

Btrfs 子卷

genfstab 自动生成:

Btrfs 子卷正确挂载后,genfstab -U 会自动识别并生成包含 subvol= 的配置。

# 确认子卷挂载情况
mount | grep btrfs
# 输出示例:/dev/nvme0n1p3 on /mnt/gentoo type btrfs (rw,noatime,compress=zstd:3,subvol=/@)

# 自动生成
genfstab -U /mnt/gentoo >> /mnt/gentoo/etc/fstab

手动配置示例:

# Root 子卷
UUID=7b44c5eb-caa0-413b-9b7e-a991e1697465  /       btrfs  defaults,noatime,compress=zstd:3,discard=async,space_cache=v2,subvol=@       0 0

# Home 子卷(同一 UUID,不同子卷)
UUID=7b44c5eb-caa0-413b-9b7e-a991e1697465  /home   btrfs  defaults,noatime,compress=zstd:3,discard=async,space_cache=v2,subvol=@home   0 0

# Swap(独立分区)
UUID=7fb33b5d-4cff-47ff-ab12-7b461b5d6e13  none    swap   sw                                                                            0 0

# EFI 分区
UUID=7E91-5869                             /efi    vfat   defaults,noatime,fmask=0022,dmask=0022                                        0 2

Btrfs 挂载选项

选项说明
compress=zstd:3zstd 压缩,级别 3(推荐,平衡性能与压缩率)
discard=async异步 TRIM(SSD 推荐)
space_cache=v2v2 版空间缓存(默认启用,性能更好)
subvol=@指定挂载的子卷
noatime不记录访问时间(提升性能)

注意

  • 同一 Btrfs 分区的所有子卷使用相同 UUID
  • 使用 blkid 获取实际 UUID
LUKS 加密分区配置

要点

fstab 必须使用解密后映射设备的 UUID(/dev/mapper/xxx),而非 LUKS 容器的 UUID。

genfstab 自动生成:

genfstab 会自动检测解密后的设备,并使用正确的 UUID:

# 确认 LUKS 已解密
lsblk
# 应看到类似:nvme0n1p4 → cryptroot → 挂载点

# 自动生成(会使用 /dev/mapper/cryptroot 的 UUID)
genfstab -U /mnt/gentoo >> /mnt/gentoo/etc/fstab

手动配置:区分两种 UUID

blkid
# LUKS 容器(TYPE="crypto_LUKS")- 不要用这个!
/dev/nvme0n1p4: UUID="562d0251-..." TYPE="crypto_LUKS"

# 解密后设备(TYPE="btrfs")- 用这个!
/dev/mapper/cryptroot: UUID="7b44c5eb-..." TYPE="btrfs"

手动配置示例(Btrfs on LUKS):

# Root(使用解密后设备 /dev/mapper/cryptroot 的 UUID)
UUID=7b44c5eb-caa0-413b-9b7e-a991e1697465  /       btrfs  defaults,noatime,compress=zstd:3,discard=async,space_cache=v2,subvol=@       0 0

# Boot(未加密)
UUID=9a856e43-a0be-4477-8647-e6ab51cf80ef  /boot   ext4   defaults,noatime                                                                        0 2

# Home(同一加密分区的不同子卷,UUID 相同)
UUID=7b44c5eb-caa0-413b-9b7e-a991e1697465  /home   btrfs  defaults,noatime,compress=zstd:3,discard=async,space_cache=v2,subvol=@home   0 0

# Swap(独立分区或加密 swap)
UUID=7fb33b5d-4cff-47ff-ab12-7b461b5d6e13  none    swap   sw                                                                            0 0

# EFI(不加密)
UUID=7E91-5869                             /efi    vfat   defaults,noatime,fmask=0022,dmask=0022                                        0 2

常见问题

Q: 为什么不能用 LUKS 容器的 UUID?
A: LUKS 容器保存加密的原始数据,系统无法读取其中的文件系统。必须先解密。解密后的 /dev/mapper/xxx 才有可识别的文件系统和 UUID。

Q: discard=async 在 LUKS 上安全吗?
A: LUKS2 + discard 是安全的。若极度在意安全性,可移除此选项,但会降低 SSD 性能。


7. 内核与固件
#

目的

内核负责管理硬件。Gentoo 支持手动裁剪内核,仅保留所需驱动,从而优化性能并减小内核体积。新手也可选择预编译内核快速开始。

7.1 安装固件与微码
#

mkdir -p /etc/portage/package.license
# 同意 Linux 固件的授权条款
echo 'sys-kernel/linux-firmware linux-fw-redistributable no-source-code' > /etc/portage/package.license/linux-firmware
# installkernel USE flag 要与你用的引导器对应。择一:
#   GRUB           → 'sys-kernel/installkernel dracut grub'
#   systemd-boot   → 'sys-kernel/installkernel dracut systemd systemd-boot'
#   Limine / 其他  → 'sys-kernel/installkernel dracut'(引导器手动维护)
echo 'sys-kernel/installkernel dracut grub' > /etc/portage/package.use/installkernel
# systemd-boot 用户还须在首次安装内核前设置内核命令行:
# printf 'root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw quiet\n' > /etc/kernel/cmdline
emerge --ask sys-kernel/linux-firmware
emerge --ask sys-firmware/intel-microcode  # Intel CPU
emerge --ask sys-kernel/installkernel

package.license 说明

前文的 make.conf 示例已设置 ACCEPT_LICENSE="*"。仍为 linux-firmware 单独创建 package.license 文件,原因如下:

  • make.conf 是示例:许多用户会按需修改 ACCEPT_LICENSE,例如设为 @FREE,仅接受自由软件许可证。
  • 独立声明便于维护:package.license 文件明确记录需要特殊许可证的软件包,便于后续维护和审计。
  • 保留软件包专用配置:即使全局设为 ACCEPT_LICENSE="*",Gentoo 社区仍建议为特定软件包创建 license 文件。日后调整全局许可证策略时,这可避免意外阻止关键软件包安装。

7.2 快速方案:预编译内核
#

emerge --ask sys-kernel/gentoo-kernel-bin
# 若已按旧流程安装内核,执行以下命令重新应用 installkernel 配置:
emerge --ask sys-kernel/installkernel && emerge --ask --config sys-kernel/gentoo-kernel-bin

内核升级后,需重新生成引导程序配置。

进阶设置:手动编译内核(点击展开)

提示

编译内核较复杂且耗时。若希望尽快使用 Gentoo,可先跳过本节,使用 7.2 的预编译内核。

手动编译内核可自行控制系统功能和驱动,获得更精简、高效的内核。

快速开始(使用 Genkernel 自动化)

emerge --ask sys-kernel/gentoo-sources sys-kernel/genkernel
eselect kernel list
eselect kernel set <gentoo-sources 对应编号>
genkernel --install all  # 自动编译并安装内核、模块和 initramfs
# --install: 编译完成后自动安装到 /boot 目录
# all: 完整构建 (内核 + 模块 + initramfs)

8. 基础工具
#

目的

Stage3 仅包含最基础的命令。需安装系统日志、网络管理和文件系统工具等组件,系统才能在重启后正常工作。

8.1 系统服务工具
#

OpenRC 用户配置(点击展开)

1. 系统日志

可参考Syslog-ng

emerge --ask app-admin/syslog-ng
rc-update add syslog-ng default

2. 定时任务

emerge --ask sys-process/cronie
rc-update add cronie default

3. 时间同步

emerge --ask net-misc/chrony
rc-update add chronyd default
systemd 用户配置(点击展开)

systemd 已内置日志与定时任务服务,无需额外安装。

时间同步

systemctl enable --now systemd-timesyncd

8.2 文件系统工具
#

按所用文件系统安装对应工具(必选):

emerge --ask sys-fs/e2fsprogs  # ext4
emerge --ask sys-fs/xfsprogs   # XFS
emerge --ask sys-fs/dosfstools # FAT/vfat (EFI 分区需要)
emerge --ask sys-fs/btrfs-progs # Btrfs

9. 建立用户与权限
#

目的

Linux 不建议日常使用 root 账户。请创建普通用户,并授予其使用 sudo 的权限,以提高系统安全性。

将下面的占位符替换为实际用户名;两条命令必须使用相同的用户名:

passwd root # 设置 root 密码
useradd -m -G wheel,video,audio,plugdev <用户名> # 创建用户并加入常用组
passwd <用户名> # 设置用户密码
emerge --ask app-admin/sudo

编辑 sudoers 文件,允许 wheel 组用户以 root 身份执行命令:

visudo

取消以下行的注释(删除开头的 # ):

%wheel ALL=(ALL:ALL) ALL

使用 systemd 时,可按需将用户加入 networklp 等群组。


10. 安装引导程序
#

重要警告:Windows 双系统用户

Windows 更新常会扫描并强制覆盖默认引导路径 /EFI/BOOT/bootx64.efi后果:使用该默认路径会导致 Linux 无法启动。 应对方法

  1. 使用独立文件名或目录:不要仅将引导程序安装为 bootx64.efi
  2. 手动注册引导项:使用 efibootmgr 将新文件注册到 UEFI 启动列表。

下文的 GRUB、systemd-boot 和 Limine 均配置为使用独立路径,可避免此问题。

注:Windows 更新有时还会修改 UEFI 启动顺序(Boot Order)并将 Windows 置顶。发生此情况时,进入 BIOS 重新调整顺序。

10.1 方案 A:GRUB(标准)
#

GRUB 功能完备且兼容性好,支持自动检测 Windows。 使用 LUKS 时,必须采用第 3 章 LUKS 分区方案中的未加密独立 /boot;否则 GRUB 无法读取内核。

可参考GRUB

1. 安装和配置

emerge --ask sys-boot/grub:2
# 安装到 ESP (注意 --bootloader-id=Gentoo 会自动创建独立目录,避免冲突)
grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=Gentoo

2. 多系统配置(Windows/Linux/其他)

如已安装 Windows 或其他 Linux 发行版,需启用 os-prober 自动发现它们:

emerge --ask sys-boot/os-prober
# 启用 os-prober (默认禁用以保障安全)
echo 'GRUB_DISABLE_OS_PROBER=false' >> /etc/default/grub

3. 生成配置

grub-mkconfig -o /boot/grub/grub.cfg

(仅限多系统用户)务必检查输出中是否包含 "Found Windows Boot Manager..." 或其他系统的引导项


10.2 方案 B:systemd-boot(简洁)
#

systemd-boot(前身为 Gummiboot)轻量且配置简单,适用于 UEFI 系统。

可参考systemd-boot

1. 安装

  • systemd 用户: 使用 systemd 版本 >= 254 时,必须启用 boot USE 标志才能使用 bootctl

    mkdir -p /etc/portage/package.use
    echo "sys-apps/systemd boot" >> /etc/portage/package.use/systemd
    emerge --ask --oneshot --verbose sys-apps/systemd

    然后安装引导程序并检查引导项:

    bootctl --esp-path=/efi install
    bootctl --esp-path=/efi list
    OpenRC 用户配置(systemd-utils)— 点击展开

    OpenRC 用户需安装 sys-apps/systemd-utils 并启用 bootkernel-install USE 标志:

    mkdir -p /etc/portage/package.use
    echo "sys-apps/systemd-utils boot kernel-install" >> /etc/portage/package.use/systemd-utils
    emerge --ask --oneshot --verbose sys-apps/systemd-utils
    bootctl --esp-path=/efi install
    bootctl --esp-path=/efi list

2. 配置加载器

编辑 /efi/loader/loader.conf

timeout 3
console-mode auto

3. 使用 installkernel 管理 Gentoo 引导项

在首次安装内核前,systemd-boot 用户必须在第 7.1 节选择 sys-kernel/installkernel dracut systemd systemd-boot,并将根分区参数写入 /etc/kernel/cmdlineinstallkernel 会创建 ${ESP}/gentoo/<actual-release>/linuxinitrd 及对应的 BLS 引导项。

若已按旧流程安装内核,执行 emerge --ask sys-kernel/installkernel && emerge --ask --config sys-kernel/gentoo-kernel-bin

4. 多系统配置(Windows)

systemd-boot 会自动检测同一 ESP 分区中的 Windows 引导管理器(/efi/EFI/Microsoft/Boot/bootmgfw.efi),通常无需额外配置。

若 Windows 位于另一块硬盘的 ESP,或自动检测失败,才需手动创建 /efi/loader/entries/windows.conf

title      Windows 11
efi        /EFI/Microsoft/Boot/bootmgfw.efi

10.3 方案 C:Limine(可定制)
#

Limine 支持动态菜单,配置灵活。

可参考Limine

1. 安装

echo 'sys-boot/limine ~amd64' >> /etc/portage/package.accept_keywords/limine
emerge --ask sys-boot/limine

2. 部署引导文件(关键步骤)

为防止 Windows 覆盖,将 Limine 部署为 Gentoo 专用引导项,而非默认的 BOOTX64.EFI

# 先将已安装的内核和 initramfs 复制到 ESP;随后 ESP 会挂载到 /boot。
ls -1 /boot/vmlinuz-* /boot/initramfs-*
cp -v /boot/vmlinuz-* /boot/initramfs-* /efi/
# 将 /etc/fstab 中 ESP 的挂载点从 /efi 改为 /boot。
vim /etc/fstab
umount /efi
mount /boot
mkdir -p /boot/EFI/Gentoo
cp -v /usr/share/limine/BOOTX64.EFI /boot/EFI/Gentoo/limine.efi
cp -v /usr/share/limine/limine-bios.sys /boot/ # (可选)仅 BIOS 需要

3. 配置 Limine

编辑 ESP 上的 /boot/limine.conf。将下列两个占位符替换为前面 ls 输出中属于同一内核版本的完整文件名:

timeout: 5

/Gentoo Linux
    protocol: linux
    kernel_path: boot():/<vmlinuz-文件名>
    module_path: boot():/<initramfs-文件名>
    cmdline: root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw

/Windows 11
    protocol: efi
    path: boot():/EFI/Microsoft/Boot/bootmgfw.efi

内核更新后,新的内核和 initramfs 会写入挂载到 /boot 的 ESP。每次更新后、重启前,运行 ls -1 /boot/vmlinuz-* /boot/initramfs-*,并将 kernel_pathmodule_path 更新为匹配的新文件名。

4. 注册 UEFI 引导项

由于未使用默认路径,必须通过 efibootmgr 告诉主板从何处启动 Limine:

emerge --ask sys-boot/efibootmgr
# 创建名为 "Gentoo Limine" 的启动项
# -d: 磁盘设备 (如 /dev/nvme0n1)
# -p: 分区号 (如 1)
# -L: 标签名称
# -l: loader 路径 (Windows 风格斜杠)
efibootmgr --create --disk /dev/nvme0n1 --part 1 --label "Gentoo Limine" --loader '\EFI\Gentoo\limine.efi'

进阶设置:加密支持(仅限加密用户)— 点击展开

步骤 1:按 init 系统安装 LUKS 依赖

# systemd profile:
mkdir -p /etc/portage/package.use
echo "sys-apps/systemd cryptsetup" >> /etc/portage/package.use/fde
emerge --ask --oneshot sys-apps/systemd sys-kernel/dracut

# OpenRC profile:
emerge --ask sys-fs/cryptsetup sys-kernel/dracut

步骤 2:生成含 crypt 模块的 initramfs

编辑 /etc/dracut.conf.d/luks.conf

注意:请根据你的根文件系统修改 btrfsxfsext4

# systemd profile:
add_dracutmodules+=" btrfs systemd crypt dm "
# OpenRC profile:
add_dracutmodules+=" btrfs crypt dm "

重新生成 initramfs:

# gentoo-kernel-bin:
emerge --ask --config sys-kernel/gentoo-kernel-bin

# Genkernel 或手动内核:
dracut --kver $(make -C /usr/src/linux -s kernelrelease) --force

步骤 3:获取 LUKS 分区的 UUID

# 获取 LUKS 加密容器的 UUID(不是里面的文件系统 UUID)
blkid /dev/nvme0n1p4

示例输出(查找 TYPE="crypto_LUKS" 所在行):

/dev/nvme0n1p4: UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="crypto_LUKS" ...

上方 blkid 输出中的 LUKS UUID 要填入后面的各配置文件;请使用自己机器的实际输出,不要照抄示例值。

步骤 4:配置内核引导参数

  • GRUB (/etc/default/grub)

    编辑 /etc/default/grub,将 GRUB_CMDLINE_LINUX 设为:

    # 完整示例(替换 UUID 为你的实际 UUID)
    GRUB_CMDLINE_LINUX="rd.luks.uuid=<LUKS-加密分区UUID> rd.luks.allow-discards root=UUID=<解密后根文件系统UUID> rootfstype=btrfs"

参数: * rd.luks.uuid=<UUID>:LUKS 加密分区的 UUID(使用 blkid /dev/nvme0n1p4 获取)。 * rd.luks.allow-discards:允许 SSD TRIM 指令穿透加密层(提升 SSD 性能)。 * root=UUID=<UUID>:解密后的根文件系统 UUID(使用 blkid /dev/mapper/cryptroot 获取)。 * rootfstype=btrfs请根据实际情况修改(例如 xfs, ext4)。

修改后运行 grub-mkconfig -o /boot/grub/grub.cfg

  • systemd-boot

    printf 'rd.luks.name=<LUKS-加密分区UUID>=cryptroot root=/dev/mapper/cryptroot rootfstype=btrfs rd.luks.allow-discards\n' > /etc/kernel/cmdline
    emerge --ask --config sys-kernel/gentoo-kernel-bin

参数: * rd.luks.name=<LUKS-UUID>=cryptroot:指定 LUKS 分区 UUID 并映射为 cryptroot。 * root=/dev/mapper/cryptroot:指定解密后的根分区设备。 * rootfstype=btrfs请根据实际情况修改(例如 xfs, ext4)。

  • Limine(limine.conf

    /Gentoo Linux
        protocol: linux
        kernel_path: boot():/<vmlinuz-文件名>
        module_path: boot():/<initramfs-文件名>
        cmdline: rd.luks.name=<LUKS-加密分区UUID>=cryptroot root=/dev/mapper/cryptroot rootfstype=btrfs rd.luks.allow-discards

参数:

  • rd.luks.name:同上,指定 LUKS 分区 UUID。
  • root:指定解密后的根分区设备。
  • rootfstype=btrfs请按实际情况修改,例如 xfsext4

仅在第 3 节的加密分区流程中选择 LUKS 时,才需要执行此步骤。


11. 完成安装
#

11.1 最终检查清单
#

  1. emerge --info 正常执行无错误
  2. /etc/fstab 中的 UUID 正确(使用 blkid 再确认)
  3. 已设定 root 与一般用户密码
  4. 已执行 grub-mkconfig 或完成 bootctl/Limine 配置
  5. 若使用 LUKS,确认 initramfs 含有 cryptsetup

11.2 退出 chroot 并重启
#

确认无误后,退出 chroot 并卸载挂载点:

exit
umount -l /mnt/gentoo/dev{/shm,/pts,}
umount -R /mnt/gentoo
swapoff -a
reboot

下一步桌面配置

延伸阅读

关于我

··约 3 分钟· loading

时间轴

··约 2 分钟· loading