Instalação de Gentoo com Cinnamon

O artigo foi feito e testado usando o live-USB do Linux Mint 22.3.

O objetivo desta instalação é a praticidade, comodidade e não desempenho. Trata-se de uma instalação genérica com muitos pacotes binários.

Sem mais enrolação, vamos lá.

Definição do Disco (SATA ou NVMe)

Antes de iniciar a definição de variáveis, entre como root para evitar que as variáveis sejam apagadas da memória ao trocar de usuário no meio do processo:

Terminal
sudo -i

Agora, precisamos dizer ao sistema qual disco será utilizado. Se o seu disco for um NVMe, usaremos o identificador nvme0n1. Se for um SSD ou HD SATA, usaremos sda.

Execute o comando abaixo que corresponde ao seu hardware. Isso criará uma variável na memória do terminal que será usada em todos os próximos passos:

Para NVMe:

Terminal
DISCO="/dev/nvme0n1"

Para SATA:

Terminal
DISCO="/dev/sda"

Para manter a automação e evitar que você tenha que lidar com a diferença de nomenclatura entre SATA (sda1) e NVMe (nvme0n1p1), utilizaremos uma técnica de manipulação de strings no Shell.

Abaixo está a lógica para capturar os nomes das partições automaticamente em variáveis, garantindo que o seu guia funcione universalmente.

Definição das Partições

Após o particionamento, execute o bloco de comandos abaixo. Ele identificará se o seu disco é NVMe ou SATA e ajustará os nomes das partições (p1 ou 1, etc.) automaticamente:

Terminal
# Se o disco for NVMe, usa "p" (ex: nvme0n1p1). Se for SATA, o sufixo fica vazio (ex: sda1).
if echo "$DISCO" | grep -q "nvme"; then P="p"; else P=""; fi

# Cria variáveis para cada partição baseada no disco selecionado
PART_EFI="${DISCO}${P}1"
PART_BOOT="${DISCO}${P}2"
PART_ROOT="${DISCO}${P}3"

Preparação dos discos

Arquitetura FINAL

A ideia central é a seguinte: EFI e /boot ficam fora da criptografia. Todo o sistema fica dentro de um LUKS2.

Atenção: em NVMe as partições são p1, p2, p3. Em SATA fica 1, 2 e 3.

Limpar e particionar o disco (UEFI)

Terminal
wipefs -a $DISCO

parted -s $DISCO mklabel gpt

EFI

Terminal
parted -s $DISCO mkpart EFI fat32 1MiB 1025MiB
parted -s $DISCO set 1 esp on

/boot fora do LUKS

Terminal
parted -s $DISCO mkpart BOOT ext4 1025MiB 2049MiB

root criptografado

Terminal
parted -s $DISCO mkpart ROOT 2049MiB 100%

lsblk $DISCO

Formatação + LUKS2 (Argon2id)

Terminal
mkfs.vfat -F 32 $PART_EFI
mkfs.ext4 $PART_BOOT

cryptsetup luksFormat --type luks2 --pbkdf argon2id --pbkdf-memory 262144 --pbkdf-parallel 2 $PART_ROOT

cryptsetup open $PART_ROOT cryptroot

Btrfs + subvolumes

Terminal
mkfs.btrfs /dev/mapper/cryptroot
mount /dev/mapper/cryptroot /mnt
btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@home
btrfs subvolume create /mnt/@snapshots
umount /mnt

Montagem FINAL

Terminal
mkdir -p /mnt/gentoo
mount -o subvol=@,compress=zstd /dev/mapper/cryptroot /mnt/gentoo
mkdir -p /mnt/gentoo/{home,.snapshots,boot}
mount -o subvol=@home,compress=zstd /dev/mapper/cryptroot /mnt/gentoo/home
mount -o subvol=@snapshots,compress=zstd /dev/mapper/cryptroot /mnt/gentoo/.snapshots
mount $PART_BOOT /mnt/gentoo/boot
mkdir -p /mnt/gentoo/boot/efi
mount $PART_EFI /mnt/gentoo/boot/efi

