-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathassemble-image.sh
executable file
·83 lines (70 loc) · 2.03 KB
/
assemble-image.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/bin/bash
set -euo pipefail
cleanup() {
set +e
umount loopmount/boot
umount loopmount
rmdir loopmount
losetup -d /dev/loop7
set -e
}
trap cleanup EXIT
if [[ "`id -u`" -ne 0 ]]
then
echo "This script MUST be run as root." 1>&2
exec sudo "$0"
fi
declare -a neededpackages
neededpackages=()
for cmd in curl xz fallocate losetup partprobe mount tar lbzip2 docker
do
which $cmd > /dev/null 2>&1 ||
case $cmd in
curl) neededpackages+=(curl)
;;
xz) neededpackages+=(xz-utils)
;;
fallocate) neededpackages+=(util-linux)
;;
losetup) neededpackages+=(mount)
;;
partprobe) neededpackages+=(parted)
;;
mount) neededpackages+=(mount)
;;
tar) neededpackages+=(tar)
;;
lbzip2) neededpackages+=(lbzip2)
;;
docker) neededpackages+=(docker.io)
;;
esac
done
if [[ "${#neededpackages[@]}" -gt 0 ]]
then
DEBIAN_FRONTEND=noninteractive
export DEBIAN_FRONTEND
apt -y update
apt -y install --no-install-recommends "${neededpackages[@]}"
fi
pikvmostarball=pikvm-os.tar.bz2
imgfilename="${TMPDIR-/var/tmp}/v2-hdmiusb-rpi4-latest.img"
if ! [[ -r "$pikvmostarball" ]]
then
if ! [[ -r "$imgfilename" ]]
then
curl -fLSo "${imgfilename}.xz" 'https://files.pikvm.org/images/v2-hdmiusb-rpi4-latest.img.xz'
xz -T0 -dc "${imgfilename}.xz" | dd of="$imgfilename" bs=16MiB conv=sparse
fallocate -d "$imgfilename"
fi
losetup /dev/loop7 "$imgfilename"
partprobe /dev/loop7
mkdir -p loopmount
mount /dev/loop7p3 loopmount
mount /dev/loop7p1 loopmount/boot
(cd loopmount; tar --numeric-owner --xattrs --acls -cSpf - .) | lbzip2 -c - > "$pikvmostarball"
fi
cleanup
now="`date +%Y%m%dT%H%M`"
docker build -t "ghcr.io/prototyped/pikvm:$now" .
docker tag ghcr.io/prototyped/pikvm:{"$now",latest}