]>
Commit | Line | Data |
---|---|---|
1a64deeb | 1 | configuration_file: { pkgs, myEnv, nixpkgs, environment, pkgs-no-overlay, ... }: |
200690c9 | 2 | let |
1a64deeb IB |
3 | config = (import (nixpkgs + "/nixos/lib/eval-config.nix") { |
4 | inherit (pkgs) system; | |
200690c9 | 5 | modules = [ { |
1a64deeb | 6 | _module.args.environment = environment; |
200690c9 | 7 | myEnv = myEnv; |
1a64deeb IB |
8 | imports = [ |
9 | (nixpkgs + "/nixos/modules/profiles/qemu-guest.nix") | |
10 | configuration_file | |
11 | ]; | |
200690c9 IB |
12 | |
13 | # We want our template image to be as small as possible, but the deployed image should be able to be | |
14 | # of any size. Hence we resize on the first boot. | |
15 | systemd.services.resize-main-fs = { | |
16 | wantedBy = [ "multi-user.target" ]; | |
17 | serviceConfig.Type = "oneshot"; | |
18 | script = | |
19 | '' | |
20 | # Resize main partition to fill whole disk | |
21 | echo ", +" | ${pkgs.utillinux}/bin/sfdisk /dev/vda --no-reread -N 1 | |
22 | ${pkgs.parted}/bin/partprobe | |
23 | # Resize filesystem | |
24 | ${pkgs.e2fsprogs}/bin/resize2fs /dev/vda1 | |
25 | ''; | |
26 | }; | |
27 | } ]; | |
28 | }).config; | |
1a64deeb | 29 | in pkgs-no-overlay.vmTools.runInLinuxVM ( |
200690c9 IB |
30 | pkgs.runCommand "nixos-base-image" |
31 | { | |
32 | memSize = 768; | |
33 | preVM = | |
34 | '' | |
35 | mkdir $out | |
36 | diskImage=image.qcow2 | |
1a64deeb | 37 | ${pkgs-no-overlay.vmTools.qemu}/bin/qemu-img create -f qcow2 $diskImage 2G |
200690c9 IB |
38 | mv closure xchg/ |
39 | ''; | |
40 | postVM = | |
41 | '' | |
42 | echo compressing VM image... | |
1a64deeb | 43 | ${pkgs-no-overlay.vmTools.qemu}/bin/qemu-img convert -c $diskImage -O qcow2 $out/nixos.qcow2 |
200690c9 IB |
44 | ''; |
45 | buildInputs = [ pkgs.utillinux pkgs.perl pkgs.parted pkgs.e2fsprogs ]; | |
46 | exportReferencesGraph = | |
47 | [ "closure" config.system.build.toplevel ]; | |
48 | } | |
49 | '' | |
50 | # Create the partition | |
51 | parted /dev/vda mklabel msdos | |
52 | parted /dev/vda -- mkpart primary ext4 1M -1s | |
53 | ||
54 | # Format the partition | |
55 | mkfs.ext4 -L nixos /dev/vda1 | |
56 | mkdir /mnt | |
57 | mount /dev/vda1 /mnt | |
58 | ||
59 | for dir in dev proc sys; do | |
60 | mkdir /mnt/$dir | |
61 | mount --bind /$dir /mnt/$dir | |
62 | done | |
63 | ||
64 | storePaths=$(perl ${pkgs.pathsFromGraph} /tmp/xchg/closure) | |
65 | echo filling Nix store... | |
66 | mkdir -p /mnt/nix/store | |
67 | set -f | |
68 | cp -prd $storePaths /mnt/nix/store | |
69 | # The permissions will be set up incorrectly if the host machine is not running NixOS | |
70 | chown -R 0:30000 /mnt/nix/store | |
71 | ||
72 | mkdir -p /mnt/etc/nix | |
73 | echo 'build-users-group = ' > /mnt/etc/nix/nix.conf | |
74 | ||
75 | # Register the paths in the Nix database. | |
76 | export USER=root | |
77 | printRegistration=1 perl ${pkgs.pathsFromGraph} /tmp/xchg/closure | \ | |
78 | chroot /mnt ${config.nix.package.out}/bin/nix-store --load-db | |
79 | ||
80 | # Create the system profile to allow nixos-rebuild to work. | |
81 | chroot /mnt ${config.nix.package.out}/bin/nix-env \ | |
82 | -p /nix/var/nix/profiles/system --set ${config.system.build.toplevel} | |
83 | ||
84 | # `nixos-rebuild' requires an /etc/NIXOS. | |
85 | mkdir -p /mnt/etc/nixos | |
86 | touch /mnt/etc/NIXOS | |
87 | ||
88 | # `switch-to-configuration' requires a /bin/sh | |
89 | mkdir -p /mnt/bin | |
90 | ln -s ${config.system.build.binsh}/bin/sh /mnt/bin/sh | |
91 | ||
92 | # Generate the GRUB menu. | |
93 | chroot /mnt ${config.system.build.toplevel}/bin/switch-to-configuration boot | |
94 | ||
95 | umount /mnt/{proc,dev,sys} | |
96 | umount /mnt | |
97 | '' | |
98 | ) |