Persistência de Variáveis para o Chroot

Para que os próximos passos encontrem as partições corretas dentro do ambiente isolado, injetamos as variáveis através de um script de inicialização do perfil:

Terminal
mkdir -p /mnt/gentoo/etc/profile.d/
cat << EOF > /mnt/gentoo/etc/profile.d/install_vars.sh
export DISCO="${DISCO}"
export PART_EFI="${PART_EFI}"
export PART_BOOT="${PART_BOOT}"
export PART_ROOT="${PART_ROOT}"
EOF

Stage + chroot

Aqui instalamos o Gentoo base.

Terminal
cd /mnt/gentoo

Abra o navegador e acesse: https://www.gentoo.org/downloads/

Copie o link do Stage "desktop profile | systemd". Baixe o Stage3 e execute:

Terminal
wget -c [URL_DO_STAGE]

Em seguida, extraia o stage e prepare o ambiente chroot:

Terminal
tar xpvf stage3-*.tar.xz --xattrs-include='*.*' --numeric-owner
cp --dereference /etc/resolv.conf /mnt/gentoo/etc/
mount --types proc /proc /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys && mount --make-rslave /mnt/gentoo/sys
mount --rbind /dev /mnt/gentoo/dev && mount --make-rslave /mnt/gentoo/dev
mount --bind /run /mnt/gentoo/run && mount --make-slave /mnt/gentoo/run
chroot /mnt/gentoo /bin/bash

Por fim, recarregue o perfil. Isto ativará as variáveis de disco automaticamente:

Terminal
source /etc/profile

Make.conf

Crie ou sobrescreva o make.conf utilizando o bloco abaixo. Remova o caractere # da opção VIDEO_CARDS que corresponde ao fabricante da sua placa de vídeo.

Terminal
cat << 'EOF' > /etc/portage/make.conf
COMMON_FLAGS="-O2 -pipe -march=native"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"

MAKEOPTS="-j16 -l16"

# Baixar binários sempre que possível
FEATURES="getbinpkg"
EMERGE_DEFAULT_OPTS="--getbinpkg --binpkg-respect-use=y"

# Vídeo: Descomente a linha referente à sua placa de vídeo
# Para AMD (Radeon):
#VIDEO_CARDS="amdgpu radeonsi"
# Para Intel:
#VIDEO_CARDS="intel i965 iris"
# Para NVIDIA (Drivers proprietários):
#VIDEO_CARDS="nvidia"

# Opcional, mas recomendado pra desktop moderno
ACCEPT_LICENSE="*"
EOF

Atenção: troque o valor do MAKEOPTS pelo valor que sair no comando nproc para adequar à quantidade de threads do seu processador.

Sincronização

Terminal
emerge-webrsync
getuto

Atualize o sistema base:

Terminal
emerge --ask --update --deep --newuse @world

Ferramentas, Discos e Boot

Instale os utilitários do sistema, ferramentas de criptografia, sistema de arquivos Btrfs e o gerenciador de boot:

Terminal
emerge -aq eix flaggie gentoolkit sys-fs/cryptsetup sys-fs/btrfs-progs sys-boot/grub sys-boot/efibootmgr

Rede (NetworkManager)

Instale o gerenciador de rede de forma explícita para garantir a conectividade no primeiro boot do ambiente gráfico:

Terminal
emerge --ask net-misc/networkmanager

Firmware (Placa de vídeo, Wi-Fi e Processador)

Este passo é vital antes de instalar o kernel. O pacote linux-firmware fornece os blobs proprietários necessários para que o hardware funcione corretamente.

Terminal
emerge --ask sys-kernel/linux-firmware

systemd com suporte a cryptsetup

Este passo é essencial. Sem ele, o boot pode falhar com erros do tipo: Failed to start systemd-cryptsetup@cryptroot.service

Garanta que o systemd seja compilado com a flag cryptsetup:

Terminal
echo "sys-apps/systemd cryptsetup" > /etc/portage/package.use/systemd-cryptsetup

emerge --ask --changed-use sys-apps/systemd

