免费观看已满十八岁电视剧两人_国产+高潮+白丝+中岀+白_国产大片b站免费观看推荐_大尺度床震捏胸呻吟视频_亚洲AV永久无码天堂网国产_日本天堂免费网站_小雪yin荡公交嗯啊校花_向日葵视频色_好硬好大好爽18禁免费看男男

【六六互聯(lián)】長期出售【美國抗投訴服務(wù)器】【歐洲抗投訴服務(wù)器】【亞洲抗投訴服務(wù)器】

目前裸機(jī)(物理機(jī))、虛擬機(jī)、容器是云計(jì)算提供計(jì)算服務(wù)的主流形式

目前裸機(jī)(物理機(jī))、虛擬機(jī)、容器是云計(jì)算提供計(jì)算服務(wù)的主流形式

目前裸機(jī)(物理機(jī))、虛擬機(jī)、容器是云計(jì)算提供計(jì)算服務(wù)的三種主流形式。那么如何判斷一個虛擬shell環(huán)境到底是物理機(jī)、虛擬機(jī)還是容器呢?

更進(jìn)一步,如果是物理機(jī),這個物理機(jī)廠商是什么,虛擬機(jī)到底是KVM還是XEN,容器是Docker還是rkt、lxc等?

更進(jìn)一步,如果是虛擬機(jī),是否可以判斷這個虛擬機(jī)是運(yùn)行在AWS還是阿里或者OpenStack,是否能夠獲取虛擬機(jī)的UUID、instance-type、vpc-id、安全組等信息?

這有點(diǎn)像我們在開發(fā)中經(jīng)常使用的反射(reflection)機(jī)制,通過反射可以知道一個類實(shí)例(instance)的類(class)是什么,更進(jìn)一步可以知道這個類的父類是什么、實(shí)現(xiàn)了哪些方法、包含哪些屬性等。

以下是我用到的一些方法,僅供參考。

01 判斷容器

目前還沒有什么方法能夠100%準(zhǔn)確判斷虛擬環(huán)境是否是容器,至少我沒有找到相關(guān)文獻(xiàn)。

如果環(huán)境有`systemd-detect-virt`命令,則可以直接通過`systemd-detect-virt -c`命令判斷,如果輸出為`none`則不是容器,否則會輸出容器類型,比如lxc。目前很少容器里面放`systemd`的,我見過的就只有LXD的`ubuntu`鏡像,因此這種方法適用性不廣。

除此之外,可通過其他tricks判斷,最簡便的方法判斷PID為1的進(jìn)程,如果該進(jìn)程就是應(yīng)用進(jìn)程則判斷是容器,而如果是init進(jìn)程或者systemd進(jìn)程,則不一定是容器,當(dāng)然不能排除是容器的情況,比如LXD/lXC實(shí)例的進(jìn)程就為`/sbin/init`。

容器和虛擬機(jī)不一樣的是,容器和宿主機(jī)是共享內(nèi)核的,因此理論上容器內(nèi)部是沒有內(nèi)核文件的,除非掛載了宿主機(jī)的`/boot`目錄:

另外,我們知道容器是通過cgroup實(shí)現(xiàn)資源限制,每個容器都會放到一個cgroup組中,如果是Docker,則cgroup的名稱為docker-xxxx,其中xxxx為Docker容器的UUID。

而控制容器的資源,本質(zhì)就是控制運(yùn)行在容器內(nèi)部的進(jìn)程資源,因此我們可以通過查看容器內(nèi)部進(jìn)程為1的cgroup名稱獲取線索。

如下是我通過Docker跑busybox的cgroup信息:

我們不僅可以知道這是Docker容器,還獲取了Docker容器的UUID為9ba...11。

根據(jù)如上的結(jié)論,判斷一個虛擬環(huán)境是否Docker的腳本為:

當(dāng)然如果僅僅判斷是否Docker容器,還能通過判斷是否存在.dockerenv文件區(qū)分是否Docker容器:

rkt容器類似,輸出結(jié)果如下:

如上的\x2d為-號:

因此判斷一個虛擬環(huán)境是否rkt的腳本為:

好奇AWS lambda的運(yùn)行環(huán)境是什么,于是寫了個函數(shù)輸出/proc/1/cgroup,結(jié)果為:

猜測是一種叫sandbox的運(yùn)行環(huán)境,估計(jì)也是一種容器。

判斷虛擬環(huán)境是否為容器環(huán)境相對比較復(fù)雜,目前沒有完美的方案,總結(jié)過程如下:

判斷是否可運(yùn)行systemd-detect-virt -c命令,如果輸出為none則不是容器,否則可確定容器類型。

判斷PID 1如果為應(yīng)用本身,則該虛擬環(huán)境是容器,否則不能確定是否是容器。

判斷是否存在加載的內(nèi)核文件,如果不存在,則可判斷為容器,否則不能確定是否為容器。

判斷是否存在/.dockerenv文件,如果存在則為Docker容器,否則不能確定是否為容器。

目前裸機(jī)(物理機(jī))、虛擬機(jī)、容器是云計(jì)算提供計(jì)算服務(wù)的主流形式

讀取/proc/1/cgroup文件,判斷是否包含docker、rkt等關(guān)鍵字,如果包含,則說明為容器,否則不能確定是否為容器。

另外,需要特別注意的是,容器必須最先判斷,因?yàn)槿萜鞅旧聿]有任何的硬件虛擬化,容器看到的硬件特性信息和宿主機(jī)看到的完全一樣,因此下面介紹的通過`lscpu`以及DMI信息判斷是否是虛擬機(jī)或者物理機(jī),對容器并不適用。換句話說,不能因?yàn)閌lscpu`的`Hypervisor vendor`值為`KVM`就說明一定是KVM虛擬機(jī),因?yàn)樗灿锌赡苁侨萜?。下文均假設(shè)已經(jīng)排除為容器的情況。