forked from beriberikix/alpine-raspberry-pi
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmake-image
executable file
·142 lines (110 loc) · 3.6 KB
/
make-image
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
135
136
137
138
139
140
141
142
#!/usr/bin/env bash
function do_it () {
set -xe
local ALPINE_VERSION
local __TARGET_HOSTNAME
local __DEVICE_NAME
local __ROOT_PASSWORD
local __TLD
local __USERNAME
local __PASSWORD
local __LOCALE
local __TIMEZONE
local __DNS_SERVER
local __DNS_DOMAIN
local OUTPUT_IMG
local IMGID
local BOOT_PARTUUID
local ROOT_PARTUUID
local ROOT_PART_START
local ROOT_BLOCK_SIZE
local ROOT_MIN_SIZE
local PART_END
local FREE_START
ALPINE_VERSION="v0.13.2"
__TARGET_HOSTNAME="${TARGET_HOSTNAME:-raspberrypi}"
__DEVICE_NAME="${DEVICE_NAME:-sda}"
__ROOT_PASSWORD="${ROOT_PASSWORD:-raspberry}"
__TLD="${TLD:-lan}"
__USERNAME="${USERNAME:-pi}"
__PASSWORD="${PASSWORD:-raspberry}"
__LOCALE="${LOCALE:-us-us}"
__TIMEZONE="${TIMEZONE:-UTC}"
# shellcheck disable=SC2153
__DNS_SERVER="${DNS_SERVER}"
# shellcheck disable=SC2153
__DNS_DOMAIN="${DNS_DOMAIN}"
OUTPUT_IMG="/dist/target.img"
mkdir -p dist /dist
rm -Rf "${OUTPUT_IMG}"
truncate -s 2G "${OUTPUT_IMG}"
fdisk -H 255 -S 63 "${OUTPUT_IMG}" <<-EOF
o
n
p
1
+128MB
t
c
n
p
2
w
EOF
LOOP_DEV=$(losetup --partscan --show --find "${OUTPUT_IMG}")
BOOT_DEV="${LOOP_DEV}"p1
ROOT_DEV="${LOOP_DEV}"p2
# format partitions
mkfs.fat -F32 -n ALPINE "${BOOT_DEV}"
mkfs.ext4 "${ROOT_DEV}"
mkdir -p /alpine
mount --make-private "${ROOT_DEV}" /alpine
mkdir -p /alpine/boot
mount --make-private "${BOOT_DEV}" /alpine/boot
IMGID="$(dd if="${OUTPUT_IMG}" skip=440 bs=1 count=4 2>/dev/null | xxd -e | cut -f 2 -d' ')"
BOOT_PARTUUID="${IMGID}-01"
ROOT_PARTUUID="${IMGID}-02"
echo "boot partition uuid: ${BOOT_PARTUUID}"
echo "root partition uuid: ${ROOT_PARTUUID}"
apt-get update
curl https://raw.githubusercontent.com/alpinelinux/alpine-chroot-install/${ALPINE_VERSION}/alpine-chroot-install | sh
cp -R bootstrap/ /alpine/
/alpine/enter-chroot /bootstrap/00-environment.sh
/alpine/enter-chroot /bootstrap/01-kernel.sh "${__DEVICE_NAME}"
/alpine/enter-chroot /bootstrap/02-system.sh "${__TARGET_HOSTNAME}" "${__ROOT_PASSWORD}" "${__TLD}" "${__DEVICE_NAME}" "${__LOCALE}" "${__TIMEZONE}" "${__DNS_SERVER}" "${__DNS_DOMAIN}"
/alpine/enter-chroot /bootstrap/03-users.sh "${__USERNAME}" "${__PASSWORD}"
/alpine/enter-chroot /bootstrap/04-networking.sh "${__TARGET_HOSTNAME}"
/alpine/enter-chroot /bootstrap/05-services.sh
/alpine/enter-chroot /bootstrap/06-first-boot.sh "${__DEVICE_NAME}"
rm -rf /alpine/var/lib/apt/lists/*
rm -rf /alpine/var/cache/apk/*
rm -rf /alpine/root/*
rm -rf /alpine/bootstrap/
rm -rf /alpine/destroy /alpine/enter-chroot /alpine/etc/resolv.conf /alpine/env.sh
find /alpine -iname "*-" -delete
find /alpine -iname "*~" -delete
umount -lf /alpine
# shrink image
ROOT_PART_START=$(parted -ms "${OUTPUT_IMG}" unit B print | tail -n 1 | cut -d ':' -f 2 | tr -d 'B')
ROOT_BLOCK_SIZE=$(tune2fs -l "${ROOT_DEV}" | grep '^Block size:' | tr -d ' ' | cut -d ':' -f 2)
ROOT_MIN_SIZE=$(resize2fs -P "${ROOT_DEV}" | cut -d ':' -f 2 | tr -d ' ')
# shrink fs
e2fsck -f -p "${ROOT_DEV}"
resize2fs -p "${ROOT_DEV}" "${ROOT_MIN_SIZE}"
# shrink partition
PART_END=$((ROOT_PART_START + (ROOT_MIN_SIZE * ROOT_BLOCK_SIZE)))
parted ---pretend-input-tty "$OUTPUT_IMG" <<EOF
unit B
resizepart 2 ${PART_END}
yes
quit
EOF
losetup -d "${LOOP_DEV}"
# truncate free space
FREE_START=$(parted -ms "${OUTPUT_IMG}" unit B print free | tail -1 | cut -d ':' -f 2 | tr -d 'B')
truncate -s "${FREE_START}" "${OUTPUT_IMG}"
cp ${OUTPUT_IMG} "dist/alpine-rpi-${ALPINE_BRANCH}-${ARCH}.img"
#gzip -c "$OUTPUT_IMG" > "dist/alpine-rpi-${ALPINE_BRANCH}-${ARCH}.img.gz"
echo "DONE."
}
do_it "$@"