Disko takes the NixOS module system and makes it work for disk partitioning as well.
I wanted to write a curses NixOS installer, and that was the first step that I hit; the disk formatting is a manual process. Once that's done, the NixOS system itself is declarative, but the actual formatting of disks is manual.
- supports LVM, ZFS, btrfs, GPT, mdadm, ext4, ...
- supports recursive layouts
- outputs a NixOS-compatible module
- CLI
During the NixOS installation process, replace the Partitioning and formatting steps with the following:
- Find a disk layout in ./examples that you like.
- Write the config based on the example and your disk layout.
- Run the CLI (
nix run github:nix-community/disko
) to apply the changes. - FIXME: Copy the disko module and disk layout around.
- Continue the NixOS installation.
TODO: link to generated module options
./examples
TODO: output of the cli --help
You can use the NixOS module in one of the following ways:
Flakes (Current recommendation)
If you use nix flakes support:
{
inputs.disko.url = "github:nix-community/disko";
inputs.disko.inputs.nixpkgs.follows = "nixpkgs";
outputs = { self, nixpkgs, disko }: {
# change `yourhostname` to your actual hostname
nixosConfigurations.yourhostname = nixpkgs.lib.nixosSystem {
# change to your system:
system = "x86_64-linux";
modules = [
./configuration.nix
disko.nixosModules.disko
];
};
};
}
niv
First add it to niv:
$ niv add nix-community/disko
Then add the following to your configuration.nix in the imports
list:
{
imports = [ "${(import ./nix/sources.nix).disko}/modules/disko.nix" ];
}
nix-channel
As root run:
$ nix-channel --add https://github.com/nix-community/disko/archive/main.tar.gz disko
$ nix-channel --update
Then add the following to your configuration.nix in the imports
list:
{
imports = [ <disko/modules/disko.nix> ];
}
fetchTarball
Add the following to your configuration.nix:
{
imports = [ "${builtins.fetchTarball "https://github.com/nix-community/disko/archive/master.tar.gz"}/module.nix" ];
}
or with pinning:
{
imports = let
# replace this with an actual commit id or tag
commit = "f2783a8ef91624b375a3cf665c3af4ac60b7c278";
in [
"${builtins.fetchTarball {
url = "https://github.com/nix-community/disko/archive/${commit}.tar.gz";
# replace this with an actual hash
sha256 = "0000000000000000000000000000000000000000000000000000";
}}/module.nix"
];
}
{
# checkout the example folder for how to configure different diska layouts
disko.devices = {
disk.sda = {
device = "/dev/sda";
type = "disk";
content = {
type = "table";
format = "gpt";
partitions = [
{
type = "partition";
name = "ESP";
start = "1MiB";
end = "100MiB";
bootable = true;
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
};
}
{
name = "root";
type = "partition";
start = "100MiB";
end = "100%";
part-type = "primary";
bootable = true;
content = {
type = "filesystem";
format = "ext4";
mountpoint = "/";
};
}
];
};
};
};
}
this will configure fileSystems
and other required NixOS options to boot the specified configuration.
If you are on an installer, you probably want to disable enableConfig
.
disko will create the scripts disko-create
and disko-mount
which can be used to create/mount the configured disk layout.