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