Effiziente Dotfile-Verwaltung

Chezmoi im Einsatz

Christoph Stoettner

stoeps@vegardit.com

@stoeps@infosec.exchange

Christoph Stoettner (stoeps)

  • Macht seit 30 Jahren was mit Computern

    • Amiga, OS/2, Linux

    • Beruflich auch Windows (wenn es sein muss)

  • Started with Linux / OSS around 1994/1995

    • Linux Kernel < 1.0

    • Slackware

  • mag vi, vim, neovim

    • zu doof für emacs

Agenda

  • Was sind Dotfiles und warum sollte man sie verwalten?

  • Traditionelle Ansätze zur Dotfile-Verwaltung

  • Einführung in chezmoi

  • Installation und Einrichtung von chezmoi

  • Grundlegende Nutzung und Befehle

  • Verwaltung von Geheimnissen

  • Vorlagen und Skripte

  • Verwaltung mehrerer Geräte

  • Bewährte Methoden und Tipps

Was sind Dotfiles?

  • Konfigurationsdateien, die mit einem Punkt (.) beginnen

  • Oder in $XDG_CONFIG_HOME (~/.config)

  • Standardmäßig in Unix-ähnlichen Systemen versteckt

  • Beispiele:

    • .bashrc

    • .vimrc

    • .gitconfig

    • .tmux.conf

    • .zshrc

20250306-205400.png
20250306-205623.png

Warum

Neuer Rechner

  • Neukauf

  • Distrohopping

  • Automatisierung

Mehrere Rechner

  • Linux

  • Mac OS X

  • Windows mit WSL

  • Konsistenz

Arbeit & Privat

  • Backup

  • Versionskontrolle

  • Teilen

Traditionelle Ansätze

  • Manuelles Kopieren (fehleranfällig!)

  • Einfaches Git-Repository

  • Symlink-basierte Lösungen

  • Benutzerdefinierte Skripte

  • Spezialisierte Tools (GNU Stow, rcm, usw.)

Einschränkungen traditioneller Ansätze

  • Schwierige Handhabung gerätespezifischer Konfigurationen

  • Eingeschränkte Verwaltung von Tokens und Secrets (Passwörter, OAUTH Keys usw.)

  • Keine einfache Möglichkeit, Dateiberechtigungen zu handhaben

  • Erfordern oft manuelle Schritte (oder zusätzliche Skripte)

  • Begrenzte Vorlagenunterstützung

  • Komplexität nimmt mit der Zeit zu (die berühmten Ausnahmen von der Ausnahme)

geekandpoke devprocess

Meine Geschichte mit Dotfiles

  • Mehrere Rechner (Privat und Arbeit)

    • Linux Desktop

    • WSL (damit Windows erträglich wird)

  • Dotfiles in git

  • Oft fehlt auf einem Rechner das eine Tool oder ein Shortcut / Alias

    • Submodules im Dotfile Repository (oh-my-zsh, vim Plugins, fzf …​)

  • 2023 Versuch mit Ansible

    • Sehr aufwändig

    • siehe auch: Froscon 2023

    • Sollte sowohl Installation und Konfiguration gewährleisten

    • Viele Ausnahmen und Konditionals wegen Debian/Ubuntu/RHEL

Meine Geschichte mit Dotfiles (2)

  • Installation seit Ende 2023 mit Fedora Silverblue bzw. Bluefin

    • Atomic Updates, System war immer verfügbar

  • Konfiguration seit mehreren Jahren mit

    • GNU stow (an sich auch sehr gut)

      • arbeitet mit Symbolischen Links

      • keine Integration von Passwortmanagern

      • Secrets (Accounts, OAuth Token, Keys) in einem öffentlichen Git?

      • Workaround mit pass

Weitere Tools für Dotfile Management

GNU Stow

  • Ursprünglich für die Verwaltung von (perl) Softwarepaketen

  • Einfache Versionierung

  • Ein Ordner pro Applikation

  • alle Dateien werden verlinkt (ln -s)

  • Abhängigkeiten müssen separat installiert werden

  • Gnome oder Firefox Konfiguration schwierig

    • dconf speichert in Datenbank

    • Firefox Profil speichert z.B. in generierte Ordnernamen

stow begriffe
stow bash

Bare

Weitere Alternativen zu Chezmoi

archwiki dotfiles1
archwiki dotfiles2
Screenshots aus Archwiki

Chezmoi stellt sich vor

