blob: 74285d376ba78b3ce5c39e3a3f037b065d613e43 [file] [log] [blame]
# Copyright (c) 2011 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.
emit_gpt_scripts() {
local image="$1"
local dir="$2"
local pack="$dir/pack_partitions.sh"
local unpack="$dir/unpack_partitions.sh"
cat >"$unpack" <<HEADER
#!/bin/bash -eu
# File automatically generated. Do not edit.
TARGET=\${1:-}
if [[ -z "\$TARGET" ]]; then
echo "Usage: \$0 DEVICE" 1>&2
exit 1
fi
set -x
HEADER
$GPT show "$image" | sed -e 's/^/# /' >>"$unpack"
cp "$unpack" "$pack"
$GPT show -q "$image" |
while read start size part x; do
local file="part_$part"
local target="\"\$TARGET\""
local dd_args="bs=512 count=$size"
echo "dd if=$target of=$file $dd_args skip=$start" >>"$unpack"
echo "dd if=$file of=$target $dd_args seek=$start conv=notrunc" \
>>"$pack"
done
chmod +x "$unpack" "$pack"
}
build_gpt() {
local outdev="$1"
local rootfs_img="$2"
local stateful_img="$3"
local esp_img="$4"
# We'll need some code to put in the PMBR, for booting on legacy BIOS.
local pmbr_img
if [ "$ARCH" = "arm" ]; then
pmbr_img=/dev/zero
elif [[ "$ARCH" = "x86" || "$ARCH" = "amd64" ]]; then
pmbr_img=$(readlink -f /usr/share/syslinux/gptmbr.bin)
else
error "Unknown architecture: $ARCH"
return 1
fi
GPT_FULL="false"
[ "${FLAGS_full}" -eq "${FLAGS_TRUE}" ] && GPT_FULL="true"
# Create the GPT. This has the side-effect of setting some global vars
# describing the partition table entries (see the comments in the source).
install_gpt "$outdev" $(numsectors "$rootfs_img") \
$(numsectors "$stateful_img") $pmbr_img $(numsectors "$esp_img") \
$GPT_FULL $FLAGS_rootfs_partition_size
local sudo=
if [ ! -w "$outdev" ] ; then
# use sudo when writing to a block device.
sudo=sudo
fi
# Now populate the partitions.
info "Copying stateful partition..."
$sudo dd if="$stateful_img" of="$outdev" conv=notrunc bs=512 \
seek=$START_STATEFUL
info "Copying rootfs..."
$sudo dd if="$rootfs_img" of="$outdev" conv=notrunc bs=512 \
seek=$START_ROOTFS_A
info "Copying EFI system partition..."
$sudo dd if="$esp_img" of="$outdev" conv=notrunc bs=512 \
seek=$START_ESP
# Pre-set "sucessful" bit in gpt, so we will never mark-for-death
# a partition on an SDCard/USB stick.
$GPT add -i 2 -S 1 "$outdev"
}