Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(236)

Unified Diff: resize_stateful_partition.sh

Issue 3391018: Issue 6759: reduce size of stateful partition for non-developer recovery image (Closed) Base URL: http://git.chromium.org/git/crosutils.git
Patch Set: incorporate wad's algo for resizing Created 10 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mod_image_for_recovery.sh ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: resize_stateful_partition.sh
diff --git a/resize_stateful_partition.sh b/resize_stateful_partition.sh
new file mode 100755
index 0000000000000000000000000000000000000000..d83e0b8f42ebf75e79301bae79ccde486497cb9c
--- /dev/null
+++ b/resize_stateful_partition.sh
@@ -0,0 +1,96 @@
+#!/bin/bash
+
+# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Utility methods used to resize a stateful partition and update the GPT table
+
+# Source constants and utility functions
+. "$(dirname "$0")/common.sh"
+. "$(dirname "$0")/chromeos-common.sh"
+
+locate_gpt
+
+umount_from_loop_dev() {
+ local mnt_pt=$1
+ mount | grep -q " on ${mnt_pt}" && sudo umount -d ${mnt_pt}
+ rmdir ${mnt_pt}
+}
+
+cleanup_loop_dev() {
+ sudo losetup -d ${1} || /bin/true
+}
+
+get_loop_dev() {
+ local loop_dev=$(sudo losetup -f)
+ if [ -z "${loop_dev}" ]; then
+ die "No free loop device. Free up a loop device or reboot. Exiting."
+ fi
+ echo ${loop_dev}
+}
+
+# Resize stateful partition of install shim to hold payload content
+# Due to this resize, we need to create a new partition table and a new image.
+# (see update_partition_table() for details)
+enlarge_partition_image() {
+ local source_part=$1 # source partition
+ local add_num_sectors=$2 # number of 512-byte sectors to be added
+
+ local source_sectors=$(roundup $(numsectors ${source_part}))
+ info "source partition has ${source_sectors} 512-byte sectors."
+ local resized_sectors=$(roundup $(expr $source_sectors + $add_num_sectors))
+ info "resized partition has ${resized_sectors} 512-byte sectors."
+
+ local loop_dev=$(get_loop_dev)
+ trap "cleanup_loop_dev ${loop_dev}" EXIT
+
+ # Extend the source file size to the new size.
+ dd if=/dev/zero of="${source_part}" bs=1 count=1 \
+ seek=$((512 * ${resized_sectors} - 1)) &>/dev/null
+
+ # Resize the partition.
+ sudo losetup "${loop_dev}" "${source_part}"
+ sudo e2fsck -fp "${loop_dev}" &> /dev/null
+ sudo resize2fs "${loop_dev}" &> /dev/null
+ # trap handler will clean up the loop device
+ echo "${resized_sectors}"
+}
+
+# Update partition table with resized stateful partition
+update_partition_table() {
+ local src_img=$1 # source image
+ local temp_state=$2 # stateful partition image
+ local resized_sectors=$3 # number of sectors in resized stateful partition
+ local temp_img=$4
+
+ local kernel_offset=$(partoffset ${src_img} 2)
+ local kernel_count=$(partsize ${src_img} 2)
+ local rootfs_offset=$(partoffset ${src_img} 3)
+ local rootfs_count=$(partsize ${src_img} 3)
+ local oem_offset=$(partoffset ${src_img} 8)
+ local oem_count=$(partsize ${src_img} 8)
+ local esp_offset=$(partoffset ${src_img} 12)
+ local esp_count=$(partsize ${src_img} 12)
+
+ local temp_pmbr=$(mktemp "/tmp/pmbr.XXXXXX")
+ dd if="${src_img}" of="${temp_pmbr}" bs=512 count=1 &>/dev/null
+
+ trap "rm -rf \"${temp_pmbr}\"" EXIT
+ # Set up a new partition table
+ install_gpt "${temp_img}" "${rootfs_count}" "${resized_sectors}" \
+ "${temp_pmbr}" "${esp_count}" false $(roundup ${rootfs_count})
+
+ # Copy into the partition parts of the file
+ dd if="${src_img}" of="${temp_img}" conv=notrunc bs=512 \
+ seek="${START_ROOTFS_A}" skip=${rootfs_offset} count=${rootfs_count}
+ dd if="${temp_state}" of="${temp_img}" conv=notrunc bs=512 \
+ seek="${START_STATEFUL}"
+ # Copy the full kernel (i.e. with vboot sections)
+ dd if="${src_img}" of="${temp_img}" conv=notrunc bs=512 \
+ seek="${START_KERN_A}" skip=${kernel_offset} count=${kernel_count}
+ dd if="${src_img}" of="${temp_img}" conv=notrunc bs=512 \
+ seek="${START_OEM}" skip=${oem_offset} count=${oem_count}
+ dd if="${src_img}" of="${temp_img}" conv=notrunc bs=512 \
+ seek="${START_ESP}" skip=${esp_offset} count=${esp_count}
+}
« no previous file with comments | « mod_image_for_recovery.sh ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698