nixos/virtualisation/linode-image: init (#155426)

This commit is contained in:
David Houston
2022-09-28 18:25:03 -04:00
committed by GitHub
parent 88a2353643
commit 28e90d3709
5 changed files with 157 additions and 0 deletions

View File

@@ -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
'';
};
};
};
}

View File

@@ -0,0 +1,66 @@
{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.virtualisation.linodeImage;
defaultConfigFile = pkgs.writeText "configuration.nix" ''
_: {
imports = [
<nixpkgs/nixos/modules/virtualisation/linode-image.nix>
];
}
'';
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
`<nixpkgs/nixos/modules/virtualisation/linode-image.nix>`
'';
};
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 ];
}