Criando a configuração do dracut

Terminal
mkdir -p /etc/dracut.conf.d

cat << 'EOF' > /etc/dracut.conf.d/10-gentoo-luks-btrfs.conf
# Gentoo + dracut + LUKS + Btrfs
# Initramfs automático para gentoo-kernel-bin

# Módulos necessários no initramfs
add_dracutmodules+=" crypt btrfs "
EOF

Obtendo o UUID do LUKS e Gerando o /etc/default/grub

Terminal
UUID_LUKS="$(blkid -s UUID -o value $PART_ROOT)"

Agora gere o conteúdo do /etc/default/grub:

Terminal
cat << EOF > /etc/default/grub
GRUB_DISTRIBUTOR="Gentoo"
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="rd.luks.uuid=${UUID_LUKS} rd.luks.name=${UUID_LUKS}=cryptroot root=/dev/mapper/cryptroot rootfstype=btrfs rootflags=subvol=@"
GRUB_DISABLE_LINUX_UUID=true
GRUB_DISABLE_LINUX_PARTUUID=true
EOF

Gerando o initramfs

Antes de instalar o kernel, garanta que as partições de boot estão montadas corretamente para evitar que o kernel seja salvo no diretório raiz e o GRUB não o encontre:

Terminal
mountpoint -q /boot || mount $PART_BOOT /boot
mountpoint -q /boot/efi || mount $PART_EFI /boot/efi

Certifique-se de que o installkernel utilizará o dracut:

Terminal
flaggie sys-kernel/installkernel +dracut

Deixe o processo automático acontecer ao atualizar o kernel. Como o linux-firmware já foi instalado, o dracut incluirá o microcódigo e os módulos de vídeo no initramfs automaticamente:

Terminal
emerge --ask sys-kernel/gentoo-kernel-bin virtual/dist-kernel

Após a instalação, extraia a versão do kernel compilado em /usr/src e copie o arquivo binário correspondente para a pasta /boot:

Terminal
KERNEL_DIR=$(ls -d /usr/src/linux-*-gentoo-dist | head -n 1)
KERNEL_VER=$(basename "$KERNEL_DIR" | sed 's/linux-//')
cp "$KERNEL_DIR/arch/x86/boot/bzImage" "/boot/vmlinuz-${KERNEL_VER}"

Verifique se o kernel foi gerado corretamente. A lista abaixo deve conter os arquivos "vmlinuz-..." e "initramfs-...":

Terminal
ls -lh /boot

GRUB

Terminal
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=Gentoo --recheck

sh -c 'echo "GRUB_THEME="/boot/grub/themes/gentoo_glass/theme.txt"" >> /etc/default/grub'

grub-mkconfig -o /boot/grub/grub.cfg

fstab

É necessário capturar o UUID do Btrfs antes de gerar o arquivo fstab. Execute:

Terminal
BTRFS_UUID="$(blkid -s UUID -o value /dev/mapper/cryptroot)"

O comando "cat" a seguir vai escrever o arquivo fstab automaticamente, com os identificadores corretos para o Btrfs (0 0).

Terminal
cat << EOF > /etc/fstab
$PART_EFI /boot/efi vfat defaults,noatime 0 2
$PART_BOOT /boot ext4 defaults,noatime 0 2
UUID=${BTRFS_UUID} / btrfs rw,subvol=@,compress=zstd,noatime 0 0
UUID=${BTRFS_UUID} /home btrfs rw,subvol=@home,compress=zstd,noatime 0 0
UUID=${BTRFS_UUID} /.snapshots btrfs rw,subvol=@snapshots,compress=zstd,noatime 0 0
EOF

Timezone + Locale (Brasil)

Aqui usei Recife, mas use a sua capital. Verifique as opções:

Terminal
ls /usr/share/zoneinfo/America/

ln -sf /usr/share/zoneinfo/America/Recife /etc/localtime

echo "pt_BR.UTF-8 UTF-8" >> /etc/locale.gen
locale-gen
eselect locale set pt_BR.utf8
env-update && source /etc/profile
echo "LANG=pt_BR.UTF-8" > /etc/locale.conf

