大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是在FDCB里使能串列NOR Flash的QPI/OPI模式。 我們知道 Flash 讀時序里有五大子序列 CMD + ADDR + MODE + DUMMY + READ,前面的文章中痞子衡講過《串列NOR Flash的Continuo ...
背景
近期接觸容器技術時,經常看到各類比較容器與虛擬機區別的文章中會提到:容器是共用宿主機的內核,而虛擬機則是擁有自己獨立的內核,所以不可能在Linux上用容器運行windows,但是用虛擬機則可以。
乍看下去,覺得Linux上無法運行windows是很自然的結論,然後突然升起一個疑問:Linux上無法運行windows容器,那Debian上可以運行Ubuntu容器嗎?Ubuntu上又能運行CentOS容器嗎?
從自己實際使用上看,Debian上確實有運行CentOS的docker容器,CentOS上確實也有運行Ubuntu的docker容器,那無法運行windows容器卻能運行不同發行版Linux的根本原因是什麼呢?
進一步探究:具體發行版Debian 10.0 Linux上能運行低版本如Debian 9.0的容器嗎?能運行Debian11.0的容器嗎?為什麼?
這些的問題的底層其實都指向共用內核的確切含義,這裡記錄一下思考過程,以下觀點均為個人分析推斷,不一定准確,有疑義的小伙伴歡迎指正、探討。
容器與虛擬機的對比
已經有很多文章對容器、虛擬機的區別進行了詳細的對比,這裡不再贅述,很多文章對比時都會引用類似如下圖片:
左圖中是在Host OS上運行Hypervisor(虛擬機監控器,virtual machine monitor),在Hypervisor提供的硬體模擬基礎上運行有有多個Guest OS,每個Guest OS均有自己的獨立內核,相當於為GuestOS提供了一個完全模擬的虛擬裸機,GuestOS其實無感知自身是運行在物理機上還是虛擬硬體上。
而右圖中container是作為一個普通進程運行於Host OS上,所有進程共用Host OS的內核,而container的運行、編排則由中間的docker engine實現。
內核究竟是什麼
Linux內核
Linux® 內核是 Linux 操作系統(OS)的主要組件,也是電腦硬體與其進程之間的核心介面。它負責兩者之間的通信,還要儘可能高效地管理資源。
之所以稱為內核,是因為它在操作系統中就像果實硬殼中的種子一樣,並且控制著硬體(無論是電話、筆記本電腦、伺服器,還是任何其他類型的電腦)的所有主要功能,主要包括記憶體管理、進程管理、設備驅動程式、系統調用和安全防護,單純的linux內核並不算我們傳統意義上說的一個完整操作系統。
系統調用 && glibc
那麼內核在整個系統中的具體作用到底是什麼呢?
內核對上層屏蔽了底層硬體操作的細節,對其提供了統一的系統調用對硬體進行統一的操作。
但是系統調用介面一般比較原始,涉及和操作系統相關的細節,不同操作系統之間的系統調用基本完全不同,哪怕同系列的Linux與UNIX都不相同。
基於以上原因,一般應用程式是通過標準的運行庫來使用系統調用,運行庫的優點是本身是語言級別的,設計比較友好,標準、形式統一,不會隨著操作系統或編譯器的變化而變化。
Linux上的運行庫即是glibc,其位於用戶程式與系統調用之間,如下圖:
Linux發行版與內核的關係
Linux發行版就是一些組織和廠商將Linux內核、各類軟體、庫及文檔組合起來,提供了完整各類常用工具、庫(如gcc、dpkg、yum、glibc等),打包在一起作為一個完整的發行版操作系統提供給用戶,其關係如下圖:
由於不同發行版使用的都是同一個Linux內核,所以在內核的層面並不存在相容性問題--具體來說對於運行在宿主機上的容器進程分三種情況:
- 相同內核版本的情況下,不存在相容性問題。
- 宿主機內核版本高於容器發行版內核版本時,由於高版本內核保證向後相容性(backward compatibility),一般也可以正常運行。
- 宿主機內核版本低於容器發行版內核,若容器中使用了低版本內核中不存在的系統調用,則無法正常運行。
初步總結
回到文章一開始提出的幾個問題:
Linux上為什麼無法運行windows容器?
因為Linux內核與windows內核完全不是一個東西,windows程式不可能使用Linux內核的系統調用與硬體交互。
Debian上可以運行Ubuntu容器嗎?Ubuntu容器又能運行CentOS容器嗎?
根據發行版使用的具體內核版本,其可以基於其宿主機內核運行成功則可以,由於linux內核提供向後相容(backward compatible),一般來說容器發行版內核<=宿主機內核版本的情況都是可以成功的,而>宿主機內核的情況下可能可以成功。
具體發行版Debian 10.0 Linux上能運行低版本如Debian 9.0的容器嗎?能運行Debian11.0的容器嗎?為什麼?
和上面其實是一個分析思路。
轉載請註明出處,原文地址:https://www.cnblogs.com/AcAc-t/p/linux_container_share_kernel_meaning.html
參考
https://zh.wikipedia.org/zh-cn/Hypervisor
https://cloudacademy.com/blog/docker-vs-virtual-machines-differences-you-should-know/
https://www.redhat.com/zh/topics/linux/what-is-the-linux-kernel
https://book.douban.com/subject/3652388/
https://www.cnblogs.com/blog-yejy/p/9373850.html
https://stackoverflow.com/questions/32756988/what-is-meant-by-shared-kernel-in-docker
https://stackoverflow.com/questions/32841982/how-can-docker-run-distros-with-different-kernels
https://en.wikipedia.org/wiki/Linux_distribution