diff --git a/content-org/blog.org b/content-org/blog.org
index 2bfc0ca..f386fda 100644
--- a/content-org/blog.org
+++ b/content-org/blog.org
@@ -5903,6 +5903,232 @@ I made my modification to the =base.tmpl= and rendered the blog. It was that sim
**** Conclusion
You can always clone the /theme repository/ and make your modifications to it. But maintenance becomes an issue. This seems to be a cleaner way for me to make modifications on the original /theme/ I'm using. This is how you can too.
+** Nix :@nix:
+*** DONE NixOS on encrypted ZFS :@nixos:zfs:encryption:
+:PROPERTIES:
+:EXPORT_HUGO_LASTMOD: 2021-10-17
+:EXPORT_DATE: 2021-10-17
+:EXPORT_FILE_NAME: nixos-on-encrypted-zfs
+:CUSTOM_ID: nixos-on-encrypted-zfs
+:END:
+
+I wouldn't call myself a distro hopper. The decision of distribution is solely
+based on requirements. I have requirements and I want the distribution to
+fulfill them as much as possible. After 15 years, I know what I want and I go
+and find it.
+
+In this case, an unexpected project caught my eye. The idea is so radically
+different that I wasn't actually searching for it this time. It is one of those
+times where it found me first.
+
+After looking into *Nix* and *NixOS*, I decided it is going to be my
+distribution of choice on the desktop. I will use that as my test bed before
+migrating all the serious work there. That's how I got my first taste of *NixOS*
+outside of the deterministic virtualization layer and into the wild.
+
+#+hugo: more
+
+**** Requirements
+Before installing any new system, I draftdown a list of requirements I would
+need this system to run. These are things that are very hard to change on the
+fly in the future without some serious work. Also, things that simply need to be
+there in this day and age.
+
+***** Filesystem
+I'm a big fan of ~zfs~. I've been running it on Linux, since the ~openzfs~
+project successfully ported it, with no issues. It's a solid choice for a
+filesystem and I don't see a reason not to choose it.
+
+Is it really a requirement ?
+
+Well, yes. By now, ~openzfs~ should be accessible to all distributions but my
+choice of distribution is not usually for the beginner user. I need to know
+it's supported and documented. I can figure out the rest from there.
+
+***** Encryption
+This is the first requirement, I always want encryption. The reason why I put it
+second in the list is that I needed to talk about ~zfs~ first.
+
+The ~zfs~ filesystem offers encryption. Unfortunately, my research have shown
+that ~zfs~ might not encrypt some metadata. This might not be a big deal but the
+choice of using Luks is there as well.
+
+With Luks, we can encrypt the whole drive. So let's do that; Luks with ~zfs~ on top.
+
+**** NixOS
+*NixOS* utilizes *Nix* to build you an OS from a configuration file. This
+configuration file is written in the ~nix~ language. It is very analogous to
+written an ~Ansible~ playbook but it builds an OS instead.
+
+The idea sounded appealing to me. A good friend of mine, [[https://setkeh.com/][setkeh]], gave me a quick and
+dirty overview, at first. That pushed me into doing more research of my own
+where I found out that I can spawn off a ~nix-shell~ with whatever dependencies
+I want without having them installed on my system. What a great concept for
+development or even running applications you don't really want to run. ~Java~
+stuff for example.
+
+Anyway, for all of these different reasons I have chosen *NixOS* to be the OS of
+choice to go on the desktop.
+
+**** Installation
+After testing [[https://nixos.org/][*NixOS*]] in a VM a few times, I got =setkeh= on a conference
+session and we dug into this.
+
+***** Filesystem partitioning
+For the filesystem, we're going to create two partitions. We need one, ~vfat~,
+for the boot and another, ~zfs~, for the rest of the filesystem.
+
+#+BEGIN_EXPORT html
+
+
Note
+#+END_EXPORT
+The assumption is that we're installing *NixOS* on an ~EFI~ enabled system.
+#+BEGIN_EXPORT html
+
+#+END_EXPORT
+
+We can start by creating the first partition of =1GB=.
+
+#+begin_src shell
+sgdisk -n3:1M:+1024M -t3:EF00 /dev/disk/by-id/VENDOR-ID
+#+end_src
+
+Followed by the rest of the filesystem.
+
+#+begin_src shell
+sgdisk -n1:0:0 -t1:BF01 /dev/disk/by-id/VENDOR-ID
+#+end_src
+
+#+BEGIN_EXPORT html
+
+
Note
+#+END_EXPORT
+It is usually easier to do the partitioning using =GParted=. Make sure that the
+partitions are unformatted, if you do so.
+#+BEGIN_EXPORT html
+
+#+END_EXPORT
+
+#+BEGIN_EXPORT html
+
+
Warning
+#+END_EXPORT
+Do *NOT* forget to enable the boot flag on the first partition or your system
+will not boot.
+#+BEGIN_EXPORT html
+
+#+END_EXPORT
+
+***** Filesystem formatting
+Now that we got our partitions creates, let's go ahead and format them properly.
+
+Starting with the ~boot~ partition first.
+
+#+begin_src shell
+mkfs.vfat /dev/disk/by-id/VENDOR-ID-part1
+#+end_src
+
+#+BEGIN_EXPORT html
+
+
Warning
+#+END_EXPORT
+At this sage, you're formatting a partition. Make sure you're pointing to the
+partition and not your whole disk as in the previous section.
+#+BEGIN_EXPORT html
+
+#+END_EXPORT
+
+Then our ~zfs~ partition, but we need to encrypt it first. So, we create the
+Luks partition.
+
+#+begin_src shell
+cryptsetup luksFormat /dev/disk/by-id/VENDOR-ID-part2
+#+end_src
+
+At this stage, stage we are done with the filesystem formatting and we need to
+create the ~zfs~ pool. To do so, we need to mount the encrypted ~root~
+filesystem; Luks.
+
+#+begin_src shell
+cryptsetup open --type luks /dev/disk/by-id/VENDOR-ID-part2 crypt
+#+end_src
+
+This mounts the filesystem in =/dev/mapper/crypt=. We'll use that to create the pool.
+
+#+begin_src shell
+zpool create -O mountpoint=none rpool /dev/mapper/crypt
+zfs create -o mountpoint=legacy rpool/root
+zfs create -o mountpoint=legacy rpool/root/nixos
+zfs create -o mountpoint=legacy rpool/home
+#+end_src
+
+***** Filesystem mounting
+After creating the filesystem, let's mount everything.
+
+#+begin_src shell
+# Mounting filesystem
+mount -t zfs rpool/root/nixos /mnt
+mkdir /mnt/home
+mkdir /mnt/boot
+# Mounting home directory
+mount -t zfs rpool/home /mnt/home
+# Mounting boot partition
+mount /dev/disk/by-id/VENDOR-ID-part1 /mnt/boot
+#+end_src
+
+***** Generating NixOS configuration
+At this stage, we need a =nix= configuration to build our system from. I didn't
+have any configuration to start from so I generated one.
+
+#+begin_src shell
+nixos-generate-config --root /mnt
+#+end_src
+
+***** NixOS configuration
+Due to the weird configuration we've had, we need to make a few adjustements to
+the suggested configuration layed out in the docs.
+
+The required configuration bits to be added to
+=/mnt/etc/nixos/configuration.nix= are:
+
+#+begin_src nix
+boot.supportedFilesystems = [ "zfs" ];
+# Make sure you set the networking.hostId option, which ZFS requires:
+networking.hostId = "";
+# See https://nixos.org/nixos/manual/options.html#opt-networking.hostId for more.
+
+# Use the GRUB 2 boot loader.
+boot.loader.grub = {
+ enable = true;
+ version =2;
+ device = "nodev";
+ efiSupport = true;
+ enableCryptodisk = true;
+};
+
+boot.initrd.luks.devices = {
+ root = {
+ device = "/dev/disk/by-uuid/VENDOR-UUID-part2"; ## Use blkid to find this UUID
+ # Required even if we're not using LVM
+ preLVM = true;
+ };
+};
+#+end_src
+
+***** NixOS installation
+If we're done with all of the configuration as described above, we should be
+able to build a bootable system. Let's try that out by installing *NixOS*.
+
+#+begin_src shell
+nixos-install
+#+end_src
+
+**** Conclusion
+It took a bit of trial and error, and a loooooooot of mounting over and over
+again. At the end, though, it wasn't as bad as I thought it would be. I'm still
+trying to get myself familiarised with *NixOS* and the new way of doing things.
+All in all, I would recommend trying *NixOS*, or the very least *Nix*.
+
** Revision Control :@revision_control:
*** DONE Git! First Steps... :git:
:PROPERTIES:
diff --git a/content/posts/nixos-on-encrypted-zfs.md b/content/posts/nixos-on-encrypted-zfs.md
new file mode 100644
index 0000000..374cc10
--- /dev/null
+++ b/content/posts/nixos-on-encrypted-zfs.md
@@ -0,0 +1,242 @@
++++
+title = "NixOS on encrypted ZFS"
+author = ["Elia el Lazkani"]
+date = 2021-10-17
+lastmod = 2021-10-17
+tags = ["zfs", "encryption"]
+categories = ["nix", "nixos"]
+draft = false
++++
+
+I wouldn't call myself a distro hopper. The decision of distribution is solely
+based on requirements. I have requirements and I want the distribution to
+fulfill them as much as possible. After 15 years, I know what I want and I go
+and find it.
+
+In this case, an unexpected project caught my eye. The idea is so radically
+different that I wasn't actually searching for it this time. It is one of those
+times where it found me first.
+
+After looking into **Nix** and **NixOS**, I decided it is going to be my
+distribution of choice on the desktop. I will use that as my test bed before
+migrating all the serious work there. That's how I got my first taste of **NixOS**
+outside of the deterministic virtualization layer and into the wild.
+
+
+
+
+## Requirements {#requirements}
+
+Before installing any new system, I draftdown a list of requirements I would
+need this system to run. These are things that are very hard to change on the
+fly in the future without some serious work. Also, things that simply need to be
+there in this day and age.
+
+
+### Filesystem {#filesystem}
+
+I'm a big fan of `zfs`. I've been running it on Linux, since the `openzfs`
+project successfully ported it, with no issues. It's a solid choice for a
+filesystem and I don't see a reason not to choose it.
+
+Is it really a requirement ?
+
+Well, yes. By now, `openzfs` should be accessible to all distributions but my
+choice of distribution is not usually for the beginner user. I need to know
+it's supported and documented. I can figure out the rest from there.
+
+
+### Encryption {#encryption}
+
+This is the first requirement, I always want encryption. The reason why I put it
+second in the list is that I needed to talk about `zfs` first.
+
+The `zfs` filesystem offers encryption. Unfortunately, my research have shown
+that `zfs` might not encrypt some metadata. This might not be a big deal but the
+choice of using Luks is there as well.
+
+With Luks, we can encrypt the whole drive. So let's do that; Luks with `zfs` on top.
+
+
+## NixOS {#nixos}
+
+**NixOS** utilizes **Nix** to build you an OS from a configuration file. This
+configuration file is written in the `nix` language. It is very analogous to
+written an `Ansible` playbook but it builds an OS instead.
+
+The idea sounded appealing to me. A good friend of mine, [setkeh](https://setkeh.com/), gave me a quick and
+dirty overview, at first. That pushed me into doing more research of my own
+where I found out that I can spawn off a `nix-shell` with whatever dependencies
+I want without having them installed on my system. What a great concept for
+development or even running applications you don't really want to run. `Java`
+stuff for example.
+
+Anyway, for all of these different reasons I have chosen **NixOS** to be the OS of
+choice to go on the desktop.
+
+
+## Installation {#installation}
+
+After testing [**NixOS**](https://nixos.org/) in a VM a few times, I got `setkeh` on a conference
+session and we dug into this.
+
+
+### Filesystem partitioning {#filesystem-partitioning}
+
+For the filesystem, we're going to create two partitions. We need one, `vfat`,
+for the boot and another, `zfs`, for the rest of the filesystem.
+
+
+
Note
+
+The assumption is that we're installing **NixOS** on an `EFI` enabled system.
+
+
+
+We can start by creating the first partition of `1GB`.
+
+```shell
+sgdisk -n3:1M:+1024M -t3:EF00 /dev/disk/by-id/VENDOR-ID
+```
+
+Followed by the rest of the filesystem.
+
+```shell
+sgdisk -n1:0:0 -t1:BF01 /dev/disk/by-id/VENDOR-ID
+```
+
+
+
Note
+
+It is usually easier to do the partitioning using `GParted`. Make sure that the
+partitions are unformatted, if you do so.
+
+
+
+
+
Warning
+
+Do **NOT** forget to enable the boot flag on the first partition or your system
+will not boot.
+
+
+
+
+### Filesystem formatting {#filesystem-formatting}
+
+Now that we got our partitions creates, let's go ahead and format them properly.
+
+Starting with the `boot` partition first.
+
+```shell
+mkfs.vfat /dev/disk/by-id/VENDOR-ID-part1
+```
+
+
+
Warning
+
+At this sage, you're formatting a partition. Make sure you're pointing to the
+partition and not your whole disk as in the previous section.
+
+
+
+Then our `zfs` partition, but we need to encrypt it first. So, we create the
+Luks partition.
+
+```shell
+cryptsetup luksFormat /dev/disk/by-id/VENDOR-ID-part2
+```
+
+At this stage, stage we are done with the filesystem formatting and we need to
+create the `zfs` pool. To do so, we need to mount the encrypted `root`
+filesystem; Luks.
+
+```shell
+cryptsetup open --type luks /dev/disk/by-id/VENDOR-ID-part2 crypt
+```
+
+This mounts the filesystem in `/dev/mapper/crypt`. We'll use that to create the pool.
+
+```shell
+zpool create -O mountpoint=none rpool /dev/mapper/crypt
+zfs create -o mountpoint=legacy rpool/root
+zfs create -o mountpoint=legacy rpool/root/nixos
+zfs create -o mountpoint=legacy rpool/home
+```
+
+
+### Filesystem mounting {#filesystem-mounting}
+
+After creating the filesystem, let's mount everything.
+
+```shell
+# Mounting filesystem
+mount -t zfs rpool/root/nixos /mnt
+mkdir /mnt/home
+mkdir /mnt/boot
+# Mounting home directory
+mount -t zfs rpool/home /mnt/home
+# Mounting boot partition
+mount /dev/disk/by-id/VENDOR-ID-part1 /mnt/boot
+```
+
+
+### Generating NixOS configuration {#generating-nixos-configuration}
+
+At this stage, we need a `nix` configuration to build our system from. I didn't
+have any configuration to start from so I generated one.
+
+```shell
+nixos-generate-config --root /mnt
+```
+
+
+### NixOS configuration {#nixos-configuration}
+
+Due to the weird configuration we've had, we need to make a few adjustements to
+the suggested configuration layed out in the docs.
+
+The required configuration bits to be added to
+`/mnt/etc/nixos/configuration.nix` are:
+
+```nix
+boot.supportedFilesystems = [ "zfs" ];
+# Make sure you set the networking.hostId option, which ZFS requires:
+networking.hostId = "";
+# See https://nixos.org/nixos/manual/options.html#opt-networking.hostId for more.
+
+# Use the GRUB 2 boot loader.
+boot.loader.grub = {
+ enable = true;
+ version =2;
+ device = "nodev";
+ efiSupport = true;
+ enableCryptodisk = true;
+};
+
+boot.initrd.luks.devices = {
+ root = {
+ device = "/dev/disk/by-uuid/VENDOR-UUID-part2"; ## Use blkid to find this UUID
+ # Required even if we're not using LVM
+ preLVM = true;
+ };
+};
+```
+
+
+### NixOS installation {#nixos-installation}
+
+If we're done with all of the configuration as described above, we should be
+able to build a bootable system. Let's try that out by installing **NixOS**.
+
+```shell
+nixos-install
+```
+
+
+## Conclusion {#conclusion}
+
+It took a bit of trial and error, and a loooooooot of mounting over and over
+again. At the end, though, it wasn't as bad as I thought it would be. I'm still
+trying to get myself familiarised with **NixOS** and the new way of doing things.
+All in all, I would recommend trying **NixOS**, or the very least **Nix**.