File indexing completed on 2024-05-26 04:59:21
0001 #!/bin/bash 0002 0003 set -e 0004 trap '' 2 # Disable Ctrl+C 0005 cd "$(dirname "$0")" 0006 0007 img_cdrom="$HOME/KVM/iso/ubuntu-14.04.5-server-amd64.iso" 0008 img_disk="./ubuntu-travis.qcow2" 0009 img_size="10G" 0010 0011 [ ! -f "$img_cdrom" ] && echo "ERROR: '$img_cdrom' doesn't exist." && exit 1 0012 0013 par=( 0014 -serial none 0015 -parallel none 0016 -enable-kvm 0017 -name "Travis" 0018 -cpu host,kvm=off 0019 -smp sockets=1,cores=4,threads=1 0020 -m 4096 0021 -device intel-hda,id=sound0,bus=pci.0 0022 -device hda-duplex 0023 -rtc base=localtime 0024 -net nic,macaddr=00:1d:cb:f0:27:3f,model=virtio,id=net0 0025 -net bridge,id=bridge0,br=kvm0 0026 -device ide-cd,drive=cd1,id=cdrom1,unit=0,bus=ide.0 0027 -drive if=none,id=cd1,media=cdrom,file="$img_cdrom" 0028 -drive if=virtio,id=disk0,format=qcow2,media=disk,file="$img_disk" 0029 -boot once=c,menu=off # boot from hdd 0030 -vga qxl 0031 ) 0032 # mount -t 9p apt /mnt/apt/ -o trans=virtio,version=9p2000.L,posixacl,msize=104857600,cache=loose 0033 [ -d "apt/trusty" ] && par+=(-virtfs local,mount_tag=apt,path="$PWD/apt/trusty",security_model=none) 0034 0035 img_reset() { 0036 qemu-img create -f qcow2 -b "${img_disk%.*}-clean.qcow2" "$img_disk" 0037 } 0038 img_compress() { 0039 if [ -d mnt ]; then echo "Directory 'mnt' already exists." ; exit 1; fi 0040 sudo modprobe nbd max_part=63 0041 sudo qemu-nbd -c /dev/nbd0 "${img_disk%.*}-clean.qcow2" 0042 mkdir mnt 0043 sudo mount /dev/nbd0p1 mnt/ 0044 sudo fstrim -v mnt/ 0045 sudo umount mnt/ 0046 rmdir mnt 0047 echo -n " zeroing unused space " 0048 sudo zerofree -v /dev/nbd0p1 0049 sudo qemu-nbd -d /dev/nbd0 0050 sudo modprobe -r nbd 0051 mv "${img_disk%.*}-clean.qcow2" "${img_disk%.*}.old.qcow2" 0052 echo "compressing ${img_disk%.*}-clean.qcow2" 0053 qemu-img convert -O qcow2 "${img_disk%.*}.old.qcow2" "${img_disk%.*}-clean.qcow2" 0054 rm "${img_disk%.*}.old.qcow2" 0055 } 0056 img_mount() { 0057 sudo modprobe nbd max_part=63 0058 sudo qemu-nbd -c /dev/nbd0 "$img_disk" 0059 mkdir mnt 0060 sudo mount /dev/nbd0p1 mnt/ 0061 echo "exit this shell to unmount image" 0062 (cd mnt && bash -login) 0063 sudo umount mnt/ 0064 rmdir mnt 0065 sudo qemu-nbd -d /dev/nbd0 0066 sudo modprobe -r nbd 0067 } 0068 img_merge() { 0069 echo "creating merged image..." 0070 qemu-img convert -O qcow2 "$img_disk" "${img_disk%.*}.new.qcow2" 0071 mv "${img_disk%.*}.new.qcow2" "${img_disk%.*}-clean.qcow2" 0072 img_reset 0073 } 0074 0075 [ ! -f "${img_disk%.*}-clean.qcow2" ] && ( echo "creating $img_size base disk image..." ; qemu-img create -f qcow2 "${img_disk%.*}-clean.qcow2" $img_size ; img_reset ) 0076 [ "$1" == "reset" ] && img_reset 0077 [ "$1" == "compress" ] && img_compress 0078 [ "$1" == "mount" ] && img_mount 0079 [ "$1" == "merge" ] && img_merge 0080 [ "$1" == "help" ] && echo "$0 [reset|compress|mount|merge|video|help]" 0081 [ "$1" == "video" ] && ( par+=(-monitor stdio) ; /usr/bin/qemu-system-x86_64 "${par[@]}" "${@:2}" ) 0082 [ "$1" == "" ] && ( 0083 par+=(-monitor none -nographic) 0084 ( 0085 echo '*** virtual machine is booting in background ***' 0086 /usr/bin/qemu-system-x86_64 "${par[@]}" "$@" &>/dev/null 0087 echo -e '\n*** virtual machine terminated ***' 0088 ) & 0089 ) 0090