跳过正文
  1. Posts/

Gentoo Linux 安装指南 (进阶优化篇)

·15862 字·32 分钟
作者
Zakk
Gentoo 中文社区现网站改版与内容维护
目录

文章特别说明
#

本文是 Gentoo Linux 安装指南 系列的第三部分:进阶优化

系列导航

  1. 基础安装:从零开始安装 Gentoo 基础系统
  2. 桌面配置:显卡驱动、桌面环境、输入法等
  3. 进阶优化(本文):make.conf 优化、LTO、系统维护

上一步桌面配置

13. make.conf 进阶配置指南
#

/etc/portage/make.conf 是 Gentoo 的内核配置文件,控制着软件包的编译方式、系统功能和优化参数。本章将深入讲解各个配置项的含义与最佳实践。


13.1 编译器优化参数
#

这些参数决定了软件包的编译方式,直接影响系统性能。

COMMON_FLAGS:编译器通用标志
#

COMMON_FLAGS="-march=native -O2 -pipe"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
FCFLAGS="${COMMON_FLAGS}"
FFLAGS="${COMMON_FLAGS}"

参数详解

参数说明注意事项
-march=native针对当前 CPU 架构优化编译的程序可能无法在其他 CPU 上运行
-O2优化级别 2(推荐)平衡性能、稳定性与编译时间
-O3激进优化(不推荐)可能导致部分软件编译失败或运行异常
-pipe使用管道传递数据加速编译,略微增加内存占用

推荐配置

对于大多数用户,使用 -march=native -O2 -pipe 已经足够。除非你明确知道自己在做什么,否则不要使用 -O3 或其他激进优化参数。

CPU 指令集优化 (CPU_FLAGS_X86)
#

CPU 指令集标志建议使用 app-portage/cpuid2cpuflags 自动检测并写入 CPU_FLAGS_X86

快速上手:请参考 基础篇 5.3 节:CPU 指令集优化

完整说明(推荐):请参考 13.13 节:CPU 指令集优化 (CPU_FLAGS_X86)


13.2 并行编译配置
#

控制编译过程的并行化程度,合理配置可大幅加速软件包安装。

MAKEOPTS:单个包的并行编译
#

MAKEOPTS="-j<线程数> -l<负载限制>"

推荐配置(根据 CPU 线程数和内存容量):

硬件配置MAKEOPTS说明
4核8线程 + 16GB 内存-j8 -l8标准配置
8核16线程 + 32GB 内存-j16 -l16主流配置
16核32线程 + 64GB 内存-j32 -l32进阶配置
内存不足(< 8GB)-j<线程数/2>减半避免内存耗尽

参数说明

  • -j<N>:同时运行的编译任务数(建议 = CPU 线程数)
  • -l<N>:系统负载上限,超过此值暂停新任务

EMERGE_DEFAULT_OPTS:多包并行编译
#

EMERGE_DEFAULT_OPTS="--ask --verbose --jobs=<并行包数> --load-average=<负载>"

推荐配置

CPU 线程数–jobs 值说明
4-8 线程2同时编译 2 个包
12-16 线程3-4同时编译 3-4 个包
24+ 线程4-6同时编译 4-6 个包

注意事项

  • --jobs 会显著增加内存占用,内存不足时请谨慎使用
  • 推荐先使用默认单包编译,稳定后再激活多包并行
  • Chrome、LLVM 等大型软件包单独编译时已占用大量内存

13.3 USE 标志管理
#

USE 标志控制软件功能的开关,是 Gentoo 定制化的内核。

全局 USE 标志
#

USE="systemd dbus policykit networkmanager bluetooth"
USE="${USE} wayland X gtk qt6"
USE="${USE} pipewire pulseaudio alsa"
USE="${USE} -doc -test -examples"

分类说明

系统与初始化(点击展开)
USE 标志说明推荐
systemd使用 systemd init 系统新手推荐
openrc使用 OpenRC init 系统传统用户
udev现代设备管理必需
dbus进程间通信(桌面必需)桌面必需
policykit权限管理(桌面必需)桌面必需
桌面环境与显示(点击展开)
USE 标志说明推荐
waylandWayland 显示协议现代桌面推荐
XX11 显示协议兼容性好
gtkGTK+ 工具包(GNOME/Xfce)GNOME 用户
qt6 / qt5Qt 工具包(KDE Plasma)KDE 用户
kdeKDE 集成KDE 用户
gnomeGNOME 集成GNOME 用户
多媒体与音频(点击展开)
USE 标志说明推荐
pipewire现代音频/视频服务器现代桌面推荐
pulseaudioPulseAudio 音频服务器传统桌面
alsaALSA 音频支持底层必需
ffmpegFFmpeg 编解码支持推荐
x264 / x265H.264/H.265 视频编码视频处理
vaapi / vdpau硬件视频加速有显卡推荐
网络与连接(点击展开)
USE 标志说明推荐
networkmanager图形化网络管理桌面用户推荐
bluetooth蓝牙支持需要时激活
wifi无线网络支持笔记本必需
国际化与文档(点击展开)
USE 标志说明推荐
cjk中日韩字体与输入法支持中文用户必需
nls本机化支持(软件翻译)推荐
icuUnicode 支持推荐
-doc禁用文档安装节省空间
-test禁用测试套件加速编译
-examples禁用示例文档节省空间

USE 标志策略建议

  1. 最小化原则:只激活你需要的功能,禁用不需要的(使用 - 前缀)
  2. 分类管理:用 USE="${USE} ......" 分类添加,便于维护
  3. 单包覆盖:特定软件包的 USE 标志放在 /etc/portage/package.use/

13.4 语言与本机化
#

# 软件翻译与文档支持
L10N="en en-US zh zh-CN zh-TW"

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

# 保持编译输出为英文(便于搜索错误信息)
LC_MESSAGES=C

13.5 许可证管理 (ACCEPT_LICENSE)
#

控制系统可以安装哪些许可证的软件。

常见配置方式
#

# 方式 1:接受所有许可证(新手推荐)
ACCEPT_LICENSE="*"

# 方式 2:仅自由软件
ACCEPT_LICENSE="@FREE"

# 方式 3:自由软件 + 可再分发的二进制
ACCEPT_LICENSE="@FREE @BINARY-REDISTRIBUTABLE"

# 方式 4:严格控制(拒绝所有,再显式允许)
ACCEPT_LICENSE="-* @FREE @BINARY-REDISTRIBUTABLE"

许可证组说明
#

许可证组说明
@FREE所有自由软件(OSI/FSF 认证)
@BINARY-REDISTRIBUTABLE允许再分发的二进制软件
@GPL-COMPATIBLEGPL 兼容许可证

單包許可證配置(推薦方式)
#

# /etc/portage/package.license/firmware
sys-kernel/linux-firmware linux-fw-redistributable
sys-firmware/intel-microcode intel-ucode

# /etc/portage/package.license/nvidia
x11-drivers/nvidia-drivers NVIDIA-r2

13.6 Portage 功能增强 (FEATURES)
#

FEATURES="parallel-fetch candy"

常用 FEATURES

