diff options
Diffstat (limited to 'tools/create_base_image_arm.sh')
-rwxr-xr-x | tools/create_base_image_arm.sh | 620 |
1 files changed, 0 insertions, 620 deletions
diff --git a/tools/create_base_image_arm.sh b/tools/create_base_image_arm.sh deleted file mode 100755 index b65600cc..00000000 --- a/tools/create_base_image_arm.sh +++ /dev/null @@ -1,620 +0,0 @@ -#!/bin/bash - -# Copyright 2019 Google Inc. All rights reserved. - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -source "${ANDROID_BUILD_TOP}/external/shflags/src/shflags" - -DEFINE_boolean p1 \ - false "Only generate/write the 1st partition (loader1)" "1" -DEFINE_boolean p2 \ - false "Only generate/write the 2nd partition (env)" "2" -DEFINE_boolean p3 \ - false "Only generate/write the 3rd partition (loader2)" "3" -DEFINE_boolean p4 \ - false "Only generate/write the 4th partition (trust)" "4" -DEFINE_boolean p5 \ - false "Only generate/write the 5th partition (rootfs)" "5" - -FLAGS_HELP="USAGE: $0 <KERNEL_DIR> [IMAGE] [flags]" - -FLAGS "$@" || exit $? -eval set -- "${FLAGS_ARGV}" - -if [ ${FLAGS_p1} -eq ${FLAGS_FALSE} ] && - [ ${FLAGS_p2} -eq ${FLAGS_FALSE} ] && - [ ${FLAGS_p3} -eq ${FLAGS_FALSE} ] && - [ ${FLAGS_p4} -eq ${FLAGS_FALSE} ] && - [ ${FLAGS_p5} -eq ${FLAGS_FALSE} ]; then - FLAGS_p1=${FLAGS_TRUE} - FLAGS_p2=${FLAGS_TRUE} - FLAGS_p3=${FLAGS_TRUE} - FLAGS_p4=${FLAGS_TRUE} - FLAGS_p5=${FLAGS_TRUE} -fi - -for arg in "$@" ; do - if [ -z $KERNEL_DIR ]; then - KERNEL_DIR=$arg - elif [ -z $IMAGE ]; then - IMAGE=$arg - else - flags_help - exit 1 - fi -done - -USE_IMAGE=`[ -z "${IMAGE}" ] && echo "0" || echo "1"` -OVERWRITE=`[ -e "${IMAGE}" ] && echo "1" || echo "0"` -if [ -z $KERNEL_DIR ]; then - flags_help - exit 1 -fi -if [ ! -e "${KERNEL_DIR}" ]; then - echo "error: can't find '${KERNEL_DIR}'. aborting..." - exit 1 -fi - -# escalate to superuser -if [ $UID -ne 0 ]; then - cd ${ANDROID_BUILD_TOP} - . ./build/envsetup.sh - lunch ${TARGET_PRODUCT}-${TARGET_BUILD_VARIANT} - mmma external/u-boot - cd - - exec sudo -E "${0}" ${@} -fi - -if [ $OVERWRITE -eq 1 ]; then - OVERWRITE_IMAGE=${IMAGE} - IMAGE=`mktemp` -fi - -if [ $USE_IMAGE -eq 0 ]; then - init_devs=`lsblk --nodeps -oNAME -n` - echo "Reinsert device (to write to) into PC" - while true; do - devs=`lsblk --nodeps -oNAME -n` - new_devs="$(echo -e "${init_devs}\n${devs}" | sort | uniq -u | awk 'NF')" - num_devs=`echo "${new_devs}" | wc -l` - if [[ "${new_devs}" == "" ]]; then - num_devs=0 - fi - if [[ ${num_devs} -gt 1 ]]; then - echo "error: too many new devices detected! aborting..." - exit 1 - fi - if [[ ${num_devs} -eq 1 ]]; then - if [[ "${new_devs}" != "${mmc_dev}" ]]; then - if [[ "${mmc_dev}" != "" ]]; then - echo "error: block device name mismatch ${new_devs} != ${mmc_dev}" - echo "Reinsert device (to write to) into PC" - fi - mmc_dev=${new_devs} - continue - fi - echo "${init_devs}" | grep "${mmc_dev}" >/dev/null - if [[ $? -eq 0 ]]; then - init_devs="${devs}" - continue - fi - break - fi - done - # now inform the user - echo "Detected device at /dev/${mmc_dev}" -fi - -if [ ${FLAGS_p1} -eq ${FLAGS_TRUE} ]; then - cd ${ANDROID_BUILD_TOP}/external/arm-trusted-firmware - CROSS_COMPILE=aarch64-linux-gnu- make PLAT=rk3399 DEBUG=0 ERROR_DEPRECATED=1 bl31 - export BL31="${ANDROID_BUILD_TOP}/external/arm-trusted-firmware/build/rk3399/release/bl31/bl31.elf" - cd - -fi - -cd ${ANDROID_BUILD_TOP}/external/u-boot - -if [ ${FLAGS_p2} -eq ${FLAGS_TRUE} ]; then - tmpfile=`mktemp` - bootenv=`mktemp` - cat > ${tmpfile} << "EOF" -bootdelay=2 -baudrate=1500000 -scriptaddr=0x00500000 -boot_targets=mmc1 mmc0 -bootcmd=run distro_bootcmd -distro_bootcmd=for target in ${boot_targets}; do run bootcmd_${target}; done -bootcmd_mmc0=devnum=0; run mmc_boot -bootcmd_mmc1=devnum=1; run mmc_boot -mmc_boot=if mmc dev ${devnum}; then ; run scan_for_boot_part; fi -scan_for_boot_part=part list mmc ${devnum} -bootable devplist; env exists devplist || setenv devplist 1; for distro_bootpart in ${devplist}; do if fstype mmc ${devnum}:${distro_bootpart} bootfstype; then run find_script; fi; done; setenv devplist; -find_script=if test -e mmc ${devnum}:${distro_bootpart} /boot/boot.scr; then echo Found U-Boot script /boot/boot.scr; run run_scr; fi -run_scr=load mmc ${devnum}:${distro_bootpart} ${scriptaddr} /boot/boot.scr; source ${scriptaddr} -EOF - script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" - echo "Sha=`${script_dir}/gen_sha.sh --kernel ${KERNEL_DIR}`" >> ${tmpfile} - ${ANDROID_HOST_OUT}/bin/mkenvimage -s 32768 -o ${bootenv} - < ${tmpfile} -fi - -if [ ${FLAGS_p1} -eq ${FLAGS_TRUE} ] || [ ${FLAGS_p3} -eq ${FLAGS_TRUE} ]; then - make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- rock-pi-4-rk3399_defconfig - if [ ${FLAGS_p1} -eq ${FLAGS_TRUE} ]; then - make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- -j`nproc` - fi - if [ ${FLAGS_p3} -eq ${FLAGS_TRUE} ]; then - make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- u-boot.itb - fi - if [ ${FLAGS_p1} -eq ${FLAGS_TRUE} ]; then - idbloader=`mktemp` - ${ANDROID_HOST_OUT}/bin/mkimage -n rk3399 -T rksd -d tpl/u-boot-tpl.bin ${idbloader} - cat spl/u-boot-spl.bin >> ${idbloader} - fi -fi -cd - - -if [ ${FLAGS_p5} -eq ${FLAGS_TRUE} ]; then - ${ANDROID_BUILD_TOP}/kernel/tests/net/test/build_rootfs.sh -a arm64 -s buster -n ${IMAGE} - if [ $? -ne 0 ]; then - echo "error: failed to build rootfs. exiting..." - exit 1 - fi - truncate -s +3G ${IMAGE} - e2fsck -f ${IMAGE} - resize2fs ${IMAGE} - - mntdir=`mktemp -d` - mount ${IMAGE} ${mntdir} - if [ $? != 0 ]; then - echo "error: unable to mount ${IMAGE} ${mntdir}" - exit 1 - fi - - cat > ${mntdir}/boot/boot.cmd << "EOF" -setenv bootcmd_dhcp ' -mw.b ${scriptaddr} 0 0x8000 -mmc dev 0 0 -mmc read ${scriptaddr} 0x1fc0 0x40 -env import -b ${scriptaddr} 0x8000 -mw.b ${scriptaddr} 0 0x8000 -if dhcp ${scriptaddr} manifest.txt; then - setenv OldSha ${Sha} - setenv Sha - env import -t ${scriptaddr} 0x8000 ManifestVersion - echo "Manifest version $ManifestVersion"; - if test "$ManifestVersion" = "1"; then - run manifest1 - elif test "$ManifestVersion" = "2"; then - run manifest2 - else - run manifestX - fi -fi' -setenv manifestX 'echo "***** ERROR: Unknown manifest version! *****";' -setenv manifest1 ' -env import -t ${scriptaddr} 0x8000 -if test "$Sha" != "$OldSha"; then - setenv serverip ${TftpServer} - setenv loadaddr 0x00200000 - mmc dev 0 0; - setenv file $TplSplImg; offset=0x40; size=0x1f80; run tftpget1; setenv TplSplImg - setenv file $UbootItb; offset=0x4000; size=0x2000; run tftpget1; setenv UbootItb - setenv file $TrustImg; offset=0x6000; size=0x2000; run tftpget1; setenv TrustImg - setenv file $RootfsImg; offset=0x8000; size=0; run tftpget1; setenv RootfsImg - setenv file $UbootEnv; offset=0x1fc0; size=0x40; run tftpget1; setenv UbootEnv - mw.b ${scriptaddr} 0 0x8000 - env export -b ${scriptaddr} 0x8000 - mmc write ${scriptaddr} 0x1fc0 0x40 -else - echo "Already have ${Sha}. Booting..." -fi' -setenv manifest2 ' -env import -t ${scriptaddr} 0x8000 -if test "$DFUethaddr" = "$ethaddr" || test "$DFUethaddr" = ""; then - if test "$Sha" != "$OldSha"; then - setenv serverip ${TftpServer} - setenv loadaddr 0x00200000 - mmc dev 0 0; - setenv file $TplSplImg; offset=0x40; size=0x1f80; run tftpget1; setenv TplSplImg - setenv file $UbootItb; offset=0x4000; size=0x2000; run tftpget1; setenv UbootItb - setenv file $TrustImg; offset=0x6000; size=0x2000; run tftpget1; setenv TrustImg - setenv file $RootfsImg; offset=0x8000; size=0; run tftpget1; setenv RootfsImg - setenv file $UbootEnv; offset=0x1fc0; size=0x40; run tftpget1; setenv UbootEnv - mw.b ${scriptaddr} 0 0x8000 - env export -b ${scriptaddr} 0x8000 - mmc write ${scriptaddr} 0x1fc0 0x40 - else - echo "Already have ${Sha}. Booting..." - fi -else - echo "Update ${Sha} is not for me. Booting..." -fi' -setenv tftpget1 ' -if test "$file" != ""; then - mw.b ${loadaddr} 0 0x400000 - tftp ${file} - if test $? = 0; then - setenv isGz 0 && setexpr isGz sub .*\\.gz\$ 1 ${file} - if test $isGz = 1; then - if test ${file} = ${UbootEnv}; then - echo "** gzipped env unsupported **" - else - setexpr boffset ${offset} * 0x200 - gzwrite mmc 0 ${loadaddr} 0x${filesize} 100000 ${boffset} && echo Updated: ${file} - fi - elif test ${file} = ${UbootEnv}; then - env import -b ${loadaddr} && echo Updated: ${file} - else - if test $size = 0; then - setexpr x $filesize - 1 - setexpr x $x / 0x1000 - setexpr x $x + 1 - setexpr x $x * 0x1000 - setexpr x $x / 0x200 - size=0x${x} - fi - mmc write ${loadaddr} ${offset} ${size} && echo Updated: ${file} - fi - fi - if test $? != 0; then - echo ** UPDATE FAILED: ${file} ** - fi -fi' -if mmc dev 1 0; then; else - run bootcmd_dhcp; -fi -load mmc ${devnum}:${distro_bootpart} 0x02080000 /boot/Image -load mmc ${devnum}:${distro_bootpart} 0x04000000 /boot/uInitrd -load mmc ${devnum}:${distro_bootpart} 0x01f00000 /boot/dtb/rockchip/rk3399-rock-pi-4.dtb -setenv finduuid "part uuid mmc ${devnum}:${distro_bootpart} uuid" -run finduuid -setenv bootargs "earlycon=uart8250,mmio32,0xff1a0000 console=ttyS2,1500000n8 loglevel=7 root=PARTUUID=${uuid} rootwait rootfstype=ext4 sdhci.debug_quirks=0x20000000" -booti 0x02080000 0x04000000 0x01f00000 -EOF - ${ANDROID_HOST_OUT}/bin/mkimage \ - -C none -A arm -T script -d ${mntdir}/boot/boot.cmd ${mntdir}/boot/boot.scr - - cd ${KERNEL_DIR} - export PATH=${ANDROID_BUILD_TOP}/prebuilts/clang/host/linux-x86/clang-r353983c/bin:$PATH - export PATH=${ANDROID_BUILD_TOP}/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin:$PATH - make ARCH=arm64 CC=clang CROSS_COMPILE=aarch64-linux-androidkernel- \ - CLANG_TRIPLE=aarch64-linux-gnu- rockpi4_defconfig - make ARCH=arm64 CC=clang CROSS_COMPILE=aarch64-linux-androidkernel- \ - CLANG_TRIPLE=aarch64-linux-gnu- -j`nproc` - - cp ${KERNEL_DIR}/arch/arm64/boot/Image ${mntdir}/boot/ - mkdir -p ${mntdir}/boot/dtb/rockchip/ - cp ${KERNEL_DIR}/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtb ${mntdir}/boot/dtb/rockchip/ - cd - - - mount -o bind /proc ${mntdir}/proc - mount -o bind /sys ${mntdir}/sys - mount -o bind /dev ${mntdir}/dev - - echo "Installing required packages..." - chroot ${mntdir} /bin/bash <<EOF -apt-get update -apt-get install -y -f initramfs-tools u-boot-tools network-manager openssh-server sudo man-db vim git dpkg-dev cdbs debhelper config-package-dev gdisk eject lzop binfmt-support ntpdate -EOF - - echo "Turning on DHCP client..." - cat >${mntdir}/etc/systemd/network/dhcp.network <<EOF -[Match] -Name=en* - -[Network] -DHCP=yes -EOF - - chroot ${mntdir} /bin/bash << "EOT" -echo "Adding user vsoc-01 and groups..." -useradd -m -G kvm,sudo -d /home/vsoc-01 --shell /bin/bash vsoc-01 -echo -e "cuttlefish\ncuttlefish" | passwd -echo -e "cuttlefish\ncuttlefish" | passwd vsoc-01 -EOT - - echo "Cloning android-cuttlefish..." - cd ${mntdir}/home/vsoc-01 - git clone https://github.com/google/android-cuttlefish.git - cd - - - echo "Creating led script..." - cat > ${mntdir}/usr/local/bin/led << "EOF" -#!/bin/bash - -if [ "$1" == "--start" ]; then - echo 125 > /sys/class/gpio/export - echo out > /sys/class/gpio/gpio125/direction - chmod 666 /sys/class/gpio/gpio125/value - echo 0 > /sys/class/gpio/gpio125/value - exit 0 -fi - -if [ "$1" == "--stop" ]; then - echo 0 > /sys/class/gpio/gpio125/value - echo 125 > /sys/class/gpio/unexport - exit 0 -fi - -if [ ! -e /sys/class/gpio/gpio125/value ]; then - echo "error: led service not initialized" - exit 1 -fi - -if [ "$1" == "0" ] || [ "$1" == "off" ] || [ "$1" == "OFF" ]; then - echo 0 > /sys/class/gpio/gpio125/value - exit 0 -fi - -if [ "$1" == "1" ] || [ "$1" == "on" ] || [ "$1" == "ON" ]; then - echo 1 > /sys/class/gpio/gpio125/value - exit 0 -fi - -echo "usage: led <0|1>" -exit 1 -EOF - chown root:root ${mntdir}/usr/local/bin/led - chmod 755 ${mntdir}/usr/local/bin/led - - echo "Creating led service..." - cat > ${mntdir}/etc/systemd/system/led.service << EOF -[Unit] - Description=led service - ConditionPathExists=/usr/local/bin/led - -[Service] - Type=oneshot - ExecStart=/usr/local/bin/led --start - ExecStop=/usr/local/bin/led --stop - RemainAfterExit=true - StandardOutput=journal - -[Install] - WantedBy=multi-user.target -EOF - - echo "Creating SD duplicator script..." - cat > ${mntdir}/usr/local/bin/sd-dupe << "EOF" -#!/bin/bash -led 0 - -src_dev=mmcblk0 -dest_dev=mmcblk1 -part_num=p5 - -if [ -e /dev/mmcblk0p5 ]; then - led 1 - - sgdisk -Z -a1 /dev/${dest_dev} - sgdisk -a1 -n:1:64:8127 -t:1:8301 -c:1:loader1 /dev/${dest_dev} - sgdisk -a1 -n:2:8128:8191 -t:2:8301 -c:2:env /dev/${dest_dev} - sgdisk -a1 -n:3:16384:24575 -t:3:8301 -c:3:loader2 /dev/${dest_dev} - sgdisk -a1 -n:4:24576:32767 -t:4:8301 -c:4:trust /dev/${dest_dev} - sgdisk -a1 -n:5:32768:- -A:5:set:2 -t:5:8305 -c:5:rootfs /dev/${dest_dev} - - src_block_count=`tune2fs -l /dev/${src_dev}${part_num} | grep "Block count:" | sed 's/.*: *//'` - src_block_size=`tune2fs -l /dev/${src_dev}${part_num} | grep "Block size:" | sed 's/.*: *//'` - src_fs_size=$(( src_block_count*src_block_size )) - src_fs_size_m=$(( src_fs_size / 1024 / 1024 + 1 )) - - dd if=/dev/${src_dev}p1 of=/dev/${dest_dev}p1 conv=sync,noerror status=progress - dd if=/dev/${src_dev}p2 of=/dev/${dest_dev}p2 conv=sync,noerror status=progress - dd if=/dev/${src_dev}p3 of=/dev/${dest_dev}p3 conv=sync,noerror status=progress - dd if=/dev/${src_dev}p4 of=/dev/${dest_dev}p4 conv=sync,noerror status=progress - - echo "Writing ${src_fs_size_m} MB: /dev/${src_dev} -> /dev/${dest_dev}..." - dd if=/dev/${src_dev}${part_num} of=/dev/${dest_dev}${part_num} bs=1M conv=sync,noerror status=progress - - echo "Expanding /dev/${dest_dev}${part_num} filesystem..." - e2fsck -fy /dev/${dest_dev}${part_num} - resize2fs /dev/${dest_dev}${part_num} - tune2fs -O has_journal /dev/${dest_dev}${part_num} - e2fsck -fy /dev/${dest_dev}${part_num} - sync /dev/${dest_dev} - - echo "Cleaning up..." - mount /dev/${dest_dev}${part_num} /media - chroot /media /usr/local/bin/install-cleanup - - if [ $? == 0 ]; then - echo "Successfully copied Rock Pi image!" - while true; do - led 1; sleep 0.5 - led 0; sleep 0.5 - done - else - echo "Error while copying Rock Pi image" - while true; do - led 1; sleep 0.1 - led 0; sleep 0.1 - done - fi -else - echo "Expanding /dev/${dest_dev}${part_num} filesystem..." - e2fsck -fy /dev/${dest_dev}${part_num} - resize2fs /dev/${dest_dev}${part_num} - tune2fs -O has_journal /dev/${dest_dev}${part_num} - e2fsck -fy /dev/${dest_dev}${part_num} - sync /dev/${dest_dev} - - echo "Cleaning up..." - /usr/local/bin/install-cleanup -fi -EOF - chmod +x ${mntdir}/usr/local/bin/sd-dupe - - echo "Creating SD duplicator service..." - cat > ${mntdir}/etc/systemd/system/sd-dupe.service << EOF -[Unit] - Description=Duplicate SD card rootfs to eMMC on Rock Pi - ConditionPathExists=/usr/local/bin/sd-dupe - After=led.service - -[Service] - Type=simple - ExecStart=/usr/local/bin/sd-dupe - TimeoutSec=0 - StandardOutput=tty - -[Install] - WantedBy=multi-user.target -EOF - - echo "Creating cleanup script..." - cat > ${mntdir}/usr/local/bin/install-cleanup << "EOF" -#!/bin/bash -echo "Installing cuttlefish-common package..." -echo "nameserver 8.8.8.8" > /etc/resolv.conf -MAC=`ip link | grep eth0 -A1 | grep ether | sed 's/.*\(..:..:..:..:..:..\) .*/\1/' | tr -d :` -sed -i " 1 s/.*/& rockpi-${MAC}/" /etc/hosts -sudo hostnamectl set-hostname "rockpi-${MAC}" - -dpkg --add-architecture amd64 -until ping -c1 ftp.debian.org; do sleep 1; done -ntpdate time.google.com -while true; do - apt-get -o Acquire::Check-Valid-Until=false update - if [ $? != 0 ]; then sleep 1; continue; fi - apt-get install -y -f libc6:amd64 qemu-user-static - if [ $? != 0 ]; then sleep 1; continue; fi - break -done -cd /home/vsoc-01/android-cuttlefish -dpkg-buildpackage -d -uc -us -apt-get install -y -f ../cuttlefish-common_*_arm64.deb -apt-get clean -usermod -aG cvdnetwork vsoc-01 -chmod 660 /dev/vhost-vsock -chown root:cvdnetwork /dev/vhost-vsock - -rm /etc/machine-id -rm /var/lib/dbus/machine-id -dbus-uuidgen --ensure -systemd-machine-id-setup - -systemctl disable sd-dupe -rm /etc/systemd/system/sd-dupe.service -rm /usr/local/bin/sd-dupe -rm /usr/local/bin/install-cleanup -EOF - chmod +x ${mntdir}/usr/local/bin/install-cleanup - - chroot ${mntdir} /bin/bash << "EOT" -echo "Enabling services..." -systemctl enable led -systemctl enable sd-dupe - -echo "Creating Initial Ramdisk..." -update-initramfs -c -t -k "5.2.0" -mkimage -A arm -O linux -T ramdisk -C none -a 0 -e 0 -n uInitrd -d /boot/initrd.img-5.2.0 /boot/uInitrd-5.2.0 -ln -s /boot/uInitrd-5.2.0 /boot/uInitrd -EOT - - umount ${mntdir}/sys - umount ${mntdir}/dev - umount ${mntdir}/proc - umount ${mntdir} - - # Turn on journaling - tune2fs -O ^has_journal ${IMAGE} - e2fsck -fy ${IMAGE} >/dev/null 2>&1 -fi - -if [ ${USE_IMAGE} -eq 0 ]; then - # 32GB eMMC size - end_sector=61071326 - device=/dev/${mmc_dev} - devicep=${device} - - sgdisk -Z -a1 ${device} - sgdisk -a1 -n:1:64:8127 -t:1:8301 -c:1:loader1 ${device} - sgdisk -a1 -n:2:8128:8191 -t:2:8301 -c:2:env ${device} - sgdisk -a1 -n:3:16384:24575 -t:3:8301 -c:3:loader2 ${device} - sgdisk -a1 -n:4:24576:32767 -t:4:8301 -c:4:trust ${device} - sgdisk -a1 -n:5:32768:${end_sector} -A:5:set:2 -t:5:8305 -c:5:rootfs ${device} - if [ ${FLAGS_p5} -eq ${FLAGS_TRUE} ]; then - dd if=${IMAGE} of=${devicep}5 bs=1M - resize2fs ${devicep}5 >/dev/null 2>&1 - fi -else - device=$(losetup -f) - devicep=${device}p - if [ ${FLAGS_p5} -eq ${FLAGS_FALSE} ]; then - fs_end=3G - end_sector=- - fi - if [ ${FLAGS_p5} -eq ${FLAGS_TRUE} ]; then - # Minimize rootfs filesystem - while true; do - out=`sudo resize2fs -M ${IMAGE} 2>&1` - if [[ $out =~ "Nothing to do" ]]; then - break - fi - done - # Minimize rootfs file size - block_count=`sudo tune2fs -l ${IMAGE} | grep "Block count:" | sed 's/.*: *//'` - block_size=`sudo tune2fs -l ${IMAGE} | grep "Block size:" | sed 's/.*: *//'` - sector_size=512 - start_sector=32768 - fs_size=$(( block_count*block_size )) - fs_sectors=$(( fs_size/sector_size )) - part_sectors=$(( ((fs_sectors-1)/2048+1)*2048 )) # 1MB-aligned - end_sector=$(( start_sector+part_sectors-1 )) - secondary_gpt_sectors=33 - fs_end=$(( (end_sector+secondary_gpt_sectors+1)*sector_size )) - image_size=$(( part_sectors*sector_size )) - truncate -s ${image_size} ${IMAGE} - e2fsck -fy ${IMAGE} >/dev/null 2>&1 - fi - - # Create final image - if [ $OVERWRITE -eq 1 ]; then - tmpimg=${OVERWRITE_IMAGE} - else - tmpimg=`mktemp` - fi - truncate -s ${fs_end} ${tmpimg} - - # Create GPT - sgdisk -Z -a1 ${tmpimg} - sgdisk -a1 -n:1:64:8127 -t:1:8301 -c:1:loader1 ${tmpimg} - sgdisk -a1 -n:2:8128:8191 -t:2:8301 -c:2:env ${tmpimg} - sgdisk -a1 -n:3:16384:24575 -t:3:8301 -c:3:loader2 ${tmpimg} - sgdisk -a1 -n:4:24576:32767 -t:4:8301 -c:4:trust ${tmpimg} - sgdisk -a1 -n:5:32768:${end_sector} -A:5:set:2 -t:5:8305 -c:5:rootfs ${tmpimg} - - losetup ${device} ${tmpimg} - partx -v --add ${device} - - if [ ${FLAGS_p5} -eq ${FLAGS_TRUE} ]; then - dd if=${IMAGE} of=${devicep}5 bs=1M - fi -fi -if [ ${FLAGS_p1} -eq ${FLAGS_TRUE} ]; then - dd if=${idbloader} of=${devicep}1 -fi -if [ ${FLAGS_p2} -eq ${FLAGS_TRUE} ]; then - dd if=${bootenv} of=${devicep}2 -fi -if [ ${FLAGS_p3} -eq ${FLAGS_TRUE} ]; then - dd if=${ANDROID_BUILD_TOP}/external/u-boot/u-boot.itb of=${devicep}3 -fi -if [ ${USE_IMAGE} -eq 1 ]; then - chown $SUDO_USER:`id -ng $SUDO_USER` ${tmpimg} - if [ $OVERWRITE -eq 0 ]; then - mv ${tmpimg} ${IMAGE} - fi - partx -v --delete ${device} - losetup -d ${device} -fi |