<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Disko on Haseeb Majid</title>
    <link>https://haseebmajid.dev/tags/disko/</link>
    <description>Recent content in Disko on Haseeb Majid</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Tue, 30 Jul 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://haseebmajid.dev/tags/disko/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>How I Set up BTRFS and LUKS on NixOS Using Disko</title>
      <link>https://haseebmajid.dev/posts/2024-07-30-how-i-setup-btrfs-and-luks-on-nixos-using-disko/</link>
      <pubDate>Tue, 30 Jul 2024 00:00:00 +0000</pubDate>
      <author>Me</author>
      <guid>https://haseebmajid.dev/posts/2024-07-30-how-i-setup-btrfs-and-luks-on-nixos-using-disko/</guid>
      <description>&lt;p&gt;In this post, I will show you how you can declaratively partition our drives using Nix(OS).&lt;/p&gt;
&lt;details
  class=&#34;notice info&#34;
  open=&#34;true&#34;
&gt;
    &lt;summary class=&#34;notice-title&#34;&gt;TL;DR;&lt;/summary&gt;
  
  We can use a tool called disko to partition our drives declaratively and combine it with NixOS anywhere for a remote
install. Showing an example setting up LUKS encryption with BTRFS file system.
&lt;/details&gt;

&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re like me, then when you started playing with NixOS, You found yourself constantly reinstalling it and
starting again. Either setting up new machines. Playing around with it in a VM or even realising how to set up LUKS and
hibernate properly. Or even when setting up impermanence.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In this post, I will show you how you can declaratively partition our drives using Nix(OS).</p>
<details
  class="notice info"
  open="true"
>
    <summary class="notice-title">TL;DR;</summary>
  
  We can use a tool called disko to partition our drives declaratively and combine it with NixOS anywhere for a remote
install. Showing an example setting up LUKS encryption with BTRFS file system.
</details>

