Emerge your world the lean way

简介

前面用简单的方法,无脑安装了一个简单的Gentoo Linux,以后的文章都是在于如何在Gentoo上配置,使用以及优化Linux系统。

稍不注意,Gentoo的portage配置将会变得一塌糊涂,需要将/etc/portage这个目录下面的文件变得有条理。同时,将合适的优化选项添加进去。

这些配置,包括家目录里面的配置,我一并放在了dotfile仓库中。

make.conf

这是全局的配置,是最重要的一个文件。

C/C++

全局默认使用这些优化就够了,单独的优化,单独配置。

COMMON_FLAGS="-march=native -O2 -pipe"

CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
LDFLAGS="-Wl,-O2 -Wl,--as-needed -Wl,--hash-style=gnu -Wl,--sort-common -Wl,--strip-all"

Rust

配置rust的编译优化等级。

RUSTFLAGS="-C debuginfo=0 -C opt-level=3 -C target-cpu=native"

Dlang

DMDFLAGS="-O"

Lua

Lua的目标指定为Jit

LUA_SINGLE_TARGET="luajit"

portage dir

需要配置一定大小的tmpfs,挂载到/var/tmp/portage。详见Portage TMPDIR on tmpfs,推荐大小12G。

PORTDIR="/var/db/repos/gentoo"
DISTDIR="/var/cache/distfiles"
PKGDIR="/var/cache/binpkgs"
PORTAGE_TMPDIR="/var/tmp"

Feature

设置一些portage的特性

FEATURES="parallel-fetch -test"
AUTO_CLEAN="yes"

Aria2

使用Aria2拉取distfile

FETCHCOMMAND="/usr/bin/aria2c -d \${DISTDIR} -o \${FILE} --allow-overwrite=true --max-tries=32 --max-file-not-found=2 --max-concurrent-downloads=5 --connect-timeout=60  --timeout=600 --split=16 --min-split-size=2M --lowest-speed-limit=1K --max-connection-per-server=16 --uri-selector=feedback \${URI}"
RESUMECOMMAND="${FETCHCOMMAND}

Accept

可接受的关键字全局设置为amd64

可接受的许可设置为全部

ACCEPT_KEYWORDS="amd64"
ACCEPT_LICENSE="*"

Emerge Default Option

通常会在使用emerge时添加更多的参数,但这些默认,适用于大多数情况

EMERGE_DEFAULT_OPTS="--keep-going --with-bdeps=y -a -v --backtrack=100"
PORTAGE_NICENESS=3
PORTAGE_IONICE_COMMAND="ionice -c 3 -p \${PID}"

Platform

一些平台相关的参数,尽量不要再去更改了。

LLVM_TARGETS="X86"
CHOST="x86_64-pc-linux-gnu"
CPU_FLAGS_X86="aes avx avx2 f16c fma3 mmx mmxext pclmul popcnt rdrand sse sse2 sse3 sse4_1 sse4_2 ssse3"
GRUB_PLATFORMS="efi-64"

USE Flags

下面这些部分通常以USE Flags的形式使用,可以根据实际情况来确定。

# Hardware
VIDEO_CARDS="intel i965 iris nvidia"
ALSA_CARDS="hda_intel"
INPUT_DEVICES="libinput"

# L10N
L10N="en-US en"

# KVM
QEMU_SOFTMMU_TARGETS="x86_64"
QEMU_USER_TARGETS="x86_64"

# USE
HW="-bluetooth -joystick -smartcard"
NET="-idn -networkmanager -ipv6"
DEV="-gpm -seccomp savedconfig jemalloc threads lto"
DE="-postscript"
NOG="-vala -introspection"
NODOC="-handbook -man -doc"
Audio="pulseaudio"
Video="vulkan vdpau vaapi"
LANG="cjk -spell -nls"
USE="${HW} ${NET} ${DEV} ${DE} ${NOG} ${NODOC} ${Audio} ${Video} ${LANG}"

如何确定所需要的USE flags呢?

从一开始默认的设置开始,根据使用情况逐步增减use。

Profile

make.profile

/etc/portage/make.profile -> ../../var/db/repos/gentoo/profiles/default/linux/amd64/17.1/desktop/plasma/systemd/

这是个链接,指向Maintree的一个profile,由eselect profile管理,我们可以列出所有的profile。

