Artikel is gepubliceerd in Linux 3, 2021

GNU Stow maakt het makkelijk om de configuratiebestanden in je home-directory op een centrale plaats te beheren. Hierdoor breng je deze eenvoudig onder versiebeheer of synchroniseer je deze makkelijk met andere systemen. We geven hier een korte introductie.

Auteur: Matto Fransen

GNU Stow noemt zich zelf een “symlink farm manager” en is oorspronkelijk ontwikkeld om grip te houden op zelf geïnstalleerde software packages. Het is echter ook heel geschikt voor het beheer en de synchronisatie van de configuratiebestanden in je home-directory.

GNU Stow is geschreven in Perl en is daardoor platform-onafhankelijk. Het is beschikbaar onder de GPL3 open source licentie. Je installeert het eenvoudig via de packagemanager van je Linux distributie of BSD-systeem.

Dotfiles

Traditioneel in de Unix-achtige omgevingen staat het persoonlijke configuratiebestand van gebruikersapplicaties in de root van de home-directory. Hierbij is de bestandsnaam opgebouwd uit een punt, gevolgd door de naam van de applicatie, en meestal gevolgd door “rc”, zoals bijvoorbeeld “.bashrc” voor het configuratiebestand van Bash. De punt aan het begin van de bestandsnaam zorgt dat het bestand “hidden” is, bij het opvragen van een directory-listing met “ls” wordt het niet getoond. De namen van deze configuratiebestanden beginnen allemaal met een punt, daarom worden ze vaak ‘dotfiles’ genoemd.

De X Desktop Group (XDG) ontwikkelde een nieuwe standaard. Deze bestaat uit een directory genaamd “.config”, in de root van je home-directory, met daarin per applicatie een subdirectory, met daarin de configuratiebestanden. Daarnaast beschrijft de XDG ook het gebruik van de “.local” directory in je home-directory. Ook in deze .local directory kunnen applicaties bestanden in een eigen sub-directory plaatsen. Midnight Commander (mc) bewaart bijvoorbeeld hier de historie.

Het gevolg van dit alles is dat je in je home-directory je configuratiebestanden en dergelijke verspreid over meerdere plekken staan. Met GNU Stow breng je al deze bestanden naar één centrale plaats, waarbij GNU Stow zorgt dat de juiste symbolic links (symlinks) aangemaakt worden, ongeacht of deze in de root van je home directory, of bijvoorbeeld in ~/.config of in ~/.local moeten komen. Het teken “~” staat voor je home-directory, dus wanneer je usernaam  “jolanda” is, dan staat “~” voor “/home/jolanda”.

Packages

Het gebruik van GNU Stow is gebaseerd op packages. Voor het beheer van de dotfiles in je home-directory betekent dit dat je voor elke applicatie een package definieert. Voor Bash definieer je het package “bash”, voor w3m het package “w3m”, voor de i3 windowmanager het package “i3”, enzovoorts. Elk package krijgt zijn eigen directory en binnen deze directory beschrijf je het pad of paden en neem je de betreffende bestanden op.

Je start met het aanmaken van een directory voor GNU Stow, wij kiezen voor ~/.dotfiles. Vervolgens maak je daarin per package een directory, dus bijvoorbeeld ~/.dotfiles/bash voor Bash. Verplaats hierna de betreffende bestanden van je home-directory naar deze directory, zoals “.bashrc”, dit wordt dan “~/.dotfiles/bash/.bashrc”.

Soms hebben gebruikersapplicaties eerst een subdirectory in de home-directory, met daaronder de configuratiebestanden, zoals bijvoorbeeld w3m. Deze tekstbrowser gebruikt ~/.w3m voor de gebruikersbestanden, zoals “~/.w3m/config” en “~/.w3m/bookmark.html”. Dit los je in de .dotfiles directory als volgt op. Eerst maak je weer een directory voor het package aan, “~/.dotfiles/w3m”. Hierna verplaats je de gehele ~/.w3m directory daar naar toe, met als resultaat “~/.dotfiles/w3m/.w3m/config” en “~/.dotfiles/w3m/.w3m/bookmark.html”.

Nu gaan we aan de slag met twee gebruikersapplicaties die de XDG-standaard volgen, met een eigen directory in “~/.config”. Voor dit voorbeeld kiezen we de i3 window manager, met het configuratiebestand “~/.config/i3/config”. Eerst maak je weer een directory voor het package aan, “~/.dotfiles/i3”, en hierin kopieer je het pad, dus “~/.dotfiles/i3/.config/i3”. Nu verplaats je het config-bestand hier heen, dit wordt “~/.dotfiles/i3/.config/i3/config”. Tenslotte verwijder je ~/.config/i3.