Chezmoi

"Verwalten Sie Ihre Dotfiles sicher über mehrere verschiedene Geräte hinweg."

Warum Chezmoi wählen?

  • Sicher - Integration verschlüsselter Geheimnisse

  • Flexibel - Vorlagen, Skripte und gerätespezifische Konfigurationen

  • Portabel - funktioniert auf Linux, macOS, Windows, BSD

  • Transparent - sehen Sie vor dem Anwenden, was sich ändern wird

  • Leistungsstark - integriert mit Passwortmanagern und Versionskontrolle

  • Einfach - leicht verständliche Befehle und Konzepte

Installation

  • Pakete für viele Linux Distributionen

  • Windows, Mac OS, FreeBSD

    • Homebrew, Chocolatey

  • Einzeiler (natürlich erstmal das Skript prüfen)

Install in ~/.bin
sh -c "$(curl -fsLS get.chezmoi.io)"
Install in ~/.local/bin (ist bei mir immer im $PATH)
sh -c "$(curl -fsLS get.chezmoi.io/lb)"

Neue chezmoi Konfiguration

chezmoi init
chezmoi cd
git remote add origin https://github.com/$GITHUB_USERNAME/dotfiles.git
git push -u origin main
Dateien zu Chezmoi hinzufügen
chezmoi add ~/.bashrc
chezmoi add ~/.config/nvim
Datei als Template hinzufügen
chezmoi add --template ~/.bashrc

Konfigurationsdateien editieren

  1. chezmoi edit ~/.bashrc

  2. chezmoi cd; vim dot_bashrc

  3. chezmoi edit

  4. Direkt editieren und mit chezmoi add bzw. chezmoi re-add hinzufügen

  5. Direkt editieren und mit chezmoi merge ~/.bashrc

3-Wege Merge mit vimdiff

chezmoi merge .bashrc
  • Default vimdiff

    • Strg + w + h / j / k / l

  • Wechsel zum nächsten Unterschied: ] + c

  • :diffput #

  • :diffget #

chezmoi merge-all
2025 03 17 21 53 17

Dateien finden, die nicht von chezmoi gemanaged werden

chezmoi unmanaged
chezmoi unmanaged ~/.config
  • Erzeugt eine lange Liste Dateien

20250320-174502.png

Installation auf weiteren Rechnern

  • Wenn das Git Repository dotfiles heißt

sh -c "$(curl -fsLS get.chezmoi.io)" -- init --apply $GITHUB_USERNAME
  • GitHub Repositories können mit Username/Repository abgekürzt werden

sh -c "$(curl -fsLS get.chezmoi.io/lb)" -- init --apply stoeps13/chezmoi-dotfiles
sh -c "$(curl -fsLS get.chezmoi.io/lb)" -- init --apply --ssh stoeps13/clt-dotfiles
  • Mit kompletter Git Repository URL

sh -c "$(curl -fsLS get.chezmoi.io/lb)" -- init --apply https://your-git-server/name/repo.git

Namenskonventionen Dateien und Ordner

  • Dateiname beeinflusst Dateieigenschaften

~/.local/share/chezmoi
-rw-r--r--. 1 stoeps stoeps   692 Mar 19 21:22 .chezmoiexternal.toml (1)
-rw-r--r--. 1 stoeps stoeps    66 Sep 30 11:24 .chezmoiignore
drwxr-xr-x. 1 stoeps stoeps    10 Sep 27 15:35 dot_asciidoctor (2)
-rw-r--r--. 1 stoeps stoeps  1449 Mar 17 22:00 dot_bashrc (3)
drwxr-xr-x. 1 stoeps stoeps   220 Nov 28 12:08 private_dot_config (4)
1Chezmoi Datei (Download externer Dateien)
2Erstellt Verzeichnis .asciidoctor in $HOME mit 755 Mode
3Datei .bashrc in $HOME mit 644
4Ordner .config mit 700

Skripte ausführen