Teclado ABNT2

No ambiente chroot, os daemons do systemd não estão em execução. Utilize os arquivos de configuração para definir o layout do teclado de forma definitiva.

Para o console virtual:

Terminal
echo "KEYMAP=br-abnt2" > /etc/vconsole.conf

Para o ambiente gráfico (X11):

Terminal
mkdir -p /etc/X11/xorg.conf.d
cat << 'EOF' > /etc/X11/xorg.conf.d/00-keyboard.conf
Section "InputClass"
        Identifier "system-keyboard"
        MatchIsKeyboard "on"
        Option "XkbLayout" "br"
        Option "XkbModel" "abnt2"
EndSection
EOF

Input (USB, teclado, mouse)

Terminal
emerge --ask sys-apps/kbd sys-apps/hwdata sys-apps/usbutils x11-base/xorg-server x11-drivers/xf86-input-libinput sys-auth/polkit

Usuário, sudo e senhas

Usei usuário "xerxes", mude para o seu usuário.

Terminal
emerge app-admin/sudo

echo "%wheel ALL=(ALL:ALL) ALL" >> /etc/sudoers

useradd -m -G wheel,audio,video -s /bin/bash xerxes

passwd xerxes

passwd

Cinnamon

Instale o Cinnamon:

Terminal
flaggie dev-libs/libxmlb +introspection
flaggie x11-libs/xapp +introspection
flaggie dev-libs/libdbusmenu +gtk3

emerge --ask gnome-extra/cinnamon x11-misc/lightdm x11-misc/lightdm-gtk-greeter x11-misc/xdg-user-dirs
Terminal
su - [seu_usuario]
Terminal
cat << EOF >> ~/.xinitrc
# Atualiza as pastas do usuário no início da sessão
xdg-user-dirs-update
EOF
Terminal
exit

Configure o LightDM:

Terminal
mkdir -p /etc/lightdm/lightdm.conf.d/
cat << "EOF" > /etc/lightdm/lightdm.conf.d/50-greeter.conf
[Seat:*]
greeter-session=lightdm-gtk-greeter
EOF
Terminal
systemctl enable lightdm.service NetworkManager.service

Permissões de Energia (Polkit + systemd)

Para que os usuários do grupo wheel possam desligar ou reiniciar a máquina diretamente pela interface do Cinnamon utilizando o logind do systemd, crie a regra abaixo:

Terminal
mkdir -p /etc/polkit-1/rules.d/
cat << "EOF" > /etc/polkit-1/rules.d/55-systemd-power.rules
polkit.addRule(function(action, subject) {
    if ((action.id == "org.freedesktop.login1.power-off" ||
         action.id == "org.freedesktop.login1.power-off-multiple-sessions" ||
         action.id == "org.freedesktop.login1.reboot" ||
         action.id == "org.freedesktop.login1.reboot-multiple-sessions" ||
         action.id == "org.freedesktop.login1.suspend" ||
         action.id == "org.freedesktop.login1.hibernate") &&
        subject.isInGroup("wheel")) {
        return polkit.Result.YES;
    }
});
EOF

Apps extras:

Terminal
emerge --ask app-arch/file-roller gnome-extra/nemo-fileroller app-arch/p7zip app-arch/unrar app-arch/zip app-arch/unzip app-arch/cabextract app-arch/zstd app-arch/lz4 app-arch/lzip app-arch/lrzip media-gfx/flameshot x11-terms/sakura gnome-extra/gnome-calculator dev-util/geany

Áudio (PipeWire)

Utilizaremos PipeWire + WirePlumber e não PulseAudio puro.

Terminal
emerge --ask media-video/pipewire media-video/wireplumber media-libs/alsa-lib media-plugins/alsa-plugins media-sound/alsa-utils

# Habilita o áudio globalmente para todos os usuários
systemctl --global enable pipewire pipewire-pulse wireplumber

Bluetooth

Terminal
emerge --ask net-wireless/blueman

