diff options
| -rwxr-xr-x | scripts/runqemu | 3 | ||||
| -rwxr-xr-x | scripts/runqemu-internal | 272 |
2 files changed, 150 insertions, 125 deletions
diff --git a/scripts/runqemu b/scripts/runqemu index 9bd35de6ab..f2eb2e1768 100755 --- a/scripts/runqemu +++ b/scripts/runqemu | |||
| @@ -173,6 +173,9 @@ while true; do | |||
| 173 | KVM_ENABLED="yes" | 173 | KVM_ENABLED="yes" |
| 174 | KVM_CAPABLE=`grep -q 'vmx\|svm' /proc/cpuinfo && echo 1` | 174 | KVM_CAPABLE=`grep -q 'vmx\|svm' /proc/cpuinfo && echo 1` |
| 175 | ;; | 175 | ;; |
| 176 | "slirp") | ||
| 177 | SLIRP_ENABLED="yes" | ||
| 178 | ;; | ||
| 176 | "publicvnc") | 179 | "publicvnc") |
| 177 | SCRIPT_QEMU_OPT="$SCRIPT_QEMU_OPT -vnc 0.0.0.0:0" | 180 | SCRIPT_QEMU_OPT="$SCRIPT_QEMU_OPT -vnc 0.0.0.0:0" |
| 178 | ;; | 181 | ;; |
diff --git a/scripts/runqemu-internal b/scripts/runqemu-internal index 3c5282d89a..d4825d1548 100755 --- a/scripts/runqemu-internal +++ b/scripts/runqemu-internal | |||
| @@ -104,135 +104,152 @@ fi | |||
| 104 | 104 | ||
| 105 | NFSRUNNING="false" | 105 | NFSRUNNING="false" |
| 106 | 106 | ||
| 107 | acquire_lock() { | 107 | if [ "$SLIRP_ENABLED" = "yes" ]; then |
| 108 | lockfile=$1 | 108 | KERNEL_NETWORK_CMD="" |
| 109 | if [ -z "$lockfile" ]; then | 109 | QEMU_TAP_CMD="" |
| 110 | echo "Error: missing lockfile arg passed to acquire_lock()" | 110 | QEMU_UI_OPTIONS="-show-cursor -usb -usbdevice wacom-tablet" |
| 111 | return 1 | 111 | if [ "$KVM_ACTIVE" = "yes" ]; then |
| 112 | fi | 112 | QEMU_NETWORK_CMD="" |
| 113 | 113 | DROOT="/dev/vda" | |
| 114 | touch $lockfile.lock | 114 | ROOTFS_OPTIONS="-drive file=$ROOTFS,if=virtio" |
| 115 | exec 8>$lockfile.lock | 115 | else |
| 116 | flock -n -x 8 | 116 | QEMU_NETWORK_CMD="" |
| 117 | if [ $? -ne 0 ]; then | 117 | DROOT="/dev/hda" |
| 118 | exec 8>&- | 118 | ROOTFS_OPTIONS="-hda $ROOTFS" |
| 119 | return 1 | ||
| 120 | fi | ||
| 121 | |||
| 122 | return 0 | ||
| 123 | } | ||
| 124 | |||
| 125 | release_lock() { | ||
| 126 | lockfile=$1 | ||
| 127 | if [ -z "$lockfile" ]; then | ||
| 128 | echo "Error: missing lockfile arg passed to release_lock()" | ||
| 129 | return 1 | ||
| 130 | fi | ||
| 131 | |||
| 132 | rm -f $lockfile.lock | ||
| 133 | exec 8>&- | ||
| 134 | } | ||
| 135 | |||
| 136 | LOCKDIR="/tmp/qemu-tap-locks" | ||
| 137 | if [ ! -d "$LOCKDIR" ]; then | ||
| 138 | mkdir $LOCKDIR | ||
| 139 | chmod 777 $LOCKDIR | ||
| 140 | fi | ||
| 141 | |||
| 142 | IFCONFIG=`which ip 2> /dev/null` | ||
| 143 | if [ -z "$IFCONFIG" ]; then | ||
| 144 | IFCONFIG=/sbin/ip | ||
| 145 | fi | ||
| 146 | if [ ! -x "$IFCONFIG" ]; then | ||
| 147 | echo "$IFCONFIG cannot be executed" | ||
| 148 | exit 1 | ||
| 149 | fi | ||
| 150 | |||
| 151 | POSSIBLE=`$IFCONFIG link | grep 'tap' | awk '{print $2}' | sed s/://` | ||
| 152 | TAP="" | ||
| 153 | LOCKFILE="" | ||
| 154 | for tap in $POSSIBLE; do | ||
| 155 | LOCKFILE="$LOCKDIR/$tap" | ||
| 156 | echo "Acquiring lockfile for $tap..." | ||
| 157 | acquire_lock $LOCKFILE | ||
| 158 | if [ $? -eq 0 ]; then | ||
| 159 | TAP=$tap | ||
| 160 | break | ||
| 161 | fi | ||
| 162 | done | ||
| 163 | |||
| 164 | if [ "$TAP" = "" ]; then | ||
| 165 | if [ -e "$NOSUDO_FLAG" ]; then | ||
| 166 | echo "Error: There are no available tap devices to use for networking," | ||
| 167 | echo "and I see $NOSUDO_FLAG exists, so I am not going to try creating" | ||
| 168 | echo "a new one with sudo." | ||
| 169 | exit 1 | ||
| 170 | fi | 119 | fi |
| 171 | 120 | ||
| 172 | GROUPID=`id -g` | ||
| 173 | USERID=`id -u` | ||
| 174 | echo "Setting up tap interface under sudo" | ||
| 175 | # Redirect stderr since we could see a LD_PRELOAD warning here if pseudo is loaded | ||
| 176 | # but inactive. This looks scary but is harmless | ||
| 177 | tap=`sudo $QEMUIFUP $USERID $GROUPID $OECORE_NATIVE_SYSROOT 2> /dev/null` | ||
| 178 | if [ $? -ne 0 ]; then | ||
| 179 | # Re-run standalone to see verbose errors | ||
| 180 | sudo $QEMUIFUP $USERID $GROUPID $OECORE_NATIVE_SYSROOT | ||
| 181 | return 1 | ||
| 182 | fi | ||
| 183 | LOCKFILE="$LOCKDIR/$tap" | ||
| 184 | echo "Acquiring lockfile for $tap..." | ||
| 185 | acquire_lock $LOCKFILE | ||
| 186 | if [ $? -eq 0 ]; then | ||
| 187 | TAP=$tap | ||
| 188 | fi | ||
| 189 | else | 121 | else |
| 190 | echo "Using preconfigured tap device '$TAP'" | 122 | acquire_lock() { |
| 191 | fi | 123 | lockfile=$1 |
| 192 | 124 | if [ -z "$lockfile" ]; then | |
| 193 | cleanup() { | 125 | echo "Error: missing lockfile arg passed to acquire_lock()" |
| 194 | if [ ! -e "$NOSUDO_FLAG" ]; then | 126 | return 1 |
| 195 | # Redirect stderr since we could see a LD_PRELOAD warning here if pseudo is loaded | 127 | fi |
| 196 | # but inactive. This looks scary but is harmless | 128 | |
| 197 | sudo $QEMUIFDOWN $TAP $OECORE_NATIVE_SYSROOT 2> /dev/null | 129 | touch $lockfile.lock |
| 198 | fi | 130 | exec 8>$lockfile.lock |
| 199 | echo "Releasing lockfile of preconfigured tap device '$TAP'" | 131 | flock -n -x 8 |
| 200 | release_lock $LOCKFILE | 132 | if [ $? -ne 0 ]; then |
| 133 | exec 8>&- | ||
| 134 | return 1 | ||
| 135 | fi | ||
| 136 | |||
| 137 | return 0 | ||
| 138 | } | ||
| 139 | |||
| 140 | release_lock() { | ||
| 141 | lockfile=$1 | ||
| 142 | if [ -z "$lockfile" ]; then | ||
| 143 | echo "Error: missing lockfile arg passed to release_lock()" | ||
| 144 | return 1 | ||
| 145 | fi | ||
| 146 | |||
| 147 | rm -f $lockfile.lock | ||
| 148 | exec 8>&- | ||
| 149 | } | ||
| 150 | |||
| 151 | LOCKDIR="/tmp/qemu-tap-locks" | ||
| 152 | if [ ! -d "$LOCKDIR" ]; then | ||
| 153 | mkdir $LOCKDIR | ||
| 154 | chmod 777 $LOCKDIR | ||
| 155 | fi | ||
| 201 | 156 | ||
| 202 | if [ "$NFSRUNNING" = "true" ]; then | 157 | IFCONFIG=`which ip 2> /dev/null` |
| 203 | echo "Shutting down the userspace NFS server..." | 158 | if [ -z "$IFCONFIG" ]; then |
| 204 | echo "runqemu-export-rootfs stop $ROOTFS" | 159 | IFCONFIG=/sbin/ip |
| 205 | runqemu-export-rootfs stop $ROOTFS | 160 | fi |
| 206 | fi | 161 | if [ ! -x "$IFCONFIG" ]; then |
| 207 | # If QEMU crashes or somehow tty properties are not restored | 162 | echo "$IFCONFIG cannot be executed" |
| 208 | # after qemu exits, we need to run stty sane | 163 | exit 1 |
| 209 | stty sane | 164 | fi |
| 210 | } | ||
| 211 | 165 | ||
| 212 | n0=$(echo $TAP | sed 's/tap//') | 166 | POSSIBLE=`$IFCONFIG link | grep 'tap' | awk '{print $2}' | sed s/://` |
| 213 | n1=$(($n0 * 2 + 1)) | 167 | TAP="" |
| 214 | n2=$(($n1 + 1)) | 168 | LOCKFILE="" |
| 169 | for tap in $POSSIBLE; do | ||
| 170 | LOCKFILE="$LOCKDIR/$tap" | ||
| 171 | echo "Acquiring lockfile for $tap..." | ||
| 172 | acquire_lock $LOCKFILE | ||
| 173 | if [ $? -eq 0 ]; then | ||
| 174 | TAP=$tap | ||
| 175 | break | ||
| 176 | fi | ||
| 177 | done | ||
| 178 | |||
| 179 | if [ "$TAP" = "" ]; then | ||
| 180 | if [ -e "$NOSUDO_FLAG" ]; then | ||
| 181 | echo "Error: There are no available tap devices to use for networking," | ||
| 182 | echo "and I see $NOSUDO_FLAG exists, so I am not going to try creating" | ||
| 183 | echo "a new one with sudo." | ||
| 184 | exit 1 | ||
| 185 | fi | ||
| 186 | |||
| 187 | GROUPID=`id -g` | ||
| 188 | USERID=`id -u` | ||
| 189 | echo "Setting up tap interface under sudo" | ||
| 190 | # Redirect stderr since we could see a LD_PRELOAD warning here if pseudo is loaded | ||
| 191 | # but inactive. This looks scary but is harmless | ||
| 192 | tap=`sudo $QEMUIFUP $USERID $GROUPID $OECORE_NATIVE_SYSROOT 2> /dev/null` | ||
| 193 | if [ $? -ne 0 ]; then | ||
| 194 | # Re-run standalone to see verbose errors | ||
| 195 | sudo $QEMUIFUP $USERID $GROUPID $OECORE_NATIVE_SYSROOT | ||
| 196 | return 1 | ||
| 197 | fi | ||
| 198 | LOCKFILE="$LOCKDIR/$tap" | ||
| 199 | echo "Acquiring lockfile for $tap..." | ||
| 200 | acquire_lock $LOCKFILE | ||
| 201 | if [ $? -eq 0 ]; then | ||
| 202 | TAP=$tap | ||
| 203 | fi | ||
| 204 | else | ||
| 205 | echo "Using preconfigured tap device '$TAP'" | ||
| 206 | fi | ||
| 215 | 207 | ||
| 216 | KERNEL_NETWORK_CMD="ip=192.168.7.$n2::192.168.7.$n1:255.255.255.0" | 208 | cleanup() { |
| 217 | QEMU_TAP_CMD="-net tap,vlan=0,ifname=$TAP,script=no,downscript=no" | 209 | if [ ! -e "$NOSUDO_FLAG" ]; then |
| 218 | if [ "$KVM_ACTIVE" = "yes" ]; then | 210 | # Redirect stderr since we could see a LD_PRELOAD warning here if pseudo is loaded |
| 219 | QEMU_NETWORK_CMD="-net nic,model=virtio $QEMU_TAP_CMD,vhost=on" | 211 | # but inactive. This looks scary but is harmless |
| 220 | DROOT="/dev/vda" | 212 | sudo $QEMUIFDOWN $TAP $OECORE_NATIVE_SYSROOT 2> /dev/null |
| 221 | ROOTFS_OPTIONS="-drive file=$ROOTFS,if=virtio" | 213 | fi |
| 222 | else | 214 | echo "Releasing lockfile of preconfigured tap device '$TAP'" |
| 223 | QEMU_NETWORK_CMD="-net nic,vlan=0 $QEMU_TAP_CMD" | 215 | release_lock $LOCKFILE |
| 224 | DROOT="/dev/hda" | 216 | |
| 225 | ROOTFS_OPTIONS="-hda $ROOTFS" | 217 | if [ "$NFSRUNNING" = "true" ]; then |
| 226 | fi | 218 | echo "Shutting down the userspace NFS server..." |
| 227 | KERNCMDLINE="mem=$QEMU_MEMORY" | 219 | echo "runqemu-export-rootfs stop $ROOTFS" |
| 228 | QEMU_UI_OPTIONS="-show-cursor -usb -usbdevice wacom-tablet" | 220 | runqemu-export-rootfs stop $ROOTFS |
| 221 | fi | ||
| 222 | # If QEMU crashes or somehow tty properties are not restored | ||
| 223 | # after qemu exits, we need to run stty sane | ||
| 224 | stty sane | ||
| 225 | } | ||
| 226 | |||
| 227 | |||
| 228 | n0=$(echo $TAP | sed 's/tap//') | ||
| 229 | n1=$(($n0 * 2 + 1)) | ||
| 230 | n2=$(($n1 + 1)) | ||
| 231 | |||
| 232 | KERNEL_NETWORK_CMD="ip=192.168.7.$n2::192.168.7.$n1:255.255.255.0" | ||
| 233 | QEMU_TAP_CMD="-net tap,vlan=0,ifname=$TAP,script=no,downscript=no" | ||
| 234 | if [ "$KVM_ACTIVE" = "yes" ]; then | ||
| 235 | QEMU_NETWORK_CMD="-net nic,model=virtio $QEMU_TAP_CMD,vhost=on" | ||
| 236 | DROOT="/dev/vda" | ||
| 237 | ROOTFS_OPTIONS="-drive file=$ROOTFS,if=virtio" | ||
| 238 | else | ||
| 239 | QEMU_NETWORK_CMD="-net nic,vlan=0 $QEMU_TAP_CMD" | ||
| 240 | DROOT="/dev/hda" | ||
| 241 | ROOTFS_OPTIONS="-hda $ROOTFS" | ||
| 242 | fi | ||
| 243 | KERNCMDLINE="mem=$QEMU_MEMORY" | ||
| 244 | QEMU_UI_OPTIONS="-show-cursor -usb -usbdevice wacom-tablet" | ||
| 229 | 245 | ||
| 230 | NFS_INSTANCE=`echo $TAP | sed 's/tap//'` | 246 | NFS_INSTANCE=`echo $TAP | sed 's/tap//'` |
| 231 | export NFS_INSTANCE | 247 | export NFS_INSTANCE |
| 232 | 248 | ||
| 233 | SERIALOPTS="" | 249 | SERIALOPTS="" |
| 234 | if [ "x$SERIAL_LOGFILE" != "x" ]; then | 250 | if [ "x$SERIAL_LOGFILE" != "x" ]; then |
| 235 | SERIALOPTS="-serial file:$SERIAL_LOGFILE" | 251 | SERIALOPTS="-serial file:$SERIAL_LOGFILE" |
| 252 | fi | ||
| 236 | fi | 253 | fi |
| 237 | 254 | ||
| 238 | case "$MACHINE" in | 255 | case "$MACHINE" in |
| @@ -414,7 +431,11 @@ if [ "$MACHINE" = "qemuppc" ]; then | |||
| 414 | MACHINE_SUBTYPE=mac99 | 431 | MACHINE_SUBTYPE=mac99 |
| 415 | CPU_SUBTYPE=G4 | 432 | CPU_SUBTYPE=G4 |
| 416 | QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS" | 433 | QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS" |
| 417 | QEMU_NETWORK_CMD="-net nic,model=pcnet $QEMU_TAP_CMD" | 434 | if [ "$SLIRP_ENABLED" = "yes" ]; then |
| 435 | QEMU_NETWORK_CMD="" | ||
| 436 | else | ||
| 437 | QEMU_NETWORK_CMD="-net nic,model=pcnet $QEMU_TAP_CMD" | ||
| 438 | fi | ||
| 418 | if [ "${FSTYPE:0:3}" = "ext" -o "$FSTYPE" = "btrfs" ]; then | 439 | if [ "${FSTYPE:0:3}" = "ext" -o "$FSTYPE" = "btrfs" ]; then |
| 419 | KERNCMDLINE="root=/dev/hda rw console=ttyS0 console=tty $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY" | 440 | KERNCMDLINE="root=/dev/hda rw console=ttyS0 console=tty $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY" |
| 420 | QEMUOPTIONS="$QEMU_NETWORK_CMD -cpu $CPU_SUBTYPE -M $MACHINE_SUBTYPE -hda $ROOTFS -no-reboot $QEMU_UI_OPTIONS" | 441 | QEMUOPTIONS="$QEMU_NETWORK_CMD -cpu $CPU_SUBTYPE -M $MACHINE_SUBTYPE -hda $ROOTFS -no-reboot $QEMU_UI_OPTIONS" |
| @@ -560,12 +581,13 @@ elif [ "$FSTYPE" = "iso" ]; then | |||
| 560 | echo $QEMUBIN $QEMUOPTIONS $SERIALOPTS -no-reboot $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT | 581 | echo $QEMUBIN $QEMUOPTIONS $SERIALOPTS -no-reboot $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT |
| 561 | LD_PRELOAD="$GL_LD_PRELOAD" $QEMUBIN $QEMUOPTIONS $SERIALOPTS -no-reboot $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT | 582 | LD_PRELOAD="$GL_LD_PRELOAD" $QEMUBIN $QEMUOPTIONS $SERIALOPTS -no-reboot $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT |
| 562 | else | 583 | else |
| 563 | echo $QEMUBIN -kernel $KERNEL $QEMUOPTIONS $SERIALOPTS -no-reboot $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT --append '"'$KERNCMDLINE $SCRIPT_KERNEL_OPT'"' | 584 | echo $QEMUBIN -kernel $KERNEL $QEMUOPTIONS $SLIRP_CMD $SERIALOPTS -no-reboot $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT --append '"'$KERNCMDLINE $SCRIPT_KERNEL_OPT'"' |
| 564 | LD_PRELOAD="$GL_LD_PRELOAD" $QEMUBIN -kernel $KERNEL $QEMUOPTIONS $SERIALOPTS -no-reboot $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT --append "$KERNCMDLINE $SCRIPT_KERNEL_OPT" | 585 | LD_PRELOAD="$GL_LD_PRELOAD" $QEMUBIN -kernel $KERNEL $QEMUOPTIONS $SERIALOPTS -no-reboot $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT --append "$KERNCMDLINE $SCRIPT_KERNEL_OPT" |
| 565 | fi | 586 | fi |
| 566 | ret=$? | 587 | ret=$? |
| 567 | 588 | if [ "$SLIRP_ENABLED" != "yes" ]; then | |
| 568 | cleanup | 589 | cleanup |
| 590 | fi | ||
| 569 | 591 | ||
| 570 | trap - INT TERM QUIT | 592 | trap - INT TERM QUIT |
| 571 | 593 | ||
