Nixpkgs Overlays
The following is done with a local clone of Nixpkgs located at ~/src/nixpkgs
.
In this example, we will create an overlay to override the version of
btrfs-progs
. In the root directory of our local clone of Nixpkgs
(i.e.~/src/nixpkgs
) we can run the following command to locate btrfs-progs
within Nixpkgs:
fd 'btrfs-progs' .
./pkgs/by-name/bt/btrfs-progs/
Open the package.nix
in the above directory and copy the src
block within
the stdenv.mkDerivation
block like so:
# package.nix
version = "6.14";
src = fetchurl {
url = "mirror://kernel/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v${version}.tar.xz";
hash = "sha256-31q4BPyzbikcQq2DYfgBrR4QJBtDvTBP5Qzj355+PaE=";
};
When we use the above src
block in our overlay we'll need to add
src = self.fetchurl
for our overlay to have access to fetchurl
.
We will replace the version with our desired version number. To find another
version that actually exists we need to check their github repos
btrfs-progs Releases. I can see
that the previous version was v6.13
, lets try that.
cd ~/src/nixpkgs
hx overlay.nix
We will change the version to 6.13
for demonstration purposes. All that is
really required is changing the version and 1 character in the hash
which
would cause a refetch and recalculation of the hash. We will use an empty string
to follow convention:
# overlay.nix
self: super: {
btrfs-progs = super.btrfs-progs.overrideAttrs (old: rec {
version = "6.13";
# Notice the `self` added here
src = self.fetchurl {
url = "mirror://kernel/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v${version}.tar.xz";
hash = "";
};
};
});
}
To build this with the file right from the root of the local Nixpkgs (i.e.
~/src/nixpkgs
) you could run the following. Running the command this way
avoids the impurity of looking it up in the ~/.config
directory:
nix-build -A btrfs-progs --arg overlays '[ (import ./overlay.nix) ]'
The compiler will give you back the correct hash
:
specified: sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
got: sha256-ZbPyERellPgAE7QyYg7sxqfisMBeq5cTb/UGx01z7po=
Replace the empty hash
with the new hash value we just got from the compiler
so the overlay.nix
would look like this:
self: super: {
btrfs-progs = super.btrfs-progs.overrideAttrs (old: rec {
version = "6.13";
src = self.fetchurl {
url = "mirror://kernel/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v${version}.tar.xz";
hash = "sha256-ZbPyERellPgAE7QyYg7sxqfisMBeq5cTb/UGx01z7po=";
};
});
}
Try building it again:
nix-build -A btrfs-progs --arg overlays '[ (import ./overlay.nix) ]'
checking for references to /build/ in /nix/store/szd6lizahidjniz85a0g1wsrfknirhwb-btrfs-progs-6.13...
gzipping man pages under /nix/store/szd6lizahidjniz85a0g1wsrfknirhwb-btrfs-progs-6.13/share/man/
patching script interpreter paths in /nix/store/szd6lizahidjniz85a0g1wsrfknirhwb-btrfs-progs-6.13
/nix/store/szd6lizahidjniz85a0g1wsrfknirhwb-btrfs-progs-6.13/bin/fsck.btrfs: interpreter directive changed from "#!/bin/sh -f" to "/nix/store/xy4jjgw87sbgwylm5kn047d9gkbhsr9x-bash-5.2p37/bin/sh -f"
stripping (with command strip and flags -S -p) in /nix/store/szd6lizahidjniz85a0g1wsrfknirhwb-btrfs-progs-6.13/lib /nix/store/szd6lizahidjniz85a0g1wsrfknirhwb-btrfs-progs-6.13/bin
/nix/store/szd6lizahidjniz85a0g1wsrfknirhwb-btrfs-progs-6.13
We can inspect it with the repl:
cd ~/src/nixpkgs
nix repl
nix-repl> :a import ./. { overlays = [ (import ./overlay.nix) ]; }
nix-repl> btrfs-progs
«derivation /nix/store/6yxhj84cwcsnrd87rcxbd6w08l9ikc6p-btrfs-progs-6.13.drv»
nix-repl> btrfs-progs.drvAttrs.buildInputs
[
«derivation /nix/store/yg4llzkcla5rppv8r1iikyamfxg3g4sg-acl-2.3.2.drv»
«derivation /nix/store/vqczbcwjnid6bs4cv3skl7kyd6kkzcfx-attr-2.5.2.drv»
«derivation /nix/store/xrvx0azszpdh2x0lnldakqx25vfxab19-e2fsprogs-1.47.2.drv»
«derivation /nix/store/iil4b8adk615zhp6wmzjx16z1v2f8f4j-util-linux-minimal-2.41.drv»
«derivation /nix/store/wwld8wp91m26wz69gp8vzh090sh5ygxd-lzo-2.10.drv»
«derivation /nix/store/w4ncw24gdfkbx9779xpgjli5sagi506m-systemd-minimal-libs-257.5.drv»
«derivation /nix/store/dmh4lvmq6n8hy56q93kplvnfnlwqzzv5-zlib-1.3.1.drv»
«derivation /nix/store/h8iwhnr636dwb72qqcyzp111ajjxgzr2-zstd-1.5.7.drv»
]
nix-repl> btrfs-progs.drvAttrs.version
"6.13"
nix-repl> btrfs-progs.drvAttrs.src
«derivation /nix/store/y5nkz1xczxha4xl93qq3adndyc46dcvf-btrfs-progs-v6.13.tar.xz.drv»
Using :a
adds the attributes from the resulting set into scope and avoids
bringing the entire nixpkgs
set into scope.
To see whats available, you can for example type btrfs-progs.drvAttrs.
then
hit TAB
.
Another way to do this is to move our overlay to the
~/.config/nixpkgs/overlays
directory and rename the file like the following,
agian this adds an impurity because it relies on your ~/.config
directory
which is different from user to user:
mv overlay.nix ~/.config/nixpkgs/overlays/btrfs-progs.nix
cd ~/src/nixpkgs
nix-build -A btrfs-progs
checking for references to /build/ in /nix/store/szd6lizahidjniz85a0g1wsrfknirhwb-btrfs-progs-6.13...
gzipping man pages under /nix/store/szd6lizahidjniz85a0g1wsrfknirhwb-btrfs-progs-6.13/share/man/
patching script interpreter paths in /nix/store/szd6lizahidjniz85a0g1wsrfknirhwb-btrfs-progs-6.13
/nix/store/szd6lizahidjniz85a0g1wsrfknirhwb-btrfs-progs-6.13/bin/fsck.btrfs: interpreter directive changed from "#!/bin/sh -f" to "/nix/store/xy4jjgw87sbgwylm5kn047d9gkbhsr9x-bash-5.2p37/bin/sh -f"
stripping (with command strip and flags -S -p) in /nix/store/szd6lizahidjniz85a0g1wsrfknirhwb-btrfs-progs-6.13/lib /nix/store/szd6lizahidjniz85a0g1wsrfknirhwb-btrfs-progs-6.13/bin
/nix/store/szd6lizahidjniz85a0g1wsrfknirhwb-btrfs-progs-6.13
Overlays with Flakes
In a flake, overlays are defined in the outputs.overlays
attribute set of the
flake.nix
.
They are then applied to nixpkgs
inputs using
inputs.nixpkgs.follows = "nixpkgs";
(or similar) and the overlays attribute on
the input.
Example of flake usage:
# flake.nix
{
description = "My NixOS flake with custom overlays";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
};
outputs = { self, nixpkgs, ... }: {
overlays.myCustomOverlay = final: prev: {
btrfs-progs = prev.btrfs-progs.overrideAttrs (old: rec {
version = "6.13";
src = self.fetchurl {
url = "mirror://kernel/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v${version}.tar.xz";
hash = "sha256-ZbPyERellPgAE7QyYg7sxqfisMBeq5cTb/UGx01z7po=";
};
});
};
nixosConfigurations.my-system = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
# Apply the overlay
{ nixpkgs.overlays = [ self.overlays.myCustomOverlay ]; }
./configuration.nix
];
};
};
}
nix flake show
path:/home/jr/btrfs-progs?lastModified=1749655369&narHash=sha256-ln6dLiqo7TxStQSXgcIwfbdt7STGw4ZHftZRfWpY/JQ%3D
├───nixosConfigurations
│ └───my-system: NixOS configuration
└───overlays
└───myCustomOverlay: Nixpkgs overlay