Arch Linux (en dual boot)

sept 7, 2020·
Julio Batista Silva
Julio Batista Silva
· 29 min de lectura
blog

Como mi trabajo de consultoría depende mucho de herramientas de Microsoft como Office y Power BI, últimamente uso Windows como sistema operativo principal.

Sigo programando bastante y, para mi sorpresa, desarrollar en Windows va muy bien. Cuando necesito ejecutar algo que depende de Linux, como Airflow o Redmine, puedo usar WSL y Docker.

Uno de los problemas de virtualizar Linux es la pérdida de rendimiento. Por eso aparté unos 60 GB para instalar Arch en dual boot en mi portátil.

Escribí en Twitter que estaba instalando Arch y me sugirieron actualizar mi guía antigua, porque han cambiado muchas cosas en 8 años. Así que decidí romper el parón de más de 3 años de este blog para documentar mi nuevo proceso de instalación.

Cuando escribí la entrada de 2012, la wiki oficial no estaba al día. Hoy está muy completa y recomiendo seguirla para posibles actualizaciones y más detalles.

Como en las entradas anteriores, dejo claro que esta es la configuración que elegí para mis ordenadores (un Dell Latitude 3480 y un Acer Predator Helios 300).
Algunos ajustes de aquí pueden ser incompatibles con tu sistema o simplemente innecesarios según el entorno de escritorio que uses.

¡No copies y pegues comandos sin entenderlos antes!

No entraré en muchos detalles sobre los comandos usados. Encontrarás más información sobre ellos en internet y en la wiki oficial.
Si tienes alguna duda o sugerencia, no dudes en dejar un comentario aquí o mandarme un DM por Twitter.

Actualización: desde mayo de 2021 la imagen ISO de Arch incluye un instalador guiado llamado Archinstall. Como ya estoy acostumbrado, seguiré con la instalación manual.

Particionado del disco

Instalé Windows primero y, durante la instalación, particioné el SSD de 240 GB así:

  • 529 MB: Windows Recovery
  • 500 MB: EFI (mayor que la de por defecto)
  • 150 GB: Windows
  • 60 GB: Arch Linux
  • El resto: partición NTFS cifrada con Veracrypt para acceder tanto desde Linux como desde Windows

No creé una partición de swap. Si algún día la necesito, podré crear un archivo de intercambio en el disco, en memoria o en la memoria de la tarjeta gráfica.

También dejé /, /home y /var en la misma partición. El /boot será la partición EFI de 500 MB. Por defecto Windows crea esa partición con 100 MB, pero puede no ser suficiente si quieres cargar muchos módulos o tener más de un kernel.

Si no hubiera creado las particiones desde Windows, podría usar alguna herramienta de Linux como cgdisk o parted

USB de instalación

Descargué la imagen ISO por BitTorrent y creé el USB arrancable con las opciones por defecto de Rufus Portable. Reinicié el ordenador y fui pulsando F12 hasta que apareció la lista con la opción de arrancar desde el pendrive. Al elegir instalar Arch salió un mensaje diciendo que esperaba un disco con LABEL=ARCH202008. Simplemente volví a conectar el pendrive al puerto USB y el sistema cargó bien.

Distribución del teclado

Al caer en el terminal, el primer paso es configurar el teclado. Como uso un teclado brasileño, ejecuté este comando:

  • Para teclado brasileño:

    loadkeys br-abnt2
    
  • Para teclado estadounidense:

    loadkeys us-acentos
    

Encontrarás otras opciones con ls /usr/share/kbd/keymaps/**/*.map.gz.

Actualización del reloj del sistema

timedatectl set-ntp true

Linux deja por defecto el reloj del hardware en UTC, mientras que Windows usa la hora local. Yo prefiero dejarlo en UTC y configurar Windows desde el Regedit.

Cifrado del disco

lsblk                       # Para descobrir a partição. /dev/sda5 no meu caso
cryptsetup -v luksFormat /dev/sda5

A mí la configuración por defecto me pareció bien. Hay más opciones en la wiki.

Si lsblk no lista tu SSD (M.2 PCIe NVMe), comprueba en la BIOS que el SATA Mode está en AHCI. Si Windows se instaló en modo RAID, tendrás que reiniciarlo en modo seguro y cambiar el SATA Mode en la BIOS.

Formateo de la partición raíz

cryptsetup luksOpen /dev/sda5 arch
mkfs.ext4 -L arch /dev/mapper/arch

Montaje de las particiones

mount /dev/mapper/arch /mnt
mkdir /mnt/boot
mount /dev/sda2 /mnt/boot

Conexión a internet

  • Wifi

    Conéctate al wifi con iwd

    iwctl --passphrase MINHA_SENHA station wlan0 connect MEU_SSID
    
  • Cable

    Las redes por cable deberían funcionar solas. Si no es el caso:

    • Configura una IP fija con Iproute2

    • Obtén una IP dinámica por DHCP: systemctl start dhcpcd@enp2s0.

      Usa ip link para averiguar el nombre de la interfaz.

Mirrorlist

Pacman lee el archivo /etc/pacman.d/mirrorlist para decidir de qué mirrors descargar los paquetes. Conviene dejar arriba los más actualizados y rápidos para que las descargas no tarden mucho.

El nuevo instalador de Arch debería hacerlo automáticamente con Reflector en cuanto detecte la conexión a internet. Solo hay que comprobar que está todo bien. Como estoy en São Paulo, los mirrors de la UFSCar y la UFPR quedaron arriba.

Instalación de los paquetes principales

En este paso instalo el sistema base y todos los paquetes que necesitaré: herramientas de red, editor de texto, páginas de manual, Xorg y PulseAudio.

pacstrap /mnt \
    base{,-devel} \
    linux{,-firmware} \

    intel-ucode \

    iwd \
    dhcpcd \
    iputils \

    zsh \
    go \
    git \
    neovim \
    python{,-pip,-pynvim} \

    man-db \
    man-pages \
    texinfo \

    xorg-server \
    xorg-xinit \
    xf86-video-intel \
    xf86-input-synaptics \

    alsa-utils \
    pipewire{,-pulse}
    wireplumber
    # pulseaudio{,-alsa,-bluetooth} \
    # pavucontrol

Fstab

genfstab -U -p /mnt >> /mnt/etc/fstab

Chroot

arch-chroot /mnt

Zona horaria

  • Brasil

    ln -sf /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime
    
  • Alemania

    ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime
    

Guarda la hora:

hwclock --systohc

Localización

Uso el sistema en inglés, pero también activo pt_BR y de_DE. Suelo preferir en_GB a en_US, pero eso va en gustos.

sed -i -e 's/#en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen
sed -i -e 's/#en_GB.UTF-8 UTF-8/en_GB.UTF-8 UTF-8/' /etc/locale.gen
sed -i -e 's/#pt_BR.UTF-8 UTF-8/pt_BR.UTF-8 UTF-8/' /etc/locale.gen
sed -i -e 's/#de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/' /etc/locale.gen
locale-gen
echo LANG=en_US.UTF-8 > /etc/locale.conf

Virtual Console

Configura la distribución del teclado y la fuente.

echo -e "KEYMAP=br-abnt2\nFONT=latarcyrheb-sun16" > /etc/vconsole.conf

ou

