summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md194
-rw-r--r--flake.nix1
-rw-r--r--module.nix43
3 files changed, 171 insertions, 67 deletions
diff --git a/README.md b/README.md
index eb06ac8..f448455 100644
--- a/README.md
+++ b/README.md
@@ -1,80 +1,140 @@
-disko
-=====
+# disko
-nix-powered automatic disk partitioning
+nix-powered automatic disk partitioning. partition your disks declaratively NixOS style.
-Usage
-=====
+## Installing NixOS module
-Master Boot Record
-------------------
-This is how your iso configuation may look like
+You can use the NixOS module in one of the following ways:
+
+### Flakes
+
+If you use nix flakes support:
+
+``` nix
+{
+ 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](https://github.com/nmattia/niv) (Current recommendation)
+ First add it to niv:
+
+```console
+$ niv add nix-community/disko
+```
+
+ Then add the following to your configuration.nix in the `imports` list:
-/etc/nixos/configuration.nix
```nix
-{ pkgs, modulesPath, ... }:
-let
- disko = pkgs.callPackage (builtins.fetchGit {
- url = "https://github.com/nix-community/disko";
- ref = "master";
- }) {};
- cfg = {
- disk = {
- sda = {
- device = "/dev/sda";
- type = "device";
- content = {
- type = "table";
- format = "msdos";
- partitions = [
- {
- name = "root";
- type = "partition";
- part-type = "primary";
- start = "1M";
- end = "100%";
- bootable = true;
- content = {
- type = "filesystem";
- format = "ext4";
- mountpoint = "/";
- };
- }
- ];
- };
+{
+ imports = [ "${(import ./nix/sources.nix).disko}/modules/disko.nix" ];
+}
+```
+
+### nix-channel
+
+ As root run:
+
+```console
+$ 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:
+
+```nix
+{
+ imports = [ <disko/modules/disko.nix> ];
+}
+```
+
+### fetchTarball
+
+ Add the following to your configuration.nix:
+
+``` nix
+{
+ imports = [ "${builtins.fetchTarball "https://github.com/nix-community/disko/archive/main.tar.gz"}/modules/disko.nix" ];
+}
+```
+
+ or with pinning:
+
+```nix
+{
+ 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"
+ ];
+}
+```
+
+## Using the NixOS 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 = "/";
+ };
+ }
+ ];
};
};
};
-in {
- imports = [
- (modulesPath + "/installer/cd-dvd/installation-cd-minimal.nix")
- ];
- environment.systemPackages = with pkgs;[
- (pkgs.writeScriptBin "tsp-create" (disko.create cfg))
- (pkgs.writeScriptBin "tsp-mount" (disko.mount cfg))
- ];
- ## Optional: Automatically creates a service which runs at startup to perform the partitioning
- #systemd.services.install-to-hd = {
- # enable = true;
- # wantedBy = ["multi-user.target"];
- # after = ["getty@tty1.service" ];
- # serviceConfig = {
- # Type = "oneshot";
- # ExecStart = [ (disko.create cfg) (disk.mount cfg) ];
- # StandardInput = "null";
- # StandardOutput = "journal+console";
- # StandardError = "inherit";
- # };
- #};
}
```
-After `nixos-rebuild switch` this will add a `tsp-create` and a `tsp-mount`
-command:
+this will configure `fileSystems` and other required NixOS options to boot the specified configuration.
-- **tsp-create**: creates & formats the partitions according to `tsp-disk.json`
-- **tsp-mount**: mounts the partitions to `/mnt`
+If you are on an installer, you probably want to disable `enableConfig`.
-GUID Partition Table, LVM and dm-crypt
---------------------------------------
-See `examples/`
+disko will create the scripts `disko-create` and `disko-mount` which can be used to create/mount the configured disk layout.
diff --git a/flake.nix b/flake.nix
index cdc5a4c..c06834f 100644
--- a/flake.nix
+++ b/flake.nix
@@ -4,6 +4,7 @@
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
outputs = { self, nixpkgs, ... }: {
+ nixosModules.disko = import ./module.nix;
lib = import ./. {
inherit (nixpkgs) lib;
};
diff --git a/module.nix b/module.nix
new file mode 100644
index 0000000..611d681
--- /dev/null
+++ b/module.nix
@@ -0,0 +1,43 @@
+{ config, lib, pkgs, ... }:
+let
+ types = import ./types.nix { inherit lib; };
+ cfg = config.disko;
+in {
+ options.disko = {
+ devices = lib.mkOption {
+ type = types.devices;
+ };
+ enableConfig = lib.mkOption {
+ description = ''
+ configure nixos with the specified devices
+ should be true if the system is booted with those devices
+ should be false on an installer image etc.
+ '';
+ type = lib.types.bool;
+ default = true;
+ };
+ addScripts = lib.mkOption {
+ description = ''
+ add disko-create and disko-mount scripts to systemPackages.
+ '';
+ type = lib.types.bool;
+ default = true;
+ };
+ };
+ config = {
+ environment.systemPackages = (lib.optionals cfg.addScripts [
+ (pkgs.writers.writeDashBin "disko-create" ''
+ export PATH=${lib.makeBinPath (types.diskoLib.packages cfg.devices pkgs)}
+ ${types.diskoLib.create cfg.devices}
+ '')
+ (pkgs.writers.writeDashBin "disko-mount" ''
+ export PATH=${lib.makeBinPath (types.diskoLib.packages cfg.devices pkgs)}
+ ${types.diskoLib.mount cfg.devices}
+ '')
+ ]) ++ lib.optionals cfg.enableConfig (types.diskoLib.packages cfg.devices pkgs);
+
+ # Remember to add config keys here if they are added to types
+ fileSystems = lib.mkIf cfg.enableConfig (lib.mkMerge (lib.catAttrs "fileSystems" (types.diskoLib.config cfg.devices)));
+ boot = lib.mkIf cfg.enableConfig (lib.mkMerge (lib.catAttrs "boot" (types.diskoLib.config cfg.devices)));
+ };
+}