Christoph Stoettner
stoeps@vegardit.com
@stoeps@infosec.exchange
Christoph Stoettner stoeps@vegardit.com
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
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
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
Neuer Rechner
Neukauf
Distrohopping
Automatisierung
Mehrere Rechner
Linux
Mac OS X
Windows mit WSL
Konsistenz
Arbeit & Privat
Backup
Versionskontrolle
Teilen
Manuelles Kopieren (fehleranfällig!)
Einfaches Git-Repository
Symlink-basierte Lösungen
Benutzerdefinierte Skripte
Spezialisierte Tools (GNU Stow, rcm, usw.)
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)
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
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
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
Blogposts von z.B. Atlassian mit ausführlichen Anleitungen
Ganz oder gar nicht (man kann keine Teilmenge der Konfiguration setzen)
Schwierig herauszufinden welche Dateien versioniert sind und welche nicht
Kein Working tree
Grossartige Übersicht: https://wiki.archlinux.org/title/Dotfiles#Tools
mit fzf
Unterstützung
noch nicht probiert
Ansible
NixOS
"Verwalten Sie Ihre Dotfiles sicher über mehrere verschiedene Geräte hinweg."
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
Pakete für viele Linux Distributionen
Modul in https://blue-build.org
Nix, Snap
Windows, Mac OS, FreeBSD
Homebrew, Chocolatey
Einzeiler (natürlich erstmal das Skript prüfen)
~/.bin
sh -c "$(curl -fsLS get.chezmoi.io)"
~/.local/bin
(ist bei mir immer im $PATH
)sh -c "$(curl -fsLS get.chezmoi.io/lb)"
chezmoi
Konfigurationchezmoi init
chezmoi cd
git remote add origin https://github.com/$GITHUB_USERNAME/dotfiles.git
git push -u origin main
chezmoi add ~/.bashrc
chezmoi add ~/.config/nvim
chezmoi add --template ~/.bashrc
chezmoi edit ~/.bashrc
chezmoi cd; vim dot_bashrc
chezmoi edit
Direkt editieren und mit chezmoi add
bzw. chezmoi re-add
hinzufügen
Direkt editieren und mit chezmoi merge ~/.bashrc
vimdiff
chezmoi merge .bashrc
Default vimdiff
Strg + w + h / j / k / l
Wechsel zum nächsten Unterschied: ] + c
:diffput #
:diffget #
chezmoi merge-all
chezmoi
gemanaged werdenchezmoi unmanaged
chezmoi unmanaged ~/.config
Erzeugt eine lange Liste Dateien
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
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)
1 | Chezmoi Datei (Download externer Dateien) |
2 | Erstellt Verzeichnis .asciidoctor in $HOME mit 755 Mode |
3 | Datei .bashrc in $HOME mit 644 |
4 | Ordner .config mit 700 |
-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
.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
# 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
Character | Meaning | 1. Spalte | 2. 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 |
# Ä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
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..."
# Vorlage mit Passwortmanager-Integration
{{ (bitwarden "item" "example.com").password }}
# Oder mit age-verschlüsselten Dateien
chezmoi add --encrypt ~/.ssh/id_rsa
~/.config/chezmoi/config.toml
[data]
name = "Max Mustermann" (1)
email = "max@beispiel.de"
work = true
1 | Variablen 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 }}
1 | wenn work = true |
2 | aus ~/.config/chezmoi/config.toml |
3 | von Bitwarden das Document work-gpg-key Element notes |
chezmoi init
abfragen{{ $email := promptStringOnce . "email" "What is your email address" -}}
[data]
email = {{ $email | quote }}
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 }}
1 | wenn Mac OS X, dann brew in $PATH aufnehmen |
2 | wenn der hostname=arbeits-laptop, dann Firmenproxy setzen |
chezmoi cd
chezmoi execute-template < dot_gitconfig.tmpl
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"
Dokumentation empfiehlt die Verwendung eines Hook in
~/.config/chezmoi/chezmoi.toml
[hooks.read-source-state.pre]
command = ".local/share/chezmoi/.install-bw.sh"
Nachteil:
chezmoi init
bw login
chezmoi apply
run_once_before_bw_install.sh
chezmoi init
bw login
chezmoi apply
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 Snapshotschezmoi 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
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
Von Symlink-Lösungen:
chezmoi import
zum Konvertieren vorhandener Dotfiles
Von reinen Git-Repositories:
chezmoi init --apply git@github.com:benutzername/dotfiles.git
Von anderen Managern (Stow, rcm):
chezmoi import
in Ihrem Dotfiles-Verzeichnis
Lokale Änderungen mit chezmoi edit
vornehmen
Änderungen mit chezmoi diff
überprüfen
Änderungen mit chezmoi apply
anwenden
Änderungen committen: chezmoi cd && git commit -am "Konfiguration aktualisieren"
Änderungen pushen: git push
Auf anderen Geräten: chezmoi update
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
Dokumentation: https://www.chezmoi.io/
Benutzerhandbuch: https://www.chezmoi.io/user-guide/command-overview/
Beispiel-Dotfiles-Repositories
# Einzeilen-Bootstrap
sh -c "$(curl -fsLS get.chezmoi.io/lb)" -- init --apply git@github.com:stoeps13/clt-dotfiles.git
Live-Demo
Ressourcen
Folien: https://share.stoeps.de/2025-clt/2025-clt-chezmoi.html
Folien: https://share.stoeps.de/2025-clt/2025-clt-chezmoi.pdf
GitHub Dotfiles: https://github.com/stoeps13/chezmoi-dotfiles.git
GitHub Demo: https://github.com/stoeps13/clt-dotfiles.git
Dokumentation: https://www.chezmoi.io/
Viel Spaß beim Verwalten Ihrer Dotfiles!