flatcar-scripts/image_to_vmware.sh
Bill Richardson 8b3bd10b91 Create EFI System Partition on USB image during build.
The EFI System Partition is a special disk partition where EFI BIOS expects
to find the platform-specific bootloader. We need this in order to work on
the BIOS/kernel handoff. It's not needed for the final ChromeOS image and it
isn't useful for legacy BIOS systems, so right now it only makes any difference on x86
devices with development BIOSes.

This change creates the partition for ARM builds as well; it has no effect
there, either.

Review URL: http://codereview.chromium.org/1513019
2010-04-06 15:00:10 -07:00

154 lines
4.8 KiB
Bash
Executable File

#!/bin/bash
# Copyright (c) 2009 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.
# Script to convert the output of build_image.sh to a VMware image and write a
# corresponding VMware config file.
# Load common constants. This should be the first executable line.
# The path to common.sh should be relative to your script's location.
. "$(dirname "$0")/common.sh"
. "$(dirname "$0")/chromeos-common.sh"
IMAGES_DIR="${DEFAULT_BUILD_ROOT}/images"
# Default to the most recent image
DEFAULT_FROM="${IMAGES_DIR}/`ls -t $IMAGES_DIR | head -1`"
DEFAULT_TO="${DEFAULT_FROM}"
DEFAULT_VMDK="ide.vmdk"
DEFAULT_VMX="chromeos.vmx"
DEFAULT_VBOX_DISK="os.vdi"
# Memory units are in MBs
DEFAULT_MEM="1024"
VBOX_TEMP_IMAGE="${IMAGES_DIR}/vbox_temp.img"
# Flags
DEFINE_string from "$DEFAULT_FROM" \
"Directory containing rootfs.image and mbr.image"
DEFINE_string to "$DEFAULT_TO" \
"Destination folder for VM output file(s)"
DEFINE_string state_image "" \
"Stateful partition image (defaults to creating new statful partition)"
DEFINE_string format "vmware" \
"Output format, either vmware or virtualbox"
DEFINE_boolean make_vmx ${FLAGS_TRUE} \
"Create a vmx file for use with vmplayer (vmware only)."
DEFINE_string vmdk "$DEFAULT_VMDK" \
"Filename for the vmware disk image (vmware only)."
DEFINE_string vmx "$DEFAULT_VMX" \
"Filename for the vmware config (vmware only)."
DEFINE_integer mem "$DEFAULT_MEM" \
"Memory size for the vm config in MBs (vmware only)."
DEFINE_string vbox_disk "$DEFAULT_VBOX_DISK" \
"Filename for the output disk (virtualbox only)."
# Parse command line
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"
# Die on any errors.
set -e
if [ "$FLAGS_format" != "vmware" ]; then
FLAGS_make_vmx=${FLAGS_FALSE}
fi
# Convert args to paths. Need eval to un-quote the string so that shell
# chars like ~ are processed; just doing FOO=`readlink -f $FOO` won't work.
FLAGS_from=`eval readlink -f $FLAGS_from`
FLAGS_to=`eval readlink -f $FLAGS_to`
# Split apart the partitions and make some new ones
TEMP_DIR=$(mktemp -d)
(cd "$TEMP_DIR" &&
"${FLAGS_from}/unpack_partitions.sh" "${FLAGS_from}/chromiumos_image.bin")
# Fix the kernel command line
# FIXME: TEMP_ESP is only partition 4 at the moment. It may change!
TEMP_ESP="$TEMP_DIR"/part_4
TEMP_ROOTFS="$TEMP_DIR"/part_3
TEMP_STATE="$TEMP_DIR"/part_1
if [ -n "${FLAGS_state_image}" ]; then
TEMP_STATE="${FLAGS_state_image}"
fi
TEMP_KERN="$TEMP_DIR"/part_2
TEMP_PMBR="$TEMP_DIR"/pmbr
dd if="${FLAGS_from}/chromiumos_image.bin" of="$TEMP_PMBR" bs=512 count=1
TEMP_MNT=$(mktemp -d)
cleanup() {
sudo umount -d "$TEMP_MNT"
rmdir "$TEMP_MNT"
}
trap cleanup INT TERM EXIT
mkdir -p "$TEMP_MNT"
sudo mount -o loop "$TEMP_ROOTFS" "$TEMP_MNT"
sudo "$TEMP_MNT"/postinst /dev/sda3
trap - INT TERM EXIT
cleanup
# Make 3 GiB output image
TEMP_IMG=$(mktemp)
# TOOD(adlr): pick a size that will for sure accomodate the partitions
sudo dd if=/dev/zero of="${TEMP_IMG}" bs=1 count=1 \
seek=$((3 * 1024 * 1024 * 1024 - 1))
# Set up the partition table
install_gpt "$TEMP_IMG" "$TEMP_ROOTFS" "$TEMP_KERN" "$TEMP_STATE" \
"$TEMP_PMBR" "$TEMP_ESP" true
# Copy into the partition parts of the file
dd if="$TEMP_ROOTFS" of="$TEMP_IMG" conv=notrunc bs=512 seek="$START_ROOTFS_A"
dd if="$TEMP_STATE" of="$TEMP_IMG" conv=notrunc bs=512 seek="$START_STATEFUL"
dd if="$TEMP_KERN" of="$TEMP_IMG" conv=notrunc bs=512 seek="$START_KERN_A"
dd if="$TEMP_ESP" of="$TEMP_IMG" conv=notrunc bs=512 seek="$START_ESP"
echo Creating final image
# Convert image to output format
if [ "$FLAGS_format" = "virtualbox" ]; then
qemu-img convert -f raw $TEMP_IMG \
-O raw "${VBOX_TEMP_IMAGE}"
VBoxManage convertdd "${VBOX_TEMP_IMAGE}" "${FLAGS_to}/${FLAGS_vbox_disk}"
elif [ "$FLAGS_format" = "vmware" ]; then
qemu-img convert -f raw $TEMP_IMG \
-O vmdk "${FLAGS_to}/${FLAGS_vmdk}"
else
echo invalid format: "$FLAGS_format"
exit 1
fi
rm -rf "$TEMP_DIR" "${VBOX_TEMP_IMAGE}" "$TEMP_IMG"
if [ -z "$FLAGS_state_image" ]; then
rm -f "$STATE_IMAGE"
fi
echo "Created image ${FLAGS_to}"
# Generate the vmware config file
# A good reference doc: http://www.sanbarrow.com/vmx.html
VMX_CONFIG="#!/usr/bin/vmware
.encoding = \"UTF-8\"
config.version = \"8\"
virtualHW.version = \"4\"
memsize = \"${FLAGS_mem}\"
ide0:0.present = \"TRUE\"
ide0:0.fileName = \"${FLAGS_vmdk}\"
ethernet0.present = \"TRUE\"
usb.present = \"TRUE\"
sound.present = \"TRUE\"
sound.virtualDev = \"es1371\"
displayName = \"Chromium OS\"
guestOS = \"otherlinux\"
ethernet0.addressType = \"generated\"
floppy0.present = \"FALSE\""
if [[ ${FLAGS_make_vmx} = ${FLAGS_TRUE} ]]; then
echo "${VMX_CONFIG}" > "${FLAGS_to}/${FLAGS_vmx}"
echo "Wrote the following config to: ${FLAGS_to}/${FLAGS_vmx}"
echo "${VMX_CONFIG}"
fi