-rwxr-xr-x. 1 stoeps stoeps   387 Mar  2 22:27 run_after_gsettings.sh
-rwxr-xr-x. 1 stoeps stoeps  1188 Mar 19 18:35 run_before_bw_install.sh
-rwxr-xr-x. 1 stoeps stoeps  1188 Mar 19 18:35 run_onchange_before_nvim_install.sh
-rwxr-xr-x. 1 stoeps stoeps   129 Mar 19 21:25 run_once_atuin_install.sh
-rwxr-xr-x. 1 stoeps stoeps  1345 Mar  2 22:26 run_onchange_install_flatpak.sh
  • run_ scripts: werden immer bei chezmoi apply ausgeführt

  • run_onchange_ scripts: Werden nur ausgeführt, wenn sich der Inhalt seit der letzten Ausführung geändert hat

  • run_once_ scripts: Werden auch bei Änderung ausgeführt, aber nur einmal (d.h. sollten Skripte mit gleichem Inhalt mehrmals vorkommen, wird nur eines davon ausgeführt)

  • Ausführung erfolgt alphabetisch

    • also zwischen der Erstellung / Aktualisierung von Konfigurationsdateien

  • _before_ …​ and …​ _after_

    • Skripte werden vor bzw. nach dem Update der Konfigurationsdateien ausgeführt

Spezielle Dateien und Ordner

  • .chezmoi.$FORMAT.tmpl (JSON|YAML|INI)

    • Erstellt die Konfigurationsdatei für chezmoi

  • .chezmoidata.$FORMAT

    • Zur zentralen Definition von Variablen

  • .chezmoiexternal

    • Download git Repositories oder Archive

  • .chezmoiignore[.tmpl]

    • Wird als Template interpretiert, auch ohne .tmpl Extension

    • z.B. README, oder Dateien und Verzeichnisse die nur in 'Work' verwendet werden

  • .chezmoiremove

    • Um Dateien aus $HOME zu entfernen

  • .chezmoidata

  • .chezmoiexternals

  • .chezmoiscripts

  • .chezmoitemplates

Überblick über grundlegende Befehle

# Fügen Sie eine Dotfile zu chezmoi hinzu
chezmoi add ~/.vimrc

# Bearbeiten Sie eine verwaltete Dotfile
chezmoi edit ~/.vimrc

# Aktualisieren Sie Ihre lokale Kopie
chezmoi update

# Sehen Sie den Status verwalteter Dateien
chezmoi status

# Zeigen Sie, ausstehende Änderungen
chezmoi diff
20250320-190802.png
CharacterMeaning1. Spalte2. Spalte

A

Added

was created

will be created

D

Deleted

was deleted

will be deleted

M

Modified

was modified

will be modified

R

Run

Not applicable

will be run

Überblick über grundlegende Befehle (Fortsetzung)

# Änderungen anwenden
chezmoi apply

# Änderungen auf eine bestimmte Datei anwenden
chezmoi apply ~/.vimrc

# Überprüfen Sie, ob Ihre Dotfiles dem gewünschten Zustand entsprechen
chezmoi verify

# Entfernen Sie eine Datei aus der Verwaltung
chezmoi forget ~/.vimrc

Advanced Chezmoi

Verwaltung von Token, Passwörtern

  • Integration mit Passwortmanagern:

    • Bitwarden

    • 1Password

    • LastPass

    • pass

    • Vault

    • gopass

    • KeePassXC

    • Weitere…​

~/.config/chezmoi/config.toml
encryption = "age"
[age]
    identity = "~/.config/age/key.txt"
    recipient = "age1..."
Felder oder ganze Dateien verschlüsseln
# Vorlage mit Passwortmanager-Integration
{{ (bitwarden "item" "example.com").password }}

# Oder mit age-verschlüsselten Dateien
chezmoi add --encrypt ~/.ssh/id_rsa

Vorlagen

~/.config/chezmoi/config.toml
[data]
    name = "Max Mustermann" (1)
    email = "max@beispiel.de"
    work = true
1Variablen in config.toml definieren
dot_gitconfig.tmpl
[user]
    name = {{ .name }} (1)
    email = {{ .email }}
{{- if .work }} (2)
    signingkey = {{ (bitwarden "item" "work-gpg-key").notes }} (3)
{{- else }}
    signingkey = {{ (bitwarden "item" "personal-gpg-key").notes }}
{{- end }}
1wenn work = true
2aus ~/.config/chezmoi/config.toml
3von Bitwarden das Document work-gpg-key Element notes

Variablen bei chezmoi init abfragen

{{ $email := promptStringOnce . "email" "What is your email address" -}}

[data]
    email = {{ $email | quote }}

Gerätespezifische Konfigurationen

dot_bashrc.tmpl
export PATH="/usr/local/bin:$PATH"

{{- if eq .chezmoi.os "darwin" }} (1)
export PATH="$(brew --prefix)/bin:$PATH"
{{- end }}