echo -e "KEYMAP=us-acentos\nFONT=latarcyrheb-sun16" > /etc/vconsole.conf

Configuración de red

Añade el nombre del ordenador al /etc/hosts y además bloquea algunos sitios maliciosos y de publicidad.

echo "nome_do_computador" > /etc/hostname
curl --output /etc/hosts --url "https://someonewhocares.org/hosts/zero/hosts"
echo -e "127.0.1.1\tnome_do_computador.localdomain\tnome_do_computador" >> /etc/hosts

Initramfs

Añadí encrypt, porque la partición del sistema está cifrada.

También cargo los módulos de Nvidia, como se explica más abajo.

$ nvim /etc/mkinitcpio.conf
  HOOKS=(base udev autodetect modconf block encrypt filesystems keyboard keymap consolefont fsck)
mkinitcpio -p linux

Pacman

Añade el repositorio multilib, pone color a pacman y añade la animación de Pac-Man.

sed -i -e '/^#\[multilib\]$/,+1s/#//' /etc/pacman.conf
sed -i -e '/# Misc options/a ILoveCandy' /etc/pacman.conf
sed -i -e 's/^# Color/Color/' /etc/pacman.conf

Contraseña de root

passwd

DNS y red

Se puede usar Iproute2, wpa_supplicant o Iwd directamente para conectarse a redes por cable e inalámbricas, pero un gestor de conexiones facilita el proceso.

Algunas configuraciones que he usado:

  • NetworkManager

    NetworkManager lo creó RedHat y ahora forma parte del proyecto GNOME.

    Permite configurar redes por cable, wifi, módems y VPN tanto desde la línea de comandos como desde interfaces gráficas (muy bien integradas en Gnome y KDE).

    sudo pacman -S networkmanager
    sudo systemctl enable NetworkManager.service
    
    $ nmcli device
    DEVICE             TYPE      STATE         CONNECTION
    enp7s0             ethernet  disconnected  --
    wlp0s20f3          wifi      disconnected  --
    p2p-dev-wlp0s20f3  wifi-p2p  disconnected  --
    lo                 loopback  unmanaged     --
    
    $ nmcli connection add type ethernet con-name Casa ifname enp7s0
    Connection 'Casa' (0acb09e3-40a4-479f-9532-a154d8d65dfc) successfully added.
    
    $ nmcli connection up Casa
    Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/1)
    
    $ nmcli device disconnect enp7s0
    Device 'enp7s0' successfully disconnected.
    

    Nota: se pueden mantener el cable y el wifi conectados a la vez, de forma que si desconectas el cable no haya corte.

    $ nmcli device wifi list
    IN-USE  BSSID              SSID       MODE   CHAN  RATE        SIGNAL  BARS  SECURITY
            7C:05:07:04:38:52  MEU_SSID   Infra  4     130 Mbit/s  80      ▂▄▆_  WPA2
            A4:33:D7:A7:EA:10  Vizinho 1  Infra  6     130 Mbit/s  70      ▂▄▆_  WPA2
            C0:3D:D9:88:1E:00  Vizinho 2  Infra  1     130 Mbit/s  65      ▂▄▆_  WPA2
            68:02:B8:28:9A:60  Vizinho 3  Infra  6     195 Mbit/s  60      ▂▄▆_  WPA1 WPA2
            00:26:F2:6B:D6:F2  Vizinho 4  Infra  11    54 Mbit/s   59      ▂▄▆_  WPA1 WPA2
    
    $ nmcli device wifi connect MEU_SSID password MINHA_SENHA
    Device 'wlp0s20f3' successfully activated with '3eafc7d7-8a89-40ae-8b01-ade3ba474de0'.
    
    $ nmcli connection show
    NAME      UUID                                  TYPE      DEVICE
    MEU_SSID  3eafc7d7-8a89-40ae-8b01-ade3ba474de0  wifi      wlp0s20f3
    Casa      0acb09e3-40a4-479f-9532-a154d8d65dfc  ethernet  --
    
    ls /etc/NetworkManager/system-connections/
    Casa.nmconnection  MEU_SSID.nmconnection
    
  • systemd-networkd + systemd-resolved + iwd

    ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
    
    $ nvim /etc/iwd/main.conf
    [General]
    EnableNetworkConfiguration=true
    [Network]
    NameResolvingService=systemd
    

    La red se puede arrancar al encender el ordenador:

    sudo systemctl enable systemd-resolved iwd
    
  • Wicd

Usuarios

~# useradd -m -g users -G wheel,storage,power,video,audio,rfkill -s /bin/zsh julio
~# passwd julio
~# EDITOR=nvim visudo
Descomente a linha `%wheel ALL=(ALL) ALL`

Bootloader

Uso systemd-boot. Como mi procesador es Intel, también cargo su microcode.

~# bootctl install
~# nvim /boot/loader/entries/arch.conf
title   Arch Linux
linux   /vmlinuz-linux
initrd  /intel-ucode.img
initrd  /initramfs-linux.img
options cryptdevice=UUID=0a1b2c3d-…-4e5f6g:arch root=/dev/mapper/arch rootfstype=ext4 add_efi_memmap
sudo nvim /boot/loader/loader.conf
timeout 3

El UUID de la partición cifrada (/dev/sda5) se ve ejecutando el comando lsblk -o +UUID.

Con el gestor de arranque configurado ya podemos reiniciar el ordenador. Si todo va bien, aparecerá un menú para elegir el sistema operativo.

sudo umount /mnt/boot
sudo umount /mnt
sudo systemctl reboot

Si no se instaló ningún gestor de sesiones, Arch arrancará en el terminal. Entra con el usuario creado en el paso anterior.

Dotfiles

Mis dotfiles están en Github. Clono el repositorio y creo los enlaces simbólicos correspondientes. Cuando tenga tiempo usaré rcm, chezmoi o GNU Stow para automatizarlo.

~$ git clone https://github.com/jbsilva/dotfiles.git
~$ ln -s dotfiles/.config ~/.config
~$ ln -s dotfiles/.zsh ~/.zsh
~$ ln -s dotfiles/.zshrc ~/.zshrc
~$ ln -s dotfiles/.gitconfig ~/.gitconfig
~$ ln -s dotfiles/.p10k_console.zsh ~/.p10k_console.zsh
~$ ln -s dotfiles/.p10k.zsh ~/.p10k.zsh
~$ ln -s dotfiles/.xinitrc ~/.xinitrc
~$ ln -s dotfiles/XCompose/.XCompose ~/.XCompose
~$ ln -s dotfiles/bin ~/bin

Shell

Hay muchas opciones de shell de línea de comandos, como Bash, Zsh, KornShell y Fish. Para listar los shells instalados ejecuta el comando chsh -l.

Uso Zsh desde hace años. Cumple POSIX y resulta extremadamente cómodo con algunos plugins (PowerLevel10k, etc.), que mi dotfile instala y configura automáticamente con zplug.

Yo creé mi usuario con el parámetro -s /bin/zsh, pero se puede cambiar el shell por defecto con el comando chsh -s full-path-to-shell.

Emuladores de terminal

Hay muchos emuladores de terminal para Linux, cada uno con sus ventajas e inconvenientes.

