|
41 | 41 | util-linux
|
42 | 42 | findutils
|
43 | 43 | ] ++ cfg.extraDependencies;
|
| 44 | + |
| 45 | + prepareFile = name: content: '' |
| 46 | + out="$(echo "${name}" | base64)" |
| 47 | + ${if lib.isStorePath content |
| 48 | + then ''cp --reflink=auto -r "${content}" "$out"'' |
| 49 | + else content |
| 50 | + } |
| 51 | + ''; |
| 52 | + |
| 53 | + prepareFiles = '' |
| 54 | + ( |
| 55 | + cd $TMPDIR/xchg |
| 56 | + mkdir -p pre_format_files post_format_files |
| 57 | + cd pre_format_files |
| 58 | + ${lib.concatStringsSep "\n" (lib.attrValues (lib.mapAttrs prepareFile cfg.preFormatFiles))} |
| 59 | + cd ../post_format_files |
| 60 | + ${lib.concatStringsSep "\n" (lib.attrValues (lib.mapAttrs prepareFile cfg.postFormatFiles))} |
| 61 | + ) |
| 62 | + ''; |
| 63 | + |
44 | 64 | preVM = ''
|
45 | 65 | ${lib.concatMapStringsSep "\n" (disk: "${pkgs.qemu}/bin/qemu-img create -f ${imageFormat} ${disk.name}.${imageFormat} ${disk.imageSize}") (lib.attrValues diskoCfg.devices.disk)}
|
46 | 66 | # This makes disko work, when canTouchEfiVariables is set to true.
|
|
58 | 78 | closureInfo = pkgs.closureInfo {
|
59 | 79 | rootPaths = [ systemToInstall.config.system.build.toplevel ];
|
60 | 80 | };
|
| 81 | + |
61 | 82 | partitioner = ''
|
62 |
| - set -efux |
| 83 | + set -eux |
| 84 | +
|
| 85 | + set +f |
| 86 | + for src in /tmp/xchg/pre_format_files/*; do |
| 87 | + [ -e "$src" ] || continue |
| 88 | + dst=$(basename "$src" | base64 -d) |
| 89 | + mkdir -p "$(dirname "$dst")" |
| 90 | + cp -r "$src" "$dst" |
| 91 | + done |
| 92 | + set -f |
| 93 | +
|
63 | 94 | # running udev, stolen from stage-1.sh
|
64 | 95 | echo "running udev..."
|
65 | 96 | ln -sfn /proc/self/fd /dev/fd
|
|
79 | 110 | export IN_DISKO_TEST=1
|
80 | 111 | ''}
|
81 | 112 | ${systemToInstall.config.system.build.diskoScript}
|
| 113 | +
|
| 114 | + set +f |
| 115 | + for src in /tmp/xchg/post_format_files/*; do |
| 116 | + [ -e "$src" ] || continue |
| 117 | + dst=/mnt/$(basename "$src" | base64 -d) |
| 118 | + mkdir -p "$(dirname "$dst")" |
| 119 | + cp -r "$src" "$dst" |
| 120 | + done |
| 121 | + set -f |
82 | 122 | '';
|
83 | 123 |
|
84 | 124 | installer = lib.optionalString cfg.copyNixStore ''
|
|
107 | 147 | system.build.diskoImages = vmTools.runInLinuxVM (pkgs.runCommand cfg.name
|
108 | 148 | {
|
109 | 149 | buildInputs = dependencies;
|
110 |
| - inherit preVM postVM QEMU_OPTS; |
| 150 | + inherit postVM QEMU_OPTS; |
111 | 151 | inherit (diskoCfg) memSize;
|
| 152 | + preVM = preVM + prepareFiles; |
112 | 153 | }
|
113 | 154 | (partitioner + installer));
|
114 | 155 |
|
|
139 | 180 | trap 'rm -rf "$TMPDIR"' EXIT
|
140 | 181 | cd "$TMPDIR"
|
141 | 182 |
|
142 |
| - mkdir copy_before_disko copy_after_disko |
| 183 | + mkdir pre_format_files post_format_files |
143 | 184 |
|
144 | 185 | while [[ $# -gt 0 ]]; do
|
145 | 186 | case "$1" in
|
146 | 187 | --pre-format-files)
|
147 | 188 | src=$2
|
148 | 189 | dst=$3
|
149 |
| - cp --reflink=auto -r "$src" copy_before_disko/"$(echo "$dst" | base64)" |
| 190 | + cp --reflink=auto -r "$src" pre_format_files/"$(echo "$dst" | base64)" |
150 | 191 | shift 2
|
151 | 192 | ;;
|
152 | 193 | --post-format-files)
|
153 | 194 | src=$2
|
154 | 195 | dst=$3
|
155 |
| - cp --reflink=auto -r "$src" copy_after_disko/"$(echo "$dst" | base64)" |
| 196 | + cp --reflink=auto -r "$src" post_format_files/"$(echo "$dst" | base64)" |
156 | 197 | shift 2
|
157 | 198 | ;;
|
158 | 199 | --build-memory)
|
|
174 | 215 |
|
175 | 216 | export preVM=${diskoLib.writeCheckedBash { inherit pkgs checked; } "preVM.sh" ''
|
176 | 217 | set -efu
|
177 |
| - mv copy_before_disko copy_after_disko xchg/ |
| 218 | + mv pre_format_files post_format_files xchg/ |
178 | 219 | origBuilder=${pkgs.writeScript "disko-builder" ''
|
179 | 220 | set -eu
|
180 | 221 | export PATH=${lib.makeBinPath dependencies}
|
181 |
| - for src in /tmp/xchg/copy_before_disko/*; do |
182 |
| - [ -e "$src" ] || continue |
183 |
| - dst=$(basename "$src" | base64 -d) |
184 |
| - mkdir -p "$(dirname "$dst")" |
185 |
| - cp -r "$src" "$dst" |
186 |
| - done |
187 |
| - set -f |
188 | 222 | ${partitioner}
|
189 |
| - set +f |
190 |
| - for src in /tmp/xchg/copy_after_disko/*; do |
191 |
| - [ -e "$src" ] || continue |
192 |
| - dst=/mnt/$(basename "$src" | base64 -d) |
193 |
| - mkdir -p "$(dirname "$dst")" |
194 |
| - cp -r "$src" "$dst" |
195 |
| - done |
196 | 223 | ${installer}
|
197 | 224 | ''}
|
198 | 225 | echo "export origBuilder=$origBuilder" > xchg/saved-env
|
|
0 commit comments