systemctl enable bluetooth

Lembrete: após logar, se tiver dificuldade para parear seu fone bluetooth, lembre-se de segurar o botão do bluetooth por um tempo para que ele fique disponível para nova conexão.

Flatpak + Flathub

Terminal
emerge --ask sys-apps/flatpak

flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

Reinicie a sessão (logout/login).

Codecs

Terminal
emerge --ask media-video/ffmpeg media-libs/gst-plugins-base media-libs/gst-plugins-good media-libs/gst-plugins-bad media-libs/gst-plugins-ugly

Overlay GURU

Adicionar o overlay GURU ao Gentoo é um processo simples, recomendado para acessar ebuilds mantidos pela comunidade.

Terminal
emerge --ask dev-vcs/git app-eselect/eselect-repository

eselect repository enable guru

emaint sync -r guru

Se pretende usar o doomretro, habilite o xerxes-overlay:

Terminal
eselect repository enable xerxes-overlay
emaint sync -r xerxes-overlay
emerge -qa games-fps/doomretro

ou autorizando via flaggie:

Terminal
flaggie =games-fps/doomretro-9999 +**
emerge -qa =games-fps/doomretro-9999

Zram

Zram cria um dispositivo de swap comprimido na RAM, que é muito mais rápido que o swap em arquivo.

Terminal
emerge --ask sys-apps/zram-generator

Crie o arquivo /etc/systemd/zram-generator.conf. O arquivo usa o algoritmo zstd (melhor compressão) e define o tamanho como 2x a RAM física para tentar atingir o requisito total de memória.

Terminal
cat << EOF > /etc/systemd/zram-generator.conf
[zram0]
zram-size = ram * 2
compression-algorithm = zstd
swap-priority = 100
fs-type = swap
EOF

Timeshift

Se você optar por usar Btrfs + Timeshift e tem swapfile, os snapshots vão falhar. Solução: remova o swapfile e use apenas zram.

Terminal
swapoff /swapfile
rm -f /swapfile

Edite o /etc/fstab e remova ou comente a linha correspondente ao swapfile antigo. Ative o zram como mostrado antes.

Terminal
eselect repository enable guru
emaint sync -r guru
emerge -qa app-backup/timeshift

Opcionalmente altere o swappiness. Isso favorece zram antes de matar processos:

Terminal
mkdir -p /etc/sysctl.d
echo "vm.swappiness=180" > /etc/sysctl.d/99-zram.conf
sysctl -p /etc/sysctl.d/99-zram.conf

Reiniciando

Saia do chroot e reinicie o sistema:

Terminal
exit
reboot

Pós-instalação

Após reiniciar e logar no seu novo sistema, abra o terminal e instale o navegador Firefox (versão binária pré-compilada):

Terminal
sudo emerge --ask www-client/firefox-bin

Instale também Steam, Brave e Google Chrome via Flatpak:

Terminal
flatpak install flathub com.valvesoftware.Steam com.brave.Browser com.google.Chrome

Configuração da Fonte Hack e Terminal Sakura

Instale a fonte Hack e configure o sistema para lidar com emojis em fontes monoespaçadas. Crie as regras via `cat` apontando para o arquivo de configuração e atualize o cache de fontes. Por fim, configure o terminal Sakura para utilizar a fonte instalada.

Terminal
sudo emerge --ask media-fonts/hack

mkdir -p ~/.config/fontconfig/conf.d/

cat << 'EOF' > ~/.config/fontconfig/conf.d/99-emoji.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <match target="pattern">
    <test name="family"><string>monospace</string></test>
    <edit name="family" mode="append"><string>Noto Color Emoji</string></edit>
  </match>
</fontconfig>
EOF

fc-cache -f -v

mkdir -p ~/.config/sakura
touch ~/.config/sakura/sakura.conf
if grep -q "^font=" ~/.config/sakura/sakura.conf; then
    sed -i 's/^font=.*/font=Hack 11/' ~/.config/sakura/sakura.conf
else
    echo "font=Hack 11" >> ~/.config/sakura/sakura.conf
