From fb87addb262ccb6aa4b301a374f829aca56f2917 Mon Sep 17 00:00:00 2001 From: Christine Dodrill Date: Sat, 25 Apr 2020 16:13:41 -0400 Subject: [PATCH] Blog/why i use linux desktop (#138) * bump deps * add nixos desktop flow post --- blog/nixos-desktop-flow-2020-04-25.markdown | 533 ++++++++++++++++++++ nix/deps.nix | 4 +- static/blog/nix-package.png | Bin 0 -> 18135 bytes 3 files changed, 535 insertions(+), 2 deletions(-) create mode 100644 blog/nixos-desktop-flow-2020-04-25.markdown create mode 100644 static/blog/nix-package.png diff --git a/blog/nixos-desktop-flow-2020-04-25.markdown b/blog/nixos-desktop-flow-2020-04-25.markdown new file mode 100644 index 0000000..52a01c0 --- /dev/null +++ b/blog/nixos-desktop-flow-2020-04-25.markdown @@ -0,0 +1,533 @@ +--- +title: "My NixOS Desktop Flow" +date: 2020-04-25 +series: howto +--- + +# My NixOS Desktop Flow + +Before I built my current desktop, I had been using a [2013 Mac Pro][macpro2013] +for at least 7 years. This machine has seen me through living in a few cities +(Bellevue, Mountain View and Montreal), but it was starting to show its age. Its +12 core Xeon is really no slouch (scoring about 5 minutes in my "compile the +linux kernel" test), but with Intel security patches it was starting to get +slower and slower as time went on. + +[macpro2013]: https://www.apple.com/mac-pro-2013/specs/ + +So in March (just before the situation started) I ordered the parts for my new +tower and built my current desktop machine. From the start, I wanted it to run +Linux and have 64 GB of ram, mostly so I could write and test programs without +having to worry about ram exhaustion. + +When the parts were almost in, I had decided to really start digging into +[NixOS][nixos]. Friends on IRC and Discord had been trying to get me to use it +for years, and I was really impressed with a simple setup that I had in a +virtual machine. So I decided to jump head-first down that rabbit hole, and I'm +honestly really glad I did. + +[nixos]: https://nixos.org + +NixOS is built on a more functional approach to package management called +[Nix][nix]. Parts of the configuration can be easily broken off into modules +that can be reused across machines in a deployment. If [Ansible][ansible] or +other tools like it let you customize an existing Linux distribution to meet +your needs, NixOS allows you to craft your own Linux distribution around your +needs. + +[nix]: https://nixos.org/nix/ +[ansible]: https://www.ansible.com/ + +Unfortunately, the Nix and NixOS documentation is a bit more dense than most +other Linux programs/distributions are, and it's a bit easy to get lost in it. +I'm going to attempt to explain a lot of the guiding principles behind Nix and +NixOS and how they fit into how I use NixOS on my desktop. + +## What is a Package? + +Earlier, I mentioned that Nix is a _functional_ package manager. This means that +Nix views packages as a combination of inputs to get an output: + +
![A nix package is the metadata, the source code, the build instructions and +some patches as input to a derivation to create a +package](/static/blog/nix-package.png)
+ +This is how most package managers work (even things like Windows installer +files), but Nix goes a step further by disallowing package builds to access the +internet. This allows Nix packages to be a lot more reproducible; meaning if you +have the same inputs (source code, build script and patches) you should _always_ +get the same output byte-for-byte every time you build the same package at the +same version. + +### A Simple Package + +Let's consider a simple example, my [gruvbox-inspired CSS file][gruvboxcss]'s +[`default.nix`][gcssdefaultnix] file': + +[gruvboxcss]: https://github.com/Xe/gruvbox-css +[gcssdefaultnix]: https://github.com/Xe/gruvbox-css/blob/master/default.nix + +```nix +{ pkgs ? import { } }: + +pkgs.stdenv.mkDerivation { + pname = "gruvbox-css"; + version = "latest"; + src = ./.; + phases = "installPhase"; + installPhase = '' + mkdir -p $out + cp -rf $src/gruvbox.css $out/gruvbox.css + ''; +} +``` + +This creates a package named `gruvbox-css` with the version `latest`. Let's +break this down its `default.nix` line by line: + +```nix +{ pkgs ? import { } }: +``` + +This creates a function that either takes in the `pkgs` object or tells Nix to +import the standard package library [nixpkgs][nixpkgs] as `pkgs`. nixpkgs +includes a lot of utilities like a standard packaging environment, special +builders for things like snaps and Docker images as well as one of the largest +package sets out there. + +[nixpkgs]: https://nixos.org/nixpkgs/ + +```nix +pkgs.stdenv.mkDerivation { + # ... +} +``` + +This runs the [`stdenv.mkDerivation`][mkderiv] function with some arguments in an +object. The "standard environment" comes with tools like GCC, bash, coreutils, +find, sed, grep, awk, tar, make, patch and all of the major compression tools. +This means that our package builds can build C/C++ programs, copy files to the +output, and extract downloaded source files by default. You can add other inputs +to this environment if you need to, but for now it works as-is. + +[mkderiv]: https://nixos.org/nixpkgs/manual/#sec-using-stdenv + +Let's specify the name and version of this package: + +```nix +pname = "gruvbox-css"; +version = "latest"; +``` + +`pname` stands for "package name". It is combined with the version to create the +resulting package name. In this case it would be `gruvbox-css-latest`. + +Let's tell Nix how to build this package: + +```nix +src = ./.; +phases = "installPhase"; +installPhase = '' + mkdir -p $out + cp -rf $src/gruvbox.css $out/gruvbox.css +''; +``` + +The `src` attribute tells Nix where the source code of the package is stored. +Sometimes this can be a URL to a compressed archive on the internet, sometimes +it can be a git repo, but for now it's the current working directory `./.`. + +This is a CSS file, it doesn't make sense to have to build these, so we skip the +build phase and tell Nix to directly install the package to its output folder: + +```shell +mkdir -p $out +cp -rf $src/gruvbox.css $out/gruvbox.css +``` + +This two-liner shell script creates the output directory (usually exposed as +`$out`) and then copies `gruvbox.css` into it. When we run this through Nix +with`nix-build`, we get output that looks something like this: + +```console +$ nix-build ./default.nix +these derivations will be built: + /nix/store/c99n4ixraigf4jb0jfjxbkzicd79scpj-gruvbox-css.drv +building '/nix/store/c99n4ixraigf4jb0jfjxbkzicd79scpj-gruvbox-css.drv'... +installing +/nix/store/ng5qnhwyrk9zaidjv00arhx787r0412s-gruvbox-css +``` + +And `/nix/store/ng5qnhwyrk9zaidjv00arhx787r0412s-gruvbox-css` is the output +package. Looking at its contents with `ls`, we see this: + +```console +$ ls /nix/store/ng5qnhwyrk9zaidjv00arhx787r0412s-gruvbox-css +gruvbox.css +``` + +### A More Complicated Package + +For a more complicated package, let's look at the [build directions of the +website you are reading right now][sitedefaultnix]: + +[sitedefaultnix]: https://github.com/Xe/site/blob/master/site.nix + +```nix +{ pkgs ? import (import ./nix/sources.nix).nixpkgs }: +with pkgs; + +assert lib.versionAtLeast go.version "1.13"; + +buildGoPackage rec { + pname = "christinewebsite"; + version = "latest"; + + goPackagePath = "christine.website"; + src = ./.; + goDeps = ./nix/deps.nix; + allowGoReference = false; + + preBuild = '' + export CGO_ENABLED=0 + buildFlagsArray+=(-pkgdir "$TMPDIR") + ''; + + postInstall = '' + cp -rf $src/blog $bin/blog + cp -rf $src/css $bin/css + cp -rf $src/gallery $bin/gallery + cp -rf $src/signalboost.dhall $bin/signalboost.dhall + cp -rf $src/static $bin/static + cp -rf $src/talks $bin/talks + cp -rf $src/templates $bin/templates + ''; +} +``` + +Breaking it down, we see some similarities to the gruvbox-css package from +above, but there's a few more interesting lines I want to point out: + +```nix +{ pkgs ? import (import ./nix/sources.nix).nixpkgs }: +``` + +My website uses a pinned or fixed version of nixpkgs. This allows my website's +deployment to be stable even if nixpkgs changes something that could cause it to +break. + +```nix +with pkgs; +``` + +[With expressions][nixwith] are one of the more interesting parts of Nix. +Essentially, they let you say "everything in this object should be put into +scope". So if you have an expression that does this: + +[nixwith]: https://nixos.org/nix/manual/#idm140737321975440 + +```nix +let + foo = { + ponies = "awesome"; + }; +in with foo; "ponies are ${ponies}!" +``` + +You get the result `"ponies are awesome!"`. I use `with pkgs` here to use things +directly from nixpkgs without having to say `pkgs.` in front of a lot of things. + +```nix +assert lib.versionAtLeast go.version "1.13"; +``` + +This line will make the build fail if Nix is using any Go version less than +1.13. I'm pretty sure my website's code could function on older versions of Go, +but the runtime improvements are important to it, so let's fail loudly just in +case. + +```nix +buildGoPackage { + # ... +} +``` + +[`buildGoPackage`](https://nixos.org/nixpkgs/manual/#ssec-go-legacy) builds a Go +package into a Nix package. It takes in the [Go package path][gopkgpath], list +of dependencies and if the resulting package is allowed to depend on the Go +compiler or not. + +[gopkgpath]: https://github.com/golang/go/wiki/GOPATH#directory-layout + +It will then compile the Go program (and all of its dependencies) into a binary +and put that in the resulting package. This website is more than just the source +code, it's also got assets like CSS files and the image earlier in the post. +Those files are copied in the `postInstall` phase: + +```nix +postInstall = '' + cp -rf $src/blog $bin/blog + cp -rf $src/css $bin/css + cp -rf $src/gallery $bin/gallery + cp -rf $src/signalboost.dhall $bin/signalboost.dhall + cp -rf $src/static $bin/static + cp -rf $src/talks $bin/talks + cp -rf $src/templates $bin/templates +''; +``` + +This results in all of the files that my website needs to run existing in the +right places. + +### Other Packages + +For more kinds of packages that you can build, see the [Languages and +Frameworks][nixpkgslangsframeworks] chapter of the nixpkgs documentation. + +[nixpkgslangsframeworks]: https://nixos.org/nixpkgs/manual/#chap-language-support + +If your favorite language isn't shown there, you can make your own build script +and do it more manually. See [here][nixpillscustombuilder] for more information +on how to do that. + +[nixpillscustombuilder]: https://nixos.org/nixos/nix-pills/working-derivation.html#idm140737320334640 + +## `nix-env` And Friends + +Building your own packages is nice and all, but what about using packages +defined in nixpkgs? Nix includes a few tools that help you find, install, +upgrade and remove packages as well as `nix-build` to build new ones. + +### `nix search` + +When looking for a package to install, use `$ nix search name` to see if it's +already packaged. For example, let's look for [graphviz][graphviz], a popular +diagramming software: + +[graphviz]: https://graphviz.org/ + +```console +$ nix search graphviz + +* nixos.graphviz (graphviz) + Graph visualization tools + +* nixos.graphviz-nox (graphviz) + Graph visualization tools + +* nixos.graphviz_2_32 (graphviz) + Graph visualization tools +``` + +There are several results here! These are different because sometimes you may +want some features of graphviz, but not all of them. For example, a server +installation of graphviz wouldn't need X windows support. + +The first line of the output is the attribute. This is the attribute that the +package is imported to inside nixpkgs. This allows multiple packages in +different contexts to exist in nixpkgs at the same time, for example with python +2 and python 3 versions of a library. + +The second line is a description of the package from its metadata section. + +The `nix` tool allows you to do a lot more than just this, but for now this is +the most important thing. + +### `nix-env -i` + +`nix-env` is a rather big tool that does a lot of things (similar to pacman in +Arch Linux), so I'm going to break things down into separate sections. + +Let's pick an instance graphviz from before and install it using `nix-env`: + +```console +$ nix-env -iA nixos.graphviz +installing 'graphviz-2.42.2' +these paths will be fetched (5.00 MiB download, 13.74 MiB unpacked): + /nix/store/980jk7qbcfrlnx8jsmdx92q96wsai8mx-gts-0.7.6 + /nix/store/fij1p8f0yjpv35n342ii9pwfahj8rlbb-graphviz-2.42.2 + /nix/store/jy35xihlnb3az0vdksyg9rd2f38q2c01-libdevil-1.7.8 + /nix/store/s895dnwlprwpfp75pzq70qzfdn8mwfzc-lcms-1.19 +copying path '/nix/store/980jk7qbcfrlnx8jsmdx92q96wsai8mx-gts-0.7.6' from 'https://cache.nixos.org'... +copying path '/nix/store/s895dnwlprwpfp75pzq70qzfdn8mwfzc-lcms-1.19' from 'https://cache.nixos.org'... +copying path '/nix/store/jy35xihlnb3az0vdksyg9rd2f38q2c01-libdevil-1.7.8' from 'https://cache.nixos.org'... +copying path '/nix/store/fij1p8f0yjpv35n342ii9pwfahj8rlbb-graphviz-2.42.2' from 'https://cache.nixos.org'... +building '/nix/store/r4fqdwpicqjpa97biis1jlxzb4ywi92b-user-environment.drv'... +created 664 symlinks in user environment +``` + +And now let's see where the `dot` tool from graphviz is installed to: + +```console +$ which dot +/home/cadey/.nix-profile/bin/dot + +$ readlink /home/cadey/.nix-profile/bin/dot +/nix/store/fij1p8f0yjpv35n342ii9pwfahj8rlbb-graphviz-2.42.2/bin/dot +``` + +This lets you install tools into the system-level Nix store without affecting +other user's environments, even if they depend on a different version of +graphviz. + +### `nix-env -e` + +`nix-env -e` lets you uninstall packages installed with `nix-env -i`. Let's +uninstall graphviz: + +```console +$ nix-env -e graphviz +``` + +Now the `dot` tool will be gone from your shell: + +```console +$ which dot +which: no dot in (/run/wrappers/bin:/home/cadey/.nix-profile/bin:/etc/profiles/per-user/cadey/bin:/nix/var/nix/profiles/default/bin:/run/current-system/sw/bin) +``` + +And it's like graphviz was never installed. + +Notice that these package management commands are done at the _user_ level +because they are only affecting the currently logged-in user. This allows users +to install their own editors or other tools without having to get admins +involved. + +## Adding up to NixOS + +NixOS builds on top of Nix and its command line tools to make an entire Linux +distribution that can be perfectly crafted to your needs. NixOS machines are +configured using a [configuration.nix][confignix] file that contains the +following kinds of settings: + +[confignix]: https://nixos.org/nixos/manual/index.html#ch-configuration + +- packages installed to the system +- user accounts on the system +- allowed SSH public keys for users on the system +- services activated on the system +- configuration for services on the system +- magic unix flags like the number of allowed file descriptors per process +- what drives to mount where +- network configuration +- ACME certificates + +[and so much more](https://nixos.org/nixos/options.html#) + +At a high level, machines are configured by setting options like this: + +``` +# basic-lxc-image.nix +{ config, pkgs, ... }: + +{ + networking.hostName = "example-for-blog"; + environment.systemPackages = with pkgs; [ wget vim ]; +} +``` + +This would specify a simple NixOS machine with the hostname `example-for-blog` +and with wget and vim installed. This is nowhere near enough to boot an entire +system, but is good enough for describing the base layout of a basic [LXC][lxc] +image. + +[lxc]: https://linuxcontainers.org/lxc/introduction/ + +For a more complete example of NixOS configurations, see +[here](https://github.com/Xe/nixos-configs/tree/master/hosts) or repositories on +[this handy NixOS wiki page](https://nixos.wiki/wiki/Configuration_Collection). + +The main configuration.nix file (usually at `/etc/nixos/configuration.nix`) can also +import other NixOS modules using the `imports` attribute: + +```nix +# better-vm.nix +{ config, pkgs, ... }: + +{ + imports = [ + ./basic-lxc-image.nix + ]; + + networking.hostName = "better-vm"; + services.nginx.enable = true; +} +``` + +And the `better-vm.nix` file would describe a machine with the hostname +`better-vm` that has wget and vim installed, but is also running nginx with its +default configuration. + +Internally, every one of these options will be fed into auto-generated Nix +packages that will describe the system configuration bit by bit. + +### `nixos-rebuild` + +One of the handy features about Nix is that every package exists in its own part +of the Nix store. This allows you to leave the older versions of a package +laying around so you can roll back to them if you need to. `nixos-rebuild` is +the tool that helps you commit configuration changes to the system as well as +roll them back. + +If you want to upgrade your entire system: + +```console +$ sudo nixos-rebuild switch --upgrade +``` + +This tells nixos-rebuild to upgrade the package channels, use those to create a +new base system description, switch the running system to it and start/restart/stop +any services that were added/upgraded/removed during the upgrade. Every time you +rebuild the configuration, you create a new "generation" of configuration that +you can roll back to just as easily: + +```console +$ sudo nixos-rebuild switch --rollback +``` + +### Garbage Collection + +As upgrades happen and old generations pile up, this may end up taking up a lot +of unwanted disk (and boot menu) space. To free up this space, you can use +`nix-collect-garbage`: + +```console +$ sudo nix-collect-garbage +< cleans up packages not referenced by anything > + +$ sudo nix-collect-garbage -d +< deletes old generations and then cleans up packages not referenced by anything > +``` + +The latter is a fairly powerful command and can wipe out older system states. +Only run this if you are sure you don't want to go back to an older setup. + +## How I Use It + +Each of these things builds on top of eachother to make the base platform that I +built my desktop environment on. I have the configuration for [my +shell][xefish], [emacs][xemacs], [my window manager][xedwm] and just about [every +program I use on a regular basis][xecommon] defined in their own NixOS modules so I can +pick and choose things for new machines. + +[xefish]: https://github.com/Xe/xepkgs/tree/master/modules/fish +[xemacs]: https://github.com/Xe/nixos-configs/tree/master/common/users/cadey/spacemacs +[xedwm]: https://github.com/Xe/xepkgs/tree/master/modules/dwm +[xecommon]: https://github.com/Xe/nixos-configs/tree/master/common + +When I want to change part of my config, I edit the files responsible for that +part of the config and then rebuild the system to test it. If things work +properly, I commit those changes and then continue using the system like normal. + +This is a little bit more work in the short term, but as a result I get a setup +that is easier to recreate on more machines in the future. It took me a half +hour or so to get the configuration for [zathura][zathura] right, but now I have +[a zathura +module](https://github.com/Xe/nixos-configs/tree/master/common/users/cadey/zathura) +that lets me get exactly the setup I want every time. + +[zathura]: https://pwmt.org/projects/zathura/ + +## TL;DR + +Nix and NixOS ruined me. It's hard to go back. diff --git a/nix/deps.nix b/nix/deps.nix index ed5a93c..d2ff85d 100644 --- a/nix/deps.nix +++ b/nix/deps.nix @@ -572,8 +572,8 @@ fetch = { type = "git"; url = "https://github.com/Xe/ln"; - rev = "v0.8.0"; - sha256 = "16wkjsbnn2ww7d6ihh6gaan8v3l9919qmx52jcjl5zx9w9y7yry6"; + rev = "v0.9.0"; + sha256 = "1djbjwkyqlvf5gy5jvx0z9mm3g56fg2jjmv0ghwzlvwwpx5h338l"; }; } ] diff --git a/static/blog/nix-package.png b/static/blog/nix-package.png new file mode 100644 index 0000000000000000000000000000000000000000..49be5745ec6a74716a0204641c4ecaf7c54966e0 GIT binary patch literal 18135 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 Ij1m0*0hd|!Y5)KL literal 0 HcmV?d00001