forked from lukechilds/dockerpi
-
Notifications
You must be signed in to change notification settings - Fork 1
/
entrypoint.sh
executable file
·102 lines (89 loc) · 3.03 KB
/
entrypoint.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
#!/bin/sh
GIB_IN_BYTES="1073741824"
target="${1:-pi2}"
image_path="/sdcard/filesystem.img"
zip_path="/filesystem.zip"
if [ ! -e $image_path ]; then
echo "No filesystem detected at ${image_path}!"
if [ -e $zip_path ]; then
echo "Extracting fresh filesystem..."
unzip $zip_path
mv -- *.img $image_path
else
exit 1
fi
fi
qemu-img info $image_path
image_size_in_bytes=$(qemu-img info --output json $image_path | grep "virtual-size" | awk '{print $2}' | sed 's/,//')
if [[ "$(($image_size_in_bytes % ($GIB_IN_BYTES * 2)))" != "0" ]]; then
new_size_in_gib=$((($image_size_in_bytes / ($GIB_IN_BYTES * 2) + 1) * 2))
echo "Rounding image size up to ${new_size_in_gib}GiB so it's a multiple of 2GiB..."
qemu-img resize $image_path "${new_size_in_gib}G"
fi
if [ "${target}" = "pi1" ]; then
emulator=qemu-system-arm
kernel="/root/qemu-rpi-kernel/kernel-qemu-4.19.50-buster"
dtb="/root/qemu-rpi-kernel/versatile-pb.dtb"
machine=versatilepb
memory=256m
root=/dev/sda2
nic="--net nic --net user,hostfwd=tcp::5022-:22"
elif [ "${target}" = "pi2" ]; then
emulator=qemu-system-arm
machine=raspi2b
memory=1024m
kernel_pattern=kernel7.img
dtb_pattern=bcm2709-rpi-2-b.dtb
append="dwc_otg.fiq_fsm_enable=0"
nic="-netdev user,id=net0,hostfwd=tcp::5022-:22 -device usb-net,netdev=net0"
elif [ "${target}" = "pi3" ]; then
emulator=qemu-system-aarch64
machine=raspi3b
memory=1024m
kernel_pattern=kernel8.img
dtb_pattern=bcm2710-rpi-3-b-plus.dtb
append="dwc_otg.fiq_fsm_enable=0"
nic="-netdev user,id=net0,hostfwd=tcp::5022-:22 -device usb-net,netdev=net0"
else
echo "Target ${target} not supported"
echo "Supported targets: pi1 pi2 pi3"
exit 2
fi
if [ "${kernel_pattern}" ] && [ "${dtb_pattern}" ]; then
fat_path="/fat.img"
echo "Extracting partitions"
fdisk -l ${image_path} \
| awk "/^[^ ]*1/{print \"dd if=${image_path} of=${fat_path} bs=512 skip=\"\$4\" count=\"\$6}" \
| sh
echo "Extracting boot filesystem"
fat_folder="/fat"
mkdir -p "${fat_folder}"
fatcat -x "${fat_folder}" "${fat_path}"
# add ssh file to boot folder to enable sshd on startup
# note: already included in the image via enable-ssh-for-image.sh
#echo "Add /boot/ssh to enable sshd on startup"
#touch ssh
#mcopy -i "${fat_path}" ssh ::ssh
root=/dev/mmcblk0p2
echo "Searching for kernel='${kernel_pattern}'"
kernel=$(find "${fat_folder}" -name "${kernel_pattern}")
echo "Searching for dtb='${dtb_pattern}'"
dtb=$(find "${fat_folder}" -name "${dtb_pattern}")
fi
if [ "${kernel}" = "" ] || [ "${dtb}" = "" ]; then
echo "Missing kernel='${kernel}' or dtb='${dtb}'"
exit 2
fi
echo "Booting QEMU machine \"${machine}\" with kernel=${kernel} dtb=${dtb}"
exec ${emulator} \
--machine "${machine}" \
--cpu arm1176 \
--m "${memory}" \
--drive "format=raw,file=${image_path}" \
${nic} \
--dtb "${dtb}" \
--kernel "${kernel}" \
--append "rw earlyprintk loglevel=8 console=ttyAMA0,115200 dwc_otg.lpm_enable=0 root=${root} rootwait panic=1 ${append}" \
--no-reboot \
--display none \
--serial mon:stdio