Arch Linux (im Dual‑Boot)

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

Da meine Beratungsarbeit stark von Microsoft‑Werkzeugen wie Office und Power BI abhängt, nutze ich primär Windows als Betriebssystem.

Ich programmiere weiterhin viel und, zu meiner Überraschung, ist Entwickeln unter Windows sehr gut geworden. Wenn ich etwas Linux‑Spezifisches wie Airflow oder Redmine ausführen muss, kann ich WSL und Docker verwenden.

Eines der Probleme bei der Virtualisierung von Linux ist der Performance‑Verlust. Daher habe ich ca. 60 GB reserviert, um Arch im Dual‑Boot auf meinem Notebook zu installieren.

Ich schrieb auf Twitter, dass ich Arch installiere, und mir wurde nahegelegt, meinen alten Leitfaden zu aktualisieren, denn in 8 Jahren hat sich viel geändert. Also habe ich beschlossen, die über 3‑jährige Blog‑Pause zu unterbrechen und meinen neuen Installationsprozess zu dokumentieren.

Als ich meinen Beitrag von 2012 schrieb, war die offizielle Wiki noch nicht auf dem aktuellen Stand. Heute ist sie sehr vollständig und ich empfehle, ihr zu folgen für mögliche Aktualisierungen und weitere Details.

Wie in den früheren Beiträgen stelle ich klar, dass dies die Konfigurationen sind, die ich für meine Rechner gewählt habe (ein Dell Latitude 3480 und ein Acer Predator Helios 300).
Einige hier aufgeführte Einstellungen können mit deinem System inkompatibel sein oder je nach verwendeter Desktop‑Umgebung einfach unnötig.

Hinweis
Kopiere keine Befehle, ohne sie vorher zu verstehen!

Ich gehe nicht allzu sehr auf die Details der verwendeten Befehle ein. Weitere Informationen dazu findest du im Internet und in der offiziellen Wiki.
Wenn du Fragen oder Vorschläge hast, hinterlasse gerne einen Kommentar hier oder schicke mir eine DM auf Twitter.

Update: Seit Mai 2021 enthält die Arch‑ISO einen geführten Installer namens Archinstall. Da ich den manuellen Weg gewohnt bin, führe ich die Installation weiterhin manuell durch.

Partitionierung der Festplatte

Ich habe zuerst Windows installiert und währenddessen die 240‑GB‑SSD wie folgt 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, sowohl unter Linux als auch unter Windows nutzbar

Ich habe keine Partition für Swap erstellt. Falls ich sie irgendwann benötige, kann ich eine Swap‑Datei auf der Platte, im Speicher oder im Videospeicher anlegen.

Außerdem habe ich /, /home und /var auf derselben Partition gelassen. /boot wird die 500‑MB‑ EFI‑Partition sein. Standardmäßig legt Windows diese Partition mit 100 MB an, was aber ggf. nicht ausreicht, wenn du viele Module laden oder mehrere Kernel haben möchtest.

Wenn ich die Partitionen nicht mit Windows erstellt hätte, könnte ich auch ein Werkzeug unter Linux verwenden, z. B. cgdisk oder parted

Installations‑USB

Ich habe das ISO‑Image per BitTorrent heruntergeladen und den bootfähigen USB‑Stick mit den Standard‑Optionen von Rufus Portable erstellt. Ich habe den Rechner neu gestartet und wiederholt F12 gedrückt, bis die Liste mit der Boot‑Option für den USB‑Stick erschien. Beim Auswählen der Arch‑Installationsoption erschien eine Meldung, die auf einen Datenträger mit LABEL=ARCH202008 wartete. Ich habe den Stick einfach erneut an den USB‑Port angeschlossen und das System wurde korrekt geladen.

Tastaturlayout

Im Terminal ist der erste Schritt, die Tastatur zu konfigurieren. Da ich eine brasilianische Tastatur benutze, habe ich folgenden Befehl ausgeführt:

  • Für brasilianische Tastatur:

    loadkeys br-abnt2
    
  • Für US‑amerikanische Tastatur:

    loadkeys us-acentos
    

