xref: /aosp_15_r20/system/extras/f2fs_utils/mkf2fsuserimg.sh (revision 288bf5226967eb3dac5cce6c939ccc2a7f2b4fe5)
1*288bf522SAndroid Build Coastguard Worker#!/bin/bash
2*288bf522SAndroid Build Coastguard Worker#
3*288bf522SAndroid Build Coastguard Worker# To call this script, make sure make_f2fs is somewhere in PATH
4*288bf522SAndroid Build Coastguard Worker
5*288bf522SAndroid Build Coastguard Workerfunction usage() {
6*288bf522SAndroid Build Coastguard Workercat<<EOT
7*288bf522SAndroid Build Coastguard WorkerUsage:
8*288bf522SAndroid Build Coastguard Worker${0##*/} OUTPUT_FILE SIZE
9*288bf522SAndroid Build Coastguard Worker         [-S] [-C FS_CONFIG] [-f SRC_DIR] [-D PRODUCT_OUT]
10*288bf522SAndroid Build Coastguard Worker         [-s FILE_CONTEXTS] [-t MOUNT_POINT] [-T TIMESTAMP] [-B block_map]
11*288bf522SAndroid Build Coastguard Worker         [-L LABEL] [--prjquota] [--casefold] [--compression] [--readonly]
12*288bf522SAndroid Build Coastguard Worker         [--sldc <num> [sload compression sub-options]] [-b <block_size>]
13*288bf522SAndroid Build Coastguard Worker<num>: number of the sload compression args, e.g.  -a LZ4 counts as 2
14*288bf522SAndroid Build Coastguard Worker       when sload compression args are not given, <num> must be 0,
15*288bf522SAndroid Build Coastguard Worker       and the default flags will be used.
16*288bf522SAndroid Build Coastguard WorkerNote: must conserve the option order
17*288bf522SAndroid Build Coastguard WorkerEOT
18*288bf522SAndroid Build Coastguard Worker}
19*288bf522SAndroid Build Coastguard Worker
20*288bf522SAndroid Build Coastguard Workerecho "in mkf2fsuserimg.sh PATH=$PATH"
21*288bf522SAndroid Build Coastguard Worker
22*288bf522SAndroid Build Coastguard WorkerMKFS_OPTS=""
23*288bf522SAndroid Build Coastguard WorkerSLOAD_OPTS=""
24*288bf522SAndroid Build Coastguard WorkerBLOCK_MAP_FILE=""
25*288bf522SAndroid Build Coastguard WorkerBLOCK_MAP_OPT=""
26*288bf522SAndroid Build Coastguard Worker
27*288bf522SAndroid Build Coastguard Workerif [ $# -lt 2 ]; then
28*288bf522SAndroid Build Coastguard Worker  usage
29*288bf522SAndroid Build Coastguard Worker  exit 1
30*288bf522SAndroid Build Coastguard Workerfi
31*288bf522SAndroid Build Coastguard Worker
32*288bf522SAndroid Build Coastguard WorkerOUTPUT_FILE=$1
33*288bf522SAndroid Build Coastguard WorkerSIZE=$2
34*288bf522SAndroid Build Coastguard Workershift; shift
35*288bf522SAndroid Build Coastguard Worker
36*288bf522SAndroid Build Coastguard WorkerSPARSE_IMG="false"
37*288bf522SAndroid Build Coastguard Workerif [[ "$1" == "-S" ]]; then
38*288bf522SAndroid Build Coastguard Worker  MKFS_OPTS+=" -S $SIZE"
39*288bf522SAndroid Build Coastguard Worker  SLOAD_OPTS+=" -S"
40*288bf522SAndroid Build Coastguard Worker  BLOCK_MAP_OPT+=" -S -M"
41*288bf522SAndroid Build Coastguard Worker  SPARSE_IMG="true"
42*288bf522SAndroid Build Coastguard Worker  shift
43*288bf522SAndroid Build Coastguard Workerfi
44*288bf522SAndroid Build Coastguard Worker
45*288bf522SAndroid Build Coastguard Workerif [[ "$1" == "-C" ]]; then
46*288bf522SAndroid Build Coastguard Worker  SLOAD_OPTS+=" -C $2"
47*288bf522SAndroid Build Coastguard Worker  shift; shift
48*288bf522SAndroid Build Coastguard Workerfi
49*288bf522SAndroid Build Coastguard Workerif [[ "$1" == "-f" ]]; then
50*288bf522SAndroid Build Coastguard Worker  SLOAD_OPTS+=" -f $2"
51*288bf522SAndroid Build Coastguard Worker  shift; shift
52*288bf522SAndroid Build Coastguard Workerfi
53*288bf522SAndroid Build Coastguard Workerif [[ "$1" == "-D" ]]; then
54*288bf522SAndroid Build Coastguard Worker  SLOAD_OPTS+=" -p $2"
55*288bf522SAndroid Build Coastguard Worker  shift; shift
56*288bf522SAndroid Build Coastguard Workerfi
57*288bf522SAndroid Build Coastguard Workerif [[ "$1" == "-s" ]]; then
58*288bf522SAndroid Build Coastguard Worker  SLOAD_OPTS+=" -s $2"
59*288bf522SAndroid Build Coastguard Worker  shift; shift
60*288bf522SAndroid Build Coastguard Workerfi
61*288bf522SAndroid Build Coastguard Workerif [[ "$1" == "-t" ]]; then
62*288bf522SAndroid Build Coastguard Worker  MOUNT_POINT=$2
63*288bf522SAndroid Build Coastguard Worker  shift; shift
64*288bf522SAndroid Build Coastguard Workerfi
65*288bf522SAndroid Build Coastguard Worker
66*288bf522SAndroid Build Coastguard Workerif [ -z $MOUNT_POINT ]; then
67*288bf522SAndroid Build Coastguard Worker  echo "Mount point is required"
68*288bf522SAndroid Build Coastguard Worker  exit 2
69*288bf522SAndroid Build Coastguard Workerfi
70*288bf522SAndroid Build Coastguard Worker
71*288bf522SAndroid Build Coastguard Workerif [[ ${MOUNT_POINT:0:1} != "/" ]]; then
72*288bf522SAndroid Build Coastguard Worker  MOUNT_POINT="/"$MOUNT_POINT
73*288bf522SAndroid Build Coastguard Workerfi
74*288bf522SAndroid Build Coastguard Worker
75*288bf522SAndroid Build Coastguard WorkerSLOAD_OPTS+=" -t $MOUNT_POINT"
76*288bf522SAndroid Build Coastguard Worker
77*288bf522SAndroid Build Coastguard Workerif [[ "$1" == "-T" ]]; then
78*288bf522SAndroid Build Coastguard Worker  SLOAD_OPTS+=" -T $2"
79*288bf522SAndroid Build Coastguard Worker  shift; shift
80*288bf522SAndroid Build Coastguard Workerfi
81*288bf522SAndroid Build Coastguard Worker
82*288bf522SAndroid Build Coastguard Workerif [[ "$1" == "-B" ]]; then
83*288bf522SAndroid Build Coastguard Worker  BLOCK_MAP_FILE="$2"
84*288bf522SAndroid Build Coastguard Worker  shift; shift
85*288bf522SAndroid Build Coastguard Workerfi
86*288bf522SAndroid Build Coastguard Worker
87*288bf522SAndroid Build Coastguard Workerif [[ "$1" == "-L" ]]; then
88*288bf522SAndroid Build Coastguard Worker  MKFS_OPTS+=" -l $2"
89*288bf522SAndroid Build Coastguard Worker  shift; shift
90*288bf522SAndroid Build Coastguard Workerfi
91*288bf522SAndroid Build Coastguard Worker
92*288bf522SAndroid Build Coastguard Workerif [[ "$1" == "--prjquota" ]]; then
93*288bf522SAndroid Build Coastguard Worker  MKFS_OPTS+=" -O project_quota,extra_attr"
94*288bf522SAndroid Build Coastguard Worker  shift;
95*288bf522SAndroid Build Coastguard Workerfi
96*288bf522SAndroid Build Coastguard Workerif [[ "$1" == "--casefold" ]]; then
97*288bf522SAndroid Build Coastguard Worker  MKFS_OPTS+=" -O casefold -C utf8"
98*288bf522SAndroid Build Coastguard Worker  shift;
99*288bf522SAndroid Build Coastguard Workerfi
100*288bf522SAndroid Build Coastguard Worker
101*288bf522SAndroid Build Coastguard Workerif [[ "$1" == "--compression" ]]; then
102*288bf522SAndroid Build Coastguard Worker  COMPRESS_SUPPORT=1
103*288bf522SAndroid Build Coastguard Worker  MKFS_OPTS+=" -O compression,extra_attr"
104*288bf522SAndroid Build Coastguard Worker  shift;
105*288bf522SAndroid Build Coastguard Workerfi
106*288bf522SAndroid Build Coastguard Workerif [[ "$1" == "--readonly" ]]; then
107*288bf522SAndroid Build Coastguard Worker  MKFS_OPTS+=" -O ro"
108*288bf522SAndroid Build Coastguard Worker  READONLY=1
109*288bf522SAndroid Build Coastguard Worker  shift;
110*288bf522SAndroid Build Coastguard Workerfi
111*288bf522SAndroid Build Coastguard Worker
112*288bf522SAndroid Build Coastguard Workerif [[ "$1" == "--sldc" ]]; then
113*288bf522SAndroid Build Coastguard Worker  if [ -z "$COMPRESS_SUPPORT" ]; then
114*288bf522SAndroid Build Coastguard Worker    echo "--sldc needs --compression flag"
115*288bf522SAndroid Build Coastguard Worker    exit 3
116*288bf522SAndroid Build Coastguard Worker  fi
117*288bf522SAndroid Build Coastguard Worker  SLOAD_OPTS+=" -c"
118*288bf522SAndroid Build Coastguard Worker  shift
119*288bf522SAndroid Build Coastguard Worker  SLDC_NUM_ARGS=$1
120*288bf522SAndroid Build Coastguard Worker  case $SLDC_NUM_ARGS in
121*288bf522SAndroid Build Coastguard Worker    ''|*[!0-9]*)
122*288bf522SAndroid Build Coastguard Worker      echo "--sldc needs a number"
123*288bf522SAndroid Build Coastguard Worker      exit 3 ;;
124*288bf522SAndroid Build Coastguard Worker  esac
125*288bf522SAndroid Build Coastguard Worker  shift
126*288bf522SAndroid Build Coastguard Worker  while [ $SLDC_NUM_ARGS -gt 0 ]; do
127*288bf522SAndroid Build Coastguard Worker    SLOAD_OPTS+=" $1"
128*288bf522SAndroid Build Coastguard Worker    shift
129*288bf522SAndroid Build Coastguard Worker    (( SLDC_NUM_ARGS-- ))
130*288bf522SAndroid Build Coastguard Worker  done
131*288bf522SAndroid Build Coastguard Workerfi
132*288bf522SAndroid Build Coastguard Worker
133*288bf522SAndroid Build Coastguard Workerif [[ "$1" == "-b" ]]; then
134*288bf522SAndroid Build Coastguard Worker  shift
135*288bf522SAndroid Build Coastguard Worker  BLOCKSIZE=$1
136*288bf522SAndroid Build Coastguard Worker  case $BLOCKSIZE in
137*288bf522SAndroid Build Coastguard Worker    ''|*[!0-9]*)
138*288bf522SAndroid Build Coastguard Worker      echo "-b needs a number"
139*288bf522SAndroid Build Coastguard Worker      exit 3 ;;
140*288bf522SAndroid Build Coastguard Worker  esac
141*288bf522SAndroid Build Coastguard Worker  shift
142*288bf522SAndroid Build Coastguard Worker  MKFS_OPTS+=" -b $BLOCKSIZE"
143*288bf522SAndroid Build Coastguard Worker  MKFS_OPTS+=" -w $BLOCKSIZE"
144*288bf522SAndroid Build Coastguard Workerfi
145*288bf522SAndroid Build Coastguard Worker
146*288bf522SAndroid Build Coastguard Workerif [ -z $SIZE ]; then
147*288bf522SAndroid Build Coastguard Worker  echo "Need size of filesystem"
148*288bf522SAndroid Build Coastguard Worker  exit 2
149*288bf522SAndroid Build Coastguard Workerfi
150*288bf522SAndroid Build Coastguard Worker
151*288bf522SAndroid Build Coastguard Workerfunction _truncate()
152*288bf522SAndroid Build Coastguard Worker{
153*288bf522SAndroid Build Coastguard Worker  if [ "$SPARSE_IMG" = "true" ]; then
154*288bf522SAndroid Build Coastguard Worker    return
155*288bf522SAndroid Build Coastguard Worker  fi
156*288bf522SAndroid Build Coastguard Worker
157*288bf522SAndroid Build Coastguard Worker  TRUNCATE_CMD="truncate -s $SIZE $OUTPUT_FILE"
158*288bf522SAndroid Build Coastguard Worker  echo $TRUNCATE_CMD
159*288bf522SAndroid Build Coastguard Worker  $TRUNCATE_CMD
160*288bf522SAndroid Build Coastguard Worker  if [ $? -ne 0 ]; then
161*288bf522SAndroid Build Coastguard Worker    exit 3
162*288bf522SAndroid Build Coastguard Worker  fi
163*288bf522SAndroid Build Coastguard Worker}
164*288bf522SAndroid Build Coastguard Worker
165*288bf522SAndroid Build Coastguard Workerfunction _build()
166*288bf522SAndroid Build Coastguard Worker{
167*288bf522SAndroid Build Coastguard Worker  MAKE_F2FS_CMD="make_f2fs -g android $MKFS_OPTS $OUTPUT_FILE"
168*288bf522SAndroid Build Coastguard Worker  echo $MAKE_F2FS_CMD
169*288bf522SAndroid Build Coastguard Worker  $MAKE_F2FS_CMD
170*288bf522SAndroid Build Coastguard Worker  if [ $? -ne 0 ]; then
171*288bf522SAndroid Build Coastguard Worker    if [ "$SPARSE_IMG" = "false" ]; then
172*288bf522SAndroid Build Coastguard Worker      rm -f $OUTPUT_FILE
173*288bf522SAndroid Build Coastguard Worker    fi
174*288bf522SAndroid Build Coastguard Worker    exit 4
175*288bf522SAndroid Build Coastguard Worker  fi
176*288bf522SAndroid Build Coastguard Worker
177*288bf522SAndroid Build Coastguard Worker  SLOAD_F2FS_CMD="sload_f2fs $SLOAD_OPTS $OUTPUT_FILE"
178*288bf522SAndroid Build Coastguard Worker  echo $SLOAD_F2FS_CMD
179*288bf522SAndroid Build Coastguard Worker  SLOAD_LOG=`$SLOAD_F2FS_CMD`
180*288bf522SAndroid Build Coastguard Worker  # allow 1: Filesystem errors corrected
181*288bf522SAndroid Build Coastguard Worker  ret=$?
182*288bf522SAndroid Build Coastguard Worker  if [ $ret -ne 0 ] && [ $ret -ne 1 ]; then
183*288bf522SAndroid Build Coastguard Worker    rm -f $OUTPUT_FILE
184*288bf522SAndroid Build Coastguard Worker    exit 4
185*288bf522SAndroid Build Coastguard Worker  fi
186*288bf522SAndroid Build Coastguard Worker  MB_SIZE=`echo "$SLOAD_LOG" | grep "Max image size" | awk '{print $5}'`
187*288bf522SAndroid Build Coastguard Worker  SIZE=$(((MB_SIZE + 6) * 1024 * 1024))
188*288bf522SAndroid Build Coastguard Worker}
189*288bf522SAndroid Build Coastguard Worker
190*288bf522SAndroid Build Coastguard Worker_truncate
191*288bf522SAndroid Build Coastguard Worker_build
192*288bf522SAndroid Build Coastguard Worker
193*288bf522SAndroid Build Coastguard Worker# readonly can reduce the image
194*288bf522SAndroid Build Coastguard Workerif [ "$READONLY" ]; then
195*288bf522SAndroid Build Coastguard Worker  if [ "$SPARSE_IMG" = "true" ]; then
196*288bf522SAndroid Build Coastguard Worker    MKFS_OPTS+=" -S $SIZE"
197*288bf522SAndroid Build Coastguard Worker    rm -f $OUTPUT_FILE && touch $OUTPUT_FILE
198*288bf522SAndroid Build Coastguard Worker  fi
199*288bf522SAndroid Build Coastguard Worker  _truncate
200*288bf522SAndroid Build Coastguard Worker  _build
201*288bf522SAndroid Build Coastguard Worker  # build block map
202*288bf522SAndroid Build Coastguard Worker  if [ "$BLOCK_MAP_FILE" ]; then
203*288bf522SAndroid Build Coastguard Worker    fsck.f2fs $BLOCK_MAP_OPT $OUTPUT_FILE > $BLOCK_MAP_FILE
204*288bf522SAndroid Build Coastguard Worker  fi
205*288bf522SAndroid Build Coastguard Workerfi
206*288bf522SAndroid Build Coastguard Workerexit 0
207