Yo solía usar urxvt, porque antes el tiempo de arranque y el consumo de memoria eran lo que más me importaba. Ahora que tengo ordenadores más potentes destacan otras cosas:

  • Multiplataforma (al menos Linux y macOS)
  • Unicode
  • Truecolor
  • Ligatures
  • Tabs
  • GPU accelerated
  • Buena documentación

De todos los que he probado, Kitty es el que más funciones tiene. Por desgracia no es perfecto: tiene phone home features, usa un terminfo propio que da problemas y su desarrollador a menudo se comporta de forma grosera.

Alacritty está bien, pero no tiene pestañas y quizá nunca las tenga.

Multiplexores de terminal

Los emuladores de terminal como Kitty permiten dividir una única ventana en varios terminales, pero la mayoría de los multiplexores hacen eso y mucho más, como dejar una sesión en marcha aunque cierres el terminal.

Algunos que he usado:

  • GNU Screen
    • Es el más sencillo y ya viene instalado en varias distribuciones.
  • Tmux
  • Byobu
    • Es una capa sobre Screen o Tmux. Me gusta bastante, pero el proyecto se abandonó en febrero de 2020.
  • Zellij
    • Mi favorito actual. Es un proyecto nuevo (en 2020 se llamaba Mosaic) escrito en Rust y con muchas funciones interesantes.

Yay

Yay es un AUR helper, un wrapper de Pacman escrito en Go que ayuda bastante a instalar paquetes.

$ git clone https://aur.archlinux.org/yay.git && \
    cd yay && \
    makepkg -sri && \
    cd .. && \
    rm -rf yay

Algunos paquetes extra que instalo, entre ellos el terminal Kitty, el editor de imágenes Gimp, VS Code y varias utilidades:

$ yay -S \
    ack \
    aws-cli-v2-bin \
    bleachbit \
    bluez \
    bluez-utils \
    calibre \
    chromium \
    code \
    ctags \
    dbeaver \
    digikam \
    discord \
    docker-compose \
    duf \
    dust \
    fcitx5-chinese-addons \
    fcitx5-im \
    ffmpeg \
    firefox \
    gimp \
    gitahead \
    goldendict \
    gparted \
    htop \
    hugo \
    imagemagick \
    insomnia-bin \
    jq \
    kitty \
    lens-bin \
    libreoffice-fresh \
    make \
    meld \
    neofetch \
    nerd-fonts-hack \
    noto-fonts-emoji \
    npm \
    ntfs-3g \
    oath-toolkit \
    obs-studio \
    okular \
    openssh \
    p7zip \
    polkit \
    qalculate-gtk \
    renameutils \
    rsync \
    rust-analyzer \
    slack-desktop \
    spotify \
    sshfs \
    telegram-desktop \
    texlive-core \
    texlive-latexextra \
    thunderbird \
    transmission-remote-gtk \
    tree \
    ttf-joypixels \
    usbutils \
    veracrypt \
    vlc \
    wget \
    xclip \
    xorg-xrandr \
    # audacity \
    # awesome-git \
    # aws-cli \
    # blueman \
    # byobu \
    # copyq \
    # feh \
    # gnome-keyring \
    # graphviz \
    # hdparm \
    # ibus \
    # ibus-libpinyin \
    # kdenlive \
    # light-git \
    # macchanger \
    # maim \
    # picom-git \
    # postman-bin \
    # redshift \
    # rofi-git \
    # sshpass \
    # teams \
    # unrar \
    # unzip

Firewall

sudo pacman -S nftables
sudo systemctl enable nftables.service
sudo nft list ruleset

Fuentes

Instala las fuentes disponibles en el repositorio oficial o en el AUR:

$ yay -S \
    inter-font \
    nerd-fonts-fantasque-sans-mono \
    noto-fonts \
    noto-fonts-cjk \
    noto-fonts-emoji \
    otf-san-francisco \
    otf-sfmono-patched \
    ttf-dejavu \
    ttf-liberation \
    ttf-meslo-nerd-font-powerlevel10k

Instalación manual

Las fuentes que no están disponibles como paquete se pueden instalar a mano. Basta con poner los archivos en alguna subcarpeta de /usr/local/share/fonts (para todos los usuarios) o de ~/.local/share/fonts/ (solo para tu usuario).

Ejemplo:

sudo mkdir -p /usr/local/share/fonts/{otf,ttf}
wget http://www.exljbris.com/dl/fontin2_pc.zip
sudo 7z x fontin2_pc.zip -o/usr/local/share/fonts/ttf/Fontin
sudo find /usr/local/share/fonts -type d -exec chmod 755 {} \;
sudo find /usr/local/share/fonts -type f -exec chmod 644 {} \;
$ tree /usr/local/share/fonts
/usr/local/share/fonts
├── otf
│   └── Example_Sans
│       ├── Example_Sans_B.otf
│       ├── Example_Sans_BI.otf
│       ├── Example_Sans_I.otf
│       └── Example_Sans_R.otf
└── ttf
    └── Fontin
        ├── Fontin-Bold.ttf
        ├── Fontin-Italic.ttf
        ├── Fontin-Regular.ttf
        ├── Fontin-SmallCaps.ttf
        └── ReadMe.txt
fc-cache
fc-list
…

Si quieres definir fuentes concretas, edita el archivo $XDG_CONFIG_HOME/fontconfig/fonts.conf.

Fuentes de Windows

Puedes sacar las fuentes de la ISO o de la carpeta C:\Windows\Fonts de un Windows instalado.

Copia las fuentes a /usr/share/fonts/WindowsFonts:

sudo mkdir /usr/share/fonts/WindowsFonts
sudo cp /c/Windows/Fonts/* /usr/share/fonts/WindowsFonts/
sudo chmod 644 /usr/share/fonts/WindowsFonts/*

Otra opción es usar un paquete como ttf-ms-win10 o ttf-ms-win11.

git clone https://aur.archlinux.org/ttf-ms-win11
cd ttf-ms-win11
cp /c/Windows/System32/Licenses/neutral/_Default/Core/license.rtf .
cp /c/Windows/Fonts/* .
makepkg -si

Teclados

El teclado de mi portátil es ABNT2, pero a veces conecto teclados con otras distribuciones.

Se puede configurar cada teclado por separado usando su device id, o alternar entre perfiles preconfigurados.

  1. Averigua el device id del teclado

    sudo pacman -S xorg-xinput
    
    $ xinput -list | grep -i Keychron
    ⎜   ↳ Keychron Keychron K2  id=11  [slave pointer  (2)]
        ↳ Keychron Keychron K2  id=10  [slave keyboard (3)]
        ↳ Keychron Keychron K2  id=19  [slave keyboard (3)]
    
    $ xinput list-props 10
    Device 'Keychron Keychron K2':
        Device Enabled (189):    1
        Device Node (313):   "/dev/input/event5"
    
    $ ls -l /dev/input/by-id/usb-Keychron*
    … /dev/input/by-id/usb-Keychron_Keychron_K2-event-if01 -> ../event6
    … /dev/input/by-id/usb-Keychron_Keychron_K2-event-kbd -> ../event5
    
  2. Configúralo con setxkbmap

    $ setxkbmap -device `xinput -list | \
        grep "Keychron K2.*keyboard" | \
        sed -e 's/^.*id=\([0-9]\+\).*/\1/' | \
        head -1` \
               -layout us              \
               -variant intl           \
               -option lv3:ralt_switch \
               -option compose:rctrl    \
               -option caps:swapescape
    

    Usa los comandos localectl list-x11-keymap-layouts, localectl list-x11-keymap-variants us, localectl list-x11-keymap-options y el archivo /usr/share/X11/xkb/rules/base.lst para dar con la configuración adecuada.

    Mi ejemplo intercambia el Bloq Mayús con el Esc, usa el control derecho como tecla compose (Multi_Key) y el Alt derecho para el tercer nivel.

  3. Ejecuta el comando al arrancar el sistema

    $ nvim ~/bin/keyboards.sh
    #!/bin/sh
    
    # Notebook keyboard
    keyboard_id=$(
        xinput -list |
        grep "AT Translated Set 2 keyboard.*keyboard" |
        sed -e 's/^.*id=\([0-9]\+\).*/\1/' |
        head -1
    )
    if [ ! -z "$keyboard_id" ]; then
        setxkbmap -device $keyboard_id    \
                  -layout br              \
                  -option lv3:ralt_switch \
                  -option compose:menu    \
                  -option caps:swapescape
    fi
    
    # Keychron K2
    keyboard_id=$(
        xinput -list |
        grep "Keychron K2.*keyboard" |
        sed -e 's/^.*id=\([0-9]\+\).*/\1/' |
        head -1
    )
    if [ ! -z "$keyboard_id" ]; then
        setxkbmap -device $keyboard_id    \
                  -layout us              \
                  -variant intl           \
                  -option lv3:ralt_switch \
                  -option compose:rctrl   \
                  -option caps:swapescape
    fi
    
    $ nvim ~/.config/autostart/keyboards.sh.desktop
    [Desktop Entry]
    Exec=/home/julio/bin/keyboards.sh
    Icon=dialog-scripts
    Name=keyboards.sh
    Path=
    Type=Application
    X-KDE-AutostartScript=true
    
  4. Compose: ce cedilla

    En la distribución US International with Dead Keys la ç se consigue con AltGr + ,, pero yo prefiero usar ´ + c o compose + c.

    Crea un ~/.XCompose (o ~/.config/ibus/Compose) basado en /usr/share/X11/locale/en_US.UTF-8/Compose:

    # UTF-8 (Unicode) compose sequence
    include "%L"
    <Multi_key> <c>   : "ç"   ccedilla
    <Multi_key> <C>   : "Ç"   Ccedilla
    <dead_acute> <c>  : "ç"   ccedilla
    <dead_acute> <C>  : "Ç"   Ccedilla
    <Multi_key> <t> <o> <w> <e> <r>  : "🗼"
    

Caracteres orientales

Se pueden escribir caracteres que no están en tu teclado mediante un input method framework como IBUS o Fcitx5.

Voy a mostrar cómo usar ibus-libpinyin y fcitx5-chinese-addons para escribir en chino. La configuración de otros idiomas con otros IME (input method editors) es parecida.

IBUS

IBus (Intelligent Input Bus) es bastante popular. De hecho viene integrado en GNOME, pero también funciona bien con otros entornos de escritorio.

  1. Instala IBus

    sudo pacman -S ibus ibus-libpinyin
    
  2. Define estas variables de entorno:

    sudo nvim /etc/environment
    GTK_IM_MODULE=ibus
    QT_IM_MODULE=ibus
    XMODIFIERS=@im=ibus
    GLFW_IM_MODULE=ibus
    
  3. Configura IBus para que arranque con el entorno de escritorio

    $ nvim ~/.config/autostart/ibus-daemon.desktop
    [Desktop Entry]
    Comment=IBus Daemon
    #Exec=ibus-daemon -drx --panel=/usr/lib/kimpanel-ibus-panel
    Exec=ibus-daemon -drx
    GenericName=IBus Daemon
    Icon=ibus-engine
    Name=IBus Daemon
    StartupNotify=true
    Terminal=true
    Type=Application
    X-KDE-SubstituteUID=false
    

    KDE tiene un widget llamado Input Method Panel, pero yo prefiero usar el panel propio de IBus.

  4. Configura IBus

    ibus-setup
    

    En Input Method, elige Portuguese (Brazil), Chinese-Intelligent Pinyin e English (US, intl., with dead keys).

    En General, configura el atajo <Super>space para alternar entre los input methods.

    En Advanced, marca la opción de usar la distribución del sistema para que IBus no sobrescriba la que definiste con setxkbmap.

  5. Cambia el color del panel para que combine con tu barra de tareas

    gsettings set org.freedesktop.ibus.panel xkb-icon-rgba '#ffffff'
    

Fcitx5

Fcitx (Flexible Context-aware Input Tool with eXtension support) es el input method framework que uso.

Es bastante flexible, tiene muchas funciones y se integra bien con KDE.

  1. Instala Fcitx5

    sudo pacman -S fcitx5-im fcitx5-chinese-addons
    
  2. Define estas variables de entorno:

    sudo nvim /etc/environment
    GTK_IM_MODULE=fcitx
    QT_IM_MODULE=fcitx
    XMODIFIERS=@im=fcitx
    DefaultIMModule=fcitx
    SDL_IM_MODULE=fcitx
    GLFW_IM_MODULE=ibus
    

    La última línea es para Kitty. Se queda como ibus, sí.

  3. Configura Fcitx5 para que arranque con el entorno de escritorio

    $ nvim ~/.config/autostart/fcitx5.desktop
    [Desktop Entry]
    Name=Fcitx5
    GenericName=Fcitx5 Input Method
    Comment=Start Fcitx5
    Exec=fcitx5
    Icon=fcitx
    Terminal=false
    Type=Application
    Categories=System;Utility;
    StartupNotify=false
    X-GNOME-Autostart-Phase=Applications
    X-GNOME-AutoRestart=false
    X-GNOME-Autostart-Notify=false
    X-KDE-autostart-after=panel
    X-KDE-StartupNotify=false
    X-GNOME-Autostart-enabled=true
    
  4. Configura Fcitx5

    Recomiendo hacer los ajustes desde la interfaz gráfica fcitx5-configtool (en KDE queda integrada en la configuración del sistema, en System Settings » Personalization » Regional Settings » Input Method).

    En mis pruebas, los archivos editados a mano acabaron sobrescritos con los valores configurados desde la interfaz gráfica.

    • Config

      $ nvim ~/.config/fcitx5/config
      [Hotkey/TriggerKeys]
      0=Super+space
      
      [Behavior/DisabledAddons]
      0=cloudpinyin
      1=wayland
      2=waylandim
      
    • Layouts

      $ nvim ~/.config/fcitx5/profile
      [Groups/0]
      # Group Name
      Name="Group 1"
      # Layout
      Default Layout=us-intl
      # Default Input Method
      DefaultIM=keyboard-us-intl
      
      [Groups/0/Items/0]
      # Name
      Name=keyboard-us-intl
      # Layout
      Layout=
      
      [Groups/0/Items/1]
      # Name
      Name=pinyin
      # Layout
      Layout=
      
      [GroupOrder]
      0="Group 1"
      

      Nota: la última entrada en configtool será el DefaultIM.

    • XCB

      $ nvim ~/.config/fcitx5/conf/xcb.conf
      Allow Overriding System XKB Settings=False
      
    • UI

      pacman -S fcitx5-material-color fcitx5-nord
      
      $ nvim ~/.config/fcitx5/conf/classicui.conf
      # Use Per Screen DPI
      PerScreenDPI=False
      # Font
      Font="Noto Sans Black 10"
      # Menu Font
      MenuFont="Sans 10"
      # Theme
      Theme=Material-Color-Blue
      
    • Cloud Pinyin

      $ nvim ~/.config/fcitx5/conf/pinyin.conf
      CloudPinyinEnabled=False
      