Weitere Optionen findest du unter ls /usr/share/kbd/keymaps/**/*.map.gz.

Systemuhr aktualisieren

timedatectl set-ntp true

Der Standard unter Linux ist, die Hardware‑Uhr auf UTC zu lassen; Windows verwendet standardmäßig die Lokalzeit. Ich bevorzuge UTC und passe Windows per Regedit an.

Datenträgerverschlüsselung

lsblk                       # Um die Partition zu finden. Bei mir /dev/sda5
cryptsetup -v luksFormat /dev/sda5

Die Standardeinstellungen fand ich OK. Weitere Optionen findest du in der Wiki.

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

Formatierung der Root‑Partition

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

Partitionen einhängen

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

Internetverbindung

  • WLAN

    Verbinde dich per iwd mit dem WLAN

    iwctl --passphrase MINHA_SENHA station wlan0 connect MEU_SSID
    
  • Kabel

    Kabelgebundene Netzwerke sollten automatisch funktionieren. Falls nicht:

    • Konfiguriere eine statische IP mit Iproute2

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

      Verwende ip link, um den Schnittstellennamen zu ermitteln.

Mirrorlist

Pacman liest die Datei /etc/pacman.d/mirrorlist, um zu bestimmen, von welchen Mirrors Pakete heruntergeladen werden. Es ist gut, die aktuellsten und schnellsten oben zu lassen, damit Downloads nicht lange dauern.

Der neue Arch‑Installer sollte dies automatisch mit dem Reflector erledigen, sobald die Internetverbindung erkannt wurde. Überprüfe nur, ob alles OK ist. Da ich in São Paulo bin, standen die Mirrors der UFSCar und UFPR ganz oben.

Installation der Hauptpakete

In diesem Schritt installiere ich das Basissystem und alle Pakete, die ich benötigen werde, wie Netzwerk‑Tools, 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. Ich tendiere zu en_GB statt 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

Virtuelle Konsole

Konfiguriert das Tastaturlayout und die Schriftart.

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

oder

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

Netzwerkkonfiguration

Fügt den Rechnernamen in /etc/hosts ein und blockiert außerdem einige bösartige 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 hinzugefügt, 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

Fügt das multilib‑Repository hinzu, färbt Pacman ein und aktiviert die Pac‑Man‑Animation.

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

Man kann sich direkt mit Iproute2, wpa_supplicant oder Iwd mit kabelgebundenen und drahtlosen Netzen verbinden, aber ein Network‑Manager vereinfacht den Prozess.

Einige Konfigurationen, die ich genutzt habe:

  • NetworkManager

    Der NetworkManager wurde von Red Hat geschaffen und ist jetzt Teil des GNOME‑Projekts.

    Er erlaubt die Konfiguration von Kabel, WLAN, Modems und VPNs sowohl per Kommandozeile als auch via GUI (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: Es ist möglich, sowohl Kabel als auch WLAN gleichzeitig verbunden zu lassen, sodass beim Abziehen des Kabels keine Downtime entsteht.

    $ 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
Entkommentiere die Zeile `%wheel ALL=(ALL) ALL`

Bootloader

Ich verwende systemd-boot. Da mein Prozessor von Intel ist, lade ich auch 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) kann mit lsblk -o +UUID angezeigt werden.

Mit dem konfigurierten 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

Wenn kein Display‑Manager installiert wurde, startet Arch im Terminal. Melde dich mit dem im vorherigen Schritt erstellten Benutzer an.

Dotfiles

Meine Dotfiles sind auf Github verfügbar. Ich klone das Repository und erstelle die passenden Symlinks. Wenn ich Zeit habe, werde ich rcm, chezmoi oder GNU Stow benutzen, um das zu automatisieren.

~$ 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 Optionen für Kommandozeilen‑Shells wie Bash, Zsh, KornShell und Fish. Um die installierten Shells aufzulisten, führe chsh -l aus.

