Use /run/upgrade-sysroot instead of /system
[platform/core/system/initrd-recovery.git] / src / initrd-recovery / mkinitrd-recovery.sh.in
1 #!/bin/sh
2
3 PATH=/bin:/usr/bin:/sbin:/usr/sbin
4
5 CP="/bin/cp"
6 LN="/bin/ln"
7 SED="/bin/sed"
8 MKDIR="/bin/mkdir"
9 PARTX="/usr/sbin/partx"
10 BLKID="/usr/sbin/blkid"
11 DIRNAME="/usr/bin/dirname"
12 MKDIR="/bin/mkdir"
13 RM="/bin/rm"
14 TR="/bin/tr"
15 GREP="/bin/grep"
16 CUT="/bin/cut"
17
18 UNAME="/bin/uname"
19 ARCH=`$UNAME -m`
20
21 if [ "z$ARCH" == "zarmv7l" ]; then
22         LD_LINUX="/lib/ld-linux.so.3"
23 elif [ "z$ARCH" == "zaarch64" ]; then
24         LD_LINUX="/lib64/ld-linux-aarch64.so.1"
25 elif [ "z$ARCH" == "zi686" ]; then
26         LD_LINUX="/lib/ld-linux.so.2"
27 elif [ "z$ARCH" == "zx86-64" ]; then
28         LD_LINUX="/lib64/ld-linux-x86-64.so.2"
29 else
30         # set as armv7l, need to assign properly
31         LD_LINUX="/lib/ld-linux.so.3"
32 fi
33
34 INITRD_ROOT="/mnt/initrd-recovery"
35 HAL_LIST="${INITRD_ROOT}/hal/.hal_list"
36
37 OBJECTS_SPECIFY_DIR="@INITRD_RECOVERY_INSTALL_DROPIN_DIR@"
38 OBJECTS_DIRECTORY=
39 OBJECTS_VERBATIM=
40 OBJECTS_WITHLIB=
41 OBJECTS_LIBONLY=
42 OBJECTS_SYMLINK=
43 OBJECTS_MVWITHLIB=
44
45 BASE_DIRECTORIES="
46 /dev
47 /etc
48 /proc
49 /sdcard
50 /smack
51 /sys
52 /system-ro
53 /run
54 /run/upgrade-sysroot
55 /tmp
56 /usr/bin
57 /usr/sbin
58 /usr/lib
59 /var/log
60 /hal
61 "
62
63 BASE_DIR_SYMLINKS="
64 /bin:usr/bin
65 /sbin:usr/sbin
66 /lib:usr/lib
67 /opt:run/upgrade-sysroot/opt
68 "
69
70 OPT="default"
71
72 #-----------------------------------------------------------------------------
73 #       help
74 #-----------------------------------------------------------------------------
75 show_help() {
76     echo
77     echo "usage: `basename $0` [OPTION]"
78     echo "make initrd image"
79     echo
80     echo "  -h, --help          show help"
81     echo "  -p, --post          find initrd partition and format and make"
82     echo "                       initrd image to there"
83     echo
84 }
85
86 #-----------------------------------------------------------------------------
87 #       find initrd-recovery partition
88 #-----------------------------------------------------------------------------
89 find_initrd_recovery_partition() {
90     EMMC_DEVICE="/dev/mmcblk0"
91     RET_PARTX=$("$PARTX" -s ${EMMC_DEVICE})
92     TEST=$(echo "$RET_PARTX" | "$TR" -s ' ' | "$SED" -e '1d' -e 's/^ //' | "$CUT" -d ' ' -f 6)
93     if [ "z$TEST" == "z" ]; then
94         PART_INITRD=$("$BLKID" -L "ramdisk-recovery" -o device)
95         if [ "z$PART_INITRD" == "z" ]; then
96             PART_INITRD=$("$BLKID" -L "ramdisk" -o device)
97         fi
98     else
99         PART_INITRD=${EMMC_DEVICE}p$(
100             echo "$RET_PARTX" |
101             "$TR" -s ' ' | "$TR" '[:upper:]' '[:lower:]' |
102             "$GREP" "ramdisk2" | "$SED" 's/^ //' | "$CUT" -d ' ' -f 1)
103         if [ "z$PART_INITRD" == "z/dev/mmcblk0p" ]; then
104             PART_INITRD=${EMMC_DEVICE}p$(
105                 echo "$RET_PARTX" |
106                 "$TR" -s ' ' | "$TR" '[:upper:]' '[:lower:]' |
107                 "$GREP" "ramdisk" | "$SED" 's/^ //' | "$CUT" -d ' ' -f 1)
108         fi
109     fi
110 }
111
112 #-----------------------------------------------------------------------------
113 #       Prepare parent directory
114 #-----------------------------------------------------------------------------
115 mkdir_p_parent() {
116     dst_dir=`"$DIRNAME" "$1"`
117     if [ ! -d "$dst_dir" -a ! -L "$dst_dir" ]; then
118         "$MKDIR" -p "$dst_dir"
119     fi
120 }
121
122 #-----------------------------------------------------------------------------
123 #       Copy content to root of mounted image
124 #-----------------------------------------------------------------------------
125 do_copy() {
126     src=$1
127     dst="$INITRD_ROOT/$src"
128
129     path_prefix=$(echo $src | "$CUT" -d '/' -f 2)
130
131     if [ "$path_prefix" == "hal" ]; then
132         remain=$(echo $src | "$SED" 's/\/hal\///')
133         echo "$remain" >> $HAL_LIST
134     fi
135
136     if [ ! -e "$src" -o -e "$dst" ]; then
137         return
138     fi
139
140     mkdir_p_parent $dst
141
142     "$CP" -f "$src" "$dst"
143 }
144
145 #-----------------------------------------------------------------------------
146 #       Get dependency libraries
147 #-----------------------------------------------------------------------------
148 get_dep_libs() {
149     "$LD_LINUX" --list $1 | "$SED" -r 's|^[^/]+([^ \(]+).*$|\1|'
150 }
151
152 #-----------------------------------------------------------------------------
153 #       Gather initrd objects
154 #-----------------------------------------------------------------------------
155 get_initrd_objects() {
156     for f in $(ls ${OBJECTS_SPECIFY_DIR}); do
157         DIRECTORIES=
158         DIR_SYMLINKS=
159         VERBATIMS=
160         WITHLIBS=
161         LIBONLYS=
162         SYMLINKS=
163         MVWITHLIBS=
164         source "${OBJECTS_SPECIFY_DIR}"/$f
165         OBJECTS_DIRECTORY="$OBJECTS_DIRECTORY $DIRECTORIES"
166         OBJECTS_DIR_SYMLINK="$OBJECTS_DIR_SYMLINK $DIR_SYMLINKS"
167         OBJECTS_VERBATIM="$OBJECTS_VERBATIM $VERBATIMS"
168         OBJECTS_WITHLIB="$OBJECTS_WITHLIB $WITHLIBS"
169         OBJECTS_LIBONLY="$OBJECTS_LIBONLY $LIBONLYS"
170         OBJECTS_SYMLINK="$OBJECTS_SYMLINK $SYMLINKS"
171         OBJECTS_MVWITHLIB="$OBJECTS_MVWITHLIB $MVWITHLIBS"
172     done
173
174     OBJECTS_DIRECTORY=$(echo "$OBJECTS_DIRECTORY" | sort | uniq)
175     OBJECTS_DIR_SYMLINK=$(echo "$OBJECTS_DIR_SYMLINK" | sort | uniq)
176     OBJECTS_VERBATIM=$(echo "$OBJECTS_VERBATIM" | sort | uniq)
177     OBJECTS_WITHLIB=$(echo "$OBJECTS_WITHLIB" | sort | uniq)
178     OBJECTS_LIBONLY=$(echo "$OBJECTS_LIBONLY" | sort | uniq)
179     OBJECTS_SYMLINK=$(echo "$OBJECTS_SYMLINK" | sort | uniq)
180     OBJECTS_MVWITHLIB=$(echo "$OBJECTS_MVWITHLIB" | sort | uniq)
181 }
182
183 #-----------------------------------------------------------------------------
184 #       Prepare directory objects
185 #-----------------------------------------------------------------------------
186 prepare_directory_objects() {
187     for dir in $@; do
188         "$MKDIR" -p "$INITRD_ROOT$dir"
189     done
190 }
191
192 #-----------------------------------------------------------------------------
193 #       Copy verbatim objects
194 #-----------------------------------------------------------------------------
195 verbatim_objects() {
196     for obj in $@; do
197         do_copy $obj
198     done
199 }
200
201 #-----------------------------------------------------------------------------
202 #       Copy withlib objects
203 #-----------------------------------------------------------------------------
204 withlib_objects() {
205     for content in $@; do
206         do_copy $content
207
208         DEP_LIBS=$(get_dep_libs $content)
209         for lib in $DEP_LIBS; do
210             do_copy $lib
211         done
212     done
213 }
214
215 mvwithlib_objects() {
216     for content in $@; do
217
218         do_copy $content
219
220         "$LD_LINUX" --verify $content
221         if [ $? -eq 0 ]; then
222             DEP_LIBS=$(get_dep_libs $content)
223             for lib in $DEP_LIBS; do
224                 do_copy $lib
225             done
226         fi
227
228         "$RM" -rf $content
229     done
230 }
231
232 #-----------------------------------------------------------------------------
233 #       Copy libonly objects
234 #-----------------------------------------------------------------------------
235 libonly_objects() {
236     for content in $@; do
237         DEP_LIBS=$(get_dep_libs $content)
238         for lib in $DEP_LIBS; do
239             do_copy $lib
240         done
241     done
242 }
243
244 #-----------------------------------------------------------------------------
245 #       Copy symlink objects
246 #-----------------------------------------------------------------------------
247 symlink_objects() {
248     for i in $@; do
249         if [ "z$i" == "z" ]; then
250             continue
251         fi
252
253         link=${i%:*}
254         target=${i#*:}
255         mkdir_p_parent "$INITRD_ROOT$link"
256         "$LN" -s "$target" "$INITRD_ROOT$link"
257     done
258 }
259
260 #-----------------------------------------------------------------------------
261 #       Copy content
262 #-----------------------------------------------------------------------------
263 make_initrd_recovery() {
264     echo "copy initrd objects to $INITRD_ROOT"
265     get_initrd_objects
266
267     prepare_directory_objects $BASE_DIRECTORIES
268     symlink_objects $BASE_DIR_SYMLINKS
269     prepare_directory_objects $OBJECTS_DIRECTORY
270     symlink_objects $OBJECTS_DIR_SYMLINK
271     verbatim_objects $OBJECTS_VERBATIM
272     withlib_objects $OBJECTS_WITHLIB
273     libonly_objects $OBJECTS_LIBONLY
274     symlink_objects $OBJECTS_SYMLINK
275     mvwithlib_objects $OBJECTS_MVWITHLIB
276     /usr/sbin/ldconfig -r $INITRD_ROOT
277 }
278
279 #-----------------------------------------------------------------------------
280 #       Check given parameter is mount point
281 #-----------------------------------------------------------------------------
282 check_mount_point() {
283     grep " $1 " /etc/mtab > /dev/null
284     if [ $? -ne 0 ]; then
285         echo "$1 is not mount point"
286         exit 0
287     fi
288 }
289
290 #-----------------------------------------------------------------------------
291 #       Main
292 #-----------------------------------------------------------------------------
293 ARGS=$(getopt -o hp -l "help,post" -n "$0" -- "$@");
294
295 eval set -- "$ARGS";
296
297 while true; do
298     case "$1" in
299         -h|--help)
300             show_help >&2
301             exit 0
302             ;;
303         -p|--post)
304             OPT="post"
305             shift
306             ;;
307         --)
308             shift;
309             break;
310             ;;
311     esac
312 done
313
314 if [ $# -gt 1 ]; then
315     echo "Error: too many argument was given."
316     show_help >&2
317     exit 1
318 fi
319
320 case $OPT in
321     post)
322         find_initrd_recovery_partition
323         if [ "z$PART_INITRD" == "z/dev/mmcblk0p" ]; then
324             echo "Error: failed to find initrd partition"
325             exit 1
326         else
327             echo "Info: initrd partition: $PART_INITRD"
328         fi
329         mke2fs $PART_INITRD
330         e2fsck $PART_INITRD
331         mount $PART_INITRD $INITRD_ROOT
332         make_initrd_recovery
333         umount $INITRD_ROOT
334         ;;
335     *)
336         check_mount_point $INITRD_ROOT
337         make_initrd_recovery
338         ;;
339 esac