教你探测虚拟环境是物理机、虚拟机还是容器
目前裸机(物理机)、虚拟机、容器是云计算提供计算服务的三种主流形式。那么如何判断一个虚拟shell环境到底是物理机、虚拟机还是容器呢?
更进一步,如果是物理机,这个物理机厂商是什么,虚拟机到底是KVM还是XEN,容器是Docker还是rkt、lxc等?
更进一步,如果是虚拟机,是否可以判断这个虚拟机是运行在AWS还是阿里或者OpenStack,是否能够获取虚拟机的UUID、instance-type、vpc-id、安全组等信息?
判断物理机
如果使用了systemd,则可以直接通过systemd-detect-virt
命令判断是否物理机:
如果输出为
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