简介
前面用简单的方法,无脑安装了一个简单的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
一些包有savedconfig
use,用于保存包的配置
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系统中作解释。