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
This commit is contained in:
parent
fafd21159c
commit
03d6f9a176
|
@ -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 2>/dev/null
|
||||
|
@ -159,6 +162,9 @@ fastboot_getvar() {
|
|||
false
|
||||
return
|
||||
fi
|
||||
if [ "${O}" != "${O#*FAILED}" ]; then
|
||||
O="${1}: <empty>"
|
||||
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 <epoch>] [message] >/dev/stderr
|
||||
[ "USAGE: die [-d|-t <epoch>] [message] >/dev/stderr
|
||||
|
||||
If -t <epoch> argument is supplied, dump logcat.
|
||||
If -d, or -t <epoch> 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 >/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 >/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 </dev/null` &&
|
|||
echo "${ORANGE}[ WARNING ]${NORMAL} overlays present before setup" >&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` &&
|
||||
H=`echo "${D}" | head -1` &&
|
||||
D=`echo "${D}" | grep "^overlay "` &&
|
||||
echo "${H}" &&
|
||||
echo "${D}" ||
|
||||
die "overlay takeover failed"
|
||||
echo "${D}" | grep "^overlay .* /system\$" >/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` ||
|
||||
die -t ${T} "can not collect filesystem data"
|
||||
if echo "${D}" | grep " /mnt/scratch" >/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 </dev/null` &&
|
||||
H=`echo "${D}" | head -1` &&
|
||||
D=`echo "${D}" | grep "^overlay " | true` &&
|
||||
[ -n "${D}" ] &&
|
||||
( echo "${H}" && echo "${D}" && true ) &&
|
||||
die -t ${T} "overlay takeover unexpected"
|
||||
L=
|
||||
if ${reboot}; then
|
||||
L=`adb_logcat -b all -v nsec -t ${T} 2>&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` &&
|
||||
H=`echo "${D}" | head -1` &&
|
||||
D=`echo "${D}" | grep "^overlay "` ||
|
||||
( [ -n "${L}" ] && echo "${L}" && false ) ||
|
||||
die -t ${T} "overlay takeover failed"
|
||||
echo "${D}" | grep "^overlay .* /system\$" >/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 2>/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 >/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 </dev/null | grep " overlay ro,") &&
|
||||
!(adb_sh grep " rw," /proc/mounts </dev/null | skip_administrative_mounts) ||
|
||||
!(adb_sh grep " rw," /proc/mounts </dev/null | skip_administrative_mounts data) ||
|
||||
die "remount overlayfs missed a spot (ro)"
|
||||
|
||||
adb_su "sed -n '1,/overlay \\/system/p' /proc/mounts" </dev/null |
|
||||
skip_administrative_mounts |
|
||||
grep -v ' \(squashfs\|ext4\|f2fs\) ' &&
|
||||
echo "${ORANGE}[ WARNING ]${NORMAL} overlay takeover after first stage init" >&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 </dev/null` &&
|
||||
H=`echo "${D}" | head -1` &&
|
||||
D=`echo "${D}" | grep "^overlay "` ||
|
||||
( echo "${L}" && false ) ||
|
||||
die -d "overlay takeover failed after reboot"
|
||||
|
||||
adb_su "sed -n '1,/overlay \\/system/p' /proc/mounts" </dev/null |
|
||||
skip_administrative_mounts |
|
||||
grep -v ' \(squashfs\|ext4\|f2fs\) ' &&
|
||||
echo "${ORANGE}[ WARNING ]${NORMAL} overlay takeover after first stage init" >&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 2>/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
|
||||
|
|
Loading…
Reference in New Issue