-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgenerate-image.sh
executable file
·134 lines (104 loc) · 3.01 KB
/
generate-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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/bin/sh
set -eu
TARGET_ARMBIAN="${1:-Bookworm_current}"
ARMBIAN_DOWNLOAD_URL="https://github.com/armbian/community/releases/download/24.2.0-trunk.540/Armbian_community_24.2.0-trunk.540_Odroidhc4_bookworm_current_6.6.16.img.xz"
SECTOR_SIZE=512
BOOT_START=2048
IMG=odroid-hc4.img
# In MB
BOOT_SIZE=128
BOOT_SECTORS=$(( $BOOT_SIZE*1024*1024 / $SECTOR_SIZE ))
STARTUP_MNTPOINT="/mnt"
ROOT_MNTPOINT="/tmp/odroid"
cleanup() {
set +e
sudo umount "$STARTUP_MNTPOINT"
sudo umount "$ROOT_MNTPOINT"
losetup -a | grep "odroid" | awk '{print $1}' | sed 's/://' |
while read DEV; do
sudo losetup -d "$DEV"
done
rm -f "$TARGET_ARMBIAN"
set -e
}
get_armbian() {
if ! test -f "$1"; then
wget -O "$1.xz" -c "$ARMBIAN_DOWNLOAD_URL"
xz -d "$1.xz"
fi
}
get_startup() {
sudo mkdir -p "$STARTUP_MNTPOINT"
START=$(fdisk -l "$1" | grep "^$1" | awk '{print $2}')
sudo mount -o "offset=$(( $START * 512 ))" "$1" "$STARTUP_MNTPOINT"
# Copy Kernel, DTB and ramdisk
for T in dtb Image uInitrd ; do
cp -Lr "$STARTUP_MNTPOINT/boot/$T" .
done
# Inject update-bootloader
cp -rav zz-update-boot-images "$STARTUP_MNTPOINT"/etc/kernel/postinst.d/zz-update-boot-images
chmod u+x "$STARTUP_MNTPOINT"/etc/kernel/postinst.d/zz-update-boot-images
# Inject fancontrol
cp -rav fancontrol "$STARTUP_MNTPOINT"/etc/fancontrol
sudo umount "$STARTUP_MNTPOINT"
}
partsize() {
T="$1"
sfdisk --dump "$T" | grep "^$T" | awk '{print $6}' | sed 's/,//'
}
find_device() {
IMG="$1"
losetup --json |
jq -r ".loopdevices[] | select(.[\"back-file\"] |strings | test(\"$IMG\")).name"
}
mount_and_run_loop() {
OFFSET="$1"
UMOUNT="$2"
shift 2
sudo losetup -P -o "$OFFSET" -f "$IMG"
sleep 1
DEV="$(find_device "$IMG")"
$@ "$DEV"
if "$UMOUNT"; then
sudo losetup -d "$DEV"
sleep 1
fi
}
trap cleanup EXIT
# Start by cleaning the environment
cleanup
get_armbian "$TARGET_ARMBIAN"
get_startup "$TARGET_ARMBIAN"
mkdir -p "$ROOT_MNTPOINT"
truncate -s 0 "$IMG"
PSIZE=$(( $BOOT_START * $SECTOR_SIZE ))
PSIZE=$(( $PSIZE + $BOOT_SECTORS ))
PSIZE=$(( $PSIZE + $(partsize "$TARGET_ARMBIAN") ))
dd if=/dev/zero count=0 seek=$PSIZE bs=$SECTOR_SIZE of="$IMG"
sfdisk "$IMG" <<-_END_
label: dos
label-id: 0x03823826
device: mmc
unit: sectors
sector-size: $SECTOR_SIZE
mmc1 : start=$BOOT_START, size=$BOOT_SECTORS, type=c
mmc2 : start=$(( $BOOT_START + $BOOT_SECTORS )), size=$(partsize "$TARGET_ARMBIAN"), type=83
_END_
mount_and_run_loop "$(( $BOOT_START * $SECTOR_SIZE ))" \
true \
sudo mkfs.fat -F 32
# Add the original partition to the new one
START=$(( $BOOT_START + $BOOT_SECTORS ))
dd if="$TARGET_ARMBIAN" of="$IMG" seek=$START skip=8192 bs=$SECTOR_SIZE
# XXX use mount_and_run_loop
sudo losetup -P -o "$(( $BOOT_START * $SECTOR_SIZE ))" -f "$IMG"
sleep 1
# head -1 is the workaround to get only the last one
DEV="$(find_device "$IMG" | head -1)"
sleep 1
sudo mount "$DEV" "$ROOT_MNTPOINT"
# Chainload Linux Bootloader
sudo cp -r boot.ini config.ini "$ROOT_MNTPOINT/"
sudo cp -r Image uInitrd dtb "$ROOT_MNTPOINT/"
sudo umount "$ROOT_MNTPOINT"
echo "[+] DONE"