summaryrefslogtreecommitdiff
path: root/recipes-images/images/files/library/genext3fs.sh
blob: ffcf0609103095a22919f0b31c858fa3f30445c3 (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
78
79
80
#!/bin/sh
#creates a file containing a ext3 binary blob of the content of the ../rootfs folder

# sometimes we need the binary echo, not the shell builtin
ECHO=`which echo`

MOUNTPOINT="mnt/trdx-rootfs"

Usage()
{
	echo "creates a file containing a ext3 binary blob. Output file name taken from command line"
	echo "Usage: genext3fs.sh [OPTION]... dest_file_name"
	echo "-h : Prints this message"
	echo "-b : Sets the partition size in MBytes, default 256"
	echo "-d : Selects the directory which contains the partition content, default ../rootfs"
	echo ""
}

PARTITIONSIZE=256
SRCPATH=../rootfs

while getopts "b:d:h" Option ; do
	case $Option in
		h) Usage
			# Exit if only usage (-h) was specfied.
			if [[ "$#" -eq "1" ]] ; then
				exit 10
			fi
			exit 0
			;;
		b) PARTITIONSIZE=$OPTARG
			;;
		d) SRCPATH=$OPTARG
			;;
	esac
done
#adjust the commandline arg for the now used options
shift $(($OPTIND - 1))

#create the file used for the loopbackdevice and format it for ext3
#answer y to "is not a block special device"
dd if=/dev/zero of=$@ bs=1024k count=$PARTITIONSIZE
mkfs.ext3 -F -L rootfs $@
#disable fsck checks based on mount count or time interval
tune2fs -c 0 -i 0 $@

#prepare mountpoint for the loopdevice 
sudo mkdir -p $MOUNTPOINT
sudo umount $MOUNTPOINT &> /dev/null
sudo rm -rf $MOUNTPOINT/*
#mount the file as a loopdevice 
#there seems to be a race between mkfs.ext3 not yet finished and mount already trying to mount, so try until it works
MOUNTED=0
while [ "$MOUNTED" -eq  "0" ] ; do
	sync
	sleep 1
	sudo mount $@ $MOUNTPOINT/ -o loop -t ext3
	MOUNTED=`mount | grep -c "$MOUNTPOINT"`
done
#extract rootfs into the file
sudo cp -rpP $SRCPATH/* $MOUNTPOINT
if [ "$?" -ne "0" ] ; then
	$ECHO -e "\033[1mCopying the rootfs failed.\033[0m"
	echo "Check for error messages from cp"
	sudo rm $@
	exit 1
fi

#unmount again
sudo umount $MOUNTPOINT

#if the mounting was unsuccesful all rootfs data now still is in MOUNTPOINT, and $@ contains an empty fs
#delete $@ in that case to fail early
sync
FAILED=`ls $MOUNTPOINT | wc -l`
if [ "$FAILED" -ne "0" ] ; then
	$ECHO -e "\033[1mMounting the loopdevice $@ failed.\033[0m"
	sudo rm $@
	exit 1
fi