机器学习入门:SVD奇异值分解原理、实战与避坑指南
2026/10/30 5:41:06
#!/bin/bash #QEMU存储池发现与采集脚本(Proxmox VE 适配版) #IT_BEGIN #IT_TYPE=3 #IT SYSTEM_qemu_discpool|discovery.qemupool[disc] #普通指标 #IT_RULE SYSTEM_qemu_IP|ip[{#poolName}] #IT_RULE SYSTEM_qemu_poolstate|poolstate[{#poolName}] #IT_RULE SYSTEM_qemu_poolName|poolName[{#poolName}] #IT_RULE SYSTEM_qemu_poolid|poolid[{#poolName}] #IT_RULE SYSTEM_qemu_poolpersistable|poolpersistable[{#poolName}] #IT_RULE SYSTEM_qemu_poolcap|poolcap[{#poolName}] #IT_RULE SYSTEM_qemu_poolused|poolused[{#poolName}] #IT_RULE SYSTEM_qemu_poolavail|poolavail[{#poolName}] #IT_END shname=`basename $0` ATTR="_X(g=$shname,p=cmdb,t=script,f=0)" ######################################## # 工具函数:把 PVE 的大小统一换算为字节 (支持 K/M/G/T/P) ######################################## parse_size_bytes() { echo "$1" | awk '{ v=$1 if (v=="") { print "0"; exit } u=tolower(substr(v,length(v),1)) if (u ~ /[0-9]/) { printf "%.0f\n", v; exit } n=substr(v,1,length(v)-1)+0 if (u=="k") n*=1024; else if (u=="m") n*=1024^2; else if (u=="g") n*=1024^3; else if (u=="t") n*=1024^4; else if (u=="p") n*=1024^5; printf "%.0f\n", n }' } # 获取宿主机全局 IP if command -v ip >/dev/null 2>&1; then ip=$(ip -o -4 addr show scope global 2>/dev/null | awk '{print $4}' | cut -d '/' -f 1 | paste -sd ',' -) elif command -v ifconfig >/dev/null 2>&1; then ip=$(ifconfig -a 2>/dev/null | awk '/inet / && !/127\.0\.0\.1/{gsub(/addr:/,"",$2); print $2}' | paste -sd ',' -) fi ######################################## # 发现模式 ######################################## if [ "$1" = "disc" ];then # 使用 pvesm status 提取池名称,跳过第一行表头 pvesm status 2>/dev/null | awk 'NR>1 {print $1}' | while read poolName do [ -z "$poolName" ] && continue echo "{#poolName}="$poolName done exit 0 fi ######################################## # 采集模式 ######################################## echo COL_DETAIL_START: # 确定要处理的池列表 if [ -n "$1" ]; then poolList="$1" else poolList=$(pvesm status 2>/dev/null | awk 'NR>1 {print $1}') fi for poolName in $poolList; do # pvesm status 输出格式示例: # Name Type Status Total Used Available % # local dir active 30318504 4104160 24646184 13.54% # vmdata dir active 2562494464 544865792 2017628672 21.26% # 获取该池的完整信息行 poolInfo=$(pvesm status 2>/dev/null | awk -v p="$poolName" '$1 == p {print}') [ -z "$poolInfo" ] && continue # 状态 poolstate=$(echo "$poolInfo" | awk '{print $3}') if [ "$poolstate" = "active" ]; then poolstate="running" fi # 容量 (第4列,单位通常是 KB) capKB=$(echo "$poolInfo" | awk '{print $4}') usedKB=$(echo "$poolInfo" | awk '{print $5}') availKB=$(echo "$poolInfo" | awk '{print $6}') # 转换为字节 poolcap=$(( capKB * 1024 )) poolused=$(( usedKB * 1024 )) poolavail=$(( availKB * 1024 )) # UUID / ID (PVE 没有 pool 的 UUID,使用池名作为唯一标识) poolid="$poolName" # 持久化 poolpersistable="yes" echo "ip[$ATTR,$poolName]|+|$ip" echo "poolstate[$ATTR,$poolName]|+|$poolstate" echo "poolName[$ATTR,$poolName]|+|$poolName" echo "poolid[$ATTR,$poolName]|+|$poolid" echo "poolpersistable[$ATTR,$poolName]|+|$poolpersistable" echo "poolcap[$ATTR,$poolName]|+|$poolcap" echo "poolused[$ATTR,$poolName]|+|$poolused" echo "poolavail[$ATTR,$poolName]|+|$poolavail" done echo COL_DETAIL_END:运行结果如下:
root@pve:~# sh COLT_CMDB_QEMU_POOLDISC.sh disc {#poolName}=local {#poolName}=vmdata root@pve:~# sh COLT_CMDB_QEMU_POOLDISC.sh COL_DETAIL_START: ip[_X(g=COLT_CMDB_QEMU_POOLDISC.sh,p=cmdb,t=script,f=0),local]|+|172.16.20.121 poolstate[_X(g=COLT_CMDB_QEMU_POOLDISC.sh,p=cmdb,t=script,f=0),local]|+|running poolName[_X(g=COLT_CMDB_QEMU_POOLDISC.sh,p=cmdb,t=script,f=0),local]|+|local poolid[_X(g=COLT_CMDB_QEMU_POOLDISC.sh,p=cmdb,t=script,f=0),local]|+|local poolpersistable[_X(g=COLT_CMDB_QEMU_POOLDISC.sh,p=cmdb,t=script,f=0),local]|+|yes poolcap[_X(g=COLT_CMDB_QEMU_POOLDISC.sh,p=cmdb,t=script,f=0),local]|+|935002329088 poolused[_X(g=COLT_CMDB_QEMU_POOLDISC.sh,p=cmdb,t=script,f=0),local]|+|318333440000 poolavail[_X(g=COLT_CMDB_QEMU_POOLDISC.sh,p=cmdb,t=script,f=0),local]|+|577600962560 ip[_X(g=COLT_CMDB_QEMU_POOLDISC.sh,p=cmdb,t=script,f=0),vmdata]|+|172.16.20.121 poolstate[_X(g=COLT_CMDB_QEMU_POOLDISC.sh,p=cmdb,t=script,f=0),vmdata]|+|running poolName[_X(g=COLT_CMDB_QEMU_POOLDISC.sh,p=cmdb,t=script,f=0),vmdata]|+|vmdata poolid[_X(g=COLT_CMDB_QEMU_POOLDISC.sh,p=cmdb,t=script,f=0),vmdata]|+|vmdata poolpersistable[_X(g=COLT_CMDB_QEMU_POOLDISC.sh,p=cmdb,t=script,f=0),vmdata]|+|yes poolcap[_X(g=COLT_CMDB_QEMU_POOLDISC.sh,p=cmdb,t=script,f=0),vmdata]|+|7937302708224 poolused[_X(g=COLT_CMDB_QEMU_POOLDISC.sh,p=cmdb,t=script,f=0),vmdata]|+|5713157947392 poolavail[_X(g=COLT_CMDB_QEMU_POOLDISC.sh,p=cmdb,t=script,f=0),vmdata]|+|1824049876992 COL_DETAIL_END: