summaryrefslogtreecommitdiff
path: root/lb2img.sh
blob: 8a5517182f227c0b5a8cd42de4435aac5cb8ab5f (plain)
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
#!/bin/sh

# (C) 2013-2015 Fathi Boudra <fathi.boudra@linaro.org>

# Convert tarball (live-build or other) to raw image

set -e

PROGNAME=$(basename $0)
TARGZFILE=
IMGFILE=

usage() {
        echo "usage: ${PROGNAME} <targzfile> <imgfile>"
        echo "e.g. ${PROGNAME} ${TARGZFILE} ${IMGFILE}"
        exit 1
}

TARGZFILE=$1
IMGFILE=$2

# we must provide parameters
[ -n "${TARGZFILE}" ] || usage
[ -n "${IMGFILE}" ] || usage

# we must be root
[ $(whoami) = "root" ] || { echo "E: You must be root" && exit 1; }

# we must have few tools
MKFS=$(which mkfs.ext4) || { echo "E: You must have mkfs.ext4" && exit 1; }
TUNE2FS=$(which tune2fs) || { echo "E: You must have tune2fs" && exit 1; }
QEMUIMG=$(which qemu-img) || { echo "E: You must have qemu-img" && exit 1; }

${QEMUIMG} create -f raw ${IMGFILE} 1G
DEVICE=$(losetup --find --show ${IMGFILE})

echo "I: Create filesystem"
${MKFS} -L cirros-rootfs -O ^has_journal ${DEVICE}

echo "I: Tune filesystem"
${TUNE2FS} -c 0 -i 0 ${DEVICE}

echo "I: Mount device on local filesystem"
MOUNTDIR=$(mktemp -d /tmp/${PROGNAME}.XXXXXX)
mount ${DEVICE} ${MOUNTDIR}

[ $(tar -tf ${TARGZFILE} | head -n 1) = "binary/" ] && TAR_EXTRA_OPTS="--strip-components=1"
tar -zxf ${TARGZFILE} -C ${MOUNTDIR} --numeric-owner ${TAR_EXTRA_OPTS}

mount -t proc proc ${MOUNTDIR}/proc

cat > ${MOUNTDIR}/runme.sh << EOF
rm -f /etc/ssh/ssh_host_*_key*
EOF
chroot ${MOUNTDIR} /bin/bash -x runme.sh
rm -f ${MOUNTDIR}/runme.sh

cp -a ${MOUNTDIR}/boot/vmlinuz* .
cp -a ${MOUNTDIR}/boot/initrd.img* .

head -n -1 ${MOUNTDIR}/etc/rc.local > rc.local.tmp
cat >> rc.local.tmp << EOF
# Generate the SSH keys if non-existent
test -f /etc/ssh/ssh_host_dsa_key || dpkg-reconfigure openssh-server

exit 0
EOF
mv rc.local.tmp ${MOUNTDIR}/etc/rc.local

umount -l ${MOUNTDIR}/proc || true
umount ${DEVICE}
rm -rf ${MOUNTDIR}
losetup --detach ${DEVICE}

gzip -9 ${IMGFILE}

echo "I: Done"