本页目录

Gentoo 包管理操作手册

Portage 是 Gentoo 的包管理系统。核心概念: ebuild (构建脚本), emerge (CLI), USE flags (编译时特性开关), world set (用户明确安装的包), @system (基础系统集)。

状态查看

# 已安装的包
equery list '*'                          # 所有已安装包 (app-editors/neovim-0.10.0)
equery list -i                           # 同上
eix -I                                   # 已安装 (eix 比 equery 快很多)
eix -I --format '<category>/<name>-<installedversions:INSTALLEDVERSION>\n'  # 紧凑格式
qlist -IRv                               # portage-utils 版本 (更快)

# 包信息
equery uses neovim                       # 查看包的 USE flags 及其当前状态
equery depends neovim                    # 哪些包依赖 neovim
equery depends --indirect neovim         # 递归反向依赖 (含间接)
equery files neovim                      # 包安装了哪些文件
equery size neovim                       # 包占多少磁盘
eix neovim                               # 包概要 (版本/描述/USE/overlay)

# 查看可更新
emerge --sync && emerge -puDN @world     # -p=pretend, -u=update, -D=deep, -N=new-use
emerge -puDN @world --verbose-conflicts  # 含冲突详情

# USE flags
emerge --info | grep USE                  # 全局 USE 设置
portageq envvar USE                       # 当前生效的全局 USE
euse -a                                   # 所有 USE flags 状态 (+启用/-禁用)
euse -i gtk                               # 查看 gtk flag 的描述

# world set
cat /var/lib/portage/world               # 用户手动安装的包列表
emerge --depclean -p                      # 预览可清理的孤立依赖

# 依赖分析
emerge -p --depclean                      # 哪些包是孤立的
revdep-rebuild -p                         # 预览损坏的动态链接依赖

安装与卸载

# 安装
emerge -av app-editors/neovim             # -a=ask (确认), -v=verbose
emerge -av --autounmask-write neovim      # 自动写 USE/keyword 变更 (需随后 dispatch-conf)
emerge -1av neovim                        # -1=oneshot (不加入 world set)

# 卸载
emerge -aC app-editors/neovim             # --unmerge, 从 world set 移除
emerge -a --depclean app-editors/neovim   # 连同孤立依赖一起清

# 更新
emerge -avuDN @world                       # 更新所有 (常用)
emerge -avuDN @world --with-bdeps=y       # 含 build-time 依赖
emerge -avuDN @world --exclude "sys-kernel/*" # 排除某些包
emerge -avuDN @world --keep-going          # 遇错继续 (最后汇总失败列表)

# 从 overlay 安装
emerge -av app-editors/neovim::guru       # 指定 overlay

# 仅下载不安装
emerge -avf neovim                         # -f=fetchonly

USE Flags 管理

# 临时启用/禁用 (单次 emerge)
USE="gtk -qt5" emerge -av app-editors/neovim

# 包级 USE (永久)
# 编辑 /etc/portage/package.use/<name> 或 /etc/portage/package.use
echo "app-editors/neovim gtk -qt5" >> /etc/portage/package.use/neovim

# 全局 USE (永久)
# 编辑 /etc/portage/make.conf:
# USE="gtk -qt5"

# 查看某个 USE flag 影响哪些包
equery hasuse gtk
eix --installed-with-use gtk

# USE flag 变更后重编译受影响的包
emerge -av --changed-use @world
emerge -av --newuse @world                # 同上 (-N)

Keyword 与 Mask

# 接受 ~amd64 (testing) 的特定包
echo "app-editors/neovim ~amd64" >> /etc/portage/package.accept_keywords/neovim
# 接受特定版本
echo "=app-editors/neovim-0.10.0 ~amd64" >> /etc/portage/package.accept_keywords/neovim
# 接受 ** (所有 keyword, 包括 live ebuild)
echo "app-editors/neovim **" >> /etc/portage/package.accept_keywords/neovim

# Mask (阻止安装/升级)
echo ">=app-editors/neovim-0.11.0" >> /etc/portage/package.mask/neovim
# Unmask (解除全局 mask)
echo "app-editors/neovim" >> /etc/portage/package.unmask/neovim

配置更新 (dispatch-conf)

# emerge 后如有 CONFIGURATION FILES update 提示:
dispatch-conf                            # 交互式合并 ._cfg 文件
# 快捷键: u=use-new, z=zap-new(丢弃新配置), m=merge-interactive, q=quit

# 查看待处理的配置
find /etc -name '._cfg*'                  # 列出所有待合并的配置文件

# 自动化 (非交互)
etc-update                                # 另一种配置合并工具

故障排查与维护

# 同步
emerge --sync                             # 更新 ebuild 树
emaint sync -a                            # 同步所有 repo (含 overlay)
eix-sync                                  # emerge --sync + update eix cache

# 修复损坏的依赖
revdep-rebuild                            # 扫描并重编译 broken linkage (soname 变更后)
revdep-rebuild -p -- --exclude gcc        # 预览, 排除某些包

# 重建 @world (大版本升级后)
emerge -e @world                          # -e=emptytree, 完全重编译所有包

# Python 目标升级后
emerge -av1 --changed-deps @world         # 依赖变化了才重编译

# 清理
emerge --depclean -a                      # 清除孤立依赖
eclean-dist -d                            # 清除 distfiles (下载的源码包)
eclean-pkg -d                             # 清除二进制包
eclean-kernel -n 2                        # 保留最近 2 个内核, 清理旧的

# 查看编译日志
less /var/log/emerge.log                  # emerge 历史
less /var/tmp/portage/*/temp/build.log    # 失败的构建日志

# 检查系统一致性
emerge -avuDN @world --verbose-conflicts   # 更新前先检查冲突
emerge @preserved-rebuild                 # 重编译 preserved-libs 消费者

# 检查 overlay 问题
emerge --info | grep overlay
# 如果 guru 等 overlay 导致冲突, 临时禁用:
# emerge -avuDN @world --exclude="*::guru"

Overlay 管理

# 列出已启用的 overlay
emerge --info | grep -A 20 "Repositories"
layman -l                                # 如果用了 layman

# 添加 overlay (eselect-repository)
eselect repository list                  # 列出可用 overlay
eselect repository enable guru           # 启用 guru overlay
eselect repository disable guru          # 禁用

# 同步 overlay
emaint sync -r guru                      # 只同步 guru

Profile 与编译器

# Profile 切换
eselect profile list                     # 列出可用 profile
eselect profile set default/linux/amd64/23.0/desktop

# GCC 版本切换
gcc-config -l                            # 列出已安装 GCC
gcc-config x86_64-pc-linux-gnu-13.2.0    # 切换
source /etc/profile                      # 刷新环境

# Python 版本
eselect python list
eselect python set python3.12

# 查看编译环境
emerge --info                            # 完整 Portage 环境 (CHOST/CFLAGS/USE/...)

速查: make.conf 关键配置

# /etc/portage/make.conf 关键项:
# MAKEOPTS="-j16"                # 并行编译数 (≈CPU 核心数)
# EMERGE_DEFAULT_OPTS="--jobs=4 --load-average=16"  # 并行 emerge 任务
# ACCEPT_LICENSE="*"             # 接受所有许可证 (生产环境慎用)
# L10N="en-US zh-CN"             # 本地化
# VIDEO_CARDS="amdgpu radeonsi"  # 显卡驱动
# INPUT_DEVICES="libinput"       # 输入设备
# CPU_FLAGS_X86="aes avx avx2 ..."  # 编译器优化 (cpuid2cpuflags)