lxc-android/usr/sbin/mount-android.sh
2023-04-20 13:05:40 +01:00

129 lines
4.6 KiB
Bash
Executable file

#!/bin/bash
# On systems with A/B partition layout, current slot is provided via cmdline parameter.
ab_slot_suffix=$(grep -o 'androidboot\.slot_suffix=..' /proc/cmdline | cut -d "=" -f2)
[ ! -z "$ab_slot_suffix" ] && echo "A/B slot system detected! Slot suffix is $ab_slot_suffix"
find_partition_path() {
label=$1
path="/dev/$label"
# In case fstab provides /dev/mmcblk0p* lines
for dir in by-partlabel by-name by-label by-path by-uuid by-partuuid by-id; do
# On A/B systems not all of the partitions are duplicated, so we have to check with and without suffix
if [ -e "/dev/disk/$dir/$label$ab_slot_suffix" ]; then
path="/dev/disk/$dir/$label$ab_slot_suffix"
break
elif [ -e "/dev/disk/$dir/$label" ]; then
path="/dev/disk/$dir/$label"
break
fi
done
echo $path
}
parse_mount_flags() {
org_options="$1"
options=""
for i in $(echo $org_options | tr "," "\n"); do
[[ "$i" =~ "context" ]] && continue
options+=$i","
done
options=${options%?}
echo $options
}
if [ -e "/dev/disk/by-partlabel/super" ]; then
echo "mapping super partition"
dmsetup create --concise "$(parse-android-dynparts /dev/disk/by-partlabel/super)"
fi
echo "checking for vendor mount point"
vendor_images="/userdata/vendor.img /var/lib/lxc/android/vendor.img /dev/mapper/dynpart-vendor /dev/mapper/dynpart-vendor${ab_slot_suffix}"
for image in $vendor_images; do
if [ -e $image ]; then
echo "mounting vendor from $image"
mount $image /vendor -o ro
fi
done
sys_vendor="/sys/firmware/devicetree/base/firmware/android/fstab/vendor"
if [ -e $sys_vendor ] && ! mountpoint -q -- /vendor; then
label=$(cat $sys_vendor/dev | awk -F/ '{print $NF}')
path=$(find_partition_path $label)
[ ! -e "$path" ] && echo "Error vendor not found" && exit
type=$(cat $sys_vendor/type)
options=$(parse_mount_flags $(cat $sys_vendor/mnt_flags))
echo "mounting $path as /vendor"
mount $path /vendor -t $type -o $options
fi
# Bind-mount /vendor if we should. Legacy devices do not have /vendor
# on a separate partition and we should handle that.
if [ -n "${BIND_MOUNT_PATH}" ] && mountpoint -q -- /vendor; then
# Mountpoint, bind-mount. We don't use rbind as we're going
# to go through the fstab anyways.
mount -o bind /vendor "${BIND_MOUNT_PATH}/vendor"
fi
sys_persist="/sys/firmware/devicetree/base/firmware/android/fstab/persist"
if [ -e $sys_persist ]; then
label=$(cat $sys_persist/dev | awk -F/ '{print $NF}')
path=$(find_partition_path $label)
# [ ! -e "$path" ] && echo "Error persist not found" && exit
type=$(cat $sys_persist/type)
options=$(parse_mount_flags $(cat $sys_persist/mnt_flags))
echo "mounting $path as /mnt/vendor/persist"
mount $path /mnt/vendor/persist -t $type -o $options
fi
echo "checking if system overlay exists"
if [ -d "/usr/lib/droid-system-overlay" ]; then
echo "mounting android's system overlay"
mount -t overlay overlay -o lowerdir=/usr/lib/droid-system-overlay:/var/lib/lxc/android/rootfs/system /var/lib/lxc/android/rootfs/system
fi
echo "checking if vendor overlay exists"
if [ -d "/usr/lib/droid-vendor-overlay" ]; then
echo "mounting android's vendor overlay"
mount -t overlay overlay -o lowerdir=/usr/lib/droid-vendor-overlay:/var/lib/lxc/android/rootfs/vendor /var/lib/lxc/android/rootfs/vendor
fi
# Assume there's only one fstab in vendor
fstab=$(ls /vendor/etc/fstab*)
[ -z "$fstab" ] && echo "fstab not found" && exit
echo "checking fstab $fstab for additional mount points"
cat ${fstab} ${EXTRA_FSTAB} | while read line; do
set -- $line
# stop processing if we hit the "#endhalium" comment in the file
echo $1 | egrep -q "^#endhalium" && break
# Skip any unwanted entry
echo $1 | egrep -q "^#" && continue
([ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ] || [ -z "$4" ]) && continue
([ "$2" = "/system" ] || [ "$2" = "/data" ] || [ "$2" = "/" ] \
|| [ "$2" = "auto" ] || [ "$2" = "/vendor" ] || [ "$2" = "none" ] \
|| [ "$2" = "/misc" ]) && continue
([ "$3" = "emmc" ] || [ "$3" = "swap" ] || [ "$3" = "mtd" ]) && continue
label=$(echo $1 | awk -F/ '{print $NF}')
[ -z "$label" ] && continue
echo "checking mount label $label"
path=$(find_partition_path $label)
[ ! -e "$path" ] && continue
mkdir -p $2
echo "mounting $path as $2"
mount $path $2 -t $3 -o $(parse_mount_flags $4)
# Bind mount on rootfs if we should
if [ -n "${BIND_MOUNT_PATH}" ] && [[ ${2} != /mnt/* ]]; then
# /mnt is recursively binded via the LXC configuration
mount -o bind ${2} "${BIND_MOUNT_PATH}/${2}"
fi
done