From 62200eddd1d7abca57fb1d79b98ab5000ade7cd8 Mon Sep 17 00:00:00 2001 From: Christine Dodrill Date: Mon, 17 May 2021 21:34:09 -0400 Subject: [PATCH] Nixos support (#4) * build nixos Signed-off-by: Christine Dodrill * does this work lol Signed-off-by: Christine Dodrill * oops Signed-off-by: Christine Dodrill * openstack? Signed-off-by: Christine Dodrill * oops lol Signed-off-by: Christine Dodrill * write a fake cloud config i guess Signed-off-by: Christine Dodrill * enable ssh lol Signed-off-by: Christine Dodrill * openstack is banned Signed-off-by: Christine Dodrill * lol oops x3 Signed-off-by: Christine Dodrill * enable cloud init Signed-off-by: Christine Dodrill --- .gitignore | 1 + main.go | 56 ++++++++++++++++++++++++++++++++++++++----------- nixos.go | 13 ++++++++++++ var/xe-base.nix | 28 +++++++++++++++++++++++++ 4 files changed, 86 insertions(+), 12 deletions(-) create mode 100644 .gitignore create mode 100644 nixos.go create mode 100644 var/xe-base.nix diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b511ae1 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.qcow2 diff --git a/main.go b/main.go index b195cea..10507c1 100644 --- a/main.go +++ b/main.go @@ -44,6 +44,16 @@ func main() { rand.Seed(time.Now().Unix()) flag.Parse() + cdir, err := os.UserCacheDir() + if err != nil { + log.Fatalf("can't find cache dir: %v", err) + } + cdir = filepath.Join(cdir, "within", "mkvm") + os.MkdirAll(filepath.Join(cdir, "nixos"), 0755) + os.MkdirAll(filepath.Join(cdir, "qcow2"), 0755) + os.MkdirAll(filepath.Join(cdir, "seed"), 0755) + vmID := uuid.New().String() + if *name == "" { commonBladeName, err := getName() if err != nil { @@ -59,6 +69,18 @@ func main() { var resultDistro Distro var found bool + qcowPath := filepath.Join(cdir, "nixos", vmID, "nixos.qcow2") + + if *distro == "nixos" { + found = true + resultDistro = Distro{ + Name: "nixos", + DownloadURL: "file://" + qcowPath, + Sha256Sum: "", + MinSize: 8, + } + } + for _, d := range distros { if d.Name == *distro { found = true @@ -78,7 +100,11 @@ func main() { } os.Exit(1) } + zvol := filepath.Join(*zvolPrefix, *name) + if resultDistro.Name != "nixos" { + qcowPath = filepath.Join(cdir, "qcow2", resultDistro.Sha256Sum) + } macAddress, err := randomMac() if err != nil { @@ -90,8 +116,6 @@ func main() { log.Fatalf("can't connect to libvirt: %v", err) } - vmID := uuid.New().String() - log.Println("plan:") log.Printf("name: %s", *name) log.Printf("zvol: %s (%d GB)", zvol, *zvolSize) @@ -108,14 +132,13 @@ func main() { fmt.Print("press enter if this looks okay: ") reader.ReadString('\n') - cdir, err := os.UserCacheDir() - if err != nil { - log.Fatalf("can't find cache dir: %v", err) + if *distro == "nixos" { + _, err := mkNixOSImage(*cloudConfig, cdir, vmID) + if err != nil { + log.Fatal(err) + } } - cdir = filepath.Join(cdir, "within", "mkvm") - os.MkdirAll(filepath.Join(cdir, "qcow2"), 0755) - os.MkdirAll(filepath.Join(cdir, "seed"), 0755) - qcowPath := filepath.Join(cdir, "qcow2", resultDistro.Sha256Sum) + _, err = os.Stat(qcowPath) if err != nil { log.Printf("downloading distro image %s to %s", resultDistro.DownloadURL, qcowPath) @@ -189,9 +212,18 @@ func main() { } fout.Close() - err = run("cp", *cloudConfig, filepath.Join(dir, "user-data")) - if err != nil { - log.Fatal(err) + if *distro != "nixos" { + err = run("cp", *cloudConfig, filepath.Join(dir, "user-data")) + if err != nil { + log.Fatal(err) + } + } else { + fout, err := os.Create(filepath.Join(dir, "user-data")) + if err != nil { + log.Fatal(err) + } + fmt.Fprintln(fout, "#cloud-config") + fout.Close() } isoPath := filepath.Join(cdir, "seed", fmt.Sprintf("%s-%s.iso", *name, vmID)) diff --git a/nixos.go b/nixos.go new file mode 100644 index 0000000..269352f --- /dev/null +++ b/nixos.go @@ -0,0 +1,13 @@ +package main + +import "path/filepath" + +func mkNixOSImage(configFname, cacheDir, vmID string) (string, error) { + outputFname := filepath.Join(cacheDir, "nixos", vmID) + err := run("nix-shell", "-p", "nixos-generators", "--run", "nixos-generate -f qcow -o "+outputFname+" -c "+configFname) + if err != nil { + return "", err + } + + return outputFname, nil +} diff --git a/var/xe-base.nix b/var/xe-base.nix new file mode 100644 index 0000000..f7f9442 --- /dev/null +++ b/var/xe-base.nix @@ -0,0 +1,28 @@ +{ config, pkgs, modulesPath, ... }: + +{ + imports = [ (modulesPath + "/profiles/qemu-guest.nix") ]; + + boot.initrd.availableKernelModules = + [ "ata_piix" "uhci_hcd" "virtio_pci" "sr_mod" "virtio_blk" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ ]; + boot.extraModulePackages = [ ]; + + users.users.xe = { + isNormalUser = true; + initialPassword = "hunter2"; + extraGroups = [ "wheel" ]; + openssh.authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPg9gYKVglnO2HQodSJt4z4mNrUSUiyJQ7b+J798bwD9" + ]; + }; + + services.openssh.enable = true; + + security.sudo.wheelNeedsPassword = false; + services.cloud-init = { + enable = true; + ext4.enable = true; + }; +}