aboutsummaryrefslogtreecommitdiff
path: root/images/cubieboard-2/scripts/mkrootimg
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"