Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #transfusian@gmail.com
- # Local filesystem mounting -*- shell-script -*-
- pre_mountroot()
- {
- [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-top"
- run_scripts /scripts/local-top
- [ "$quiet" != "y" ] && log_end_msg
- }
- mount_ubuntu_overlay() {
- source=$1
- target=$2
- if [ -d ${source} ]; then
- OLD_PWD=$PWD
- cd ${source}
- for overlay in `find . -type f`; do
- [ -f ${target}/${overlay} ] && mount --bind ${source}/${overlay} ${target}/${overlay}
- done
- cd $OLD_PWD
- fi
- }
- sync_dirs() {
- base=$1
- source=$2
- target=$3
- OLD_PWD=$PWD
- cd $base
- for file in $source/*
- do
- # Skip empty directories
- [ ! -e "$base/$file" ] && continue
- # If the target already exists as a file or link, there's nothing we can do
- [ -e "$target/$file" -o -L "$target/$file" ] && [ ! -d "$target/$file" ] && continue
- # If the target doesn't exist, just copy it over
- if [ ! -e "$target/$file" -a ! -L "$target/$file" ]; then
- cp -Ra "$base/$file" "$target/$file"
- continue
- fi
- # That leaves us with directories and a recursive call
- [ -d $file ] && sync_dirs $base $file $target
- done
- cd $OLD_PWD
- }
- mountroot()
- {
- # list of possible userdata partition names
- partlist="userdata UDA DATAFS USERDATA"
- pre_mountroot
- [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-premount"
- run_scripts /scripts/local-premount
- [ "$quiet" != "y" ] && log_end_msg
- # Mount root
- #
- # Create a temporary mountpoint for the bindmount
- # Create a temporary mountpoint for the data partition which includes
- # data and data1
- mkdir -p /data_root
- mkdir -p /tmpmnt
- # Make sure the device has been created by udev before we try to mount
- udevadm settle
- # find the right partition
- for partname in $partlist; do
- part=$(find /dev -name $partname|tail -1)
- [ -z "$part" ] && continue
- path=$(readlink -f $part)
- [ -n "$path" ] && break
- done
- # override with a possible cmdline parameter
- if grep -q datapart= /proc/cmdline; then
- for x in $(cat /proc/cmdline); do
- case ${x} in
- datapart=*)
- path=${x#*=}
- ;;
- esac
- done
- fi
- if [ -z "$path" ]; then
- echo "initrd: Couldn't find data partition. Spawning adbd ..." >/dev/kmsg || true
- panic "Couldn't find data partition. Spawning adbd ..."
- fi
- echo "initrd: mounting $path" >/dev/kmsg || true
- # Mount the data partition to a temporary mount point
- mount -o discard $path /data_root
- mount -o bind /data_root/system1 /tmpmnt
- # Loop-mounted flipped model
- if [ -e /tmpmnt/system.img ]; then
- # Transition .developer_mode to .writable_image
- [ -e /tmpmnt/.developer_mode ] && mv /tmpmnt/.developer_mode /tmpmnt/.writable_image
- # Prepare the root filesystem
- # NOTE: We mount it read-write in all cases, then remount read-only.
- # This is to workaround a behaviour change in busybox which now
- # uses read-only loops if the fs is initially mounted read-only.
- # An alternative implementation would be to add losetup support
- # to busybox and do the mount in two steps (rw loop, ro fs).
- mount -o loop,rw /tmpmnt/system.img ${rootmnt}
- if [ -e /tmpmnt/.writable_image ]; then
- echo "initrd: mounting system.img (image developer mode)" >/dev/kmsg || true
- mountroot_status="$?"
- else
- echo "initrd: mounting system.img (user mode)" >/dev/kmsg || true
- mount -o remount,ro ${rootmnt}
- mountroot_status="$?"
- fi
- mount --move /tmpmnt ${rootmnt}/userdata
- # Mount the android system partition to a temporary location
- mkdir -p /android-system
- mount -o loop,ro ${rootmnt}/var/lib/lxc/android/system.img /android-system
- # Get device information
- device=$(grep ^ro.product.device= /android-system/build.prop |sed -e 's/.*=//')
- [ -z "$device" ] && device="unknown"
- echo "initrd: device is $device" >/dev/kmsg || true
- # Mount some tmpfs
- mkdir -p ${rootmnt}/android
- mount -o rw,size=4096 -t tmpfs none ${rootmnt}/android
- mount -o rw,nosuid,noexec,relatime,mode=755 -t tmpfs tmpfs ${rootmnt}/run
- # Create some needed paths on tmpfs
- mkdir -p ${rootmnt}/android/data ${rootmnt}/android/system
- # Prepare the fstab
- FSTAB=${rootmnt}/etc/fstab
- touch ${rootmnt}/run/image.fstab
- mount -o bind ${rootmnt}/run/image.fstab $FSTAB || panic "drop to adb"
- echo "/dev/root / rootfs defaults,ro 0 0" >> $FSTAB
- # Process the list of bind-mounts
- # (but don't mount them, mountall will do it)
- cat ${rootmnt}/etc/system-image/writable-paths | while read line; do
- set -- $line
- # Skip invalid/commented entries
- ([ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ] || [ -z "$4" ] || [ -z "$5" ]) && continue
- [ "$1" = "#" ] && continue
- # Skip invalid mount points
- dstpath="${rootmnt}/$1"
- [ ! -e "$dstpath" ] && continue
- if [ "$3" = "temporary" ]; then
- # Temporary entries are simple, just mount a tmpfs
- echo "tmpfs $1 tmpfs $5 0 0" >> $FSTAB
- elif [ "$3" = "persistent" ] || [ "$3" = "synced" ]; then
- # Figure out the source path
- if [ "$2" = "auto" ]; then
- srcpath="${rootmnt}/userdata/system-data/$1"
- path="/userdata/system-data/$1"
- else
- srcpath="${rootmnt}/userdata/$2"
- path="/userdata/$2"
- fi
- if [ ! -e "$srcpath" ]; then
- # Process new persistent or synced paths
- dstown=$(stat -c "%u:%g" $dstpath)
- dstmode=$(stat -c "%a" $dstpath)
- mkdir -p ${srcpath%/*}
- if [ ! -d "$dstpath" ]; then
- # Deal with redirected files
- if [ "$4" = "transition" ]; then
- cp -a $dstpath $srcpath
- else
- touch $srcpath
- chown $dstown $srcpath
- chmod $dstmode $srcpath
- fi
- else
- # Deal with redirected directories
- if [ "$4" = "transition" ] || [ "$3" = "synced" ]; then
- cp -aR $dstpath $srcpath
- else
- mkdir $srcpath
- chown $dstown $srcpath
- chmod $dstmode $srcpath
- fi
- fi
- elif [ "$3" = "synced" ]; then
- # Process existing synced paths
- sync_dirs $dstpath . $srcpath
- fi
- # Write the fstab entry
- if [ "$5" = "none" ]; then
- echo "$path $1 none bind 0 0" >> $FSTAB
- else
- echo "$path $1 none bind,$5 0 0" >> $FSTAB
- fi
- else
- continue
- fi
- done
- # Extract the fstab from the android initrd
- # NOTE: we should find a faster way of doing that or cache it
- OLD_CWD=$(pwd)
- mount -n -t tmpfs tmpfs ${rootmnt}/var/lib/lxc/android/rootfs
- cd ${rootmnt}/var/lib/lxc/android/rootfs
- cat /android-system/boot/android-ramdisk.img | gzip -d | cpio -i
- cd $OLD_CWD
- # Mount all the Android partitions
- cat ${rootmnt}/var/lib/lxc/android/rootfs/fstab* | while read line; do
- set -- $line
- # Skip any unwanted entry
- echo $1 | egrep -q "^#" && continue
- ([ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ] || [ -z "$4" ]) && continue
- ([ "$2" = "/system" ] || [ "$2" = "/data" ]) && continue
- label=$(echo $1 | awk -F/ '{print $NF}')
- [ -z "$label" ] && continue
- echo "initrd: checking mount label $label" >/dev/kmsg || true
- for dir in by-partlabel by-name by-label by-path by-uuid by-partuuid by-id; do
- path="/dev/disk/$dir/$label"
- [ -e "$path" ] && break
- done
- # MTD based devices, such as the emulator
- if [ ! -e "$path" ] && echo $label | egrep -q "^mtdblock"; then
- path="/dev/$label"
- fi
- [ ! -e "$path" ] && continue
- mkdir -p ${rootmnt}/android/$2
- echo "initrd: mounting $path as ${rootmnt}/android/$2" >/dev/kmsg || true
- mount $path ${rootmnt}/android/$2 -t $3 -o $4
- done
- # system is a special case
- echo "initrd: mounting ${rootmnt}/var/lib/lxc/android/system.img as ${rootmnt}/android/system" >/dev/kmsg || true
- mount --move /android-system ${rootmnt}/android/system
- # Ubuntu overlay available in the Android system image (hardware specific configs)
- mount_ubuntu_overlay ${rootmnt}/android/system/ubuntu ${rootmnt}
- # Apply device-specific udev rules
- if [ ! -f ${rootmnt}/android/system/ubuntu/lib/udev/rules.d/70-android.rules ] && [ "$device" != "unknown" ]; then
- mount --bind ${rootmnt}/usr/lib/lxc-android-config/70-$device.rules ${rootmnt}/lib/udev/rules.d/70-android.rules
- fi
- # Bind-mount /lib/modules from Android
- [ -e ${rootmnt}/android/system/lib/modules ] && mount --bind ${rootmnt}/android/system/lib/modules ${rootmnt}/lib/modules
- # Bind-mount /var/lib/ureadahead if available on persistent storage
- # this is required because ureadahead runs before mountall
- if [ -e ${rootmnt}/userdata/system-data/var/lib/ureadahead ] && \
- [ -e ${rootmnt}/var/lib/ureadahead ]; then
- mount --bind ${rootmnt}/userdata/system-data/var/lib/ureadahead ${rootmnt}/var/lib/ureadahead
- fi
- # Setup the swap device
- [ -e ${rootmnt}/userdata/SWAP.img ] && swapon ${rootmnt}/userdata/SWAP.img
- # Apply customized content
- for user in ${rootmnt}/userdata/user-data/*
- do
- if [ -d ${rootmnt}/custom/home ] && [ ! -e "$user/.customized" ]; then
- echo "initrd: copying custom content tp " >/dev/kmsg || true
- cp -Rap ${rootmnt}/custom/home/* "$user/"
- cp -Rap ${rootmnt}/custom/home/.[a-zA-Z0-9]* "$user/"
- touch "$user/.customized"
- dstown=$(stat -c "%u:%g" "$user")
- chown -R $dstown "$user/"
- fi
- done
- # Old flipped model
- elif [ -d /tmpmnt/ubuntu ]; then
- mount --bind /tmpmnt/ubuntu ${rootmnt}
- mountroot_status="$?"
- # Possibly a re-partitioned device
- else
- echo "initrd: Couldn't find a system partition." >/dev/kmsg || true
- panic "Couldn't find a system partition. Spawning adbd ..."
- fi
- [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-bottom"
- run_scripts /scripts/local-bottom
- [ "$quiet" != "y" ] && log_end_msg
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement