OLD | NEW |
1 #!/bin/bash | 1 #!/bin/bash |
2 | 2 |
3 # Copyright (c) 2009 The Chromium OS Authors. All rights reserved. | 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 | 4 # Use of this source code is governed by a BSD-style license that can be |
5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
6 | 6 |
7 # Script to convert the output of build_image.sh to a VMware image and write a | 7 # Script to convert the output of build_image.sh to a VMware image and write a |
8 # corresponding VMware config file. | 8 # corresponding VMware config file. |
9 | 9 |
10 # Load common constants. This should be the first executable line. | 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. | 11 # The path to common.sh should be relative to your script's location. |
12 . "$(dirname "$0")/common.sh" | 12 . "$(dirname "$0")/common.sh" |
13 | 13 |
14 IMAGES_DIR="${DEFAULT_BUILD_ROOT}/images" | 14 IMAGES_DIR="${DEFAULT_BUILD_ROOT}/images" |
15 # Default to the most recent image | 15 # Default to the most recent image |
16 DEFAULT_FROM="${IMAGES_DIR}/`ls -t $IMAGES_DIR | head -1`" | 16 DEFAULT_FROM="${IMAGES_DIR}/`ls -t $IMAGES_DIR | head -1`" |
17 DEFAULT_TO="${DEFAULT_FROM}" | 17 DEFAULT_TO="${DEFAULT_FROM}" |
18 DEFAULT_VMDK="ide.vmdk" | 18 DEFAULT_VMDK="ide.vmdk" |
19 DEFAULT_VMX="chromeos.vmx" | 19 DEFAULT_VMX="chromeos.vmx" |
| 20 DEFAULT_VBOX_DISK="os.vdi" |
20 # Memory units are in MBs | 21 # Memory units are in MBs |
21 DEFAULT_MEM="1024" | 22 DEFAULT_MEM="1024" |
| 23 VBOX_TEMP_IMAGE="${IMAGES_DIR}/vbox_temp.img" |
| 24 |
22 | 25 |
23 # Flags | 26 # Flags |
24 DEFINE_string from "$DEFAULT_FROM" \ | 27 DEFINE_string from "$DEFAULT_FROM" \ |
25 "Directory containing rootfs.image and mbr.image" | 28 "Directory containing rootfs.image and mbr.image" |
26 DEFINE_string to "$DEFAULT_TO" \ | 29 DEFINE_string to "$DEFAULT_TO" \ |
27 "Destination folder for VMware files" | 30 "Destination folder for VM output file(s)" |
28 DEFINE_boolean make_vmx true \ | 31 DEFINE_string format "vmware" \ |
29 "Create a vmx file for use with vmplayer." | 32 "Output format, either vmware or virtualbox" |
| 33 |
| 34 DEFINE_boolean make_vmx ${FLAGS_TRUE} \ |
| 35 "Create a vmx file for use with vmplayer (vmware only)." |
30 DEFINE_string vmdk "$DEFAULT_VMDK" \ | 36 DEFINE_string vmdk "$DEFAULT_VMDK" \ |
31 "Filename for the vmware disk image" | 37 "Filename for the vmware disk image (vmware only)." |
32 DEFINE_string vmx "$DEFAULT_VMX" \ | 38 DEFINE_string vmx "$DEFAULT_VMX" \ |
33 "Filename for the vmware config" | 39 "Filename for the vmware config (vmware only)." |
34 DEFINE_integer mem "$DEFAULT_MEM" \ | 40 DEFINE_integer mem "$DEFAULT_MEM" \ |
35 "Memory size for the vmware config in MBs." | 41 "Memory size for the vm config in MBs (vmware only)." |
| 42 |
| 43 DEFINE_string vbox_disk "$DEFAULT_VBOX_DISK" \ |
| 44 "Filename for the output disk (virtualbox only)." |
36 | 45 |
37 # Parse command line | 46 # Parse command line |
38 FLAGS "$@" || exit 1 | 47 FLAGS "$@" || exit 1 |
39 eval set -- "${FLAGS_ARGV}" | 48 eval set -- "${FLAGS_ARGV}" |
40 | 49 |
41 # Die on any errors. | 50 # Die on any errors. |
42 set -e | 51 set -e |
43 | 52 |
| 53 if [ "$FLAGS_format" != "vmware" ]; then |
| 54 FLAGS_make_vmx=${FLAGS_FALSE} |
| 55 fi |
| 56 |
44 # Convert args to paths. Need eval to un-quote the string so that shell | 57 # Convert args to paths. Need eval to un-quote the string so that shell |
45 # chars like ~ are processed; just doing FOO=`readlink -f $FOO` won't work. | 58 # chars like ~ are processed; just doing FOO=`readlink -f $FOO` won't work. |
46 FLAGS_from=`eval readlink -f $FLAGS_from` | 59 FLAGS_from=`eval readlink -f $FLAGS_from` |
47 FLAGS_to=`eval readlink -f $FLAGS_to` | 60 FLAGS_to=`eval readlink -f $FLAGS_to` |
48 | 61 |
49 # Make two sparse files. One for an empty partition, another for | 62 # Make two sparse files. One for an empty partition, another for |
50 # stateful partition. | 63 # stateful partition. |
51 PART_SIZE=$(stat -c%s "${FLAGS_from}/rootfs.image") | 64 PART_SIZE=$(stat -c%s "${FLAGS_from}/rootfs.image") |
52 dd if=/dev/zero of="${FLAGS_from}/empty.image" bs=1 count=1 \ | 65 dd if=/dev/zero of="${FLAGS_from}/empty.image" bs=1 count=1 \ |
53 seek=$(( $PART_SIZE - 1 )) | 66 seek=$(( $PART_SIZE - 1 )) |
54 dd if=/dev/zero of="${FLAGS_from}/state.image" bs=1 count=1 \ | 67 dd if=/dev/zero of="${FLAGS_from}/state.image" bs=1 count=1 \ |
55 seek=$(( $PART_SIZE - 1 )) | 68 seek=$(( $PART_SIZE - 1 )) |
56 mkfs.ext3 -F -L C-STATE "${FLAGS_from}/state.image" | 69 mkfs.ext3 -F -L C-STATE "${FLAGS_from}/state.image" |
57 | 70 |
58 # Copy MBR and rootfs to output image | 71 # Fix bootloader config. |
59 qemu-img convert -f raw \ | 72 TEMP_IMG=$(mktemp) |
60 "${FLAGS_from}/mbr.image" "${FLAGS_from}/state.image" \ | 73 TEMP_MNT=$(mktemp -d) |
61 "${FLAGS_from}/empty.image" "${FLAGS_from}/rootfs.image" \ | 74 cp "${FLAGS_from}/rootfs.image" "$TEMP_IMG" |
62 -O vmdk "${FLAGS_to}/${FLAGS_vmdk}" | 75 mkdir -p "$TEMP_MNT" |
| 76 sudo mount -o loop "$TEMP_IMG" "$TEMP_MNT" |
| 77 sudo "$TEMP_MNT"/postinst /dev/sda3 |
| 78 sudo umount "$TEMP_MNT" |
| 79 rmdir "$TEMP_MNT" |
63 | 80 |
64 rm -f "${FLAGS_from}/empty.image" "${FLAGS_from}/state.image" | 81 if [ "$FLAGS_format" = "virtualbox" ]; then |
| 82 # Copy MBR and rootfs to output image |
| 83 qemu-img convert -f raw \ |
| 84 "${FLAGS_from}/mbr.image" "${FLAGS_from}/state.image" \ |
| 85 "${FLAGS_from}/empty.image" "$TEMP_IMG" \ |
| 86 -O raw "${VBOX_TEMP_IMAGE}" |
| 87 VBoxManage convertdd "${VBOX_TEMP_IMAGE}" "${FLAGS_to}/${FLAGS_vbox_disk}" |
| 88 elif [ "$FLAGS_format" = "vmware" ]; then |
| 89 # Copy MBR and rootfs to output image |
| 90 qemu-img convert -f raw \ |
| 91 "${FLAGS_from}/mbr.image" "${FLAGS_from}/state.image" \ |
| 92 "${FLAGS_from}/empty.image" "$TEMP_IMG" \ |
| 93 -O vmdk "${FLAGS_to}/${FLAGS_vmdk}" |
| 94 else |
| 95 echo invalid format: "$FLAGS_format" |
| 96 exit 1 |
| 97 fi |
65 | 98 |
66 echo "Created VMware image ${FLAGS_to}" | 99 rm -f "${FLAGS_from}/empty.image" "${FLAGS_from}/state.image" \ |
| 100 "$TEMP_IMG" "${VBOX_TEMP_IMAGE}" |
| 101 |
| 102 echo "Created image ${FLAGS_to}" |
67 | 103 |
68 # Generate the vmware config file | 104 # Generate the vmware config file |
69 # A good reference doc: http://www.sanbarrow.com/vmx.html | 105 # A good reference doc: http://www.sanbarrow.com/vmx.html |
70 VMX_CONFIG=$(cat <<END | 106 VMX_CONFIG="#!/usr/bin/vmware |
71 #!/usr/bin/vmware | 107 .encoding = \"UTF-8\" |
72 .encoding = "UTF-8" | 108 config.version = \"8\" |
73 config.version = "8" | 109 virtualHW.version = \"4\" |
74 virtualHW.version = "4" | 110 memsize = \"${FLAGS_mem}\" |
75 memsize = "${FLAGS_mem}" | 111 ide0:0.present = \"TRUE\" |
76 ide0:0.present = "TRUE" | 112 ide0:0.fileName = \"${FLAGS_vmdk}\" |
77 ide0:0.fileName = "${FLAGS_vmdk}" | 113 ethernet0.present = \"TRUE\" |
78 ethernet0.present = "TRUE" | 114 usb.present = \"TRUE\" |
79 usb.present = "TRUE" | 115 sound.present = \"TRUE\" |
80 sound.present = "TRUE" | 116 sound.virtualDev = \"es1371\" |
81 sound.virtualDev = "es1371" | 117 displayName = \"Chromium OS\" |
82 displayName = "ChromeOS" | 118 guestOS = \"otherlinux\" |
83 guestOS = "otherlinux" | 119 ethernet0.addressType = \"generated\" |
84 ethernet0.addressType = "generated" | 120 floppy0.present = \"FALSE\"" |
85 floppy0.present = "FALSE" | |
86 END) | |
87 | 121 |
88 if [[ ${FLAGS_make_vmx} ]]; then | 122 if [[ ${FLAGS_make_vmx} = ${FLAGS_TRUE} ]]; then |
89 echo "${VMX_CONFIG}" > "${FLAGS_to}/${FLAGS_vmx}" | 123 echo "${VMX_CONFIG}" > "${FLAGS_to}/${FLAGS_vmx}" |
90 echo "Wrote the following config to: ${FLAGS_to}/${FLAGS_vmx}" | 124 echo "Wrote the following config to: ${FLAGS_to}/${FLAGS_vmx}" |
91 echo "${VMX_CONFIG}" | 125 echo "${VMX_CONFIG}" |
92 fi | 126 fi |
93 | 127 |
OLD | NEW |