Linux虛擬化與容器化


隨着雲計算的不斷發展,計算資源不斷集中於大規模的服務器集群上。為了充分發揮硬件潛力,提高服務器性能,虛擬化技術由此誕生。

所謂虛擬化技術,是指將計算元件和硬件隔離開來,隱藏底層的硬件物理特性,為用戶提供抽象、統一的模擬計算環境,從而可以適應龐大的硬件資源而不至於浪費性能。如Intel-VT和AMD-V技術可以單CPU模擬多CPU運行,允許同一平台同時運行多個操作系統,且應用程序和服務在相互獨立的空間內運行而不影響,從而盡可能的壓榨硬件性能並提高工作效率。
虛擬化級別可分為:硬件抽象層、指令集層、操作系統層、基礎運行庫層、應用程序層。

指令集層:使用類似代碼解釋的方法實現不同平台計算資源的通用,但是效率極低,如Bochs,可以實現Unix like系統中模擬X86平台(指令集、I/O、內存、BIOS等等),例如在Android上運行Windows。
硬件抽象層:將底層硬件虛擬化,如VMware ESXi,Windows Hyper-V,Xen,Linux KVM等,可以使同一硬件平台上運行多個不同的操作系統;又可分為全虛擬化和半虛擬化(下文詳解)。目前I/O和內存的虛擬化較為成熟,CPU方面由於指令集在設計時未考慮到特權指令(hypervisor)和非特權指令(用戶)區分的原因(主要是X86)會造成性能下降,因此開發出了Intel-VT等CPU虛擬化技術(硬件輔助虛擬化),但是性能仍然會受到影響。
操作系統層:在操作系統層面為多個用戶或應用創建不同的容器或實例,分別擁有自己的進程、文件系統、IP、用戶、命名空間等,但是仍然共享一個操作系統。例如Docker一類的容器和各種VPS、VE。相對硬件虛擬化,操作系統層級的虛擬化解決了:物理機器和虛擬機實例數可以動態改變;初始化虛擬機幾乎不消耗時間;幾乎沒有硬件性能損失,不需要額外資源開銷等問題。但是只能使用Linux系統,在資源隔離級別和資源管理上較為簡單。非常適合雲計算環境。
運行庫層:由於大部分應用調用的是用戶級別的API而不是系統級別,因此可以通過API鈎子控制應用程序和其他系統部分之間的連接;例如使用WINE在Unix like系統上運行Win32程序。
應用程序層:將應用程序虛擬化為一個虛擬機,如早期的JVM(現在的JVM加入了即時編譯功能)。

現在國內的雲計算服務主要采用的是KVM(騰訊雲)和Xen(阿里雲,正在向KVM遷移),主要是由於VMware和Windows Hyper-V是收費的並且不開源。於此同時,以Docker為代表的操作系統級別的虛擬化也火熱了起來。

容器與Docker
顧名思義,容器就是裝東西用的,比如我們都學過C++ STL的基本容器類型,在操作系統級別,容器就是操作系統為不同的用戶或進程分配的具有一定相互獨立空間(包括內存分頁空間、CPU時鍾分配、硬盤空間、進程空間、運行庫等、IP地址)。Docker就是容器的一種,在早期版本使用的是Linux自帶的LXC(Linux Container),現在使用的是libcontainer來實現。

使用Docker的時候,不同的容器可以部署不同的開發環境,運行不同的應用;由於開發環境和操作系統分離,Docker的可移植性非常高(Docker的宣傳口號是 Build ,Ship ,and Run Any App ,Anywhere),在不同的服務器之間轉移非常便捷。同時,官方和開發者也共同構建出了一個巨大的模板鏡像庫(被牆了,需要使用加速器訪問),足夠滿足很多naive的需求。