Ich benutze seit Jahren Zsh. Sie ist POSIX‑konform und wird mit einigen Plugins (PowerLevel10k etc.), die meine Dotfiles automatisch mit zplug installieren und konfigurieren, sehr benutzerfreundlich.

Ich habe meinen Benutzer mit dem Parameter -s /bin/zsh erstellt, aber man kann die Standard‑Shell mit chsh -s full-path-to-shell ändern.

Terminalemulatoren

Es gibt viele Terminal‑ Emulatoren für Linux, jeweils mit Vor‑ und Nachteilen.

Früher habe ich urxvt verwendet, weil Startzeit und Speicherverbrauch für mich früher die Hauptfaktoren waren. Jetzt, da ich leistungsfähigere Rechner habe, stechen andere Features hervor:

  • Multiplattform (mindestens Linux und macOS)
  • Unicode
  • Truecolor
  • Ligatures
  • Tabs
  • GPU‑beschleunigt
  • Gute Dokumentation

Von allen, die ich getestet habe, bietet Kitty die meisten Funktionen. Leider ist es nicht perfekt, hat Phone‑Home‑Funktionen, verwendet eine eigene terminfo, die Probleme verursacht, und der Entwickler verhält sich häufig unhöflich bis rüde.

Alacritty ist gut, hat aber keine Tabs und wird sie vielleicht nie haben.

Terminal‑Multiplexer

Terminalemulatoren wie Kitty erlauben, ein einzelnes Fenster in mehrere Terminals zu teilen, aber die meisten Multiplexer können das und noch viel mehr, z. B. eine Sitzung weiterlaufen lassen, auch wenn das Terminal geschlossen wird.

Einige, die ich verwendet habe:

  • GNU Screen
    • Am einfachsten und auf vielen Distributionen bereits vorinstalliert.
  • 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 neues Projekt (hieß 2020 Mosaic), in Rust geschrieben und mit vielen interessanten Features.

Yay

Yay ist ein in Go geschriebener AUR‑Helper/Pacman‑Wrapper, der die Paketinstallation stark erleichtert.

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

Einige zusätzliche Pakete, die ich installiere, darunter das Terminal Kitty, der Bildeditor Gimp, VS Code und diverse Utilities:

$ 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

Schriften

Installiere die im offiziellen Repository oder im AUR verfügbaren Schriften:

$ 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 nicht als Paket verfügbar sind, können manuell installiert werden. Lege die Dateien einfach in ein Unterverzeichnis von /usr/local/share/fonts (für alle Benutzer) oder ~/.local/share/fonts/ (nur für den eigenen Benutzer).

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

Wenn du bestimmte Schriften erzwingen möchtest, bearbeite die Datei $XDG_CONFIG_HOME/fontconfig/fonts.conf.

Windows‑Schriften

Du kannst die Schriften von der ISO oder aus dem Ordner C:\\Windows\\Fonts einer installierten Windows‑Installation holen.

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 nutze 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, aber gelegentlich schließe ich Tastaturen mit anderen Layouts an.

Es ist möglich, jede Tastatur individuell per Device‑ID zu konfigurieren oder zwischen vorkonfigurierten Profilen umzuschalten.

  1. Ermittele 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. Konfiguriere with 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
    

    Benutze 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, um die passende Konfiguration zu finden.

    In meinem Beispiel wird CapsLock mit Esc getauscht, die rechte Strg‑Taste als Compose‑Taste (Multi_Key) verwendet und die rechte Alt‑Taste für die dritte Ebene.

  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‑Cedilha

    Im Layout „US International with Dead Keys“ erhält man „ç“ mit „AltGr + ,“, ich bevorzuge jedoch „´ + c“ oder „compose + c“.

    Erstelle eine Datei ~/.XCompose (oder ~/.config/ibus/Compose) basierend auf /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>  : "🗼"
    

Ostasiatische Zeichen

Man kann Zeichen, die auf der eigenen Tastatur nicht vorhanden sind, mit Hilfe eines Input‑Method‑Frameworks wie IBUS oder Fcitx5 eingeben.

