建议增加虚拟机宿主检测(最近某些服务商超开严重)
[CODE lang="java" title="母机检测"]
import com.sun.jna.platform.win32.COM.WbemcliUtil;
import oshi.driver.windows.wmi.Win32ComputerSystem;
import oshi.hardware.NetworkIF;
import oshi.util.FileUtil;
import oshi.util.platform.windows.WmiQueryHandler;
public class VMUtils {
private static final String OSHI_VM_MAC_ADDR_PROPERTIES = "oshi.vmmacaddr.properties";
private static final Properties vmMacAddressProps = FileUtil
.readPropertiesFromFilename(OSHI_VM_MAC_ADDR_PROPERTIES);
private static final Map<String, String> vmVendor = new HashMap<>();
static {
vmVendor.put("bhyve bhyve", "bhyve");
vmVendor.put("KVMKVMKVM", "KVM");
vmVendor.put("TCGTCGTCGTCG", "QEMU");
vmVendor.put("Microsoft Hv", "Microsoft Hyper-V or Windows Virtual PC");
vmVendor.put("lrpepyh vr", "Parallels");
vmVendor.put("VMwareVMware", "VMware");
vmVendor.put("XenVMMXenVMM", "Xen HVM");
vmVendor.put("ACRNACRNACRN", "Project ACRN");
vmVendor.put("QNXQVMBSQG", "QNX Hypervisor");
}
private static final String[] vmModelArray = new String[] { "Linux KVM", "Linux lguest", "OpenVZ", "Qemu",
"Microsoft Virtual PC", "VMWare", "linux-vserver", "Xen", "FreeBSD Jail", "VirtualBox", "Parallels",
"Linux Containers", "LXC", "Bochs" };
public static String identifyVM() {
boolean hyperVisor = false;
//Wmi虚拟机查询只能在Windows上使用,Linux上不执行这个部分即可
WbemcliUtil.WmiQuery<Win32ComputerSystem.ComputerSystemProperty> computerSystemQuery = new WbemcliUtil.WmiQuery("Win32_ComputerSystem", ComputerSystemEntry.class);
WbemcliUtil.WmiResult result = WmiQueryHandler.createInstance().queryWMI(computerSystemQuery);
if(result.getValue(ComputerSystemEntry.HYPERVISORPRESENT,0).toString().equals("true")){
hyperVisor = true;
}
//Wmi查询结束
String vendor = Assets.hardwareInfo.getProcessor().getProcessorIdentifier().getVendor().trim();
if (vmVendor.containsKey(vendor)) {
return (hyperVisor?"HyperVisor & ":"")+vmVendor.get(vendor);
}
List<NetworkIF> nifs = Assets.hardwareInfo.getNetworkIFs();
for (NetworkIF nif : nifs) {
String mac = nif.getMacaddr().toUpperCase();
String oui = mac.length() > 7 ? mac.substring(0, 8) : mac;
if (vmMacAddressProps.containsKey(oui)) {
return (hyperVisor?"HyperVisor & ":"")+vmMacAddressProps.getProperty(oui);
}
}
String model = Assets.hardwareInfo.getComputerSystem().getModel();
for (String vm : vmModelArray) {
if (model.contains(vm)) {
return (hyperVisor?"HyperVisor & ":"")+vm;
}
}
String manufacturer = Assets.hardwareInfo.getComputerSystem().getManufacturer();
if ("Microsoft Corporation".equals(manufacturer) && "Virtual Machine".equals(model)) {
return (hyperVisor?"HyperVisor & ":"")+"Microsoft Hyper-V";
}
if(hyperVisor)return "HyperVisor & ?";
return "";
}
public static enum ComputerSystemEntry{
HYPERVISORPRESENT
}
}[/CODE]
建议也检测一下内存读写速度,发现有的服务商把虚拟内存当物理内存卖,相信这样能使得这样的不良现象有所减少。
鄙人不才,如有幸被采纳,不胜感激!