|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | + |
| 4 | +debug=0 |
| 5 | +reset=0 |
| 6 | +image=zos.efi |
| 7 | +kernelargs="" |
| 8 | +bridge=zos0 |
| 9 | +graphics="-nographic -nodefaults" |
| 10 | +smp=1 |
| 11 | +mem=3 |
| 12 | +tpm=0 |
| 13 | + |
| 14 | +usage() { |
| 15 | + cat <<EOF |
| 16 | +Usage: vm -n $name [ -r ] [ -d ] |
| 17 | + -n $name: name of the vm |
| 18 | + -d: run in debug mode |
| 19 | + -r: reset vm (recreate disks) |
| 20 | + -c: Kernel command |
| 21 | + -s: number of virtual cpus |
| 22 | + -i: kernel image to boot |
| 23 | + -b: bridge for network (default zos) |
| 24 | + -g: open GUI |
| 25 | + -m: memory in Gigabytes |
| 26 | + -t: tpm support (requires swtpm) |
| 27 | + -h: help |
| 28 | +EOF |
| 29 | + exit 0 |
| 30 | +} |
| 31 | + |
| 32 | + |
| 33 | +while getopts "c:n:i:rdtb:gs:m:" opt; do |
| 34 | + case $opt in |
| 35 | + i ) image=$OPTARG ;; |
| 36 | + r ) reset=1 ;; |
| 37 | + d ) debug=1 ;; |
| 38 | + n ) name=$OPTARG ;; |
| 39 | + c ) kernelargs=$OPTARG ;; |
| 40 | + b ) bridge=$OPTARG ;; |
| 41 | + g ) graphics="" ;; |
| 42 | + s ) smp=$OPTARG ;; |
| 43 | + m ) mem=$OPTARG ;; |
| 44 | + t ) tpm=1 ;; |
| 45 | + h ) usage ; exit 0 ;; |
| 46 | + \?) usage ; exit 1 ;; |
| 47 | + esac |
| 48 | +done |
| 49 | +shift $(($OPTIND - 1)) |
| 50 | + |
| 51 | + |
| 52 | +cmdline="console=ttyS1,115200n8 zos-debug zos-debug-vm $kernelargs" |
| 53 | +basepath=$(dirname $0) |
| 54 | +vmdir="$basepath/$name" |
| 55 | +md5=$(echo -n $name | md5sum | awk '{print $1}') |
| 56 | +uuid="${md5:0:8}-${md5:8:4}-${md5:12:4}-${md5:16:4}-${md5:20}" |
| 57 | +basemac="54:${md5:2:2}:${md5:4:2}:${md5:6:2}:${md5:8:2}:${md5:10:1}" |
| 58 | + |
| 59 | +createdisks() { |
| 60 | + qemu-img create -f qcow2 $vmdir/vda.qcow2 500G |
| 61 | + qemu-img create -f qcow2 $vmdir/vdb.qcow2 500G |
| 62 | + qemu-img create -f qcow2 $vmdir/vdc.qcow2 500G |
| 63 | + qemu-img create -f qcow2 $vmdir/vdd.qcow2 500G |
| 64 | + qemu-img create -f qcow2 $vmdir/vde.qcow2 500G |
| 65 | + |
| 66 | +} |
| 67 | + |
| 68 | +if [[ ! -d "$vmdir" || "$reset" -eq 1 ]]; then |
| 69 | + mkdir -p "$vmdir" |
| 70 | + createdisks |
| 71 | +fi |
| 72 | + |
| 73 | +if ps -eaf | grep -v grep | grep "$uuid" > /dev/null; then |
| 74 | + echo "VM $name is already running" |
| 75 | + exit 1 |
| 76 | +fi |
| 77 | + |
| 78 | +tpmargs="" |
| 79 | +if [[ $tpm -eq "1" ]]; then |
| 80 | + if ! command -v swtpm &> /dev/null; then |
| 81 | + echo "tpm option require `swtpm` please install first" |
| 82 | + exit 1 |
| 83 | + fi |
| 84 | + pkill swtpm |
| 85 | + tpm_dir="$vmdir/tpm" |
| 86 | + tpm_socket="$vmdir/swtpm.sock" |
| 87 | + mkdir -p $tpm_dir |
| 88 | + rm $tpm_socket &> /dev/null || true |
| 89 | + # runs in the backgroun |
| 90 | + swtpm \ |
| 91 | + socket --tpm2 \ |
| 92 | + --tpmstate dir=$tpm_dir \ |
| 93 | + --ctrl type=unixio,path=$vmdir/swtpm.sock \ |
| 94 | + --log level=20 &> tpm.logs & |
| 95 | + |
| 96 | + while [ ! -S "$tpm_socket" ]; do |
| 97 | + echo "waiting for tpm" |
| 98 | + sleep 1s |
| 99 | + done |
| 100 | + sleep 1s |
| 101 | + tpmargs="-chardev socket,id=chrtpm,path=${tpm_socket} -tpmdev emulator,id=tpm0,chardev=chrtpm -device tpm-tis,tpmdev=tpm0" |
| 102 | +fi |
| 103 | + |
| 104 | +echo "boot $image" |
| 105 | + |
| 106 | +qemu-system-x86_64 -kernel $image \ |
| 107 | + -m $(( mem * 1024 )) \ |
| 108 | + -enable-kvm \ |
| 109 | + -cpu host,host-phys-bits \ |
| 110 | + -smp $smp \ |
| 111 | + -uuid $uuid \ |
| 112 | + -netdev bridge,id=zos0,br=${bridge} -device virtio-net-pci,netdev=zos0,mac="${basemac}1" \ |
| 113 | + -drive file=fat:rw:$basepath/overlay,format=raw \ |
| 114 | + -append "${cmdline}" \ |
| 115 | + -drive file=$vmdir/vda.qcow2,if=virtio -drive file=$vmdir/vdb.qcow2,if=virtio \ |
| 116 | + -drive file=$vmdir/vdc.qcow2,if=virtio -drive file=$vmdir/vdd.qcow2,if=virtio \ |
| 117 | + -drive file=$vmdir/vde.qcow2,if=virtio \ |
| 118 | + -serial null -serial mon:stdio \ |
| 119 | + ${graphics} \ |
| 120 | + ${tpmargs} \ |
| 121 | + -device pci-bridge,chassis_nr=1,id=pcie.1 \ |
| 122 | + -device vfio-pci,host=01:00.0,bus=pcie.1,addr=00.0,multifunction=on \ |
| 123 | + -device vfio-pci,host=01:00.1,bus=pcie.1,addr=00.1 |
| 124 | + ; |
0 commit comments