Sets up a virtual machine image that is bootable on Yandex Cloud. There are some slightly wonky behaviours still, like cloud-init apparently putting all keys into root's authorized_keys no matter what is specified in the metadata, but it does work now. Change-Id: I57dcb7fcfa6872a28855dc1347f73a6db3c56828 Reviewed-on: https://cl.tvl.fyi/c/depot/+/8496 Tested-by: BuildkiteCI Reviewed-by: tazjin <tazjin@tvl.su>
		
			
				
	
	
		
			79 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| # Profile for virtual machines on Yandex Cloud, intended for disk
 | |
| # images.
 | |
| #
 | |
| # https://cloud.yandex.com/en/docs/compute/operations/image-create/custom-image
 | |
| #
 | |
| # TODO(tazjin): Upstream to nixpkgs once it works well.
 | |
| { config, lib, pkgs, modulesPath, ... }:
 | |
| 
 | |
| let
 | |
|   cfg = config.virtualisation.yandexCloud;
 | |
| 
 | |
|   # Kernel modules required for interacting with the hypervisor. These
 | |
|   # must be available during stage 1 boot and during normal operation,
 | |
|   # as disks and network do not work without them.
 | |
|   modules = [
 | |
|     "virtio-net"
 | |
|     "virtio-blk"
 | |
|     "virtio-pci"
 | |
|     "virtiofs"
 | |
|   ];
 | |
| in
 | |
| {
 | |
|   imports = [
 | |
|     "${modulesPath}/profiles/headless.nix"
 | |
|   ];
 | |
| 
 | |
|   options = {
 | |
|     virtualisation.yandexCloud.rootPartitionUuid = with lib; mkOption {
 | |
|       type = types.str;
 | |
|       default = "C55A5EE2-E5FA-485C-B3AE-CC928429AB6B";
 | |
| 
 | |
|       description = ''
 | |
|         UUID to use for the root partition of the disk image. Yandex
 | |
|         Cloud requires that root partitions are mounted by UUID.
 | |
| 
 | |
|         Most users do not need to set this to a non-default value.
 | |
|       '';
 | |
|     };
 | |
|   };
 | |
| 
 | |
|   config = {
 | |
|     fileSystems."/" = {
 | |
|       device = "/dev/disk/by-uuid/${lib.toLower cfg.rootPartitionUuid}";
 | |
|       fsType = "ext4";
 | |
|       autoResize = true;
 | |
|     };
 | |
| 
 | |
|     boot = {
 | |
|       loader.grub.device = "/dev/vda";
 | |
| 
 | |
|       initrd.kernelModules = modules;
 | |
|       kernelModules = modules;
 | |
|       kernelParams = [
 | |
|         # Enable support for the serial console
 | |
|         "console=ttyS0"
 | |
|       ];
 | |
| 
 | |
|       growPartition = true;
 | |
|     };
 | |
| 
 | |
|     environment.etc.securetty = {
 | |
|       text = "ttyS0";
 | |
|       mode = "0644";
 | |
|     };
 | |
| 
 | |
|     systemd.services."serial-getty@ttyS0".enable = true;
 | |
| 
 | |
|     services.openssh.enable = true;
 | |
|     services.cloud-init.enable = true;
 | |
| 
 | |
|     system.build.yandexCloudImage = import (pkgs.path + "/nixos/lib/make-disk-image.nix") {
 | |
|       inherit lib config pkgs;
 | |
|       additionalSpace = "128M";
 | |
|       format = "qcow2";
 | |
|       partitionTableType = "legacy+gpt";
 | |
|       rootGPUID = cfg.rootPartitionUuid;
 | |
|     };
 | |
|   };
 | |
| }
 |