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