> sudo eselect profile list
Available profile symlink targets:
  [1]   default/linux/amd64/17.1 (stable)
  [2]   default/linux/amd64/17.1/selinux (stable)
  [3]   default/linux/amd64/17.1/hardened (stable)
  [4]   default/linux/amd64/17.1/hardened/selinux (stable)
  [5]   default/linux/amd64/17.1/desktop (stable)
  [6]   default/linux/amd64/17.1/desktop/gnome (stable)
  [7]   default/linux/amd64/17.1/desktop/gnome/systemd (stable)
  [8]   default/linux/amd64/17.1/desktop/plasma (stable)
  [9]   default/linux/amd64/17.1/desktop/plasma/systemd (stable) *
  [10]  default/linux/amd64/17.1/desktop/systemd (stable)
  [11]  default/linux/amd64/17.1/developer (exp)
  [12]  default/linux/amd64/17.1/no-multilib (stable)
  [13]  default/linux/amd64/17.1/no-multilib/hardened (stable)
  [14]  default/linux/amd64/17.1/no-multilib/hardened/selinux (stable)
  [15]  default/linux/amd64/17.1/no-multilib/systemd (dev)
  [16]  default/linux/amd64/17.1/no-multilib/systemd/selinux (exp)
  [17]  default/linux/amd64/17.1/systemd (stable)
  [18]  default/linux/amd64/17.1/systemd/selinux (exp)
  [19]  default/linux/amd64/17.1/clang (exp)
  [20]  default/linux/amd64/17.0 (dev)
  [21]  default/linux/amd64/17.0/selinux (dev)
  [22]  default/linux/amd64/17.0/hardened (dev)
  [23]  default/linux/amd64/17.0/hardened/selinux (dev)
  [24]  default/linux/amd64/17.0/desktop (dev)
  [25]  default/linux/amd64/17.0/desktop/gnome (dev)
  [26]  default/linux/amd64/17.0/desktop/gnome/systemd (dev)
  [27]  default/linux/amd64/17.0/desktop/plasma (dev)
  [28]  default/linux/amd64/17.0/desktop/plasma/systemd (dev)
  [29]  default/linux/amd64/17.0/developer (exp)
  [30]  default/linux/amd64/17.0/no-multilib (dev)
  [31]  default/linux/amd64/17.0/no-multilib/hardened (dev)
  [32]  default/linux/amd64/17.0/no-multilib/hardened/selinux (dev)
  [33]  default/linux/amd64/17.0/systemd (dev)
  [34]  default/linux/amd64/17.0/x32 (dev)
  [35]  default/linux/amd64/17.0/musl (exp)
  [36]  default/linux/amd64/17.0/musl/clang (exp)
  [37]  default/linux/amd64/17.0/musl/hardened (exp)
  [38]  default/linux/amd64/17.0/musl/hardened/selinux (exp)

这通常是一组预设的USE和对部分包的MASK,越接近你的实际需求,我们所需要做的改动就越少。例如,我现在就是运行的Nomultilib的kde systemd desktop,这样我选择default/linux/amd64/17.1/desktop/plasma/systemd (stable)这个profile就会更加合适。

profile/

这是一个目录,对Maintree的更改记录在这个里。

.
├── package.use.force
│   ├── sys-apps
│   ├── sys-devel
│   └── sys-libs
└── package.use.mask
    └── dev-java

2 directories, 4 files

这里我开启了jvm的system-vm的mask和,关闭了一些包的32位支持。

此外你也会看到这里面的结构是以类别进行区分的,这在其他目录下面也是一样的。

package.mask

这里用于mask掉包。

package.use

这里用于定义包的use flags。

package.accept_keywords

默认的keywords是amd64,部分包在测试时会设置为~amd64,甚至开发阶段会打包但是不设置keywords,所以需要修改部分包的可接受关键字,才能安装。

env 和 package.env

env中定义了一些环境变量组,用于覆盖/etc/portage/make.conf

├── chromium
├── clang
├── debug
├── devirtlto
├── fast
├── genjdkpgo
├── graphite
├── iptpta
├── jemalloc
├── lto
├── nofast
├── nohardened
├── noplt
├── O3
├── seminterpos
├── thinlto
├── usejdkpgo
└── valgrind

chromium 和 jdk 的 环境变量单独定义了出来,其他都是通用的。

在package.env中定义包的env,例如:

cat ../package.env/dev-lang
dev-lang/dmd
dev-lang/go
dev-lang/nasm                           O3 graphite noplt seminterpos iptpta fast lto devirtlto
dev-lang/orc                            O3 graphite noplt seminterpos iptpta fast lto devirtlto
dev-lang/perl                           O3 graphite noplt seminterpos iptpta fast lto devirtlto
dev-lang/python                         O3 graphite noplt seminterpos iptpta      lto devirtlto
dev-lang/python-exec
dev-lang/python-exec-conf
dev-lang/rust                           O3          noplt seminterpos        fast lto           clang
dev-lang/sassc                          O3 graphite noplt seminterpos iptpta fast lto devirtlto
dev-lang/scala              
dev-lang/spidermonkey                   O3          noplt seminterpos        fast lto           clang
dev-lang/swig               
dev-lang/tcl                            O3 graphite noplt seminterpos iptpta fast lto devirtlto
dev-lang/yasm                           O3 graphite noplt seminterpos iptpta fast lto devirtlto

patches 和 savedconfig

patches

按照<category>/<PN>组织,其中放置patch,例如:

patches
├── sys-kernel
│   ├── gentoo-kernel
│   │   └── disabledebug.patch
│   └── xanmod-kernel
│       └── disabledebug.patch
├── www-client
│   └── chromium
│       ├── chromium-gcc11.patch
│       ├── chromium-VirtualCursor-standard-layout.patch
│       └── libdav1d.patch
└── x11-wm
    └── dwm
        ├── 10-activetagindicatorbar.patch
        ├── 15-alpha.patch
        ├── 20-alpha-systray.patch
        └── 90-centeredwindowname.patch

savedconfig

一些包有savedconfiguse,用于保存包的配置

savedconfig
├── sys-firmware
│   └── ipxe-1.21.1
├── sys-kernel
│   ├── linux-firmware-20220411
│   ├── xanmod.config
│   ├── xanmod.config.clang
│   ├── xanmod.config.def
│   ├── xanmod.config.def.gcc
│   ├── xanmod.config.max
│   ├── xanmod-kernel-5.15.32
│   ├── xanmod-kernel-5.15.34
│   ├── xanmod-kernel.mini
│   └── xanmod-kernel.old
├── x11-misc
│   └── slock-1.4-r1
└── x11-wm
    └── dwm-6.2

bashrc

portage的运行时配置,这个用处在优化你的Gentoo系统中作解释。

知识共享许可协议
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
上一篇
下一篇