Arch Linux (im Dualboot)

Sept. 7, 2020·
Julio Batista Silva
Julio Batista Silva
· 28 Min Lesezeit
blog

Da meine Beratungsarbeit stark von Microsoft-Werkzeugen wie Office und Power BI abhängt, benutze ich vor allem Windows als Betriebssystem.

Ich programmiere weiterhin viel, und zu meiner Überraschung ist das Entwickeln unter Windows sehr angenehm. Wenn ich etwas brauche, das Linux voraussetzt — etwa Airflow oder Redmine — nehme ich WSL und Docker.

Ein Nachteil beim Virtualisieren von Linux ist der Geschwindigkeitsverlust. Deshalb habe ich rund 60 GB abgezweigt, um Arch im Dualboot auf meinem Notebook zu installieren.

Auf Twitter schrieb ich, dass ich Arch installiere, woraufhin mir jemand vorschlug, meine alte Anleitung zu aktualisieren — in 8 Jahren hat sich viel geändert. Also habe ich die über dreijährige Pause dieses Blogs beendet, um mein neues Vorgehen festzuhalten.

Als ich den Beitrag von 2012 schrieb, war das offizielle Wiki nicht aktuell. Heute ist es sehr vollständig, und ich empfehle, ihm für Aktualisierungen und weitere Details zu folgen.

Wie in den früheren Beiträgen weise ich darauf hin: das sind die Einstellungen, die ich für meine Rechner gewählt habe (ein Dell Latitude 3480 und ein Acer Predator Helios 300).
Manches davon passt vielleicht nicht zu deinem System oder ist je nach Desktop-Umgebung schlicht überflüssig.

Kopiere keine Befehle, ohne sie vorher verstanden zu haben!

Auf die einzelnen Befehle gehe ich nicht im Detail ein. Mehr dazu findest du im Internet und im offiziellen Wiki.
Bei Fragen oder Vorschlägen hinterlass gern einen Kommentar hier oder schreib mir eine DM auf Twitter.

Update: Seit Mai 2021 enthält das Arch-ISO einen geführten Installer namens Archinstall. Da ich es so gewohnt bin, bleibe ich bei der manuellen Installation.

Die Platte partitionieren

Ich habe zuerst Windows installiert und dabei die 240-GB-SSD so partitioniert:

  • 529 MB: Windows Recovery
  • 500 MB: EFI (größer als der Standard)
  • 150 GB: Windows
  • 60 GB: Arch Linux
  • Rest: mit Veracrypt verschlüsselte NTFS-Partition, um sowohl von Linux als auch von Windows aus darauf zuzugreifen

Eine Partition für Swap habe ich nicht angelegt. Falls ich sie doch brauche, kann ich eine Swap-Datei auf der Platte, im Arbeitsspeicher oder im Grafikspeicher anlegen.

/, /home und /var liegen bei mir außerdem auf derselben Partition. /boot wird die 500-MB-EFI-Partition. Windows legt sie standardmäßig mit 100 MB an, was aber knapp wird, wenn du viele Module laden oder mehrere Kernel vorhalten willst.

Hätte ich die Partitionen nicht unter Windows angelegt, könnte ich ein Linux-Werkzeug nehmen, etwa cgdisk oder parted

Installations-USB

Ich habe das ISO-Image per BitTorrent geladen und den bootfähigen Stick mit den Standardeinstellungen von Rufus Portable erstellt. Dann habe ich den Rechner neu gestartet und F12 gedrückt, bis die Bootauswahl mit dem Stick erschien. Beim Start der Arch-Installation kam die Meldung, dass auf einen Datenträger mit LABEL=ARCH202008 gewartet wird. Ich habe den Stick einfach neu eingesteckt, und das System startete korrekt.

Tastaturlayout

Nach dem Start im Terminal ist der erste Schritt, die Tastatur einzurichten. Da ich eine brasilianische Tastatur benutze, habe ich den folgenden Befehl ausgeführt:

  • Für eine brasilianische Tastatur:

    loadkeys br-abnt2
    
  • Für eine amerikanische Tastatur:

    loadkeys us-acentos
    

