| Index: src/platform/memento_softwareupdate/memento_updater.sh
|
| diff --git a/src/platform/memento_softwareupdate/memento_updater.sh b/src/platform/memento_softwareupdate/memento_updater.sh
|
| index a24477c8a9a430932f05505373522e3e77605961..3ce2fa375a1b91ba70e7f8b8ea2d568bdea6e033 100755
|
| --- a/src/platform/memento_softwareupdate/memento_updater.sh
|
| +++ b/src/platform/memento_softwareupdate/memento_updater.sh
|
| @@ -105,31 +105,28 @@ fi
|
| # fast.
|
| log Update Found: $IMG_URL checksum: $CHECKSUM
|
|
|
| -# figure out which device i'm on, and which to download to.
|
| -ROOT_ARG=$(cat /proc/cmdline | tr ' ' '\n' | grep ^root= | cut -d = -f 2-)
|
| -LOCAL_DEV="$ROOT_ARG"
|
| -# do some device sanity checks
|
| -if expr match "$ROOT_ARG" '^UUID=' > /dev/null
|
| -then
|
| - LOCAL_DEV=$(readlink -f /dev/disk/by-uuid/${ROOT_ARG#UUID=})
|
| -elif expr match "$ROOT_ARG" '^LABEL=' > /dev/null
|
| -then
|
| - LOCAL_DEV=$(readlink -f /dev/disk/by-label/${ROOT_ARG#LABEL=})
|
| -fi
|
| +# Figure out which partition I'm on, and which to download to.
|
| +LOCAL_DEV=$(rootdev)
|
|
|
| -# we install onto the other dev. so if we end in 1, other ends in 2, and
|
| +# We install onto the other partition so if we end in 3, other ends in 5, and
|
| # vice versa
|
| -INSTALL_DEV=$(echo $LOCAL_DEV | tr '1234' '2143')
|
| -
|
| -ROOT_DEV=$(echo $LOCAL_DEV | tr -d '1234') # strip trailing number
|
| -
|
| -# do some device sanity checks
|
| -if ! expr match "$LOCAL_DEV" '^/dev/[a-z][a-z]*[1234]$' > /dev/null
|
| +INSTALL_DEV=$(echo $LOCAL_DEV | tr '35' '53')
|
| +NEW_PART_NUM=${INSTALL_DEV##*/*[a-z]}
|
| +# The kernel needs to be installed to its own partition. We'll handle that in
|
| +# the postinst script (from the new rootfs). partitions 2&3 are image A,
|
| +# partitions 4&5 are image B.
|
| +KINSTALL_DEV=$(echo $INSTALL_DEV | tr '35' '24')
|
| +
|
| +# Find whole disk device.
|
| +ROOT_DEV=${LOCAL_DEV%%[0-9]*}
|
| +
|
| +# Do some device sanity checks.
|
| +if ! expr match "$LOCAL_DEV" '^/dev/[a-z][a-z]*[12345]$' > /dev/null
|
| then
|
| log "didnt find good local device. local: $LOCAL_DEV install: $INSTALL_DEV"
|
| exit 1
|
| fi
|
| -if ! expr match "$INSTALL_DEV" '^/dev/[a-z][a-z]*[1234]$' > /dev/null
|
| +if ! expr match "$INSTALL_DEV" '^/dev/[a-z][a-z]*[12345]$' > /dev/null
|
| then
|
| log "didnt find good install device. local: $LOCAL_DEV install: $INSTALL_DEV"
|
| exit 1
|
| @@ -142,14 +139,14 @@ fi
|
|
|
| log Booted from "$LOCAL_DEV" and installing onto "$INSTALL_DEV"
|
|
|
| -# make sure installation device is unmounted
|
| +# Make sure installation device is unmounted.
|
| if [ "$INSTALL_DEV" == ""$(grep "^$INSTALL_DEV " /proc/mounts | \
|
| cut -d ' ' -f 1 | uniq) ]
|
| then
|
| - # drive is mounted. must unmount
|
| + # Drive is mounted, must unmount.
|
| log unmounting "$INSTALL_DEV"
|
| umount "$INSTALL_DEV"
|
| - # check if it's still mounted for some strange reason
|
| + # Check if it's still mounted for some strange reason.
|
| if [ "$INSTALL_DEV" == ""$(grep "^$INSTALL_DEV " /proc/mounts | \
|
| cut -d ' ' -f 1 | uniq) ]
|
| then
|
| @@ -158,7 +155,7 @@ then
|
| fi
|
| fi
|
|
|
| -# download file to the device
|
| +# Download file to the device.
|
| log downloading image. this may take a while
|
|
|
| # wget - fetch file, send to stdout
|
| @@ -236,8 +233,9 @@ else
|
| fi
|
| fi
|
|
|
| -"$MOUNTPOINT"/postinst "$INSTALL_DEV" 2>&1 | cat >> "$MEMENTO_AU_LOG"; \
|
| - [ "${PIPESTATUS[*]}" = "0 0" ]
|
| +"$MOUNTPOINT"/postinst "$INSTALL_DEV" "$KINSTALL_DEV" 2>&1 | \
|
| + cat >> "$MEMENTO_AU_LOG"
|
| +[ "${PIPESTATUS[*]}" = "0 0" ]
|
| POSTINST_RETURN_CODE=$?
|
| umount "$MOUNTPOINT"
|
| rmdir "$MOUNTPOINT"
|
| @@ -255,8 +253,8 @@ function abort_update_if_cmd_failed {
|
| abort_update_if_cmd_failed_long "$?" "!!"
|
| }
|
|
|
| -# if it failed, don't update MBR but just to be safe, zero out a page of
|
| -# install device
|
| +# If it failed, don't update MBR but just to be safe, zero out a page of
|
| +# install device.
|
| abort_update_if_cmd_failed_long "$POSTINST_RETURN_CODE" "$MOUNTPOINT"/postinst
|
|
|
| # postinstall on new partition succeeded.
|
| @@ -269,12 +267,19 @@ log updating MBR of usb device
|
| # flush linux caches; seems to be necessary
|
| sync
|
| echo 3 > /proc/sys/vm/drop_caches
|
| -
|
| -LAYOUT_FILE=/tmp/new_partition_layout
|
| -sfdisk -d $ROOT_DEV | sed -e "s/${INSTALL_DEV//\//\\/} .*[^e]$/&, bootable/" \
|
| - -e "s/\(${LOCAL_DEV//\//\\/} .*\), bootable/\1/" \
|
| - > "$LAYOUT_FILE"
|
| -sfdisk --force $ROOT_DEV < "$LAYOUT_FILE" 2>&1 | cat >> "$MEMENTO_AU_LOG"
|
| +# Configure the PMBR to boot the new image.
|
| +# TODO: ChromeOS EFI BIOS will need a different command to set the GPT
|
| +# partition attributes bits to mark the new image as bootable.
|
| +# NOTE: This won't work for ARM, because we'll need to regenerate the U-Boot
|
| +# script when the kernel size and location are changed. Luckily it won't
|
| +# matter because we'll ship with the GPT-based selection process. The U-Boot
|
| +# script is just a temporary hack for bringup.
|
| +# FIX: The current gpt tool requires a -b arg to specify the PMBR bootcode. We
|
| +# don't want to change the code, so we have to extract it, then put it back.
|
| +# We'll fix this RSN.
|
| +dd if=${ROOT_DEV} bs=512 count=1 of=/tmp/oldpmbr.bin
|
| +gpt -S boot -i $NEW_PART_NUM -b /tmp/oldpmbr.bin ${ROOT_DEV} 2>&1 | \
|
| + cat >> "$MEMENTO_AU_LOG"
|
| abort_update_if_cmd_failed
|
|
|
| # mark update as complete so we don't try to update again
|
|
|