Ich zeige, wie man mit ibus-libpinyin und fcitx5-chinese-addons Chinesisch tippt. Die Konfiguration für andere Sprachen mit anderen IMEs (Input Method Editors) ist ähnlich.

IBUS

IBus (Intelligent Input Bus) ist sehr beliebt. Es ist sogar im GNOME integriert, funktioniert aber auch gut mit anderen Desktop‑Umgebungen.

  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. Starte IBus mit dem DE

    $ 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 verwende jedoch lieber das Standard‑Panel des IBus.

  4. Konfiguriere IBus

    ibus-setup
    

    Unter Input Method wähle Portuguese (Brazil), Chinese‑Intelligent Pinyin und English (US, intl., with dead keys).

    Unter General konfiguriere den Shortcut „Super+Leertaste“, um zwischen Input‑Methoden zu wechseln.

    Unter Advanced aktiviere die Option, das System‑Layout zu verwenden, damit IBus das mit setxkbmap definierte Layout nicht überschreibt.

  5. Ändere die Farbe des Panels, damit es zur Taskleiste passt

    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, hat viele Funktionen und integriert sich gut mit KDE.

  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 auf ibus.

  3. Starte Fcitx5 mit dem DE

    $ 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 Konfiguration über das GUI‑Tool fcitx5-configtool vorzunehmen (unter KDE ist es in die Systemeinstellungen integriert unter System Settings » Personalization » Regional Settings » Input Method).

    In meinen Tests wurden manuell bearbeitete Dateien von den Werten aus der GUI ü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 der DefaultIM sein.

    • 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 Funktionstasten F1,…,F12 korrekt funktionieren:

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

XDG‑Benutzerverzeichnisse

Installiere xdg-user-dirs, um die Ordner zu erstellen.

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

Energiemanagement

Es gibt viele Tools für das Energiemanagement. Ich verwende folgende:

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

Bluetooth

Nach der Installation von bluez starte den bluetooth.service:

sudo systemctl start bluetooth.service

Die Konfiguration von Bluez befindet sich unter /etc/bluetooth/main.conf. Ich nutze die Standards.

Die meisten Desktop‑Umgebungen enthalten eine GUI zur einfachen Verbindung, wie Bluedevil unter KDE. Zusätzlich installiere ich gerne bluez-utils, um Bluetooth‑Geräte in der Konsole mit bluetoothctl zu verbinden.

Beispiel: Verbinden von zwei Tastaturen und einem Kopfhörer:

$ 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: Benutze FN+Z+J, um die Keychron‑Tastatur zurückzusetzen und die Verbindungen zu löschen.

asdf

asdf besitzt Plugins für fast alles. Es kann pyenv, rbenv, goenv und nvm ersetzen. Es gibt sogar ein Plugin, um verschiedene Versionen von Poetry zu verwalten.

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

Nutze das Plugin von oh-my-zsh, um es zu aktivieren und Completions hinzuzufügen.

  • 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
    

Globale Versionen werden in der Datei ~/.tool-versions definiert.

Python

Ich hatte meinen ersten Kontakt mit Python vor über 10 Jahren und heute ist es nicht nur meine Lieblingssprache, sondern auch die Sprache, die ich am meisten für Arbeit und persönliche Projekte verwende.

Der Zen von Python sagt:

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

Das gilt für Code, aber beim Packaging ist die Geschichte ganz anders. Meine Gefühle werden in dieser xkcd‑Reihe gut dargestellt: xkcd 353, xkcd 927, xkcd 1987.

xkcd 927

xkcd 927

Meine aktuellen Vorlieben sind in dieser Reihenfolge:

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

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

  • Für komplexere Fälle von Machine Learning oder Projekte, die von Paketen und Binaries abhängen, die nicht auf pypi verfügbar sind: Mambaforge.

  • IDE: VSCode mit offizieller Erweiterung oder PyCharm.

    Das Problem bei PyCharm ist, dass einige wichtige Funktionen (Framework‑Integration, SQL‑Editor, Docker‑Integration etc.) kostenpflichtig sind.

