10 KiB
Gentoo Installation Procedure - Legion Laptop
Automated installation using Python scripts for Lenovo Legion laptops with AMD + NVIDIA hybrid graphics.
Hardware
Tested on Legion S7 15ACH6:
- CPU: AMD Ryzen 9 5900HX (16 threads, Zen 3)
- iGPU: AMD Radeon Vega (Cezanne)
- dGPU: NVIDIA GeForce RTX 3050 Ti Mobile
- RAM: 24GB DDR4
- Storage: NVMe with LUKS2 encryption
Should work on other Legion models with similar hardware.
Quick Start
Two commands handle the entire installation:
# Phase 1: Live environment -> chroot -> first reboot
python setup.py --install # Run once outside chroot, once inside
# Phase 2: After first boot
python setup.py --desktop # Installs Hyprland + optional fingerprint
--install auto-detects whether you're in the live environment or chroot:
- Outside chroot: Runs disk → stage3 → config → fstab → chroot
- Inside chroot: Runs sync → world → firmware → kernel → services → users → nvidia → bootloader
Idempotency
All commands are safe to re-run. If interrupted or if something fails:
- Simply run the same command again
- Completed steps are detected and skipped
- Partial state is handled gracefully (e.g., LUKS exists but not mounted)
Example: If world fails mid-compile, just run python setup.py --install again.
Pre-Installation
1. Prepare LUKS Passphrase
Generate a strong passphrase for disk encryption:
# Generate 56-char alphanumeric passphrase
openssl rand -base64 64 | tr -dc 'A-Za-z0-9' | head -c 56
Store securely (password manager, hardware key, offline backup).
2. Boot Live Environment
At GRUB menu, press e, add video=1920x1080 to the linux line (HiDPI fix), then Ctrl+X.
# Configure network
net-setup
# Verify DNS
ping -c 2 gentoo.org
3. Clone Repository
emerge --ask dev-vcs/git
git clone https://github.com/<your-username>/gentoo-legion-python /root/gentoo
cd /root/gentoo
Stage 1: Disk Setup (Pre-Chroot)
Run from live environment:
python setup.py
Select commands in order, or run individually:
1) disk - Partition, Encrypt, Mount
- Creates GPT partition table
- EFI partition (1GB)
- Swap partition (24GB)
- LUKS2 encrypted root (remaining space)
- Btrfs with subvolumes (@, @home, @var, @log, @snapshots)
- Mounts everything to /mnt/gentoo
Re-running: If LUKS already exists, you'll be prompted to reformat or reuse. Select reuse to skip destructive steps and just mount the existing setup.
2) stage3 - Download & Extract
- Fetches latest stage3-amd64-openrc tarball
- Verifies checksum
- Extracts to /mnt/gentoo
3) config - Copy Portage Configuration
Copies from portage/ to /mnt/gentoo/etc/portage/:
- make.conf
- package.use/
- package.accept_keywords/
- package.env/
- package.license/
- env/
- sets/
Also copies from repo root to /mnt/gentoo/etc/:
- dracut.conf.d/
4) fstab - Generate Filesystem Config
Generates:
- /etc/fstab (EFI, Btrfs subvolumes)
- /etc/conf.d/dmcrypt (encrypted swap)
5) chroot - Prepare & Enter
- Copies resolv.conf for network
- Mounts /proc, /sys, /dev, /run
- Enters chroot
Or run all pre-chroot steps:
python setup.py all
Stage 2: Base System (Inside Chroot)
After entering chroot, clone the repo:
# Sync portage first (needed to install anything)
emerge --sync
# Install git and clone repo
emerge --ask dev-vcs/git
git clone https://github.com/<your-username>/gentoo-legion-python /root/gentoo
cd /root/gentoo
python setup.py --install
The --install command will pick up where it left off (inside chroot it runs sync → world → ... → bootloader).
7) sync - Portage Sync & Profile
- Syncs portage tree (webrsync)
- Sets profile: default/linux/amd64/23.0/desktop
- Enables GURU overlay (required for Hyprland)
- Sets timezone (America/New_York)
- Configures locale (en_US.UTF-8)
- Sets hostname
- Activates encrypted swap for builds
Note: ccache is enabled automatically via FEATURES="ccache" in make.conf.
8) world - Update @world
emerge --ask --verbose --update --deep --newuse @world
This takes several hours. Swap is active to prevent OOM.
Circular Dependencies: After @world completes, the script automatically:
- Reads
package.use/circular-dependenciesfor temporarily disabled USE flags - Clears the file (keeps header comments)
- Rebuilds affected packages with full USE flags (freetype, harfbuzz, libwebp, pillow)
9) firmware - Install Linux Firmware
emerge sys-kernel/linux-firmware
10) kernel - Install Kernel
Choose:
gentoo-kernel-bin- Precompiled, fastestgentoo-kernel- Compiled locally
Dracut auto-generates initramfs with crypt + NVIDIA modules.
Stage 3: Services & Configuration
11) services - System Services
Installs and configures:
- System: sysklogd, cronie
- Network: NetworkManager, chrony, iptables
- Bluetooth: bluez, blueman
- Desktop: udisks, power-profiles-daemon, rtkit
- Display Manager: SDDM
- Containers: podman, podman-compose
- Backup: snapper
Configures OpenRC runlevels:
- boot: dbus, elogind, dmcrypt
- default: All services listed above
Copies from repo:
conf.d/→/etc/conf.d/(dmcrypt, iptables, snapper configs)iptables/→/var/lib/iptables/rules-saveand/var/lib/ip6tables/rules-saveudev/→/etc/udev/rules.d/(power profile rules)
12) users - Shell & User Setup
Installs shell tools:
- zsh, zsh-autosuggestions, zsh-syntax-highlighting
- starship, zoxide, fzf, lsd
- gentoolkit, portage-utils, eix
Then:
- Copies .zshrc and starship.toml to /root
- Sets root shell to zsh
- Prompts for root password
- Configures sudo (enables wheel group)
- Creates user with groups: users, wheel, input
- Copies shell config to user home
- Prompts for user password
Stage 4: Graphics & Bootloader
13) nvidia - NVIDIA Drivers
- Installs nvidia-drivers
- Blacklists nouveau (
/etc/modprobe.d/blacklist-nouveau.conf) - Configures DRM modeset (
/etc/modprobe.d/nvidia.conf) - Copies dracut nvidia.conf for early KMS
- Optionally rebuilds initramfs
- Verifies NVIDIA modules in initramfs
14) bootloader - GRUB Installation
- Copies dracut crypt.conf for LUKS support
- Installs GRUB
- Installs to EFI partition (--bootloader-id=Gentoo)
- Configures /etc/default/grub:
GRUB_CMDLINE_LINUX_DEFAULT="nvidia_drm.modeset=1 acpi_backlight=native"GRUB_ENABLE_CRYPTODISK=yGRUB_GFXMODE=1920x1080(HiDPI fix)
- Generates grub.cfg
- Verifies initramfs - checks for crypt/LUKS and NVIDIA modules
First Boot
After GRUB, you'll be prompted for your LUKS passphrase, then login as root.
Connect to WiFi
NetworkManager has no saved connections yet. Use the TUI:
nmtui
Select Activate a connection → choose your network → enter password.
Or via command line:
nmcli device wifi list
nmcli device wifi connect "YourSSID" password "YourPassword"
Verify connectivity:
ping -c 2 gentoo.org
Clone Repository (as user)
Switch to your user account and clone the repo:
su - <username>
git clone https://github.com/<your-username>/gentoo-legion-python ~/gentoo
Stage 5: Desktop Environment
Install Hyprland Desktop
As your user (not root):
sudo emerge --ask @hyprland
This installs:
- Hyprland compositor
- Waybar, swaync, rofi, wlogout
- Qt/GTK theming (Kvantum, qt5ct, qt6ct)
- Fonts (Nerd Fonts, JetBrains Mono, etc.)
- Media tools (mpv, ffmpeg)
- File manager (Nautilus)
- And more...
Post-Install Configuration
Copy Hyprland configs for multi-monitor setup:
# GPU auto-detect (comment out explicit AQ_* settings)
cp ~/gentoo/hypr/ENVariables.conf ~/.config/hypr/UserConfigs/
# Triple monitor layout (customize for your setup)
cp ~/gentoo/hypr/monitors.conf ~/.config/hypr/
15) fingerprint - Fingerprint Authentication (Optional)
python setup.py fingerprint
Sets up the Elan fingerprint reader (04f3:0c4b) for authentication:
- Installs
fprintdandlibfprintpackages - Downloads Lenovo TOD driver (
libfprint-2-tod1-elan.so) - Enrolls fingerprints for user
- Configures PAM for SDDM and hyprlock
Usage after setup:
- SDDM/hyprlock: Press Enter on empty password field to activate fingerprint
- Enroll more fingers:
fprintd-enroll -f <finger> <username> - Test:
fprintd-verify <username>
Note: Fingerprint is configured as an alternative to password, not a replacement.
Utilities
Swap Management
python setup.py swap-on # Activate encrypted swap
python setup.py swap-off # Deactivate encrypted swap
Swap auto-activates during sync for heavy builds.
Quick Reference
Complete Installation Order
Pre-chroot (live environment):
disk → stage3 → config → fstab → chroot
Inside chroot:
sync → world → firmware → kernel → services → users → nvidia → bootloader
After reboot:
nmtui (connect WiFi) → su - <username> → emerge @hyprland → configure Hyprland
Troubleshooting
Command failed mid-way: Just run the same command again. All commands are idempotent and will skip completed steps.
Build OOM: Activate swap with python setup.py swap-on
Initramfs missing modules: Run python setup.py bootloader to verify
NVIDIA not loading: Check /etc/modprobe.d/ configs, rebuild initramfs with dracut --force
Firewall not active: Verify /var/lib/iptables/rules-save exists
USE flag / keyword changes: Handled automatically. The installer uses --autounmask-write and auto-dispatches config changes on retry.
Disk already partitioned: The disk command detects existing LUKS and offers to reuse it instead of reformatting.
WiFi not working after reboot: Ensure NetworkManager service is running (rc-service NetworkManager status). Check nmcli device to see if the WiFi adapter is recognized.
File Locations
| Config | Location |
|---|---|
| Portage | /etc/portage/ |
| Dracut | /etc/dracut.conf.d/ |
| Firewall rules | /var/lib/iptables/rules-save |
| NVIDIA modprobe | /etc/modprobe.d/nvidia.conf |
| GRUB | /etc/default/grub |
| Shell config | ~/.zshrc, ~/.config/starship.toml |