fi

Tema Colloid (GTK/Cinnamon e Ícones)

O tema Colloid altera o aspecto visual da interface e dos ícones. Os comandos abaixo clonam os repositórios, executam os scripts de instalação e removem os arquivos temporários. Em seguida, o tema escuro é aplicado através da ferramenta gsettings.

Tema da Interface (GTK/Cinnamon):

Terminal
git clone https://github.com/vinceliuice/Colloid-gtk-theme.git ~/Downloads/Colloid-temp
cd ~/Downloads/Colloid-temp
./install.sh -t all
cd - && rm -rf ~/Downloads/Colloid-temp

Tema de Ícones:

Terminal
git clone https://github.com/vinceliuice/Colloid-icon-theme.git ~/Downloads/Colloid-icon-temp
cd ~/Downloads/Colloid-icon-temp
./install.sh -s all -t all
cd - && rm -rf ~/Downloads/Colloid-icon-temp

Aplicação do Tema Escuro via Terminal:

Terminal
gsettings set org.cinnamon.desktop.interface gtk-theme "Colloid-Dark"
gsettings set org.cinnamon.desktop.wm.preferences theme "Colloid-Dark"
gsettings set org.cinnamon.theme name "Colloid-Dark"
gsettings set org.cinnamon.desktop.interface icon-theme "Colloid"

Otimizando o Wi-Fi com iwd

O iwd (iNet Wireless Daemon) substitui o wpa_supplicant e melhora a detecção de redes Wi-Fi (como em adaptadores USB) integrando-se de forma mais eficiente ao NetworkManager no Gentoo com systemd.

Habilite a USE flag e recompile o NetworkManager:

Terminal
echo "net-misc/networkmanager iwd -wext" | sudo tee /etc/portage/package.use/networkmanager
sudo emerge --ask --changed-use net-misc/networkmanager

Instale e ative o iwd:

Terminal
sudo emerge --ask net-wireless/iwd
sudo systemctl enable --now iwd

Configure o backend do NetworkManager para usar o iwd:

Terminal
sudo mkdir -p /etc/NetworkManager/conf.d/
sudo tee /etc/NetworkManager/conf.d/wifi_backend.conf > /dev/null << 'EOF'
[device]
wifi.backend=iwd
EOF

Reinicie o NetworkManager e desative o wpa_supplicant:

Terminal
sudo systemctl restart NetworkManager
sudo systemctl disable --now wpa_supplicant

Autologin no LightDM

Para iniciar a sessão automaticamente sem precisar digitar a senha, crie o grupo autologin e adicione o seu usuário (substitua xerxes pelo seu usuário):

Terminal
sudo groupadd autologin
sudo gpasswd -a xerxes autologin

Verifique o nome exato da sessão disponível (o nome do arquivo sem a extensão .desktop):

Terminal
ls /usr/share/xsessions/

Crie um arquivo de configuração dedicado para o autologin. Isso evita a necessidade de editar o arquivo principal com editores de texto. Substitua xerxes e cinnamon conforme a sua configuração:

Terminal
sudo tee /etc/lightdm/lightdm.conf.d/60-autologin.conf > /dev/null << 'EOF'
[Seat:*]
autologin-user=xerxes
autologin-session=cinnamon
autologin-user-timeout=0
EOF

Mudar o Portage para usar Git

O uso do Git para sincronizar o Portage é muito mais rápido que o rsync padrão. Execute os comandos abaixo para alterar as configurações e fazer a primeira sincronização:

Terminal
sudo mkdir -p /etc/portage/repos.conf
sudo tee /etc/portage/repos.conf/gentoo.conf > /dev/null << 'EOF'
[DEFAULT]
main-repo = gentoo

[gentoo]
location = /var/db/repos/gentoo
sync-type = git
sync-uri = https://anongit.gentoo.org/git/repo/sync/gentoo.git
auto-sync = yes
EOF

Agora apague a árvore antiga e sincronize a nova via Git:

Terminal
sudo rm -rf /var/db/repos/gentoo
sudo emaint sync -a