功能说明推荐
parallel-fetch并行下载源码包推荐
candy美化 emerge 输出(彩色进度条)推荐
ccache编译缓存(需安装 dev-build/ccache频繁重编译时推荐
parallel-install并行安装(实验性)不推荐
splitdebug分离调试信息调试时使用

13.7 镜像源配置 (GENTOO_MIRRORS)
#

# 更多镜像请参考:https://www.gentoo.org.cn/mirrorlist/
# 建议根据地理位置选择(任选其一或多个,空格分隔)

# 中国大陆镜像(推荐)
GENTOO_MIRRORS="https://mirrors.ustc.edu.cn/gentoo/"

# 或使用其他镜像:
# 中国大陆:
#   GENTOO_MIRRORS="https://mirrors.ustc.edu.cn/gentoo/"            # 中国科学技术大学(推荐)
#   GENTOO_MIRRORS="https://mirrors.tuna.tsinghua.edu.cn/gentoo/"   # 清华大学
#   GENTOO_MIRRORS="https://mirrors.zju.edu.cn/gentoo/"             # 浙江大学
# 香港:
#   GENTOO_MIRRORS="https://hk.mirrors.cicku.me/gentoo/"            # CICKU
# 台湾:
#   GENTOO_MIRRORS="http://ftp.twaren.net/Linux/Gentoo/"            # NCHC
#   GENTOO_MIRRORS="https://tw.mirrors.cicku.me/gentoo/"            # CICKU
# 新加坡:
#   GENTOO_MIRRORS="https://mirror.freedif.org/gentoo/"             # Freedif
#   GENTOO_MIRRORS="https://sg.mirrors.cicku.me/gentoo/"            # CICKU

13.8 编译日志配置
#

# 记录哪些级别的日志
PORTAGE_ELOG_CLASSES="warn error log qa"

# 日志保存方式
PORTAGE_ELOG_SYSTEM="save"  # 保存到 /var/log/portage/elog/

日志级别说明

  • warn:警告信息(配置问题)
  • error:错误信息(编译失败)
  • log:普通日志
  • qa:质量保证警告(安全问题)

13.9 显卡与输入设备
#

重要提示

VIDEO_CARDSINPUT_DEVICES 不建议在 make.conf 中全局配置。

推荐使用 /etc/portage/package.use/ 方式针对特定软件包配置,详见 桌面配置篇 12.1 节


13.10 完整配置示例
#

新手推荐配置(点击展开)
# /etc/portage/make.conf
# vim: set filetype=bash

# ========== 编译器优化 ==========
COMMON_FLAGS="-march=native -O2 -pipe"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
FCFLAGS="${COMMON_FLAGS}"
FFLAGS="${COMMON_FLAGS}"

# ========== 并行编译 ==========
MAKEOPTS="-j8"  # 根据 CPU 线程数调整

# ========== USE 标志 ==========
USE="systemd dbus policykit networkmanager bluetooth"
USE="${USE} wayland pipewire"
USE="${USE} -doc -test"

# ========== 语言与本机化 ==========
L10N="en zh zh-CN"
LINGUAS="en zh_CN"
LC_MESSAGES=C

# ========== 镜像源 ==========
# 建议根据地理位置选择(择一或多个,空格分隔):
GENTOO_MIRRORS="https://mirrors.ustc.edu.cn/gentoo/"  # 中国科学技术大学(推荐)
# GENTOO_MIRRORS="https://mirrors.tuna.tsinghua.edu.cn/gentoo/"  # 清华大学
# GENTOO_MIRRORS="https://hk.mirrors.cicku.me/gentoo/"  # 香港 CICKU
# GENTOO_MIRRORS="http://ftp.twaren.net/Linux/Gentoo/"  # 台湾 NCHC
# GENTOO_MIRRORS="https://tw.mirrors.cicku.me/gentoo/"  # 台湾 CICKU
# GENTOO_MIRRORS="https://mirror.freedif.org/gentoo/"  # 新加坡 Freedif
# GENTOO_MIRRORS="https://sg.mirrors.cicku.me/gentoo/"  # 新加坡 CICKU
# 更多镜像请参考:https://www.gentoo.org/downloads/mirrors/

# ========== Portage 配置 ==========
FEATURES="parallel-fetch candy"
EMERGE_DEFAULT_OPTS="--ask --verbose"

# ========== 许可证 ==========
ACCEPT_LICENSE="*"

# ========== 编译日志 ==========
PORTAGE_ELOG_CLASSES="warn error log"
PORTAGE_ELOG_SYSTEM="save"
高性能配置(点击展开)
# /etc/portage/make.conf
# vim: set filetype=bash

# ========== 编译器优化 ==========
COMMON_FLAGS="-march=native -O2 -pipe"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
FCFLAGS="${COMMON_FLAGS}"
FFLAGS="${COMMON_FLAGS}"

# ========== 并行编译(进阶硬件) ==========
MAKEOPTS="-j32 -l32"
EMERGE_DEFAULT_OPTS="--ask --verbose --jobs=4 --load-average=32"

# ========== USE 标志(完整桌面) ==========
USE="systemd udev dbus policykit"
USE="${USE} networkmanager bluetooth wifi"
USE="${USE} wayland X gtk qt6 kde"
USE="${USE} pipewire pulseaudio alsa"
USE="${USE} ffmpeg x264 x265 vaapi vulkan"
USE="${USE} cjk nls icu"
USE="${USE} -doc -test -examples"

# ========== 语言与本机化 ==========
L10N="en en-US zh zh-CN zh-TW"
LINGUAS="en en_US zh zh_CN zh_TW"
LC_MESSAGES=C

# ========== 镜像源 ==========
# 建议根据地理位置选择(择一或多个,空格分隔):
GENTOO_MIRRORS="https://mirrors.ustc.edu.cn/gentoo/"  # 中国科学技术大学(推荐)
# GENTOO_MIRRORS="https://mirrors.tuna.tsinghua.edu.cn/gentoo/"  # 清华大学
# GENTOO_MIRRORS="https://hk.mirrors.cicku.me/gentoo/"  # 香港 CICKU
# GENTOO_MIRRORS="http://ftp.twaren.net/Linux/Gentoo/"  # 台湾 NCHC
# GENTOO_MIRRORS="https://tw.mirrors.cicku.me/gentoo/"  # 台湾 CICKU
# GENTOO_MIRRORS="https://mirror.freedif.org/gentoo/"  # 新加坡 Freedif
# GENTOO_MIRRORS="https://sg.mirrors.cicku.me/gentoo/"  # 新加坡 CICKU
# 更多镜像请参考:https://www.gentoo.org/downloads/mirrors/

# ========== Portage 配置 ==========
FEATURES="parallel-fetch candy ccache"
CCACHE_DIR="/var/cache/ccache"

# ========== 许可证 ==========
ACCEPT_LICENSE="*"

# ========== 编译日志 ==========
PORTAGE_ELOG_CLASSES="warn error log qa"
PORTAGE_ELOG_SYSTEM="save"

13.11 详细配置范例(完整注释版)
#

详细配置范例(建议阅读并调整)(点击展开)
# 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 指令集优化(自动生成,见下文 13.13 节)
# 运行: emerge --ask app-portage/cpuid2cpuflags && cpuid2cpuflags >> /etc/portage/make.conf
# CPU_FLAGS_X86="aes avx avx2 f16c fma3 mmx mmxext pclmul popcnt sse sse2 sse3 sse4_1 sse4_2 ssse3"

# ========== 并行编译设置 ==========
# MAKEOPTS: 控制 make 的并行任务数
#   -j<N>   同时运行的编译任务数,推荐值 = CPU 线程数(运行 nproc 查看)
#   -l<N>   系统负载限制,防止系统重载(可选,一般与 -j 值相同)
MAKEOPTS="-j8"  # 示例:8 线程 CPU

# 内存不足时的调整建议:
#    16GB 内存 + 8 核 CPU → MAKEOPTS="-j4 -l8"  (减半并行数)
#    32GB 内存 + 16 核 CPU → MAKEOPTS="-j16 -l16"

# ========== 语言与本机化设置 ==========
# LC_MESSAGES: 保持编译输出为英文,便于搜索错误信息和社区求助
LC_MESSAGES=C

# L10N: 本机化语言支持(影响软件翻译、帮助文档、拼写检查等)
L10N="en en-US zh zh-CN zh-TW"

# LINGUAS: 旧式本机化变量(部分软件仍依赖此变量)
LINGUAS="en en_US zh zh_CN zh_TW"

# ========== 镜像源设置 ==========
# 更多镜像请参考:https://www.gentoo.org.cn/mirrorlist/
# 中国大陆常用镜像(任选其一):
#   USTC (中国科学技术大学): https://mirrors.ustc.edu.cn/gentoo/
#   TUNA (清华大学): https://mirrors.tuna.tsinghua.edu.cn/gentoo/
#   ZJU (浙江大学): https://mirrors.zju.edu.cn/gentoo/
# 香港/台湾/新加坡镜像:
#   CICKU (香港): https://hk.mirrors.cicku.me/gentoo/
#   NCHC (台湾): http://ftp.twaren.net/Linux/Gentoo/
#   Freedif (新加坡): https://mirror.freedif.org/gentoo/
GENTOO_MIRRORS="https://mirrors.ustc.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           并行编译多个软件包(内存充足时建议 2-4)
#    --load-average=N   系统负载上限(建议与 CPU 内核数相同)
# EMERGE_DEFAULT_OPTS="--ask --verbose --jobs=2 --load-average=8"

# ========== USE 标志(全局功能开关) ==========
# 控制所有软件包的编译选项,影响功能可用性和依赖关系
#
# 系统基础:
#   systemd        使用 systemd init 系统(若用 OpenRC 改为 -systemd)
#   udev           现代设备管理(推荐保留)
#   dbus           进程间通信(桌面环境必需)
#   policykit      权限管理(桌面环境必需)
#
# 网络与硬件:
#   networkmanager 图形化网络管理(桌面用户推荐)
#   bluetooth      蓝牙支持
#
# 开发工具:
#   git            Git 版本控制(开发者必备)
#
# 内核选择:
#   dist-kernel    使用发行版预配置内核(新手强烈推荐)
#                  不使用此标志则需手动配置内核(见第 7 章)
#
USE="systemd udev dbus policykit networkmanager bluetooth git dist-kernel"

# 常用的可选 USE 标志:
#   音频:pulseaudio / pipewire(音频服务器,二选一)
#   显示:wayland / X(显示协议,桌面环境需要)
#   图形:vulkan, opengl(现代图形 API)
#   视频:vaapi, vdpau(硬件视频加速)
#   打印:cups(打印系统)
#   容器:flatpak, appimage(第三方应用支持)
#   禁用:-doc, -test, -examples(节省编译时间和磁盘空间)

# ========== 许可证设置 ==========
# ACCEPT_LICENSE: 控制可安装软件的许可证类型
#
# 常见配置:
#   "*"                接受所有许可证(新手推荐,避免许可证问题阻止安装)
#   "@FREE"            仅接受自由软件(严格的开源政策)
#   "@BINARY-REDISTRIBUTABLE"  允许自由再分发的二进制软件
#   "-* @FREE"         拒绝所有后显式允许(最严格控制)
#
# 推荐策略:
#   - 新手/桌面用户:使用 "*" 避免许可证问题
#   - 开源软件坚持者:使用 "@FREE",需要闭源软件时单独配置
#   - 详细说明见下方「13.12 ACCEPT_LICENSE 详解」
ACCEPT_LICENSE="*"

# 针对特定软件包的许可证配置(推荐方式):
#    创建 /etc/portage/package.license/ 目录并添加配置文档
#    示例见下方「13.12 ACCEPT_LICENSE 详解」

# ========== Portage 功能配置(可选) ==========
# FEATURES: 激活 Portage 的高级功能
#   parallel-fetch    并行下载源码包(加速更新)
#   parallel-install  并行安装多个包(实验性,可能不稳定)
#   candy             美化 emerge 输出(彩色进度条)
#   ccache            编译缓存(需安装 dev-build/ccache,加速重复编译)
#   splitdebug        分离调试信息到独立文档(节省空间,便于调试)
# FEATURES="parallel-fetch candy"

# ========== 编译日志配置(推荐激活) ==========
# PORTAGE_ELOG_CLASSES: 要记录的日志级别
#   info     一般信息(安装成功消息等)
#   warn     警告信息(配置问题、不推荐的操作)
#   error    错误信息(编译失败、依赖问题)
#   log      普通日志(所有输出)
#   qa       质量保证警告(ebuild 问题、安全警告)
PORTAGE_ELOG_CLASSES="warn error log qa"

# PORTAGE_ELOG_SYSTEM: 日志输出方式
#   save          保存到 /var/log/portage/elog/(推荐,便于事后查看)
#   echo          编译后直接显示在终端
#   mail          通过邮件发送(需配置邮件系统)
#   syslog        发送到系统日志
#   custom        自定义处理脚本
PORTAGE_ELOG_SYSTEM="save"

# 注意:文件末尾必须保留空行(POSIX 标准要求)

配置说明

这是一个带有详细注释的完整 make.conf 范例。实际使用时:

  1. 必须调整MAKEOPTS(根据你的 CPU 线程数)、GENTOO_MIRRORS(选择就近镜像)
  2. 建议调整USE 标志(根据需要的桌面环境和功能)
  3. 可选配置FEATURES、日志配置等(按需激活)
  4. VIDEO_CARDS / INPUT_DEVICES 已移至 桌面配置篇

13.12 ACCEPT_LICENSE 软件许可证详解
#

ACCEPT_LICENSE 软件许可证管理(点击展开)

什么是 ACCEPT_LICENSE?
#

根据 GLEP 23(Gentoo Linux Enhancement Proposal 23),Gentoo 提供了一个机制,允许系统管理员"控制他们安装的软件的许可证类型"。ACCEPT_LICENSE 变量决定了 Portage 可以安装哪些许可证的软件。

为什么需要这个?

  • Gentoo 软件仓库包含数千个软件包,涉及数百种不同的软件许可证
  • 你可能只想使用自由软件(OSI 认证)或需要接受某些闭源许可证
  • 无需逐一审批每个许可证 —— GLEP 23 引入了许可证组 (License Groups) 概念

常用许可证组
#

许可证组使用 @ 符号前缀,便于与单个许可证区分:

许可证组说明
@GPL-COMPATIBLEFSF 认可的 GPL 兼容许可证 [1]
@FSF-APPROVEDFSF 认可的自由软件许可证(包含 @GPL-COMPATIBLE
@OSI-APPROVEDOSI(Open Source Initiative)认可的开源许可证 [2]
@MISC-FREE其他可能符合自由软件定义的许可证(未经 FSF/OSI 认证)[3]
@FREE-SOFTWARE合并 @FSF-APPROVED + @OSI-APPROVED + @MISC-FREE
@FSF-APPROVED-OTHERFSF 认可的"自由文档"和"实用作品"许可证(包括字体)
@MISC-FREE-DOCS其他自由文档许可证(未列入 @FSF-APPROVED-OTHER[4]
@FREE-DOCUMENTS合并 @FSF-APPROVED-OTHER + @MISC-FREE-DOCS
@FREE所有自由软件和文档(合并 @FREE-SOFTWARE + @FREE-DOCUMENTS
@BINARY-REDISTRIBUTABLE至少允许自由再分发二进制文件的许可证(包含 @FREE
@EULA试图剥夺用户权利的许可协议(比"保留所有权利"更严格)

查看当前系统设置
#

portageq envvar ACCEPT_LICENSE

输出示例(默认值):

@FREE

这表示系统默认只允许安装 @FREE 组的软件(自由软件)。

配置 ACCEPT_LICENSE
#

可以在以下位置设置:

1. 系统全局设置(/etc/portage/make.conf 覆盖 profile 的默认值:

# 接受所有许可证(包括闭源软件)
ACCEPT_LICENSE="*"

# 或:仅接受自由软件 + 可自由再分发的二进制文件
ACCEPT_LICENSE="-* @FREE @BINARY-REDISTRIBUTABLE"

# 或:仅自由软件(默认值)
ACCEPT_LICENSE="@FREE"

推荐做法

  • 新手/桌面用户:使用 ACCEPT_LICENSE="*" 避免许可证问题导致软件安装失败
  • 纯自由软件用户:使用 ACCEPT_LICENSE="@FREE",需要闭源软件时单独为包配置
  • 前缀 -* 表示先拒绝所有,再显式允许指定组(更严格的控制)

2. 针对单个包设置(/etc/portage/package.license

某些软件包可能需要特定许可证(例如固件、显卡驱动):

# 创建目录(如果不存在)
mkdir -p /etc/portage/package.license

编辑 /etc/portage/package.license/kernel

# unrar 压缩工具
app-arch/unrar unRAR

# Linux 固件(包含非自由固件)
sys-kernel/linux-firmware linux-fw-redistributable

# Intel 微码
sys-firmware/intel-microcode intel-ucode

LICENSE 变量的免责声明
#

重要提示

ebuild 中的 LICENSE 变量仅是开发者和用户的参考指南,不是法律声明,也不保证 100% 准确。请勿仅依赖 ebuild 的许可证标识,建议深入检查软件包本身及其安装的所有文档。

参考:Gentoo Handbook: ACCEPT_LICENSE

实际应用建议
#

在本指南的 make.conf 范例中,我们使用了 ACCEPT_LICENSE="*"(接受所有许可证)。如果你希望严格控制:

  1. 先将 make.conf 中的设置改为 ACCEPT_LICENSE="@FREE"
  2. 安装软件时,如果遇到许可证阻止,Portage 会提示需要哪个许可证
  3. 根据需要,在 /etc/portage/package.license/ 中为特定软件包添加例外

示例(安装闭源 NVIDIA 驱动时的提示):

The following license changes are necessary to proceed:
 x11-drivers/nvidia-drivers NVIDIA-r2

解决方式:

echo "x11-drivers/nvidia-drivers NVIDIA-r2" >> /etc/portage/package.license/nvidia

13.13 CPU 指令集优化 (CPU_FLAGS_X86)
#

CPU 指令集优化 (CPU_FLAGS_X86)(点击展开)

可参考CPU_FLAGS_*

CPU_FLAGS_X86 是 Gentoo 用来描述“你的 CPU 实际支持哪些 x86 指令集”的变量。部分软件包会依据它来开启(或关闭)对应的优化,例如 AES、AVX、SSE4.2 等。

这里刻意不再重复“如何生成并写入 CPU_FLAGS_X86”的操作步骤(基础篇已经给了最短可用流程):

完成后,你通常会在 /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"

注意事项
#

  1. 避免重复追加cpuid2cpuflags >> /etc/portage/make.conf 会“追加”到文件末尾。如果你重复执行多次,可能出现多行 CPU_FLAGS_X86=...。建议保留最后一行(或你想用的那一行),把其余重复行删掉,避免日后自己看不懂。
  2. 跨机器可携性:如果你会把同一份配置同步到不同主机(或机器会更换 CPU),CPU_FLAGS_X86 最好不要“直接复制”。建议在每台机器上各自跑一次检测工具,让结果匹配该主机。
  3. 不是所有架构都用它CPU_FLAGS_X86 顾名思义只适用于 x86(amd64/x86)。
    • 如果你装的是 ARM64(arm64)/ ARM(arm)/ RISC-V 等架构:通常不要设置 CPU_FLAGS_X86
    • 请改为查阅 Gentoo Wiki 的 CPU_FLAGS_* 页面,按你的架构使用对应的 CPU_FLAGS_… 变量与检测方式(不同架构用的变量名与工具可能不同,用 x86 的 cpuid2cpuflags 不一定适用)。

说明:我改了之后,哪些软件包会受影响?
#

一般来说,这类变更会影响到需要基于 CPU 指令集做条件编译的软件包;要让改动生效,通常需要重新编译受影响的软件包(或跑一次 world 更新让 Portage 自行判断)。具体策略与细节会依你当前的 USE/FEATURES 与软件包版本而异。


13.14 延伸阅读
#


14. 进阶编译优化 [可选]
#

为了提升后续的编译速度,建议配置 tmpfs 和 ccache。

14.1 配置 tmpfs (内存编译)
#

可参考Tmpfs

将编译临时目录挂载到内存,减少 SSD 磨损并加速编译。

Tmpfs 配置指南(点击展开)

注意

size 大小不要超过你的物理内存大小(建议设为内存的一半),否则可能导致系统不稳定。

编辑 /etc/fstab,添加以下行(size 建议设置为内存的一半,例如 16G):

tmpfs   /var/tmp/portage   tmpfs   size=16G,uid=portage,gid=portage,mode=775,noatime   0 0

挂载目录:

mount /var/tmp/portage

14.2 配置 ccache (编译缓存)
#

可参考Ccache

缓存编译中间产物,加快重新编译速度。

emerge --ask dev-build/ccache
ccache -M 20G  # 设置缓存大小为 20GB

14.3 处理大型软件编译 (避免 tmpfs 爆满)
#

Firefox、LibreOffice 等大型软件编译时可能会耗尽 tmpfs 空间。我们可以配置 Portage 让这些特定软件使用硬盘进行编译。

Notmpfs 配置指南(点击展开)
  1. 创建配置目录:

    mkdir -p /etc/portage/env
    mkdir -p /var/tmp/notmpfs
  2. 创建 notmpfs.conf

    echo 'PORTAGE_TMPDIR="/var/tmp/notmpfs"' > /etc/portage/env/notmpfs.conf
  3. 针对特定软件应用配置: 编辑 /etc/portage/package.env (如果是目录则创建文件):

    vim /etc/portage/package.env

    写入:

    www-client/chromium notmpfs.conf
    app-office/libreoffice notmpfs.conf
    dev-qt/qtwebengine notmpfs.conf

14.4 LTO 与 Clang 优化
#

详细配置请参考 Section 15 进阶编译优化


15. LTO 与 Clang 编译优化 (可选)
#

风险提示

LTO 会显著增加编译时间和内存消耗,且可能导致部分软件编译失败。强烈不建议全局打开,仅推荐针对特定软件(如浏览器)打开。

15.1 链接时优化 (LTO)
#

可参考LTO

LTO (Link Time Optimization) 将优化推迟到链接阶段,可带来性能提升和体积减小。

LTO 优缺点详细分析(点击展开)

优势

  • 性能提升(通常两位数)
  • 二进制体积减小
  • 启动时间改善

劣势

  • 编译时间增加 2-3 倍
  • 内存消耗巨大
  • 稳定性风险
  • 故障排查困难

新手提示

如果你的系统是 4 核 CPU 配 4GB 内存,那么花在编译上的时间可能远超优化带来的性能提升。请根据硬件配置权衡利弊。

1. 使用 USE 标志打开 (最推荐)

对于 Firefox 和 Chromium 等大型软件,官方 ebuild 通常提供了经过测试的 ltopgo USE 标志:

/etc/portage/package.use/browser 中激活:

www-client/firefox lto pgo
www-client/chromium lto pgo  # 注意:PGO 在 Wayland 环境下可能无法使用

USE=“lto” 标志说明:部分软件包需要特殊修复才能支持 LTO,可以全局或针对特定软件包激活 lto USE 标志:

# 在 /etc/portage/make.conf 中全局激活
USE="lto"

2. 针对特定软件包激活 LTO (推荐)

创建 /etc/portage/env/lto.conf

CFLAGS="${CFLAGS} -flto"
CXXFLAGS="${CXXFLAGS} -flto"

/etc/portage/package.env 中应用:

www-client/firefox lto.conf
app-editors/vim lto.conf

3. 全局激活 LTO (GCC 系统)

警告

全局 LTO 会导致大量软件包编译失败,需要频繁维护排除列表,不建议新手尝试

编辑 /etc/portage/make.conf

# 这些警告指示 LTO 可能导致的运行时问题,将其提升为错误
# -Werror=odr: One Definition Rule 违规(多次定义同一符号)
# -Werror=lto-type-mismatch: LTO 类型不匹配
# -Werror=strict-aliasing: 严格别名违规
WARNING_FLAGS="-Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing"

# -O2: 优化级别 2(推荐)
# -pipe: 使用管道加速编译
# -march=native: 针对当前 CPU 优化
# -flto: 激活链接时优化(Full LTO)
# 注意:GCC 的 -flto 默认使用 Full LTO,适合 GCC 系统
COMMON_FLAGS="-O2 -pipe -march=native -flto ${WARNING_FLAGS}"
CFLAGS="${COMMON_FLAGS}"          # C 编译器标志
CXXFLAGS="${COMMON_FLAGS}"        # C++ 编译器标志
FCFLAGS="${COMMON_FLAGS}"         # Fortran 编译器标志
FFLAGS="${COMMON_FLAGS}"          # Fortran 77 编译器标志
LDFLAGS="${COMMON_FLAGS} ${LDFLAGS}"  # 链接器标志

USE="lto"  # 激活 LTO 支持的 USE 标志

4. 全局激活 LTO (LLVM/Clang 系统 - 推荐使用 ThinLTO)

默认推荐

如果使用 Clang,强烈推荐使用 ThinLTO (-flto=thin) 而非 Full LTO (-flto)。ThinLTO 速度更快,内存占用更少,支持并行化。

警告

如果 clang-common 未激活 default-lld USE 标志,必须在 LDFLAGS 中添加 -fuse-ld=lld

编辑 /etc/portage/make.conf

# Clang 目前尚未完全实现这些诊断,但保留这些标志以备将来使用
# -Werror=odr: One Definition Rule 违规检测(Clang 部分支持)
# -Werror=strict-aliasing: 严格别名违规检测(Clang 正在开发)
WARNING_FLAGS="-Werror=odr -Werror=strict-aliasing"

# -O2: 优化级别 2(平衡性能与稳定性)
# -pipe: 使用管道加速编译
# -march=native: 针对当前 CPU 优化
# -flto=thin: 激活 ThinLTO(推荐,速度快且并行化)
COMMON_FLAGS="-O2 -pipe -march=native -flto=thin ${WARNING_FLAGS}"
CFLAGS="${COMMON_FLAGS}"          # C 编译器标志
CXXFLAGS="${COMMON_FLAGS}"        # C++ 编译器标志
FCFLAGS="${COMMON_FLAGS}"         # Fortran 编译器标志
FFLAGS="${COMMON_FLAGS}"          # Fortran 77 编译器标志
LDFLAGS="${COMMON_FLAGS} ${LDFLAGS}"  # 链接器标志

USE="lto"  # 激活 LTO 支持的 USE 标志

ThinLTO vs Full LTO(推荐新手阅读)

类型标志优势劣势推荐场景
ThinLTO-flto=thin• 速度快
• 内存占用少
• 支持并行化
• 编译速度提升 2-3 倍
• 仅 Clang/LLVM 支持默认推荐(Clang 用户)
Full LTO-flto• 更深度的优化
• GCC 和 Clang 均支持
• 速度慢
• 内存占用高
• 串行处理
GCC 用户或需要极致优化时

新手提示

如果你使用 Clang,请务必使用 -flto=thin。这是目前的最佳实践,能在保证性能的同时大幅减少编译时间。

5. Rust LTO 配置

在 LLVM 系统上

# 在 /etc/portage/make.conf 中添加
RUSTFLAGS="${RUSTFLAGS} -Clinker-plugin-lto"

在 GCC 系统上(需要使用 Clang 编译 Rust 代码): 创建 /etc/portage/env/llvm-lto.conf

WARNING_FLAGS="-Werror=odr -Werror=strict-aliasing"
COMMON_FLAGS="-march=native -O2 -flto=thin -pipe ${WARNING_FLAGS}"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
FCFLAGS="${COMMON_FLAGS}"
FFLAGS="${COMMON_FLAGS}"

RUSTFLAGS="-C target-cpu=native -C strip=debuginfo -C opt-level=3 \
-Clinker=clang -Clinker-plugin-lto -Clink-arg=-fuse-ld=lld"

LDFLAGS="${COMMON_FLAGS} ${LDFLAGS} -fuse-ld=lld"
CC="clang"
CXX="clang++"
CPP="clang-cpp"
AR="llvm-ar"
NM="llvm-nm"
RANLIB="llvm-ranlib"

USE="lto"

/etc/portage/package.env 中为 Rust 软件包指定:

dev-lang/rust llvm-lto.conf

15.3 进阶软件包环境配置 (package.env)
#

针对特定软件包的特殊配置(如禁用 LTO 或低内存模式),可以使用 package.env 进行精细控制。

配置 1:禁用 LTO 的软件包列表 (no-lto) - 点击展开

某些软件包已知与 LTO 不兼容。建议创建 /etc/portage/env/nolto.conf

# 禁用 LTO 及相关警告
DISABLE_LTO="-Wno-error=odr -Wno-error=lto-type-mismatch -Wno-error=strict-aliasing -fno-lto"
CFLAGS="${CFLAGS} ${DISABLE_LTO}"
CXXFLAGS="${CXXFLAGS} ${DISABLE_LTO}"
FCFLAGS="${FCFLAGS} ${DISABLE_LTO}"
FFLAGS="${FFLAGS} ${DISABLE_LTO}"
LDFLAGS="${LDFLAGS} ${DISABLE_LTO}"

创建 /etc/portage/package.env/no-lto 文件(包含已知问题包):

# 已知与 LTO 有兼容性问题的套件
# 仍使用 Clang 编译,但禁用 LTO

app-misc/jq no-lto.conf
app-shells/zsh no-lto.conf
dev-build/ninja no-lto.conf
dev-cpp/abseil-cpp no-lto.conf
dev-lang/perl no-lto.conf
dev-lang/spidermonkey no-lto.conf
dev-lang/tcl no-lto.conf
dev-libs/jemalloc no-lto.conf
dev-libs/libportal no-lto.conf
dev-python/jq no-lto.conf
dev-qt/qtbase no-lto.conf
dev-qt/qtdeclarative no-lto.conf
dev-tcltk/expect no-lto.conf
dev-util/dejagnu no-lto.conf
gnome-base/gnome-shell no-lto.conf
gui-libs/libadwaita no-lto.conf
llvm-core/clang no-lto.conf
llvm-core/llvm no-lto.conf
media-libs/clutter no-lto.conf
media-libs/libsdl2 no-lto.conf
media-libs/libsdl3 no-lto.conf
media-libs/libsdl no-lto.conf
media-libs/webrtc-audio-processing no-lto.conf
media-video/ffmpeg no-lto.conf
media-video/pipewire no-lto.conf
net-libs/libnma no-lto.conf
net-print/cups no-lto.conf
sys-devel/clang no-lto.conf
sys-devel/llvm no-lto.conf
x11-drivers/nvidia-drivers no-lto.conf
x11-libs/cairo no-lto.conf
dev-python/pillow no-lto.conf
media-libs/gexiv2 no-lto.conf
x11-wm/mutter no-lto.conf
配置 2:低内存编译模式 (low-memory) - 点击展开

对于大型项目(如 Chromium, Rust),建议使用低内存配置以防止 OOM。

创建 /etc/portage/env/low-memory.conf

# 减少并行任务数,例如改为 -j2 或 -j4
MAKEOPTS="-j4"
# 可选:移除一些耗内存的优化标志
COMMON_FLAGS="-O2 -pipe"

创建 /etc/portage/package.env/low-memory

# 容易导致系统卡死的大型套件
# 使用低内存编译设置

# 浏览器类 (极大型项目)
www-client/chromium low-memory.conf
mail-client/thunderbird low-memory.conf

# 办公套件
app-office/libreoffice low-memory.conf

# 虚拟化
app-emulation/qemu low-memory.conf

# Rust 大型项目
dev-lang/rust low-memory.conf
virtual/rust low-memory.conf

提示

如果遇到其他 LTO 相关的链接错误,请先尝试禁用该包的 LTO。也可以查看 Gentoo Bugzilla 搜索是否已有相关报告(搜索"软件包名 lto")。如果是新问题,欢迎提交 bug 报告帮助改进 Gentoo。

15.2 使用 Clang 编译
#

可参考Clang

前提条件:安装 Clang 和 LLD

emerge --ask llvm-core/clang llvm-core/lld

重要提示

  • 部分软件包(如 sys-libs/glibc, app-emulation/wine)无法使用 Clang 编译,仍需 GCC。
  • Gentoo 维护了 bug #408963 来跟踪 Clang 编译失败的软件包。

1. 针对特定软件打开 (推荐)

创建环境配置文件 /etc/portage/env/clang.conf

CC="clang"
CXX="clang++"
CPP="clang-cpp"  # 某些软件包(如 xorg-server)需要
AR="llvm-ar"
NM="llvm-nm"
RANLIB="llvm-ranlib"

应用到特定软件(例如 app-editors/neovim),在 /etc/portage/package.env 中添加:

app-editors/neovim clang.conf

3. PGO 支持(配置文档引导优化)

注意

如果需要 PGO 支持(如 dev-lang/python[pgo]),需要安装以下包:

emerge --ask llvm-core/clang-runtime
emerge --ask llvm-runtimes/compiler-rt-sanitizers

/etc/portage/package.use 中激活相关 USE 标志:

llvm-core/clang-runtime sanitize
llvm-runtimes/compiler-rt-sanitizers profile orc

警告

  • 如果没有激活 profileorc USE 标志,带有 pgo USE 标志的软件包(如 dev-lang/python[pgo])会编译失败。
  • 编译日志可能会报错:ld.lld: error: cannot open /usr/lib/llvm/18/bin/../../../../lib/clang/18/lib/linux/libclang_rt.profile-x86_64.a

4. 全局打开 (不建议初学者)

全局切换到 Clang 需要系统大部分软件支持,且需要处理大量兼容性问题,仅建议高级用户尝试

如需全局激活,在 /etc/portage/make.conf 中添加:

CC="clang"
CXX="clang++"
CPP="clang-cpp"
AR="llvm-ar"
NM="llvm-nm"
RANLIB="llvm-ranlib"

GCC 回退环境

对于无法使用 Clang 编译的软件包,创建 /etc/portage/env/gcc.conf

CC="gcc"
CXX="g++"
CPP="gcc -E"
AR="ar"
NM="nm"
RANLIB="ranlib"

/etc/portage/package.env 中为特定软件指定使用 GCC:

sys-libs/glibc gcc.conf
app-emulation/wine gcc.conf

16. 内核编译进阶指南 (可选)
#

本节面向希望深入掌控内核编译的高级用户,包括使用 LLVM/Clang 编译、激活 LTO 优化、自动化配置等。

16.1 准备工作
#

安装必要工具:

# 安装内核源码和构建工具
emerge --ask sys-kernel/gentoo-sources

# (可选)安装 Genkernel 用于自动化
emerge --ask sys-kernel/genkernel

# (可选)使用 LLVM/Clang 编译需要
emerge --ask llvm-core/llvm \
    llvm-core/clang llvm-core/lld

16.2 查看系统信息(硬件检测)
#

在配置内核前,了解你的硬件非常重要:

查看 CPU 信息

lscpu  # 查看 CPU 型号、内核数、架构等
cat /proc/cpuinfo | grep "model name" | head -1  # CPU 型号

查看 PCI 设备(显卡、网卡等)

lspci -k  # 列出所有 PCI 设备及当前使用的驱动
lspci | grep -i vga  # 查看显卡
lspci | grep -i network  # 查看网卡

查看 USB 设备

lsusb  # 列出所有 USB 设备

查看已加载的内核模块

lsmod  # 列出当前加载的所有模块
lsmod | wc -l  # 模块数量

16.3 根据当前模块自动配置内核
#

如果你想保留当前系统(如 LiveCD)所有正常工作的硬件支持:

cd /usr/src/linux

# 方法 1:基于当前加载的模块创建最小化配置
make localmodconfig
# 这会只激活当前加载模块对应的内核选项(强烈推荐!)

# 方法 2:基于当前运行内核的配置创建
zcat /proc/config.gz > .config  # 如果当前内核支持
make olddefconfig  # 使用默认值更新配置

新手提示

localmodconfig 是最安全的方法,它会确保你的硬件都能正常工作,同时移除不需要的驱动。

16.4 手动配置内核选项
#

进入配置界面

cd /usr/src/linux
make menuconfig  # 文本界面(推荐)
  ┌────────────── Linux/x86 6.17.9-gentoo Kernel Configuration ──────────────┐
  │  Arrow keys navigate the menu.  <Enter> selects submenus ---> (or empty  │   │  submenus ----).  Highlighted letters are hotkeys.  Pressing <Y>         │   │  includes, <N> excludes, <M> modularizes features.  Press <Esc><Esc> to  │   │  exit, <?> for Help, </> for Search.  Legend: [*] built-in  [ ] excluded │   │ ┌──────────────────────────────────────────────────────────────────────┐ │   │ │        General setup  --->                                           │ │   │ │    [*] 64-bit kernel                                                 │ │   │ │        Processor type and features  --->                             │ │   │ │    [ ] Mitigations for CPU vulnerabilities  ----                     │ │   │ │        Power management and ACPI options  --->                       │ │   │ │        Bus options (PCI etc.)  --->                                  │ │   │ │        Binary Emulations  --->                                       │ │   │ │    [*] Virtualization  --->                                          │ │   │ │        General architecture-dependent options  --->                  │ │   │ │    [*] Enable loadable module support  --->                          │ │   │ │    -*- Enable the block layer  --->                                  │ │   │ │        Executable file formats  --->                                 │ │   │ │        Memory Management options  --->                               │ │   │ │    -*- Networking support  --->                                      │ │   │ │        Device Drivers  --->                                          │ │   │ │        File systems  --->                                            │ │   │ │        Security options  --->                                        │ │   │ │    -*- Cryptographic API  --->                                       │ │   │ │        Library routines  --->                                        │ │   │ │        Kernel hacking  --->                                          │ │   │ │        Gentoo Linux  --->                                            │ │   │ │                                                                      │ │   │ │                                                                      │ │   │ └──────────────────────────────────────────────────────────────────────┘ │   ├──────────────────────────────────────────────────────────────────────────┤   │         <Select>    < Exit >    < Help >    < Save >    < Load >         │   └──────────────────────────────────────────────────────────────────────────┘ ```

**常用选项对照表**:

| 英文选项 | 中文说明 | 关键配置 |
| :--- | :--- | :--- |
| **General setup** | 通用设置 | 本机主机名、Systemd/OpenRC 支持 |
| **Processor type and features** | 处理器类型与特性 | CPU 型号选择、微码加载 |
| **Power management and ACPI options** | 电源管理与 ACPI | 笔记本电源管理、挂起/休眠 |
| **Bus options (PCI etc.)** | 总线选项 | PCI 支持 (lspci) |
| **Virtualization** | 虚拟化 | KVM, VirtualBox 宿主/客户机支持 |
| **Enable loadable module support** | 可加载模块支持 | 允许使用内核模块 (*.ko) |
| **Networking support** | 网络支持 | TCP/IP 协议栈、防火墙 (Netfilter) |
| **Device Drivers** | 设备驱动 | 显卡、网卡、声卡、USB、NVMe 驱动 |
| **File systems** | 文件系统 | ext4, btrfs, vfat, ntfs 支持 |
| **Security options** | 安全选项 | SELinux, AppArmor |
| **Gentoo Linux** | Gentoo 特有选项 | Portage 依赖项自动选择 (推荐) |

<div style="background: linear-gradient(135deg, rgba(34, 197, 94, 0.1), rgba(22, 163, 74, 0.05)); padding: 1.5rem; border-radius: 0.75rem; border-left: 4px solid rgb(34, 197, 94); margin: 1.5rem 0;">

**重要建议**

对于手动编译,建议将**关键驱动**(如文件系统、磁盘控制器、网卡)直接编译进内核(选择 `[*]` 或 `<*>` 即 `=y`),而不是作为模块(`<M>` 即 `=m`)。这样可以避免 initramfs 缺失模块导致无法启动的问题。

</div>

**必需激活的选项**(根据你的系统):

1. **处理器支持**:
   - `General setup → Gentoo Linux support`
   - `Processor type and features → Processor family` (选择你的 CPU)

2. **文件系统**:
   - `File systems → The Extended 4 (ext4) filesystem` (如果使用 ext4)
   - `File systems → Btrfs filesystem` (如果使用 Btrfs)

3. **设备驱动**:
   - `Device Drivers → Network device support` (网卡驱动)
   - `Device Drivers → Graphics support` (显卡驱动)

4. **Systemd 用户必需**:
   - `General setup → Control Group support`
   - `General setup → Namespaces support`

5. **Gentoo Linux 专有选项**(推荐全部激活):
     进入 `Gentoo Linux --->` 菜单:
     ```
   [*] Gentoo Linux support
       激活 Gentoo 特定的内核功能支持
     [*] Linux dynamic and persistent device naming (userspace devfs) support
       激活 udev 动态设备管理支持(必需)
     [*] Select options required by Portage features
       自动激活 Portage 需要的内核选项(强烈推荐)
       这会自动配置必需的文件系统和内核功能
     Support for init systems, system and service managers --->
       ├─ [*] OpenRC support  # 如果使用 OpenRC
       └─ [*] systemd support # 如果使用 systemd
     [*] Kernel Self Protection Project
       激活内核自我保护机制(提高安全性)
     [*] Print firmware information that the kernel attempts to load
       在启动时显示固件加载信息(便于调试)

新手提示

激活 “Select options required by Portage features” 可以自动配置大部分必需选项,非常推荐!

提示

在 menuconfig 中,按 / 可以搜索选项,按 ? 查看帮助。

16.5 自动激活推荐选项
#

Gentoo 提供了自动化脚本来激活常见硬件和功能:

cd /usr/src/linux

# 使用 Genkernel 的默认配置(包含大多数硬件支持)
genkernel --kernel-config=/usr/share/genkernel/arch/x86_64/kernel-config all

# 或者使用发行版默认配置作为基础
make defconfig  # 内核默认配置
# 然后再根据需要调整
make menuconfig

16.6 使用 LLVM/Clang 编译内核
#

使用 LLVM/Clang 编译内核可以获得更好的优化和更快的编译速度(支持 ThinLTO)。

方法 1:指定编译器(一次性):

cd /usr/src/linux

# 使用 Clang 编译
make LLVM=1 -j$(nproc)

# 使用 Clang + LTO(推荐)
make LLVM=1 LLVM_IAS=1 -j$(nproc)

方法 2:设置环境变量(永久): 在 /etc/portage/make.conf 中添加(仅影响内核编译):

# 使用 LLVM/Clang 编译内核
KERNEL_CC="clang"
KERNEL_LD="ld.lld"

激活内核 LTO 支持: 在 make menuconfig 中:

General setup
  → Compiler optimization level → Optimize for performance  # 选择 -O2(推荐)
  → Link Time Optimization (LTO) → Clang ThinLTO (NEW)      # 激活 ThinLTO(强烈推荐)

重要警告:内核编译时强烈不建议使用 Full LTO!

  • Full LTO 会导致编译极其缓慢(可能需要数小时)
  • 占用大量内存(可能需要 16GB+ RAM)
  • 容易导致链接错误
  • 请务必使用 ThinLTO,它更快、更稳定、内存占用更少

16.7 内核编译选项优化
#

高级编译优化(点击展开)

menuconfig 中激活

General setup
  → Compiler optimization level
     → [*] Optimize for performance (-O2)  # 或 -O3,但可能不稳定

  → Link Time Optimization (LTO)
     → [*] Clang ThinLTO                   # 需要 LLVM=1

Kernel hacking
  → Compile-time checks and compiler options
     → [*] Optimize harder

内核压缩方式(影响启动速度和体积):

General setup
  → Kernel compression mode
     → [*] ZSTD  # 推荐:压缩率高且解压快
     # 其他选项:LZ4(最快)、XZ(最小)、GZIP(兼容性最好)

16.8 编译和安装内核
#

手动编译

cd /usr/src/linux

# 编译内核和模块
make -j$(nproc)         # 使用所有 CPU 内核
make modules_install    # 安装模块到 /lib/modules/
make install            # 安装内核到 /boot/

# (可选)使用 LLVM/Clang + LTO
make LLVM=1 -j$(nproc)
make LLVM=1 modules_install
make LLVM=1 install

使用 Genkernel 自动化

# 基本用法
genkernel --install all

# 使用 LLVM/Clang
genkernel --kernel-cc=clang --utils-cc=clang --install all

# 激活 LTO(需要手动配置 .config)
genkernel --kernel-make-opts="LLVM=1" --install all

16.9 内核统计与分析
#

编译完成后,使用以下脚本查看内核统计信息:

cd /usr/src/linux

echo "=== 内核统计 ==="
echo "Built-in: $(grep -c '=y$' .config)"
echo "模块: $(grep -c '=m$' .config)"
echo "总配置: $(wc -l < .config)"
echo "内核大小: $(ls -lh arch/x86/boot/bzImage 2>/dev/null | awk '{print $5}')"
echo "压缩方式: $(grep '^CONFIG_KERNEL_' .config | grep '=y' | sed 's/CONFIG_KERNEL_//;s/=y//')"

示例输出

=== 内核统计 ===
Built-in: 1723
模块: 201
总配置: 6687
内核大小: 11M
压缩方式: ZSTD

解读

  • Built-in (1723):编译进内核本体的功能数量
  • 模块 (201):作为可加载模块的驱动数量
  • 内核大小 (11M):最终内核文件大小(使用 ZSTD 压缩后)

优化建议

  • 内核大小 < 15MB:优秀(精简配置)
  • 内核大小 15-30MB:良好(标准配置)
  • 内核大小 > 30MB:考虑禁用不需要的功能

16.10 常见问题排查
#

编译错误与解决方案(点击展开)

错误 1:缺少依赖

*** No rule to make target 'debian/canonical-certs.pem'

解决:禁用签名证书

scripts/config --disable SYSTEM_TRUSTED_KEYS
scripts/config --disable SYSTEM_REVOCATION_KEYS
make olddefconfig

错误 2:LTO 编译失败

ld.lld: error: undefined symbol

解决:某些模块不兼容 LTO,禁用 LTO 或将问题模块设为 =y(而非 =m

错误 3:clang 版本过旧

error: unknown argument: '-mretpoline-external-thunk'

解决:升级 LLVM/Clang 或使用 GCC 编译

16.11 内核配置最佳实践
#

  1. 保存配置

    # 保存当前配置到外部文件
    cp .config ~/kernel-config-backup
      # 恢复配置
    cp ~/kernel-config-backup /usr/src/linux/.config
    make olddefconfig
  2. 查看配置差异

    # 对比两个配置文件
    scripts/diffconfig .config ../old-kernel/.config
  3. 最小化配置(仅包含必需功能):

    make tinyconfig  # 创建极简配置
    make localmodconfig  # 然后添加当前硬件支持

17. 服务器与 RAID 配置 (可选)
#

可参考Gentoo Wiki: Mdadm

本节适用于需要配置软 RAID (mdadm) 的服务器用户。

17.1 内核配置 (手动编译必选)
#

如果你手动编译内核,必须激活以下选项(注意:必须编译进内核 <*>=y,不能是模块 <M>):

Device Drivers  --->
    <*> Multiple devices driver support (RAID and LVM)
        <*> RAID support
            [*] Autodetect RAID arrays during kernel boot

            # 根据你的 RAID 级别选择(必须选 Y):
            <*> Linear (append) mode                   # 线性模式
            <*> RAID-0 (striping) mode                 # RAID 0
            <*> RAID-1 (mirroring) mode                # RAID 1
            <*> RAID-10 (mirrored striping) mode       # RAID 10
            <*> RAID-4/RAID-5/RAID-6 mode              # RAID 5/6

17.2 配置 Dracut 加载 RAID 模块 (dist-kernel 必选)
#

如果你使用 dist-kernel(发行版内核)或者将 RAID 驱动编译为了模块,必须通过 Dracut 强制加载 RAID 驱动,否则无法开机。

Dracut RAID 配置指南(点击展开)

1. 激活 mdraid 支持 创建 /etc/dracut.conf.d/mdraid.conf

# Enable mdraid support for RAID arrays
add_dracutmodules+=" mdraid "
mdadmconf="yes"

2. 强制加载 RAID 驱动 创建 /etc/dracut.conf.d/raid-modules.conf

# Ensure RAID modules are included and loaded
add_drivers+=" raid1 raid0 raid10 raid456 "
force_drivers+=" raid1 "
# Install modprobe configuration
install_items+=" /usr/lib/modules-load.d/ /etc/modules-load.d/ "

3. 配置内核命令行参数 (UUID) 你需要找到 RAID 数组的 UUID 并添加到内核参数中。 创建 /etc/dracut.conf.d/mdraid-cmdline.conf

# Kernel command line parameters for RAID arrays
# 请替换为你实际的 RAID UUID (通过 mdadm --detail --scan 查看)
kernel_cmdline="rd.md.uuid=68b53b0a:c6bd2ca0:caed4380:1cd75aeb rd.md.uuid=c8f92d69:59d61271:e8ffa815:063390ed"

4. 重新生成 initramfs

dracut --force

提示

配置完成后,务必检查 /boot/initramfs-*.img 是否包含 RAID 模块:

> `lsinitrd /boot/initramfs-*.img | grep raid`

18. Secure Boot 配置 (可选)
#

什么是 Secure Boot?

Secure Boot(安全启动)是 UEFI 固件的一项安全功能,通过验证启动加载器和内核的数字签名,防止未经授权的代码在启动阶段运行。激活 Secure Boot 后,系统仅会加载经过信任的签名文件。

为何需要配置?

Gentoo 默认安装不支持 Secure Boot,若你的主板激活了 Secure Boot,系统将无法启动。本节介绍如何配置 Secure Boot。

18.1 使用 sbctl 自动化管理(推荐)
#

sbctl 是一个 Secure Boot 管理工具,能自动化处理密钥生成、签名和注册流程,相比手动使用 OpenSSL 配置更为简便。

步骤 1:安装 sbctl

emerge --ask app-crypt/sbctl

步骤 2:检查当前状态

sbctl status

预期输出(安装前):

Installed:	✘ Sbctl is not installed
Setup Mode:	✘ Enabled
Secure Boot:	✘ Disabled
如果 Setup Mode 显示为 Disabled(关闭)怎么办?

Setup Mode 是 UEFI 固件的一个特殊模式,允许修改 Secure Boot 密钥。如果显示为 Disabled,你需要:

方法 1:清除现有的 Secure Boot 密钥(推荐)

在 BIOS/UEFI 设置中找到以下选项(不同主板命名可能略有不同):

  • Clear Secure Boot Keys / 清除安全启动密钥
  • Reset to Setup Mode / 重置为设置模式
  • Delete All Keys / 删除所有密钥

清除后,Setup Mode 会自动切换为 Enabled

注意:必须清除密钥才能进入 Setup Mode!单纯关闭 Secure Boot(设为 Disabled)不会启用 Setup Mode,因为密钥仍然存在,固件不允许写入新密钥。

验证 Setup Mode

重启后再次检查:

sbctl status

确认 Setup Mode: ✘ Enabled 后,再继续下一步。

步骤 3:生成密钥(自动完成)

sbctl create-keys

输出:

Created Owner UUID a9fbbdb7-a05f-48d5-b63a-08c5df45ee70
Creating secure boot keys...✔
Secure boot keys created!

密钥自动生成到 /var/lib/sbctl/keys/,无需手动操作!

步骤 4:注册密钥到 UEFI 固件

sbctl enroll-keys -m
  • -m 参数表示保留 Microsoft 供应商密钥(推荐),这样可以启动 Windows 和其他已签名的 EFI 程序

输出:

Enrolling keys to EFI variables...
With vendor keys from microsoft...✔
Enrolled keys to the EFI variables!

警告

如果你的系统没有集成显卡(iGPU),不要使用 -m 参数,否则可能导致系统无法启动。这种情况下使用:

sbctl enroll-keys  # 不加 -m

步骤 5:配置 Portage 自动签名

编辑 /etc/portage/make.conf,添加 sbctl 的密钥路径:

# Secure Boot: 使用 sbctl 的密钥自动签名
USE="${USE} secureboot modules-sign"

MODULES_SIGN_KEY="/var/lib/sbctl/keys/db/db.key"
MODULES_SIGN_CERT="/var/lib/sbctl/keys/db/db.pem"
SECUREBOOT_SIGN_KEY="/var/lib/sbctl/keys/db/db.key"
SECUREBOOT_SIGN_CERT="/var/lib/sbctl/keys/db/db.pem"

步骤 6:重新编译内核

emerge --ask sys-kernel/gentoo-kernel-bin  # 或你使用的内核包

Portage 会自动使用 sbctl 的密钥签名内核和模块!

步骤 7:签名启动加载器

根据你使用的启动加载器,运行对应命令:

使用 GRUB
sbctl sign -s /efi/EFI/gentoo/grubx64.efi
使用 systemd-boot
sbctl sign -s /efi/EFI/systemd/systemd-bootx64.efi
使用 EFI Stub(直接启动)
sbctl sign -s /efi/EFI/BOOT/BOOTX64.EFI
使用 Unified Kernel Image (UKI)
sbctl sign -s /efi/EFI/Linux/gentoo-*.efi

步骤 8:验证签名状态

sbctl verify

预期输出(所有文档都应显示 ✔):

Verifying file database and EFI images in /efi...
✔ /efi/EFI/gentoo/grubx64.efi is signed
✔ /boot/vmlinuz is signed
✔ /efi/EFI/Linux/gentoo-6.x.x.efi is signed

步骤 9:激活 Secure Boot

  1. 重启进入 BIOS/UEFI 设置
  2. 找到 Secure Boot 选项
  3. 将其设置为 Enabled
  4. 保存并重启

步骤 10:确认 Secure Boot 已激活

启动后检查状态:

sbctl status

成功输出:

Installed:	✓ sbctl is installed
Owner GUID:	a9fbbdb7-a05f-48d5-b63a-08c5df45ee70
Setup Mode:	✓ Disabled
Secure Boot:	✓ Enabled
Vendor Keys:	microsoft

sbctl 的优势

  1. 自动化:一条命令生成所有密钥
  2. 简单:无需手动管理 PEM/DER 格式转换
  3. 智能:自动跟踪需要签名的文件(/var/lib/sbctl/files.json
  4. 安全:密钥默认权限为 600,自动保护
  5. 可验证:随时用 sbctl verify 检查签名状态

如果你希望用更少的步骤完成配置,通常可以优先考虑使用 sbctl;如需完全掌控证书与签名流程,则使用本节的手动 OpenSSL 方式。


18.2 进阶:手动 OpenSSL 方式(可选)
#

展开查看手动配置方法(适合进阶用户/企业环境)

适用场景

  • 需要自定义证书参数(如有效期、密钥长度)
  • 企业环境需要使用现有 PKI 基础设施
  • 对密钥管理有特殊安全要求
  • 学习 Secure Boot 底层原理

如果你已使用 sbctl 完成配置,可以跳过本节。

18.2.1 生成自签名证书
#

步骤 1:安装必要工具

emerge --ask app-crypt/sbsigntools sys-apps/kmod[openssl]

步骤 2:生成证书

创建密钥目录:

mkdir -p /etc/kernel/certs
cd /etc/kernel/certs

生成 RSA 私钥和证书:

# 生成私钥 (2048 位 RSA)
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.key -out MOK.crt \
  -days 36500 -nodes -subj "/CN=My Kernel Signing Key/"

# 转换为 DER 格式 (内核需要)
openssl x509 -in MOK.crt -outform DER -out MOK.der

# 设置安全权限
chmod 600 MOK.key

重要提示

  • 密钥安全MOK.key 是私钥,必须妥善保管(建议备份到脱机存储)
  • 证书有效期:此处设置为 36500 天(约 100 年),可根据需要调整
  • CN 名称:可自定义为任意描述性名称

18.2.2 配置内核模块签名
#

步骤 1:激活内核模块签名支持

编辑 /etc/portage/package.use/kernel,为 dist-kernel 添加 modules-sign USE 标志:

# /etc/portage/package.use/kernel
virtual/dist-kernel modules-sign
sys-kernel/installkernel dracut

步骤 2:配置签名参数

编辑 /etc/portage/make.conf,添加以下内容:

# Secure Boot: 内核模块签名配置
MODULES_SIGN_KEY="/etc/kernel/certs/MOK.key"
MODULES_SIGN_CERT="/etc/kernel/certs/MOK.der"
MODULES_SIGN_HASH="sha512"

步骤 3:重新编译内核

重新安装内核,使签名生效:

emerge --ask @module-rebuild
emerge --ask sys-kernel/gentoo-kernel-bin  # 或你使用的内核包

编译完成后,验证模块签名:

modinfo /lib/modules/$(uname -r)/kernel/drivers/gpu/drm/amdgpu/amdgpu.ko | grep sig

预期输出应包含:

sig_id:         PKCS#7
signer:         My Kernel Signing Key
sig_key:        XX:XX:XX:XX:...
sig_hashalgo:   sha512

18.2.3 配置内核映像签名(Unified Kernel Image)
#

Unified Kernel Image (UKI)

将内核、initramfs、命令行参数打包为单一 EFI 可执行文件,并进行整体签名。这是 Secure Boot 的推荐方式。

步骤 1:激活 secureboot USE 标志

编辑 /etc/portage/package.use/kernel

# /etc/portage/package.use/kernel
virtual/dist-kernel modules-sign secureboot
sys-kernel/installkernel dracut uki

步骤 2:配置签名参数

编辑 /etc/portage/make.conf,添加内核映像签名配置:

# Secure Boot: 内核映像签名配置
SECUREBOOT_SIGN_KEY="/etc/kernel/certs/MOK.key"
SECUREBOOT_SIGN_CERT="/etc/kernel/certs/MOK.crt"

步骤 3:配置 installkernel

创建 /etc/kernel/install.conf

# /etc/kernel/install.conf
layout=uki
uki_generator=dracut
initrd_generator=dracut

步骤 4:重新生成内核

emerge --ask sys-kernel/gentoo-kernel-bin  # 或你使用的内核包

生成的 UKI 文件位于:

/efi/EFI/Linux/gentoo-6.x.x.efi

18.2.4 注册 MOK (Machine Owner Key)
#

MOK 管理

由于 Gentoo 使用自签名证书,你需要将证书注册到 UEFI 固件的 MOK(Machine Owner Key)列表中,以便 Secure Boot 信任你的签名。

步骤 1:安装 Shim

emerge --ask sys-boot/shim

步骤 2:拷贝 Shim 到 EFI 分区

cp /usr/share/shim/shimx64.efi /efi/EFI/gentoo/
cp /usr/share/shim/mmx64.efi /efi/EFI/gentoo/

步骤 3:导入 MOK 证书

使用 mokutil 导入证书(需要在启动后的 MOK Manager 中确认):

mokutil --import /etc/kernel/certs/MOK.der

设置一个临时密码(重启后在 MOK Manager 中输入):

input password:
input password again:

步骤 4:配置启动项

使用 efibootmgr 创建启动项(指向 Shim):

efibootmgr --create --disk /dev/nvme0n1 --part 1 \
  --label "Gentoo Secure Boot" \
  --loader '\EFI\gentoo\shimx64.efi'

步骤 5:重启并注册 MOK

  1. 重启系统
  2. 进入 MOK Manager(蓝色界面)
  3. 选择 Enroll MOKContinueYes
  4. 输入之前设置的临时密码
  5. 选择 Reboot

18.2.5 验证 Secure Boot 状态
#

重启后,检查 Secure Boot 是否正常工作:

# 检查 Secure Boot 状态
bootctl status | grep "Secure Boot"

# 预期输出:
# Secure Boot: enabled (user)

查看已加载的密钥:

mokutil --list-enrolled

18.2.6 常见问题排查
#

问题 1:系统无法启动,显示 "Verification failed: (0x1A) Security Violation"

原因:内核或启动加载器未正确签名。

解决方法

  1. 在 BIOS 中临时关闭 Secure Boot
  2. 进入系统后,重新运行签名步骤(18.2.2 和 18.2.3)
  3. 确认 /efi/EFI/Linux/*.efi 文件存在
  4. 重启并重新注册 MOK(步骤 18.2.4)
问题 2:模块加载失败,dmesg 显示 "module verification failed: signature and/or required key missing"

原因:内核模块未签名或签名不匹配。

解决方法

# 重新编译并签名所有模块
emerge --ask @module-rebuild
emerge --ask sys-kernel/gentoo-kernel-bin
问题 3:如何临时禁用 Secure Boot?

方法 1(推荐):在 BIOS/UEFI 设置中关闭 Secure Boot

方法 2:删除已注册的 MOK 证书

mokutil --reset
# 重启后在 MOK Manager 中确认删除

Secure Boot 配置总结

推荐方式:

  • 新手用户:使用 sbctl(18.1 节)—— 简单快速,几条命令完成
  • 进阶用户:使用手动 OpenSSL 方式(18.2 节)—— 完全自定义控制

完成后,系统将拥有与商业发行版同等的安全启动保护。


参考数据
#

社区支持
#

Gentoo 中文社区

官方社区

结语
#

祝你在 Gentoo 上享受自由与灵活!
#

这份指南基于官方 Handbook:AMD64 并简化流程,标记了可选步骤,让更多人能轻松尝试。

相关文章

Gentoo Linux 安装指南 (基础篇)

·14579 字·30 分钟
Gentoo Linux 基础系统安装教程,涵盖分区、Stage3、内核编译、引导程序配置等。也突出有 LUKS 全盘加密教学。

网站从 Jekyll 迁移至 Hugo

·1202 字·3 分钟
经过多年使用 Jekyll 作为静态站点生成器,Gentoo 中文社区网站现已成功迁移至 Hugo。本文介绍此次迁移的背景、原因和主要改进。