Weitere Möglichkeiten zeigt ls /usr/share/kbd/keymaps/**/*.map.gz.

Die Systemuhr stellen

timedatectl set-ntp true

Unter Linux läuft die Hardwareuhr standardmäßig in UTC, unter Windows dagegen in Ortszeit. Ich lasse sie in UTC und stelle Windows über den Regedit um.

Die Platte verschlüsseln

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

Die Standardeinstellungen fand ich in Ordnung. Mehr Optionen stehen im Wiki.

Listet lsblk deine SSD (M.2 PCIe NVMe) nicht auf, prüfe im BIOS, ob der SATA Mode auf AHCI steht. Wurde Windows im RAID-Modus installiert, musst du es im abgesicherten Modus starten und den SATA Mode im BIOS ändern.

Die Wurzelpartition formatieren

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

Die Partitionen einhängen

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

Verbindung mit dem Internet

  • WLAN

    Verbinde dich über iwd mit dem WLAN

    iwctl --passphrase MINHA_SENHA station wlan0 connect MEU_SSID
    
  • Kabel

    Kabelnetze sollten automatisch funktionieren. Falls nicht:

    • Richte mit Iproute2 eine statische IP ein

    • Hol dir per DHCP eine dynamische IP: systemctl start dhcpcd@enp2s0.

      Den Namen der Schnittstelle liefert ip link.

Mirrorlist

Pacman liest die Datei /etc/pacman.d/mirrorlist, um zu bestimmen, von welchen Spiegeln die Pakete geladen werden. Die aktuellsten und schnellsten sollten oben stehen, damit die Downloads zügig laufen.

Der neue Arch-Installer erledigt das mit Reflector automatisch, sobald die Internetverbindung erkannt wird. Prüfe nur, ob alles stimmt. Da ich in São Paulo bin, standen die Spiegel der UFSCar und der UFPR ganz oben.

Die wichtigsten Pakete installieren

In diesem Schritt installiere ich das Basissystem und alle Pakete, die ich brauche: Netzwerktools, Texteditor, Handbuchseiten, Xorg und 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

Zeitzone

  • Brasilien

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

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

Speichere die Uhrzeit:

hwclock --systohc

Lokalisierung

Ich benutze das System auf Englisch, aktiviere aber auch pt_BR und de_DE. en_GB gefällt mir meist besser als en_US, das ist aber Geschmackssache.

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

Legt Tastaturlayout und Schriftart fest.

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

ou

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

Netzwerkkonfiguration

Trägt den Rechnernamen in /etc/hosts ein und blockiert außerdem einige schädliche und Werbe-Websites.

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

Ich habe encrypt ergänzt, da die Systempartition verschlüsselt ist.

Außerdem lade ich die Nvidia-Module, wie weiter unten erklärt.

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

Pacman

Ergänzt das Repository multilib, färbt Pacman ein und fügt die Pac-Man-Animation hinzu.

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

Root-Passwort

passwd

DNS und Netzwerk

Für die Verbindung mit Kabel- und Funknetzen kannst du direkt Iproute2, wpa_supplicant oder Iwd benutzen, ein Verbindungsmanager macht es aber bequemer.

Ein paar Konfigurationen, die ich schon benutzt habe:

  • NetworkManager

    Der NetworkManager stammt von RedHat und gehört inzwischen zum GNOME-Projekt.

    Damit richtest du Kabelnetze, WLAN, Modems und VPNs ein — über die Kommandozeile ebenso wie über grafische Oberflächen (sehr gut in Gnome und KDE integriert).

    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.
    

    Hinweis: Kabel und WLAN können gleichzeitig verbunden bleiben, sodass es beim Abziehen des Kabels keine Unterbrechung gibt.

    $ 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
    

    Das Netzwerk kann beim Hochfahren gestartet werden:

    sudo systemctl enable systemd-resolved iwd
    
  • Wicd

Benutzer

~# 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

Ich benutze systemd-boot. Da mein Prozessor von Intel ist, lade ich zusätzlich dessen 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

Die UUID der verschlüsselten Partition (/dev/sda5) zeigt der Befehl lsblk -o +UUID.

