mirror of
				https://github.com/oSoWoSo/DistroHopper.git
				synced 2024-08-14 22:46:53 +00:00 
			
		
		
		
	
							parent
							
								
									01e08647ac
								
							
						
					
					
						commit
						57f888ae4c
					
				
					 1 changed files with 63 additions and 57 deletions
				
			
		
							
								
								
									
										120
									
								
								quickemu
									
										
									
									
									
								
							
							
						
						
									
										120
									
								
								quickemu
									
										
									
									
									
								
							|  | @ -3,10 +3,10 @@ export LC_ALL=C | |||
| 
 | ||||
| function web_get() { | ||||
|   local URL="${1}" | ||||
|   local FILE=$(echo "${URL##*/}") | ||||
|   local FILE="" | ||||
|   FILE="${URL##*/}" | ||||
|   if [ ! -e "${VMDIR}/${FILE}" ]; then | ||||
|     wget -q -c "${URL}" -O "${VMDIR}/${FILE}" | ||||
|     if [ $? -ne 0 ]; then | ||||
|     if ! wget -q -c "${URL}" -O "${VMDIR}/${FILE}"; then | ||||
|       echo "ERROR! Failed to download ${URL}" | ||||
|       exit 1 | ||||
|     fi | ||||
|  | @ -20,7 +20,8 @@ function disk_delete() { | |||
|   else | ||||
|     echo "NOTE! ${disk_img} not found. Doing nothing." | ||||
|   fi | ||||
|   local VMNAME=$(basename "${VM}" .conf) | ||||
|   local VMNAME="" | ||||
|   VMNAME=$(basename "${VM}" .conf) | ||||
|   local SHORTCUT_DIR="/home/${USER}/.local/share/applications/" | ||||
|   if [ -e "${SHORTCUT_DIR}/${VMNAME}.desktop" ]; then | ||||
|     rm -v "${SHORTCUT_DIR}/${VMNAME}.desktop" | ||||
|  | @ -36,8 +37,7 @@ function snapshot_apply() { | |||
|   fi | ||||
| 
 | ||||
|   if [ -e "${disk_img}" ]; then | ||||
|     ${QEMU_IMG} snapshot -q -a "${TAG}" "${disk_img}" | ||||
|     if [ $? -eq 0 ]; then | ||||
|     if ${QEMU_IMG} snapshot -q -a "${TAG}" "${disk_img}"; then | ||||
|       echo "SUCCESS! Applied snapshot ${TAG} to ${disk_img}" | ||||
|     else | ||||
|       echo "ERROR! Failed to apply snapshot ${TAG} to ${disk_img}" | ||||
|  | @ -55,8 +55,7 @@ function snapshot_create() { | |||
|   fi | ||||
| 
 | ||||
|   if [ -e "${disk_img}" ]; then | ||||
|     ${QEMU_IMG} snapshot -q -c "${TAG}" "${disk_img}" | ||||
|     if [ $? -eq 0 ]; then | ||||
|     if ${QEMU_IMG} snapshot -q -c "${TAG}" "${disk_img}"; then | ||||
|       echo "SUCCESS! Created snapshot ${TAG} of ${disk_img}" | ||||
|     else | ||||
|       echo "ERROR! Failed to create snapshot ${TAG} of ${disk_img}" | ||||
|  | @ -74,8 +73,7 @@ function snapshot_delete() { | |||
|   fi | ||||
| 
 | ||||
|   if [ -e "${disk_img}" ]; then | ||||
|     ${QEMU_IMG} snapshot -q -d "${TAG}" "${disk_img}" | ||||
|     if [ $? -eq 0 ]; then | ||||
|     if ${QEMU_IMG} snapshot -q -d "${TAG}" "${disk_img}"; then | ||||
|       echo "SUCCESS! Deleted snapshot ${TAG} of ${disk_img}" | ||||
|     else | ||||
|       echo "ERROR! Failed to delete snapshot ${TAG} of ${disk_img}" | ||||
|  | @ -120,11 +118,11 @@ function enable_usb_passthrough() { | |||
|     echo " - USB:      Device pass-through requested:" | ||||
|     echo "#!/usr/bin/env bash" > "${TEMP_SCRIPT}" | ||||
|     for DEVICE in "${usb_devices[@]}"; do | ||||
|       VENDOR_ID=$(echo ${DEVICE} | cut -d':' -f1) | ||||
|       PRODUCT_ID=$(echo ${DEVICE} | cut -d':' -f2) | ||||
|       USB_BUS=$(lsusb -d ${VENDOR_ID}:${PRODUCT_ID} | cut -d' ' -f2) | ||||
|       USB_DEV=$(lsusb -d ${VENDOR_ID}:${PRODUCT_ID} | cut -d' ' -f4 | cut -d':' -f1) | ||||
|       USB_NAME=$(lsusb -d ${VENDOR_ID}:${PRODUCT_ID} | cut -d' ' -f7-) | ||||
|       VENDOR_ID=$(echo "${DEVICE}" | cut -d':' -f1) | ||||
|       PRODUCT_ID=$(echo "${DEVICE}" | cut -d':' -f2) | ||||
|       USB_BUS=$(lsusb -d "${VENDOR_ID}:${PRODUCT_ID}" | cut -d' ' -f2) | ||||
|       USB_DEV=$(lsusb -d "${VENDOR_ID}:${PRODUCT_ID}" | cut -d' ' -f4 | cut -d':' -f1) | ||||
|       USB_NAME=$(lsusb -d "${VENDOR_ID}:${PRODUCT_ID}" | cut -d' ' -f7-) | ||||
|       echo "              - ${USB_NAME}" | ||||
|       USB_PASSTHROUGH="${USB_PASSTHROUGH} -device usb-host,vendorid=0x${VENDOR_ID},productid=0x${PRODUCT_ID},bus=usb.0" | ||||
|       if [ ! -w "/dev/bus/usb/${USB_BUS}/${USB_DEV}" ]; then | ||||
|  | @ -140,8 +138,7 @@ function enable_usb_passthrough() { | |||
|       echo | ||||
|       cat "${TEMP_SCRIPT}" | ||||
|       echo | ||||
|       sudo "${TEMP_SCRIPT}" | ||||
|       if [ $? -ne 0 ]; then | ||||
|       if ! sudo "${TEMP_SCRIPT}"; then | ||||
|         echo "            WARNING! Enabling USB device access failed." | ||||
|       fi | ||||
|     else | ||||
|  | @ -152,8 +149,10 @@ function enable_usb_passthrough() { | |||
| } | ||||
| 
 | ||||
| function vm_boot() { | ||||
|   local VMNAME=$(basename "${VM}" .conf) | ||||
|   local VMDIR=$(dirname "${disk_img}") | ||||
|   local VMNAME="" | ||||
|   VMNAME=$(basename "${VM}" .conf) | ||||
|   local VMDIR="" | ||||
|   VMDIR=$(dirname "${disk_img}") | ||||
|   local CPU="-cpu host,kvm=on" | ||||
|   local GUEST_TWEAKS="" | ||||
|   local DISPLAY_DEVICE="" | ||||
|  | @ -162,12 +161,13 @@ function vm_boot() { | |||
|   local VIRGL="on" | ||||
|   local OUTPUT="sdl" | ||||
|   local OUTPUT_EXTRA="" | ||||
|   local QEMU_VER=$(${QEMU} -version | head -n1 | cut -d' ' -f4 | cut -d'(' -f1) | ||||
|   local QEMU_VER="" | ||||
|   QEMU_VER=$(${QEMU} -version | head -n1 | cut -d' ' -f4 | cut -d'(' -f1) | ||||
|   echo "Starting ${VM}" | ||||
|   echo " - QEMU:     ${QEMU} v${QEMU_VER}" | ||||
| 
 | ||||
|   # Force to lowercase. | ||||
|   boot=$(echo ${boot,,}) | ||||
|   boot=${boot,,} | ||||
| 
 | ||||
|   # Always Boot macOS using EFI | ||||
|   if [ "${guest_os}" == "macos" ]; then | ||||
|  | @ -199,7 +199,7 @@ function vm_boot() { | |||
|   fi | ||||
| 
 | ||||
|   # Force to lowercase. | ||||
|   guest_os=$(echo ${guest_os,,}) | ||||
|   guest_os=${guest_os,,} | ||||
|   # Make any OS specific adjustments | ||||
|   case ${guest_os} in | ||||
|     linux) | ||||
|  | @ -207,8 +207,8 @@ function vm_boot() { | |||
|       ;; | ||||
|     macos) | ||||
|       CPU="-cpu Penryn,vendor=GenuineIntel,kvm=on,+aes,+avx,+avx2,+bmi1,+bmi2,+fma,+invtsc,+movbe,+pcid,+smep,+sse3,+sse4.2,+xgetbv1,+xsave,+xsavec,+xsaveopt" | ||||
|       readonly ROT_OSK="bheuneqjbexolgurfrjbeqfthneqrqcyrnfrqbagfgrny(p)NccyrPbzchgreVap" | ||||
|       readonly OSK=$(echo ${ROT_OSK} | rot13) | ||||
|       OSK="" | ||||
|       OSK=$(echo "bheuneqjbexolgurfrjbeqfthneqrqcyrnfrqbagfgrny(p)NccyrPbzchgreVap" | rot13) | ||||
|       GUEST_TWEAKS="-device isa-applesmc,osk=${OSK}" | ||||
|       DISPLAY_DEVICE="VGA" | ||||
|       VIRGL="off" | ||||
|  | @ -229,8 +229,7 @@ function vm_boot() { | |||
|   if [ ! -f "${disk_img}" ]; then | ||||
|       # If there is no disk image, create a new image. | ||||
|       mkdir -p "${VMDIR}" 2>/dev/null | ||||
|       ${QEMU_IMG} create -q -f qcow2 "${disk_img}" "${disk}" | ||||
|       if [ $? -ne 0 ]; then | ||||
|       if ! ${QEMU_IMG} create -q -f qcow2 "${disk_img}" "${disk}"; then | ||||
|         echo "ERROR! Failed to create ${disk_img}" | ||||
|         exit 1 | ||||
|       fi | ||||
|  | @ -245,13 +244,12 @@ function vm_boot() { | |||
|     fi | ||||
|   elif [ -e "${disk_img}" ]; then | ||||
|     # Check there isn't already a process attached to the disk image. | ||||
|     QEMU_LOCK_TEST=$(${QEMU_IMG} info "${disk_img}" 2>/dev/null) | ||||
|     if [ $? -ne 0 ]; then | ||||
|       echo "             Failed to get "write" lock. Is another process using the disk?" | ||||
|     if ! ${QEMU_IMG} info "${disk_img}" >/dev/null; then | ||||
|       echo "             Failed to get \"write\" lock. Is another process using the disk?" | ||||
|       exit 1 | ||||
|     else | ||||
|       DISK_CURR_SIZE=$(stat -c%s "${disk_img}") | ||||
|       if [ ${DISK_CURR_SIZE} -le ${DISK_MIN_SIZE} ]; then | ||||
|       if [ "${DISK_CURR_SIZE}" -le "${DISK_MIN_SIZE}" ]; then | ||||
|         echo "             Looks unused, booting from ${iso}${img}" | ||||
|         if [ -z "${iso}" ] && [ -z "${img}" ]; then | ||||
|           echo "ERROR! You haven't specified a .iso or .img image to boot from." | ||||
|  | @ -281,14 +279,15 @@ function vm_boot() { | |||
| 
 | ||||
|   local CORES_VM="1" | ||||
|   if [ -z "$cpu_cores" ]; then | ||||
|       local CORES_HOST=$(nproc --all) | ||||
|       if [ ${CORES_HOST} -ge 32 ]; then | ||||
|       local CORES_HOST="" | ||||
|       CORES_HOST=$(nproc --all) | ||||
|       if [ "${CORES_HOST}" -ge 32 ]; then | ||||
|         CORES_VM="16" | ||||
|       elif [ ${CORES_HOST} -ge 16 ]; then | ||||
|       elif [ "${CORES_HOST}" -ge 16 ]; then | ||||
|         CORES_VM="8" | ||||
|       elif [ ${CORES_HOST} -ge 8 ]; then | ||||
|       elif [ "${CORES_HOST}" -ge 8 ]; then | ||||
|         CORES_VM="4" | ||||
|       elif [ ${CORES_HOST} -ge 4 ]; then | ||||
|       elif [ "${CORES_HOST}" -ge 4 ]; then | ||||
|         CORES_VM="2" | ||||
|       fi | ||||
|   else | ||||
|  | @ -299,18 +298,19 @@ function vm_boot() { | |||
| 
 | ||||
|   local RAM_VM="2G" | ||||
|   if [ -z "$ram" ]; then | ||||
|       local RAM_HOST=$(free --mega -h | grep Mem | cut -d':' -f2 | cut -d'G' -f1 | sed 's/ //g') | ||||
|       local RAM_HOST="" | ||||
|       RAM_HOST=$(free --mega -h | grep Mem | cut -d':' -f2 | cut -d'G' -f1 | sed 's/ //g') | ||||
|       #Round up - https://github.com/wimpysworld/quickemu/issues/11 | ||||
|       RAM_HOST=$(printf '%.*f\n' 0 ${RAM_HOST}) | ||||
|       if [ ${RAM_HOST} -ge 256 ]; then | ||||
|       RAM_HOST=$(printf '%.*f\n' 0 "${RAM_HOST}") | ||||
|       if [ "${RAM_HOST}" -ge 256 ]; then | ||||
|         RAM_VM="32G" | ||||
|       elif [ ${RAM_HOST} -ge 128 ]; then | ||||
|       elif [ "${RAM_HOST}" -ge 128 ]; then | ||||
|         RAM_VM="16G" | ||||
|       elif [ ${RAM_HOST} -ge 64 ]; then | ||||
|       elif [ "${RAM_HOST}" -ge 64 ]; then | ||||
|         RAM_VM="8G" | ||||
|       elif [ ${RAM_HOST} -ge 32 ]; then | ||||
|       elif [ "${RAM_HOST}" -ge 32 ]; then | ||||
|         RAM_VM="4G" | ||||
|       elif [ ${RAM_HOST} -ge 16 ]; then | ||||
|       elif [ "${RAM_HOST}" -ge 16 ]; then | ||||
|         RAM_VM="3G" | ||||
|       fi | ||||
|   else | ||||
|  | @ -321,20 +321,21 @@ function vm_boot() { | |||
|   local X_RES=1152 | ||||
|   local Y_RES=648 | ||||
|   if [ "${XDG_SESSION_TYPE}" == "x11" ]; then | ||||
|     local LOWEST_WIDTH=$(xrandr --listmonitors | grep -v Monitors | cut -d' ' -f4 | cut -d'/' -f1 | sort | head -n1) | ||||
|     if [ ${FULLSCREEN} ]; then | ||||
|     local LOWEST_WIDTH="" | ||||
|     LOWEST_WIDTH=$(xrandr --listmonitors | grep -v Monitors | cut -d' ' -f4 | cut -d'/' -f1 | sort | head -n1) | ||||
|     if [ "${FULLSCREEN}" ]; then | ||||
|       X_RES=$(xrandr --listmonitors | grep -v Monitors | cut -d' ' -f4 | cut -d'/' -f1 | sort | head -n1) | ||||
|       Y_RES=$(xrandr --listmonitors | grep -v Monitors | cut -d' ' -f4 | cut -d'/' -f2 | cut -d'x' -f2 | sort | head -n1) | ||||
|     elif [ ${LOWEST_WIDTH} -ge 3840 ]; then | ||||
|     elif [ "${LOWEST_WIDTH}" -ge 3840 ]; then | ||||
|       X_RES=3200 | ||||
|       Y_RES=1800 | ||||
|     elif [ ${LOWEST_WIDTH} -ge 2560 ]; then | ||||
|     elif [ "${LOWEST_WIDTH}" -ge 2560 ]; then | ||||
|       X_RES=2048 | ||||
|       Y_RES=1152 | ||||
|     elif [ ${LOWEST_WIDTH} -ge 1920 ]; then | ||||
|     elif [ "${LOWEST_WIDTH}" -ge 1920 ]; then | ||||
|       X_RES=1664 | ||||
|       Y_RES=936 | ||||
|     elif [ ${LOWEST_WIDTH} -ge 1280 ]; then | ||||
|     elif [ "${LOWEST_WIDTH}" -ge 1280 ]; then | ||||
|       X_RES=1152 | ||||
|       Y_RES=648 | ||||
|     fi | ||||
|  | @ -376,7 +377,8 @@ function vm_boot() { | |||
|   fi | ||||
| 
 | ||||
|   # Find a free port to expose ssh to the guest | ||||
|   local PORT=$(get_port 22220 9) | ||||
|   local PORT="" | ||||
|   PORT=$(get_port 22220 9) | ||||
|   if [ -n "${PORT}" ]; then | ||||
|     NET="${NET},hostfwd=tcp::${PORT}-:22" | ||||
|     echo " - ssh:      ${PORT}/tcp is connected. Login via 'ssh user@localhost -p ${PORT}'" | ||||
|  | @ -388,16 +390,17 @@ function vm_boot() { | |||
|   if (( ${#port_forwards[@]} )); then | ||||
|     echo " - PORTS:    Port forwards requested:" | ||||
|     for FORWARD in "${port_forwards[@]}"; do | ||||
|       HOST_PORT=$(echo ${FORWARD} | cut -d':' -f1) | ||||
|       GUEST_PORT=$(echo ${FORWARD} | cut -d':' -f2) | ||||
|       HOST_PORT=$(echo "${FORWARD}" | cut -d':' -f1) | ||||
|       GUEST_PORT=$(echo "${FORWARD}" | cut -d':' -f2) | ||||
|       echo "              - ${HOST_PORT} => ${GUEST_PORT}" | ||||
|       NET="${NET},hostfwd=tcp::${HOST_PORT}-:${GUEST_PORT}" | ||||
|     done | ||||
|   fi | ||||
| 
 | ||||
|   # Find a free port for spice | ||||
|   local SPICE_PORT=$(get_port 5930 9) | ||||
|   if [ ! -n "${SPICE_PORT}" ]; then | ||||
|   local SPICE_PORT="" | ||||
|   SPICE_PORT=$(get_port 5930 9) | ||||
|   if [ -z "${SPICE_PORT}" ]; then | ||||
|     echo " - spice:      All spice ports have been exhausted." | ||||
|   fi | ||||
| 
 | ||||
|  | @ -500,10 +503,12 @@ function vm_boot() { | |||
| } | ||||
| 
 | ||||
| function shortcut_create { | ||||
|   local VMNAME=$(basename "${VM}" .conf) | ||||
|   local LAUNCHER_DIR="$(dirname "$(realpath "$0")")" | ||||
|   local VMNAME="" | ||||
|   VMNAME=$(basename "${VM}" .conf) | ||||
|   local LAUNCHER_DIR="" | ||||
|   LAUNCHER_DIR="$(dirname "$(realpath "$0")")" | ||||
|   local filename="/home/${USER}/.local/share/applications/${VMNAME}.desktop" | ||||
|   cat << EOF > ${filename} | ||||
|   cat << EOF > "${filename}" | ||||
| [Desktop Entry] | ||||
| Version=1.0 | ||||
| Type=Application | ||||
|  | @ -566,7 +571,7 @@ if [ ! -e "${QEMU}" ] && [ ! -e "${QEMU_IMG}" ]; then | |||
| fi | ||||
| 
 | ||||
| QEMU_VER=$(${QEMU} -version | head -n1 | cut -d' ' -f4 | cut -d'(' -f1 | sed 's/\.//g') | ||||
| if [ ${QEMU_VER} -lt 600 ]; then | ||||
| if [ "${QEMU_VER}" -lt 600 ]; then | ||||
|   echo "ERROR! Qemu 6.0.0 is newer is required, detected $(${QEMU} -version | head -n1 | cut -d' ' -f4 | cut -d'(' -f1)." | ||||
|   exit 1 | ||||
| fi | ||||
|  | @ -621,6 +626,7 @@ else | |||
| fi | ||||
| 
 | ||||
| if [ -n "${VM}" ] && [ -e "${VM}" ]; then | ||||
|   # shellcheck source=/dev/null | ||||
|   source "${VM}" | ||||
|   if [ -z "${disk_img}" ]; then | ||||
|     echo "ERROR! No disk_img defined." | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue