1
0

build-toolkit.sh 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #!/usr/bin/env bash
  2. # Build the FAT32 USB toolkit image for the PCL PoC VM.
  3. # Requires: sfdisk, mkfs.vfat (dosfstools), mtools, truncate, dd.
  4. set -euo pipefail
  5. ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  6. PCL_ZIP="${PCL_ZIP:-}"
  7. if [[ -z "$PCL_ZIP" ]]; then
  8. PCL_ZIP="$(find "$ROOT/.." -maxdepth 1 -type f -name 'PCL 正式版 2.99.0.1.zip' -print -quit)"
  9. fi
  10. if [[ -z "$PCL_ZIP" ]]; then
  11. PCL_ZIP="$(find "$ROOT/.." -maxdepth 1 -type f -name 'PCL*.zip' -print -quit)"
  12. fi
  13. if [[ -z "$PCL_ZIP" || ! -f "$PCL_ZIP" ]]; then
  14. echo "PCL 2.99.0.1 zip not found. Set PCL_ZIP=/path/to/PCL 正式版 2.99.0.1.zip" >&2
  15. exit 1
  16. fi
  17. HASH="$(sha256sum "$PCL_ZIP" | awk '{print $1}')"
  18. EXPECTED="4d239a62ed66fb9ebcf4633fd881eb098e9a7e4f296f0e414b58aa2f1f7f7830"
  19. if [[ "$HASH" != "$EXPECTED" ]]; then
  20. echo "PCL zip hash mismatch" >&2
  21. echo " got: $HASH" >&2
  22. echo " expected: $EXPECTED" >&2
  23. exit 1
  24. fi
  25. for tool in sfdisk mkfs.vfat mcopy mmd mdir truncate dd; do
  26. if ! command -v "$tool" >/dev/null 2>&1; then
  27. echo "missing tool: $tool" >&2
  28. exit 1
  29. fi
  30. done
  31. cp -f "$PCL_ZIP" "$ROOT/toolkit/pcl-test/PCL-2.99.0.1.zip"
  32. rm -f "$ROOT/toolkit.img" "$ROOT/part.img"
  33. truncate -s 512M "$ROOT/toolkit.img"
  34. printf 'label: dos\nstart=2048, size=1046528, type=c\n' | sfdisk -q "$ROOT/toolkit.img"
  35. # FAT32 filesystem for the 511 MiB partition starting at 1 MiB.
  36. mkfs.vfat -C -F 32 -n PCLTOOL "$ROOT/part.img" 523264 >/dev/null
  37. dd if="$ROOT/part.img" of="$ROOT/toolkit.img" bs=1M seek=1 conv=notrunc status=none
  38. rm -f "$ROOT/part.img"
  39. mcopy -i "$ROOT/toolkit.img@@1M" -s "$ROOT/toolkit/autounattend.xml" "$ROOT/toolkit/pcl-test" ::
  40. echo "built: $ROOT/toolkit.img"
  41. mdir -i "$ROOT/toolkit.img@@1M" ::/