Mit eingerichtetem Bootloader können wir den Rechner neu starten. Wenn alles klappt, erscheint ein Menü zur Auswahl des Betriebssystems.

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

Wurde kein Display Manager installiert, startet Arch im Terminal. Melde dich mit dem im vorigen Schritt angelegten Benutzer an.

Dotfiles

Meine Dotfiles liegen auf GitHub. Ich klone das Repository und lege die passenden Symlinks an. Sobald ich Zeit habe, automatisiere ich das mit rcm, chezmoi oder GNU Stow.

~$ 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

Es gibt viele Kommandozeilen-Shells, etwa Bash, Zsh, KornShell und Fish. Die installierten Shells listet chsh -l auf.

Zsh benutze ich seit Jahren. Es ist POSIX-konform und wird mit ein paar Plugins (PowerLevel10k usw.) ausgesprochen komfortabel; mein Dotfile installiert und konfiguriert sie automatisch über zplug.

Ich habe meinen Benutzer mit dem Parameter -s /bin/zsh angelegt; die Standard-Shell lässt sich aber auch mit chsh -s full-path-to-shell wechseln.

Terminal-Emulatoren

Für Linux gibt es viele Terminal-Emulatoren, jeder mit eigenen Vor- und Nachteilen.

Früher habe ich urxvt benutzt, weil Startzeit und Speicherverbrauch für mich die wichtigsten Kriterien waren. Jetzt, mit leistungsfähigeren Rechnern, zählen andere Dinge:

  • Plattformübergreifend (zumindest Linux und macOS)
  • Unicode
  • Truecolor
  • Ligatures
  • Tabs
  • GPU accelerated
  • Gute Dokumentation

Von allen, die ich getestet habe, kann Kitty am meisten. Perfekt ist es leider nicht: es hat Phone-Home-Funktionen, benutzt ein eigenes terminfo, das Probleme macht, und der Entwickler verhält sich häufig ausgesprochen unhöflich.

Alacritty ist gut, hat aber keine Tabs — und bekommt sie vielleicht nie.

Terminal-Multiplexer

Terminal-Emulatoren wie Kitty können ein Fenster in mehrere Terminals teilen; die meisten Terminal-Multiplexer können das und noch viel mehr — etwa eine Sitzung weiterlaufen lassen, nachdem das Terminal geschlossen wurde.

Einige, die ich benutzt habe:

  • GNU Screen
    • Am schlichtesten und in vielen Distributionen schon installiert.
  • Tmux
  • Byobu
    • Eine Schicht über Screen oder Tmux. Ich mag es sehr, aber das Projekt wurde im Februar 2020 eingestellt.
  • Zellij
    • Mein aktueller Favorit. Ein junges Projekt (2020 hieß es noch Mosaic), in Rust geschrieben und mit vielen interessanten Funktionen.

Yay

Yay ist ein in Go geschriebener AUR-Helper bzw. Pacman-Wrapper, der die Paketinstallation deutlich erleichtert.

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

Ein paar zusätzliche Pakete, die ich installiere: das Terminal Kitty, der Bildeditor Gimp, VS Code und diverse Hilfsprogramme:

$ 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

Schriftarten

Installiere die Schriften aus dem offiziellen Repository oder aus dem 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

Manuelle Installation

Schriften, die es nicht als Paket gibt, lassen sich von Hand installieren. Du legst die Dateien einfach in einen Unterordner von /usr/local/share/fonts (für alle Benutzer) oder ~/.local/share/fonts/ (nur für dich).

Beispiel:

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
…

Willst du bestimmte Schriften festlegen, bearbeite die Datei $XDG_CONFIG_HOME/fontconfig/fonts.conf.

Windows-Schriften

Die Schriften bekommst du aus dem ISO oder aus dem Ordner C:\Windows\Fonts eines installierten Windows.