Teclado Keychron

Para que las teclas F1,…,F12 funcionen bien:

sudo nvim /etc/modprobe.d/hid_apple.conf
options hid_apple fnmode=2
sudo mkinitcpio -P

XDG user directories

Instala xdg-user-dirs para crear las carpetas.

sudo pacman -S xdg-user-dirs
$ xdg-user-dirs-update --force

Gestión de la energía

Hay muchas herramientas de gestión de la energía. Yo uso estas:

sudo pacman -S tlp acpid acpi_call upower xfce4-power-manager
sudo systemctl enable tlp.service
sudo systemctl enable acpid.service

Bluetooth

Tras instalar bluez, arranca el bluetooth.service:

sudo systemctl start bluetooth.service

La configuración de Bluez está en /etc/bluetooth/main.conf. Yo uso la de por defecto.

La mayoría de los entornos de escritorio incluyen alguna interfaz gráfica para facilitar la conexión, como Bluedevil en KDE, pero a mí también me gusta instalar bluez-utils para conectar dispositivos bluetooth desde la línea de comandos con bluetoothctl.

Ejemplo conectando dos teclados y unos auriculares:

$ bluetoothctl
Agent registered

[bluetooth]# power on
[CHG] Controller 8C:8D:28:F7:3A:77 Class: 0x007c010c
Changing power on succeeded
[CHG] Controller 8C:8D:28:F7:3A:77 Powered: yes

[bluetooth]# scan on
Discovery started
[CHG] Controller 8C:8D:28:F7:3A:77 Discovering: yes
[NEW] Device 20:20:01:07:B1:89 Bluetooth 3.0 Keyboard
[NEW] Device DC:2C:26:FF:24:BD Keychron K2
[NEW] Device 60:F4:3A:12:8E:02 EDIFIER W800BT

[bluetooth]# pair 20:20:01:07:B1:89
Attempting to pair with 20:20:01:07:B1:89
[CHG] Device 20:20:01:07:B1:89 Connected: yes
[agent] PIN code: 428084
[CHG] Device 20:20:01:07:B1:89 Modalias: usb:v04E8p7021d011B
[CHG] Device 20:20:01:07:B1:89 UUIDs: …
[CHG] Device 20:20:01:07:B1:89 ServicesResolved: yes
[CHG] Device 20:20:01:07:B1:89 Paired: yes
Pairing successful

[bluetooth]# trust 20:20:01:07:B1:89
[CHG] Device 20:20:01:07:B1:89 Trusted: yes
Changing 20:20:01:07:B1:89 trust succeeded

[bluetooth]# connect 20:20:01:07:B1:89
Attempting to connect to 20:20:01:07:B1:89
[CHG] Device 20:20:01:07:B1:89 Connected: yes
Connection successful

[Bluetooth 3.0 Keyboard]# pair 60:F4:3A:12:8E:02
Attempting to pair with 60:F4:3A:12:8E:02
[CHG] Device 60:F4:3A:12:8E:02 Connected: yes
[CHG] Device 60:F4:3A:12:8E:02 UUIDs: …
[CHG] Device 60:F4:3A:12:8E:02 ServicesResolved: yes
[CHG] Device 60:F4:3A:12:8E:02 Paired: yes
Pairing successful

[Bluetooth 3.0 Keyboard]# trust 60:F4:3A:12:8E:02
[CHG] Device 60:F4:3A:12:8E:02 Trusted: yes
Changing 60:F4:3A:12:8E:02 trust succeeded

[Bluetooth 3.0 Keyboard]# connect 60:F4:3A:12:8E:02
Attempting to connect to 60:F4:3A:12:8E:02
Connection successful

[EDIFIER W800BT]# pair DC:2C:26:FF:24:BD
Attempting to pair with DC:2C:26:FF:24:BD
[CHG] Device DC:2C:26:FF:24:BD Connected: yes
[CHG] Device DC:2C:26:FF:24:BD Modalias: usb:v05ACp024Fd011B
[CHG] Device DC:2C:26:FF:24:BD UUIDs: 00001000-0000-1000-8000-00805f9b34fb
[CHG] Device DC:2C:26:FF:24:BD UUIDs: 00001124-0000-1000-8000-00805f9b34fb
[CHG] Device DC:2C:26:FF:24:BD UUIDs: 00001200-0000-1000-8000-00805f9b34fb
[CHG] Device DC:2C:26:FF:24:BD ServicesResolved: yes
[CHG] Device DC:2C:26:FF:24:BD Paired: yes
Pairing successful
[CHG] Device DC:2C:26:FF:24:BD WakeAllowed: yes
[CHG] Device DC:2C:26:FF:24:BD ServicesResolved: no
[CHG] Device DC:2C:26:FF:24:BD Connected: no

[EDIFIER W800BT]# trust DC:2C:26:FF:24:BD
[CHG] Device DC:2C:26:FF:24:BD Trusted: yes
Changing DC:2C:26:FF:24:BD trust succeeded

[EDIFIER W800BT]# connect DC:2C:26:FF:24:BD
Attempting to connect to DC:2C:26:FF:24:BD
[CHG] Device DC:2C:26:FF:24:BD Connected: yes
Connection successful

[Keychron K2]# paired-devices
Device 60:F4:3A:12:8E:02 EDIFIER W800BT
Device 20:20:01:07:B1:89 Bluetooth 3.0 Keyboard
Device DC:2C:26:FF:24:BD Keychron K2

[Keychron K2]# quit

Consejo: usa FN+Z+J para reiniciar el teclado Keychron y restablecer las conexiones.

asdf

asdf tiene plugins para casi cualquier cosa. Puede sustituir a pyenv, rbenv, goenv y nvm. Hasta hay un plugin para gestionar distintas versiones de Poetry.

git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.11.3

Usa el plugin de oh-my-zsh para activarlo y añadir el autocompletado.

  • Python

    pacman -S --needed base-devel openssl zlib xz tk
    
    asdf plugin add python
    asdf install python latest:3
    asdf global python latest
    
    asdf install python latest:3.10
    asdf local python latest:3.10
    asdf uninstall python <python-version>
    
  • Ruby

    asdf plugin add ruby
    asdf install ruby latest
    asdf local ruby latest
    
  • Go

    asdf plugin add golang
    asdf install golang latest
    asdf global golang latest
    
  • Node.js

    asdf plugin add nodejs
    asdf install nodejs latest
    

Las versiones globales se definen en el archivo ~/.tool-versions.

Python

Tuve mi primer contacto con Python hace más de 10 años y hoy, además de ser mi lenguaje de programación favorito, es el que más uso en el trabajo y en proyectos personales.

El Zen de Python dice:

“There should be one– and preferably only one –obvious way to do it.”

Lo cual vale para el código, pero con el packaging la historia es bien distinta. Mis sentimientos quedan bien retratados en esta serie de viñetas de xkcd: xkcd 353, xkcd 927, xkcd 1987.

