Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Merged by Bors] - lib/devos: bake devos repo into live cd #168

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 97 additions & 0 deletions doc/start/iso.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,100 @@ dd bs=4M if=result/iso/*.iso of=/dev/$your_installation_device \
```

This works for any file matching `hosts/*.nix` excluding `default.nix`.

## Remote access to the live installer

The iso live installer comes preconfigured with a network configuration
which announces it's hostname via [MulticastDNS][mDNS] as `hostname.local`,
that is `NixOS.local` in the above example.

In the rare case that [MulticastDNS][mDNS] is not availabe or turned off
in your network, there is a static link-local IPv6 address configured to
`fe80::47`(mnemonic from the letter's position in the english alphabet:
`n=14 i=9 x=24; 47 = n+i+x`).

Provided that you have added your public key to the authorized keys of the
`nixos` user:

```nix
{ ... }:
{
users.users.nixos.openssh.authorizedKeys.keyFiles = [
../secrets/path/to/key.pub
];
}
```

You can then ssh into the live installer through one of the
following options:

```console
ssh nixos@NixOS.local

ssh nixos@fe80::47%eno1 # where eno1 is your network interface on which you are linked to the target
```

_Note: the [static link-local IPv6 address][staticLLA] and [MulticastDNS][mDNS] is only
configured on the live installer. If you wish to enable [MulticastDNS][mDNS]
for your environment, you ought to configure that in a regular [profile](../../profiles)._

## EUI-64 LLA & Host Identity

The iso's IPv6 Link Local Address (LLA) is configured with a static 64-bit Extended
Unique Identifiers (EUI-64) that is derived from the host interface's Message
Authentication Code (MAC) address.

After a little while (a few seconds), you can remotely disvover this unique and host
specific address over [NDP][NDP] for example with:

```console
ip -6 neigh show # also shows fe80::47
```

***This LLA is stable for the host, unless you need to swap that particular network card.***
Under this reservation, though, you may use this EUI-64 to wire up a specific
(cryptographic) host identity.

## Bootstrap Target Machine

_Note: nothing prevents you from remotely exceuting the boostrapping process._

Once your target host has booted into the live iso, you need to partion
and format your disk according to the [official manual][manual].

### Mount partitions

Then properly mount the formatted partitions at `/mnt`, so that you can
install your system to those new partitions.

Mount `nixos` partition to `/mnt` and — for UEFI — `boot`
partition to `/mnt/boot`:

```console
$ mount /dev/disk/by-label/nixos /mnt
$ mkdir -p /mnt/boot && mount /dev/disk/by-label/boot /mnt/boot # UEFI only
$ swapon /dev/$your_swap_partition
```

### Install

Install using the `flk` wrapper baked into the iso off of a copy of devos
from the time the iso was built:

```console
$ cd /iso/devos
$ nix develop
$ flk install NixOS --impure # use same host as above
```

<!-- TODO: find out why --impure is necesary / PRs welcome! -->
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was stumbling on and over access to path '/mnt/nix/...' is forbidden in restricted mode


_Note: You _could_ install another machine than the one your iso was built for,
but the iso doesn't carry all the necesary build artifacts so the target would
start to build the missing parts on demand instead of substituting them from
the iso itself._

[manual]: https://nixos.org/manual/nixos/stable/index.html#sec-installation-partitioning
[mDNS]: https://en.wikipedia.org/wiki/Multicast_DNS
[NDP]: https://en.wikipedia.org/wiki/Neighbor_Discovery_Protocol
[staticLLA]: https://tools.ietf.org/html/rfc7404
10 changes: 4 additions & 6 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@

extern = import ./extern { inherit inputs; };

pkgs' = os.mkPkgs { inherit self; };
pkgs' = os.mkPkgs;

outputs =
let
Expand All @@ -57,7 +57,7 @@
overlay = import ./pkgs;
overlays = lib.pathsToImportedAttrs (lib.pathsIn ./overlays);

lib = import ./lib { inherit nixos pkgs; };
lib = import ./lib { inherit nixos pkgs self; };

templates.flk.path = ./.;
templates.flk.description = "flk template";
Expand All @@ -79,16 +79,14 @@
let pkgs = pkgs'.${system}; in
{
packages = utils.lib.flattenTreeSystem system
(os.mkPackages {
inherit self pkgs;
});
(os.mkPackages { inherit pkgs; });

devShell = import ./shell {
inherit self system;
};

legacyPackages.hmActivationPackages =
os.mkHomeActivation { inherit self; };
os.mkHomeActivation;
}
);
in
Expand Down
4 changes: 4 additions & 0 deletions hosts/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,10 @@ let
];

networking = { inherit hostName; };

_module.args = {
inherit self;
};
};
in
dev.os.devosSystem {
Expand Down
8 changes: 4 additions & 4 deletions lib/default.nix
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
args@{ nixos, pkgs, ... }:
args@{ nixos, pkgs, self, ... }:
let inherit (nixos) lib; in
lib.makeExtensible (self:
lib.makeExtensible (final:
let callLibs = file: import file
({
inherit lib;

dev = self;
dev = final;
} // args);
in
with self;
with final;
{
inherit callLibs;

Expand Down
34 changes: 33 additions & 1 deletion lib/devos/devosSystem.nix
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{ lib, nixos, ... }:
{ lib, nixos, self, ... }:

{ modules, ... } @ args:
lib.nixosSystem (args // {
Expand All @@ -13,11 +13,43 @@ lib.nixosSystem (args // {
"${nixos}/${modpath}/${cd}"
({ config, ... }: {
isoImage.isoBaseName = "nixos-" + config.networking.hostName;
isoImage.contents = [{
source = self;
target = "/devos/";
}];
# confilcts with networking.wireless which might be slightly
# more useful on a stick
networking.networkmanager.enable = lib.mkForce false;
# confilcts with networking.wireless
networking.wireless.iwd.enable = lib.mkForce false;
# Set up a link-local boostrap network
blaggacao marked this conversation as resolved.
Show resolved Hide resolved
# See also: https://github.com/NixOS/nixpkgs/issues/75515#issuecomment-571661659
networking.usePredictableInterfaceNames = lib.mkForce true; # so prefix matching works
networking.useNetworkd = lib.mkForce true;
networking.useDHCP = lib.mkForce false;
networking.dhcpcd.enable = lib.mkForce false;
systemd.network = {
# https://www.freedesktop.org/software/systemd/man/systemd.network.html
networks."boostrap-link-local" = {
matchConfig = {
Name = "en* wl* ww*";
};
networkConfig = {
Description = "Link-local host bootstrap network";
MulticastDNS = true;
LinkLocalAddressing = "ipv6";
DHCP = "yes";
};
address = [
# fall back well-known link-local for situations where MulticastDNS is not available
"fe80::47" # 47: n=14 i=9 x=24; n+i+x
];
extraConfig = ''
# Unique, yet stable. Based off the MAC address.
IPv6LinkLocalAddressGenerationMode = "eui64"
'';
};
};
})
];
})).config;
Expand Down
3 changes: 1 addition & 2 deletions lib/devos/mkHomeActivation.nix
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
{ lib, ... }:
{ lib, self, ... }:

{ self }:
let hmConfigs =
lib.mapAttrs
(_: config: config.config.home-manager.users)
Expand Down
4 changes: 2 additions & 2 deletions lib/devos/mkPackages.nix
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{ lib, dev, ... }:
{ lib, dev, self, ... }:

{ self, pkgs }:
{ pkgs }:
let
inherit (self) overlay overlays;
packagesNames = lib.attrNames (overlay null null)
Expand Down
3 changes: 1 addition & 2 deletions lib/devos/mkPkgs.nix
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
{ lib, dev, nixos, ... }:
{ lib, dev, nixos, self, ... }:

{ self }:
let inherit (self) inputs;
in
(inputs.utils.lib.eachDefaultSystem
Expand Down
2 changes: 1 addition & 1 deletion shell/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
, system ? builtins.currentSystem
}:
let
pkgs = (self.lib.os.mkPkgs { inherit self; }).${system};
pkgs = (self.lib.os.mkPkgs).${system};

inherit (pkgs) lib;

Expand Down