mirror of
https://github.com/nix-community/disko.git
synced 2024-09-19 02:27:27 +03:00
make-disk-image: add impure variant
This commit is contained in:
parent
493b347d8f
commit
ab5f8eea75
@ -11,7 +11,10 @@ let
|
||||
diskoLib = {
|
||||
|
||||
# like make-disk-image.nix from nixpkgs, but with disko config
|
||||
makeDiskImage = args: import ./make-disk-image.nix ({ inherit diskoLib; } // args);
|
||||
makeDiskImage = args: (import ./make-disk-image.nix ({ inherit diskoLib; } // args)).pure;
|
||||
|
||||
# a version of makeDiskImage which runs outside of the store
|
||||
makeDiskImageScript = args: (import ./make-disk-image.nix ({ inherit diskoLib; } // args)).impure;
|
||||
|
||||
testLib = import ./tests.nix { inherit lib makeTest eval-config; };
|
||||
# like lib.types.oneOf but instead of a list takes an attrset
|
||||
|
@ -4,6 +4,7 @@
|
||||
, lib ? pkgs.lib
|
||||
, name ? "${nixosConfig.config.networking.hostName}-disko-images"
|
||||
, extraPostVM ? ""
|
||||
, checked ? false
|
||||
}:
|
||||
let
|
||||
cleanedConfig = diskoLib.testLib.prepareDiskoConfig nixosConfig.config diskoLib.testLib.devices;
|
||||
@ -13,46 +14,125 @@ let
|
||||
boot.loader.grub.devices = lib.mkForce cleanedConfig.boot.loader.grub.devices;
|
||||
}];
|
||||
};
|
||||
in
|
||||
pkgs.vmTools.runInLinuxVM (pkgs.runCommand name {
|
||||
buildInputs = with pkgs; [
|
||||
dependencies = with pkgs; [
|
||||
bash
|
||||
coreutils
|
||||
gnused
|
||||
systemdMinimal
|
||||
nixos-install-tools
|
||||
nix
|
||||
utillinux
|
||||
];
|
||||
preVM = ''
|
||||
# TODO: get size either dynamically or from disko config
|
||||
${lib.concatMapStringsSep "\n" (disk: "truncate -s ${disk.imageSize} ${disk.name}.raw") (lib.attrValues nixosConfig.config.disko.devices.disk)}
|
||||
'';
|
||||
postVM = ''
|
||||
mkdir -p $out
|
||||
${lib.concatMapStringsSep "\n" (disk: "cp ${disk.name}.raw $out/${disk.name}.raw") (lib.attrValues nixosConfig.config.disko.devices.disk)}
|
||||
# shellcheck disable=SC2154
|
||||
mkdir -p "$out"
|
||||
${lib.concatMapStringsSep "\n" (disk: "cp ${disk.name}.raw \"$out\"/${disk.name}.raw") (lib.attrValues nixosConfig.config.disko.devices.disk)}
|
||||
${extraPostVM}
|
||||
'';
|
||||
builder = ''
|
||||
# running udev, stolen from stage-1.sh
|
||||
echo "running udev..."
|
||||
ln -sfn /proc/self/fd /dev/fd
|
||||
ln -sfn /proc/self/fd/0 /dev/stdin
|
||||
ln -sfn /proc/self/fd/1 /dev/stdout
|
||||
ln -sfn /proc/self/fd/2 /dev/stderr
|
||||
mkdir -p /etc/udev
|
||||
ln -sfn ${systemToInstall.config.system.build.etc}/etc/udev/rules.d /etc/udev/rules.d
|
||||
mkdir -p /dev/.mdadm
|
||||
${pkgs.systemdMinimal}/lib/systemd/systemd-udevd --daemon
|
||||
udevadm trigger --action=add
|
||||
udevadm settle
|
||||
|
||||
# populate nix db, so nixos-install doesn't complain
|
||||
export NIX_STATE_DIR=$TMPDIR/state
|
||||
nix-store --load-db < ${pkgs.closureInfo {
|
||||
rootPaths = [ systemToInstall.config.system.build.toplevel ];
|
||||
}}/registration
|
||||
|
||||
${systemToInstall.config.system.build.diskoScript}
|
||||
${pkgs.nixos-install-tools}/bin/nixos-install --system ${systemToInstall.config.system.build.toplevel} --keep-going --no-channel-copy -v --no-root-password --option binary-caches ""
|
||||
'';
|
||||
QEMU_OPTS = lib.concatMapStringsSep " " (disk: "-drive file=${disk.name}.raw,if=virtio,cache=unsafe,werror=report") (lib.attrValues nixosConfig.config.disko.devices.disk);
|
||||
in {
|
||||
pure = pkgs.vmTools.runInLinuxVM (pkgs.runCommand name {
|
||||
buildInputs =dependencies;
|
||||
inherit preVM QEMU_OPTS;
|
||||
memSize = 1024;
|
||||
} builder);
|
||||
impure = diskoLib.writeCheckedBash { inherit checked pkgs; } name ''
|
||||
set -efu
|
||||
export PATH=${lib.makeBinPath dependencies}
|
||||
showUsage() {
|
||||
cat <<\USAGE
|
||||
Usage: $script [options]
|
||||
|
||||
memSize = 1024;
|
||||
} ''
|
||||
# running udev, stolen from stage-1.sh
|
||||
echo "running udev..."
|
||||
ln -sfn /proc/self/fd /dev/fd
|
||||
ln -sfn /proc/self/fd/0 /dev/stdin
|
||||
ln -sfn /proc/self/fd/1 /dev/stdout
|
||||
ln -sfn /proc/self/fd/2 /dev/stderr
|
||||
mkdir -p /etc/udev
|
||||
ln -sfn ${systemToInstall.config.system.build.etc}/etc/udev/rules.d /etc/udev/rules.d
|
||||
mkdir -p /dev/.mdadm
|
||||
${pkgs.systemdMinimal}/lib/systemd/systemd-udevd --daemon
|
||||
udevadm trigger --action=add
|
||||
udevadm settle
|
||||
Options:
|
||||
* --pre-format-files <src> <dst>
|
||||
copies the src to the dst on the VM, before disko is run
|
||||
This is useful to provide secrets like LUKS keys, or other files you need for formating
|
||||
* --post-format-files <src> <dst>
|
||||
copies the src to the dst on the finished image.
|
||||
These end up in the images later and is useful if you want to add some extra stateful files
|
||||
USAGE
|
||||
}
|
||||
|
||||
# populate nix db, so nixos-install doesn't complain
|
||||
export NIX_STATE_DIR=$TMPDIR/state
|
||||
nix-store --load-db < ${pkgs.closureInfo {
|
||||
rootPaths = [ systemToInstall.config.system.build.toplevel ];
|
||||
}}/registration
|
||||
export out=$PWD
|
||||
TMPDIR=$(mktemp -d); export TMPDIR
|
||||
trap 'rm -rf "$TMPDIR"' EXIT
|
||||
cd "$TMPDIR"
|
||||
|
||||
${systemToInstall.config.system.build.diskoScript}
|
||||
${pkgs.nixos-install-tools}/bin/nixos-install --system ${systemToInstall.config.system.build.toplevel} --keep-going --no-channel-copy -v --no-root-password --option binary-caches ""
|
||||
'')
|
||||
mkdir copy_before_disko copy_after_disko
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--pre-format-files)
|
||||
src=$2
|
||||
dst=$3
|
||||
cp --reflink=auto -r "$src" copy_before_disko/"$(echo "$dst" | base64)"
|
||||
shift 2
|
||||
;;
|
||||
--post-format-files)
|
||||
src=$2
|
||||
dst=$3
|
||||
cp --reflink=auto -r "$src" copy_after_disko/"$(echo "$dst" | base64)"
|
||||
shift 2
|
||||
;;
|
||||
*)
|
||||
showUsage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
export preVM=${diskoLib.writeCheckedBash { inherit pkgs checked; } "preVM.sh" ''
|
||||
set -efu
|
||||
mv copy_before_disko copy_after_disko xchg/
|
||||
${preVM}
|
||||
''}
|
||||
export postVM=${diskoLib.writeCheckedBash { inherit pkgs checked; } "postVM.sh" postVM}
|
||||
export origBuilder=${pkgs.writeScript "disko-builder" ''
|
||||
set -eu
|
||||
export PATH=${lib.makeBinPath dependencies}
|
||||
for src in /tmp/xchg/copy_before_disko/*; do
|
||||
dst=$(basename "$src" | base64 -d)
|
||||
mkdir -p "$(dirname "$dst")"
|
||||
cp -r "$src" "$dst"
|
||||
done
|
||||
set -f
|
||||
${builder}
|
||||
set +f
|
||||
for dir in /tmp/xchg/copy_after_disko/*; do
|
||||
dst=/mnt/$(basename "$src" | base64 -d)
|
||||
mkdir -p "$(dirname "$dst")"
|
||||
cp -r "$src" "$dst"
|
||||
done
|
||||
''}
|
||||
export QEMU_OPTS=${lib.escapeShellArg "${QEMU_OPTS} -m 1024"}
|
||||
${pkgs.bash}/bin/sh -e ${pkgs.vmTools.vmRunCommand pkgs.vmTools.qemuCommandLinux}
|
||||
cd /
|
||||
'';
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user