xkcd 927

xkcd 927

Mis preferencias actuales son estas, por orden:

  • Para gestionar distintas versiones de Python: asdf o Pyenv.

  • Para gestionar entornos virtuales, controlar dependencias y facilitar la publicación de paquetes: PDM o Poetry.

  • Para casos más complejos de machine learning o proyectos que dependan de paquetes y binarios que no están en pypi: Mambaforge.

  • IDE: VSCode con la extensión oficial o PyCharm.

    El problema de PyCharm es que algunas funciones importantes (integración con frameworks, edición de SQL, integración con Docker, etc.) son de pago.

Pyenv

Pyenv permite instalar y usar distintas versiones de Python.

Es como asdf, pero solo para Python. Si ya usas asdf para otros lenguajes, quizá no tenga mucho sentido instalar Pyenv.

  1. Instala Pyenv:

    sudo pacman -S pyenv
    
  2. Opcionalmente, instala también pyenv-virtualenv:

    yay -S pyenv-virtualenv
    
  3. Añade estas líneas al ~/.zshrc:

    if (( $+commands[pyenv] )); then eval "$(pyenv init --path)"; fi
    if (( $+commands[pyenv-virtualenv-init] )); then eval "$(pyenv virtualenv-init -)"; fi
    
  4. Comprueba qué versiones hay disponibles e instala las que vayas a usar:

    pyenv install --list
    pyenv install 3.8.12
    pyenv install mambaforge
    
  5. Lista las versiones instaladas

    pyenv versions
    
  6. En la carpeta de algún proyecto, define la versión que se usará

    pyenv local 3.8.12
    

    Se creará un archivo llamado .python-version:

    $ cat .python-version
    3.8.12
    

Poetry

Actualización: sección actualizada a la versión 1.2.

  1. Instala Poetry

    Prefiero no usar el gestor de paquetes del sistema para Poetry; hay buenas alternativas:

    • Script:

      wget -O install-poetry.py https://install.python-poetry.org
      python install-poetry.py --preview
      

      Nota: el instalador antiguo (get-poetry.py) fue sustituido por install-poetry.py. No pases el parámetro --preview si quieres la última versión estable.

    • asdf:

      asdf plugin add poetry
      asdf install poetry latest
      asdf global poetry latest
      
    • pipx:

      pipx install poetry
      
  2. Añádelo al PATH

    El instalador antiguo usaba la carpeta $HOME/.poetry/bin. El nuevo usa $HOME/.local/bin.

    Usando mi función del .zshrc:

    addToPathStart $HOME/.local/bin
    
  3. Instala el autocompletado

    poetry completions zsh > ~/.zprezto/modules/completion/external/src/_poetry
    

    El comando anterior es porque uso Prezto. Lo importante es instalarlo en alguna carpeta que esté en el $fpath.

  4. Crea un proyecto nuevo

    poetry new meu-projeto
    cd meu-projeto
    
  5. Define la versión de Python con Pyenv o asdf

    pyenv local 3.8.12
    

    ou

    asdf local 3.8.12
    
    $ nvim pyproject.toml
    …
    [tool.poetry.dependencies]
    python = "^3.8"
    …
    
    poetry env use -- /home/julio/.pyenv/versions/3.10.3/bin/python
    

    ou

    poetry env use -- /home/julio/.asdf/installs/python/3.10.3/bin/python
    
    poetry run python --version
    poetry debug info
    
  6. Añade las dependencias

    Las dependencias de desarrollo se pasan con --dev.

    $ poetry add --group dev \
        bandit \
        black \
        codecov \
        coverage \
        flake8 \
        gitchangelog \
        isort \
        mkdocs \
        mypy \
        pydocstyle \
        pytest \
        pytest-cov
    
    poetry add typer\[all\]
    
  7. Actualiza Poetry

    poetry self update
    

    Acuérdate de volver a generar el autocompletado.

  8. Instala poetry-plugin-up

    poetry self add poetry-plugin-up
    poetry up --latest
    

    Este plugin actualiza los paquetes de pyproject.toml a la última versión.

Si Poetry se queda atascado en “Resolving dependencies”, prueba esto:

find ~/.cache/pypoetry -name '*.lock' -type f -delete
poetry env remove --all
poetry cache clear --all .
rm -rf $(poetry config cache-dir)/artifacts

Mambaforge

Mambaforge combina Mamba y Conda-Forge.

Mamba es una reimplementación en C++ del gestor de paquetes Conda. Resuelve dependencias muy rápido y descarga en paralelo.

El canal Conda-Forge contiene recipes escritas por la comunidad para Conda. Tiene muchos más paquetes que el repositorio oficial de Conda.

  1. Si no quieres usar Pyenv, puedes instalar Mambaforge a mano:

    wget https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Linux-x86_64.sh
    bash Mambaforge-Linux-x86_64.sh
    
  2. Actualiza los paquetes base

    mamba update mamba
    mamba update --all
    
  3. Crea y activa un entorno virtual

    mamba create -n nome_do_env python=3.10 jupyterlab …
    conda activate nome_do_env
    
  4. Instala algunos paquetes adicionales

    $ mamba install \
          azure-identity \
          bandit \
          black \
          bokeh \
          dask \
          flake8 \
          ipywidgets \
          isort \
          jupyterlab_code_formatter \
          kafka-python \
          keras \
          koalas \
          matplotlib \
          mypy \
          numpy \
          openpyxl \
          pandas \
          plotly \
          pyarrow \
          pycodestyle \
          pydocstyle \
          pylama \
          pylint \
          pyspark \
          pytest \
          python-graphviz \
          python-wget \
          scikit-learn \
          seaborn \
          sqlalchemy \
          tenacity \
          tensorflow \
          unidecode \
          xgboost
    

PDM

La PEP 582 fue

rechazada por el Python Steering Council en marzo de 2023.

Igual que Poetry, PDM es un gestor de paquetes y dependencias.

La diferencia es que sigue las nuevas PEP (PEP 582, PEP 517 y PEP 621).

Se puede usar un virtualenv o seguir la PEP 582 y usar una carpeta llamada __pypackages__. Esa carpeta equivale a node_modules y se añade al sys.path.

Instalación

  • Con script:

    curl -sSL https://raw.githubusercontent.com/pdm-project/pdm/main/install-pdm.py | python3 -
    
  • Con asdf:

    asdf plugin add pdm
    asdf install pdm latest
    asdf local pdm latest
    
  • Autocompletado en ZSH

    pdm completion zsh > ~/.zprezto/modules/completion/external/src/_pdm
    

Uso

  • Crear un proyecto

    pdm init
    
  • Añadir dependencias

    pdm add requests flask
    
  • Añadir dependencias de desarrollo

    pdm add -dG dev jupyterlab jupyterlab-code-formatter black isort pylint mypy
    
  • Quitar dependencias

    pdm remove flask
    
  • Listar dependencias

    pdm list --graph
    
  • Instalar el proyecto

    pdm install
    
  • Instalar a partir del archivo .lock

    pdm sync
    
  • Actualizar dependencias

    • Todos los paquetes

      pdm update
      
    • Un paquete concreto

      pdm update <paquete>
      
      • Paquetes de un grupo

        pdm update -G <grupo>
        
      • Forzar la actualización de paquetes fijados

        pdm update --update-eager
        
  • Quitar los paquetes no listados

    pdm sync --clean
    
  • Ejecutar un binario en el entorno

    pdm run jupyter lab
    