Pyenv

Pyenv ermöglicht die Installation und Nutzung verschiedener Python‑Versionen.

Es ist wie asdf, aber ausschließlich für Python. Wenn du bereits asdf für andere Sprachen benutzt, ergibt es vielleicht wenig Sinn, Pyenv zu installieren.

  1. Installiere Pyenv:
sudo pacman -S pyenv
  1. Optional: installiere auch pyenv-virtualenv:
yay -S pyenv-virtualenv
  1. Füge die folgenden Zeilen in ~/.zshrc ein:
if (( $+commands[pyenv] )); then eval "$(pyenv init --path)"; fi
if (( $+commands[pyenv-virtualenv-init] )); then eval "$(pyenv virtualenv-init -)"; fi
  1. Prüfe, welche Versionen vorhanden sind, und installiere die benötigten:
pyenv install --list
pyenv install 3.8.12
pyenv install mambaforge
  1. Liste die installierten Versionen auf
pyenv versions
  1. Lege im Projektordner die zu verwendende Version fest
pyenv local 3.8.12

Es wird eine Datei namens .python-version erzeugt:

$ cat .python-version
3.8.12

Poetry

Update: Abschnitt für Version 1.2 aktualisiert.

  1. Installiere Poetry

Ich bevorzuge es, den System‑Paketmanager nicht für Poetry zu verwenden; es gibt ein paar gute Alternativen:

  • Script:

    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. Lass --preview weg, wenn du die letzte stabile Version willst.

  • asdf:

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

    pipx install poetry
    
  1. Füge es zum PATH hinzu

Der alte Installer nutzte $HOME/.poetry/bin. Der neue nutzt $HOME/.local/bin.

Mit meiner Funktion in .zshrc:

addToPathStart $HOME/.local/bin
  1. Installiere Completions
poetry completions zsh > ~/.zprezto/modules/completion/external/src/_poetry

Der obige Befehl liegt daran, dass ich Prezto nutze. Wichtig ist, es in einem Ordner zu installieren, der im $fpath liegt.

  1. Erstelle ein neues Projekt
poetry new mein-projekt
cd mein-projekt
  1. Lege die Python‑Version mit Pyenv oder asdf fest
pyenv local 3.8.12

oder

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

oder

poetry env use -- /home/julio/.asdf/installs/python/3.10.3/bin/python
poetry run python --version
poetry debug info
  1. Abhängigkeiten hinzufügen

Dev‑Abhängigkeiten werden mit --dev bzw. in neueren Versionen über Gruppen angegeben:

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

Denk daran, die Completions erneut zu generieren.

  1. poetry-plugin-up installieren
poetry self add poetry-plugin-up
poetry up --latest

Dieses Plugin aktualisiert die Pakete in pyproject.toml auf die neuesten Versionen.

Wenn Poetry bei “Resolving dependencies” hängen bleibt, versuch 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 kombiniert Mamba und Conda-Forge.

Mamba ist eine Reimplementierung des Paketmanagers Conda in C++. Es löst Abhängigkeiten sehr schnell und lädt parallel herunter.

Der Conda-Forge-Kanal enthält Community‑Rezepte für Conda. Er hat viel mehr Pakete als das offizielle Conda-Repository.

  1. Wenn du Pyenv nicht nutzen willst, kannst du Mambaforge manuell installieren:

    wget https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Linux-x86_64.sh
    bash Mambaforge-Linux-x86_64.sh
    
  2. Basis‑Pakete aktualisieren

    mamba update mamba
    mamba update --all
    
  3. Virtuelle Umgebung erstellen und aktivieren

    mamba create -n name_des_env python=3.10 jupyterlab …
    conda activate name_des_env
    
  4. Einige zusätzliche Pakete installieren

    $ 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

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

Wie Poetry ist PDM ein Paket‑ und Abhängigkeitsmanager.

Der Unterschied ist, dass er den neuen PEPs folgt (PEP 582, PEP 517 und PEP 621).

