Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # 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
- }
- mountroot()
- {
- # list of possible userdata partition names
- partlist="userdata UDA DATAFS USERDATA"
- /bin/lvm.static vgscan
- /bin/lvm.static vgchange -ay
- udevadm settle
- 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
- 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)
- path=$(readlink -f $part)
- [ -n "$path" ] && break
- done
- echo "initrd: mounting $path" >/dev/kmsg || true
- # Mount the data partition to a temporary mount point
- mount /dev/store/cm-data /tmpmnt
- mount --bind /tmpmnt/ubuntu ${rootmnt}
- # Loop-mounted flipped model
- if [ -e /tmpmnt/system.img ]; then
- # Prepare the root filesystem
- if [ -e /tmpmnt/.developer_mode ]; then
- echo "initrd: mounting system.img (developer mode)" >/dev/kmsg || true
- mount -o loop,rw /tmpmnt/system.img ${rootmnt}
- mountroot_status="$?"
- else
- echo "initrd: mounting system.img (user mode)" >/dev/kmsg || true
- mount -o loop,ro /tmpmnt/system.img ${rootmnt}
- mountroot_status="$?"
- fi
- mkdir ${rootmnt}/userdata
- mount --move /tmpmnt ${rootmnt}/userdata
- # Mount the android system partition to a temporary location
- mkdir -p /android-system /android-initrd
- mount /dev/store/cm-system /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
- 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 1" >> $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" ]) && 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 defaults 0 1" >> $FSTAB
- elif [ "$3" = "persistent" ]; 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 paths
- mkdir -p ${srcpath%/*}
- if [ ! -d "$dstpath" ]; then
- # Deal with redirected files
- if [ "$4" = "transition" ]; then
- cp -a $dstpath $srcpath
- else
- touch $srcpath
- fi
- else
- # Deal with redirected directories
- if [ "$4" = "transition" ]; then
- cp -aR $dstpath $srcpath
- else
- mkdir $srcpath
- fi
- fi
- fi
- # Write the fstab entry
- echo "$path $1 none bind 0 1" >> $FSTAB
- 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)
- cd /android-initrd
- cat /android-system/boot/android-ramdisk.img | gzip -d | cpio -i fstab*
- cd $OLD_CWD
- # Mount all the Android partitions
- cat /android-initrd/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
- for dir in by-partlabel by-name by-label; do
- path="/dev/disk/$dir/$label"
- [ -e "$path" ] && break
- done
- [ ! -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 --bind /android-system ${rootmnt}/android/system
- mount --bind ${rootmnt}/userdata ${rootmnt}/android/data
- # Apply device-specific udev rules
- if [ "$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 /android/system/lib/modules ] && mount --bind /android/system/lib/modules ${rootmnt}/lib/modules
- # 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