Actualización

pdm self update

Rust

Para desarrollar en Rust se recomienda usar rustup, que se puede instalar de dos formas:

  1. Script oficial:

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    
  2. Pacman:

    sudo pacman -S rustup
    rustup default stable
    

    Esta forma es más cómoda en Arch, porque mantiene Rust y los paquetes que dependen de él siempre actualizados.

Prueba la instalación:

$ rustc --version
rustc 1.53.0 (53cb7b09b 2021-06-17)
$ cargo --version
cargo 1.53.0 (4369396ce 2021-04-27)
$ rustdoc --version
rustdoc 1.53.0 (53cb7b09b 2021-06-17)
$ cargo new hello
 Created binary (application) `hello` package
$ cd hello

$ cargo run
   Compiling hello v0.1.0 (/home/julio/hello)
    Finished dev [unoptimized + debuginfo] target(s) in 0.43s
     Running `target/debug/hello`
Hello, world!

Mi Neovim está configurado para usar rust-analyzer como servidor LSP. Basta con instalar el binario:

sudo pacman -S rust-analyzer

Nvidia

Uno de los portátiles tiene una GPU integrada de Intel y una Nvidia GeForce RTX 2070 Max-Q, que rinde más que la de Intel pero consume más energía.

Se puede apagar una de las tarjetas de forma permanente o usar la tecnología Nvidia Optimus para alternar entre ellas según haga falta.

Instala los controladores y utilidades:

sudo pacman -S nvidia nvidia-utils nvidia-settings opencl-nvidia

Ejecutar un programa concreto en la Nvidia

Para hacer el llamado PRIME render offload basta con arrancar el programa con el comando prime-run. Por ejemplo:

sudo pacman -S nvidia-prime
prime-run kdenlive

Usar solo la tarjeta Nvidia

sudo nvim /etc/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf
Section "OutputClass"
    Identifier "intel"
    MatchDriver "i915"
    Driver "modesetting"
EndSection

Section "OutputClass"
    Identifier "nvidia"
    MatchDriver "nvidia-drm"
    Driver "nvidia"
    Option "AllowEmptyInitialConfiguration"
    Option "PrimaryGPU" "yes"
    ModulePath "/usr/lib/nvidia/xorg"
    ModulePath "/usr/lib/xorg/modules"
EndSection
$ nvim ~/.xinitrc (ou /usr/share/sddm/scripts/Xsetup para o SDDM)
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto
setxkbmap br -option caps:swapescape

Para asegurarse de que el módulo se carga antes que la interfaz gráfica.

sudo nvim /etc/modprobe.d/nvidia-drm-nomodeset.conf
options nvidia-drm modeset=1
sudo nvim /etc/mkinitcpio.conf
MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)
sudo mkinitcpio -P

(Nota: si la partición /boot tiene poco espacio libre, se puede desactivar la generación de la imagen de reserva comentando las líneas correspondientes en /etc/mkinitcpio.d/linux.preset. Si con eso no basta, habrá que redimensionar las particiones.)

sudo systemctl reboot
nvidia-smi
sudo pacman -S virtualgl
glxspheres64

Tearing

El screen tearing es cuando en la pantalla se muestran a la vez partes de fotogramas distintos.

Este problema se notaba mucho al ver vídeos en el monitor conectado por HDMI. Pruébalo con el vídeo https://youtu.be/MfL_JkcEFbE y con la web https://www.vsynctester.com.

  1. Configuración del navegador

    Comprueba si activar layers.acceleration.force-enabled en el about:config de Firefox mejora algo.

  2. Force composition

    Esta opción puede aumentar la latencia, pero fue lo que resolvió mi problema.

    Comprueba la configuración actual:

    $ nvidia-settings --query CurrentMetaMode
      Attribute 'CurrentMetaMode' (Predator:0.0): id=50, switchable=yes, source=RandR :: DPY-2: nvidia-auto-select @1920x1080 +1920+0 {ViewPortIn=1920x1080, ViewPortOut=1920x1080+0+0}
    

    Activa ForceCompositionPipeline (o ForceFullCompositionPipeline):

    nvidia-settings --assign CurrentMetaMode="nvidia-auto-select +1920+0 { ForceCompositionPipeline = On }"
    

    El desplazamiento +1920+0 es porque la pantalla del portátil es Full HD y está a la izquierda del monitor externo.

    Comprueba la nueva configuración:

    $ nvidia-settings --query CurrentMetaMode
      Attribute 'CurrentMetaMode' (Predator:0.0): id=50, switchable=no, source=nv-control :: DPY-2: nvidia-auto-select @1920x1080 +1920+0 {ViewPortIn=1920x1080, ViewPortOut=1920x1080+0+0,
      ForceCompositionPipeline=On}
    

    Añade este comando a un archivo que se ejecute al arrancar, como autostart, xinit o Xsetup.

    ~/bin/nvidia-force_comp_pipeline.sh:

    #!/bin/sh
    s="$(nvidia-settings -q CurrentMetaMode -t)"
    echo "$s"
    if [[ "${s}" != "" ]]; then
      s="${s#*" :: "}"
      echo "$s"
      if [[ "${s}" != "NULL" ]]; then
        nvidia-settings -a CurrentMetaMode="${s//\}/, ForceCompositionPipeline=On\}}"
      fi
    fi
    

    /usr/share/sddm/scripts/Xsetup:

    #!/bin/sh
    # Xsetup - run as root before the login dialog appears
    
    # Keyboards
    kb_script="/home/julio/bin/keyboards.sh"
    [ -s "$kb_script" ] && \. "$kb_script"
    
    # Nvidia
    xrandr --setprovideroutputsource modesetting NVIDIA-0
    xrandr --auto
    
    # Force Composition Pipeline
    nfcp_script="/home/julio/bin/nvidia-force_comp_pipeline.sh"
    [ -s "$nfcp_script" ] && \. "$nfcp_script"
    

    Si tus monitores son fijos, puedes usar el /etc/X11/xorg.conf.d/20-nvidia.conf:

    Section "Screen"
        …
        Option  "MetaModes" "nvidia-auto-select +0+0 {ForceFullCompositionPipeline=On}"
        …
    EndSection
    

Gestores de ventanas y entornos de escritorio

Awesome

Para AwesomeWM me gusta la configuración de Gerome Matilla. Está un poco hinchada, pero los diseños son muy bonitos y tienen cosas interesantes.

KDE

KDE Plasma es un entorno de escritorio muy bueno, con una configuración por defecto que me gusta bastante.

Evitaba usar KDE en mis ordenadores antiguos porque no era lo bastante ligero, pero con mi hardware actual eso ya no es un gran problema.

Recomiendo instalar estos paquetes:

sudo pacman -S ark \
        dolphin \
        gwenview \
        packagekit-qt5 \
        plasma-browser-integration \
        sddm \
        spectacle

El intercambio del Bloq Mayús por el ESC se puede hacer en System Settings » Keyboard » Advanced » Caps Lock behavior » Swap Esc and Caps Lock.

Instala kdeconnect en el ordenador y en los dispositivos Android para sincronizar notificaciones, compartir archivos, compartir el portapapeles, usar el Android como ratón y teclado, entre otras cosas.