<h2 id="background">Background</h2>
<p>If you&rsquo;re like me, then when you started playing with NixOS, You found yourself constantly reinstalling it and
starting again. Either setting up new machines. Playing around with it in a VM or even realising how to set up LUKS and
hibernate properly. Or even when setting up impermanence.</p>
<p>Every time I ended using the GUI to reinstall, which was a bit tedious. Then I discovered disko.</p>
<h2 id="disko">Disko</h2>
<p><a href="https://github.com/nix-community/disko">Disko</a> is a fantastic tool. Which allows us to
declaratively declare how to partition our disk(s), in nix configuration.</p>
<h3 id="why">Why</h3>
<p>The great about moving our partition state into code means it far easier to fully automate our installation or setup new
machines with the same partitions.</p>
<p>Previously, I would have to update the hardware-configuration. Nix file manually to change the ID of the drives.
As these UUIDs are unique to each install.</p>
<p>I&rsquo;ll be honest, this has become much less of an issue since my config is very much now stable. But the completion
in me is a lot happier, one I&rsquo;ve automated one step further from setting up a new machine or reinstall the same one.</p>
<h2 id="my-setup">My Setup</h2>
<p>So my setup creates a BTRFS file system and LUKS encryption.</p>
<p>I set up BTRFS, so I can have impermanence, which can be allowed to remove files that we don&rsquo;t have in our persistence
storage. To complete this, I create a persistent sub-volume (think folder). We also want LUKS so until we enter our password or
a secret, our drive(s) will be encrypted. So no one can access our files.</p>
<h3 id="disko-1">Disko</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nix" data-lang="nix"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">disko</span><span class="o">.</span><span class="n">devices</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">disk</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">nvme0n1</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">type</span> <span class="o">=</span> <span class="s2">&#34;disk&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">device</span> <span class="o">=</span> <span class="s2">&#34;/dev/nvme0n1&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">content</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="n">type</span> <span class="o">=</span> <span class="s2">&#34;gpt&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">          <span class="n">partitions</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="n">ESP</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">              <span class="n">label</span> <span class="o">=</span> <span class="s2">&#34;boot&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">              <span class="n">name</span> <span class="o">=</span> <span class="s2">&#34;ESP&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">              <span class="n">size</span> <span class="o">=</span> <span class="s2">&#34;512M&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">              <span class="n">type</span> <span class="o">=</span> <span class="s2">&#34;EF00&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">              <span class="n">content</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="n">type</span> <span class="o">=</span> <span class="s2">&#34;filesystem&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="n">format</span> <span class="o">=</span> <span class="s2">&#34;vfat&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="n">mountpoint</span> <span class="o">=</span> <span class="s2">&#34;/boot&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="n">mountOptions</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">                  <span class="s2">&#34;defaults&#34;</span>
</span></span><span class="line"><span class="cl">                <span class="p">];</span>
</span></span><span class="line"><span class="cl">              <span class="p">};</span>
</span></span><span class="line"><span class="cl">            <span class="p">};</span>
</span></span><span class="line"><span class="cl">            <span class="n">luks</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">              <span class="n">size</span> <span class="o">=</span> <span class="s2">&#34;100%&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">              <span class="n">label</span> <span class="o">=</span> <span class="s2">&#34;luks&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">              <span class="n">content</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="n">type</span> <span class="o">=</span> <span class="s2">&#34;luks&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="n">name</span> <span class="o">=</span> <span class="s2">&#34;cryptroot&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="n">extraOpenArgs</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">                  <span class="s2">&#34;--allow-discards&#34;</span>
</span></span><span class="line"><span class="cl">                  <span class="s2">&#34;--perf-no_read_workqueue&#34;</span>
</span></span><span class="line"><span class="cl">                  <span class="s2">&#34;--perf-no_write_workqueue&#34;</span>
</span></span><span class="line"><span class="cl">                <span class="p">];</span>
</span></span><span class="line"><span class="cl">                <span class="c1"># https://0pointer.net/blog/unlocking-luks2-volumes-with-tpm2-fido2-pkcs11-security-hardware-on-systemd-248.html</span>
</span></span><span class="line"><span class="cl">                <span class="n">settings</span> <span class="o">=</span> <span class="p">{</span><span class="n">crypttabExtraOpts</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;fido2-device=auto&#34;</span> <span class="s2">&#34;token-timeout=10&#34;</span><span class="p">];};</span>
</span></span><span class="line"><span class="cl">                <span class="n">content</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                  <span class="n">type</span> <span class="o">=</span> <span class="s2">&#34;btrfs&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                  <span class="n">extraArgs</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;-L&#34;</span> <span class="s2">&#34;nixos&#34;</span> <span class="s2">&#34;-f&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">                  <span class="n">subvolumes</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="s2">&#34;/root&#34;</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                      <span class="n">mountpoint</span> <span class="o">=</span> <span class="s2">&#34;/&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                      <span class="n">mountOptions</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;subvol=root&#34;</span> <span class="s2">&#34;compress=zstd&#34;</span> <span class="s2">&#34;noatime&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">                    <span class="p">};</span>
</span></span><span class="line"><span class="cl">                    <span class="s2">&#34;/home&#34;</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                      <span class="n">mountpoint</span> <span class="o">=</span> <span class="s2">&#34;/home&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                      <span class="n">mountOptions</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;subvol=home&#34;</span> <span class="s2">&#34;compress=zstd&#34;</span> <span class="s2">&#34;noatime&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">                    <span class="p">};</span>
</span></span><span class="line"><span class="cl">                    <span class="s2">&#34;/nix&#34;</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                      <span class="n">mountpoint</span> <span class="o">=</span> <span class="s2">&#34;/nix&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                      <span class="n">mountOptions</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;subvol=nix&#34;</span> <span class="s2">&#34;compress=zstd&#34;</span> <span class="s2">&#34;noatime&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">                    <span class="p">};</span>
</span></span><span class="line"><span class="cl">                    <span class="s2">&#34;/persist&#34;</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                      <span class="n">mountpoint</span> <span class="o">=</span> <span class="s2">&#34;/persist&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                      <span class="n">mountOptions</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;subvol=persist&#34;</span> <span class="s2">&#34;compress=zstd&#34;</span> <span class="s2">&#34;noatime&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">                    <span class="p">};</span>
</span></span><span class="line"><span class="cl">                    <span class="s2">&#34;/log&#34;</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                      <span class="n">mountpoint</span> <span class="o">=</span> <span class="s2">&#34;/var/log&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                      <span class="n">mountOptions</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;subvol=log&#34;</span> <span class="s2">&#34;compress=zstd&#34;</span> <span class="s2">&#34;noatime&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">                    <span class="p">};</span>
</span></span><span class="line"><span class="cl">                    <span class="s2">&#34;/swap&#34;</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                      <span class="n">mountpoint</span> <span class="o">=</span> <span class="s2">&#34;/swap&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                      <span class="n">swap</span><span class="o">.</span><span class="n">swapfile</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="s2">&#34;64G&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="p">};</span>
</span></span><span class="line"><span class="cl">                  <span class="p">};</span>
</span></span><span class="line"><span class="cl">                <span class="p">};</span>
</span></span><span class="line"><span class="cl">              <span class="p">};</span>
</span></span><span class="line"><span class="cl">            <span class="p">};</span>
</span></span><span class="line"><span class="cl">          <span class="p">};</span>
</span></span><span class="line"><span class="cl">        <span class="p">};</span>
</span></span><span class="line"><span class="cl">      <span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="p">};</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">fileSystems</span><span class="o">.</span><span class="s2">&#34;/persist&#34;</span><span class="o">.</span><span class="n">neededForBoot</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">fileSystems</span><span class="o">.</span><span class="s2">&#34;/var/log&#34;</span><span class="o">.</span><span class="n">neededForBoot</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Let&rsquo;s break this file down:</p>
<p>Firstly, we only have one drive which we called nvme0n1, which is a 2TB NVMe drive in my pc.
You can find examples on the Disko repo how to partition multiple drives and even how to have in a raid(0) configuration.
For this post, we will keep it simple for now. We need to point it to where our drive exists <code>device = &quot;/dev/nvme0n1&quot;;</code>.</p>
<p>Then we create a boot partition of 512M.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">❯ eza -al /dev/nvme0n1
</span></span><span class="line"><span class="cl">brw-rw---- 259,0 root <span class="m">17</span> Jul 04:52 /dev/nvme0n1
</span></span></code></pre></div><p>Next, we define the LUKS drive, which encrypts everything else, including our swap &ldquo;drive&rdquo;.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nix" data-lang="nix"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">luks</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">size</span> <span class="o">=</span> <span class="s2">&#34;100%&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">label</span> <span class="o">=</span> <span class="s2">&#34;luks&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">content</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">type</span> <span class="o">=</span> <span class="s2">&#34;luks&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">name</span> <span class="o">=</span> <span class="s2">&#34;cryptroot&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">extraOpenArgs</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">          <span class="s2">&#34;--allow-discards&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="s2">&#34;--perf-no_read_workqueue&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="s2">&#34;--perf-no_write_workqueue&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">];</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="c1"># https://0pointer.net/blog/unlocking-luks2-volumes-with-tpm2-fido2-pkcs11-security-hardware-on-systemd-248.html</span>
</span></span><span class="line"><span class="cl">      <span class="n">settings</span> <span class="o">=</span> <span class="p">{</span><span class="n">crypttabExtraOpts</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;fido2-device=auto&#34;</span> <span class="s2">&#34;token-timeout=10&#34;</span><span class="p">];};</span>
</span></span><span class="line"><span class="cl">    <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>We will call this drive <code>cryptroot</code>, when setup we can find it at <code>/dev/mapper</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">/dev/mapper🔒
</span></span><span class="line"><span class="cl">❯ eza -al /dev/mapper
</span></span><span class="line"><span class="cl">crw------- 10,236 root <span class="m">17</span> Jul 04:52 control
</span></span><span class="line"><span class="cl">lrwxrwxrwx      - root <span class="m">17</span> Jul 04:52 cryptroot -&gt; ../dm-0
</span></span></code></pre></div><p>Then in the settings, we add support to allow us to decrypt using Fido, i.e. our YubiKey if we can to set it up
<code>settings = {crypttabExtraOpts = [&quot;fido2-device=auto&quot; &quot;token-timeout=10&quot;];};</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nix" data-lang="nix"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">content</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">type</span> <span class="o">=</span> <span class="s2">&#34;btrfs&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">extraArgs</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;-L&#34;</span> <span class="s2">&#34;nixos&#34;</span> <span class="s2">&#34;-f&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">      <span class="n">subvolumes</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;/root&#34;</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="n">mountpoint</span> <span class="o">=</span> <span class="s2">&#34;/&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">          <span class="n">mountOptions</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;subvol=root&#34;</span> <span class="s2">&#34;compress=zstd&#34;</span> <span class="s2">&#34;noatime&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">        <span class="p">};</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;/home&#34;</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="n">mountpoint</span> <span class="o">=</span> <span class="s2">&#34;/home&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">          <span class="n">mountOptions</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;subvol=home&#34;</span> <span class="s2">&#34;compress=zstd&#34;</span> <span class="s2">&#34;noatime&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">        <span class="p">};</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;/nix&#34;</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="n">mountpoint</span> <span class="o">=</span> <span class="s2">&#34;/nix&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">          <span class="n">mountOptions</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;subvol=nix&#34;</span> <span class="s2">&#34;compress=zstd&#34;</span> <span class="s2">&#34;noatime&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">        <span class="p">};</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;/persist&#34;</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="n">mountpoint</span> <span class="o">=</span> <span class="s2">&#34;/persist&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">          <span class="n">mountOptions</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;subvol=persist&#34;</span> <span class="s2">&#34;compress=zstd&#34;</span> <span class="s2">&#34;noatime&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">        <span class="p">};</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;/log&#34;</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="n">mountpoint</span> <span class="o">=</span> <span class="s2">&#34;/var/log&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">          <span class="n">mountOptions</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;subvol=log&#34;</span> <span class="s2">&#34;compress=zstd&#34;</span> <span class="s2">&#34;noatime&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">        <span class="p">};</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;/swap&#34;</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="n">mountpoint</span> <span class="o">=</span> <span class="s2">&#34;/swap&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">          <span class="n">swap</span><span class="o">.</span><span class="n">swapfile</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="s2">&#34;64G&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">};</span>
</span></span><span class="line"><span class="cl">      <span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1"># ...</span>
</span></span><span class="line"><span class="cl">  <span class="n">fileSystems</span><span class="o">.</span><span class="s2">&#34;/persist&#34;</span><span class="o">.</span><span class="n">neededForBoot</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">fileSystems</span><span class="o">.</span><span class="s2">&#34;/var/log&#34;</span><span class="o">.</span><span class="n">neededForBoot</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Then the final part defines the different sub-volumes we want. Which we can just think of as folders on our system.
We label this partition as <code>nixos</code> as well, so we can refer to it via this label (hence the <code>-L</code> flag passed to it).</p>
<pre tabindex="0"><code>type = &#34;btrfs&#34;;
extraArgs = [&#34;-L&#34; &#34;nixos&#34; &#34;-f&#34;];
</code></pre><p>We also want to create a BTRFS file system on our main partition here, simply so that we can revert to a blank state
and copy files over from our persist sub-volume. So we can do, impermanence.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">❯ df -h
</span></span><span class="line"><span class="cl">Filesystem      Size  Used Avail Use% Mounted on
</span></span><span class="line"><span class="cl">/dev/dm-0       1.9T  846G 1006G  46% /
</span></span><span class="line"><span class="cl">/dev/dm-0       1.9T  846G 1006G  46% /nix
</span></span><span class="line"><span class="cl">/dev/dm-0       1.9T  846G 1006G  46% /persist
</span></span><span class="line"><span class="cl">/dev/dm-0       1.9T  846G 1006G  46% /var/log
</span></span><span class="line"><span class="cl">tmpfs           7.7G   15M  7.7G   1% /run
</span></span><span class="line"><span class="cl">devtmpfs        1.6G     <span class="m">0</span>  1.6G   0% /dev
</span></span><span class="line"><span class="cl">tmpfs            16G   23M   16G   1% /dev/shm
</span></span><span class="line"><span class="cl">tmpfs            16G  1.3M   16G   1% /run/wrappers
</span></span><span class="line"><span class="cl">efivarfs        148K   93K   51K  65% /sys/firmware/efi/efivars
</span></span><span class="line"><span class="cl">/dev/dm-0       1.9T  846G 1006G  46% /home
</span></span><span class="line"><span class="cl">/dev/dm-0       1.9T  846G 1006G  46% /swap
</span></span><span class="line"><span class="cl">/dev/nvme0n1p1  511M  236M  276M  47% /boot
</span></span></code></pre></div><p>If we call this file <code>disks.nix</code> we can refer to it in our main configuration like so. Similar to how we refer to
hardware-configuration.nix.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nix" data-lang="nix"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">pkgs</span><span class="o">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">lib</span><span class="o">,</span>
</span></span><span class="line"><span class="cl">  <span class="o">...</span>
</span></span><span class="line"><span class="cl"><span class="p">}:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">imports</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="sr">./hardware-configuration.nix</span>
</span></span><span class="line"><span class="cl">    <span class="sr">./disks.nix</span>
</span></span><span class="line"><span class="cl">  <span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="hibernate">Hibernate</h2>
<p>To enable your PC to hibernate using your swap, you can add the following boot configuration.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nix" data-lang="nix"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">boot</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">kernelParams</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">      <span class="s2">&#34;resume_offset=533760&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="n">resumeDevice</span> <span class="o">=</span> <span class="s2">&#34;/dev/disk/by-label/nixos&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>We need to add an offset because the swap is part of our main partition, rather than being its own partition.
Which is how I used to set it up. But I believe if you are also using a 2TB drive, you will have the same offset.</p>
<p>To figure out the exact off set, you can follow the
<a href="https://wiki.archlinux.org/title/Power_management/Suspend_and_hibernate#Acquire_swap_file_offset">Arch wiki here</a>.</p>
<h2 id="fido2">Fido2</h2>
<p>If you want to decrypt your LUKS drive with a YubiKey, you can do something like:
<code>sudo -E -s systemd-cryptenroll --fido2-device=auto  /dev/nvme0n1p2</code>. Then you need to press the button on your YubiKey
to register. Then during LUKS decryption you can use your YubiKey. However, I think from memory this can cause
decryption to be a bit slower as it waits for the YubiKey.</p>
<p>You can read more about it <a href="https://wiki.archlinux.org/title/Systemd-cryptenroll">here</a>.</p>
<h2 id="appendix">Appendix</h2>
<ul>
<li><a href="https://gitlab.com/hmajid2301/dotfiles/-/blob/73a83021c0747aaeb6d104b3b729513b2ab02d4d/systems/x86_64-linux/workstation/disks.nix">My config for my main machine</a></li>
</ul>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
