It seems this is its own Markdown context of some sort, so that hyperlink url needs to be moved inside to work. Change-Id: Id35fdf97ccc7a5ed087360d27a2cda3a7df0c850 Reviewed-on: https://cl.snix.dev/c/snix/+/30265 Tested-by: besadii Reviewed-by: Vova Kryachko <v.kryachko@gmail.com> Autosubmit: Florian Klink <flokli@flokli.de>
		
			
				
	
	
		
			140 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| title: "Use as a lower store with nix"
 | |
| slug: local-overlay
 | |
| description: ""
 | |
| summary: ""
 | |
| date: 2025-03-21T22:40:33+00:00
 | |
| lastmod: 2025-03-21T22:40:33+00:00
 | |
| draft: false
 | |
| weight: 14
 | |
| toc: true
 | |
| ---
 | |
| 
 | |
| This document describes how to configure `snix` as the lower layer in your
 | |
| [Local Overlay] nix store.
 | |
| 
 | |
| ### Build required `snix` components
 | |
| 
 | |
| To use this feature you will need to 2 `snix` compontents, for detailed building
 | |
| instructions see [Building]({{< ref "building" >}}).
 | |
| 
 | |
| ```console
 | |
| $ nix-build -A snix.store
 | |
| $ nix-build -A snix.nix-daemon
 | |
| ```
 | |
| 
 | |
| These will provide `snix-store` and `nix-daemon` binaries.
 | |
| 
 | |
| ### Run the `snix` daemon
 | |
| 
 | |
| `snix daemon` is the component exposing `castore` and `store` data. By default,
 | |
| these live inside `/var/lib/snix`, so make sure it's writable for the user
 | |
| you're executing it with. See `snix-store daemon --help` for customization
 | |
| options. `/var/lib/snix`, you can run `snix-store daemon --help` for
 | |
| customization instructions.
 | |
| 
 | |
| You can run the daemon with:
 | |
| 
 | |
| ```console
 | |
| $ $(nix-build -A snix.snix-store)/bin/snix-store daemon
 | |
| ```
 | |
| 
 | |
| ### Mount the store
 | |
| 
 | |
| To expose the store paths and their contents as a file system, if can be
 | |
| FUSE-mounted with the following command:
 | |
| 
 | |
| ```console
 | |
| $ $(nix-build -A snix.snix-store)/bin/snix-store mount /path/to/mount
 | |
| ```
 | |
| 
 | |
| This mount will talk to the previously invoked daemon.
 | |
| 
 | |
| Note that by default, this mount won't allow listing files and directories at
 | |
| the root of the store, if you want to enable it, use the `--list-root` flag, but
 | |
| be careful with it if your store is really large.
 | |
| 
 | |
| ### Run `snix` nix-daemon
 | |
| 
 | |
| ```console
 | |
| $ $(nix-build -A snix.nix-daemon)/bin/nix-daemon -l /tmp/snix-daemon.sock \
 | |
|     --unix-listen-unlink
 | |
| ```
 | |
| 
 | |
| This will launch the `snix` nix-daemon listening on a unix domain socket.
 | |
| 
 | |
| Nix will communicate with it to get metadata about store paths.
 | |
| 
 | |
| ### Create an overlayfs mount
 | |
| 
 | |
| {{<callout>}}
 | |
| Depending on your usecase, this might not be appropriate for a physical NixOS
 | |
| system, replacing `/nix` globally.
 | |
| 
 | |
| In these cases, you want to ensure store paths needed to boot the system are
 | |
| available on the plain disk.
 | |
| 
 | |
| You most likely want to mount this combined mountpoint elsewhere, and spin up a
 | |
| separate mount namespace (via `systemd-nspawn`, `bwrap` or similar) exposing it
 | |
| at `/nix` in there. You have been warned!
 | |
| {{</callout>}}
 | |
| 
 | |
| 
 | |
| Bind mount your real /nix store on the side, so that nix has direct access to
 | |
| it, this is optional but allows you to have access to your real nix store
 | |
| without unmounting:
 | |
| 
 | |
| ```console
 | |
| $ mount --bind /nix /opt/nix
 | |
| ```
 | |
| 
 | |
| ```console
 | |
| $ mount -t overlay overlay \
 | |
|     -o lowerdir=/path/to/mount \
 | |
|     -o upperdir=/opt/nix \
 | |
|     /nix
 | |
| ```
 | |
| 
 | |
| ### Configure nix to use the daemon
 | |
| 
 | |
| With all of the above out of the way, we are ready to configure nix. In the
 | |
| proposed setup we will configure nix-daemon with an overlay store but for the
 | |
| Nix CLI you can just configure nix with the overlay store.
 | |
| 
 | |
| #### nix-daemon
 | |
| 
 | |
| The daemon can be configured in the following way:
 | |
| 
 | |
| Add the following line to your `/etc/nix.conf`
 | |
| 
 | |
| ```
 | |
| store = local-overlay://?state=/opt/nix/var/nix&upper-layer=/opt/nix/store&check-mount=false&lower-store=unix%3A%2F%2F%2Ftmp%2Fsnix-daemon.sock
 | |
| ```
 | |
| 
 | |
| #### Personal nix config
 | |
| 
 | |
| With the above configuration in your `/etc/nix.conf`, we need to tell nix not to
 | |
| use it but instead use `store = daemon` so that only the daemon is aware of the
 | |
| Local Overlay Store.
 | |
| 
 | |
| This can be achieved by either setting the env variable
 | |
| `NIX_CONFIG='store = daemon` or by adding `store = daemon` to your
 | |
| `$XDG_CONFIG_HOME/nix.conf` file.
 | |
| 
 | |
| ### Profit
 | |
| 
 | |
| With the above setup you should now be able to have nix use Snix castore as its
 | |
| lower store.
 | |
| 
 | |
| {{<callout>}}
 | |
| There are some known (and not yet worked-on) performance issues in Snix
 | |
| castore, which is why the mount is expected to perform slower than the native
 | |
| file-system. Depending on your workload, this might or might not be an issue.
 | |
| 
 | |
| Check [our Bug tracker][castore-perf-issues] for updates on that topic.
 | |
| 
 | |
| [castore-perf-issues]: https://git.snix.dev/snix/snix/issues?q=&type=all&sort=&labels=14%2c24
 | |
| {{</callout>}}
 | |
| 
 | |
| 
 | |
| [local overlay]: https://nix.dev/manual/nix/2.26/store/types/experimental-local-overlay-store.html
 |