Welcome to the Linux shelf.
Penguin Pages is a compact reference site in the old Linux mirror tradition: restrained colors, small type, hard borders, dense links, and notes that are meant to be read.
what is here?
- Kernel boot parameter notes
- /proc, /sys, modules, devices, initramfs
- Boot chain and recovery commands
- Filesystem, init, security, audio, virtualization, and networking notes
- Source tree map for browsing Linux kernel code
- X.Org, Wayland, Mesa, DRM, and desktop stack references
- A tiny local lookup shell for common Linux topics
classic reading order
- Learn paths, permissions, shells, and logs.
- Read
man hier,man boot, and the docs for your init system. - Learn how your bootloader finds the kernel and initramfs.
- Learn storage, networking, users, services, and package tools.
- Build a kernel once, even if you never daily-drive it.
- Keep notes when you fix things.
sample boot log
[ 0.000000] Linux version 6.x.x (builder@penguinbox)
[ 0.000000] Command line: root=UUID=... rw loglevel=3
[ 0.120241] x86/fpu: Supporting XSAVE feature 0x001
[ 0.428922] ACPI: bus type PCI registered
[ 1.104911] virtio_blk virtio2: 1/0/0 default/read/poll queues
[ 2.021014] EXT4-fs mounted filesystem with ordered data mode
[ 2.880100] init: reached multi-user target
Old rule: read the logs first. They are not friendly, but they are usually honest.
Site crew.
Penguin Pages is maintained as a small static GitHub Pages site. This page lists the active people working on the site and the main project links.
active maintainers
| person | role | github |
|---|---|---|
| RobertFlexx | Main design and maintainer. Handles the site direction, old-web layout, content structure, and repository upkeep. | github.com/RobertFlexx |
| Moritisimor | Active developer. Works on site development, fixes, additions, and keeping the page useful as it grows. | github.com/Moritisimor |
about the site
Penguin Pages is built as a plain static website with separate HTML, CSS, and JavaScript files. The goal is to keep it readable, fast, easy to host, and easy to edit without needing a build system.
The design follows an old Linux documentation mirror style: simple boxes, small text, practical links, and direct reference material.
development focus
- Keep the site lightweight and static.
- Use real project links and official documentation where possible.
- Keep tabs organized by Linux topic.
- Keep the style consistent with early Linux reference pages.
- Avoid unnecessary frameworks, tracking, and heavy page effects.
Kernel documentation notes.
The kernel is memory management, schedulers, filesystems, drivers, networking, architecture code, process handling, security hooks, build logic, and many small interfaces that userspace quietly depends on.
how to read this page
Start with the boot parameters and virtual filesystems, then move to modules and logs. Most kernel troubleshooting begins with dmesg, /proc/cmdline, loaded modules, and the exact hardware or filesystem involved.
official kernel documentation
- docs.kernel.org - current rendered kernel documentation.
- kernel.org documentation index - documentation mirrored from kernel source.
- git.kernel.org - official kernel git browser.
- Bootlin Elixir - searchable Linux source browser.
boot parameters
| parameter | purpose | example |
|---|---|---|
root= |
Root filesystem device or UUID. | root=UUID=abcd-1234 |
rw / ro |
Mount root read-write or read-only during early boot. | rw |
init= |
Use a specific first userspace process. | init=/bin/sh |
loglevel= |
Control console kernel message verbosity. | loglevel=7 |
nomodeset |
Disable kernel mode setting for graphics debugging. | nomodeset |
systemd.unit= |
Boot to a systemd target. | systemd.unit=rescue.target |
single |
Request single-user or rescue style boot on many systems. | single |
panic= |
Automatically reboot after a panic delay. | panic=10 |
/proc
Runtime process and kernel information. Try cat /proc/cpuinfo, cat /proc/meminfo, cat /proc/cmdline, and cat /proc/mounts.
/sys
Kernel object model exported to userspace. Devices, buses, drivers, firmware, power, and module attributes live here.
/dev
Device nodes. Disks, terminals, loop devices, random devices, input devices, and pseudo devices are exposed as files.
module workflow
# list loaded modules
lsmod
# inspect a module
modinfo i915
# load and unload manually
sudo modprobe loop
sudo modprobe -r loop
# show kernel ring buffer
sudo dmesg -T
Linux kernel lab.
This tab is for kernel source, releases, building, patching, and Linux From Scratch references. It keeps the deeper kernel material separate from the basic kernel notes.
official kernel sources
| resource | link | use |
|---|---|---|
| The Linux Kernel Archives | kernel.org | Main place to find current kernel releases, tarballs, patches, changelogs, and release information. |
| Kernel release list | kernel.org releases | Explains mainline, stable, and longterm release categories. |
| Kernel source archive | cdn.kernel.org/pub/linux/kernel | Direct archive tree for kernel tarballs and patches. |
| Official git browser | git.kernel.org | Browse official kernel git repositories. |
| Torvalds tree | torvalds/linux on git.kernel.org | Mainline Linux kernel source tree. |
| GitHub mirror | github.com/torvalds/linux | Convenient read-only style mirror for browsing and cloning. |
| Bootlin Elixir | Bootlin source browser | Search and cross-reference Linux kernel source online. |
release types
| type | meaning | good use |
|---|---|---|
| mainline | Current development release line after a merge window. | Testing new kernel work and following current development. |
| stable | Released kernel with bug fixes backported after mainline release. | General users who need newer hardware support or fixes. |
| longterm | Older supported kernel maintained for a longer period. | Servers, appliances, conservative systems, and production-style setups. |
| linux-next | Integration tree for upcoming kernel work. | Developers testing future merge material, not normal installs. |
get the source
# clone mainline from kernel.org
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
# or clone the GitHub mirror
git clone https://github.com/torvalds/linux.git
cd linux
# check current version
make kernelversion
basic kernel build
# start from the running distro kernel config
cp /boot/config-$(uname -r) .config
# update config for the new tree
make olddefconfig
# optional terminal config menu
make menuconfig
# build kernel and modules
make -j$(nproc)
# install modules and kernel
sudo make modules_install
sudo make install
Many distributions handle bootloader updates differently. Keep an older working kernel in your boot menu.
Debian and Ubuntu style packages
# build Debian packages from a kernel tree
make -j$(nproc) bindeb-pkg
# install generated packages from parent directory
cd ..
sudo dpkg -i linux-image-*.deb linux-headers-*.deb
Arch style package path
Arch users usually build kernels through PKGBUILDs, the Arch Build System, or custom packages. This keeps the kernel tracked by pacman instead of scattering files outside the package database.
asp export linux
cd linux
makepkg -s
patching sketch
# apply a patch
patch -p1 < ../some-kernel.patch
# inspect changes
git diff
# build after patching
make olddefconfig
make -j$(nproc)
For serious kernel work, use git branches, keep patches small, and read the kernel development process documentation.
Linux From Scratch
| resource | link | use |
|---|---|---|
| LFS home | linuxfromscratch.org | Main project site. |
| Read LFS online | LFS read online | Read current stable and development books. |
| Download LFS | LFS download | Download the book in available formats. |
| Beyond Linux From Scratch | BLFS | Desktop, networking, server, and extended package instructions after base LFS. |
| Hints | LFS hints | Community notes and extra build ideas. |
Boot chain and recovery notes.
A Linux boot usually fails at one layer: firmware, bootloader, kernel, initramfs, root filesystem, init system, display manager, or user session. Name the layer before replacing random packages.
boot repair rule
Work in order. Check firmware entries, bootloader config, kernel files, initramfs contents, root filesystem UUIDs, and service logs. Random reinstalling usually hides the real problem.
boot path
| stage | what happens | common clues |
|---|---|---|
| firmware | UEFI or BIOS initializes hardware and picks a boot entry. | No boot menu, missing disk, wrong EFI entry. |
| bootloader | GRUB, systemd-boot, Limine, rEFInd, or another loader starts the kernel. | GRUB prompt, missing config, wrong UUID. |
| kernel | Hardware discovery, drivers, mounts, and early console output. | Kernel panic, driver errors, root not found. |
| initramfs | Temporary early userspace assembles storage and mounts root. | Emergency shell, missing modules, LUKS or LVM issue. |
| init | systemd, runit, OpenRC, s6, dinit, or another init starts services. | Failed units, stuck target, service loops. |
| login/session | Display manager, shell login, desktop session, user services. | Black screen, login loop, broken user config. |
chroot repair pattern
# from a live USB, adjust partitions first
sudo mount /dev/nvme0n1p2 /mnt
sudo mount /dev/nvme0n1p1 /mnt/boot/efi
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
sudo chroot /mnt
# example GRUB EFI reinstall
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=Linux
grub-mkconfig -o /boot/grub/grub.cfg
initramfs tools
- Debian or Ubuntu:
update-initramfs -u - Arch:
mkinitcpio -P - Fedora:
dracut --force - Generic dracut:
dracut --regenerate-all --force
boot inspection
efibootmgr -vlists UEFI entries.lsblk -fshows UUIDs and filesystems.cat /proc/cmdlineshows kernel args.journalctl -xbshows current boot logs.
Sysadmin field notes.
Most repair work is finding which layer lied to you: firmware, bootloader, kernel, initramfs, root filesystem, init system, display stack, network stack, package database, or user config.
admin method
Before editing config files, collect basic facts: what changed, which service failed, which log mentions it, which package owns the file, and whether the problem happens for a fresh user account.
filesystem layout
| path | role |
|---|---|
| /boot | kernel, initramfs, bootloader files |
| /etc | system configuration |
| /usr | programs, libraries, shared data |
| /var | logs, cache, databases, spools |
| /home | user files and per-user config |
| /run | runtime state since boot |
first checks
journalctl -xbfor current boot errors.dmesg -Tfor kernel and driver messages.lsblk -ffor block devices and filesystems.ip addrandip routefor networking.systemctl --failedfor failed units.df -hfor full filesystems.
users and permissions
| task | command |
|---|---|
| show identity | id |
| change owner | sudo chown user:group file |
| change permissions | chmod 755 script.sh |
| show ACL | getfacl file |
| edit sudo permissions | sudo visudo |
| add user to group | sudo usermod -aG group user |
Command cribsheet.
A small shelf of commands that eventually become muscle memory. None of this replaces the manual pages, but it gets you moving.
command habit
Prefer commands that show state before commands that change state. Read with
lsblk
,
findmnt
,
ip
,
ss
,
journalctl
, and
systemctl status
before editing files or restarting services.
daily shell
| task | command |
|---|---|
| find files by name | find . -name "*.conf" |
| show tree size | du -h --max-depth=1 . |
| watch a command | watch -n1 free -h |
| search text | grep -R "needle" /etc |
| list sockets | ss -tulpn |
| show open files | lsof -i |
| process tree | ps auxf |
| environment | printenv |
network
ip addr
ip route
resolvectl status
ping -c 4 1.1.1.1
tracepath kernel.org
nmcli dev status
ss -tulpn
storage
lsblk -f
blkid
findmnt
df -h
sudo smartctl -a /dev/sda
sudo btrfs filesystem usage /
sudo zpool status
package managers
| system | install | search |
|---|---|---|
| Debian or Ubuntu | sudo apt install pkg |
apt search pkg |
| Fedora | sudo dnf install pkg |
dnf search pkg |
| Arch | sudo pacman -S pkg |
pacman -Ss pkg |
| openSUSE | sudo zypper in pkg |
zypper se pkg |
| Void | sudo xbps-install pkg |
xbps-query -Rs pkg |
| Gentoo | sudo emerge pkg |
emerge --search pkg |
| Exherbo | sudo cave resolve --execute pkg |
cave search pkg |
mini lookup shell
Linux source tree map.
The kernel source tree looks scary until the top-level directories become familiar. Start by reading names, then build paths, then small subsystems.
browsing advice
Use a source browser first, then clone the tree later. Follow one subsystem at a time. For example, a filesystem path usually touches fs/ , headers in include/ , and shared code in kernel/ or mm/ .
top level directories
| directory | what lives there |
|---|---|
| arch/ | Architecture-specific code: x86, arm64, riscv, powerpc, and more. |
| block/ | Block layer and request handling. |
| drivers/ | The giant driver forest: GPU, USB, PCI, net, storage, input, sound, etc. |
| fs/ | Filesystem implementations and VFS glue. |
| include/ | Kernel headers and public UAPI headers. |
| init/ | Early kernel init and startup path. |
| kernel/ | Core scheduler, locking, time, signals, tracing, cgroups, and process machinery. |
| mm/ | Memory management. |
| net/ | Networking stack. |
| security/ | LSM framework and security modules. |
| tools/ | Userspace tooling like perf and testing helpers. |
build sketch
# configure
make menuconfig
# build with all cores
make -j$(nproc)
# install modules and kernel
sudo make modules_install
sudo make install
# update bootloader if your distro does not do it automatically
sudo grub-mkconfig -o /boot/grub/grub.cfg
useful source browsers
patch culture
The kernel is developed through mailing lists, maintainers, subsystem trees, review, signed-off patches, and a long memory for broken changes. Read the development process docs before sending patches.
Graphics stack notes.
Linux graphics is a stack: kernel DRM and KMS, Mesa or vendor drivers, display server or compositor, toolkit, desktop shell, and applications. Debug from the bottom upward.
graphics method
First identify the GPU, kernel driver, session type, and userspace graphics libraries. Most desktop issues make more sense after checking whether the session is X11 or Wayland and whether hardware acceleration is active.
X.Org and Wayland
| project | link | notes |
|---|---|---|
| X.Org | x.org | Open source implementation of the X Window System. |
| X.Org documentation | X.Org docs | User documentation, protocol specs, client programming references. |
| Wayland | wayland.freedesktop.org | Protocol and architecture intended to replace X11. |
| freedesktop.org | freedesktop.org wiki | Desktop interoperability specifications and project hosting. |
| Mesa | mesa3d.org | Open source OpenGL, Vulkan, and video acceleration drivers. |
| DRM docs | kernel GPU docs | Kernel graphics and DRM documentation. |
common Linux GPU paths
| hardware | kernel side | userspace side |
|---|---|---|
| modern AMD | amdgpu plus firmware | Mesa RadeonSI for OpenGL and commonly RADV for Vulkan. |
| older Radeon | radeon plus firmware; some transition hardware can use AMDGPU | Generation-appropriate Mesa Radeon driver. |
| Intel | i915, or xe on supported newer hardware | Mesa Crocus/Iris for OpenGL and ANV for Vulkan. |
| NVIDIA | nouveau or the proprietary modules, not both for one GPU | Mesa for nouveau or matching vendor libraries. |
| virtual machine | virtio_gpu, QXL, VMware, Hyper-V, or VirtualBox guest driver | Mesa virgl or hypervisor integration matching the virtual display model. |
debug commands
lspci -nnk | grep -A3 -E "VGA|3D|Display"
loginctl show-session "$XDG_SESSION_ID" -p Type
lsmod | grep -E "amdgpu|radeon|i915|xe|nouveau|nvidia|virtio_gpu"
glxinfo -B
vulkaninfo --summary
journalctl -b | grep -iE "drm|nvidia|nouveau|amdgpu|radeon|i915|xe|virtio|wayland|xorg"
common layers
- Kernel: DRM, KMS, framebuffer, GPU driver.
- Userspace driver: Mesa, libglvnd, vendor OpenGL or Vulkan stack.
- Display server: X.Org or Wayland compositor.
- Shell: KDE Plasma, GNOME Shell, XFCE, sway, etc.
- Portal: xdg-desktop-portal and desktop portal backend.
Desktop environments and window managers.
Desktop environments and window managers are central for using Linux as a desktop OS. Without them, you are working from a shell, a TTY, or a manually built graphical session.
choosing a desktop
Choose a desktop environment when you want a complete session with panels, settings, file manager integration, portals, notifications, and login polish. Choose a window manager when you want a smaller, keyboard-focused setup and are willing to assemble more pieces yourself.
common desktop environments
| Name | Description | Link |
|---|---|---|
| KDE Plasma | Feature-rich Qt-based desktop with strong customization and modern Wayland support. | kde.org |
| GNOME | GTK-based desktop focused on a consistent workflow and simplified user experience. | gnome.org |
| XFCE | Lightweight GTK desktop that runs well on older or lower-resource machines. | xfce.org |
| LXQt | Lightweight Qt desktop commonly used for fast, simple installations. | lxqt-project.org |
| Cinnamon | Traditional desktop layout developed by Linux Mint. | Cinnamon |
| MATE | Continuation of the GNOME 2 desktop style. | mate-desktop.org |
| Budgie | Modern desktop environment with a clean panel-driven workflow. | buddiesofbudgie.org |
common window managers
| Name | Description | Link |
|---|---|---|
| i3 | Popular X11 tiling window manager with plain text configuration. | i3wm.org |
| sway | Wayland compositor compatible with the i3 workflow. | swaywm.org |
| xmonad | Highly configurable tiling window manager written and configured in Haskell. | xmonad.org |
| Hyprland | Dynamic Wayland compositor with animations and extensive configuration. | hypr.land |
| IceWM | Fast stacking window manager with a traditional desktop feel. | ice-wm.org |
| JWM | Small window manager commonly used in lightweight systems. | JWM |
| dwm | Minimal suckless tiling window manager configured by editing source. | dwm.suckless.org |
what a standalone session still needs
A window manager draws and arranges windows; it is not automatically a complete desktop. Plan for a terminal, launcher, notifications, policy-authentication agent, screen locker, clipboard, file manager, network and audio controls, wallpaper/output tools, and an xdg-desktop-portal backend. Wayland compositors may provide display and input configuration themselves, while X11 sessions commonly use separate tools.
Filesystem notes.
Filesystems decide how data is stored, recovered, checked, mounted, snapshotted, and sometimes compressed. Pick one for the job, not because a forum yelled loudly.
filesystem choice
For a normal install, ext4 is the quiet dependable choice. Btrfs is useful for snapshots and compression. XFS is strong for large files and server workloads. ZFS is excellent when storage integrity and pools matter more than being built into the mainline kernel.
common filesystems
| filesystem | use | notes |
|---|---|---|
| ext4 | General Linux systems | Reliable, common, simple, mature. |
| Btrfs | Desktops, snapshots, subvolumes | Supports compression, snapshots, send/receive, and checksumming. |
| XFS | Large files and servers | Strong performance and mature tooling. |
| ZFS | Storage pools and data integrity | Checksums, snapshots, datasets, compression, replication. |
| FAT32 | Firmware and portable media | Common for EFI System Partitions. |
| exFAT | Large portable drives | Useful between Linux, Windows, and macOS. |
| tmpfs | Temporary RAM-backed storage | Used for runtime files and fast temporary storage. |
| overlayfs | Containers and live systems | Layers one filesystem view over another. |
inspection
lsblk -f
findmnt
blkid
df -h
du -h --max-depth=1 /
cat /etc/fstab
repair and maintenance
sudo fsck /dev/sdXN
sudo btrfs scrub start /
sudo xfs_repair /dev/sdXN
sudo zpool status
sudo zpool scrub poolname
Init systems and services.
The init system is the first long-running userspace process. It starts services, manages boot targets or runlevels, and decides what happens when the machine shuts down.
service thinking
Service management is mostly dependency order, supervision, logging, and failure handling. Learn how your init system starts services, where it stores service definitions, and how to inspect logs for the current boot.
common init systems
| init | commands | notes |
|---|---|---|
| systemd | systemctl, journalctl |
Common on most major Linux distributions. |
| OpenRC | rc-service, rc-update |
Service manager used by Alpine, Gentoo, and others. |
| runit | sv |
Small supervision suite used by Void Linux by default. |
| s6 | s6-rc, s6-svstat |
Process supervision and service management toolkit. Used by Obarun Linux, and Adelie Linux by default. |
| dinit | dinitctl |
Dependency-aware service manager with a small design. Used by Chimera Linux by default. |
| SysVinit | service, update-rc.d |
Traditional init style built around scripts and runlevels. Popularly known by being used in Slackware Linux by default. |
service checks
systemctl status sshd
journalctl -u sshd -b
rc-service sshd status
sv status /var/service/*
s6-rc -a list
dinitctl list
Security basics.
Linux security starts with ordinary administration: permissions, users, groups, updates, logs, network exposure, and service configuration. Fancy tools do not replace sane defaults.
baseline
Patch regularly, expose fewer services, use SSH keys, limit sudo access, check listening ports, and know where authentication logs are stored. Security starts with fewer surprises.
security areas
| area | tools | notes |
|---|---|---|
| users and groups | id, groups, passwd |
Know which user can do what. |
| sudo | sudo -l, visudo |
Keep privilege escalation narrow and readable. |
| permissions | chmod, chown, umask |
Basic Unix permissions still matter. |
| ACLs | getfacl, setfacl |
Extended permissions beyond user/group/other. |
| capabilities | getcap, setcap |
Fine-grained privileges for binaries. |
| MAC | aa-status, sestatus |
AppArmor and SELinux add policy enforcement. |
| firewall | nft, ufw, firewalld |
Limit what services are reachable. |
checks
id
groups
sudo -l
ss -tulpn
sudo nft list ruleset
last
journalctl -p warning -b
ssh basics
- Use keys instead of passwords where possible.
- Disable root login on exposed systems.
- Keep OpenSSH updated.
- Use a firewall to expose only needed services.
- Check logs after failed login storms.
Audio stack notes.
Linux audio has layers. Hardware is handled by ALSA, desktop routing often goes through PipeWire or PulseAudio, and pro-audio workflows may involve JACK.
audio method
Start at the bottom. Confirm the card exists with ALSA, then check the desktop sound server, then check the session manager and selected output device. Many audio problems are routing problems, not driver problems.
audio layers
| layer | role | commands |
|---|---|---|
| ALSA | Kernel and low-level userspace audio support. | aplay -l, alsamixer |
| PulseAudio | Older common desktop sound server. | pactl info |
| PipeWire | Modern audio and video graph server. | pw-top, wpctl status |
| WirePlumber | Session manager for PipeWire. | systemctl --user status wireplumber |
| JACK | Low-latency pro-audio system. | jack_lsp |
debug commands
aplay -l
alsamixer
pactl info
wpctl status
pw-top
systemctl --user status pipewire wireplumber pipewire-pulse
Containers and virtualization.
Linux can isolate workloads with namespaces, cgroups, chroots, containers, virtual machines, and full hypervisor stacks. The right tool depends on how much isolation and hardware emulation you need.
container or VM
Use a container when you want isolated userspace on the same kernel. Use a virtual machine when you need a separate kernel, stronger machine boundaries, firmware testing, or another operating system entirely.
common tools
| tool | type | notes |
|---|---|---|
| chroot | filesystem isolation | Classic repair and build environment tool. |
| systemd-nspawn | container | Lightweight system container tool. |
| Docker | container platform | Popular application container tooling. |
| Podman | container platform | Daemonless container tooling with rootless workflows. |
| LXC | system containers | Containers closer to lightweight machines. |
| QEMU/KVM | virtual machines | Hardware virtualization and emulation. |
| libvirt | VM management | Management layer used by virt-manager and virsh. |
commands
sudo chroot /mnt
machinectl list
podman ps
docker ps
lxc-ls --fancy
virsh list --all
qemu-system-x86_64 --version
Troubleshooting flowcharts.
Good troubleshooting is boring: identify the layer, collect evidence, change one thing, test, and write down what changed.
general loop
Observe, isolate, test, document. Avoid changing five things at once. A fix you cannot explain is hard to trust and harder to repeat.
boot failure
network failure
graphical session failure
disk space failure
Linux glossary.
Short definitions for common Linux terms.
how to use it
This glossary is for quick orientation while reading the rest of the site. It keeps definitions short so you can get back to the command output, manual page, or source file you were looking at.
terms
| term | meaning |
|---|---|
| kernel | The core program managing hardware, memory, processes, filesystems, and system calls. |
| userspace | Programs outside the kernel: shells, services, desktops, tools, and applications. |
| initramfs | Temporary early userspace used during boot before the real root filesystem is mounted. |
| module | Loadable kernel code, often used for drivers and filesystems. |
| syscall | A controlled entry point from userspace into the kernel. |
| daemon | A background service process. |
| TTY | Text terminal interface, often available with Ctrl+Alt+F keys. |
| compositor | Display server component that draws windows and effects, especially in Wayland. |
| display manager | Graphical login manager such as SDDM, GDM, LightDM, or LXDM. |
| package manager | Tool for installing, removing, updating, and querying software packages. |
| mount point | Directory where a filesystem is attached. |
| environment variable | Named value inherited by processes, such as PATH or HOME. |
Distro downloads.
Use official download pages. Pick a distribution by release model, hardware support, documentation, package tools, and how much system maintenance you want. Take information here AS IS, and information here is NOT opionated, only based on common consensus.
user friendly desktops
| distro | download | why choose it |
|---|---|---|
| Ubuntu Desktop | ubuntu.com/download/desktop | Broad hardware support, large community, common third-party software support, good first desktop choice. |
| Linux Mint | linuxmint.com/download.php | Traditional desktop feel, comfortable defaults, good for users moving from Windows-style workflows. |
| Fedora Workstation | fedoraproject.org/workstation/download | Modern GNOME desktop, fresh software, good developer workstation, strong upstream alignment. |
| Zorin OS | zorin.com/os/download | Polished desktop aimed at users coming from Windows or macOS. |
| Pop!_OS | system76.com/pop/download | Desktop-focused Ubuntu-based system with System76 polish and simple graphics options. |
| MX Linux | mxlinux.org/download-links | Debian-based desktop with helpful tools and good performance on older hardware. |
advanced and hands-on
| distro | download | why choose it |
|---|---|---|
| Arch Linux | archlinux.org/download | Rolling release, direct control, simple packaging, excellent documentation. |
| Gentoo | gentoo.org/downloads | Source-based system for users who want deep control over build options and system composition. |
| Void Linux | voidlinux.org/download | Independent distro with XBPS, runit, fast tooling, and non-systemd defaults. |
| Slackware | slackware.com/getslack | Traditional Linux with minimal abstraction and old-school administration. |
| NixOS | nixos.org/download | Declarative configuration, reproducible systems, rollbacks, and a very different package model. |
| Linux From Scratch | linuxfromscratch.org/lfs/download | Build a Linux system from source to learn how the pieces fit together. |
rolling and fresh packages
| distro | download | why choose it |
|---|---|---|
| openSUSE Tumbleweed | get.opensuse.org/tumbleweed | Rolling release with strong tooling, snapshots, and quality control. |
| EndeavourOS | endeavouros.com | Arch-based system with an easier installer and friendly defaults. |
| CachyOS | cachyos.org/download | Arch-based distro focused on performance tuning and desktop responsiveness. |
| Manjaro | manjaro.org/download | Arch-family desktop with its own repos, graphical tools, and delayed package flow. |
| openSUSE Slowroll | openSUSE Slowroll | A slower rolling option between Leap-style stability and Tumbleweed pace. |
server and stable base
| distro | download | why choose it |
|---|---|---|
| Debian | debian.org/distrib | Stable, conservative, widely supported, excellent for servers and quiet systems. |
| Ubuntu Server | ubuntu.com/download/server | Popular server choice with cloud support, predictable LTS releases, and broad documentation. |
| Rocky Linux | rockylinux.org/download | RHEL-compatible server and workstation base with enterprise-style lifecycle. |
| AlmaLinux | almalinux.org/get-almalinux | Community-governed enterprise Linux compatible distribution. |
| openSUSE Leap | get.opensuse.org/leap | Stable openSUSE track with YaST, zypper, and conservative package movement. |
| Oracle Linux | oracle.com/linux/downloads | Enterprise Linux family option commonly used for Oracle-oriented server environments. |
minimal, container, and special use
| distro | download | why choose it |
|---|---|---|
| Alpine Linux | alpinelinux.org/downloads | Small, simple, security-oriented distro using musl libc, BusyBox, and apk. Also very desktop capable. |
| Kali Linux | kali.org/get-kali | Security lab and penetration testing distribution. Best used for labs, not normal daily desktop installs. |
| Tails | tails.net/install | Live privacy-focused system designed around Tor and amnesic sessions. |
| Qubes OS | qubes-os.org/downloads | Security-focused desktop OS built around compartmentalized virtual machines. |
| Chimera Linux | chimera-linux.org/download | Independent Linux using apk-tools, LLVM, musl, and a non-GNU userland approach. Very desktop capable. |
Exherbo field guide: from stage tarball to a complete system.
Exherbo is a source-based Linux distribution for people who want control, clean packaging, and a system they actually understand. This practical companion covers install order, Paludis habits, kernels, firmware, AMD, Intel, NVIDIA and virtual graphics, console and graphical systems, several desktop styles, laptops, virtual machines, recovery, and daily maintenance.
cave search, cave show, and the official docs before executing a package plan.
choose the machine profile before configuring it
| decision | common choices | what changes |
|---|---|---|
| system role | headless, VM guest, workstation, laptop | Headless systems can omit graphics, a display manager, portals, and desktop packages. |
| graphics | AMD, older Radeon, Intel, nouveau, proprietary NVIDIA, virtual GPU | Kernel driver, firmware, Mesa video/Vulkan driver, and sometimes kernel arguments. |
| session | console, X11, Wayland | Wayland needs a compositor and usually a portal backend; X11 needs an X server and window manager. |
| desktop | KDE, GNOME, XFCE, LXQt, standalone WM/compositor | Desktop set, display manager, policy agent, portal, settings tools, and applets. |
| boot | UEFI or legacy BIOS; GRUB or another loader | This guide's worked example is UEFI with the ESP mounted at /boot. Do not mix commands for a separate /boot/efi layout. |
Use one primary GPU profile first. Hybrid laptops are a deliberate combination, not a reason to enable every driver globally.
official and alternate docs shelf
| resource | link | what to use it for |
|---|---|---|
| Exherbo docs index | exherbo.org/docs | Official starting point for install guide, expectations, Paludis, KDE notes, systemd, multiarch, and developer docs. |
| Official install guide | install-guide.html | Stage tarball, disk layout, chroot, fstab, kernel, bootloader, hostname, users, and post-install tasks. |
| KDE on Exherbo | kde.html | Official KDE set overview. Useful, but too short for a full daily-driver Plasma setup. |
| Paludis cave | cave client docs | Main package manager command reference. Use cave help, cave show, cave search, cave resolve, and cave sync. |
| cave resolve | cave-resolve.html | How Paludis previews and executes install, reinstall, uninstall, and world actions. |
| Exherbo packages | summer.exherbo.org | Package browser for checking package names, repositories, versions, options, and masks. |
| Exherbo GitLab | gitlab.exherbo.org | Repositories, exheres, issues, and source for the distribution. |
| Multiarch docs | multiarch migration | Only touch this when you are deliberately adding another architecture target. Native Steam's 32-bit needs are not a casual one-line option. |
what makes Exherbo different?
- It is source-based. Many installs are real builds, not quick binary downloads.
- It uses Paludis and
cave, not Portage/emerge. - Package options are explicit. A small option change can cause same-version rebuilds.
- Package names are not always Gentoo names. Search instead of guessing.
- It expects you to understand boot, kernel, options, services, and config protection.
- It rewards notes, patience, and checking one layer at a time.
install map
- Boot a live Linux system with network access.
- Partition the disk: EFI System Partition, root, optional home, optional swap.
- Format and mount the filesystems under /mnt/exherbo.
- Download and extract the Exherbo stage tarball.
- Write /etc/fstab.
- Bind mount /dev, /sys, and /proc, then chroot.
- Configure Paludis, sync repositories, and set desktop options.
- Build or install a kernel, initramfs, firmware, and bootloader.
- Create the system identity, root password, normal user, locale, timezone, networking, and privilege policy.
- Choose a console, desktop, or window-manager profile and only its required services.
- Choose the matching GPU kernel driver, firmware, Mesa or vendor userspace, and portal stack.
- Keep a known-good kernel and boot into the simpler session first if a new Wayland setup is questionable.
- Audit the system before calling it daily-drivable.
sudo as shown or inside the chroot as root without sudo. Commands explicitly described as after first boot run as the normal user and use sudo for administrative work.
partitioning example: simple UEFI desktop
This mirrors a practical desktop layout: FAT32 ESP mounted at /boot, ext4 root, and swap. Adjust device names before running anything.
lsblk -f, and do not copy these device names blindly.
# example only; replace disk and partition names
lsblk -f
sudo cfdisk /dev/nvme0n1
# suggested layout
# p1 EFI System 1G-2G vfat /boot
# p2 swap 4G-16G swap none
# p3 Linux root rest ext4 /
sudo mkfs.vfat -F32 /dev/nvme0n1p1
sudo mkswap /dev/nvme0n1p2
sudo mkfs.ext4 -L exherbo-root /dev/nvme0n1p3
sudo mkdir -p /mnt/exherbo
sudo mount /dev/nvme0n1p3 /mnt/exherbo
sudo mkdir -p /mnt/exherbo/boot
sudo mount /dev/nvme0n1p1 /mnt/exherbo/boot
sudo swapon /dev/nvme0n1p2
fstab pattern
# get UUIDs
blkid
# /mnt/exherbo/etc/fstab
UUID=<root-uuid> / ext4 defaults,noatime 0 1
UUID=<esp-uuid> /boot vfat defaults 0 2
UUID=<swap-uuid> none swap sw 0 0
Use UUIDs, not moving names like /dev/sda, especially on multi-boot machines.
bootstrap and chroot
On the live system, confirm the architecture, clock, network, boot mode, and stage integrity before extraction. Obtain the checksum or signature from the official stage source rather than trusting a copied value.
uname -m
date -u
ip route
test -d /sys/firmware/efi && echo UEFI || echo BIOS
cd /mnt/exherbo
# use the current stage URL from the official install guide
sudo curl -O https://stages.exherbo.org/x86_64-pc-linux-gnu/exherbo-x86_64-pc-linux-gnu-gcc-current.tar.xz
# Save the separately obtained official checksum as stage.sha256, then verify it.
sha256sum -c stage.sha256
sudo tar xJpf exherbo-x86_64-pc-linux-gnu-gcc-current.tar.xz
sudo mount -o rbind /dev /mnt/exherbo/dev
sudo mount --make-rslave /mnt/exherbo/dev
sudo mount -o rbind /sys /mnt/exherbo/sys
sudo mount --make-rslave /mnt/exherbo/sys
sudo mount -t proc none /mnt/exherbo/proc
# Do not follow a resolver symlink from the target into a nonexistent /run path.
readlink -f /etc/resolv.conf
sudo rm -f /mnt/exherbo/etc/resolv.conf
sudo cp -L /etc/resolv.conf /mnt/exherbo/etc/resolv.conf
sudo env -i TERM="$TERM" SHELL=/bin/bash HOME=/root chroot /mnt/exherbo /bin/bash
source /etc/profile
export PS1="(exherbo chroot) $PS1"
The rbind on /dev matters. Paludis and device-heavy builds can behave badly if the chroot is mounted lazily.
base-system identity and first login
Run this part inside the chroot as root. Exact locale and administrative groups are policy choices; inspect the files and installed tools instead of assuming another distribution's defaults.
# identity and time
printf '%s\n' exherbo-host > /etc/hostname
ln -sf /usr/share/zoneinfo/Region/City /etc/localtime
printf '%s\n' '127.0.0.1 localhost' '127.0.1.1 exherbo-host' > /etc/hosts
# inspect available locales and configure the one you actually use
locale -a
locale
# credentials; use the user-management tools supplied by the stage
passwd
useradd -m -s /bin/bash alice
passwd alice
id alice
Install and configure either sudo or doas, then test it from a second root shell before closing the first. Add only the groups required by installed software; modern logind, udev, and polkit setups usually do not require broad legacy groups for ordinary desktop access.
firmware and CPU microcode
Firmware is required by many AMD GPUs, Wi-Fi adapters, Bluetooth controllers, and Intel audio DSPs. CPU microcode is separate and should be loaded early. Package categories and split packages can change, so locate them rather than guessing.
cave search firmware
cave search microcode
cave show category/firmware-package
# after installation and reboot
journalctl -b -k | grep -iE 'firmware|microcode|amdgpu|radeon|iwlwifi|rtw|ath|sof'
dmesg | grep -i 'failed to load'
| hardware | usual requirement | failure clue |
|---|---|---|
| modern AMD GPU | AMDGPU kernel driver plus matching Radeon firmware | Display stays basic or logs name a missing amdgpu/*.bin file. |
| older Radeon | radeon driver and firmware; some transition-era cards can use AMDGPU experimentally | Wrong driver binds, acceleration is absent, or display initialization fails. |
| Intel Wi-Fi/audio | device firmware; SOF firmware for some DSP audio | Interface or sound card is absent while PCI hardware is visible. |
| Intel/AMD CPU | matching microcode package and early initramfs/bootloader loading | Kernel log lacks a current microcode update line. |
Paludis basics
| task | command | notes |
|---|---|---|
| sync repositories | cave sync |
Do this before a serious install or world update. |
| search package names | cave search plasma |
Search first. Do not assume Gentoo package names. |
| inspect options | cave show kde/plasma-desktop |
Shows options, suggestions, masks, repository, and reasons. |
| preview install | cave resolve world |
Shows what would happen. This is the safe read-only step. |
| execute install | cave resolve --execute world |
Actually builds/installs. Do not interrupt core packages. |
| remove package | cave uninstall distribution/steam |
Useful when a package was only an experiment. |
options.conf: common desktop base
Start with shared session and input requirements, then add exactly one graphics snippet from the next table. Keep global options small; do not enable every attractive option or copy hardware settings from an unrelated machine.
# /etc/paludis/options.conf
# Add only the session features in use.
# */* X # X.Org or Xwayland
# */* wayland # Wayland compositor/toolkit support
# Build behavior
*/* build_options: symbols=split jobs=8 -dwarf_compress -recommended_tests -trace work=tidyup
# Input stack
*/* input_devices: libinput
# KDE shutdown/reboot/unlock helpers
sys-apps/systemd polkit
# EFI GRUB
sys-boot/grub efi GRUB_PLATFORMS: efi-64 pc
# Archive support
app-arch/libarchive zstd
# KDE profile additions: omit or replace for another desktop
# Qt5 tooling for older KDE/theme packages
x11-libs/qtbase:5 sql sqlite
# KDE image and QR support
kde-frameworks/prison scanner pdf417
kde-frameworks/kimageformats avif
# Flatpak and portals
# This avoids the Qt6 libportal private-header trap seen on some Exherbo setups.
sys-libs/libportal PROVIDERS: gtk3 -gtk4 -qt5 -qt6
# Audio integration
media-sound/pulseaudio bluetooth
sys-sound/alsa-plugins pulseaudio
media-libs/libcanberra pulseaudio
# Bluetooth desktop integration
net-wireless/bluez obex
# GTK, tray, and device integration
dev-libs/at-spi2-core gobject-introspection
x11-libs/gtk+:3 gobject-introspection
core/json-glib gobject-introspection
dev-libs/libgusb gobject-introspection
# Optional UI polish
app-misc/fastfetch X wayland opengl vulkan libdrm dbus
kde/kinfocenter usb
If cave resolve world shows only same-version r rebuilds after editing options, that usually means option drift, not corruption. It wants to rebuild packages so their recorded build options match the current file.
graphics profile: choose one starting point
| GPU | Paludis direction | kernel and userspace |
|---|---|---|
| modern AMD | x11-dri/mesa video_drivers: radeon | CONFIG_DRM_AMDGPU, firmware, Mesa RadeonSI, and a separately selected Vulkan implementation if needed. |
| older Radeon R300-R500 | x11-dri/mesa video_drivers: r300 | CONFIG_DRM_RADEON, matching firmware, and the generation-appropriate Mesa driver. |
| older Radeon HD 2000+ | x11-dri/mesa video_drivers: radeon | CONFIG_DRM_RADEON or supported AMDGPU transition path, firmware, and Mesa. Identify the exact generation first. |
| Intel Gen4-7 | x11-dri/mesa video_drivers: crocus | Normally CONFIG_DRM_I915; verify support for the exact generation. |
| Intel Gen8+ | x11-dri/mesa video_drivers: iris | CONFIG_DRM_I915 or CONFIG_DRM_XE where documented, with a separately selected Vulkan implementation if needed. |
| NVIDIA with nouveau | x11-dri/mesa video_drivers: nouveau | CONFIG_DRM_NOUVEAU, Mesa, and required firmware. Do not blacklist nouveau. |
| NVIDIA proprietary | Install x11-drivers/nvidia-drivers; this is not a Mesa video-driver choice | Matching vendor kernel modules and userspace. Do not enable the nouveau kernel driver for the same device. |
| QEMU/KVM guest | x11-dri/mesa video_drivers: virtio-gpu | CONFIG_DRM_VIRTIO_GPU, Mesa virgl support, and virtio input where used. |
| headless/console | Do not add desktop graphics globally | Keep simpledrm/EFI framebuffer for a local console if useful; omit X11, Wayland, Mesa, and a display manager unless another package needs them. |
# Confirm names and available choices on this repository snapshot.
cave show x11-dri/mesa
cave search vulkan
cave resolve world
Paludis option names are repository metadata, not universal constants. If a listed token is unavailable, use the choices shown by cave show. Hardware detection comes first: lspci -nnk | grep -A3 -E 'VGA|3D|Display'.
package selection: minimal but not barebones KDE
cave resolve --execute \
kde/plasma-desktop \
kde/plasma-workspace \
kde/kwin \
kde/kwin-x11 \
kde/systemsettings \
kde/dolphin \
kde/konsole \
kde/kate \
kde/ark \
kde/gwenview \
kde/kcalc \
kde/spectacle \
kde/okular \
kde/kfind \
kde/kmenuedit \
kde/kdebugsettings \
kde/kinfocenter \
kde/kio-extras \
kde/kio-admin \
kde/kio-fuse \
kde/ffmpegthumbs \
kde/kdegraphics-thumbnailers \
kde/breeze \
kde/qqc2-breeze-style \
kde/kde-gtk-config \
kde/plasma-workspace-wallpapers \
kde/ocean-sound-theme \
kde/plasma-systemmonitor \
kde/ksystemstats \
kde/filelight \
kde/colord-kde \
kde/plasma-disks \
kde/partitionmanager \
kde/plasma-nm \
kde/plasma-pa \
kde/powerdevil \
kde/kscreen \
kde/sddm-kcm \
kde/flatpak-kcm
Use cave search if any package name fails. Exherbo package names can move, slots matter, and repositories differ.
tested KDE daily desktop base packages
cave resolve --execute \
sys-auth/sddm \
net-apps/NetworkManager \
sys-apps/power-profiles-daemon \
sys-apps/upower \
net-wireless/bluez \
media/pipewire \
sys-apps/xdg-desktop-portal \
kde/xdg-desktop-portal-kde \
sys-apps/flatpak \
sys-apps/xdg-dbus-proxy \
sys-libs/libportal \
x11-server/xwayland \
x11-libs/qtwayland \
fonts/noto \
fonts/noto-emoji \
fonts/dejavu \
fonts/liberation-fonts \
x11-apps/xdg-user-dirs
other desktops and standalone sessions
Package sets vary across repositories. Search for the desktop, inspect its set or core package, preview the plan, and then add the integration pieces appropriate to that session.
| session | discover/install direction | integration to verify |
|---|---|---|
| GNOME | cave search gnome; inspect the GNOME desktop/shell set | GDM or TTY launch, GNOME portal backend, settings daemon, NetworkManager, PipeWire, and Wayland/X11 session files. |
| XFCE | cave search xfce; start with the core desktop | LightDM or TTY launch, an appropriate GTK portal backend, polkit agent, notification service, power manager, and X11. |
| LXQt | cave search lxqt; inspect the LXQt set | SDDM or TTY launch, Qt platform support, polkit agent, notification service, and the selected X11 or Wayland window manager. |
| i3 or another X11 WM | cave search i3 plus X.Org | Terminal, launcher, bar, notification daemon, polkit agent, locker, compositor if wanted, portal backend, and an xsessions entry. |
| sway or another wlroots compositor | cave search sway plus Wayland/Xwayland as needed | xdg-desktop-portal-wlr or current equivalent, notification daemon, polkit agent, locker, clipboard tools, and PipeWire for capture. |
| console/headless | No desktop set | TTY login, networking, time sync, optional SSH, and no display manager. |
cave search gnome # substitute xfce, lxqt, i3, sway, etc.
cave show category/candidate-package-or-set
cave resolve category/candidate-package-or-set
# A display manager is optional. Inspect installed sessions:
find /usr/share/xsessions /usr/share/wayland-sessions -maxdepth 1 -type f 2>/dev/null
Choose portal backends for the active desktop and inspect which interfaces each provides. Some combinations are intentional: for example, a wlroots screen-capture backend may coexist with GTK for file choosing. Unplanned competing backends can still cause slow startup or the wrong chooser.
services to enable
Enable only services installed for the chosen profile. A console server does not need SDDM, Bluetooth, or desktop power management; GNOME commonly uses GDM instead of SDDM.
systemctl enable sddm
systemctl enable NetworkManager
systemctl enable power-profiles-daemon
systemctl enable upower
systemctl enable bluetooth
systemctl enable systemd-timesyncd
# dbus and polkit are usually static/activation based; status matters more than enable
systemctl status dbus polkit --no-pager
networking: installation, desktop, and headless systems
NetworkManager is a convenient desktop default. A small server may instead use systemd-networkd or another deliberate stack. Do not run multiple DHCP clients or resolver managers on the same interface.
# identify the device, driver, radio state, address, route, then DNS
ip -br link
lspci -nnk | grep -A3 -iE 'ethernet|network'
rfkill list
ip -br address
ip route
resolvectl status 2>/dev/null || cat /etc/resolv.conf
# NetworkManager examples after its service is running
nmcli device status
nmcli device wifi list
nmcli device wifi connect 'SSID' --ask
nmcli connection show
# separate routing from DNS failures
ping -c 3 1.1.1.1
getent hosts exherbo.org
For a remote/headless first boot, install an SSH server, add a tested public key, verify the firewall and service from the local console, and only then rely on remote access. Never expose password-based root SSH as a shortcut around user setup.
kernel: desktop-ready checklist
| area | kernel options/modules | why it matters |
|---|---|---|
| modules | CONFIG_MODULES, depmod, modprobe |
NVIDIA, FUSE, Bluetooth, gamepads, filesystems, and many drivers depend on modules. |
| desktop graphics | CONFIG_DRM, CONFIG_DRM_KMS_HELPER, CONFIG_DRM_FBDEV_EMULATION |
Needed for modern display handoff, Wayland, and smooth boot graphics. |
| Flatpak/AppImage | CONFIG_FUSE_FS=m, CONFIG_CUSE=m |
Flatpak, AppImages, portals, and desktop sandboxes expect /dev/fuse. |
| containers and VPN | CONFIG_OVERLAY_FS, CONFIG_TUN, CONFIG_WIREGUARD, namespaces, cgroups |
Containers, Steam runtimes, VPN tools, and sandboxed apps expect these. |
| gaming/input | CONFIG_JOYSTICK_XPAD, CONFIG_HID_NINTENDO, CONFIG_HID_PLAYSTATION |
Gamepads and USB input devices. |
| filesystems | ext4, btrfs, exFAT, NTFS3, VFAT, ISO9660, UDF, squashfs | Normal disks, Windows drives, USB media, ISOs, and compressed images. |
| virtualization | CONFIG_KVM, CONFIG_KVM_INTEL or CONFIG_KVM_AMD |
QEMU/KVM, virt-manager, Android containers, and VM testing. |
kernel, initramfs, and UEFI GRUB contract
Inside an installation chroot, uname -r reports the live medium's kernel. Derive the target version from the kernel you built and use that same value for modules, initramfs, and bootloader checks.
# Before using the commands below, locate and install the required tools.
cave search dracut
cave search grub
cave search efibootmgr
cave resolve category/dracut-package category/grub-package category/efibootmgr-package
cave resolve --execute category/dracut-package category/grub-package category/efibootmgr-package
cd /usr/src/linux
make menuconfig
make -j"$(nproc)"
# Record the target kernel version before installing it.
KVER="$(make -s kernelrelease)"
make modules_install
install -Dm755 arch/x86/boot/bzImage "/boot/vmlinuz-${KVER}"
depmod "$KVER"
dracut --force "/boot/initramfs-${KVER}.img" "$KVER"
test -s "/boot/vmlinuz-${KVER}"
test -s "/boot/initramfs-${KVER}.img"
test -d "/lib/modules/${KVER}"
The worked layout mounts the EFI System Partition at /boot. With efivarfs available and the machine booted in UEFI mode, install GRUB once, then regenerate its configuration after kernel changes.
test -d /sys/firmware/efi/efivars
findmnt /boot
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=Exherbo
grub-mkconfig -o /boot/grub/grub.cfg
efibootmgr -v
grep -nE 'vmlinuz|initramfs' /boot/grub/grub.cfg
building missing FUSE after the fact
If modprobe fuse says the module does not exist and Flatpak complains, build it from the same kernel tree used for the running kernel.
cd /usr/src/linux
./scripts/config --module FUSE_FS
./scripts/config --module CUSE
./scripts/config --disable FUSE_PASSTHROUGH
./scripts/config --disable FUSE_IO_URING
./scripts/config --disable FUSE_DAX
make olddefconfig
make -j"$(nproc)" fs/fuse/fuse.ko fs/fuse/cuse.ko
sudo make M=fs/fuse modules_install
KVER="$(uname -r)"
sudo depmod "$KVER"
sudo modprobe fuse
ls -lah /dev/fuse
If FUSE passthrough causes undefined symbols while building only the module, disable passthrough/io_uring unless you are intentionally wiring those dependencies.
AMD, Radeon, Intel, nouveau, and virtual graphics
Open drivers normally use kernel DRM plus Mesa. They do not use nvidia-smi, NVIDIA module parameters, or a nouveau blacklist. Get a working KMS console first, then confirm rendering, Vulkan if needed, and the desktop session.
lspci -nnk | grep -A3 -E 'VGA|3D|Display'
lsmod | grep -E 'amdgpu|radeon|i915|xe|nouveau|virtio_gpu'
journalctl -b -k | grep -iE 'drm|amdgpu|radeon|i915|xe|nouveau|virtio|firmware'
glxinfo -B
vulkaninfo --summary
| result | meaning | next check |
|---|---|---|
Kernel driver in use: amdgpu | Normal for supported modern AMD GPUs. | Firmware errors, Mesa renderer, RADV/Vulkan, monitor connectors. |
Kernel driver in use: radeon | Normal for many older Radeon generations. | Do not force AMDGPU without confirming the card family and kernel support. |
llvmpipe renderer | Software rendering; the graphical session is not using GPU acceleration. | Kernel binding, firmware, Mesa driver selection, permissions, and mismatched libraries. |
| GPU visible but no kernel driver | Driver missing, disabled, blacklisted, or unsupported. | Kernel config, module aliases, command line, and journalctl -b -k. |
| virtio GPU has basic output only | Guest display works without accelerated virgl. | VM display model, host 3D setting, guest Mesa virgl, and virtio GPU kernel support. |
For video decode, inspect the available VA-API/VDPAU packages and test with vainfo. Hardware rendering and hardware video decode are related but separate paths.
hybrid graphics and multi-GPU laptops
Keep the integrated GPU as the display device first, verify both drivers independently, then configure render offload for selected applications. Do not blacklist the integrated driver or force every application onto the discrete GPU.
lspci -nnk | grep -A3 -E 'VGA|3D|Display'
loginctl show-session "$XDG_SESSION_ID" -p Type -p Desktop
glxinfo -B
# Mesa render-offload example; verify the discrete renderer in the output
DRI_PRIME=1 glxinfo -B
Proprietary NVIDIA offload uses vendor-specific environment variables and matching userspace libraries. Confirm the current driver documentation, external-monitor wiring, and suspend behavior before enabling aggressive dGPU power management.
NVIDIA Wayland setup
The practical NVIDIA rule: kernel modules, userspace libraries, EGL/Wayland pieces, GRUB flags, modprobe config, initramfs, and KWin must all agree. Mixing a half-installed driver stack is how you get llvmpipe, black screens, or a slideshow compositor.
# install/build driver package according to your repositories
sudo cave resolve --execute x11-drivers/nvidia-drivers
# verify modules exist
find "/lib/modules/$(uname -r)" -name 'nvidia*.ko*'
# /etc/modprobe.d/nvidia.conf
sudo tee /etc/modprobe.d/nvidia.conf >/dev/null <<'EOF'
options nvidia_drm modeset=1 fbdev=1
softdep nvidia post: nvidia-uvm
blacklist nouveau
EOF
Optional laptop features need separate validation. NVreg_DynamicPowerManagement=0x02 is for supported runtime-power-management setups. NVreg_PreserveVideoMemoryAllocations=1 requires the NVIDIA suspend/resume/hibernate units and enough backing storage; do not enable either as a universal desktop default.
GRUB kernel arguments:
nvidia-drm.modeset=1 nvidia-drm.fbdev=1
Verify after boot:
nvidia-smi
glxinfo -B
vulkaninfo --summary
sudo sh -c '
echo -n "modeset="; cat /sys/module/nvidia_drm/parameters/modeset
echo -n "fbdev="; cat /sys/module/nvidia_drm/parameters/fbdev
'
Good values are modeset=Y and fbdev=Y. If sysfs files are root-readable only, a normal user may see empty output.
initramfs and GRUB safety sweep
After first boot, uname -r is suitable for rebuilding the running kernel's initramfs. During installation, reuse the explicit KVER from the kernel build section instead.
KVER="$(uname -r)"
sudo depmod "$KVER"
sudo dracut --force "/boot/initramfs-${KVER}.img" "$KVER"
sudo grub-mkconfig -o /boot/grub/grub.cfg
find /boot/EFI -maxdepth 4 -type f | sort
grep -nE 'vmlinuz|initrd' /boot/grub/grub.cfg
Wayland, portals, PipeWire, and Discord screenshare
For KDE Wayland, screen sharing is not just Discord. It needs PipeWire, WirePlumber, xdg-desktop-portal, and the KDE portal backend. Flatpak apps also use the portal path.
systemctl --user status pipewire wireplumber pipewire-pulse xdg-desktop-portal --no-pager
ps aux | grep -E 'pipewire|wireplumber|xdg-desktop-portal' | grep -v grep
echo "$XDG_CURRENT_DESKTOP"
echo "$XDG_SESSION_TYPE"
pactl info
wpctl status
ls /usr/share/xdg-desktop-portal/portals
PipeWire services can show as disabled while sockets are enabled and the services are active. That is normal socket activation, not failure.
Flatpak and Steam
Use Flatpak Steam unless you intentionally want to build out Exherbo multiarch/32-bit userspace. The native Steam installer package can install the launcher but still fail with missing 32-bit libc.so.6.
flatpak remotes
flatpak install flathub com.valvesoftware.Steam
flatpak run com.valvesoftware.Steam
# optional permissions for a games folder
flatpak override --user --filesystem=/path/to/games com.valvesoftware.Steam
If native Steam says libc.so.6 is missing, check with find /usr /lib /lib32 /usr/lib32 -name libc.so.6 -exec file {} \;. If only 64-bit libc exists, native Steam will not run yet.
UI polish that stops KDE feeling half-installed
| symptom | install/check | notes |
|---|---|---|
| missing settings pages | kde-frameworks/kcmutils, kde/kscreen, kde/powerdevil, kde/sddm-kcm |
KCMs are the System Settings modules. |
| missing network GUI | kde/plasma-nm, net-apps/NetworkManager |
Enable NetworkManager service. |
| missing audio applet | kde/plasma-pa, kde/pulseaudio-qt |
PipeWire can still expose PulseAudio compatibility. |
| bad icons | kde-frameworks/breeze-icons, gnome-desktop/adwaita-icon-theme, x11-themes/hicolor-icon-theme |
Some apps expect Adwaita or hicolor even on KDE. |
| GTK apps look wrong | x11-themes/breeze-gtk, kde/kde-gtk-config |
Set GTK theme from System Settings. |
| no wallpapers/sounds | kde/plasma-workspace-wallpapers, kde/ocean-sound-theme |
Small packages that make a desktop feel complete. |
| bare home directory | x11-apps/xdg-user-dirs |
Run xdg-user-dirs-update to create Documents, Music, Videos, Templates, and Public. |
theme refresh commands
lookandfeeltool -a org.kde.breeze.desktop 2>/dev/null || true
plasma-apply-colorscheme BreezeDark 2>/dev/null || true
plasma-apply-desktoptheme breeze-dark 2>/dev/null || true
plasma-apply-cursortheme breeze_cursors 2>/dev/null || true
kbuildsycoca6 --noincremental
gtk-update-icon-cache -f /usr/share/icons/hicolor 2>/dev/null || true
gtk-update-icon-cache -f /usr/share/icons/breeze 2>/dev/null || true
gtk-update-icon-cache -f /usr/share/icons/Adwaita 2>/dev/null || true
audio: ALSA first, then PipeWire
A complete modern desktop path needs kernel sound support, any device firmware, ALSA userspace, PipeWire, a session manager such as WirePlumber, and the PulseAudio compatibility service when desktop applications expect it.
cave search alsa-utils
cave search wireplumber
cave show media/pipewire
# after login as the desktop user
aplay -l
arecord -l
alsamixer
systemctl --user status pipewire wireplumber pipewire-pulse --no-pager
wpctl status
pactl info
| symptom | start here |
|---|---|
No cards in aplay -l | Kernel HDA/USB/SoundWire/SOF support, PCI/USB detection, firmware, and kernel log. |
| Card exists but is silent | Unmute in alsamixer, inspect the WirePlumber profile, then select the correct sink with wpctl. |
| HDMI audio missing | GPU audio function, display cable/receiver state, and the HDMI profile in wpctl status. |
| Microphone missing | arecord -l, capture mute/gain, selected source, and application portal permission. |
| Bluetooth audio unavailable | BlueZ service, adapter rfkill, PipeWire Bluetooth support/options, pairing, and selected codec/profile. |
laptop completion checklist
| area | verify | notes |
|---|---|---|
| battery and thermals | upower -d, powerprofilesctl, sensors | Use one power policy daemon. Competing tuners can continually overwrite each other. |
| suspend/resume | systemctl suspend, then journalctl -b -1 | Test from a TTY before trusting lid-close suspend. Check GPU, Wi-Fi, and storage resume separately. |
| hibernation | swap capacity, resume device/offset, initramfs resume support | Encrypted swap, swap files on Btrfs, and secure boot need extra planning. |
| lid and keys | loginctl, libinput debug-events | Coordinate logind lid policy with the desktop power manager to avoid double handling. |
| touchpad | libinput list-devices | Use the libinput input profile; configure gestures in the desktop or compositor. |
| radios | rfkill list, Bluetooth and Wi-Fi logs | Airplane-mode keys can leave a persistent soft or hardware block. |
| dock and displays | lsusb -t, compositor output tool, DRM log | USB-C mode, DisplayPort MST, Thunderbolt authorization, and hybrid-GPU wiring all matter. |
virtual machines: Exherbo guest and KVM host
| role | required pieces | verification |
|---|---|---|
| KVM guest | virtio block/SCSI, network, console, RNG, balloon, and optional virtio GPU drivers; root filesystem support | lspci -nnk, ip -br link, dmesg | grep -i virtio. |
| VMware/VirtualBox/Hyper-V guest | matching kernel guest drivers, clock source, storage/network driver, and optional integration tools | Check the hypervisor identity and bound drivers before installing vendor tools. |
| KVM host | CPU virtualization enabled in firmware, KVM kernel driver, QEMU, libvirt/management tools, bridge or NAT networking | lscpu | grep Virtualization, lsmod | grep kvm, virsh list --all. |
cave search qemu
cave search libvirt
cave search virt-manager
cave show category/candidate-package
cave resolve category/qemu-package category/management-package
Service names and group policy depend on the selected libvirt build. Inspect installed units and sockets with systemctl list-unit-files | grep -i virt. PCI passthrough requires IOMMU planning and can make the host lose access to a device; it is not a first-boot task.
leave the chroot and prove first boot
Before exiting, confirm the user, network service, filesystem table, kernel, initramfs, loader entry, and root filesystem UUID. Then leave the chroot and unmount in reverse order from the live system.
# inside chroot
getent passwd alice
findmnt --verify --verbose
ls -lh /boot/vmlinuz-* /boot/initramfs-*.img
grep -nE 'vmlinuz|initramfs|root=' /boot/grub/grub.cfg
exit
# live system
sudo umount -R /mnt/exherbo
sudo swapoff /dev/nvme0n1p2 # use the actual swap device
sudo reboot
At first boot, use a local TTY if the display manager fails. Verify the running kernel, root mount, network, clock, failed units, and boot errors before adding more packages:
uname -r
findmnt /
ip -br address
timedatectl
systemctl --failed
journalctl -b -p 3 --no-pager
CONFIG_PROTECT files
Exherbo protects local config files. When package updates provide a new config, Paludis may leave files like /etc/._cfg0000_hostname. Do not delete blindly; inspect and merge.
sudo find /etc -name '._cfg*' -print
for f in $(sudo find /etc -name '._cfg*' -print); do
echo "===== $f ====="
target="$(dirname "$f")/$(basename "$f" | sed 's/^._cfg[0-9]*_//')"
echo "TARGET: $target"
sudo diff -u "$target" "$f" 2>/dev/null || sudo cat "$f"
done
world updates without panic
sudo cave sync
# preview only
sudo cave resolve world
# execute only after reading the plan
sudo cave resolve --execute world
| letter | meaning | dummy translation |
|---|---|---|
n |
new install | Paludis wants to add a package. |
u |
upgrade | Version changes. |
r |
reinstall/rebuild | Same version, usually option drift or rebuild needed. |
< |
remove/purge candidate | Read carefully before taking. |
If world shows same-version r rebuilds after editing options.conf, it is usually not broken. It is trying to make installed package metadata match the current desired options.
post-update audit
uname -r
findmnt / /boot
ip -br address
systemctl --failed
journalctl -b -p 3 --no-pager
# graphical profiles
lspci -nnk | grep -A3 -E 'VGA|3D|Display'
glxinfo -B
echo "$XDG_CURRENT_DESKTOP / $XDG_SESSION_TYPE"
systemctl --user --failed
wpctl status
Good signs for any selected profile:
- The running kernel has a matching module tree and the intended root and boot filesystems are mounted.
- The expected GPU driver is bound and
glxinfo -Bnames hardware rather than llvmpipe. - PipeWire/WirePlumber, portals, and a display manager are checked only when that profile uses them.
- Laptops resume, reconnect networking, restore audio, and drive external displays after suspend.
- No priority error spam in
journalctl -b -p 3.
For proprietary NVIDIA, additionally run nvidia-smi and inspect /sys/module/nvidia_drm/parameters/modeset. For AMD, Intel, nouveau, and virtio, inspect the matching DRM driver in lspci -nnk and the kernel log instead.
common Exherbo failures by layer
| problem | likely layer | check |
|---|---|---|
cave sync or fetch fails |
clock, DNS, TLS, repository configuration | date -u, getent hosts, repository files, certificate error, and proxy settings. |
| resolution cannot produce a plan | masks, licenses, options, providers, repository availability | Read every unmet decision; use cave show on the named package instead of adding random global options. |
| source build fails | first compiler error, disk/RAM, tests, stale work | Save the complete build log, find the first real error, check df -h and memory, and reproduce one package. |
| kernel cannot mount root | storage/filesystem driver, root UUID, initramfs | Compare blkid, fstab, GRUB command line, initramfs contents, and the target kernel config. |
| firmware/GRUB skips Exherbo | UEFI mode, ESP mount, EFI entry, GRUB files | findmnt /boot, efibootmgr -v, find /boot/EFI -type f, and grub-mkconfig output. |
| black screen or llvmpipe | GPU binding, firmware, Mesa/vendor userspace, compositor | lspci -nnk, glxinfo -B, and kernel log filtered for the actual driver, DRM, and firmware. |
| network has no internet | radio/link, DHCP, route, DNS | Check rfkill, address, default route, numeric-IP ping, then getent hosts in that order. |
| sound absent or wrong output | kernel/firmware, ALSA, WirePlumber policy | aplay -l, alsamixer, user service status, then wpctl status. |
| Flatpak fails with FUSE | kernel config/modules | modprobe fuse, ls -lah /dev/fuse, find /lib/modules/$(uname -r) -name fuse.ko*. |
| application cannot screenshare | PipeWire/portal stack | User-service logs, one desktop-appropriate portal backend, PipeWire/WirePlumber, and session environment. |
| suspend resumes broken | GPU, Wi-Fi, storage, firmware, power policy | Reproduce from a TTY and inspect journalctl -b -1; test one suspect subsystem at a time. |
| desktop session missing | session desktop file | find /usr/share/xsessions /usr/share/wayland-sessions -maxdepth 1 -type f and display-manager logs. |
| update leaves system inconsistent | interrupted transaction, CONFIG_PROTECT, kernel/modules | Review the failed package and protected files, finish the world plan, then rebuild boot artifacts if kernel-facing packages changed. |
Collect a small evidence bundle before asking for help. Remove secrets, private hostnames, MAC addresses, and authentication data before posting it.
uname -a
cave print-id-environment
systemctl --failed
journalctl -b -p 3 --no-pager
lspci -nnk
findmnt
df -h
journalctl -b -p 3 has been reviewed.
Distro families and package notes.
A distro is a kernel plus userland plus packaging plus policy. The family matters because it decides package tools, service defaults, release rhythm, and documentation culture.
choosing a distro
Pick a distro based on hardware support, package freshness, release model, documentation, driver needs, and how much maintenance you want. The best distro is the one whose tradeoffs match the machine and the job.
common families
| family | docs | tools | good fit |
|---|---|---|---|
| Debian | Debian docs | apt, dpkg |
Stable servers, conservative desktops, and users who prefer a slow-moving base with a large package archive. |
| Ubuntu | Ubuntu docs | apt, dpkg, Snap |
General desktop use, hardware support, gaming setups, and people who want broad third-party software support. |
| Linux Mint | Mint docs | apt, dpkg |
Traditional desktop users, Windows switchers, and machines that need a comfortable out-of-box setup. |
| Pop!_OS | Pop!_OS docs | apt, dpkg |
Desktop users who want a polished GNOME-based workflow, System76 hardware support, and simple graphics setup. |
| Fedora | Fedora docs | dnf, rpm |
Modern Linux desktops, developers, GNOME users, and people who want fresh software without full rolling release behavior. |
| RHEL family | Rocky docs | dnf, rpm |
Servers, enterprise-style systems, long maintenance windows, and production-like lab environments. |
| AlmaLinux | AlmaLinux wiki | dnf, rpm |
RHEL-compatible servers and workstations with community governance and long-term stability. |
| Arch | Arch Wiki | pacman, PKGBUILD |
Users who want rolling packages, simple packaging, direct control, and excellent documentation. |
| EndeavourOS | EndeavourOS Discovery | pacman, AUR helpers |
Arch-style systems with a friendlier installer and fewer manual setup steps. |
| openSUSE | openSUSE docs | zypper, YaST |
Users who want strong admin tooling, snapshot-friendly setups, and a choice between stable and rolling tracks. |
| Gentoo | Gentoo Wiki | emerge, Portage, ebuilds |
People who want source-based control, USE flags, custom builds, and deep system learning. |
| Exherbo | Exherbo docs | cave, Paludis, exheres |
Advanced users who want a source-based system with explicit options, clean package metadata, and full control over boot, kernel, drivers, and desktop composition. |
| Alpine | Alpine docs | apk |
Containers, small systems, security-minded minimal installs, and users comfortable with musl and BusyBox. |
| Void | Void Handbook | xbps, runit |
Independent systems, fast package management, non-systemd setups, and users who like simple service supervision. |
| NixOS | NixOS Manual | nix, declarative config |
Reproducible systems, rollback-friendly machines, declarative configuration, and users willing to learn a different model. |
| Slackware | SlackDocs | pkgtool |
Traditional Unix-like Linux setups with minimal abstraction and old-school administration style. |
| MX Linux | MX manuals | apt, MX tools |
Stable desktop systems, older hardware, and users who want Debian-based convenience with helpful graphical tools. |
| Kali | Kali docs | apt, dpkg |
Security labs, penetration testing, training environments, and tool collections. Not the best choice for a normal daily desktop. |
release model notes
| model | what it means | tradeoff |
|---|---|---|
| stable | Packages change slowly and receive security fixes. | Predictable, but less fresh. |
| rolling | Packages continuously update. | Fresh, but requires more attention. |
| source based | Packages are commonly built locally from source. | Highly configurable, but time-consuming. |
| declarative | System state is described in configuration. | Reproducible, but requires learning the model. |
| enterprise clone | Tracks enterprise Linux compatibility. | Excellent for servers, less exciting for new desktop software. |
stable
Good for servers, boring laptops, and systems where surprise upgrades should not be part of the hobby.
rolling
Good for new hardware, fresh desktops, and users willing to read package transaction output.
source based
Good for learning internals, tuning options, and understanding what your toolchain is doing.
Links, manuals, and bookmarks.
A good Linux bookmark folder is worth more than a random tweak script. Start with primary docs, man pages, source browsers, and distro handbooks.
link policy
This page favors official documentation, source browsers, manuals, and long-lived project sites. Forum posts and random scripts can be useful, but primary docs should be checked first.
core documentation
distribution docs
desktop and graphics
related web
tux artwork
The header image links to Tux.svg on Wikimedia Commons. The image is loaded directly from Wikimedia's static upload host.