blob: 4c915ceade00f4396d4246edf9d2bba9e0deebbb (
plain) (
blame)
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
|
#!/bin/bash
set -e
print_usage() {
cat 1>&2 <<EOF
Usage: $0 <rootfs_directory> <image_file>
Package the contents of a debian root filesystem into a binary image file, ready to be burned onto an sd card.
This script will create an image with a single root partition.
EOF
}
fail() {
echo "$1" >&2
exit 1
}
log() {
echo "mkrootimg: $1" >&2
}
# Directory to package
rootfs="$1"
# Binary image file
image="$2"
# Contains temporary build files
builddir=$(mktemp -d)
([ -n "$rootfs" ] && [ -n "$image" ]) || fail "$(print_usage)"
[ -d "$rootfs" ] || fail "$rootfs does not exist or is not a directory"
[ "$EUID" -eq 0 ] || fail "$0 must be run as root"
cleanup() {
set +e
umount --lazy "$builddir/mount" 2> /dev/null
sync
losetup --detach "$rootfs_loop" 2> /dev/null
rm -rf "$builddir"
trap - 0 1 2 3 6
}
trap cleanup 0 1 2 3 6
# Partition layout
#
# Content Size
# ---------------------------------------------
# reserved 1024k (1M, for e.g. a bootloader)
# rootfs as required
# size in bytes
reserved_size=$((1024*1024))
rootfs_raw_size=$(du --block-size=1 -s "$rootfs" | awk '{ print $1 }')
# as overhead for journaling and reserved blocks, 25% is added
rootfs_size=$(( rootfs_raw_size + rootfs_raw_size * 25 / 100 ))
image_size=$(( reserved_size + rootfs_size + 1))
# create empty image file
log "creating empty image"
rm -rf "$image"
truncate -s "$image_size" "$image"
# round up 4096-byte sector size to avoid rounding errors
truncate -s %4096 "$image"
# write partition table to image
parted "$image" --script mklabel msdos
parted "$image" --script mkpart primary ext4 "$reserved_size"B $(( reserved_size + rootfs_size ))B
# set up temporary loop devices
log "setting up image loop devices"
rootfs_loop=$(losetup \
--offset "$reserved_size" \
--sizelimit "$rootfs_size" \
--find \
--show \
"$image")
# format partitions
log "formatting partitions"
mkfs.ext4 -O^64bit "$rootfs_loop" &> /dev/null
# mount partitions
log "mounting partitions"
mkdir -p "$builddir/mount"
mount "$rootfs_loop" "$builddir/mount"
# copy root filesystem to image
log "copying root filesystem"
rsync -a "$rootfs/" "$builddir/mount/"
log "cleaning up"
cleanup
log "done"
|