Kopiere die Schriften nach /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/*

Alternativ nimmst du ein Paket wie ttf-ms-win10 oder 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

Tastaturen

Die Tastatur meines Notebooks ist ABNT2, manchmal schließe ich aber Tastaturen mit anderen Layouts an.

Jede Tastatur lässt sich über die Device-ID einzeln einrichten, oder man wechselt zwischen vorbereiteten Profilen.

  1. Ermittle die Device-ID der Tastatur

    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. Richte sie mit setxkbmap ein

    $ 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
    

    Die passende Konfiguration findest du über localectl list-x11-keymap-layouts, localectl list-x11-keymap-variants us, localectl list-x11-keymap-options und die Datei /usr/share/X11/xkb/rules/base.lst.

    Mein Beispiel tauscht Feststelltaste und Esc, macht die rechte Strg-Taste zur Compose-Taste (Multi_Key) und die rechte Alt-Taste zur Ebene-3-Taste.

  3. Führe den Befehl beim Systemstart aus

    $ 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: C-Cedille

    Im Layout US International with Dead Keys bekommst du ç mit AltGr + ,; ich nehme aber lieber ´ + c oder compose + c.

    Lege eine ~/.XCompose (oder ~/.config/ibus/Compose) auf Basis von /usr/share/X11/locale/en_US.UTF-8/Compose an:

    # 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>  : "🗼"
    

Ostasiatische Schriftzeichen

Zeichen, die deine Tastatur nicht hergibt, tippst du über ein Input Method Framework wie IBUS oder Fcitx5.

Ich zeige, wie man mit ibus-libpinyin und fcitx5-chinese-addons Chinesisch tippt. Für andere Sprachen und andere IMEs (Input Method Editors) läuft die Einrichtung ähnlich.

IBUS

IBus (Intelligent Input Bus) ist weit verbreitet und in GNOME sogar fest integriert, funktioniert aber auch mit anderen Desktop-Umgebungen gut.

  1. Installiere IBus

    sudo pacman -S ibus ibus-libpinyin
    
  2. Setze die folgenden Umgebungsvariablen:

    sudo nvim /etc/environment
    GTK_IM_MODULE=ibus
    QT_IM_MODULE=ibus
    XMODIFIERS=@im=ibus
    GLFW_IM_MODULE=ibus
    
  3. Richte IBus so ein, dass es mit der Desktop-Umgebung startet

    $ 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 hat ein Widget namens Input Method Panel, ich benutze aber lieber das Standardpanel von IBus.

  4. Konfiguriere IBus

    ibus-setup
    

    Wähle unter Input Method Portuguese (Brazil), Chinese-Intelligent Pinyin und English (US, intl., with dead keys).

    Lege unter General das Kürzel <Super>space fest, um zwischen den Eingabemethoden zu wechseln.

    Setz unter Advanced den Haken, das Systemlayout zu benutzen, damit IBus das mit setxkbmap gesetzte Layout nicht überschreibt.

  5. Passe die Farbe des Panels an deine Taskleiste an

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

Fcitx5

Fcitx (Flexible Context-aware Input Tool with eXtension support) ist das Input Method Framework, das ich benutze.

Es ist sehr flexibel, bringt viele Funktionen mit und fügt sich gut in KDE ein.

  1. Installiere Fcitx5

    sudo pacman -S fcitx5-im fcitx5-chinese-addons
    
  2. Setze die folgenden Umgebungsvariablen:

    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
    

    Die letzte Zeile ist für Kitty. Sie bleibt tatsächlich auf ibus.

  3. Richte Fcitx5 so ein, dass es mit der Desktop-Umgebung startet

    $ 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. Konfiguriere Fcitx5

    Ich empfehle die Einrichtung über die grafische Oberfläche fcitx5-configtool (in KDE ist sie in die Systemeinstellungen unter System Settings » Personalization » Regional Settings » Input Method eingebettet).

    In meinen Tests wurden von Hand bearbeitete Dateien am Ende von den Werten der grafischen Oberfläche überschrieben.

    • 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"
      

      Hinweis: der letzte Eintrag im configtool wird zum 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
      

Keychron-Tastatur

Damit die Tasten F1 bis F12 richtig funktionieren:

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

XDG user directories

Installiere xdg-user-dirs, um die Ordner anzulegen.

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

Energieverwaltung

Es gibt viele Werkzeuge zur Energieverwaltung. Ich benutze diese:

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

Bluetooth

Starte nach der Installation von bluez den bluetooth.service:

sudo systemctl start bluetooth.service

Die Bluez-Konfiguration liegt in /etc/bluetooth/main.conf. Ich benutze die Standardwerte.

Die meisten Desktop-Umgebungen bringen eine Oberfläche fürs Verbinden mit, etwa Bluedevil in KDE; ich installiere aber gern zusätzlich bluez-utils, um Bluetooth-Geräte über die Kommandozeile mit bluetoothctl zu verbinden.

Beispiel: zwei Tastaturen und ein Kopfhörer werden verbunden:

$ 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

Tipp: Mit FN+Z+J setzt du die Keychron-Tastatur zurück und legst die Verbindungen neu fest.

asdf

asdf hat Plugins für so gut wie alles. Es ersetzt pyenv, rbenv, goenv und nvm — es gibt sogar ein Plugin, um verschiedene Poetry-Versionen zu verwalten.

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

Benutze das oh-my-zsh-Plugin, um es zu aktivieren und die Vervollständigungen zu ergänzen.

  • 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
    

Die globalen Versionen stehen in der Datei ~/.tool-versions.

Python

Meine erste Begegnung mit Python liegt über 10 Jahre zurück; heute ist es nicht nur meine Lieblingssprache, sondern auch die, die ich beruflich und für eigene Projekte am meisten benutze.

Das Zen of Python sagt:

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

Für Code stimmt das, beim Packaging sieht die Sache aber ganz anders aus. Meine Gefühlslage beschreibt diese Reihe von xkcd-Comics recht gut: xkcd 353, xkcd 927, xkcd 1987.

xkcd 927

xkcd 927

Meine derzeitigen Vorlieben, der Reihe nach:

  • Zum Verwalten verschiedener Python-Versionen: asdf oder Pyenv.

  • Zum Verwalten virtueller Umgebungen, Steuern von Abhängigkeiten und Veröffentlichen von Paketen: PDM oder Poetry.

  • Für komplexere Machine-Learning-Fälle oder Projekte, die Pakete und Binärdateien brauchen, die es nicht auf pypi gibt: Mambaforge.

  • IDE: VSCode mit der offiziellen Erweiterung oder PyCharm.

    Das Problem bei PyCharm: einige wichtige Funktionen (Framework-Anbindung, SQL-Bearbeitung, Docker-Anbindung usw.) kosten Geld.

Pyenv

Mit Pyenv installierst und benutzt du verschiedene Python-Versionen.

Es ist wie asdf, aber nur für Python. Wenn du asdf ohnehin für andere Sprachen benutzt, lohnt sich Pyenv vermutlich nicht.

  1. Installiere Pyenv:

    sudo pacman -S pyenv
    
  2. Installiere optional auch pyenv-virtualenv:

    yay -S pyenv-virtualenv
    
  3. Ergänze ~/.zshrc um die folgenden Zeilen:

    if (( $+commands[pyenv] )); then eval "$(pyenv init --path)"; fi
    if (( $+commands[pyenv-virtualenv-init] )); then eval "$(pyenv virtualenv-init -)"; fi
    
  4. Sieh nach, welche Versionen es gibt, und installiere die, die du brauchst:

    pyenv install --list
    pyenv install 3.8.12
    pyenv install mambaforge
    
  5. Liste die installierten Versionen auf

    pyenv versions
    
  6. Lege im Ordner eines Projekts die zu benutzende Version fest

    pyenv local 3.8.12
    

    Dabei entsteht eine Datei namens .python-version:

    $ cat .python-version
    3.8.12
    

Poetry

Update: Abschnitt auf Version 1.2 aktualisiert.

  1. Installiere Poetry

    Für Poetry nehme ich lieber nicht die Paketverwaltung des Systems; es gibt gute Alternativen:

    • Skript:

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

      Hinweis: der alte Installer (get-poetry.py) wurde durch install-poetry.py ersetzt. Gib den Parameter --preview nicht an, wenn du die neueste stabile Version willst.

    • asdf:

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

      pipx install poetry
      
  2. Nimm es in den PATH auf

    Der alte Installer benutzte $HOME/.poetry/bin, der neue $HOME/.local/bin.

    Mit meiner Funktion in der .zshrc:

    addToPathStart $HOME/.local/bin
    
  3. Installiere die Vervollständigungen

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

    Der Befehl oben rührt daher, dass ich Prezto benutze. Wichtig ist nur, in einen Ordner zu installieren, der im $fpath steht.

  4. Lege ein neues Projekt an

    poetry new meu-projeto
    cd meu-projeto
    
  5. Lege die Python-Version über Pyenv oder asdf fest

    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. Füge die Abhängigkeiten hinzu

    Entwicklungsabhängigkeiten gibst du mit --dev an.

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

    poetry self update
    

    Denk daran, die Vervollständigungen neu zu erzeugen.

  8. Installiere poetry-plugin-up

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

    Dieses Plugin hebt die Pakete in pyproject.toml auf die neueste Version.

Bleibt Poetry bei “Resolving dependencies” hängen, probier Folgendes:

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 verbindet Mamba und Conda-Forge.

Mamba ist eine Neuimplementierung der Paketverwaltung Conda in C++. Es löst Abhängigkeiten sehr schnell auf und lädt parallel herunter.

Der Conda-Forge-Kanal enthält von der Community geschriebene Recipes für Conda. Er hat weit mehr Pakete als das offizielle Conda-Repository.

  1. Wenn du Pyenv nicht benutzen willst, kannst du Mambaforge von Hand installieren:

    wget https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Linux-x86_64.sh
    bash Mambaforge-Linux-x86_64.sh
    
  2. Aktualisiere die Basispakete

    mamba update mamba
    mamba update --all
    
  3. Lege eine virtuelle Umgebung an und aktiviere sie

    mamba create -n nome_do_env python=3.10 jupyterlab …
    conda activate nome_do_env
    
  4. Installiere ein paar zusätzliche Pakete

    $ 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

PEP 582 wurde im März 2023 vom Python Steering Council

Wie Poetry ist PDM eine Paket- und Abhängigkeitsverwaltung.

Der Unterschied: es folgt den neuen PEPs (PEP 582, PEP 517 und PEP 621).

Du kannst ein virtualenv benutzen oder PEP 582 folgen und einen Ordner namens __pypackages__ nehmen. Er entspricht node_modules und wird dem sys.path hinzugefügt.

Installation

  • Über ein Skript:

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

    asdf plugin add pdm
    asdf install pdm latest
    asdf local pdm latest
    
  • Vervollständigungen in ZSH

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

Verwendung

  • Ein Projekt anlegen

    pdm init
    
  • Abhängigkeiten hinzufügen

    pdm add requests flask
    
  • Entwicklungsabhängigkeiten hinzufügen

    pdm add -dG dev jupyterlab jupyterlab-code-formatter black isort pylint mypy
    
  • Abhängigkeiten entfernen

    pdm remove flask
    
  • Abhängigkeiten auflisten

    pdm list --graph
    
  • Das Projekt installieren

    pdm install
    
  • Anhand der .lock-Datei installieren

    pdm sync
    
  • Abhängigkeiten aktualisieren

    • Alle Pakete

      pdm update
      
    • Ein bestimmtes Paket

      pdm update <paket>
      
      • Pakete einer Gruppe

        pdm update -G <gruppe>
        
      • Aktualisierung angepinnter Pakete erzwingen

        pdm update --update-eager
        
  • Nicht aufgeführte Pakete entfernen

    pdm sync --clean
    
  • Eine Binärdatei in der Umgebung ausführen

    pdm run jupyter lab
    

Aktualisierung

pdm self update

Rust

Für die Rust-Entwicklung wird rustup empfohlen; installieren lässt es sich auf zwei Wegen:

  1. Offizielles Skript:

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

    sudo pacman -S rustup
    rustup default stable
    

    Unter Arch ist das bequemer, da Rust und die davon abhängigen Pakete so stets aktuell bleiben.

Teste die Installation:

$ 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!

Mein Neovim benutzt rust-analyzer als LSP-Server. Es genügt, die Binärdatei zu installieren:

sudo pacman -S rust-analyzer

Nvidia

Eines der Notebooks hat eine integrierte Intel-GPU und eine Nvidia GeForce RTX 2070 Max-Q. Letztere ist schneller als die Intel-GPU, braucht aber mehr Strom.

Du kannst eine der Karten dauerhaft abschalten oder mit Nvidia Optimus je nach Bedarf zwischen ihnen wechseln.

Installiere Treiber und Hilfsprogramme:

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

Ein bestimmtes Programm auf der Nvidia ausführen

Für das sogenannte PRIME render offload startest du das Programm einfach mit prime-run. Zum Beispiel:

sudo pacman -S nvidia-prime
prime-run kdenlive

Nur die Nvidia-Karte benutzen

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

Damit das Modul vor der grafischen Oberfläche geladen wird.

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

(Hinweis: Ist auf der /boot-Partition wenig Platz, kannst du das Erzeugen des Fallback-Images abschalten, indem du die zugehörigen Zeilen in /etc/mkinitcpio.d/linux.preset auskommentierst. Reicht das nicht, musst du die Partitionen anpassen.)

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

Tearing

Screen Tearing heißt, dass Teile verschiedener Einzelbilder gleichzeitig auf dem Bildschirm erscheinen.

Beim Ansehen von Videos auf dem per HDMI angeschlossenen Monitor war das deutlich sichtbar. Teste es mit dem Video https://youtu.be/MfL_JkcEFbE und der Seite https://www.vsynctester.com.

  1. Browser-Einstellung

    Prüfe, ob es etwas bringt, layers.acceleration.force-enabled in Firefox’ about:config zu aktivieren.

  2. Force composition

    Diese Option kann die Latenz erhöhen, hat mein Problem aber gelöst.

    Sieh dir die aktuellen Einstellungen an:

    $ 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}
    

    Aktiviere ForceCompositionPipeline (oder ForceFullCompositionPipeline):

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

    Der Versatz +1920+0 rührt daher, dass das Notebook-Display Full HD ist und links vom externen Monitor steht.

    Sieh dir die neuen Einstellungen an:

    $ 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}
    

    Trag diesen Befehl in eine Datei ein, die beim Start ausgeführt wird, etwa autostart, xinit oder 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"
    

    Sind deine Monitore fest, kannst du /etc/X11/xorg.conf.d/20-nvidia.conf benutzen:

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

Fenstermanager und Desktop-Umgebungen

Awesome

Für AwesomeWM mag ich die Konfiguration von Gerome Matilla. Sie ist etwas aufgebläht, aber die Layouts sind schön und haben interessante Funktionen.

KDE

KDE Plasma ist eine sehr gute Desktop-Umgebung, deren Standardeinstellungen mir gut gefallen.

Auf meinen alten Rechnern habe ich KDE gemieden, weil es nicht leichtgewichtig genug war; mit meiner heutigen Hardware ist das kein großes Problem mehr.

Ich empfehle, die folgenden Pakete zu installieren:

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

Feststelltaste und ESC tauschst du unter System Settings » Keyboard » Advanced » Caps Lock behavior » Swap Esc and Caps Lock.

Installiere kdeconnect auf dem Rechner und auf Android-Geräten, um Benachrichtigungen abzugleichen, Dateien und die Zwischenablage zu teilen, das Android-Gerät als Maus und Tastatur zu benutzen und vieles mehr.

Probier die Optionen OpenGL und XRender unter System Settings » Hardware » Display and Monitor » Compositor » Rendering backend aus. OpenGL ist vermutlich die bessere Wahl, ich habe aber von Problemen mit Nvidia-Karten gelesen.

Willst du die Mediensteuerung nicht im Sperrbildschirm sehen, führe den folgenden Befehl aus:

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

Sind die Schriften zu groß, erzwing den DPI-Wert unter System Settings » Fonts » Force font DPI: 96.

Tiling in KDE: Kröhnkite

  1. Verschiebe die Taskleiste an den oberen Bildschirmrand;

  2. Verkleinere die Leiste (ich habe 30 genommen);

  3. Klick mit der rechten Maustaste auf die Taskleiste, wähle Show Alternatives und dann “Icons-only Task Manager”;

  4. Rechtsklick auf den 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. Aktiviere die Kröhnkite-Einstellungen

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

    Im Fenster KWin Scripts erscheint eine Schaltfläche zum Konfigurieren von Kröhnkite. Dort mache ich Folgendes:

    • Das Quarter layout aktivieren
    • 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. Geh auf System Settings » Workspace » Workspace Behavior » Virtual Desktops und lege so viele Arbeitsflächen an, wie du magst (ich habe 8, in zwei Reihen);

  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. Farbe der Ränder

    kwriteconfig5 --file ~/.config/kdeglobals --group WM --key frame 61,174,233
    kwriteconfig5 --file ~/.config/kdeglobals --group WM --key inactiveFrame  239,240,241
    
  12. Die Mindestgröße der Fenster entfernen

    • 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. Ändere die Kürzel unter System Settings » Workspace » Shortcuts » KRunner

    • KRunner: Meta + R
  14. Ändere die Kürzel unter 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 (ich benutze Meta + F1,…,F8, weil Meta+Shift+6 mit einer US-intl.-Tastatur nicht funktioniert)
    • Window to Previous Screen: Meta + <
    • Window to Next Screen: Meta + >
    • Krohnkite: Float All: Meta+Shift+F
    • Krohnkite: Right: Meta+L (zum Sperren des Bildschirms ctrl+alt+L benutzen)

Anbindung an Android

Auf MTP-Geräte kann immer nur ein Programm zugreifen.

Um ein Tablet mit Calibre abzugleichen, darf KDE das Gerät nicht schon eingehängt haben.

Beende den Prozess kiod5.

Gnome

Gnome ist eine vollständige und weit verbreitete Desktop-Umgebung. Die Standardeinstellungen mag ich nicht besonders, aber nach ein paar schnellen Anpassungen lässt es sich gut benutzen:

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']"

Aktiviere über Tweaks die App-Indicator-Erweiterung sowie die Schaltflächen zum Minimieren und Maximieren.

Installiere Pipewire, damit die Bildschirmfreigabe unter Wayland funktioniert:

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

Wine

  • Installiere einige der folgenden Pakete (nicht alle sind nötig)
$ 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
  • Installiere die Windows-Schriften wie oben beschrieben

  • Führe winetricks aus

    Ist zenity installiert, erscheint eine grafische Oberfläche, die beim Anlegen von Prefixes, beim Installieren von Abhängigkeiten und beim Installieren und Entfernen von Programmen hilft.

    Die Prefixes landen in ~/.local/share/wineprefixes/.

  • Ruf ein Programm über die Kommandozeile auf

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

VPNs

Die meisten VPNs bringen einen eigenen Installer mit (der oft schon im AUR liegt).

Nimm nach Möglichkeit WireGuard statt OpenVPN.


Julio Batista Silva
Autoren
Senior Cloud Developer

Ich bin ein brasilianischer Computeringenieur mit Wohnsitz in Deutschland und begeistere mich für Technik, Wissenschaft, Fotografie und Sprachen.

Ich programmiere seit etwa zwei Jahrzehnten und habe dabei alles von mobilen Apps und Webentwicklung bis hin zu Machine Learning erkundet. Derzeit fokussiere ich mich auf Cloud‑SRE und Data Engineering.

Ich engagiere mich ehrenamtlich in den Open‑Source- und Python‑Communities, helfe bei der Organisation der PyCon DE und PyData Berlin, betreue als Mentor und trage mit Code und Übersetzungen bei.

In meinem Blog teile ich Linux‑Tipps, Einrichtungsanleitungen und persönliche Notizen, die ich als spätere Referenz geschrieben habe. Ich hoffe, dass sie auch anderen nützlich sind. Die Inhalte sind in mehreren Sprachen verfügbar.

Schau dir meine Galerie an, um einige meiner Fotografien zu sehen.

Abseits der Tastatur findest du mich auf Konzerten, beim Klarinettenspiel, Radfahren, Tauchen oder beim Erkunden neuer Orte, Kulturen und Küchen.

Ich freue mich immer über den Austausch! 🙂

comments powered by Disqus