進行虛擬化時,很重要的一部分工作就是計算資源的分配和不同虛擬機/容器之間的通訊,在創建Docker鏡像時,不僅可以顯示地為每個鏡像分配資源,同時還會根據分配的比例不同確定各自的權重,從而可以在系統負荷高的時候保證權重高的鏡像不會被權重低的鏡像阻塞,在負荷低的時候,權重低的鏡像也能得到足夠的資源應對突發的壓力。彈性的分配機制保證了硬件的最大利用效率。

管理虛擬機
1、虛擬機的管理命令
virt-viewer 虛擬機名稱 ##顯示虛擬機
virsh start 虛擬機名稱 ##開啟指定虛擬機
virsh list ##顯示正在運行的虛擬機
virsh list --all ##顯示所有虛擬機
virsh shutdown 虛擬機名稱 ##正常關閉指定虛擬機
virsh destroy 虛擬機名稱 ##強制關閉指定虛擬機
virsh define 虛擬機 ##恢復虛擬機
virsh undefine 虛擬機 ##刪除虛擬機的配置(硬件信息文件)
virsh create 虛擬機.xml ##利用虛擬機硬件信息文件打開虛擬機,只是一次性的

2、虛擬機拷貝
虛擬機是由兩部分組成:硬件信息文件和硬盤文件

/etc/libvirt/qemu/虛擬機.xml ##虛擬機硬件信息文件
/var/lib/libvirt/images/虛擬機.qcow2 ##虛擬機硬盤文件

實例:將虛擬機westos從一台虛擬機拷貝到另一台虛擬機,其中/mnt充當U盤

[root@foundation16 ~]# cd /etc/libvirt/qemu/
[root@foundation16 qemu]# ls
desktop.xml networks server.xml westos.xml ##此處存在westos.xml文件,虛擬機westos的前端文件
[root@foundation16 qemu]# cp westos.xml /mnt/ ##將westos.xml硬件信息文件拷貝到/mnt/
[root@foundation16 qemu]# cd /var/lib/libvirt/images/
[root@foundation16 images]# ls
generic-1.qcow2 rh124-desktop-vdb.qcow2 rh124-server-vdb.qcow2
generic.qcow2 rh124-desktop.xml rh124-server.xml
rh124-desktop-vda.ovl rh124-server-vda.ovl westos.qcow2 ##找到虛擬機硬盤westos.qcow2
rh124-desktop-vda.qcow2 rh124-server-vda.qcow2
rh124-desktop-vdb.ovl rh124-server-vdb.ovl
[root@foundation16 images]# mv westos.qcow2 /mnt/ ##將硬盤westos.qcow2 拷貝到/mnt/中
[root@foundation16 images]# cd /mnt/ ## 模擬虛擬機拷貝
[root@foundation16 mnt]# ls
westos.qcow2 westos.xml ##此時/mnt/文件中存在已拷貝的westos.xml和westos.qcow2
[root@foundation16 mnt]# virsh create westos.xml ##執行此命令前,先刪除虛擬機,方便模擬虛擬機拷貝
error: Failed to create domain from westos.xml
error: Cannot access storage file '/var/lib/libvirt/images/westos.qcow2' (as uid:107, gid:107): No such file or directory

[root@foundation16 mnt]# mv /mnt/westos.qcow2 /var/lib/libvirt/images/
#不存在 '/var/lib/libvirt/images/westos.qcow2',將文件添加到路徑中
[root@foundation16 mnt]# virsh create westos.xml ##將虛擬機刪除,重新創建
Domain westos created from westos.xml

[root@foundation16 mnt]# virsh define westos.xml ##永久創建
Domain westos defined from westos.xml


3、虛擬機快照
虛擬機的快照只是一個存儲更改信息的文件,在虛擬機被讀取時還是讀取母盤中的內容。
在虛擬機管理工具中,把"快照.qcow.2"import導入到新的虛擬機中即可使用。

1> 虛擬機快照命令
qemu-img create -f qcow2 -b 母盤.qcow2 快照.qcow2
1
實例:快照虛擬機建立步驟

 

 

https://blog.csdn.net/helloworlddm/article/details/76785388       虛擬化技術的歷史


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM