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