Run these on the target machine before starting. Save the output files in this directory.
lspci -vnn > hw-lspci.txt
lsusb -v > hw-lsusb.txt
cat /proc/cpuinfo > hw-cpu.txt
lsmod > hw-modules.txt
lsblk -f > hw-disks.txt
ip link show > hw-net.txt
rfkill list > hw-rfkill.txt
dmidecode -t memory > hw-ram.txt # sudo
dmidecode -t bios > hw-bios.txt # sudo
The lspci -vnn output is the most important. Every line maps to a kernel driver and potentially a USE flag. The [XXXX:XXXX] vendor:device IDs let you look up exact driver requirements.
Profiles set hundreds of default USE flags. Pick before writing make.conf since global USE flags layer on top.
Available profiles (amd64): https://wiki.gentoo.org/wiki/Profile_(Portage)
| Profile | When to use |
|---|---|
default/linux/amd64/23.0 |
Minimal base, build everything yourself |
default/linux/amd64/23.0/desktop |
Generic desktop defaults |
default/linux/amd64/23.0/desktop/plasma |
KDE Plasma |
default/linux/amd64/23.0/desktop/gnome/systemd |
GNOME (requires systemd) |
default/linux/amd64/23.0/no-multilib |
64-bit only, no 32-bit compat |
For a suckless/minimal setup: use the base 23.0 profile or 23.0/desktop at most. Desktop profiles pull in flags for full DE stacks you won't use.
# List available profiles
eselect profile list
# Set profile
eselect profile set <number>
Decide before booting the live environment.
| Partition | Filesystem | Size | Mount | Notes |
|---|---|---|---|---|
| /dev/sdX1 | FAT32 | 1G | /boot/efi | EFI System Partition |
| /dev/sdX2 | swap | = RAM | swap | Or skip if using zram |
| /dev/sdX3 | ext4 | 40-60G | / | Root |
| /dev/sdX4 | ext4 | remainder | /home | User data |
| Partition | Filesystem | Size | Mount | Notes |
|---|---|---|---|---|
| /dev/sdX1 | ext2 | 512M | /boot | Boot partition |
| /dev/sdX2 | swap | = RAM | swap | |
| /dev/sdX3 | ext4 | 40-60G | / | Root |
| /dev/sdX4 | ext4 | remainder | /home |
These go in make.conf. The goal is to set sensible defaults globally, then override per-package in /etc/portage/package.use/.
| Flag | Purpose | Enable if |
|---|---|---|
X |
X11 support | Using X.org (yes for suckless) |
-wayland |
Wayland support | Not using Wayland |
opengl |
OpenGL support | Almost always yes |
vulkan |
Vulkan API | Gaming, GPU compute |
egl |
EGL interface | Modern GL apps |
| Flag | Purpose | Enable if |
|---|---|---|
pipewire |
PipeWire audio | Modern audio stack |
pulseaudio |
PulseAudio | Legacy; PipeWire replaces this |
alsa |
ALSA direct | Always, it's the kernel layer |
ffmpeg |
FFmpeg codecs | Media playback |
mp3 flac opus vorbis |
Audio codecs | As needed |
jpeg png webp svg |
Image formats | Almost always |
| Flag | Purpose | Enable if |
|---|---|---|
systemd |
systemd init | Using systemd |
-systemd + elogind |
OpenRC init | Using OpenRC (traditional Gentoo) |
dbus |
D-Bus IPC | Most desktop apps need it |
pam |
Auth modules | Almost always |
udev |
Device manager | Always |
policykit |
Privilege escalation | If using polkit for sudo-like GUI actions |
| Flag | Purpose | Enable if |
|---|---|---|
ssl |
SSL/TLS | Always |
gnutls |
GnuTLS library | Some apps prefer this over OpenSSL |
curl |
libcurl support | Almost always |
wifi |
Wireless | Laptops |
bluetooth |
Bluetooth | If hardware present |
networkmanager |
NetworkManager | If using NM; skip for wpa_supplicant+dhcpcd |
| Flag | Purpose | Enable if |
|---|---|---|
hardened |
Security hardening | Security-focused build |
seccomp |
Syscall filtering | Containers, sandboxing |
caps |
POSIX capabilities | Fine-grained perms |
| Flag | Purpose | Enable if |
|---|---|---|
python |
Python bindings | Dev work |
-doc |
Documentation | Saves compile time if you use online docs |
-test |
Test suites | Don't run tests during install |
| Flag | Purpose | Enable if |
|---|---|---|
fish-completion |
Fish completions | Using fish shell |
-bash-completion |
Bash completions | Not using bash interactively |
-zsh-completion |
Zsh completions | Not using zsh |
man |
Man pages | Yes |
Browse all flags: https://www.gentoo.org/support/use-flags/
Per-package flags: https://packages.gentoo.org (search package, check USE tab)
| Value | Hardware |
|---|---|
amdgpu |
AMD Radeon RX 400+ (GCN 4+) |
radeonsi |
AMD Radeon HD 7000+ (GCN 1-3) |
intel |
Intel integrated (i915/xe) |
nvidia |
NVIDIA proprietary driver |
nouveau |
NVIDIA open-source driver |
virgl |
VirtIO GPU (VMs) |
Set only what your hardware has. Multiple values separated by spaces.
INPUT_DEVICES="libinput"
libinput covers keyboards, mice, touchpads, tablets. This is the modern default. Only add synaptics if you specifically need it for an old touchpad.
cd /usr/src/linux
make menuconfig
Map your lspci -vnn output to kernel options. Key areas:
| Hardware | Kernel config path |
|---|---|
| CPU | Processor type and features |
| GPU | Device Drivers > Graphics support |
| NIC (ethernet) | Device Drivers > Network device support > Ethernet |
| WiFi | Device Drivers > Network device support > Wireless |
| Storage (NVMe) | Device Drivers > NVM Express block device |
| Storage (SATA) | Device Drivers > Serial ATA and PATA |
| USB | Device Drivers > USB support |
| Sound | Device Drivers > Sound card support > ALSA |
| Bluetooth | Networking support > Bluetooth |
| Filesystem | File systems (enable ext4, FAT, etc.) |
Critical: If a driver is built-in (*) vs module (M):
emerge sys-kernel/genkernel
genkernel all
Builds a kitchen-sink kernel with most drivers as modules. Works but bloated.
emerge sys-kernel/gentoo-kernel-bin # prebuilt binary
# or
emerge sys-kernel/gentoo-kernel # builds from source with default config
Easiest path. You can switch to manual later.
Before install, make a checklist from your lspci output:
[ ] GPU: AMD/Intel/NVIDIA -- driver name
[ ] NIC: Realtek/Intel/Broadcom -- driver name
[ ] WiFi: Intel/Atheros/Broadcom -- driver name + firmware
[ ] Audio: Intel HDA / USB -- codec
[ ] NVMe/SATA controller
[ ] USB 3.x/Thunderbolt
[ ] Bluetooth chipset
[ ] Webcam (UVC)
[ ] Card reader
[ ] TPM (if present)
For each, find the kernel config option via the Gentoo wiki hardware page or grep -r "VENDOR_ID" /usr/src/linux/.
Many devices need firmware blobs. Install:
emerge sys-kernel/linux-firmware
WiFi cards almost always need firmware. Check your specific chipset:
iwlwifi firmwareb43 or broadcom-staamdgpu firmware in linux-firmwareList every package you want. For each, check USE flags at https://packages.gentoo.org.
# Window Manager / Desktop
x11-wm/dwm
x11-misc/dmenu
x11-terms/st
x11-misc/picom
# Shell
app-shells/fish
# Editor
app-editors/neovim
# Terminal tools
app-misc/tmux
sys-apps/ripgrep
sys-apps/fd
# Browser
www-client/firefox # USE: -telemetry
# or
www-client/chromium # USE: -hangouts
# Media
media-video/mpv
media-gfx/feh
media-gfx/imagemagick
# Audio
media-sound/pipewire
# Networking
net-misc/curl
net-misc/wget
net-misc/openssh
# Version Control
dev-vcs/git
# Fonts
media-fonts/noto
media-fonts/hack
# System
app-admin/sudo
sys-process/htop
These go in /etc/portage/package.use/ (one file per category or one big file):
# /etc/portage/package.use/browser
www-client/firefox -telemetry -wifi screencast
# /etc/portage/package.use/media
media-video/mpv vulkan lua vaapi
# /etc/portage/package.use/dev
dev-vcs/git -perl curl
Decide your network management approach:
| Method | Complexity | Best for |
|---|---|---|
dhcpcd + wpa_supplicant |
Simple | Minimal setups, servers |
| NetworkManager | Medium | Laptops, mixed wired/wifi |
iwd |
Simple | Modern wifi-only replacement for wpa_supplicant |
netifrc (Gentoo default) |
Medium | OpenRC static configs |
For a suckless setup: dhcpcd for ethernet, iwd or wpa_supplicant for wifi.
| Bootloader | BIOS | UEFI | Notes |
|---|---|---|---|
| GRUB | Yes | Yes | Most documented, heaviest |
| efibootmgr | No | Yes | Direct UEFI boot, no bootloader needed |
| systemd-boot | No | Yes | Simple, systemd only |
| rEFInd | No | Yes | GUI picker, good for multi-boot |
| LILO | Yes | No | Legacy |
For UEFI: efibootmgr is the simplest. Just register the kernel directly with UEFI. No bootloader binary needed.
# Direct UEFI boot (no bootloader)
efibootmgr --create --disk /dev/sdX --part 1 \
--label "Gentoo" --loader "\vmlinuz-6.x.x-gentoo" \
--unicode "root=/dev/sdX3 ro"
[ ] Set timezone: ln -sf /usr/share/zoneinfo/Region/City /etc/localtime
[ ] Set locale: edit /etc/locale.gen, run locale-gen
[ ] Set hostname: /etc/hostname and /etc/hosts
[ ] Create user: useradd -m -G wheel,audio,video,usb -s /bin/fish username
[ ] Configure sudo: visudo (uncomment wheel group)
[ ] Enable services (OpenRC: rc-update add / systemd: systemctl enable)
[ ] Install and configure display server (Xorg)
[ ] Build and install suckless tools (dwm, st, dmenu)
[ ] Deploy dotfiles (stow srice)
[ ] Set up SSH keys
[ ] Configure firewall (iptables/nftables)
Gentoo compiles everything from source. Know what you're getting into:
| Package | Rough time (modern desktop) |
|---|---|
| GCC | 30-60 min |
| LLVM/Clang | 30-60 min |
| Linux kernel | 10-30 min |
| Firefox | 60-120 min |
| Chromium | 120-240 min |
| LibreOffice | 60-120 min |
| Qt5/Qt6 | 30-60 min |
| Rust (bootstrapping) | 30-60 min |
| Xorg server | 5-10 min |
| dwm | <1 min |
| Most small packages | <5 min |
MAKEOPTS="-jN" where N = number of CPU threads. More threads = faster compile.
man 5 make.conf, man 1 emergelinux-firmwarelspci -k to check what driver the live CD usesemerge will tell you. Read the messages, adjust flagsemerge prints important post-install messages. Read themdispatch-conf: After updates, config files need merging. Run dispatch-conf or etc-updateemerge --depclean removes orphaned packages. Run emerge --depclean --pretend firstemerge --sync before a big emerge session