Files
wiki/Gentooisms.md

191 lines
8.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Hall of Gentooisms
description: Anything related to wrangling Gentoo, solving errors in Gentoo, making Gentoo faster thus creating errors in Gentoo, goes here. Gentoo.
published: true
date: 2022-04-30T20:10:34.075Z
tags: gentoo
editor: markdown
dateCreated: 2021-08-21T18:00:45.725Z
---
# Basics
Everybody starts somewhere.
Here are the *absolute* essentials when it comes to Gentoo-wrangling.
## The `make.conf`
Gentoo's key settings are set under the `/etc/portage/make.conf` file - which is likely the first you modify. Some important sections are:
- `USE=` - Global USE flags for the system (see below).
- `CFLAGS` - these are the options to pass to the compiler. Unless you like suffering, these should be `-O2 -pipe -march=native`.
- `MAKEOPTS` are things to pass to the `make` command - pass `-j$(nproc)` to give compiling you entire system's **oopmh**.
> You can also override to less oomph, or start with some oomph and give specific package all oomph via Portage - see environment section below.
{.is-info}
- `ACCEPT_KEYWORDS` - Your branch (see below).
- `CMAKE_MAKEFILE_GENERATOR` - what program to use for make. Default is `emake`, but you should probably use `ninja` for faster builds.
- `CPU_FLAGS_X86` - just run `cpuid2cpuflags | sed -e 's/CPU_FLAGS_X86://g'` and put it there. Do not question it.
> You'll likely need to install that command using `emerge cpuid2cpuflags`.
{.is-info}
> See my (hopefully current) `make.conf` [here](https://git.pukeko.xyz/shmick/portage/src/branch/master/make.conf).
{.is-info}
## The Portage
It is big, it is gnarly, and I'm going to pretend not to see it is also Python. What should you know about Portage, the legendary Gentoo package manager?
Since it's inspired by BSD's ```ports```, each package's full name is a category followed by an actual pacakge name (ex: ```sys-devel/llvm```).
Under Portage's configuration directory ```/etc/portage```, there's a bunch of things you can mess with:
* Each package's keywords (like switching it around between branches)
* Each package's USE flags (things to add or remove from it, see [here](https://www.gentoo.org/support/use-flags/), and search specific package's USE flags [here](https://packages.gentoo.org/))
* Compiler environments and pointing packages to them
Generally, the structure is ```/etc/portage/package.something/```, under which you put the base name of your package:
```bash
/etc/portage/package.accept_keywords/gentoo-sources:
sys-kernel/gentoo-sources -amd64 ~amd64
# ^ Package name ^ Keywords
```
And inside the file, you specify the full package name followed by whatever it is you're setting:
When it comes to more general things like environments, you create a file under ```/etc/portage/env``` and name it whatever, like the GCC override for my Clang system:
```bash
/etc/portage/env/compiler-gcc-lto:
CC="gcc"
CXX="g++"
CFLAGS="-flto=16 -march=native -O2 -pipe"
CXXFLAGS="${CFLAGS}"
LDFLAGS="-O2 -Wl,--as-needed"
AR="gcc-ar"
NM="gcc-nm"
RANLIB="gcc-ranlib"
```
and tell package to to use it by writing down their full name followed by the config in ```/etc/portage/package.env```:
```bash
/etc/portage/package.env:
sys-libs/glibc compiler-gcc-lto
# ^ Package name #^ Config under /etc/portage/env
```
> You can see my current ```/etc/portage``` in the [git repository](https://git.pukeko.xyz/shmick/portage), and a bunch of other useful things in the [Gentoo Wiki](https://wiki.gentoo.org/wiki/Portage) page about Portage.
{.is-info}
## The Branches
Gentoo has two branches of relevance to me - the ```arch``` and the ```~arch```, which are the stable and testing branches, respectively.
> instead of ```arch```, you put in your processor architecture! ```amd64``` gang! {.is-info}
> It is really, REALLY friggin' hard to change branches as I've smugly predicted I could. Choose your branch carefully!
{.is-warning}
For perspective, ```arch``` is about on par to what you'll see in Ubuntu LTS, while ```~arch``` is what you'd see on... Arch!
> ```~arch``` is really funny to me. Like,
Q: Hey! what processor are you?!
A: Um, AMD64, kinda?
Nice.
{.is-success}
### Setting the branches
Like many Gentoo things, you set your branches in ```/etc/portage/make.conf```. Setting the branch to Testing would be like so:
```ACCEPT_KEYWORDS="~amd64"```
Hilarious!
## The Kernel
> In Gentoo, something-sources is the kernel. We are too artsy-fartsy for just ```linux``` (Arch!)
{.is-info}
### Picking a kernel
There are three kernel types that may be of any interest to me (with my opinion, which is useless and irrelevant):
- The latest and greatest ```gentoo-sources``` (you have been bad and must be punished)
- The Long Term Support release of ```gentoo-sources``` (you are a reasonable person)
- The plain-ol' ```vanilla-sources``` (you are a purist, a snob and a scoundrel)
Under ```arch```, you get the LTS, since you're a reasonable person.
Under ```~arch```, you get the latest and greatest, because you hate it when things are working.
> This is not true; ```~arch``` it working great, but how can you flex otherwise?
{.is-warning}
```vanilla-sources``` acts the same, but with the upstream kernel instead. Gentoo does very little patching, making this a prime example of nitpicking.
To use an LTS kernel on a Testing system,
(smort!) you can change the keywords for the something-sources you're using like so:
```bash
sys-kernel/gentoo-sources -~amd64 amd64
# ^ NO testing
```
And to use the latest kernel on a stable system (why?) you'd do like so:
```bash
sys-kernel/gentoo-sources -amd64 ~amd64
# ^ NO stable
```
You get the gist.
### Setting the kernel
> While easy to forget, not setting the kernel often leads to booting and `initramfs` genenration errors. Follow attentively!
{.is-warning}
After ```emerge```-ing whatever kernel you use, run ```eselect kernel list```, which will show something like this:
```zsh
takahe :: ~ takahe-root* # eselect kernel list
Available kernel symlink targets:
[1] linux-5.13.12
[2] linux-5.13.12-gentoo *
```
select the kernel you desire by running `eselect kernel set` followed by the number of said kernel.
Behind the scene, this symlinks the downloaded kernel archive to `/usr/src/linux`.
### Configuring the kernel
Whatever it is you do, do it in `/usr/src/linux`.
Make sure it is symlinked by running `ls -l /usr/src/linux` - it should show where the real path is.
#### option 1: I have time and like wasting compile power
```genkernel all``` and follow whatever it yells at you. See [here](https://wiki.gentoo.org/wiki/Handbook:AMD64/Installation/Kernel#Alternative:_Using_genkernel).
#### option 2: Use whatever's running already
run `zcat /proc/config.gz > .config` - Gentoos (and every other distribution I've seen) expose their kernel configs this way, but this is not universal.
You can double check this method by running `make menuconfig` and checking your option (or just reading the `.config`, you chad).
#### option 3: Use my AWESOME kernel configs (if you have my system, lol)
You can also clone the kernel config from this [Git repository](https://git.pukeko.xyz/shmick/kernel-confs) - obviously adapted to *my* system.
> Note: Compiling with Clang is a bit messier - see Clang page.
{.is-info}
### Compiling and installing
To start compiling, run
`
make -j$(nproc) && make modules_install && make install
`
which will output some very cool text flying on the terminal which you could fail to impress people with.
Once the compilation is finished, you should see three files under `/boot`:
- a `vmlinuz` whatever - this is the actual kernel
- an `initramfs` whatever - this is the inital RAM filesystem image
- a `System.map` whatever - I have no idea what this is.
Example proper output:
```zsh
ls /boot:
initramfs-5.13.12-gentoo-x86_64.img
System.map-5.13.12-gentoo-x86_64
vmlinuz-5.13.12-gentoo-x86_64
```
Vanilla kernels will not have the `gentoo-x86_64` bit.
> Some systems *can* boot without an `initramfs` - I have yet to achieve this level of awesomeness
{.is-info}
For some reason, *my* system usually fails to copy these files over. After compiling, you can copy them manually to the boot directory:
```zsh
cp arch/x86_64/boot/bzImage /boot/vmlinuz-5.13.12-gentoo-x86_64
#^ This is the kernel
cp System.map /boot/System.map-5.13.12-gentoo-x86_64
```
if the `initramfs` is missing, you can generate it with `genkernel` or with `dracut` - see [here](https://wiki.gentoo.org/wiki/Initramfs/Guide#Creating_an_initramfs).