#!/bin/sh ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This Program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with OpenELEC.tv; see the file COPYING. If not, write to # the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. # http://www.gnu.org/copyleft/gpl.html ################################################################################ # usage: sudo ./create_virtualmachine [] [system partition size(MB)] # example: sudo ./create_virtualmachine /home/test/VM 512 [vdi] [128] if [ "$(id -u)" != "0" ]; then echo "##############################################################" echo "# please execute with 'sudo' or -DANGEROUS!!!- as root #" echo "# example: #" echo "# sudo ./create_virtualmachine [] #" echo "##############################################################" exit 1 fi if [ -z "$1" -o -z "$2" ]; then echo "##############################################################" echo "# please execute as follows #" echo "# example: #" echo "# sudo ./create_virtualmachine [] #" echo "##############################################################" exit 1 fi if [ ! -d "$1" ]; then echo "##############################################################" echo "# please create target directory #" echo "# example: #" echo "# mkdir #" echo "##############################################################" exit 1 fi if [ "$2" -lt "200" -o "$2" -gt "2048" ]; then echo "##############################################################" echo "# use a value between 200MB and 2048MB (2GB) #" echo "# example: #" echo "# sudo ./create_virtualmachine /home/test/VM 512 #" echo "##############################################################" exit 1 fi if [ ! -z "$3" -a "$3" != "vdi" -a "$3" != "vmdk" ]; then echo "##############################################################" echo "# only vdi or vmdk types are supported #" echo "# example: #" echo "# sudo ./create_virtualmachine /home/test/VM 512 [vdi] #" echo "##############################################################" exit 1 elif [ "$3" = "vdi" ]; then TYPE="vdi" elif [ -z "$3" -o "$3" = "vmdk" ]; then TYPE="vmdk" fi if [ -z "$4" ]; then SYSTEM_SIZE=192 else if [ "$4" -lt "128" -o "$4" -gt "1024" -o "$4" -gt "$2" ]; then echo "##############################################################" echo "# use a value between 128MB and 1024MB #" echo "# example: #" echo "# sudo ./create_virtualmachine /home/test/VM 512 [vdi] [256] #" echo "##############################################################" exit 1 else SYSTEM_SIZE=$4 fi fi DISK="$1/OpenELEC.img" IMAGE="$1/OpenELEC.$TYPE" LOOP=$(losetup -f) DISK_SIZE=$2 STORAGE_SIZE=$(( $DISK_SIZE - $SYSTEM_SIZE )) echo "" echo " folder: $1" echo " loop: $LOOP" echo " disk: $DISK" echo " image: $IMAGE" echo " type: $TYPE" echo " disk size: $DISK_SIZE MB" echo " system size: $SYSTEM_SIZE MB" echo "storage size: $STORAGE_SIZE MB" # check for some required tools # this is needed to create a bootloader which syslinux > /dev/null if [ "$?" = "1" ]; then echo "#########################################################" echo "# #" echo "# OpenELEC.tv missing tool - Installation will quit #" echo "# #" echo "# We can't find the required tool \"syslinux\" #" echo "# on your system. #" echo "# Please install it via your package manager. #" echo "# #" echo "#########################################################" exit 1 fi # this is needed to create a bootloader which extlinux > /dev/null if [ "$?" = "1" ]; then echo "#########################################################" echo "# #" echo "# OpenELEC.tv missing tool - Installation will quit #" echo "# #" echo "# We can't find the required tool \"extlinux\" #" echo "# on your system. #" echo "# Please install it via your package manager. #" echo "# #" echo "#########################################################" exit 1 fi # this is needed by syslinux which mcopy > /dev/null if [ "$?" = "1" ]; then echo "#########################################################" echo "# #" echo "# OpenELEC.tv missing tool - Installation will quit #" echo "# #" echo "# We can't find the required tool \"mcopy\" #" echo "# on your system. #" echo "# Please install it via your package manager. #" echo "# NOTE: Some distributions call this package #" echo "# \"mtools\". #" echo "# #" echo "#########################################################" exit 1 fi # this is needed to partion the drive which parted > /dev/null if [ "$?" = "1" ]; then echo "#########################################################" echo "# #" echo "# OpenELEC.tv missing tool - Installation will quit #" echo "# #" echo "# We can't find the required tool \"parted\" #" echo "# on your system. #" echo "# Please install it via your package manager. #" echo "# #" echo "#########################################################" exit 1 fi # this is needed fo convert harddisk image to vmdk or vdi format which qemu-img > /dev/null if [ "$?" = "1" ]; then echo "#########################################################" echo "# #" echo "# OpenELEC.tv missing tool - Installation will quit #" echo "# #" echo "# We can't find the required tool \"qemu-img\" #" echo "# on your system. #" echo "# Please install it via your package manager. #" echo "# #" echo "#########################################################" exit 1 fi # ensure loopX not in use echo "" echo "next two errors can be ignored..." sync umount "$LOOP" losetup -d "$LOOP" # create an image echo "" echo "creating new empty harddisk image: $DISK..." dd if=/dev/zero of="$DISK" bs=1M count="$DISK_SIZE" # write a disklabel echo "" echo "creating new partition table: $DISK..." sync losetup "$LOOP" "$DISK" parted -s "$LOOP" mklabel msdos # create partition1 echo "" echo "creating partition1 on $DISK..." SYSTEM_PART_END=$(( $SYSTEM_SIZE * 1024 * 1024 / 512 + 64 )) parted -s "$LOOP" -a min unit s mkpart primary ext4 64 $SYSTEM_PART_END # create partition2 echo "" echo "creating partition2 on $DISK..." STORAGE_PART_START=$(( $SYSTEM_PART_END + 1 )) parted -s "$LOOP" -a min unit s mkpart primary ext4 $STORAGE_PART_START 100% # make partition1 active (bootable) echo "" echo "marking partition1 active..." parted -s "$LOOP" set 1 boot on # write mbr echo "" echo "writing mbr..." if [ -f /usr/lib/syslinux/mbr.bin ]; then MBR="/usr/lib/syslinux/mbr.bin" # example: debian, ubuntu elif [ -f /usr/share/syslinux/mbr.bin ]; then MBR="/usr/share/syslinux/mbr.bin" # example: fedora elif [ -f /usr/lib/syslinux/bios/mbr.bin ]; then MBR="/usr/lib/syslinux/bios/mbr.bin" else echo "Can't find syslinux's mbr.bin on Host OS" exit 1 fi if [ -n "$MBR" ]; then cat "$MBR" > "$LOOP" fi # sync disk echo "" echo "syncing disk..." sync # create filesystem on partition1 echo "" sync losetup -d "$LOOP" echo "creating filesystem on partition1..." OFFSET=$(( 64 * 512 )) SIZELIMIT=$(( $SYSTEM_SIZE * 1024 * 1024 )) losetup -o $OFFSET --sizelimit $SIZELIMIT "$LOOP" "$DISK" mke2fs -q -t ext4 -m 0 "$LOOP" tune2fs -U random -L "System" "$LOOP" sync e2fsck -n "$LOOP" # mount partition echo "" echo "mounting partition1 on /tmp/vmware_install..." mkdir -p /tmp/vmware_install mount "$LOOP" /tmp/vmware_install # create bootloader configuration echo "" echo "creating bootloader configuration..." cat >/tmp/vmware_install/syslinux.cfg << EOF DEFAULT linux PROMPT 0 LABEL linux KERNEL /KERNEL APPEND boot=LABEL=System disk=LABEL=Storage quiet ssh EOF # install extlinux echo "" echo "installing extlinux to partition1..." extlinux --heads=4 --sector=32 -i /tmp/vmware_install # copy files echo "" echo "copying files to partition1..." cp target/KERNEL /tmp/vmware_install cp target/SYSTEM /tmp/vmware_install # sync disk echo "" echo "syncing disk..." sync # unmount partition1 echo "" echo "unmounting partition1..." umount "$LOOP" sync # create filesystem on partition2 echo "" sync losetup -d "$LOOP" echo "creating filesystem on partition2..." OFFSET=$(( $STORAGE_PART_START * 512 )) losetup -o $OFFSET "$LOOP" "$DISK" mke2fs -q -t ext4 -m 0 "$LOOP" tune2fs -U random -L "Storage" "$LOOP" sync e2fsck -n "$LOOP" # detach loopX sync losetup -d "$LOOP" # cleaning echo "" echo "cleaning tempdir..." [ -f /tmp/vmware_install/ldlinux.sys ] && chattr -i /tmp/vmware_install/ldlinux.sys rm -rf /tmp/vmware_install # convert image to vmdk or vdi echo "" echo "converting $DISK to $TYPE format..." qemu-img convert -O $TYPE "$DISK" "$IMAGE" rm -f "$DISK" # sync disk echo "" echo "syncing disk..." sync echo "" echo "installation finished..." echo ""