Es ist möglich, ein Virtualenv zu verwenden oder PEP 582 zu folgen und einen Ordner namens __pypackages__ zu nutzen. Dieser Ordner entspricht node_modules und wird zu sys.path hinzugefügt.

Installation

  • Per Script:

    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
    
  • Completions in ZSH

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

Verwendung

  • Projekt erstellen

    pdm init
    
  • Abhängigkeiten hinzufügen

    pdm add requests flask
    
  • Dev‑Abhä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
    
  • Projekt installieren

    pdm install
    
  • Installation basierend auf der .lock‑Datei

    pdm sync
    
  • Abhängigkeiten aktualisieren

    • Alle Pakete

      pdm update
      
    • Ein bestimmtes Paket

      pdm update <paket>
      
      • Pakete einer Gruppe

        pdm update -G <gruppe>
        
      • Erzwingt Update gepinnter Pakete

        pdm update --update-eager
        
  • Nicht gelistete Pakete entfernen

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

    pdm run jupyter lab
    

Aktualisierung

pdm self update

Rust

Empfohlen für Rust‑Entwicklung ist die Nutzung von rustup, das auf zwei Arten installiert werden kann:

  1. Offizielles Script:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  1. Pacman:
sudo pacman -S rustup
rustup default stable

Diese Variante ist unter Arch bequemer, da Rust und davon abhängige Pakete ständig aktuell bleiben.

Installation testen:

$ 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 ist so konfiguriert, dass er den rust-analyzer als LSP‑Server nutzt. Installiere einfach das Binary:

sudo pacman -S rust-analyzer

Nvidia

Eines meiner Notebooks hat eine integrierte Intel‑GPU und eine Nvidia GeForce RTX 2070 Max‑Q, die leistungsfähiger ist als die Intel‑GPU, aber mehr Energie verbraucht.

Es ist möglich, eine der Karten dauerhaft zu deaktivieren oder die Nvidia Optimus‑Technologie zu verwenden, um je nach Bedarf zwischen den Karten zu wechseln.

Installiere die Treiber und Tools:

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

Ein bestimmtes Programm auf der Nvidia ausführen

Für das PRIME render offload starte das Programm einfach mit prime-run. Beispiel:

sudo pacman -S nvidia-prime
prime-run kdenlive

Nur die Nvidia‑Karte verwenden

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 (oder /usr/share/sddm/scripts/Xsetup für SDDM)
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto
setxkbmap br -option caps:swapescape

Sorge dafür, dass 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: Wenn auf der Partition /boot wenig freier Speicher vorhanden ist, kann die Erstellung des Fallback‑Images deaktiviert werden, indem die entsprechenden Zeilen in /etc/mkinitcpio.d/linux.preset auskommentiert werden. Reicht das nicht, müssen die Partitionen vergrößert werden.)

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

Tearing

Screen tearing ist, wenn Teile verschiedener Frames gleichzeitig auf dem Bildschirm angezeigt werden.

Dieses Problem war beim Ansehen von Videos am per HDMI angeschlossenen Monitor deutlich sichtbar. Teste mit dem Video https://youtu.be/MfL_JkcEFbE und der Seite https://www.vsynctester.com.

  1. Browser‑Konfiguration

Prüfe, ob das Aktivieren von layers.acceleration.force-enabled in about:config von Firefox etwas verbessert.

  1. Force composition

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

Prüfe die aktuellen Einstellungen:

$ 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 Offset +1920+0 ist, weil das Notebook‑Display Full HD hat und links vom externen Monitor steht.

Prüfe die neuen Einstellungen:

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

Füge diesen Befehl in eine Datei ein, die beim Start ausgeführt wird, z. B. 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"

Wenn deine Monitore fix sind, kannst du /etc/X11/xorg.conf.d/20-nvidia.conf verwenden:

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

Window Manager und Desktop Environments

Awesome

Für AwesomeWM mag ich die Konfigurationen von Gerome Matilla. Sie sind etwas aufgebläht, aber die Layouts sind hübsch und haben interessante Features.

