9ed9b5b82f98898c6d7cce61f0687d99262726b4
[supernested.git] / run-supernested.sh.in
1 #!/bin/bash -
2 # supernested Makefile.am
3 # @configure_input@
4 # (C) Copyright 2014 Red Hat Inc.
5 #
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 #
20 # Written by Richard W.M. Jones <rjones@redhat.com>
21
22 arch="@host_cpu@"
23 qemu="@QEMU@"
24 image="supernested-@VERSION@-@DISTRO@.qcow2"
25 format=qcow2
26 kernel=kernel
27 initrd=initrd
28 append="panic=1 udevtimeout=6000 udev.event-timeout=6000 no_timer_check printk.time=1 root=/dev/sda selinux=0"
29 smp=
30 tcg=
31
32 case "$arch" in
33     aarch64)
34         append="$append earlyprintk=pl011,0x9000000 ignore_loglevel efi-rtc=noprobe"
35         ;;
36     *)
37         append="$append console=ttyS0"
38         ;;
39 esac
40
41 TEMP=`getopt \
42         -o '' \
43         --longoptions 'help,nested,smp:,tcg' \
44         -n run-supernested.sh -- "$@"`
45 if [ $? != 0 ]; then
46     echo "$0: problem parsing the command line arguments"
47     exit 1
48 fi
49 eval set -- "$TEMP"
50
51 usage ()
52 {
53     echo "$0: Run the supernested appliance."
54     echo "  $0 [--smp=N] [--tcg]"
55     echo "Options:"
56     echo "  --smp=N    Use N virtual CPUs (at all levels)."
57     echo "  --tcg      Use TCG (at all levels) instead of KVM."
58 }
59
60 while true ; do
61     case "$1" in
62         --nested)
63             # When the nested guest calls this script, it uses the
64             # --nested flag.  DO NOT ADD THIS FLAG YOURSELF!
65             image=/dev/sda
66             format=raw
67             kernel=/kernel
68             initrd=/initrd
69             smp="$(
70                 grep -Eo 'supernested.smp=[[:digit:]]+' /proc/cmdline |
71                 grep -Eo '[[:digit:]]+'
72                 )"
73             tcg=
74             if grep -q supernested.tcg=1 /proc/cmdline; then
75                 tcg=1
76             fi
77             shift
78             ;;
79         --smp)
80             smp="$2"
81             shift 2
82             ;;
83         --tcg)
84             tcg=1
85             shift
86             ;;
87         --help)
88             usage
89             exit 0
90             ;;
91         --)
92             shift
93             break
94             ;;
95         *)
96             echo "internal error ($1)"
97             exit 1
98             ;;
99     esac
100 done
101
102 # How much memory to give to the guest?
103 memory="$(
104     grep -Eo '^MemTotal:.*[[:digit:]]+ kB' /proc/meminfo |
105     grep -Eo '[[:digit:]]+'
106     )"
107 if [ -z "memory" ]; then
108     echo "$0: could not get total memory from /proc/meminfo"
109     exit 1
110 fi
111 memory=$((memory / 1024))
112 if [ $memory -lt 2048 ]; then
113     echo "$0: not enough memory left: memory=$memory MB"
114     exit 1
115 fi
116 memory=$((memory - 1500))
117
118 # Get current nesting level from /proc/cmdline, increment it, add it
119 # to the command line.
120 level="$(
121     grep -Eo 'supernested.level=[[:digit:]]+' /proc/cmdline |
122     grep -Eo '[[:digit:]]+'
123     )"
124 if [ -z "$level" ]; then level=0; fi
125 append="$append supernested.level=$((level+1))"
126
127 # Append other parameters to nested command line.
128 append="$append supernested.smp=$smp supernested.tcg=$tcg"
129
130 extra_args=
131 if [ -n "$smp" ]; then extra_args="$extra_args -smp $smp"; fi
132 if [ -n "$tcg" ]; then
133     extra_args="$extra_args -machine accel=tcg"
134 else
135     extra_args="$extra_args -cpu host -machine accel=kvm"
136 fi
137
138 echo "Running"
139 echo "    qemu = $qemu"
140 echo "    extra_args = $extra_args"
141 echo "    memory = $memory"
142 echo "    kernel = $kernel"
143 echo "    initrd = $initrd"
144 echo "    disk = $image"
145 echo "    append = $append"
146
147 # Since this could crash the machine, better to sync ...
148 sync
149
150 exec \
151 "$qemu" \
152     $extra_args \
153     -display none \
154     -m $memory \
155     -no-reboot \
156     -rtc driftfix=slew \
157     -no-hpet \
158     -global kvm-pit.lost_tick_policy=discard \
159     -kernel "$kernel" \
160     -initrd "$initrd" \
161     -device virtio-scsi-pci,id=scsi \
162     -drive file="$image",snapshot=on,cache=unsafe,format="$format",id=hd0,if=none \
163     -device scsi-hd,drive=hd0 \
164     -device virtio-serial-pci \
165     -serial stdio \
166     -device sga \
167     -append "$append"