aboutsummaryrefslogtreecommitdiff
path: root/mkuserimg.sh
blob: c0efdb8eb7102453c3d40f6a43cceb8747153744 (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
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
#!/bin/bash
#

function usage() {
cat<<EOT
Usage:
mkuserimg.sh MKEXT2IMG TUNE2FS E2FSCK SRC_DIR OUTPUT_FILE EXT_VARIANT [LABEL]
EOT
}

if [ $# -ne 6 -a $# -ne 7 ]; then
  usage
  exit 1
fi

MKEXT2IMG=$1
if [ ! -x $MKEXT2IMG -o ! -f $MKEXT2IMG ]; then
  echo "Can not find executable $MKEXT2IMG!"
  exit 2
fi

TUNE2FS=$2
if [ ! -x $TUNE2FS -o ! -f $TUNE2FS ]; then
  echo "Can not find executable $TUNE2FS!"
  exit 3
fi

E2FSCK=$3
if [ ! -x $E2FSCK -o ! -f $E2FSCK ]; then
  echo "Can not find executable $E2FSCK!"
  exit 4
fi

SRC_DIR=$4
if [ ! -d $SRC_DIR ]; then
  echo "Can not find directory $SRC_DIR!"
  exit 5
fi

OUTPUT_FILE=$5
EXT_VARIANT=$6
LABEL=$7

case $EXT_VARIANT in
  ext2) ;;
  ext3) ;;
  ext4) ;;
  *) echo "Only ext2, ext3, ext4 are supported!"; exit 6 ;;
esac

num_blocks=`du -sk $SRC_DIR | tail -n1 | awk '{print $1;}'`
if [ $num_blocks -lt 20480 ]; then
  extra_blocks=3072
else
  extra_blocks=20480
fi
num_blocks=`expr $num_blocks + $extra_blocks`
num_inodes=`find $SRC_DIR | wc -l`
num_inodes=`expr $num_inodes + 500`

echo "num_blocks=$num_blocks"
echo "num_inodes=$num_inodes"

echo "$MKEXT2IMG -a -d $SRC_DIR -b $num_blocks -N $num_inodes -m 0 $OUTPUT_FILE"
$MKEXT2IMG -a -d $SRC_DIR -b $num_blocks -N $num_inodes -m 0 $OUTPUT_FILE
if [ $? -ne 0 ]; then
  exit 7
fi

if [ -n $LABEL ]; then
  echo "$TUNE2FS -L $LABEL $OUTPUT_FILE"
  $TUNE2FS -L $LABEL $OUTPUT_FILE
  if [ $? -ne 0 ]; then
    exit 8
  fi
fi

if [ $EXT_VARIANT = "ext3" ]; then
  echo "$TUNE2FS -j $OUTPUT_FILE"
  $TUNE2FS -j $OUTPUT_FILE
  if [ $? -ne 0 ]; then
    exit 9
  fi
elif [ $EXT_VARIANT = "ext4" ]; then
  echo "$TUNE2FS -j -O extents,uninit_bg,dir_index $OUTPUT_FILE"
  $TUNE2FS -j -O extents,uninit_bg,dir_index $OUTPUT_FILE
  if [ $? -ne 0 ]; then
    exit 10
  fi
fi

echo "$TUNE2FS -C 1 $OUTPUT_FILE"
$TUNE2FS -C 1 $OUTPUT_FILE
if [ $? -ne 0 ]; then
  exit 11
fi

echo "$E2FSCK -fy $OUTPUT_FILE"
$E2FSCK -fy $OUTPUT_FILE
if [ $? -ge 4 ]; then
  echo "$E2FSCK returns value $?, no less than 4!"
  exit 12
else
  exit 0
fi