运维

教你探测虚拟环境是物理机、虚拟机还是容器

2020-01-08  本文已影响0人  H_appiness

目前裸机(物理机)、虚拟机、容器是云计算提供计算服务的三种主流形式。那么如何判断一个虚拟shell环境到底是物理机、虚拟机还是容器呢?

更进一步,如果是物理机,这个物理机厂商是什么,虚拟机到底是KVM还是XEN,容器是Docker还是rkt、lxc等?

更进一步,如果是虚拟机,是否可以判断这个虚拟机是运行在AWS还是阿里或者OpenStack,是否能够获取虚拟机的UUID、instance-type、vpc-id、安全组等信息?

判断物理机

如果使用了systemd,则可以直接通过systemd-detect-virt命令判断是否物理机:

微信截图_20200108174104.png
如果输出为none,则说明是物理机。
获取物理机的信息最直接的方式是查看DMI信息/sys/firmware/dmi/tables/DMI,使用dmidecode命令解码:
[root@KVM ~]# dmidecode -t system
# dmidecode 3.1
Getting SMBIOS data from sysfs.
SMBIOS 2.7 present.

Handle 0x0001, DMI type 1, 27 bytes
System Information
    Manufacturer: LENOVO
    Product Name: ThinkServer RD640   
    Version: FFFFFFF             
    Serial Number: NC01711670          
    UUID: 4752ed66-9e24-11e4-9ff5-70e2840da7ca
    Wake-up Type: Power Switch
    SKU Number:                       
    Family:                       

Handle 0x002C, DMI type 12, 5 bytes
System Configuration Options
    Option 1:                       

Handle 0x0059, DMI type 32, 20 bytes
System Boot Information
    Status: No errors detected

如上可以看出这台是物理机,厂商为LENOVO,型号为ThinkServer RD640,序列号为NC01711670
当然如果是虚拟机,如上命令会执行失败。另外也可以通过其他命令查看物理信息,如lshw命令。

判断虚拟机

其实前面已经提到了,如果使用了systemd,则可以直接通过systemd-detect-virt命令判断是否虚拟机:

如果是虚拟机,则会输出虚拟机类型,如kvm、oracle(virtualbox)、xen等。
参考物理机的获取方式,我们可以通过dmidecode命令获取更多的虚拟机信息。比如我在一台KVM虚拟机运行如下命令:

[root@k8s-master ~]# dmidecode -t system
# dmidecode 3.1
Getting SMBIOS data from sysfs.
SMBIOS 2.4 present.

Handle 0x0100, DMI type 1, 27 bytes
System Information
    Manufacturer: Red Hat
    Product Name: KVM
    Version: RHEL 7.0.0 PC (i440FX + PIIX, 1996)
    Serial Number: Not Specified
    UUID: c0e534f5-93ce-4141-9f6f-f8e20501e2f0
    Wake-up Type: Power Switch
    SKU Number: Not Specified
    Family: Red Hat Enterprise Linux

Handle 0x2000, DMI type 32, 11 bytes
System Boot Information
    Status: No errors detected

如上Product Name为KVM,说明运行在KVM平台,而UUID即虚拟机的UUID。
XEN上的一台虚拟机输出为:

[root@compute1 ~]# dmidecode -t system
# dmidecode 3.1
Getting SMBIOS data from sysfs.
SMBIOS 2.4 present.

Handle 0x0100, DMI type 1, 27 bytes
System Information
    Manufacturer: Xen
    Product Name: HVM domU
    Version: 4.7.1-1.9
    Serial Number: a7b7e316-fed2-d1a2-bb41-ba45e3d859a4
    UUID: a7b7e316-fed2-d1a2-bb41-ba45e3d859a4
    Wake-up Type: Power Switch
    SKU Number: Not Specified
    Family: Not Specified

Handle 0x2000, DMI type 32, 11 bytes
System Boot Information
    Status: No errors detected

如上Manufacturer为XEN,说明运行在XEN平台,而UUID即虚拟机的UUID。
腾讯云的虚拟机如下:

[root@VM_16_10_centos ~]# dmidecode -t system
# dmidecode 2.12
SMBIOS 2.4 present.

Handle 0x0100, DMI type 1, 27 bytes
System Information
    Manufacturer: Bochs
    Product Name: Bochs
    Version: Not Specified
    Serial Number: e4d64b5f-f700-447f-963b-aff1ffd1e1e4
    UUID: E4D64B5F-F700-447F-963B-AFF1FFD1E1E4
    Wake-up Type: Power Switch
    SKU Number: Not Specified
    Family: Not Specified

Handle 0x2000, DMI type 32, 11 bytes
System Boot Information
    Status: No errors detected

华为云的虚拟机如下:

[root@wly2c8g-0001 ~]# dmidecode -t system
# dmidecode 3.2
Getting SMBIOS data from sysfs.
SMBIOS 2.8 present.

Handle 0x0100, DMI type 1, 27 bytes
System Information
    Manufacturer: OpenStack Foundation
    Product Name: OpenStack Nova
    Version: 13.2.1-20191122150812
    Serial Number: 76b9d24f-b505-4425-b372-87d5198bed18
    UUID: f60c612e-17e3-48fa-b75f-9e6a1bc01b15
    Wake-up Type: Power Switch
    SKU Number: Not Specified
    Family: Virtual Machine

Handle 0x2000, DMI type 32, 11 bytes
System Boot Information
    Status: No errors detected

如上Manufacturer为OpenStack Foundation,说明运行在OpenStack平台,而UUID即虚拟机的UUID。

可见虽然可以从system信息中获取云厂商的线索,但其实虚拟机的system信息并没有统一的标准,有的在version中体现,有的在Product Name中表现,完全取决于云厂商自己的配置。

判断容器

目前还没有什么方法能够100%准确判断虚拟环境是否是容器
如果环境有systemd-detect-virt命令,则可以直接通过systemd-detect-virt -c命令判断,如果输出为none则不是容器,否则会输出容器类型,比如lxc。目前很少容器里面放systemd的,我见过的就只有LXD的ubuntu镜像,因此这种方法适用性不广。

关于linux开机默认设置(图形化/命令行)

1.查看目前默认的启动默认

systemctl get-default

2.设置为图形界面模式

systemctl set-default graphical.target

3.设置为命令行模式

systemctl set-default multi-user.target

查看CPU是否支持虚拟化

grep -E '(svm|vmx)' /proc/cpuinfo

svm - Secure virtual machine, AMD的虚拟化技术AMD-V
vmx - Intel的虚拟化技术Intel-VT

上一篇 下一篇

猜你喜欢

热点阅读