Dit doe je ook met de bestanden van mc. In de .dotfiles directory maak je een subdirectory “mc” aan, met daarin “.config/mc” met daarin het “ini”-bestand van mc, en “.local/share/mc/history”. Ook nu verplaats je de betreffende bestanden. Zie listing 1 met de tree van de .dotfiles directory die op deze manier is opgebouwd.

Listing 1: Overzicht van de .dotfiles directory.

Symlinks aanmaken

Ga nu in de .dotfiles directory (cd ~/.dotfiles) en geef het commando “stow *“. Bekijk het resultaat van deze actie in je home-directory, ”cd” en “ls -la”. Je hebt nu in de home-directory een symlink “.bashrc” naar .dotfiles/bash/.bashrc, en een symlink ”.w3m” naar de directory “.dotfiles/w3m/.w3m”. Verder heeft GNU Stow een directory “.config” in de home-directory aangemaakt, met daarin een symlink ”i3″ naar “~/.dotfiles/i3/.config/i3” en een symlink “mc” naar “~/.dotfiles/i3/.config/mc”. Verder staat in de home-directory een symlink “.local”, naar “~/.dotfiles/mc/.local”. Zie ook listing 2.

Listing 2: Symlinks in home nadat Stow gedraaid heeft.

GNU Stow gaat zeer slim om bij het maken van directories en daardoor kunnen we ook meer packages hebben die een gedeelte van een pad met elkaar delen.

GNU Stow herkent dat vanuit twee packages (i3 en mc) een directory “.config” is opgenomen en maakt daarom eerst in onze home-directory de subdirectory “~/.config”, met daarin de symlinks voor “.config/i3″ en “.config/mc“. GNU Stow herkent ook dat maar  één package de subdirectory  ”.local” gebruikt (mc), en maakt daarom meteen een symlink voor “~/.local”.

Wil je verder experimenteren, dan kun je de actie ongedaan maken door in “~/.dotfiles” het commando “stow -D *” te geven. Nu zijn de door GNU Stow aangemaakte symlinks in je home-directory weer verdwenen.

Voorzichtig

GNU Stow is zeer voorzichtig. Wanneer het voor het uitvoeren van het commando bestanden moet overschrijven of directories moet verwijderen, dan weigert het de uitvoering van het commando. Een uitzondering hierop vormen de bestanden die al onder het beheer van GNU Stow zijn. Dit is de reden waarom we de configuratie bestanden bij het opbouwen van onze stow-directory (“~/.dotfiles”) naar deze directory verplaatst hebben, en niet gekopieerd.

Versiebeheer

Door al je dotfiles op één centrale plaats bij elkaar te brengen, maak je het makkelijker om ze gezamenlijk onder versiebeheer te brengen. Een eenvoudige manier hiervoor is om –direct na het aanmaken van de “.dotfiles” directory– eerst in deze directory “git init” te doen. Pas hierna plaats je alle benodigde packages in deze directory. Vervolgens zet je met “git add -A” alle nieuwe bestanden in staging, en commit deze vervolgens in Git met “git commit -m ‘initiele vulling’”.

Hiermee heb je al de bestanden in de “dotfiles” directory in één klap onder versiebeheer van Git gebracht. Wijzigingen in een of meer van de bestanden worden zichtbaar met het commando “git status”. De wijziging commit je in Git met met “git add -A” en “git commit -m ‘commit-boodschap’”. Vervolgens push je dit desgewenst nog naar een remote repository.

Je synchroniseert de dotfiles-directory naar een andere machine. Dit doe je bijvoorbeeld met syncthing, rsync, of met “git clone”. Nadat je de directory gesynchroniseerd hebt, doe je daar “stow *” in die directory, en je beschikt weer over je eigen vertrouwde werkomgeving.

Dot-bestandsnaam

Je kiest voor de “–dotfiles”-optie wanneer je liever in je dotfiles-directory geen verborgen bestanden plaats. Je begint dan de bestandsnamen met “dot-”, dus bijvoorbeeld “dot-bashrc”. vervolgens roep je GNU Stow aan met –dotfiles, bijvoorbeeld “stow –dotfiles *”. GNU Stow maakt dan een symlink aan met de correctie naam ”.bashrc”.

Doel-directory

In het voorbeeld hierboven gebruikte GNU Stow de home directory om daar de directories en symlinks op te bouwen. De reden hiervoor is, dat GNU Stow de moeder-directory van de directory van de stow-directory als doel-directory hanteert. Dit is echter te wijzigen, met behulp van de optie -t (“target”) wijs je de directory aan, die GNU Stow als doel-directory hanteert. Deze optie gebruik je ook, wanneer je je dotfiles-directory niet in de root van je home-directory wilt hebben, maar ergens anders. Probeer het zelf!