OLD | NEW |
| (Empty) |
1 #!/bin/bash | |
2 | |
3 # Copyright (c) 2009 The Chromium OS Authors. All rights reserved. | |
4 # Use of this source code is governed by a BSD-style license that can be | |
5 # found in the LICENSE file. | |
6 | |
7 # Script to convert the output of build_image.sh to a VMware image and write a | |
8 # corresponding VMware config file. | |
9 | |
10 # Load common constants. This should be the first executable line. | |
11 # The path to common.sh should be relative to your script's location. | |
12 . "$(dirname "$0")/common.sh" | |
13 . "$(dirname "$0")/chromeos-common.sh" | |
14 | |
15 IMAGES_DIR="${DEFAULT_BUILD_ROOT}/images" | |
16 # Default to the most recent image | |
17 DEFAULT_FROM="${IMAGES_DIR}/`ls -t $IMAGES_DIR | head -1`" | |
18 DEFAULT_TO="${DEFAULT_FROM}" | |
19 DEFAULT_VMDK="ide.vmdk" | |
20 DEFAULT_VMX="chromeos.vmx" | |
21 DEFAULT_VBOX_DISK="os.vdi" | |
22 # Memory units are in MBs | |
23 DEFAULT_MEM="1024" | |
24 VBOX_TEMP_IMAGE="${IMAGES_DIR}/vbox_temp.img" | |
25 | |
26 | |
27 # Flags | |
28 DEFINE_string from "$DEFAULT_FROM" \ | |
29 "Directory containing rootfs.image and mbr.image" | |
30 DEFINE_string to "$DEFAULT_TO" \ | |
31 "Destination folder for VM output file(s)" | |
32 DEFINE_string state_image "" \ | |
33 "Stateful partition image (defaults to creating new statful partition)" | |
34 DEFINE_string format "vmware" \ | |
35 "Output format, either vmware or virtualbox" | |
36 | |
37 DEFINE_boolean make_vmx ${FLAGS_TRUE} \ | |
38 "Create a vmx file for use with vmplayer (vmware only)." | |
39 DEFINE_string vmdk "$DEFAULT_VMDK" \ | |
40 "Filename for the vmware disk image (vmware only)." | |
41 DEFINE_string vmx "$DEFAULT_VMX" \ | |
42 "Filename for the vmware config (vmware only)." | |
43 DEFINE_integer mem "$DEFAULT_MEM" \ | |
44 "Memory size for the vm config in MBs (vmware only)." | |
45 | |
46 DEFINE_string vbox_disk "$DEFAULT_VBOX_DISK" \ | |
47 "Filename for the output disk (virtualbox only)." | |
48 | |
49 # Parse command line | |
50 FLAGS "$@" || exit 1 | |
51 eval set -- "${FLAGS_ARGV}" | |
52 | |
53 # Die on any errors. | |
54 set -e | |
55 | |
56 if [ "$FLAGS_format" != "vmware" ]; then | |
57 FLAGS_make_vmx=${FLAGS_FALSE} | |
58 fi | |
59 | |
60 # Convert args to paths. Need eval to un-quote the string so that shell | |
61 # chars like ~ are processed; just doing FOO=`readlink -f $FOO` won't work. | |
62 FLAGS_from=`eval readlink -f $FLAGS_from` | |
63 FLAGS_to=`eval readlink -f $FLAGS_to` | |
64 | |
65 # Split apart the partitions and make some new ones | |
66 TEMP_DIR=$(mktemp -d) | |
67 (cd "$TEMP_DIR" && | |
68 "${FLAGS_from}/unpack_partitions.sh" "${FLAGS_from}/chromiumos_image.bin") | |
69 | |
70 # Fix the kernel command line | |
71 # FIXME: TEMP_ESP is only partition 4 at the moment. It may change! | |
72 TEMP_ESP="$TEMP_DIR"/part_4 | |
73 TEMP_ROOTFS="$TEMP_DIR"/part_3 | |
74 TEMP_STATE="$TEMP_DIR"/part_1 | |
75 if [ -n "${FLAGS_state_image}" ]; then | |
76 TEMP_STATE="${FLAGS_state_image}" | |
77 fi | |
78 TEMP_KERN="$TEMP_DIR"/part_2 | |
79 TEMP_PMBR="$TEMP_DIR"/pmbr | |
80 dd if="${FLAGS_from}/chromiumos_image.bin" of="$TEMP_PMBR" bs=512 count=1 | |
81 | |
82 TEMP_MNT=$(mktemp -d) | |
83 cleanup() { | |
84 sudo umount -d "$TEMP_MNT" | |
85 rmdir "$TEMP_MNT" | |
86 } | |
87 trap cleanup INT TERM EXIT | |
88 mkdir -p "$TEMP_MNT" | |
89 sudo mount -o loop "$TEMP_ROOTFS" "$TEMP_MNT" | |
90 sudo "$TEMP_MNT"/postinst /dev/sda3 | |
91 trap - INT TERM EXIT | |
92 cleanup | |
93 | |
94 # Make 3 GiB output image | |
95 TEMP_IMG=$(mktemp) | |
96 # TOOD(adlr): pick a size that will for sure accomodate the partitions | |
97 sudo dd if=/dev/zero of="${TEMP_IMG}" bs=1 count=1 \ | |
98 seek=$((3 * 1024 * 1024 * 1024 - 1)) | |
99 | |
100 # Set up the partition table | |
101 install_gpt "$TEMP_IMG" "$TEMP_ROOTFS" "$TEMP_KERN" "$TEMP_STATE" \ | |
102 "$TEMP_PMBR" "$TEMP_ESP" true | |
103 # Copy into the partition parts of the file | |
104 dd if="$TEMP_ROOTFS" of="$TEMP_IMG" conv=notrunc bs=512 seek="$START_ROOTFS_A" | |
105 dd if="$TEMP_STATE" of="$TEMP_IMG" conv=notrunc bs=512 seek="$START_STATEFUL" | |
106 dd if="$TEMP_KERN" of="$TEMP_IMG" conv=notrunc bs=512 seek="$START_KERN_A" | |
107 dd if="$TEMP_ESP" of="$TEMP_IMG" conv=notrunc bs=512 seek="$START_ESP" | |
108 | |
109 echo Creating final image | |
110 # Convert image to output format | |
111 if [ "$FLAGS_format" = "virtualbox" ]; then | |
112 qemu-img convert -f raw $TEMP_IMG \ | |
113 -O raw "${VBOX_TEMP_IMAGE}" | |
114 VBoxManage convertdd "${VBOX_TEMP_IMAGE}" "${FLAGS_to}/${FLAGS_vbox_disk}" | |
115 elif [ "$FLAGS_format" = "vmware" ]; then | |
116 qemu-img convert -f raw $TEMP_IMG \ | |
117 -O vmdk "${FLAGS_to}/${FLAGS_vmdk}" | |
118 else | |
119 echo invalid format: "$FLAGS_format" | |
120 exit 1 | |
121 fi | |
122 | |
123 rm -rf "$TEMP_DIR" "${VBOX_TEMP_IMAGE}" "$TEMP_IMG" | |
124 if [ -z "$FLAGS_state_image" ]; then | |
125 rm -f "$STATE_IMAGE" | |
126 fi | |
127 | |
128 echo "Created image ${FLAGS_to}" | |
129 | |
130 # Generate the vmware config file | |
131 # A good reference doc: http://www.sanbarrow.com/vmx.html | |
132 VMX_CONFIG="#!/usr/bin/vmware | |
133 .encoding = \"UTF-8\" | |
134 config.version = \"8\" | |
135 virtualHW.version = \"4\" | |
136 memsize = \"${FLAGS_mem}\" | |
137 ide0:0.present = \"TRUE\" | |
138 ide0:0.fileName = \"${FLAGS_vmdk}\" | |
139 ethernet0.present = \"TRUE\" | |
140 usb.present = \"TRUE\" | |
141 sound.present = \"TRUE\" | |
142 sound.virtualDev = \"es1371\" | |
143 displayName = \"Chromium OS\" | |
144 guestOS = \"otherlinux\" | |
145 ethernet0.addressType = \"generated\" | |
146 floppy0.present = \"FALSE\"" | |
147 | |
148 if [[ ${FLAGS_make_vmx} = ${FLAGS_TRUE} ]]; then | |
149 echo "${VMX_CONFIG}" > "${FLAGS_to}/${FLAGS_vmx}" | |
150 echo "Wrote the following config to: ${FLAGS_to}/${FLAGS_vmx}" | |
151 echo "${VMX_CONFIG}" | |
152 fi | |
153 | |
OLD | NEW |