Prueba las opciones OpenGL y XRender en System Settings » Hardware » Display and Monitor » Compositor » Rendering backend. Seguramente la mejor opción sea OpenGL, aunque he leído casos de problemas con tarjetas Nvidia.

Si no quieres que se muestren los controles multimedia en la pantalla de bloqueo, ejecuta este comando:

kwriteconfig5 --file kscreenlockerrc --group Greeter --group LnF --group General --key showMediaControls --type bool false

Si las fuentes se ven muy grandes, fuerza el DPI en System Settings » Fonts » Force font DPI: 96.

Tiling en KDE: Kröhnkite

  1. Mueve la barra de tareas a la parte superior de la pantalla;

  2. Reduce el tamaño de la barra (yo la dejé en 30);

  3. Pulsa con el botón derecho en la barra de tareas, entra en Show Alternatives y elige “Icons-only Task Manager”;

  4. Botón derecho sobre el Pager » Configure Pager

    • Show application icons on window outlines
    • Text display: Desktop number
  5. System Settings » Workspace » Window Management » KWin Scripts » Get New Scripts…

  6. Activa la configuración de Kröhnkite

    mkdir -p ~/.local/share/kservices5/
    ln -s ~/.local/share/kwin/scripts/krohnkite/metadata.desktop ~/.local/share/kservices5/krohnkite.desktop
    

    En la pantalla KWin Scripts aparecerá un botón para configurar Khrönkite. Allí hago lo siguiente:

    • Activar el Quarter layout
    • Gaps between tiles: 3 px
    • Prevent windows from minimizing
    • Remove borders of tiled windows
  7. System Settings » Appearance » Window Decorations » Edit Theme » Window-Specific Overrides » Add

    • Regular expression to match: .*
    • Border size: Tiny
    • Hide window title bar
  8. Entra en System Settings » Workspace » Workspace Behavior » Virtual Desktops y añade tantos escritorios como quieras (yo dejé 8, mostrados en dos filas);

  9. System Settings » Workspace » Workspace Behavior » Desktop Effects » Focus » Dim Inactive;

  10. System Settings » Workspace » Window Management » Window Behavior » Focus » Multiscreen behavior: Separate screen focus;

  11. Color de los bordes

    kwriteconfig5 --file ~/.config/kdeglobals --group WM --key frame 61,174,233
    kwriteconfig5 --file ~/.config/kdeglobals --group WM --key inactiveFrame  239,240,241
    
  12. Quitar el tamaño mínimo de las ventanas

    • System Settings » Workspace » Window Management » Window Rules
    • Add New…
    • Window class: Unimportant
    • Window types: Normal Window
    • Add Properties…
    • Minimum Size: Force 0 x 0
  13. Cambia los atajos en System Settings » Workspace » Shortcuts » KRunner

    • KRunner: Meta + R
  14. Cambia los atajos en System Settings » Workspace » Shortcuts » KWin

    • Switch to Desktop n: Meta + n
    • Switch to Previous Screen: Meta + ,
    • Switch to Next Screen: Meta + .
    • Window to Desktop n: Meta+Shift+Fn (uso Meta + F1,…,F8, porque Meta+Shift+6 no funciona con el teclado US intl.)
    • Window to Previous Screen: Meta + <
    • Window to Next Screen: Meta + >
    • Krohnkite: Float All: Meta+Shift+F
    • Krohnkite: Right: Meta+L (usa ctrl+alt+L para bloquear la pantalla)

Integración con Android

A los dispositivos MTP solo puede acceder un programa a la vez.

Para sincronizar una tableta con Calibre, KDE no puede haber montado antes el dispositivo.

Mata el proceso kiod5.

Gnome

Gnome es un entorno de escritorio completo y bastante popular. No me gusta mucho su configuración por defecto, pero con unos ajustes rápidos queda bastante usable:

sudo pacman -S gnome gnome-tweaks gnome-shell-extension-appindicator evolution
sudo systemctl enable gdm
dconf write /org/gnome/desktop/input-sources/xkb-options "['caps:swapescape']"

Desde Tweaks, activa la extensión app indicator y los botones de minimizar y maximizar.

Instala Pipewire para que funcione el compartir pantalla en Wayland:

sudo pacman -S pipewire xdg-desktop-portal-gtk

Wine

  • Instala algunos de estos paquetes (no todos son necesarios)
$ sudo pacman -S \
    wine-staging \
    wine-gecko \
    wine-mono \
    winetricks \
    zenity \
    playonlinux
$ sudo pacman -S \
    giflib \
    lib32-giflib \
    libpng \
    lib32-libpng \
    libldap \
    lib32-libldap \
    gnutls \
    lib32-gnutls \
    mpg123 \
    lib32-mpg123 \
    openal \
    lib32-openal \
    v4l-utils \
    lib32-v4l-utils \
    libpulse \
    lib32-libpulse \
    alsa-plugins \
    lib32-alsa-plugins \
    alsa-lib \
    lib32-alsa-lib \
    libjpeg-turbo \
    lib32-libjpeg-turbo \
    libxcomposite \
    lib32-libxcomposite \
    libxinerama \
    lib32-libxinerama \
    ncurses \
    lib32-ncurses \
    opencl-icd-loader \
    lib32-opencl-icd-loader \
    libxslt \
    lib32-libxslt \
    libva \
    lib32-libva \
    gtk3 \
    lib32-gtk3 \
    gst-plugins-base-libs \
    lib32-gst-plugins-base-libs \
    vulkan-icd-loader \
    lib32-vulkan-icd-loader \
    cups \
    samba \
    dosbox
  • Instala las fuentes de Windows como se explicó antes

  • Ejecuta winetricks

    Con zenity instalado aparecerá una interfaz gráfica que ayuda a crear prefijos, instalar dependencias e instalar y desinstalar programas.

    Los prefijos se crean en ~/.local/share/wineprefixes/.

  • Llama a un programa desde la línea de comandos

    WINEPREFIX="~/.local/share/wineprefixes/nome_prefixo" wine ~/.local/share/wineprefixes/nome_prefixo/drive_c/Programa.exe
    

VPNs

La mayoría de las VPN tienen su propio instalador (que a menudo ya estará en el AUR).

Cuando sea posible, prefiere WireGuard a OpenVPN.


Julio Batista Silva
Autores
Senior Cloud Developer

Soy un ingeniero informático brasileño radicado en Alemania, apasionado por la tecnología, la ciencia, la fotografía y los idiomas.

Llevo programando cerca de dos décadas, explorando desde apps móviles y desarrollo web hasta aprendizaje automático. Hoy me enfoco en SRE en la nube e ingeniería de datos.

Soy voluntario en las comunidades de open source y Python, ayudando a organizar PyCon DE y PyData Berlin, dando mentorías y contribuyendo con código y traducciones.

En mi blog comparto consejos de Linux, guías de configuración y notas personales que escribí como referencia futura. Espero que también sean útiles para otras personas. El contenido está disponible en varios idiomas.

Visita mi galería para ver algunas de mis fotografías.

Fuera del teclado, me encontrarás en conciertos, tocando el clarinete, en bicicleta, buceando o explorando nuevos lugares, culturas y cocinas.

¡Siempre feliz de conectar! 🙂

comments powered by Disqus