diff --git a/build-initrd.sh b/build-initrd.sh index 473de43..e49fda9 100755 --- a/build-initrd.sh +++ b/build-initrd.sh @@ -5,6 +5,8 @@ set -e export FLASH_KERNEL_SKIP=1 export DEBIAN_FRONTEND=noninteractive DEFAULTMIRROR="https://deb.debian.org/debian" +DEFAULTUBPORTSMIRROR="http://repo.ubports.com/" +UBPORTSKEYRING="https://repo.ubports.com/keyring.gpg" APT_COMMAND="apt -y" usage() { @@ -38,12 +40,14 @@ done # Defaults for all arguments, so they can be set by the environment [ -z $ARCH ] && ARCH="armhf" [ -z $MIRROR ] && MIRROR=$DEFAULTMIRROR -[ -z $RELEASE ] && RELEASE="stretch" +[ -z $UBPORTSMIRROR ] && UBPORTSMIRROR=$DEFAULTUBPORTSMIRROR +[ -z $RELEASE ] && RELEASE="buster" +[ -z $UBPORTSRELEASE ] && UBPORTSRELEASE="xenial" [ -z $ROOT ] && ROOT=./build/$ARCH [ -z $OUT ] && OUT=./out # list all packages needed for halium's initrd here -[ -z $INCHROOTPKGS ] && INCHROOTPKGS="initramfs-tools dctrl-tools e2fsprogs libc6-dev zlib1g-dev libssl-dev busybox-static" +[ -z $INCHROOTPKGS ] && INCHROOTPKGS="initramfs-tools dctrl-tools dmsetup e2fsprogs libc6-dev zlib1g-dev libssl-dev busybox-static parse-android-dynparts" BOOTSTRAP_BIN="qemu-debootstrap --arch $ARCH --variant=minbase" @@ -76,6 +80,11 @@ if [ ! -e $ROOT/.min-done ]; then #sed -i 's/main$/main universe/' $ROOT/etc/apt/sources.list sed -i 's,'"$DEFAULTMIRROR"','"$MIRROR"',' $ROOT/etc/apt/sources.list + mkdir -p $ROOT/etc/apt/sources.list.d + echo "deb $UBPORTSMIRROR $UBPORTSRELEASE main" > $ROOT/etc/apt/sources.list.d/ubports.list + + mkdir -p $ROOT/etc/apt/trusted.gpg.d + wget "$UBPORTSKEYRING" -O $ROOT/etc/apt/trusted.gpg.d/ubports.gpg # make sure we do not start daemons at install time mv $ROOT/sbin/start-stop-daemon $ROOT/sbin/start-stop-daemon.REAL diff --git a/hooks/halium b/hooks/halium index 29f31e1..ff72866 100755 --- a/hooks/halium +++ b/hooks/halium @@ -23,7 +23,9 @@ copy_exec /sbin/e2fsck /sbin copy_exec /sbin/resize2fs /sbin copy_exec /bin/chown /bin copy_exec /bin/mount /bin +copy_exec /sbin/dmsetup /sbin copy_exec /sbin/dumpe2fs /sbin copy_exec /lib/$DEB_HOST_MULTIARCH/libz.so.1 copy_exec /usr/lib/$DEB_HOST_MULTIARCH/libcrypto.so copy_exec /usr/lib/$DEB_HOST_MULTIARCH/libdl.so +copy_exec /usr/sbin/parse-android-dynparts /sbin diff --git a/scripts/halium b/scripts/halium index 7dea11e..8bcce85 100644 --- a/scripts/halium +++ b/scripts/halium @@ -486,15 +486,36 @@ mountroot() { [ `blkid $path -o value -s TYPE` = "ext4" ] && OPTIONS="data=journal," mount -o discard,$OPTIONS $path /tmpmnt + # setup super partition if exists + if [ -n "/dev/disk/by-partlabel/super" ]; then + tell_kmsg "trying to parse and dmsetup subpartitions from super partition" + /sbin/parse-android-dynparts /dev/disk/by-partlabel/super | sh + fi + # Set $_syspart if it is specified as systempart= on the command line if grep -q systempart= /proc/cmdline; then for x in $(cat /proc/cmdline); do case ${x} in systempart=*) _syspart=${x#*=} + if [ -z ${_syspart##*:*} ]; then + _syspart_options=${_syspart##*:} + _syspart=${_syspart%%:*} + fi ;; esac done + + if [ -z "$_syspart_options" ]; then + _syspart_options=rw + fi + fi + + # We need to add the slot suffix to $_syspart for A/B devices + if [ -n "$_syspart" ] && [ ! -e "$_syspart" ] && [ ! -z "$ab_slot_suffix" ]; then + tell_kmsg "A/B slot system detected! Slot suffix is $ab_slot_suffix" + _syspart="${_syspart}${ab_slot_suffix}" + tell_kmsg "system partition is at $_syspart" fi identify_file_layout @@ -514,7 +535,7 @@ mountroot() { tell_kmsg "mounting system rootfs at /halium-system" if [ -n "$_syspart" ]; then - mount -o rw $_syspart /halium-system + mount -o "$_syspart_options" $_syspart /halium-system elif [ -f "$imagefile" ]; then # Rootfs is an image file mount -o loop,rw $imagefile /halium-system @@ -530,6 +551,12 @@ mountroot() { identify_android_image [ $ANDROID_IMAGE_MODE = "unknown" ] && tell_kmsg "WARNING: Android system image not found." + if { [ -n "$_syspart_options" ] && [ -z "${_syspart_options##*ro*}" ]; } || [ -e /tmpmnt/.writable_image_overlay ] || [ -e /halium-system/.writable_image_overlay ]; then + # If systempart had to be mounted ro, mount rw overlayfs on top + mkdir -p /tmpmnt/rootfs-overlay /tmpmnt/rootfs-overlay-workdir + mount -t overlay rootfs -o lowerdir=/halium-system,upperdir=/tmpmnt/rootfs-overlay,workdir=/tmpmnt/rootfs-overlay-workdir /halium-system + fi + # If either (android) /data/.writable_image or (on rootfs) # /.writable_image exist, mount the rootfs as rw if [ -e /tmpmnt/.writable_image ] || [ -e /halium-system/.writable_image ]; then