{{- if eq .chezmoi.hostname "arbeits-laptop" }} (2)
export HTTP_PROXY="http://proxy.beispiel.de:8080"
{{- end }}
1wenn Mac OS X, dann brew in $PATH aufnehmen
2wenn der hostname=arbeits-laptop, dann Firmenproxy setzen

Vorlagen testen

chezmoi cd
chezmoi execute-template < dot_gitconfig.tmpl

Externe Quellen

  • Archive und Git Repositories .~/.local/share/chezmoi/chezmoiexternal.toml

[".vim/pack/plugins/start/vim-airline"]
    type = "git-repo"
    url = "https://github.com/vim-airline/vim-airline.git"
    refreshPeriod = "168h"

[".oh-my-zsh"]
    type = "archive"
    url = "https://github.com/ohmyzsh/ohmyzsh/archive/master.tar.gz"
    exact = true
    stripComponents = 1
    refreshPeriod = "168h"

Installation Passwortmanager

  • Dokumentation empfiehlt die Verwendung eines Hook in

~/.config/chezmoi/chezmoi.toml
[hooks.read-source-state.pre]
    command = ".local/share/chezmoi/.install-bw.sh"
  • Nachteil:

    1. chezmoi init

    2. bw login

    3. chezmoi apply

  • run_once_before_bw_install.sh

    1. chezmoi init

    2. bw login

    3. chezmoi apply

Tipps

Zeitsparende Tipps

  • chezmoi cd

    • Kurz für cd ~/.local/share/chezmoi

    • Startet eine neue Shell!

    • Nur Verzeichnis wechseln mit cd $(chezmoi source-path)

  • Nutzen Sie edit-config für die Konfiguration

    • edit ~/.config/chezmoi/config.toml

chezmoi archive zum Erstellen eines Snapshots
chezmoi archive -f tar.gz --output ~/temp/dotfiles-snapshot.tar.gz
  • Archive enthält die dotfiles mit ausgeführten Templates (also mit Token / Passwörtern)

  • chezmoi merge zum Umgang mit Konflikten

  • chezmoi doctor zur Überprüfung Ihrer Einrichtung

Bewährte Methoden

  • Fangen Sie klein an, fügen Sie Dateien schrittweise hinzu

  • Dokumentieren Sie Ihre Dotfiles mit README.md

  • Verwenden Sie eine konsistente Vorlagenstrategie

  • Halten Sie Geheimnisse mit speziellen Managern getrennt

  • Testen Sie Änderungen vor dem Anwenden (--dry-run)

  • Committen und pushen Sie Änderungen regelmäßig

  • Fügen Sie .chezmoiignore für auszuschließende Dateien hinzu

Migration von anderen Systemen

  • Von Symlink-Lösungen:

    • chezmoi import zum Konvertieren vorhandener Dotfiles

  • Von reinen Git-Repositories:

  • Von anderen Managern (Stow, rcm):

    • chezmoi import in Ihrem Dotfiles-Verzeichnis

Chezmoi-Update-Workflow

  1. Lokale Änderungen mit chezmoi edit vornehmen

  2. Änderungen mit chezmoi diff überprüfen

  3. Änderungen mit chezmoi apply anwenden

  4. Änderungen committen: chezmoi cd && git commit -am "Konfiguration aktualisieren"

  5. Änderungen pushen: git push

  6. Auf anderen Geräten: chezmoi update

Häufige Fallstricke und Lösungen

  • Problem: Verwaltung von Verschlüsselungsschlüsseln

    • Lösung: Verwenden Sie Age mit im Passwortmanager gespeicherten Schlüsseln

  • Problem: Gerätespezifische Pfade

    • Lösung: Verwenden Sie .chezmoi.os und Vorlagen

  • Problem: Vorlagen-Debugging

    • Lösung: Verwenden Sie chezmoi execute-template

  • Problem: Große Binärdateien

    • Lösung: Verwenden Sie stattdessen .chezmoiexternal.toml

Beispiele

Community und Ressourcen

Demo

Demo: Einrichtung eines neuen Geräts

# Einzeilen-Bootstrap
sh -c "$(curl -fsLS get.chezmoi.io/lb)" -- init --apply git@github.com:stoeps13/clt-dotfiles.git

Live-Demo

Vielen Dank!

Viel Spaß beim Verwalten Ihrer Dotfiles!