aboutsummaryrefslogtreecommitdiff
path: root/docs/posts/nixOS
diff options
context:
space:
mode:
Diffstat (limited to 'docs/posts/nixOS')
-rw-r--r--docs/posts/nixOS/index.html74
1 files changed, 60 insertions, 14 deletions
diff --git a/docs/posts/nixOS/index.html b/docs/posts/nixOS/index.html
index 75be58f..9650bdd 100644
--- a/docs/posts/nixOS/index.html
+++ b/docs/posts/nixOS/index.html
@@ -33,7 +33,7 @@
33 <span class="stats-unit">cm</span> 33 <span class="stats-unit">cm</span>
34 &nbsp 34 &nbsp
35 <span class="stats-number"> 35 <span class="stats-number">
36 3.3 36 3.4
37 </span> 37 </span>
38 <span class="stats-unit">min</span> 38 <span class="stats-unit">min</span>
39 </div> 39 </div>
@@ -42,11 +42,24 @@
42 NixOS 42 NixOS
43 </h1> 43 </h1>
44 <div class="post-text"> 44 <div class="post-text">
45 <p>I have been eyeing operating systems with functional package managers for a while now, aka, NixOS or Guix. Reproducible builds, declarative and rollback-able system configuration, system consistency, all sound pretty cool. I have been using NixOS for about a month now.</p> 45 <p>I have been eyeing operating systems with functional package managers
46for a while now, aka, NixOS or Guix. Reproducible builds, declarative
47and rollback-able system configuration, system consistency, all sound
48pretty cool. I have been using NixOS for about a month now.</p>
46<h3 id="installation">Installation</h3> 49<h3 id="installation">Installation</h3>
47<p>I went with their minimal installation ISO. The installation was pretty smooth from start to end, no hitches there. The entire <a href="https://nixos.org/manual/nixos/stable/">manual</a> is available offline, and is accessible during the installation. Very handy.</p> 50<p>I went with their minimal installation ISO. The installation was
51pretty smooth from start to end, no hitches there. The entire <a
52href="https://nixos.org/manual/nixos/stable/">manual</a> is available
53offline, and is accessible during the installation. Very handy.</p>
48<h3 id="setup">Setup</h3> 54<h3 id="setup">Setup</h3>
49<p>The entire system is configured via <code>/etc/nixos/configuration.nix</code>. Wifi, <code>libinput</code> gestures, audio, locale settings, there are options for literally everything. You can declaratively write down the packages you want installed too. With fresh installs of most distros, I usually fumble with getting things like screen backlight and media keys to work. If I do manage to fix it, I can’t carry it forward to future installations trivially. Getting all my hardware to work on NixOS is as easy as:</p> 55<p>The entire system is configured via
56<code>/etc/nixos/configuration.nix</code>. Wifi, <code>libinput</code>
57gestures, audio, locale settings, there are options for literally
58everything. You can declaratively write down the packages you want
59installed too. With fresh installs of most distros, I usually fumble
60with getting things like screen backlight and media keys to work. If I
61do manage to fix it, I can’t carry it forward to future installations
62trivially. Getting all my hardware to work on NixOS is as easy as:</p>
50<pre><code>{ 63<pre><code>{
51 server.xserver.libinput.enable = true; # touchpad 64 server.xserver.libinput.enable = true; # touchpad
52 programs.light.enable = true; # backlight 65 programs.light.enable = true; # backlight
@@ -54,20 +67,53 @@
54 networking.wireless.enable = true; # wifi 67 networking.wireless.enable = true; # wifi
55}</code></pre> 68}</code></pre>
56<h3 id="developing-with-nix">Developing with Nix</h3> 69<h3 id="developing-with-nix">Developing with Nix</h3>
57<p>Nix makes it easy to enter environments that aren’t affected by your system configuration using <code>nix-shell</code>.</p> 70<p>Nix makes it easy to enter environments that aren’t affected by your
58<p>Builds may be generated by specifying a <code>default.nix</code> file, and running <code>nix-build</code>. Conventional package managers require you to specify a dependency list, but there is no guarantee that this list is complete. The package will build on your machine even if you forget a dependency. However, with Nix, packages are installed to <code>/nix/store</code>, and not global paths such as <code>/usr/bin/...</code>, if your project builds, it means you have included every last one.</p> 71system configuration using <code>nix-shell</code>.</p>
59<p>Issues on most my projects have been “unable to build because <code>libxcb</code> is missing”, or “this version of <code>openssl</code> is too old”. Tools like <code>cargo</code> and <code>pip</code> are poor package managers. While they <em>can</em> guarantee that Rust or Python dependencies are met, they make assumptions about the target system.</p> 72<p>Builds may be generated by specifying a <code>default.nix</code>
60<p>For example, <a href="https://github.com/nerdypepper/site">this website</a> is now built using Nix, anyone using Nix may simply, clone the repository and run <code>./generate.sh</code>, and it would <em>just work</em>, while keeping your global namespace clean™:</p> 73file, and running <code>nix-build</code>. Conventional package managers
61<div class="sourceCode" id="cb2"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="co">#! /usr/bin/env nix-shell</span></span> 74require you to specify a dependency list, but there is no guarantee that
75this list is complete. The package will build on your machine even if
76you forget a dependency. However, with Nix, packages are installed to
77<code>/nix/store</code>, and not global paths such as
78<code>/usr/bin/...</code>, if your project builds, it means you have
79included every last one.</p>
80<p>Issues on most my projects have been “unable to build because
81<code>libxcb</code> is missing”, or “this version of
82<code>openssl</code> is too old”. Tools like <code>cargo</code> and
83<code>pip</code> are poor package managers. While they <em>can</em>
84guarantee that Rust or Python dependencies are met, they make
85assumptions about the target system.</p>
86<p>For example, <a href="https://github.com/nerdypepper/site">this
87website</a> is now built using Nix, anyone using Nix may simply, clone
88the repository and run <code>./generate.sh</code>, and it would <em>just
89work</em>, while keeping your global namespace clean™:</p>
90<div class="sourceCode" id="cb2"><pre
91class="sourceCode bash"><code class="sourceCode bash"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="co">#! /usr/bin/env nix-shell</span></span>
62<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="co">#! nix-shell -i bash -p eva pandoc esh</span></span> 92<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="co">#! nix-shell -i bash -p eva pandoc esh</span></span>
63<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a></span> 93<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a></span>
64<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a><span class="co"># some bash magic ;)</span></span></code></pre></div> 94<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a><span class="co"># some bash magic ;)</span></span></code></pre></div>
65<p>Dependencies are included with the <code>-p</code> flag, the shell script is executed with an interpreter, specified with the <code>-i</code> flag.</p> 95<p>Dependencies are included with the <code>-p</code> flag, the shell
96script is executed with an interpreter, specified with the
97<code>-i</code> flag.</p>
66<h3 id="impressions">Impressions</h3> 98<h3 id="impressions">Impressions</h3>
67<p>NixOS is by no means, simple. As a newcomer, using Nix was not easy, heck, I had to learn a purely functional, lazy language to just build programs. There is a lot to be desired on the tooling front as well. A well fleshed out LSP plugin would be nice (<a href="https://github.com/nix-community/rnix-lsp">rnix-lsp looks promising</a>).</p> 99<p>NixOS is by no means, simple. As a newcomer, using Nix was not easy,
68<p>Being able to rollback changes at a system level is cool. Package broke something? Just <code>nixos-rebuild switch --rollback</code>! Deleted <code>nix</code> by mistake? Find the binary in <code>/nix/store</code> and rollback! You aren’t punished for not thinking twice.</p> 100heck, I had to learn a purely functional, lazy language to just build
69<p>I don’t see myself switching to anything else in the near future, NixOS does a lot of things right. If I ever need to reinstall NixOS, I can generate an <a href="https://github.com/nix-community/nixos-generators">image of my current system</a>.</p> 101programs. There is a lot to be desired on the tooling front as well. A
70<p><a href="https://u.peppe.rs/6m.png"><img src="https://u.peppe.rs/6m.png" /></a></p> 102well fleshed out LSP plugin would be nice (<a
103href="https://github.com/nix-community/rnix-lsp">rnix-lsp looks
104promising</a>).</p>
105<p>Being able to rollback changes at a system level is cool. Package
106broke something? Just <code>nixos-rebuild switch --rollback</code>!
107Deleted <code>nix</code> by mistake? Find the binary in
108<code>/nix/store</code> and rollback! You aren’t punished for not
109thinking twice.</p>
110<p>I don’t see myself switching to anything else in the near future,
111NixOS does a lot of things right. If I ever need to reinstall NixOS, I
112can generate an <a
113href="https://github.com/nix-community/nixos-generators">image of my
114current system</a>.</p>
115<p><a href="https://u.peppe.rs/6m.png"><img
116src="https://u.peppe.rs/6m.png" /></a></p>
71 117
72 </div> 118 </div>
73 119