KDE

KDE Plasma ist ein sehr gutes DE mit Standardeinstellungen, die mir gut gefallen.

Früher habe ich KDE auf meinen alten Rechnern gemieden, weil es nicht leicht genug war, aber mit meiner aktuellen Hardware ist das kein großes Problem mehr.

Ich empfehle, folgende Pakete zu installieren:

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

Das Tauschen von Caps Lock mit ESC kann unter System Settings » Keyboard » Advanced » Caps Lock behavior » Swap Esc and Caps Lock erfolgen.

Installiere kdeconnect auf dem Rechner und auf Android‑Geräten, um Benachrichtigungen zu synchronisieren, Dateien zu teilen, die Zwischenablage zu teilen, das Android‑Gerät als Maus und Tastatur zu verwenden und mehr.

Teste die Optionen OpenGL und XRender unter System Settings » Hardware » Display and Monitor » Compositor » Rendering backend. Die beste Option ist wahrscheinlich OpenGL, aber es gibt Berichte über Probleme mit Nvidia‑Karten.

Wenn du die Mediensteuerung auf dem Sperrbildschirm nicht anzeigen möchtest, führe folgenden Befehl aus:

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

Wenn die Schriften zu groß sind, erzwinge 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. Verringere die Leistenhöhe (ich verwende 30);

  3. Rechtsklick auf die Taskleiste, „Show Alternatives“ und „Icons‑only Task Manager“ wählen;

  4. Rechtsklick auf 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. Kröhnkite‑Einstellungen aktivieren

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

    Über den KWin‑Scripts‑Bildschirm erscheint ein Konfigurationsbutton für Kröhnkite. Dort mache ich:

    • Aktivierung des Quarter‑Layouts
    • 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. Öffne System Settings » Workspace » Workspace Behavior » Virtual Desktops und füge so viele Desktops hinzu, wie du willst (ich nutze 8, angezeigt 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. Rahmenfarben

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

    • System Settings » Workspace » Window Rules
    • Add New…
    • Window class: Unimportant
    • Window types: Normal Window
    • Add Properties…
    • Minimum Size: Force 0 x 0
  13. Shortcuts ändern unter System Settings » Workspace » Shortcuts » KRunner

    • KRunner: Meta + R
  14. Shortcuts ändern 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 nutze Meta + F1,…,F8, da Meta+Shift+6 nicht mit US‑intl. Tastatur funktioniert.)
    • Window to Previous Screen: Meta + <
    • Window to Next Screen: Meta + >
    • Krohnkite: Float All: Meta+Shift+F
    • Krohnkite: Right: Meta+L (nutze ctrl+alt+L zum Sperren)

Integration mit Android

MTP‑Geräte können immer nur von einem Programm genutzt werden.

Um ein Tablet mit Calibre zu synchronisieren, darf KDE das Gerät zuvor nicht gemountet haben.

Beende den Prozess kiod5.

Gnome

Gnome ist ein vollständiges und beliebtes DE. Ich mag die Standardeinstellungen nicht so sehr, aber nach ein paar Anpassungen ist es gut nutzbar:

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

Über Tweaks aktiviere die App‑Indicator‑Erweiterung sowie die Buttons „Minimieren“ und „Maximieren“.

Installiere Pipewire, damit Screen‑Sharing unter Wayland funktioniert:

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

Wine

  • Installiere einige der folgenden Pakete (nicht alle sind erforderlich)
$ 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

  • Starte winetricks

    Mit installiertem zenity erscheint eine GUI, um Prefixe zu erstellen, Abhängigkeiten zu installieren, Programme zu installieren/deinstallieren.

    Die Prefixe werden unter ~/.local/share/wineprefixes/ erstellt.

  • Programm über die Kommandozeile starten

    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 (oft auch im AUR verfügbar).

Bevorzuge WireGuard gegenüber OpenVPN, wenn möglich.


Julio Batista Silva
Autoren
Senior Cloud-Entwickler
comments powered by Disqus