sqrtminusone.github.io/configs/guix/index.html
2025-04-20 21:50:25 +00:00

895 lines
103 KiB
HTML

<!DOCTYPE html>
<html lang=""><head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Guix</title>
<meta name="description" content="Freedom is a state of mind">
<meta name="author" content='SqrtMinusOne'>
<link href="https://fonts.googleapis.com/css2?family=Inconsolata:wght@400;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" integrity="sha512-iBBXm8fW90+nuLcSKlbmrPcLa0OT92xO1BIsZ+ywDWZCvqsWgccV3gFoRBv0z+8dLJgyAHIhR35VZc2oM/gI1w==" crossorigin="anonymous">
<link rel="stylesheet" href="/sass/researcher.min.css">
<link rel="icon" type="image/ico" href="https://sqrtminusone.xyz/favicon.ico">
<script defer data-domain="sqrtminusone.xyz" src="https://plausible.sqrtminusone.xyz/js/plausible.js"></script>
</head>
<body><div class="container mt-5">
<nav class="navbar navbar-expand-sm flex-column flex-sm-row text-nowrap p-0">
<a class="navbar-brand mx-0 mr-sm-auto" href="https://sqrtminusone.xyz/" title="SqrtMinusOne">
SqrtMinusOne
</a>
<div class="navbar-nav flex-row flex-wrap justify-content-center">
<a class="nav-item nav-link" href="/" title="Index">
Index
</a>
<span class="nav-item navbar-text mx-1">/</span>
<a class="nav-item nav-link" href="/posts/" title="Posts">
Posts
</a>
<span class="nav-item navbar-text mx-1">/</span>
<a class="nav-item nav-link" href="/configs/readme" title="Configs">
Configs
</a>
<span class="nav-item navbar-text mx-1">/</span>
<a class="nav-item nav-link" href="/emacs-packages/" title="Emacs packages">
Emacs packages
</a>
</div>
</nav>
</div>
<hr>
<div id="content">
<script defer language="javascript" type="text/javascript" src="/js/dynamic-toc.js"></script>
<div class="root">
<h1 id="title-small-screen">
Guix
<iframe src="https://ghbtns.com/github-btn.html?user=SqrtMinusOne&repo=dotfiles&type=star&count=true" frameborder="0" scrolling="0" width="150" height="20" title="GitHub"></iframe>
</h1>
<div class="container" id="actual-content">
<h1 id="title-large-screen" class="dotfiles-title">
Guix
<iframe src="https://ghbtns.com/github-btn.html?user=SqrtMinusOne&repo=dotfiles&type=star&count=true" frameborder="0" scrolling="0" width="150" height="20" title="GitHub"></iframe>
</h1>
<p><a href="https://guix.gnu.org/">GNU Guix</a> is (1) a transactional package manager and (2) a GNU/Linux distribution.</p>
<p>My personal selling points are declarative package configuration and transactional upgrades.</p>
<p>References:</p>
<ul>
<li><a href="https://guix.gnu.org/en/help/">Official help</a></li>
<li><a href="https://wiki.systemcrafters.cc/guix">System Crafters wiki</a></li>
<li><a href="https://gitlab.com/pjotrp/guix-notes">Pjotr Prins&rsquo; Guix notes</a></li>
<li><a href="https://www.youtube.com/watch?v=iBaqOK75cho&amp;list=PLEoMzSkcN8oNxnj7jm5V2ZcGc52002pQU">Davil Wilson&rsquo;s YouTube series</a></li>
</ul>
<h2 id="profiles">Profiles</h2>
<p>A profile is a way to group Guix packages. Amongst its advantages, profiles can be defined by manifests, which in turn can be stored in VCS.</p>
<p>References:</p>
<ul>
<li><a href="https://guix.gnu.org/en/cookbook/en/html_node/Guix-Profiles-in-Practice.html">Guix Profiles in Practice</a></li>
</ul>
<h3 id="activate-profiles">Activate profiles</h3>
<p>A script to activate guix profiles. Usage:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>activate-profiles [profile1] [profile2] ...
</span></span></code></pre></div><p>Source: <a href="https://github.com/daviwil/dotfiles/blob/master/Systems.org#activating-profiles">David Wilson&rsquo;s config</a></p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#19177c">GREEN</span><span style="color:#666">=</span><span style="color:#ba2121">&#39;\033[1;32m&#39;</span>
</span></span><span style="display:flex;"><span><span style="color:#19177c">RED</span><span style="color:#666">=</span><span style="color:#ba2121">&#39;\033[1;30m&#39;</span>
</span></span><span style="display:flex;"><span><span style="color:#19177c">NC</span><span style="color:#666">=</span><span style="color:#ba2121">&#39;\033[0m&#39;</span>
</span></span><span style="display:flex;"><span><span style="color:#19177c">GUIX_EXTRA_PROFILES</span><span style="color:#666">=</span><span style="color:#19177c">$HOME</span>/.guix-extra-profiles
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#19177c">profiles</span><span style="color:#666">=</span><span style="color:#19177c">$*</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[[</span> <span style="color:#19177c">$#</span> -eq <span style="color:#666">0</span> <span style="color:#666">]]</span>; <span style="color:#008000;font-weight:bold">then</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">profiles</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#19177c">$HOME</span><span style="color:#ba2121">/.config/guix/manifests/*.scm&#34;</span>;
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">fi</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">for</span> profile in <span style="color:#19177c">$profiles</span>; <span style="color:#008000;font-weight:bold">do</span>
</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic"># Remove the path and file extension, if any</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">profileName</span><span style="color:#666">=</span><span style="color:#008000;font-weight:bold">$(</span>basename <span style="color:#19177c">$profile</span><span style="color:#008000;font-weight:bold">)</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">profileName</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">profileName</span>%.*<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">profilePath</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#19177c">$GUIX_EXTRA_PROFILES</span><span style="color:#ba2121">/</span><span style="color:#19177c">$profileName</span><span style="color:#ba2121">&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">manifestPath</span><span style="color:#666">=</span><span style="color:#19177c">$HOME</span>/.config/guix/manifests/<span style="color:#19177c">$profileName</span>.scm
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[</span> -f <span style="color:#19177c">$manifestPath</span> <span style="color:#666">]</span>; <span style="color:#008000;font-weight:bold">then</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> -e <span style="color:#ba2121">&#34;</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">GREEN</span><span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">Activating profile:&#34;</span> <span style="color:#19177c">$manifestPath</span> <span style="color:#ba2121">&#34;</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">NC</span><span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> mkdir -p <span style="color:#19177c">$profilePath</span>
</span></span><span style="display:flex;"><span> guix package --manifest<span style="color:#666">=</span><span style="color:#19177c">$manifestPath</span> --profile<span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#19177c">$profilePath</span><span style="color:#ba2121">/</span><span style="color:#19177c">$profileName</span><span style="color:#ba2121">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic"># Source the new profile</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">GUIX_PROFILE</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#19177c">$profilePath</span><span style="color:#ba2121">/</span><span style="color:#19177c">$profileName</span><span style="color:#ba2121">&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[</span> -f <span style="color:#19177c">$GUIX_PROFILE</span>/etc/profile <span style="color:#666">]</span>; <span style="color:#008000;font-weight:bold">then</span>
</span></span><span style="display:flex;"><span> . <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$GUIX_PROFILE</span><span style="color:#ba2121">&#34;</span>/etc/profile
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">else</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> -e <span style="color:#ba2121">&#34;</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">RED</span><span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">Couldn&#39;t find profile:&#34;</span> <span style="color:#19177c">$GUIX_PROFILE</span>/etc/profile <span style="color:#ba2121">&#34;</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">NC</span><span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">fi</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">else</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;No profile found at path&#34;</span> <span style="color:#19177c">$profilePath</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">fi</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">done</span>
</span></span></code></pre></div><h3 id="update-profiles">Update profiles</h3>
<p>A script to update Guix profiles. Usage:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>update-profiles [profile1] [profile2] ...
</span></span></code></pre></div><p>Source: once again, <a href="https://github.com/daviwil/dotfiles/blob/master/Systems.org#updating-profiles">David Wilson&rsquo;s config</a>.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#19177c">GREEN</span><span style="color:#666">=</span><span style="color:#ba2121">&#39;\033[1;32m&#39;</span>
</span></span><span style="display:flex;"><span><span style="color:#19177c">NC</span><span style="color:#666">=</span><span style="color:#ba2121">&#39;\033[0m&#39;</span>
</span></span><span style="display:flex;"><span><span style="color:#19177c">GUIX_EXTRA_PROFILES</span><span style="color:#666">=</span><span style="color:#19177c">$HOME</span>/.guix-extra-profiles
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#19177c">profiles</span><span style="color:#666">=</span><span style="color:#19177c">$*</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[[</span> <span style="color:#19177c">$#</span> -eq <span style="color:#666">0</span> <span style="color:#666">]]</span>; <span style="color:#008000;font-weight:bold">then</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">profiles</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#19177c">$GUIX_EXTRA_PROFILES</span><span style="color:#ba2121">/*&#34;</span>;
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">fi</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">for</span> profile in <span style="color:#19177c">$profiles</span>; <span style="color:#008000;font-weight:bold">do</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">profileName</span><span style="color:#666">=</span><span style="color:#008000;font-weight:bold">$(</span>basename <span style="color:#19177c">$profile</span><span style="color:#008000;font-weight:bold">)</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">profilePath</span><span style="color:#666">=</span><span style="color:#19177c">$GUIX_EXTRA_PROFILES</span>/<span style="color:#19177c">$profileName</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> -e <span style="color:#ba2121">&#34;</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">GREEN</span><span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">Updating profile:&#34;</span> <span style="color:#19177c">$profilePath</span> <span style="color:#ba2121">&#34;</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">NC</span><span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> guix package --profile<span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#19177c">$profilePath</span><span style="color:#ba2121">/</span><span style="color:#19177c">$profileName</span><span style="color:#ba2121">&#34;</span> --manifest<span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#19177c">$HOME</span><span style="color:#ba2121">/.config/guix/manifests/</span><span style="color:#19177c">$profileName</span><span style="color:#ba2121">.scm&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">done</span>
</span></span></code></pre></div><h3 id="run-guix-package-in-profile">Run <code>guix package</code> in profile</h3>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#19177c">GUIX_EXTRA_PROFILES</span><span style="color:#666">=</span><span style="color:#19177c">$HOME</span>/.guix-extra-profiles
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#19177c">profileName</span><span style="color:#666">=</span><span style="color:#008000;font-weight:bold">$(</span>basename <span style="color:#19177c">$1</span><span style="color:#008000;font-weight:bold">)</span>
</span></span><span style="display:flex;"><span><span style="color:#19177c">profileName</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">profileName</span>%.*<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#19177c">profilePath</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#19177c">$GUIX_EXTRA_PROFILES</span><span style="color:#ba2121">/</span><span style="color:#19177c">$profileName</span><span style="color:#ba2121">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[</span> -d <span style="color:#19177c">$profilePath</span> <span style="color:#666">]</span>; <span style="color:#008000;font-weight:bold">then</span>
</span></span><span style="display:flex;"><span> guix package --profile<span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#19177c">$profilePath</span><span style="color:#ba2121">/</span><span style="color:#19177c">$profileName</span><span style="color:#ba2121">&#34;</span> <span style="color:#b68;font-weight:bold">${</span>@:<span style="color:#19177c">2</span><span style="color:#b68;font-weight:bold">}</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">else</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> -e <span style="color:#ba2121">&#34;No profile found at path: &#34;</span> <span style="color:#19177c">$profilePath</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">fi</span>
</span></span></code></pre></div><h3 id="turn-off-guix-profiles">Turn off Guix profiles</h3>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#008000">export</span> <span style="color:#19177c">PATH</span><span style="color:#666">=</span><span style="color:#008000;font-weight:bold">$(</span><span style="color:#008000">echo</span> <span style="color:#19177c">$PATH</span> | tr <span style="color:#ba2121">&#34;:&#34;</span> <span style="color:#ba2121">&#34;\n&#34;</span> | grep -vE <span style="color:#ba2121">&#34;guix|nix|gnu&#34;</span> | tr <span style="color:#ba2121">&#34;\n&#34;</span> <span style="color:#ba2121">&#34;:&#34;</span><span style="color:#008000;font-weight:bold">)</span>
</span></span></code></pre></div><h2 id="channels">Channels</h2>
<p>Specifying additional channels.</p>
<p><a href="https://github.com/SqrtMinusOne/channel-q">channel-q</a> is my Guix channel. Don&rsquo;t use it at home.</p>
<p>References:</p>
<ul>
<li><a href="https://gitlab.com/nonguix/nonguix">nonguix channel repo</a></li>
<li><a href="https://guix.gnu.org/manual/en/html_node/Channels.html">Guix channels reference</a></li>
</ul>
<!--listend-->
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-scheme" data-lang="scheme"><span style="display:flex;"><span>(<span style="color:#00f">cons*</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">channel</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">name</span> <span style="color:#19177c">&#39;channel-q</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">url</span> <span style="color:#ba2121">&#34;file:///home/pavel/_channel-q&#34;</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">channel</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">name</span> <span style="color:#19177c">&#39;flat</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">url</span> <span style="color:#ba2121">&#34;https://github.com/flatwhatson/guix-channel.git&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">introduction</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">make-channel-introduction</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;33f86a4b48205c0dc19d7c036c85393f0766f806&#34;</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">openpgp-fingerprint</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;736A C00E 1254 378B A982 7AF6 9DBE 8265 81B6 4490&#34;</span>))))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">channel</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">name</span> <span style="color:#19177c">&#39;nonguix</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">url</span> <span style="color:#ba2121">&#34;https://gitlab.com/nonguix/nonguix&#34;</span>)
</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic">;; (commit &#34;d54973e47b89fe5772a5b6e2d0c0b86acb089e27&#34;)</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">introduction</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">make-channel-introduction</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;897c1a470da759236cc11798f4e0a5f7d4d59fbc&#34;</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">openpgp-fingerprint</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;2A39 3FFF 68F4 EF7A 3D29 12AF 6F51 20A0 22FB B2D5&#34;</span>))))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">channel</span>
</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic">;; What can possibly go wrong, huh</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">name</span> <span style="color:#19177c">&#39;guix-gaming-games</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">url</span> <span style="color:#ba2121">&#34;https://gitlab.com/guix-gaming-channels/games.git&#34;</span>)
</span></span><span style="display:flex;"><span> <span style="color:#408080;font-style:italic">;; Enable signature verification:</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">introduction</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">make-channel-introduction</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;c23d64f1b8cc086659f8781b27ab6c7314c5cca5&#34;</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">openpgp-fingerprint</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;50F3 3E2E 5B0C 3D90 0424 ABE8 9BDC F497 A4BB CC7F&#34;</span>))))
</span></span><span style="display:flex;"><span> <span style="color:#19177c">%default-channels</span>)
</span></span></code></pre></div><h2 id="systems">Systems</h2>
<p>Configuring systems with Guix.</p>
<p>Yes, all my machines are named after colors I like.</p>
<h3 id="base-configuration">Base configuration</h3>
<p>The base configuration is shared between all the machines.</p>
<p>While it&rsquo;s possible to make a single <code>.scm</code> file with base configuration and load it, I noticed that it produces more cryptic error messages whenever there is an error in the base file, so I opt-in for noweb.</p>
<p><code>guix system</code> invocation is as follows:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>sudo -E guix system reconfigure ~/.config/guix/systems/[system].scm
</span></span></code></pre></div><p>Common modules:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-scheme" data-lang="scheme"><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span>))
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">system</span> <span style="color:#19177c">nss</span>))
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">packages</span> <span style="color:#19177c">bash</span>))
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> ((<span style="color:#00f">gnu</span> <span style="color:#19177c">packages</span> <span style="color:#19177c">base</span>) <span style="color:#666">#</span><span style="color:#19177c">:select</span> (<span style="color:#00f">coreutils</span> <span style="color:#19177c">glibc</span>)))
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">packages</span> <span style="color:#19177c">certs</span>))
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">packages</span> <span style="color:#19177c">version-control</span>))
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">packages</span> <span style="color:#19177c">vim</span>))
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">packages</span> <span style="color:#19177c">gnome</span>))
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">packages</span> <span style="color:#19177c">xorg</span>))
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">packages</span> <span style="color:#19177c">wm</span>))
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">packages</span> <span style="color:#19177c">openbox</span>))
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">services</span> <span style="color:#19177c">docker</span>))
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">services</span> <span style="color:#19177c">cups</span>))
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">gnu</span> <span style="color:#19177c">services</span> <span style="color:#19177c">virtualization</span>))
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">srfi</span> <span style="color:#19177c">srfi-1</span>))
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">guix</span> <span style="color:#19177c">channels</span>))
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">guix</span> <span style="color:#19177c">inferior</span>))
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">nongnu</span> <span style="color:#19177c">packages</span> <span style="color:#19177c">linux</span>))
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-modules</span> (<span style="color:#00f">nongnu</span> <span style="color:#19177c">system</span> <span style="color:#19177c">linux-initrd</span>))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-service-modules</span> <span style="color:#19177c">desktop</span> <span style="color:#19177c">networking</span> <span style="color:#19177c">ssh</span> <span style="color:#19177c">xorg</span> <span style="color:#19177c">nix</span>)
</span></span><span style="display:flex;"><span>(<span style="color:#00f">use-package-modules</span> <span style="color:#19177c">ssh</span>)
</span></span></code></pre></div><p>In principle, we could define a variable called <code>base-operating-system</code> and extend it in ancestors. However, then we would have to define mandatory fields like <code>host-name</code>, <code>bootloader</code> with dummy values. Since I&rsquo;m already using noweb, there is little point.</p>
<p>The following code will be inserted at the top of the <code>operating-system</code> definition.</p>
<p>Use the full Linux kernel. I hope I&rsquo;ll be able to use Libre kernel somewhere later.</p>
<p>Inferior in the kernel is used to avoid recompilation. It looks like I can pin these to different commits than in my <code>channels.scm</code></p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-scheme" data-lang="scheme"><span style="display:flex;"><span>(<span style="color:#00f">kernel</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">let*</span>
</span></span><span style="display:flex;"><span> ((<span style="color:#00f">channels</span>
</span></span><span style="display:flex;"><span> (<span style="color:#008000">list </span>(<span style="color:#00f">channel</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">name</span> <span style="color:#19177c">&#39;nonguix</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">url</span> <span style="color:#ba2121">&#34;https://gitlab.com/nonguix/nonguix&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">commit</span> <span style="color:#ba2121">&#34;213be7ee6676fc4a3db0e3ac9ce5cd79e2ed209e&#34;</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">channel</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">name</span> <span style="color:#19177c">&#39;guix</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">url</span> <span style="color:#ba2121">&#34;https://git.savannah.gnu.org/git/guix.git&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">commit</span> <span style="color:#ba2121">&#34;6311493d7a6271bfbc51f4693857f9a12fe9965d&#34;</span>))))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">inferior</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">inferior-for-channels</span> <span style="color:#19177c">channels</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">first</span> (<span style="color:#00f">lookup-inferior-packages</span> <span style="color:#19177c">inferior</span> <span style="color:#ba2121">&#34;linux&#34;</span> <span style="color:#ba2121">&#34;6.2.9&#34;</span>))))
</span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic">;; (kernel linux)</span>
</span></span><span style="display:flex;"><span>(<span style="color:#00f">initrd</span> <span style="color:#19177c">microcode-initrd</span>)
</span></span><span style="display:flex;"><span>(<span style="color:#00f">firmware</span> (<span style="color:#008000">list </span><span style="color:#19177c">linux-firmware</span>))
</span></span><span style="display:flex;"><span>(<span style="color:#00f">locale</span> <span style="color:#ba2121">&#34;en_US.utf8&#34;</span>)
</span></span><span style="display:flex;"><span>(<span style="color:#00f">timezone</span> <span style="color:#ba2121">&#34;Europe/Moscow&#34;</span>)
</span></span></code></pre></div><p>US/RU keyboard layout, switch with Alt+Shift.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-scheme" data-lang="scheme"><span style="display:flex;"><span>(<span style="color:#00f">keyboard-layout</span> (<span style="color:#00f">keyboard-layout</span> <span style="color:#ba2121">&#34;us,ru&#34;</span> <span style="color:#666">#</span><span style="color:#19177c">:options</span> <span style="color:#666">&#39;</span>(<span style="color:#ba2121">&#34;grp:alt_shift_toggle&#34;</span>)))
</span></span></code></pre></div><p>User accounts.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-scheme" data-lang="scheme"><span style="display:flex;"><span>(<span style="color:#00f">users</span> (<span style="color:#00f">cons*</span> (<span style="color:#00f">user-account</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">name</span> <span style="color:#ba2121">&#34;pavel&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">comment</span> <span style="color:#ba2121">&#34;Pavel&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">group</span> <span style="color:#ba2121">&#34;users&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">home-directory</span> <span style="color:#ba2121">&#34;/home/pavel&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">supplementary-groups</span>
</span></span><span style="display:flex;"><span> <span style="color:#666">&#39;</span>(<span style="color:#ba2121">&#34;wheel&#34;</span> <span style="color:#408080;font-style:italic">;; sudo</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;netdev&#34;</span> <span style="color:#408080;font-style:italic">;; network devices</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;audio&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;video&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;input&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;tty&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;docker&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;scanner&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;libvirt&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;lp&#34;</span>)))
</span></span><span style="display:flex;"><span> <span style="color:#19177c">%base-user-accounts</span>))
</span></span></code></pre></div><p>Base packages, necessary right after the installation.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-scheme" data-lang="scheme"><span style="display:flex;"><span>(<span style="color:#00f">packages</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">append</span>
</span></span><span style="display:flex;"><span> (<span style="color:#008000">list </span><span style="color:#19177c">nss-certs</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">git</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">i3-gaps</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">i3lock</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">openbox</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">xterm</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">vim</span>)
</span></span><span style="display:flex;"><span> <span style="color:#19177c">%base-packages</span>))
</span></span></code></pre></div><p>Default services for each machine:</p>
<ul>
<li>override the default <code>%desktop-services</code> to add OpenVPN support</li>
<li>add nix service</li>
<li>add docker service</li>
<li>add CUPS service</li>
<li>add libvirt service</li>
<li>add a symlink to ELF interpreter to where most Linux binaries expect it</li>
</ul>
<!--listend-->
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-scheme" data-lang="scheme"><span style="display:flex;"><span>(<span style="color:#008000;font-weight:bold">define </span><span style="color:#19177c">%my-base-services</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">cons*</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">service</span> <span style="color:#19177c">openssh-service-type</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">screen-locker-service</span> <span style="color:#19177c">i3lock</span> <span style="color:#ba2121">&#34;i3lock&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">extra-special-file</span> <span style="color:#ba2121">&#34;/lib64/ld-linux-x86-64.so.2&#34;</span> (<span style="color:#00f">file-append</span> <span style="color:#19177c">glibc</span> <span style="color:#ba2121">&#34;/lib/ld-linux-x86-64.so.2&#34;</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">service</span> <span style="color:#19177c">nix-service-type</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">service</span> <span style="color:#19177c">cups-service-type</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">cups-configuration</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">web-interface?</span> <span style="color:#800">#t</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">service</span> <span style="color:#19177c">docker-service-type</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">service</span> <span style="color:#19177c">libvirt-service-type</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">libvirt-configuration</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">unix-sock-group</span> <span style="color:#ba2121">&#34;libvirt&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">tls-port</span> <span style="color:#ba2121">&#34;16555&#34;</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">service</span> <span style="color:#19177c">virtlog-service-type</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bluetooth-service</span> <span style="color:#666">#</span><span style="color:#19177c">:auto-enable?</span> <span style="color:#800">#f</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">modify-services</span> <span style="color:#19177c">%desktop-services</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">network-manager-service-type</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">config</span> <span style="color:#19177c">=&gt;</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">network-manager-configuration</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">inherit</span> <span style="color:#19177c">config</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">vpn-plugins</span> (<span style="color:#008000">list </span><span style="color:#19177c">network-manager-openvpn</span>))))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">guix-service-type</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">config</span> <span style="color:#19177c">=&gt;</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">guix-configuration</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">inherit</span> <span style="color:#19177c">config</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">substitute-urls</span>
</span></span><span style="display:flex;"><span> (<span style="color:#008000">append </span>(<span style="color:#008000">list </span><span style="color:#ba2121">&#34;https://substitutes.nonguix.org&#34;</span>)
</span></span><span style="display:flex;"><span> <span style="color:#19177c">%default-substitute-urls</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">authorized-keys</span>
</span></span><span style="display:flex;"><span> (<span style="color:#008000">append </span>(<span style="color:#008000">list </span>(<span style="color:#00f">local-file</span> <span style="color:#ba2121">&#34;./signing-key.pub&#34;</span>))
</span></span><span style="display:flex;"><span> <span style="color:#19177c">%default-authorized-guix-keys</span>)))))))
</span></span></code></pre></div><h3 id="indigo">indigo</h3>
<p><code>indigo</code> is my desktop PC.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-scheme" data-lang="scheme"><span style="display:flex;"><span><span style="color:#19177c">&lt;&lt;system-common&gt;&gt;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(<span style="color:#00f">operating-system</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">&lt;&lt;system-base&gt;&gt;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">host-name</span> <span style="color:#ba2121">&#34;indigo&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">services</span> (<span style="color:#00f">cons*</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">set-xorg-configuration</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">xorg-configuration</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">keyboard-layout</span> <span style="color:#19177c">keyboard-layout</span>)))
</span></span><span style="display:flex;"><span> <span style="color:#19177c">%my-base-services</span>))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader-configuration</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader</span> <span style="color:#19177c">grub-efi-bootloader</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">target</span> <span style="color:#ba2121">&#34;/boot/efi&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">keyboard-layout</span> <span style="color:#19177c">keyboard-layout</span>)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">swap-devices</span>
</span></span><span style="display:flex;"><span> (<span style="color:#008000">list </span>(<span style="color:#00f">uuid</span> <span style="color:#ba2121">&#34;3a77c542-7d24-46ff-8123-f7398d1c2677&#34;</span>)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">file-systems</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">cons*</span> (<span style="color:#00f">file-system</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">mount-point</span> <span style="color:#ba2121">&#34;/&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">device</span> (<span style="color:#00f">file-system-label</span> <span style="color:#ba2121">&#34;my-root&#34;</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">type</span> <span style="color:#ba2121">&#34;ext4&#34;</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">file-system</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">mount-point</span> <span style="color:#ba2121">&#34;/boot/efi&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">device</span> <span style="color:#ba2121">&#34;/dev/sda1&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">type</span> <span style="color:#ba2121">&#34;vfat&#34;</span>))
</span></span><span style="display:flex;"><span> <span style="color:#19177c">%base-file-systems</span>)))
</span></span></code></pre></div><h3 id="eminence">eminence</h3>
<p><code>eminence</code> is a HP 15s laptop.</p>
<p><code>%backlight-udev-rule</code> should enable members of <code>video</code> group change the display backlight. See the relevant page at <a href="https://wiki.archlinux.org/title/Backlight">Arch Wiki</a>.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-scheme" data-lang="scheme"><span style="display:flex;"><span><span style="color:#19177c">&lt;&lt;system-common&gt;&gt;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(<span style="color:#008000;font-weight:bold">define </span><span style="color:#19177c">%backlight-udev-rule</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">udev-rule</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;90-backlight.rules&#34;</span>
</span></span><span style="display:flex;"><span> (<span style="color:#008000">string-append </span><span style="color:#ba2121">&#34;ACTION==\&#34;add\&#34;, SUBSYSTEM==\&#34;backlight\&#34;, &#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;RUN+=\&#34;/run/current-system/profile/bin/chgrp video /sys/class/backlight/%k/brightness\&#34;&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;\n&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;ACTION==\&#34;add\&#34;, SUBSYSTEM==\&#34;backlight\&#34;, &#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;RUN+=\&#34;/run/current-system/profile/bin/chmod g+w /sys/class/backlight/%k/brightness\&#34;&#34;</span>)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(<span style="color:#00f">operating-system</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">&lt;&lt;system-base&gt;&gt;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">host-name</span> <span style="color:#ba2121">&#34;eminence&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">services</span> (<span style="color:#00f">cons*</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">set-xorg-configuration</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">xorg-configuration</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">keyboard-layout</span> <span style="color:#19177c">keyboard-layout</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">modify-services</span> <span style="color:#19177c">%my-base-services</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">elogind-service-type</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">config</span> <span style="color:#19177c">=&gt;</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">elogind-configuration</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">inherit</span> <span style="color:#19177c">config</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">handle-lid-switch-external-power</span> <span style="color:#19177c">&#39;suspend</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">udev-service-type</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">config</span> <span style="color:#19177c">=&gt;</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">udev-configuration</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">inherit</span> <span style="color:#19177c">config</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">rules</span> (<span style="color:#008000">cons </span><span style="color:#19177c">%backlight-udev-rule</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">udev-configuration-rules</span> <span style="color:#19177c">config</span>))))))))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader-configuration</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader</span> <span style="color:#19177c">grub-efi-bootloader</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">target</span> <span style="color:#ba2121">&#34;/boot/efi&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">keyboard-layout</span> <span style="color:#19177c">keyboard-layout</span>)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">swap-devices</span>
</span></span><span style="display:flex;"><span> (<span style="color:#008000">list </span>(<span style="color:#00f">uuid</span> <span style="color:#ba2121">&#34;f93cf3f6-7ee7-42ec-8ee2-f3d896fdf9b5&#34;</span>)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">file-systems</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">cons*</span> (<span style="color:#00f">file-system</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">mount-point</span> <span style="color:#ba2121">&#34;/&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">device</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">uuid</span> <span style="color:#ba2121">&#34;1d937704-bbeb-43b5-bc63-453886c426af&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">&#39;ext4</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">type</span> <span style="color:#ba2121">&#34;ext4&#34;</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">file-system</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">mount-point</span> <span style="color:#ba2121">&#34;/boot/efi&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">device</span> (<span style="color:#00f">uuid</span> <span style="color:#ba2121">&#34;0031-3784&#34;</span> <span style="color:#19177c">&#39;fat32</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">type</span> <span style="color:#ba2121">&#34;vfat&#34;</span>))
</span></span><span style="display:flex;"><span> <span style="color:#19177c">%base-file-systems</span>)))
</span></span></code></pre></div><h3 id="azure">azure</h3>
<p><code>azure</code> is a Lenovo Ideapad 330 laptop.</p>
<p><code>%backlight-udev-rule</code> should enable members of <code>video</code> group change the display backlight. See the relevant page at <a href="https://wiki.archlinux.org/title/Backlight">Arch Wiki</a>.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-scheme" data-lang="scheme"><span style="display:flex;"><span><span style="color:#19177c">&lt;&lt;system-common&gt;&gt;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(<span style="color:#008000;font-weight:bold">define </span><span style="color:#19177c">%backlight-udev-rule</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">udev-rule</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;90-backlight.rules&#34;</span>
</span></span><span style="display:flex;"><span> (<span style="color:#008000">string-append </span><span style="color:#ba2121">&#34;ACTION==\&#34;add\&#34;, SUBSYSTEM==\&#34;backlight\&#34;, &#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;RUN+=\&#34;/run/current-system/profile/bin/chgrp video /sys/class/backlight/%k/brightness\&#34;&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;\n&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;ACTION==\&#34;add\&#34;, SUBSYSTEM==\&#34;backlight\&#34;, &#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;RUN+=\&#34;/run/current-system/profile/bin/chmod g+w /sys/class/backlight/%k/brightness\&#34;&#34;</span>)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(<span style="color:#00f">operating-system</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">&lt;&lt;system-base&gt;&gt;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">host-name</span> <span style="color:#ba2121">&#34;azure&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">services</span> (<span style="color:#00f">cons*</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">set-xorg-configuration</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">xorg-configuration</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">keyboard-layout</span> <span style="color:#19177c">keyboard-layout</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">modify-services</span> <span style="color:#19177c">%my-base-services</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">elogind-service-type</span> <span style="color:#19177c">config</span> <span style="color:#19177c">=&gt;</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">elogind-configuration</span> (<span style="color:#00f">inherit</span> <span style="color:#19177c">config</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">handle-lid-switch-external-power</span> <span style="color:#19177c">&#39;suspend</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">udev-service-type</span> <span style="color:#19177c">config</span> <span style="color:#19177c">=&gt;</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">udev-configuration</span> (<span style="color:#00f">inherit</span> <span style="color:#19177c">config</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">rules</span> (<span style="color:#008000">cons </span><span style="color:#19177c">%backlight-udev-rule</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">udev-configuration-rules</span> <span style="color:#19177c">config</span>))))))))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader-configuration</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader</span> <span style="color:#19177c">grub-efi-bootloader</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">target</span> <span style="color:#ba2121">&#34;/boot/efi&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">keyboard-layout</span> <span style="color:#19177c">keyboard-layout</span>)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">swap-devices</span>
</span></span><span style="display:flex;"><span> (<span style="color:#008000">list </span>(<span style="color:#00f">uuid</span> <span style="color:#ba2121">&#34;4b2dedb3-b111-4e69-8c05-6daa2b072c76&#34;</span>)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">file-systems</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">cons*</span> (<span style="color:#00f">file-system</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">mount-point</span> <span style="color:#ba2121">&#34;/&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">device</span> (<span style="color:#00f">file-system-label</span> <span style="color:#ba2121">&#34;my-root&#34;</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">type</span> <span style="color:#ba2121">&#34;ext4&#34;</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">file-system</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">mount-point</span> <span style="color:#ba2121">&#34;/boot/efi&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">device</span> <span style="color:#ba2121">&#34;/dev/sda1&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">type</span> <span style="color:#ba2121">&#34;vfat&#34;</span>))
</span></span><span style="display:flex;"><span> <span style="color:#19177c">%base-file-systems</span>)))
</span></span></code></pre></div><h3 id="iris">iris</h3>
<p><code>iris</code> is my work machine.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-scheme" data-lang="scheme"><span style="display:flex;"><span><span style="color:#19177c">&lt;&lt;system-common&gt;&gt;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(<span style="color:#00f">operating-system</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">&lt;&lt;system-base&gt;&gt;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">host-name</span> <span style="color:#ba2121">&#34;iris&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">services</span> (<span style="color:#00f">cons*</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">set-xorg-configuration</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">xorg-configuration</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">keyboard-layout</span> <span style="color:#19177c">keyboard-layout</span>)))
</span></span><span style="display:flex;"><span> <span style="color:#19177c">%my-base-services</span>))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader</span> (<span style="color:#00f">bootloader-configuration</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">bootloader</span> <span style="color:#19177c">grub-bootloader</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">targets</span> (<span style="color:#008000">list </span><span style="color:#ba2121">&#34;/dev/sdb&#34;</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">keyboard-layout</span> <span style="color:#19177c">keyboard-layout</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">swap-devices</span> (<span style="color:#008000">list </span>(<span style="color:#00f">swap-space</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">target</span> (<span style="color:#00f">uuid</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;bc284384-ff00-4fbc-abda-1c46f69c0505&#34;</span>)))))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">mapped-devices</span> (<span style="color:#008000">list </span>(<span style="color:#00f">mapped-device</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">source</span> (<span style="color:#00f">uuid</span>
</span></span><span style="display:flex;"><span> <span style="color:#ba2121">&#34;21876acb-e05a-4731-8df0-ba5761910ca8&#34;</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">target</span> <span style="color:#ba2121">&#34;cryptroot&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">type</span> <span style="color:#19177c">luks-device-mapping</span>))))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">file-systems</span> (<span style="color:#00f">cons*</span> (<span style="color:#00f">file-system</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">mount-point</span> <span style="color:#ba2121">&#34;/&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">device</span> <span style="color:#ba2121">&#34;/dev/mapper/cryptroot&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">type</span> <span style="color:#ba2121">&#34;ext4&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">dependencies</span> <span style="color:#19177c">mapped-devices</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">file-system</span>
</span></span><span style="display:flex;"><span> (<span style="color:#00f">mount-point</span> <span style="color:#ba2121">&#34;/boot/efi&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#00f">device</span> (<span style="color:#00f">uuid</span> <span style="color:#ba2121">&#34;782E-F6D3&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">&#39;fat32</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#00f">type</span> <span style="color:#ba2121">&#34;vfat&#34;</span>)) <span style="color:#19177c">%base-file-systems</span>)))
</span></span></code></pre></div><h2 id="system-installation">System installation</h2>
<h3 id="preparation">Preparation</h3>
<p>In my case, the provided ISO doesn&rsquo;t work because of the Libre kernel.</p>
<p>Fortunately, David Wilson has made <a href="https://github.com/SystemCrafters/guix-installer">a repository</a> with a toolchain to make an ISO with the full kernel. In case it won&rsquo;t be an option, the <a href="https://gitlab.com/nonguix/nonguix">nonguix repo</a> also has instructions on how to do that.</p>
<p>When an ISO is there, we have to write it on a USB stick. Run <code>sudo fdisk -l</code> to get a list of disks.</p>
<p>The approach given in the official instruction is to create a bootable USB with <code>dd</code>:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>sudo dd of=/dev/sdxX if=&lt;path-to-iso&gt; status=progress &amp;&amp; sync
</span></span></code></pre></div><p>However, I couldn&rsquo;t make it work for some strange reason. Fortunately, <code>gnome-disk-utility</code> was able to produce a bootable USB.</p>
<h3 id="installation">Installation</h3>
<p>Going further, the official instructions for installation &amp; SystemCrafters wiki entry are pretty good, so it&rsquo;s not necessary to repeat them here.</p>
<h3 id="after-installation">After installation</h3>
<p>After the installation, the strategy is as follows.</p>
<p>Set a password for the main user (pavel). Login with openbox to get a tolerable interface because i3&rsquo;s default config is horrible.</p>
<p><a href="https://guix.gnu.org/en/manual/en/html_node/Keyboard-Layout-and-Networking-and-Partitioning.html#Keyboard-Layout-and-Networking-and-Partitioning">Connect to the internet</a>.</p>
<p>Clone the dotfiles repo:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>mkdir Code
</span></span><span style="display:flex;"><span>cd Code
</span></span><span style="display:flex;"><span>git clone https://github.com/SqrtMinusOne/dotfiles.git
</span></span></code></pre></div><p>Copy the channels file and run guix pull:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>cp ~/Code/dotfiles/.config/guix/channels.scm ~/.config/guix
</span></span><span style="display:flex;"><span>guix pull
</span></span></code></pre></div><p>The first pull usually takes a while. After that install yadm and pull dotfiles:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>guix install yadm
</span></span><span style="display:flex;"><span>guix clone https://github.com/SqrtMinusOne/dotfiles.git
</span></span></code></pre></div><p>And activate the required profiles. Again, downloading &amp; building Emacs, Starship and stuff will take a while.</p>
<p>Don&rsquo;t forget to install <code>JetBrainsMono Nerd Font</code>.</p>
<h2 id="misc-software-and-notes">Misc software &amp; notes</h2>
<table>
<thead>
<tr>
<th>Category</th>
<th>Guix dependency</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>system</td>
<td>patchelf</td>
<td>A program to modify existsing ELF executables</td>
</tr>
<tr>
<td>system</td>
<td>glibc</td>
<td>A lot of stuff, including ELF interpeter and <code>ldd</code></td>
</tr>
<tr>
<td>system</td>
<td>tor-client</td>
<td></td>
</tr>
<tr>
<td>system</td>
<td>torsocks</td>
<td></td>
</tr>
<tr>
<td>system</td>
<td>vnstat</td>
<td></td>
</tr>
<tr>
<td>system</td>
<td>nss-certs</td>
<td></td>
</tr>
</tbody>
</table>
<h3 id="openvpn">OpenVPN</h3>
<table>
<thead>
<tr>
<th>Category</th>
<th>Guix dependency</th>
</tr>
</thead>
<tbody>
<tr>
<td>system</td>
<td>openvpn</td>
</tr>
<tr>
<td>system</td>
<td>openvpn-update-resolve-conf</td>
</tr>
<tr>
<td>system</td>
<td>openresolv</td>
</tr>
<tr>
<td>system</td>
<td>vpnc</td>
</tr>
</tbody>
</table>
<p>Update <span class="timestamp-wrapper"><span class="timestamp">[2023-06-29 Thu]</span></span>: My censors seem to be putting sticks in the wheels of OpenVPN&hellip; Switched to Wireguard for now. It can be configured with Network Manager.</p>
<p>I&rsquo;m not sure how to properly spin up VPN on Guix, so here is what ended I&rsquo;m doing after some trial and error.</p>
<p>I&rsquo;m using Mullvad VPN. The <code>~/.vpn</code> folder stores its OpenVPN config (<code>openvpn.ovpn</code>), modified as follows:</p>
<ul>
<li>
<p>paths to <code>ca</code>, <code>cert</code> and <code>key</code> are made absolute</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-vim" data-lang="vim"><span style="display:flex;"><span>ca <span style="color:#b68">/home/</span>pavel<span style="color:#b68">/.vpn/</span>ca.crt
</span></span><span style="display:flex;"><span>cert <span style="color:#b68">/home/</span>pavel<span style="color:#b68">/.vpn/</span>client.crt
</span></span><span style="display:flex;"><span>key <span style="color:#b68">/home/</span>pavel<span style="color:#b68">/.vpn/</span>client.key
</span></span></code></pre></div></li>
<li>
<p>added <code>auth-user-pass</code> with a link to login info</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-vim" data-lang="vim"><span style="display:flex;"><span>auth-user-pass <span style="color:#b68">/home/</span>pavel<span style="color:#b68">/.vpn/</span>auth.conf
</span></span></code></pre></div><p><code>auth.conf</code> looks like this:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>login
</span></span><span style="display:flex;"><span>password
</span></span></code></pre></div></li>
<li>
<p>Run <a href="https://github.com/alfredopalhares/openvpn-update-resolv-conf">openvpn-update-resolv-conf</a> script to prevent DNS leaks. <code>openvpn-update-resolve-conf</code> originates in my <a href="https://github.com/SqrtMinusOne/channel-q">channel-q</a>.</p>
<p>Edit <span class="timestamp-wrapper"><span class="timestamp">&lt;2022-04-07 Thu&gt;</span></span>: Looks like this doesn&rsquo;t work on some connections. See the next option in that case</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-vim" data-lang="vim"><span style="display:flex;"><span>setenv PATH <span style="color:#b68">/home/</span>pavel<span style="color:#b68">/.guix-extra-profiles/</span>system<span style="color:#b68">/system/</span>bin:<span style="color:#b68">/home/</span>pavel<span style="color:#b68">/.guix-extra-profiles/</span>system<span style="color:#b68">/system/</span>sbin:<span style="color:#b68">/home/</span>pavel<span style="color:#b68">/.guix-extra-profiles/</span>console<span style="color:#b68">/console/</span>bin:<span style="color:#b68">/run/</span>current-system<span style="color:#b68">/profile/</span>bin:<span style="color:#b68">/run/</span>current-system<span style="color:#b68">/profile/</span>sbin
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>up <span style="color:#b68">/home/</span>pavel<span style="color:#b68">/.guix-extra-profiles/</span>system<span style="color:#b68">/system/</span>bin/update-resolv-conf.sh
</span></span><span style="display:flex;"><span>down <span style="color:#b68">/home/</span>pavel<span style="color:#b68">/.guix-extra-profiles/</span>system<span style="color:#b68">/system/</span>bin/update-resolv-conf.sh
</span></span></code></pre></div><p><code>setenv PATH</code> is necessary because both <code>resolvconf</code> (openresolve) and <code>update-resolv-conf.sh</code> are shell scripts which need GNU coreutils and stuff, and OpenVPN clears PATH by default.</p>
</li>
<li>
<p>Manually fix <code>etc/resolv.conf</code> to prevent DNS leaks</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>/home/pavel/.guix-extra-profiles/console/console/bin/cp /etc/resolv.conf /etc/resolv.conf-bak
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;nameserver 8.8.8.8&#34;</span> &gt; /etc/resolv.conf
</span></span></code></pre></div><p>Restore <code>resolv.conf</code></p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>resolveconf -u
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-vim" data-lang="vim"><span style="display:flex;"><span>up <span style="color:#b68">/home/</span>pavel<span style="color:#b68">/bin/</span>scripts/fix-resolve-conf
</span></span><span style="display:flex;"><span>down <span style="color:#b68">/home/</span>pavel<span style="color:#b68">/bin/</span>scripts/restore-resolve-conf
</span></span></code></pre></div></li>
<li>
<p>run a script to fix Docker routes</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-vim" data-lang="vim"><span style="display:flex;"><span>route-up <span style="color:#b68">/home/</span>pavel<span style="color:#b68">/bin/</span>scripts/vpn-fix-routes
</span></span></code></pre></div><p>References:</p>
<ul>
<li><a href="https://github.com/moby/libnetwork/issues/779">Github issue</a></li>
</ul>
<p>The script itself:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;Adding default route to </span><span style="color:#19177c">$route_vpn_gateway</span><span style="color:#ba2121"> with /0 mask...&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[</span> -f <span style="color:#ba2121">&#34;/run/current-system/profile/sbin/ip&#34;</span> <span style="color:#666">]</span>; <span style="color:#008000;font-weight:bold">then</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">IP</span><span style="color:#666">=</span>/run/current-system/profile/sbin/ip
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">else</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">IP</span><span style="color:#666">=</span>/usr/bin/ip
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">fi</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#19177c">$IP</span> route add default via <span style="color:#19177c">$route_vpn_gateway</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;Removing /1 routes...&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#19177c">$IP</span> route del 0.0.0.0/1 via <span style="color:#19177c">$route_vpn_gateway</span>
</span></span><span style="display:flex;"><span><span style="color:#19177c">$IP</span> route del 128.0.0.0/1 via <span style="color:#19177c">$route_vpn_gateway</span>
</span></span></code></pre></div></li>
</ul>
<h4 id="vpn-start">vpn-start</h4>
<p><del>As of now, CyberGhost doesn&rsquo;t provide ipv6, so we have to disable it.</del></p>
<p>Mullvad seems to provide it, so the script just launches <code>openvpn</code> with <code>pkexec</code>.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#008000">export</span> <span style="color:#19177c">DISPLAY</span><span style="color:#666">=</span>:0
</span></span><span style="display:flex;"><span><span style="color:#19177c">CONN</span><span style="color:#666">=</span><span style="color:#008000;font-weight:bold">$(</span>nmcli -f NAME con show --active | grep -Ev <span style="color:#ba2121">&#34;(.*docker.*|NAME|br-.*|veth.*|tun.*|vnet.*|virbr.*)&#34;</span> | sed <span style="color:#ba2121">&#39;s/ *$//g&#39;</span><span style="color:#008000;font-weight:bold">)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[</span> -z <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$CONN</span><span style="color:#ba2121">&#34;</span> <span style="color:#666">]</span>; <span style="color:#008000;font-weight:bold">then</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;No connection!&#34;</span>
</span></span><span style="display:flex;"><span> notify-send <span style="color:#ba2121">&#34;VPN&#34;</span> <span style="color:#ba2121">&#34;No connection for VPN to run&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">exit</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">fi</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"># if [[ &#34;$CONN&#34; != *&#34;Wired&#34;* ]]; then</span>
</span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"># echo &#34;Connection: $CONN&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"># notify-send &#34;VPN&#34; &#34;Initializing for connection: $CONN&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"># pkexec nmcli con modify &#34;$CONN&#34; ipv6.method ignore</span>
</span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"># nmcli connection up &#34;$CONN&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#408080;font-style:italic"># fi</span>
</span></span><span style="display:flex;"><span><span style="color:#19177c">VPN_FILE</span><span style="color:#666">=</span>~/.vpn/sqrtminusone-<span style="color:#008000;font-weight:bold">$(</span>hostname<span style="color:#008000;font-weight:bold">)</span>.ovpn
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[[</span> <span style="color:#008000;font-weight:bold">$(</span>hostname<span style="color:#008000;font-weight:bold">)</span> <span style="color:#666">==</span> <span style="color:#ba2121">&#39;iris&#39;</span> <span style="color:#666">]]</span>; <span style="color:#008000;font-weight:bold">then</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">VPN_FILE</span><span style="color:#666">=</span>~/.vpn/mullvad_openvpn_linux_se_all/mullvad_se_all.conf
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">fi</span>
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#19177c">$VPN_FILE</span>
</span></span><span style="display:flex;"><span>pkexec openvpn --config <span style="color:#19177c">$VPN_FILE</span>
</span></span></code></pre></div><h4 id="377cab"><del>vpn-stop</del></h4>
<p><del>Also a script to reverse the changes</del>
Also not necessary now. Just <code>herd stop vpn</code> and <code>sudo pkill vpn</code>.</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#19177c">CONN</span><span style="color:#666">=</span><span style="color:#008000;font-weight:bold">$(</span>nmcli -f NAME con show --active | grep -Ev <span style="color:#ba2121">&#34;(.*docker.*|NAME|br-.*|veth.*|tun.*)&#34;</span> | sed <span style="color:#ba2121">&#39;s/ *$//g&#39;</span><span style="color:#008000;font-weight:bold">)</span>
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;Connection: </span><span style="color:#19177c">$CONN</span><span style="color:#ba2121">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>pkexec nmcli con modify <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$CONN</span><span style="color:#ba2121">&#34;</span> ipv6.method auto
</span></span><span style="display:flex;"><span>nmcli connection up <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$CONN</span><span style="color:#ba2121">&#34;</span>
</span></span></code></pre></div><h3 id="wireguard">Wireguard</h3>
<p>So, yeah, wireguard can be configured with <code>NetworkManager</code> just fine.</p>
<p>The issue with DNS leaks remains, but fortunately <code>NetworkManager</code> runs all scripts in <code>/etc/NetworkManager/dispatcher.d/</code> when a connection changes, provided that scripts are:</p>
<ul>
<li>owned by root</li>
<li>exectuable</li>
<li>not readable by other users</li>
<li>not setuid.</li>
</ul>
<p>See <a href="https://askubuntu.com/questions/13963/call-script-after-connecting-to-a-wireless-network">this answer</a> on StackExchange, and <a href="https://networkmanager.dev/docs/api/latest/NetworkManager-dispatcher.html">NetworkManager-dispatcher man page</a>.</p>
<p><a id="code-snippet--get-nmcli"></a></p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#008000;font-weight:bold">$(</span>guix build network-manager | grep -ve <span style="color:#ba2121">&#39;-doc$&#39;</span><span style="color:#008000;font-weight:bold">)</span>/bin/nmcli
</span></span></code></pre></div><p>So, here&rsquo;s the script:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#bc7a00">#!/bin/sh
</span></span></span><span style="display:flex;"><span><span style="color:#bc7a00"></span><span style="color:#19177c">GREP</span><span style="color:#666">=</span>/run/current-system/profile/bin/grep
</span></span><span style="display:flex;"><span><span style="color:#19177c">NMCLI</span><span style="color:#666">=</span><span style="color:#ba2121">&lt;&lt;get-nmcli()&gt;&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121">
</span></span></span><span style="display:flex;"><span><span style="color:#ba2121"># Run only if wireg</span>uard is active
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">if</span> <span style="color:#19177c">$NMCLI</span> connection show --active | <span style="color:#19177c">$GREP</span> -q wireguard; <span style="color:#008000;font-weight:bold">then</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;nameserver 8.8.8.8&#34;</span> &gt; /etc/resolv.conf
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">fi</span>
</span></span></code></pre></div><p>Expand the noweb with <code>C-c C-v v</code>, put it in <code>dispatcher.d</code> and run <code>chmod 700</code>.</p>
<h3 id="flatpak">flatpak</h3>
<p>As for now, the easiest way to install most of proprietary software is via flatpak. See the relevant section in <a href="/configs/desktop/">Desktop.org</a>.</p>
<h3 id="micromamba">micromamba</h3>
<p><del><a href="https://docs.conda.io/en/latest/">conda</a></del> <a href="https://github.com/mamba-org/mamba">mamba</a> is a package manager that I use for managing various versions of Python &amp; Node.js.</p>
<p><code>mamba</code> is a reimplementation of <code>conda</code> in C++. <code>mamba</code> is notably much faster and mostly compatible with <code>conda</code>, and <code>micromamba</code> is a tiny version of <code>mamba</code> that is contained in one statically linked exectuable. I&rsquo;ve migrated to <code>micromamba</code> mostly because of speed.</p>
<p><code>conda</code> is packaged for Guix with its fair share of quirks, mostly concerning the impossibility of changing the base environment in <code>/gnu/store/</code>. <code>micromamba</code> has none of that because it doesn&rsquo;t ship with a base environment. It&rsquo;s not packaged for Guix yet, so I&rsquo;ve made a definition with <code>binary-build-system</code> in my channel.</p>
<p>You may need to unset <code>$PYTHONPATH</code> if you have any global packages installed, otherwise Python from the environemnt will try to import them instead of the conda versions.</p>
<p>I also want to have an ability to use global npm. Some settings for that are located in <a href="Console">Console.org</a>. Here we want to unset <code>NPM_CONFIG_USERCONFIG</code> if there is npm available in the environment.</p>
<p>So here is a script to set up conda hooks:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#408080;font-style:italic"># Get writable conda envs with npm &amp; without it</span>
</span></span><span style="display:flex;"><span>readarray -t CONDA_ENVS_ALL <span style="color:#666">&lt;&lt;&lt;</span> <span style="color:#008000;font-weight:bold">$(</span>micromamba env list --json | jq <span style="color:#ba2121">&#39;.envs[]&#39;</span><span style="color:#008000;font-weight:bold">)</span>
</span></span><span style="display:flex;"><span><span style="color:#19177c">CONDA_ENVS_NPM</span><span style="color:#666">=()</span>
</span></span><span style="display:flex;"><span><span style="color:#19177c">CONDA_ENVS_NO_NPM</span><span style="color:#666">=()</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">for</span> env in <span style="color:#ba2121">&#34;</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">CONDA_ENVS_ALL</span>[@]<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">&#34;</span>; <span style="color:#008000;font-weight:bold">do</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">env</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">env</span>:<span style="color:#19177c">1</span>:<span style="color:#b68;font-weight:bold">${#</span><span style="color:#19177c">env</span><span style="color:#b68;font-weight:bold">}</span>-2<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[</span> -w <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$env</span><span style="color:#ba2121">&#34;</span> <span style="color:#666">]</span>; <span style="color:#008000;font-weight:bold">then</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">if</span> <span style="color:#666">[</span> -f <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/bin/npm&#34;</span> <span style="color:#666">]</span>; <span style="color:#008000;font-weight:bold">then</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">CONDA_ENVS_NPM</span><span style="color:#666">+=(</span><span style="color:#19177c">$env</span><span style="color:#666">)</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">else</span>
</span></span><span style="display:flex;"><span> <span style="color:#19177c">CONDA_ENVS_NO_NPM</span><span style="color:#666">+=(</span><span style="color:#19177c">$env</span><span style="color:#666">)</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">fi</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">fi</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">done</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">for</span> env in <span style="color:#ba2121">&#34;</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">CONDA_ENVS_NPM</span>[@]<span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">&#34;</span>; <span style="color:#008000;font-weight:bold">do</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;Found npm in </span><span style="color:#19177c">$env</span><span style="color:#ba2121">&#34;</span>
</span></span><span style="display:flex;"><span> mkdir -p <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/activate.d&#34;</span>
</span></span><span style="display:flex;"><span> mkdir -p <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/deactivate.d&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;unset NPM_CONFIG_USERCONFIG&#34;</span> &gt; <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/activate.d/conda.sh&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;set -e NPM_CONFIG_USERCONFIG&#34;</span> &gt; <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/activate.d/conda.fish&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;export NPM_CONFIG_USERCONFIG=</span><span style="color:#19177c">$HOME</span><span style="color:#ba2121">/._npmrc&#34;</span> &gt; <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/deactivate.d/conda.sh&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;export NPM_CONFIG_USERCONFIG=</span><span style="color:#19177c">$HOME</span><span style="color:#ba2121">/._npmrc&#34;</span> &gt; <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/deactivate.d/conda.fish&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">done</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">for</span> env in <span style="color:#ba2121">&#34;</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#19177c">CONDA_ENVS_NO_NPM</span><span style="color:#b68;font-weight:bold">}</span><span style="color:#ba2121">&#34;</span>; <span style="color:#008000;font-weight:bold">do</span>
</span></span><span style="display:flex;"><span> <span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;Did not found npm in </span><span style="color:#19177c">$env</span><span style="color:#ba2121">&#34;</span>
</span></span><span style="display:flex;"><span> rm -rf <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/activate.d/conda.sh&#34;</span> <span style="color:#666">||</span> <span style="color:#008000">true</span>
</span></span><span style="display:flex;"><span> rm -rf <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/activate.d/conda.fish&#34;</span> <span style="color:#666">||</span> <span style="color:#008000">true</span>
</span></span><span style="display:flex;"><span> rm -rf <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/deactivate.d/conda.sh&#34;</span> <span style="color:#666">||</span> <span style="color:#008000">true</span>
</span></span><span style="display:flex;"><span> rm -rf <span style="color:#ba2121">&#34;</span><span style="color:#19177c">$env</span><span style="color:#ba2121">/etc/conda/deactivate.d/conda.fish&#34;</span> <span style="color:#666">||</span> <span style="color:#008000">true</span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">done</span>
</span></span></code></pre></div><h3 id="slack">Slack</h3>
<p>What a nonsense of a program.</p>
<p>I was able to launch the nix version with the following wrapper script:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#008000">export</span> <span style="color:#19177c">PATH</span><span style="color:#666">=</span><span style="color:#ba2121">&#34;</span><span style="color:#19177c">$HOME</span><span style="color:#ba2121">/bin/dummies:</span><span style="color:#19177c">$PATH</span><span style="color:#ba2121">&#34;</span>
</span></span><span style="display:flex;"><span>mkdir -p ~/.cache/slack
</span></span><span style="display:flex;"><span>slack -r ~/.cache/slack
</span></span></code></pre></div><p>Also, it requires a <code>lsb_release</code> in the PATH, so here is one:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;LSB Version: Hey. I spent an hour figuring out why Slack doesn&#39;t launch.&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;Distributor ID: It seems like it requires an lsb_release.&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;Description: But GNU Guix doesn&#39;t have one.&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;Release: 42.2&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#008000">echo</span> <span style="color:#ba2121">&#34;Codename: n/a&#34;</span>
</span></span></code></pre></div><h3 id="virt-manager">virt-manager</h3>
<p>Run the following to fix the network:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>sudo virsh net-define /run/current-system/profile/etc/libvirt/qemu/networks/default.xml
</span></span><span style="display:flex;"><span>sudo virsh net-start default
</span></span><span style="display:flex;"><span>sudo herd restart libvirtd
</span></span></code></pre></div><h3 id="wakatime-cli">wakatime-cli</h3>
<table>
<thead>
<tr>
<th>Note</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>TODO</td>
<td>Package this for Guix</td>
</tr>
</tbody>
</table>
<p>Before I figure out how to package this for Guix:</p>
<ul>
<li>Clone <a href="https://github.com/wakatime/wakatime-cli">the repo</a></li>
<li>Run <code>go build</code></li>
<li>Copy the binary to the <code>~/bin</code> folder</li>
</ul>
<h3 id="docker">Docker</h3>
<p>Docker Compose plugin v2 isn&rsquo;t yet available on Guix, but can be installed as follows:</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>curl -SL https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-linux-x86_64 -o <span style="color:#19177c">$HOME</span>/.docker/cli-plugins/docker-compose
</span></span><span style="display:flex;"><span>sudo chmod +x <span style="color:#19177c">$HOME</span>/.docker/cli-plugins/docker-compose
</span></span></code></pre></div><h3 id="manifest">Manifest</h3>
<p><a id="code-snippet--packages"></a></p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(<span style="color:#19177c">my/format-guix-dependencies</span> <span style="color:#19177c">category</span>)
</span></span></code></pre></div><p>System</p>
<div class="highlight"><pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-scheme" data-lang="scheme"><span style="display:flex;"><span>(<span style="color:#00f">specifications-&gt;manifest</span>
</span></span><span style="display:flex;"><span> <span style="color:#666">&#39;</span>(
</span></span><span style="display:flex;"><span> <span style="color:#19177c">&lt;&lt;packages</span>(<span style="color:#ba2121">&#34;system&#34;</span>)<span style="color:#19177c">&gt;&gt;</span>))
</span></span></code></pre></div>
</div>
<div class="table-of-contents">
<div class="table-of-contents-text">
<b><a href="#">Table of Contents</a></b>
<nav id="TableOfContents">
<ul>
<li><a href="#profiles">Profiles</a>
<ul>
<li><a href="#activate-profiles">Activate profiles</a></li>
<li><a href="#update-profiles">Update profiles</a></li>
<li><a href="#run-guix-package-in-profile">Run <code>guix package</code> in profile</a></li>
<li><a href="#turn-off-guix-profiles">Turn off Guix profiles</a></li>
</ul>
</li>
<li><a href="#channels">Channels</a></li>
<li><a href="#systems">Systems</a>
<ul>
<li><a href="#base-configuration">Base configuration</a></li>
<li><a href="#indigo">indigo</a></li>
<li><a href="#eminence">eminence</a></li>
<li><a href="#azure">azure</a></li>
<li><a href="#iris">iris</a></li>
</ul>
</li>
<li><a href="#system-installation">System installation</a>
<ul>
<li><a href="#preparation">Preparation</a></li>
<li><a href="#installation">Installation</a></li>
<li><a href="#after-installation">After installation</a></li>
</ul>
</li>
<li><a href="#misc-software-and-notes">Misc software &amp; notes</a>
<ul>
<li><a href="#openvpn">OpenVPN</a>
<ul>
<li><a href="#vpn-start">vpn-start</a></li>
<li><a href="#377cab"><del>vpn-stop</del></a></li>
</ul>
</li>
<li><a href="#wireguard">Wireguard</a></li>
<li><a href="#flatpak">flatpak</a></li>
<li><a href="#micromamba">micromamba</a></li>
<li><a href="#slack">Slack</a></li>
<li><a href="#virt-manager">virt-manager</a></li>
<li><a href="#wakatime-cli">wakatime-cli</a></li>
<li><a href="#docker">Docker</a></li>
<li><a href="#manifest">Manifest</a></li>
</ul>
</li>
</ul>
</nav>
</div>
<a id="unhide-all-button" class="hidden">&lt;Expand&gt;</a>
<a id="hide-all-button" class="hidden">&lt;Collapse&gt;</a>
</div>
</div>
</div><div id="footer" class="mb-5">
<hr>
<div class="container text-center">
</div>
<div class="container text-center">
<a href="https://creativecommons.org/licenses/by/4.0/legalcode" title="Licensed under CC-BY 4.0"><small>Licensed under CC-BY 4.0</small></a>
|
<a href="https://plausible.io/" title="Uses Plausible Analytics"><small>Uses Plausible Analytics</small></a>
<br>
<a href="https://sqrtminusone.xyz/" title="Pavel Korytov, 2024"><small>Pavel Korytov, 2024</small></a>
</div>
</div>
</body>
</html>