1e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah#!/bin/bash 2e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah 3e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah# Copyright (c) 2011 The Chromium OS Authors. All rights reserved. 4e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah# Use of this source code is governed by a BSD-style license that can be 5e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah# found in the LICENSE file. 6e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah 7e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah# Script to convert a recovery image into an SSD image. Changes are made in- 8e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah# place. 9e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah 10e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shahusage() { 11e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah cat <<EOF 12236faae91a224b36fb48ec407535a426f1f67877Eric M. BlakeUsage: $PROG <image> [--force] [--cgpt=/path/to/cgpt] 13e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah 14236faae91a224b36fb48ec407535a426f1f67877Eric M. BlakeIn-place converts recovery <image> into an SSD image. With --force, does not 15236faae91a224b36fb48ec407535a426f1f67877Eric M. Blakeask for confirmation from the user. Use --cgpt= to specify cgpt binary location. 16e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah 17e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav ShahEOF 18236faae91a224b36fb48ec407535a426f1f67877Eric M. Blake exit 1 19e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah} 20e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah 21236faae91a224b36fb48ec407535a426f1f67877Eric M. Blakeif [ $# -lt 1 ] || [ $# -gt 3 ]; then 22e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah usage 23236faae91a224b36fb48ec407535a426f1f67877Eric M. Blakeelse 24236faae91a224b36fb48ec407535a426f1f67877Eric M. Blake IMAGE=$1 25236faae91a224b36fb48ec407535a426f1f67877Eric M. Blake shift 26e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shahfi 27e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah 28236faae91a224b36fb48ec407535a426f1f67877Eric M. Blakefor arg in $*; do 29236faae91a224b36fb48ec407535a426f1f67877Eric M. Blake case "$arg" in 30236faae91a224b36fb48ec407535a426f1f67877Eric M. Blake --force) 31236faae91a224b36fb48ec407535a426f1f67877Eric M. Blake IS_FORCE=$arg 32236faae91a224b36fb48ec407535a426f1f67877Eric M. Blake ;; 33236faae91a224b36fb48ec407535a426f1f67877Eric M. Blake --cgpt=*) 34236faae91a224b36fb48ec407535a426f1f67877Eric M. Blake GPT=${arg#--cgpt=} 35236faae91a224b36fb48ec407535a426f1f67877Eric M. Blake ;; 36236faae91a224b36fb48ec407535a426f1f67877Eric M. Blake *) 37236faae91a224b36fb48ec407535a426f1f67877Eric M. Blake usage 38236faae91a224b36fb48ec407535a426f1f67877Eric M. Blake ;; 39236faae91a224b36fb48ec407535a426f1f67877Eric M. Blake esac 40236faae91a224b36fb48ec407535a426f1f67877Eric M. Blakedone 41236faae91a224b36fb48ec407535a426f1f67877Eric M. Blake 42236faae91a224b36fb48ec407535a426f1f67877Eric M. Blake# Load common constants (and use GPT if set above) and variables. 43236faae91a224b36fb48ec407535a426f1f67877Eric M. Blake. "$(dirname "$0")/common_minimal.sh" 44236faae91a224b36fb48ec407535a426f1f67877Eric M. Blake 45236faae91a224b36fb48ec407535a426f1f67877Eric M. Blaketype -P $GPT &>/dev/null || 46236faae91a224b36fb48ec407535a426f1f67877Eric M. Blake { echo "cgpt tool must be in the path or specified via --cgpt"; exit 1; } 47e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah 48e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah# Abort on errors. 49e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shahset -e 50e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah 51e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shahif [ "${IS_FORCE}" != "--force" ]; then 52e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah echo "This will modify ${IMAGE} in-place and convert it into an SSD image." 53e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah read -p "Are you sure you want to continue (y/N)?" SURE 54e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah SURE="${SURE:0:1}" 55e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah [ "${SURE}" != "y" ] && exit 1 56e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shahfi 57e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah 58e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shahkerna_offset=$(partoffset ${IMAGE} 2) 59e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shahkernb_offset=$(partoffset ${IMAGE} 4) 60e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah# Kernel partition sizes should be the same. 61e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shahkern_size=$(partsize ${IMAGE} 2) 62e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah 63e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah# Move Kernel B to Kernel A. 64e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shahkernb=$(make_temp_file) 65e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shahecho "Replacing Kernel partition A with Kernel partition B" 66e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shahextract_image_partition ${IMAGE} 4 ${kernb} 67e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shahreplace_image_partition ${IMAGE} 2 ${kernb} 68e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah 69e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah# Overwrite the vblock. 70e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shahstateful_dir=$(make_temp_dir) 71e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shahtmp_vblock=$(make_temp_file) 72e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shahmount_image_partition_ro ${IMAGE} 1 ${stateful_dir} 73e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shahsudo cp ${stateful_dir}/vmlinuz_hd.vblock ${tmp_vblock} 74e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah# Unmount before overwriting image to avoid sync issues. 75d170a9d542dd4770c25d5ed82429a55391d88218Gaurav Shahsudo umount ${stateful_dir} 76e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shahecho "Overwriting kernel partition A vblock with SSD vblock" 77e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shahsudo dd if=${tmp_vblock} of=${IMAGE} seek=${kerna_offset} bs=512 conv=notrunc 78e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah 79e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shah# Zero out Kernel B partition. 80e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shahecho "Zeroing out Kernel partition B" 81e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shahsudo dd if=/dev/zero of=${IMAGE} seek=${kernb_offset} bs=512 count=${kern_size} conv=notrunc 82e77bec95d57ad8937e005ec7ebf183c925e656d9Gaurav Shahecho "${IMAGE} was converted to an SSD image." 83