From 28e90d37098e41c9104ac30fb0ca5f348595a8b0 Mon Sep 17 00:00:00 2001 From: David Houston Date: Wed, 28 Sep 2022 18:25:03 -0400 Subject: [PATCH] nixos/virtualisation/linode-image: init (#155426) --- maintainers/maintainer-list.nix | 7 ++ .../from_md/release-notes/rl-2211.section.xml | 7 ++ .../manual/release-notes/rl-2211.section.md | 2 + .../modules/virtualisation/linode-config.nix | 75 +++++++++++++++++++ nixos/modules/virtualisation/linode-image.nix | 66 ++++++++++++++++ 5 files changed, 157 insertions(+) create mode 100644 nixos/modules/virtualisation/linode-config.nix create mode 100644 nixos/modules/virtualisation/linode-image.nix diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix index dcd923facc2e..5e51f2641677 100644 --- a/maintainers/maintainer-list.nix +++ b/maintainers/maintainer-list.nix @@ -5494,6 +5494,13 @@ githubId = 25618740; name = "Vincent Cui"; }; + houstdav000 = { + email = "houstdav000@gmail.com"; + github = "houstdav000"; + githubId = 17628961; + matrix = "@houstdav000:gh0st.ems.host"; + name = "David Houston"; + }; hoverbear = { email = "operator+nix@hoverbear.org"; matrix = "@hoverbear:matrix.org"; diff --git a/nixos/doc/manual/from_md/release-notes/rl-2211.section.xml b/nixos/doc/manual/from_md/release-notes/rl-2211.section.xml index b256521c3d45..bfe04d89fa83 100644 --- a/nixos/doc/manual/from_md/release-notes/rl-2211.section.xml +++ b/nixos/doc/manual/from_md/release-notes/rl-2211.section.xml @@ -142,6 +142,13 @@ OpenSSL now defaults to OpenSSL 3, updated from 1.1.1. + + + An image configuration and generator has been added for Linode + images, largely based on the present GCE configuration and + image. + + hardware.nvidia has a new option diff --git a/nixos/doc/manual/release-notes/rl-2211.section.md b/nixos/doc/manual/release-notes/rl-2211.section.md index 5e98e1fde75b..dcbe545a626c 100644 --- a/nixos/doc/manual/release-notes/rl-2211.section.md +++ b/nixos/doc/manual/release-notes/rl-2211.section.md @@ -57,6 +57,8 @@ In addition to numerous new and upgraded packages, this release has the followin - OpenSSL now defaults to OpenSSL 3, updated from 1.1.1. +- An image configuration and generator has been added for Linode images, largely based on the present GCE configuration and image. + - `hardware.nvidia` has a new option `open` that can be used to opt in the opensource version of NVIDIA kernel driver. Note that the driver's support for GeForce and Workstation GPUs is still alpha quality, see [NVIDIA Releases Open-Source GPU Kernel Modules](https://developer.nvidia.com/blog/nvidia-releases-open-source-gpu-kernel-modules/) for the official announcement. diff --git a/nixos/modules/virtualisation/linode-config.nix b/nixos/modules/virtualisation/linode-config.nix new file mode 100644 index 000000000000..d664e8269f41 --- /dev/null +++ b/nixos/modules/virtualisation/linode-config.nix @@ -0,0 +1,75 @@ +{ config, lib, pkgs, ... }: +with lib; +{ + imports = [ ../profiles/qemu-guest.nix ]; + + services.openssh = { + enable = true; + + permitRootLogin = "prohibit-password"; + passwordAuthentication = mkDefault false; + }; + + networking = { + usePredictableInterfaceNames = false; + useDHCP = false; + interfaces.eth0 = { + useDHCP = true; + + # Linode expects IPv6 privacy extensions to be disabled, so disable them + # See: https://www.linode.com/docs/guides/manual-network-configuration/#static-vs-dynamic-addressing + tempAddress = "disabled"; + }; + }; + + # Install diagnostic tools for Linode support + environment.systemPackages = with pkgs; [ + inetutils + mtr + sysstat + ]; + + fileSystems."/" = { + fsType = "ext4"; + device = "/dev/sda"; + autoResize = true; + }; + + swapDevices = mkDefault [{ device = "/dev/sdb"; }]; + + # Enable LISH and Linode Booting w/ GRUB + boot = { + # Add Required Kernel Modules + # NOTE: These are not documented in the install guide + initrd.availableKernelModules = [ + "virtio_pci" + "virtio_scsi" + "ahci" + "sd_mod" + ]; + + # Set Up LISH Serial Connection + kernelParams = [ "console=ttyS0,19200n8" ]; + kernelModules = [ "virtio_net" ]; + + loader = { + # Increase Timeout to Allow LISH Connection + # NOTE: The image generator tries to set a timeout of 0, so we must force + timeout = lib.mkForce 10; + + grub = { + enable = true; + version = 2; + forceInstall = true; + device = "nodev"; + + # Allow serial connection for GRUB to be able to use LISH + extraConfig = '' + serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1; + terminal_input serial; + terminal_output serial + ''; + }; + }; + }; +} diff --git a/nixos/modules/virtualisation/linode-image.nix b/nixos/modules/virtualisation/linode-image.nix new file mode 100644 index 000000000000..f8d212d9cda0 --- /dev/null +++ b/nixos/modules/virtualisation/linode-image.nix @@ -0,0 +1,66 @@ +{ config, lib, pkgs, ... }: + +with lib; +let + cfg = config.virtualisation.linodeImage; + defaultConfigFile = pkgs.writeText "configuration.nix" '' + _: { + imports = [ + + ]; + } + ''; +in +{ + imports = [ ./linode-config.nix ]; + + options = { + virtualisation.linodeImage.diskSize = mkOption { + type = with types; either (enum (singleton "auto")) ints.positive; + default = "auto"; + example = 1536; + description = '' + Size of disk image in MB. + ''; + }; + + virtualisation.linodeImage.configFile = mkOption { + type = with types; nullOr str; + default = null; + description = '' + A path to a configuration file which will be placed at `/etc/nixos/configuration.nix` + and be used when switching to a new configuration. + If set to `null`, a default configuration is used, where the only import is + `` + ''; + }; + + virtualisation.linodeImage.compressionLevel = mkOption { + type = types.ints.between 1 9; + default = 6; + description = '' + GZIP compression level of the resulting disk image (1-9). + ''; + }; + }; + + config = { + system.build.linodeImage = import ../../lib/make-disk-image.nix { + name = "linode-image"; + # NOTE: Linode specifically requires images to be `gzip`-ed prior to upload + # See: https://www.linode.com/docs/products/tools/images/guides/upload-an-image/#requirements-and-considerations + postVM = '' + ${pkgs.gzip}/bin/gzip -${toString cfg.compressionLevel} -c -- $diskImage > \ + $out/nixos-image-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}.img.gz + rm $diskImage + ''; + format = "raw"; + partitionTableType = "none"; + configFile = if cfg.configFile == null then defaultConfigFile else cfg.configFile; + inherit (cfg) diskSize; + inherit config lib pkgs; + }; + }; + + meta.maintainers = with maintainers; [ houstdav000 ]; +}