191 lines
8.4 KiB
Markdown
191 lines
8.4 KiB
Markdown
---
|
||
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). |