From 488415899613ff0f6bc7cb7daf1617e9b9e119f2 Mon Sep 17 00:00:00 2001 From: Ing Date: Thu, 18 Sep 2025 14:03:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20pve.sh=20=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=AD=98=E5=82=A8=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E6=94=AF=E6=8C=81=EF=BC=8C=E6=94=B9=E8=BF=9B=E5=AD=98?= =?UTF-8?q?=E5=82=A8=E8=8E=B7=E5=8F=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/pve.sh | 118 ++++++++++++++++++++++++++++--------------------- 1 file changed, 68 insertions(+), 50 deletions(-) diff --git a/scripts/pve.sh b/scripts/pve.sh index fc52e6d3..ee7c3aa5 100644 --- a/scripts/pve.sh +++ b/scripts/pve.sh @@ -12,23 +12,27 @@ REPO="https://github.com/RROrg/rr" ONBOOT=1 # 开机启动,默认1 EFI=1 # 启用 UEFI 引导,默认1 BLTYPE="sata" # 引导盘类型, 支持 sata,usb,nvme 默认 sata -NINEPPATH="" # 9p路径,默认空不添加 +STORAGE="" # 存储,默认自动获取 +V9PPATH="" # 添加 virtio9p 挂载目录,默认空不添加 +VFSDIRID="" # 添加 virtiofs 挂载文件夹id,默认空不添加 TAG="" # 镜像tag,默认自动获取 IMG="" # 本地镜像路径,默认空 - usage() { - echo "Usage: $0 [--onboot <0|1>] [--efi <0|1>] [--bltype ] [--9ppath ] [--tag ] [--img ]" - echo " --onboot <0|1> Enable VM on boot, default 1 (enable)" - echo " --efi <0|1> Enable UEFI boot, default 1 (enable)" - echo " --bltype Bootloader disk type, default sata" - echo " --9ppath Set to /path/to/9p to mount 9p share" - echo " --tag Image tag, download latest release if not set" - echo " --img Local image path, use local image if set" - exit 1 + echo "Usage: $0 [--onboot <0|1>] [--efi <0|1>] [--bltype ] [--storage ]" + echo " [--v9ppath ] [--vfsdirid ] [--tag ] [--img ]" + echo "" + echo " --onboot <0|1> Enable VM on boot, default 1 (enable)" + echo " --efi <0|1> Enable UEFI boot, default 1 (enable)" + echo " --bltype Bootloader disk type, default sata" + echo " --storage Storage name for images, as local-lvm, default auto get" + echo " --v9ppath Set to /path/to/9p to mount virtio 9p share" + echo " --vfsdirid Set to to mount virtio fs share" + echo " --tag Image tag, download latest release if not set" + echo " --img Local image path, use local image if set" } -ARGS=$(getopt -o '' --long onboot:,efi:,bltype:,9ppath:,tag:,img: -n "$0" -- "$@") +ARGS=$(getopt -o '' --long onboot:,efi:,bltype:,storage:,v9ppath:,vfsdirid:,tag:,img: -n "$0" -- "$@") if [ $? -ne 0 ]; then usage exit 1 @@ -51,21 +55,29 @@ while true; do echo "$BLTYPE" | grep -qvE '^(sata|usb|nvme)$' && BLTYPE="sata" shift 2 ;; + --storage) + STORAGE="$2" + [ -n "${STORAGE}" ] && pvesm status -content images | grep -qw "^${STORAGE}" || STORAGE="" + shift 2 + ;; + --v9ppath) + V9PPATH="$2" + [ -d "${V9PPATH}" ] && V9PPATH="$(realpath "${V9PPATH}")" || V9PPATH="" + shift 2 + ;; + --vfsdirid) + VFSDIRID="$2" + [ -n "${VFSDIRID}" ] && pvesh ls /cluster/mapping/dir | grep -qw "${VFSDIRID}" || VFSDIRID="" + shift 2 + ;; --tag) TAG="$2" - [ "${TAG:0:1}" = "v" ] && TAG="${TAG:1}" + [ "${TAG:0:1}" = "v" ] && TAG="${TAG:1}" shift 2 ;; --img) IMG="$2" - [ ! -f "${IMG}" ] && IMG="" - [ -n "${IMG}" ] && IMG="$(realpath "${IMG}")" - shift 2 - ;; - --9ppath) - NINEPPATH="$2" - [ ! -d "${NINEPPATH}" ] && NINEPPATH="" - [ -z "${NINEPPATH}" ] || NINEPPATH="$(realpath "${NINEPPATH}")" + [ -f "${IMG}" ] && IMG="$(realpath "${IMG}")" || IMG="" shift 2 ;; --) @@ -129,6 +141,7 @@ echo "Creating VM with RR ... " # 获取可用的 VMID VMID="$(($(qm list | awk 'NR>1{print $1}' | sort -n | tail -1 2>/dev/null || echo 99) + 1))" ARGS="" +SATAIDX=0 # 创建 VM qm create ${VMID} --name RR-DSM --machine q35 --ostype l26 --vga virtio --sockets 1 --cores 2 --cpu host --numa 0 --memory 4096 --scsihw virtio-scsi-single @@ -138,11 +151,11 @@ if [ $? -ne 0 ]; then fi # 获取 存储 -STORAGE=$(pvesm status -content images | awk 'NR>1 {print $1}' | grep local | tail -1) +[ -z "${STORAGE}" ] && STORAGE=$(pvesm status -content images | awk 'NR>1 {print $1}' | grep local | tail -1) if [ -z "${STORAGE}" ]; then - echo "No storage for images" - qm destroy ${VMID} --purge - exit 1 + echo "No storage for images" + qm destroy ${VMID} --purge + exit 1 fi # 启用 UEFI 引导 @@ -164,37 +177,37 @@ if [ "${STATUS:-0}" -ne 0 ] || [ -z "${BLDISK}" ]; then fi [ -n "${IMG}" ] || rm -f "${IMG_PATH}" case "${BLTYPE}" in - usb) - ARGS+="-device nec-usb-xhci,id=usb-bus0,multifunction=on -drive file=$(pvesm path ${BLDISK}),media=disk,format=raw,if=none,id=usb1 -device usb-storage,bus=usb-bus0.0,port=1,drive=usb1,bootindex=999,removable=on " - ;; - nvme) - ARGS+="-drive file=$(pvesm path ${BLDISK}),media=disk,format=raw,if=none,id=nvme1 -device nvme,drive=nvme1,serial=nvme001 " - ;; - sata) - qm set ${VMID} --sata0 "${BLDISK}" - ;; - *) - echo "Setting bootloader disk failed" - qm destroy ${VMID} --purge - exit 1 - ;; +usb) + ARGS+="-device nec-usb-xhci,id=usb-bus0,multifunction=on -drive file=$(pvesm path ${BLDISK}),media=disk,format=raw,if=none,id=usb1 -device usb-storage,bus=usb-bus0.0,port=1,drive=usb1,bootindex=999,removable=on " + ;; +nvme) + ARGS+="-drive file=$(pvesm path ${BLDISK}),media=disk,format=raw,if=none,id=nvme1 -device nvme,drive=nvme1,serial=nvme001 " + ;; +sata) + qm set ${VMID} --sata$((SATAIDX++)) "${BLDISK}" + ;; +*) + echo "Setting bootloader disk failed" + qm destroy ${VMID} --purge + exit 1 + ;; esac X86_VENDOR=$(awk -F: '/vendor_id/ {gsub(/^[ \t]+/, "", $2); print $2; exit}' /proc/cpuinfo) case "${X86_VENDOR,,}" in - *intel*) - ARGS+="-cpu host,+kvm_pv_eoi,+kvm_pv_unhalt,+vmx,hv_vendor_id=${X86_VENDOR} " - ;; - *amd*) - ARGS+="-cpu host,+kvm_pv_eoi,+kvm_pv_unhalt,+svm,hv_vendor_id=${X86_VENDOR} " - ;; - *) - echo "x86_vendor: Unknown" - ;; +*intel*) + ARGS+="-cpu host,+kvm_pv_eoi,+kvm_pv_unhalt,+vmx,hv_vendor_id=${X86_VENDOR} " + ;; +*amd*) + ARGS+="-cpu host,+kvm_pv_eoi,+kvm_pv_unhalt,+svm,hv_vendor_id=${X86_VENDOR} " + ;; +*) + echo "x86_vendor: Unknown" + ;; esac -if [ -d "${NINEPPATH}" ]; then - ARGS+="-fsdev local,security_model=passthrough,id=fsdev0,path=${NINEPPATH} -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare " +if [ -d "${V9PPATH}" ]; then + ARGS+="-fsdev local,security_model=passthrough,id=fsdev0,path=${V9PPATH} -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare " fi qm set ${VMID} --args "${ARGS}" @@ -204,8 +217,13 @@ if [ $? -ne 0 ]; then exit 1 fi +if [ -n "${VFSDIRID}" ]; then + # pvesh create /cluster/mapping/dir --id "${VFSDIRID}" -map node=node1,path=/path/to/share1 --map node=node2,path=/path/to/share2 + qm set ${VMID} --virtiofs0 dirid=${VFSDIRID},cache=always,direct-io=1 +fi + # 添加 32G 数据盘 -qm set ${VMID} --sata1 ${STORAGE}:32 +qm set ${VMID} --sata$((SATAIDX++)) ${STORAGE}:32 BRIDGE=$(awk -F: '/^iface vmbr/ {print $1}' /etc/network/interfaces | awk '{print $2}' | head -1) if [ -z "${BRIDGE}" ]; then