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