diff --git a/.github/workflows/issues.yml b/.github/workflows/issues.yml
index 2bc6862b..db76a1ef 100644
--- a/.github/workflows/issues.yml
+++ b/.github/workflows/issues.yml
@@ -278,10 +278,21 @@ jobs:
convertova "rr/rr.img" "rr/rr.ova"
(cd rr; sha256sum rr.ova >../sha256sum)
zip -9 "rr-${MODEL}-${TAG}-${{ github.run_id }}.ova.zip" -j rr/rr.ova ${USER_CONFIG_FILE} sha256sum README.txt
+ elif [ "${{ env.format }}" = "vmx" ]; then
+ . scripts/func.sh "${{ secrets.RRORG }}"
+ convertvmx "rr/rr.img" "rr.vmx" # rr.vmx is a directory
+ (cd rr.vmx; sha256sum * >../sha256sum)
+ zip -9 "rr-${MODEL}-${TAG}-${{ github.run_id }}.vmx.zip" -r rr.vmx ${USER_CONFIG_FILE} sha256sum README.txt
elif [ "${{ env.format }}" = "vmdk" ]; then
qemu-img convert rr/rr.img -O vmdk -o 'adapter_type=lsilogic,subformat=streamOptimized,compat6' rr/rr.vmdk
(cd rr; sha256sum rr.vmdk >../sha256sum)
zip -9 "rr-${MODEL}-${TAG}-${{ github.run_id }}.vmdk.zip" -j rr/rr.vmdk ${USER_CONFIG_FILE} sha256sum README.txt
+ elif [ "${{ env.format }}" = "vhd" ]; then
+ . scripts/func.sh "${{ secrets.RRORG }}"
+ createvmc "rr/rr.vmc"
+ qemu-img convert rr/rr.img -O vpc rr/rr.vhd
+ (cd rr; sha256sum rr.vhd >../sha256sum)
+ zip -9 "rr-${MODEL}-${TAG}-${{ github.run_id }}.vhd.zip" -j rr/rr.vmc rr/rr.vhd ${USER_CONFIG_FILE} sha256sum README.txt
elif [ "${{ env.format }}" = "vhdx" ]; then
qemu-img convert rr/rr.img -O vhdx -o subformat=dynamic rr/rr.vhdx
(cd rr; sha256sum rr.vhdx >../sha256sum)
diff --git a/docs/issues.html b/docs/issues.html
index 9ce4c4db..4b231653 100644
--- a/docs/issues.html
+++ b/docs/issues.html
@@ -290,7 +290,9 @@
value="">
+
+
diff --git a/files/initrd/opt/rr/boot.sh b/files/initrd/opt/rr/boot.sh
index 43db6369..8c963a9b 100755
--- a/files/initrd/opt/rr/boot.sh
+++ b/files/initrd/opt/rr/boot.sh
@@ -263,7 +263,7 @@ function _bootwait() {
}
DIRECT="$(readConfigKey "directboot" "${USER_CONFIG_FILE}")"
-if [ "${DIRECT}" = "true" ]; then
+if [ "${DIRECT}" = "true" ] || [ "${MEV:-physical}" = "parallels" ]; then
grub-editenv ${USER_GRUBENVFILE} set rr_version="$([ -z "${RR_RELEASE}" ] && echo "${RR_TITLE}" || echo "${RR_TITLE}(${RR_RELEASE})")"
grub-editenv ${USER_GRUBENVFILE} set dsm_model="${MODEL}(${PLATFORM})"
grub-editenv ${USER_GRUBENVFILE} set dsm_version="${PRODUCTVER}(${BUILDNUM}$([ ${SMALLNUM:-0} -ne 0 ] && echo "u${SMALLNUM}"))"
@@ -385,7 +385,7 @@ else
done
# # Unload all network interfaces
- # for D in $(readlink /sys/class/net/*/device/driver); do rmmod -f "$(basename ${D})" 2>/dev/null || true; done
+ # for D in $(realpath /sys/class/net/*/device/driver); do rmmod -f "$(basename ${D})" 2>/dev/null || true; done
# Unload all graphics drivers
# for D in $(lsmod | grep -E '^(nouveau|amdgpu|radeon|i915)' | awk '{print $1}'); do rmmod -f "${D}" 2>/dev/null || true; done
diff --git a/guide.md b/guide.md
index 18c38c28..4a761cc1 100644
--- a/guide.md
+++ b/guide.md
@@ -129,6 +129,14 @@
```shell
curl -#kL https://bootstrap.pypa.io/get-pip.py | python3
```
+* virt-what (MEV):
+ ```shell
+ kvm ---- Proxmox VE / Unraid ...
+ qemu ---- QEMU (windows)
+ vmware ---- VMware / VMware ESXi
+ parallels ---- Parallels Desktop
+ virtualbox ---- VirtualBox
+ ```
## DEBUG
* log:
diff --git a/scripts/func.sh b/scripts/func.sh
index ef73eec5..24a999ae 100755
--- a/scripts/func.sh
+++ b/scripts/func.sh
@@ -244,9 +244,9 @@ function repackInitrd() {
[ -z "${INITRD_FILE}" ] || [ ! -f "${INITRD_FILE}" ] && exit 1
[ -z "${PLUGIN_PATH}" ] || [ ! -d "${PLUGIN_PATH}" ] && exit 1
- INITRD_FILE="$(readlink -f "${INITRD_FILE}")"
- PLUGIN_PATH="$(readlink -f "${PLUGIN_PATH}")"
- OUTPUT_PATH="$(readlink -f "${OUTPUT_PATH}")"
+ INITRD_FILE="$(realpath "${INITRD_FILE}")"
+ PLUGIN_PATH="$(realpath "${PLUGIN_PATH}")"
+ OUTPUT_PATH="$(realpath "${OUTPUT_PATH}")"
local RDXZ_PATH="rdxz_tmp"
mkdir -p "${RDXZ_PATH}"
@@ -291,8 +291,8 @@ function resizeImg() {
[ -z "${INPUT_FILE}" ] || [ ! -f "${INPUT_FILE}" ] && exit 1
[ -z "${CHANGE_SIZE}" ] && exit 1
- INPUT_FILE="$(readlink -f "${INPUT_FILE}")"
- OUTPUT_FILE="$(readlink -f "${OUTPUT_FILE}")"
+ INPUT_FILE="$(realpath "${INPUT_FILE}")"
+ OUTPUT_FILE="$(realpath "${OUTPUT_FILE}")"
local SIZE=$(($(du -sm "${INPUT_FILE}" 2>/dev/null | awk '{print $1}')$(echo "${CHANGE_SIZE}" | sed 's/M//g; s/b//g')))
[ "${SIZE:-0}" -lt 0 ] && exit 1
@@ -310,44 +310,25 @@ function resizeImg() {
sudo losetup -d ${LOOPX}
}
-# convertova
+# createvmx
# $1 bootloader file
-# $2 ova file
-function convertova() {
- local BLIMAGE=${1}
- local OVAPATH=${2}
+# $2 vmx name
+function createvmx() {
+ BLIMAGE=${1}
+ VMNAME=${2}
- BLIMAGE="$(readlink -f "${BLIMAGE}")"
- OVAPATH="$(readlink -f "${OVAPATH}")"
- local VMNAME="$(basename "${OVAPATH}" .ova)"
-
- # Download and install ovftool if it doesn't exist
- if [ ! -x ovftool/ovftool ]; then
- rm -rf ovftool ovftool.zip
- curl -skL https://github.com/rgl/ovftool-binaries/raw/main/archive/VMware-ovftool-4.6.0-21452615-lin.x86_64.zip -o ovftool.zip
- if [ $? -ne 0 ]; then
- echo "Failed to download ovftool"
- exit 1
- fi
- unzip ovftool.zip -d . >/dev/null 2>&1
- if [ $? -ne 0 ]; then
- echo "Failed to extract ovftool"
- exit 1
- fi
- chmod +x ovftool/ovftool
- fi
if ! command -v qemu-img &>/dev/null; then
sudo apt install -y qemu-utils
fi
# Convert raw image to VMDK
- rm -rf "OVA_${VMNAME}"
- mkdir -p "OVA_${VMNAME}"
- qemu-img convert -O vmdk -o 'adapter_type=lsilogic,subformat=streamOptimized,compat6' "${BLIMAGE}" "OVA_${VMNAME}/${VMNAME}-disk1.vmdk"
- qemu-img create -f vmdk "OVA_${VMNAME}/${VMNAME}-disk2.vmdk" "32G"
+ rm -rf "VMX_${VMNAME}"
+ mkdir -p "VMX_${VMNAME}"
+ qemu-img convert -O vmdk -o 'adapter_type=lsilogic,subformat=streamOptimized,compat6' "${BLIMAGE}" "VMX_${VMNAME}/${VMNAME}-disk1.vmdk"
+ qemu-img create -f vmdk "VMX_${VMNAME}/${VMNAME}-disk2.vmdk" "32G"
# Create VM configuration
- cat <<_EOF_ >"OVA_${VMNAME}/${VMNAME}.vmx"
+ cat <<_EOF_ >"VMX_${VMNAME}/${VMNAME}.vmx"
.encoding = "UTF-8"
config.version = "8"
virtualHW.version = "17"
@@ -408,7 +389,81 @@ sata0:1.fileName = "${VMNAME}-disk2.vmdk"
sata0:1.present = "TRUE"
_EOF_
- rm -f "${OVAPATH}"
- ovftool/ovftool "OVA_${VMNAME}/${VMNAME}.vmx" "${OVAPATH}"
- rm -rf "OVA_${VMNAME}"
+}
+
+# convertvmx
+# $1 bootloader file
+# $2 vmx file
+function convertvmx() {
+ local BLIMAGE=${1}
+ local VMXPATH=${2}
+
+ BLIMAGE="$(realpath "${BLIMAGE}")"
+ VMXPATH="$(realpath "${VMXPATH}")"
+ local VMNAME="$(basename "${VMXPATH}" .vmx)"
+
+ createvmx "${BLIMAGE}" "${VMNAME}"
+
+ rm -rf "${VMXPATH}"
+ mv -f "VMX_${VMNAME}" "${VMXPATH}"
+}
+
+# convertova
+# $1 bootloader file
+# $2 ova file
+function convertova() {
+ local BLIMAGE=${1}
+ local OVAPATH=${2}
+
+ BLIMAGE="$(realpath "${BLIMAGE}")"
+ OVAPATH="$(realpath "${OVAPATH}")"
+ local VMNAME="$(basename "${OVAPATH}" .ova)"
+
+ createvmx "${BLIMAGE}" "${VMNAME}"
+
+ # Download and install ovftool if it doesn't exist
+ if [ ! -x ovftool/ovftool ]; then
+ rm -rf ovftool ovftool.zip
+ curl -skL https://github.com/rgl/ovftool-binaries/raw/main/archive/VMware-ovftool-4.6.0-21452615-lin.x86_64.zip -o ovftool.zip
+ if [ $? -ne 0 ]; then
+ echo "Failed to download ovftool"
+ exit 1
+ fi
+ unzip ovftool.zip -d . >/dev/null 2>&1
+ if [ $? -ne 0 ]; then
+ echo "Failed to extract ovftool"
+ exit 1
+ fi
+ chmod +x ovftool/ovftool
+ fi
+
+ rm -f "${OVAPATH}"
+ ovftool/ovftool "VMX_${VMNAME}/${VMNAME}.vmx" "${OVAPATH}"
+ rm -rf "VMX_${VMNAME}"
+}
+
+function createvmc() {
+ cat <<_EOF_ >"${1:-rr.vmc}"
+
+
+ 2.0
+
+
+ 4096
+
+
+
+
+
+ 1
+
+ rr.vhd
+
+
+
+
+
+
+
+_EOF_
}