From 03d6f9a1761ec2ccfebda1c778b16934b8f03a05 Mon Sep 17 00:00:00 2001 From: Mark Salyzyn Date: Mon, 26 Nov 2018 09:11:16 -0800 Subject: [PATCH] fs_mgr: overlay: test assumption wrong if verity is enabled Test script assumes overlayfs takeup after disable-verity, although that can happen if verity is already disabled, it is not the case for devices that just had it disabled. Move takeup and first stage init tests downwards to where the condition is guaranteed. Differentiate the test for devices that support or have verity, and those that do not. Fortify test to also use /data mount to check init first stage limit. Test: adb-remount-test.sh Bug: 109821005 Change-Id: I5241d6c97bf374614e50aa0aa18a1b9d118be093 --- fs_mgr/tests/adb-remount-test.sh | 208 +++++++++++++++++++++---------- 1 file changed, 144 insertions(+), 64 deletions(-) diff --git a/fs_mgr/tests/adb-remount-test.sh b/fs_mgr/tests/adb-remount-test.sh index d9e017c2a..c7c86eb39 100755 --- a/fs_mgr/tests/adb-remount-test.sh +++ b/fs_mgr/tests/adb-remount-test.sh @@ -27,6 +27,7 @@ ESCAPE="`echo | tr '\n' '\033'`" GREEN="${ESCAPE}[38;5;40m" RED="${ESCAPE}[38;5;196m" ORANGE="${ESCAPE}[38;5;255:165:0m" +BLUE="${ESCAPE}[35m" NORMAL="${ESCAPE}[0m" # Helper functions @@ -138,6 +139,8 @@ fastboot_wait() { [ "USAGE: adb_root +NB: This can be flakey on devices due to USB state + Returns: true if device in root state" ] adb_root() { adb root >/dev/null /dev/null @@ -159,6 +162,9 @@ fastboot_getvar() { false return fi + if [ "${O}" != "${O#*FAILED}" ]; then + O="${1}: " + fi if [ -n "${2}" -a "${1}: ${2}" != "${O}" ]; then echo "${2} != ${O}" >&2 false @@ -167,14 +173,21 @@ fastboot_getvar() { echo ${O} >&2 } -[ "USAGE: die [-t ] [message] >/dev/stderr +[ "USAGE: die [-d|-t ] [message] >/dev/stderr -If -t argument is supplied, dump logcat. +If -d, or -t argument is supplied, dump logcat. Returns: exit failure, report status" ] die() { - if [ X"-t" = X"${1}" -a -n "${2}" ]; then - adb_logcat -b all -v nsec -t ${2} >&2 + if [ X"-d" = X"${1}" ]; then + adb_logcat -b all -v nsec -d >&2 + shift + elif [ X"-t" = X"${1}" ]; then + if [ -n "${2}" ]; then + adb_logcat -b all -v nsec -t ${2} >&2 + else + adb_logcat -b all -v nsec -d >&2 + fi shift 2 fi echo "${RED}[ FAILED ]${NORMAL} ${@}" >&2 @@ -238,15 +251,20 @@ check_eq() { die "${@}" } -[ "USAGE: skip_administrative_mounts < /proc/mounts +[ "USAGE: skip_administrative_mounts [data] < /proc/mounts Filters out all administrative (eg: sysfs) mounts uninteresting to the test" ] skip_administrative_mounts() { + if [ "data" = "${1}" ]; then + grep -v " /data " + else + cat - + fi | grep -v \ -e "^\(overlay\|tmpfs\|none\|sysfs\|proc\|selinuxfs\|debugfs\) " \ -e "^\(bpf\|cg2_bpf\|pstore\|tracefs\|adb\|mtp\|ptp\|devpts\) " \ -e "^\(/data/media\|/dev/block/loop[0-9]*\) " \ - -e " /\(cache\|mnt/scratch\|mnt/vendor/persist\|metadata\|data\) " + -e " /\(cache\|mnt/scratch\|mnt/vendor/persist\|metadata\) " } if [ X"-s" = X"${1}" -a -n "${2}" ]; then @@ -263,6 +281,9 @@ inAdb || die "device not in adb mode" isDebuggable || die "device not a debug build" # Do something + +echo "${GREEN}[ RUN ]${NORMAL} Testing kernel support for overlayfs" >&2 + adb_wait || die "wait for device failed" adb_sh ls -d /sys/module/overlay /dev/null && echo "${GREEN}[ OK ]${NORMAL} overlay module present" >&2 || @@ -272,6 +293,9 @@ adb_su ls /sys/module/overlay/parameters/override_creds /dev/null && die "overlay module can not be used on ANDROID" adb_root || die "initial setup" + +echo "${GREEN}[ RUN ]${NORMAL} Checking current overlayfs status" >&2 + reboot=false OVERLAYFS_BACKING="cache mnt/scratch" for d in ${OVERLAYFS_BACKING}; do @@ -297,64 +321,90 @@ D=`adb_sh df -k &2 || echo "${GREEN}[ OK ]${NORMAL} no overlay present before setup" >&2 adb_sh df -k `adb_sh cat /proc/mounts | - skip_administrative_mounts | + skip_administrative_mounts data | cut -s -d' ' -f1` +echo "${GREEN}[ RUN ]${NORMAL} disable verity" >&2 + T=`adb_date` D=`adb disable-verity 2>&1` err=${?} -echo "${D}" if [ ${err} != 0 -o X"${D}" != X"${D##*setup failed}" ]; then + echo "${D%?Now reboot your device for settings to take effect}" die -t ${T} "setup for overlay" fi if [ X"${D}" != X"${D##*using overlayfs}" ]; then echo "${GREEN}[ OK ]${NORMAL} using overlayfs" >&2 fi -adb_reboot && - adb_wait && - D=`adb_sh df -k /dev/null || - echo "${ORANGE}[ WARNING ]${NORMAL} overlay takeover before remount not complete" >&2 - -T=`adb_date` -adb_root && - adb remount && - D=`adb_sh df -k /dev/null; then - echo "${ORANGE}[ INFO ]${NORMAL} using scratch dynamic partition for overrides" >&2 - H=`adb_sh cat /proc/mounts | sed -n 's@\([^ ]*\) /mnt/scratch \([^ ]*\) .*@\2 on \1@p'` - [ -n "${H}" ] && - echo "${ORANGE}[ INFO ]${NORMAL} scratch filesystem ${H}" +reboot=false +if [ X"${D}" != X"${D##*Successfully disabled verity}" ]; then + echo "${GREEN}[ OK ]${NORMAL} disabled verity" >&2 + reboot=true +else + echo "${ORANGE}[ WARNING ]${NORMAL} verity already disabled" >&2 fi +D=`adb_sh df -k &1` + adb_reboot && + adb_wait 2m || + die "reboot after verity disabled failed" + T= +fi + +echo "${GREEN}[ RUN ]${NORMAL} remount" >&2 + +adb_root && + adb remount || + ( [ -n "${L}" ] && echo "${L}" && false ) || + die -t "${T}" "adb remount failed" +D=`adb_sh df -k /dev/null || + echo "${ORANGE}[ WARNING ]${NORMAL} overlay takeover not complete" >&2 +scratch_partition=scratch +if echo "${D}" | grep " /mnt/scratch" >/dev/null; then + echo "${BLUE}[ INFO ]${NORMAL} using ${scratch_partition} dynamic partition for overrides" >&2 +fi +M=`adb_sh cat /proc/mounts | sed -n 's@\([^ ]*\) /mnt/scratch \([^ ]*\) .*@\2 on \1@p'` +[ -n "${M}" ] && + echo "${BLUE}[ INFO ]${NORMAL} scratch filesystem ${M}" +scratch_size=`adb_sh df -k /mnt/scratch /dev/null | + while read device kblocks used available use mounted on; do + if [ "/mnt/scratch" = "\${mounted}" ]; then + echo \${kblocks} + fi + done` && + [ -n "${scratch_size}" ] || + die "scratch size" +echo "${BLUE}[ INFO ]${NORMAL} scratch size ${scratch_size}KB" >&2 for d in ${OVERLAYFS_BACKING}; do if adb_sh ls -d /${d}/overlay/system/upper /dev/null 2>/dev/null; then - echo "${ORANGE}[ INFO ]${NORMAL} /${d}/overlay is setup" >&2 + echo "${BLUE}[ INFO ]${NORMAL} /${d}/overlay is setup" >&2 fi done -H=`echo "${D}" | head -1` && - D=`echo "${D}" | grep "^overlay "` && - echo "${H}" && +echo "${H}" && echo "${D}" && echo "${D}" | grep "^overlay .* /system\$" >/dev/null || die "overlay takeover after remount" !(adb_sh grep "^overlay " /proc/mounts &2 || - echo "${GREEN}[ OK ]${NORMAL} overlay takeover in first stage init" >&2 - # Check something + +echo "${GREEN}[ RUN ]${NORMAL} push content to system and vendor" >&2 + A="Hello World! $(date)" echo "${A}" | adb_sh "cat - > /system/hello" echo "${A}" | adb_sh "cat - > /vendor/hello" @@ -364,9 +414,26 @@ check_eq "${A}" "${B}" system before reboot B="`adb_cat /vendor/hello`" || die "vendor hello" check_eq "${A}" "${B}" vendor before reboot + +echo "${GREEN}[ RUN ]${NORMAL} reboot to confirm content persistent" >&2 + adb_reboot && - adb_wait && - B="`adb_cat /system/hello`" || + adb_wait 2m || + die "reboot after override content added failed" + +D=`adb_su df -k &2 || + echo "${GREEN}[ OK ]${NORMAL} overlay takeover in first stage init" >&2 + +B="`adb_cat /system/hello`" || die "re-read system hello after reboot" check_eq "${A}" "${B}" system after reboot # Only root can read vendor if sepolicy permissions are as expected @@ -378,23 +445,30 @@ adb_root && die "re-read vendor hello after reboot" check_eq "${A}" "${B}" vendor after reboot -adb reboot-fastboot && +echo "${GREEN}[ RUN ]${NORMAL} flash vendor, confirm its content disappears" >&2 + +[ -n "${ANDROID_PRODUCT_OUT}" ] && + adb reboot-fastboot && fastboot_wait 2m && fastboot flash vendor || - die "fastbootd flash vendor" -# check scratch via fastboot -fastboot_getvar partition-type:scratch raw && - fastboot_getvar has-slot:scratch no && - fastboot_getvar is-logical:scratch yes || - die "fastboot can not see scratch parameters" -echo "${ORANGE}[ INFO ]${NORMAL} expect fastboot erase scratch to fail" >&2 -fastboot erase scratch && - die "fastbootd can erase scratch" -echo "${ORANGE}[ INFO ]${NORMAL} expect fastboot format scratch to fail" >&2 -fastboot format scratch && - die "fastbootd can format scratch" + ( fastboot reboot && false) || + die "fastboot flash vendor" +# check ${scratch_partition} via fastboot +fastboot_getvar partition-type:${scratch_partition} raw && + fastboot_getvar has-slot:${scratch_partition} no && + fastboot_getvar is-logical:${scratch_partition} yes || + ( fastboot reboot && false) || + die "fastboot can not see ${scratch_partition} parameters" +echo "${BLUE}[ INFO ]${NORMAL} expect fastboot erase ${scratch_partition} to fail" >&2 +fastboot erase ${scratch_partition} && + ( fastboot reboot || true) && + die "fastboot can erase ${scratch_partition}" +echo "${BLUE}[ INFO ]${NORMAL} expect fastboot format ${scratch_partition} to fail" >&2 +fastboot format ${scratch_partition} && + ( fastboot reboot || true) && + die "fastboot can format ${scratch_partition}" fastboot reboot || - die "can not reboot out of fastbootd" + die "can not reboot out of fastboot" echo "${ORANGE}[ WARNING ]${NORMAL} adb after fastboot ... waiting 2 minutes" adb_wait 2m || die "did not reboot after flash" @@ -417,6 +491,8 @@ B="`adb_cat /vendor/hello`" && die "re-read vendor hello after flash vendor" check_eq "cat: /vendor/hello: No such file or directory" "${B}" vendor after flash vendor +echo "${GREEN}[ RUN ]${NORMAL} remove test content (cleanup)" >&2 + T=`adb_date` adb remount && ( adb_sh rm /vendor/hello /dev/null || true ) && @@ -429,17 +505,20 @@ B="`adb_cat /vendor/hello`" && die "re-read vendor hello after rm" check_eq "cat: /vendor/hello: No such file or directory" "${B}" after flash rm +echo "${GREEN}[ RUN ]${NORMAL} test fastboot flash to ${scratch_partition}" >&2 + adb reboot-fastboot && - dd if=/dev/zero of=adb-remount-test.img bs=4096 count=16 && + dd if=/dev/zero of=/tmp/adb-remount-test.img bs=4096 count=16 2>/dev/null && fastboot_wait 2m || - die "reboot into fastbootd" -fastboot flash scratch adb-remount-test.img + ( rm /tmp/adb-remount-test.img && false) || + die "reboot into fastboot" +fastboot flash ${scratch_partition} /tmp/adb-remount-test.img err=${?} -rm adb-remount-test.img -[ 0 -eq ${err} ] || - die "fastbootd flash scratch" +rm /tmp/adb-remount-test.img fastboot reboot || - die "can not reboot out of fastbootd" + die "can not reboot out of fastboot" +[ 0 -eq ${err} ] || + die "fastboot flash ${scratch_partition}" adb_wait 2m && adb_root || die "did not reboot after flash" @@ -449,7 +528,8 @@ err=${?} echo "${D}" [ ${err} = 0 ] && [ X"${D}" = X"${D##*setup failed}" ] && - [ X"${D}" != X"${D##*using overlayfs}" ] || + [ X"${D}" != X"${D##*using overlayfs}" ] && + echo "${GREEN}[ OK ]${NORMAL} ${scratch_partition} recreated" >&2 || die -t ${T} "setup for overlayfs" echo "${GREEN}[ PASSED ]${NORMAL} adb remount" >&2