在計算機技術中,虛擬化(技術)或虛擬技術(英語:Virtualization)是一種資源管理技術,是將計算機的各類實體資源(CPU、內存、磁盤空間、網絡適配器等),予以抽象、轉換後呈現出來並可供分區、組合爲一個或多個電腦配置環境。
由此,打破實體結構間的不可切割的障礙,使用戶能夠比本來的配置更好的方式來應用這些電腦硬件資源。這些資源的新虛擬部分是不受現有資源的架設方式,地域或物理配置所限制。linux
通常所指的虛擬化資源包括計算能力和數據存儲。web
因爲目前信息技術領域的不少企業都曾在宣傳中將該企業的某種技術稱爲虛擬化技術,這些技術涵蓋的範圍能夠從Java虛擬機技術到系統管理軟件,這就使得準確的界定虛擬技術變得困難。所以各類相關學術論文在談到虛擬技術時經常提到的即是如前面所提到的那個不嚴格的定義。shell
同一臺物理機運行多個不一樣版本應用軟件
硬件依賴性較低和便於數據遷移
windows
1.下降運營成本
服務器虛擬化下降了IT基礎設施的運營成本,令系統管理員擺脫了繁重的物理服務器、OS、中間件及兼容性的管理工做,減小人工干預頻率,使管理更增強大、便捷。
2.提升應用兼容性
服務器虛擬化提供的封裝性和隔離性使大量應用獨立運行於各類環境中,管理人員不需頻繁根據底層環境調整應用,只需構建一個應用版本並將其發佈到虛擬化後的不一樣類型平臺上便可。
3.加速應用部署
採用服務器虛擬化技術只需輸入激活配置參數、拷貝虛擬機、啓動虛擬機、激活虛擬機便可完成部署,大大縮短了部署時間,免除人工干預,下降了部署成本。
4.提升服務可用性
用戶能夠方便地備份虛擬機,在進行虛擬機動態遷移後,能夠方便的恢復備份,或者在其餘物理機上運行備份,大大提升了服務的可用性。
5.提高資源利用率
經過服務器虛擬化的整合,提升了CPU、內存、存儲、網絡等設備的利用率,同時保證原有服務的可用性,使其安全性及性能不受影響。
6.動態調度資源
在服務器虛擬化技術中,數據中心從傳統的單一服務器變成了統一的資源池,用戶能夠即時地調整虛擬機資源,同時數據中心管理程序和數據中心管理員能夠靈活根據虛擬機內部資源使用狀況靈活分配調整給虛擬機的資源。
7.下降能源消耗
經過減小運行的物理服務器數量,減小CPU之外各單元的耗電量,達到節能減排的目的。
centos
KVM,基於內核的虛擬機(英語:Kernel-based Virtual Machine,縮寫爲 KVM),是一種用於Linux內核中的虛擬化基礎設施,能夠將Linux內核轉化爲一個hypervisor。KVM在2007年2月被導入Linux 2.6.20核心中,以可加載核心模塊的方式被移植到FreeBSD及illumos上。瀏覽器
KVM在具有Intel VT或AMD-V功能的x86平臺上運行。它也被移植到S/390,PowerPC與IA-64平臺上。在Linux內核3.9版中,加入ARM架構的支持。安全
KVM目前由Red Hat等廠商開發,對CentOS/Fedora/RHEL等Red Hat系發行版支持極佳。
bash
KVM是開源軟件,全稱是kernel-based virtual machine(基於內核的虛擬機)。服務器
是x86架構且硬件支持虛擬化技術(如 intel VT 或 AMD-V)的Linux全虛擬化解決方案。網絡
它包含一個爲處理器提供底層虛擬化 可加載的核心模塊kvm.ko(kvm-intel.ko或kvm-AMD.ko)。
KVM還須要一個通過修改的QEMU軟件(qemu-kvm),做爲虛擬機上層控制和界面。
KVM能在不改變linux或windows鏡像的狀況下同時運行多個虛擬機,(它的意思是多個虛擬機使用同一鏡像)併爲每個虛擬機配置個性化硬件環境(網卡、磁盤、圖形適配器……)同時KVM還可以使用ksm技術幫助宿主服務器節約內存。
在主流的Linux內核,如2.6.20以上的內核均已包含了KVM核心。
電腦運算中,紅帽公司的Virtual Machine Manager是一個虛擬機管理員,可讓用戶管理多個虛擬機。
基於內核的虛擬機libvirt與Virtual Machine Manager。
Virtual Machine Manager可讓用戶:
建立、編輯、引導或中止虛擬機。
查看並控制每一個虛擬機的控制檯。
查看每部虛擬機的性能以及使用率。
查看每部正在運行中的虛擬機以及主控端的即時性能及使用率信息。
不管是在本機或遠程,皆可以使用KVM、Xen、QEMU。
🍪 Xen
Xen是一個開放源代碼虛擬機監視器,由XenProject開發。它打算在單個計算機上運行多達128個有徹底功能的操做系統。
在舊(無虛擬硬件)的處理器上執行Xen,操做系統必須進行顯式地修改(「移植」)以在Xen上運行(可是提供對用戶應用的兼容性)。這使得Xen無需特殊硬件支持,就能達到高性能的虛擬化。
🍪 QEMU
QEMU是一套由Fabrice Bellard所編寫的模擬處理器的自由軟件。它與Bochs,PearPC近似,但其具備某些後二者所不具有的特性,如高速度及跨平臺的特性。經由KVM(早期爲kqemu加速器,如今kqemu已被KVM取代)這個開源的加速器,QEMU能模擬至接近真實電腦的速度。QEMU有兩種主要運做模式:
User mode模擬模式,亦便是用戶模式。
QEMU能引導那些爲不一樣中央處理器編譯的Linux程序。而Wine及Dosemu是其主要目標。
System mode模擬模式,亦便是系統模式。
QEMU能模擬整個電腦系統,包括中央處理器及其餘周邊設備。它使得爲系統源代碼進行測試及除錯工做變得容易。其亦能用來在一部主機上模擬數部不一樣虛擬電腦。
系統環境說明
[root@kvm01 ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [root@kvm01 ~]# uname -r 3.10.0-693.el7.x86_64 [root@kvm01 ~]# sestatus SELinux status: disabled [root@kvm01 ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1) [root@kvm01 ~]# hostname -I 10.0.0.11 # kvm主機內存不能低於4GB
安裝依賴包(可使用本地yum源)
[root@kvm01 ~]# yum install libvirt* virt-* qemu-kvm* -y # libvirt # 做用:虛擬機的管理軟件 # virt # virt-install virt-clone 做用:虛擬機的安裝和克隆 # qemu-kvm # qemu-img 做用:複製管理虛擬機的磁盤 管理虛擬機磁盤
啓動服務
[root@kvm01 ~]# systemctl start libvirtd.service [root@kvm01 ~]# systemctl status libvirtd.servic
安裝VNC軟件(windows版):
下載vnc軟件方法,tightvnc官網: http://www.tightvnc.com
VNC軟件,用於VNC(Virtual Network Computing),爲一種使用RFB協議的顯示屏畫面分享及遠程操做軟件。此軟件藉由網絡,可發送鍵盤與鼠標的動做及即時的顯示屏畫面。
VNC與操做系統無關,所以可跨平臺使用,例如可用Windows鏈接到某Linux的電腦,反之亦同。甚至在沒有安裝客戶端程序的電腦中,只要有支持JAVA的瀏覽器,也可以使用。
安裝VNC時,使用默認安裝便可,無需安裝server端。(只安裝客戶端)
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 \ --name centos7 --memory 1024 --vcpus 1 --disk /opt/centos2.raw,format=raw,size=10 \ --cdrom /opt/CentOS-7.4-x86_64-DVD-1708.iso --network network=default \ --graphics vnc,listen=0.0.0.0 --noautoconsole
注意:
須要先將鏡像文件拷貝到 /opt/目錄下。xshell下使用xftp 默認的rz sz不行
VMware須要在配置內開啓虛擬化
使用參數說明
參數 | 參數說明 |
---|---|
--virt-type HV_TYPE | 要使用的管理程序名稱 (kvm, qemu, xen, ...) |
--os-type | 系統類型 |
--os-variant DISTRO_VARIANT | 在客戶機上安裝的操做系統,例如:'fedora18'、'rhel6'、'winxp' 等。 |
-n NAME, --name NAME | 客戶機實例名稱 |
--memory MEMORY | 配置客戶機虛擬內存大小 |
--vcpus VCPUS | 配置客戶機虛擬 CPU(vcpu) 數量。 |
--disk DISK | 指定存儲的各類選項。 |
-cdrom CDROM | 光驅安裝介質 |
-w NETWORK, --network NETWORK | 配置客戶機網絡接口。 |
--graphics GRAPHICS | 配置客戶機顯示設置。 |
虛擬化平臺選項: | |
-v, --hvm | 這個客戶機應該是一個全虛擬化客戶機 |
-p, --paravirt | 這個客戶機應該是一個半虛擬化客戶機 |
--container | 這個客戶機應該是一個容器客戶機 |
--virt-type HV_TYPE | 要使用的管理程序名稱 (kvm, qemu, xen, ...) |
--arch ARCH | 模擬 CPU 架構 |
--machine MACHINE | 機器類型爲仿真類型 |
其它選項: | |
--noautoconsole | 不要自動嘗試鏈接到客戶端控制檯 |
--autostart | 主機啓動時自動啓動域。 |
--noreboot | 安裝完成後不啓動客戶機。 |
以上信息經過 " virt-install --help " 得到。 |
在啓動的同時使用vnc鏈接
virsh命令經常使用參數總結
參數 | 參數說明 |
---|---|
基礎操做 | |
list | 查看虛擬機列表,列出域 |
start | 啓動虛擬機,開始一個(之前定義的)非活躍的域 |
shutdown | 關閉虛擬機,關閉一個域 |
destroy(危險) | 強制關閉虛擬機,銷燬(中止)域 |
vncdisplay | 查詢虛擬機vnc端口號 |
reboot | 重啓(有些版本不支持) |
配置管理操做 | |
dumpxml | 導出主機配置信息 |
undefine | 刪除主機 |
define | 導入主機配置 |
domrename | 對虛擬機進行重命名 |
掛起與恢復 | |
suspend | 掛起虛擬機 |
resume | 恢復虛擬機 |
自啓動管理 | |
autostart | 虛擬機開機啓動 |
autostart --disable | 取消虛擬機開機啓動 |
以上參數經過 「virsh --help」 得到。 |
KVM虛擬機配置文件位置
[root@kvm ~]# ll /etc/libvirt/qemu/centos7.xml
修改KVM虛擬機配置的方法
[root@kvm ~]# virsh edit centos7
使用該命令修改能夠對文件進行語法校驗。(如crontable -e)
備份虛擬機配置(關機時備份):
[root@kvm ~]# virsh dumpxml centos7 > centos7.xml
# 查看 [root@kvm ~]# virsh list --all Id 名稱 狀態 ---------------------------------------------------- - centos7 關閉 # 刪除 [root@kvm ~]# virsh undefine centos7 域 centos7 已經被取消定義 [root@kvm ~]# virsh list --all Id 名稱 狀態 ----------------------------------------------------
# 導入 備份(dumpxml) [root@kvm ~]# virsh define centos7.xml 定義域 centos7(從 centos7-off.xml) # 查看 [root@kvm ~]# virsh list --all Id 名稱 狀態 ---------------------------------------------------- - centos7 關閉
# 重命名 [root@kvm ~]# virsh domrename centos7 web01 Domain successfully renamed # 查看 [root@kvm ~]# virsh list Id 名稱 狀態 ---------------------------------------------------- 9 web01 關閉
掛起虛擬機
[root@kvm01 ~]# virsh suspend centos7 域 centos7 被掛起 # 查看狀態 [root@kvm01 ~]# virsh list --all Id 名稱 狀態 ---------------------------------------------------- 9 centos7 暫停
恢復虛擬機
[root@kvm01 ~]# virsh resume centos7 域 centos7 被從新恢復
[root@kvm ~]# virsh vncdisplay centos7 :0 # :0 即 爲 5900 端口,以此類推 :1爲5901 。
# 設置 libvirtd 服務開機自啓動。 [root@kvm ~]# systemctl enabled libvirtd.service enabled
設置宿主機開機虛擬機在其餘
[root@kvm ~]# virsh autostart centos7 域 nfsnobody標記爲自動開始 # 實質爲建立軟鏈接 [root@kvm ~]# ll /etc/libvirt/qemu/autostart/centos7.xml lrwxrwxrwx 1 root root 27 1月 22 12:17 /etc/libvirt/qemu/autostart/centos7.xml -> /etc/libvirt/qemu/centos7.xml
取消開機自啓動
[root@kvm ~]# virsh autostart --disable centos7 域 centos7取消標記爲自動開始
配置console登陸
在centos7虛擬機內操做(該操做僅限centos7):
[root@kvm01 ~]# grubby --update-kernel=ALL --args="console=ttyS0,115200n8" [root@kvm01 ~]# reboot # 115200n8:能顯示虛擬機的啓動過程
重啓完成後,使用virsh console 鏈接虛擬機。
[root@kvm ~]# virsh console centos7 鏈接到域 centos7 換碼符爲 ^] CentOS Linux 7 (Core) Kernel 3.10.0-327.el7.x86_64 on an x86_64 centos7 login: root Password: Last login: Mon Jan 22 12:24:48 from 192.168.122.1 [root@centos7 ~]# w 12:26:11 up 0 min, 1 user, load average: 0.09, 0.03, 0.01 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root ttyS0 12:26 3.00s 0.02s 0.01s w
使用virsh console鏈接CentOS 6虛擬主機方法:
安裝一臺centos6的kvm虛擬機
virt-install --virt-type kvm --os-type=linux --os-variant rhel6 \ --name centos6 --memory 1124 --vcpus 1 \ --disk /data/centos6/centos6.raw,format=raw,size=10 \ --cdrom /data/CentOS-6.9-x86_64-bin-DVD1.iso \ --network network=default --graphics vnc,listen=0.0.0.0,port=5901 \ --noautoconsole
新安裝一臺虛擬機後,是沒法經過virsh console 命令連入虛擬機中的,這時咱們須要開啓虛擬機的console功能。
如下操做都在虛擬機中進行
一、添加ttyS0的許可,容許root登錄
[root@centos6 ~]# echo "ttyS0" >> /etc/securetty
二、編輯/etc/grub.conf中加入console=ttyS0
在該文件的第16行。kernel選項後添加
[root@centos6 ~]# sed -i '/\tkernel/s#.*#& console=ttyS0#g' /etc/grub.conf [root@centos6 ~]# sync # 同步配置到 /boot/grub/grub.conf [root@centos6 ~]# cat -n /etc/grub.conf 1 # grub.conf generated by anaconda 2 # 3 # Note that you do not have to rerun grub after making changes to this file 4 # NOTICE: You have a /boot partition. This means that 5 # all kernel and initrd paths are relative to /boot/, eg. 6 # root (hd0,0) 7 # kernel /vmlinuz-version ro root=/dev/vda3 8 # initrd /initrd-[generic-]version.img 9 #boot=/dev/vda 10 default=0 11 timeout=5 12 splashimage=(hd0,0)/grub/splash.xpm.gz 13 hiddenmenu 14 title CentOS 6 (2.6.32-696.el6.x86_64) 15 root (hd0,0) 16 kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=48532582-c271-4c0a-b55f-395fe16cd8aa rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet console=ttyS0 17 initrd /initramfs-2.6.32-696.el6.x86_64.img
三、編輯/etc/inittab
在最後一行加入內容 S0:12345:respawn:/sbin/agetty ttyS0 115200
[root@centos6 ~]# echo 'S0:12345:respawn:/sbin/agetty ttyS0 115200' >>/etc/inittab
四、以上操做都完成後,重啓虛擬機
[root@centos6 ~]# reboot
如下操做在kvm宿主機上執行
一、檢查虛擬機的狀態
[root@kvm ~]# virsh list --all Id 名稱 狀態 ---------------------------------------------------- 11 nfsnobody running 21 nfsnobody6 running
二、進行鏈接測試
[root@kvm ~]# virsh console nfsnobody6 鏈接到域 nfsnobody6 換碼符爲 ^] # 注:退出virsh console鏈接的方法,使用組合鍵Ctrl+]便可 CentOS release 6.9 (Final) Kernel 2.6.32-696.el6.x86_64 on an x86_64 nfsnobody6 login: root Password: Last login: Mon Jan 22 05:44:25 on ttyS0 [root@nfsnobody6 ~]# who root ttyS0 2018-01-22 05:50 # 登錄成功,查看登錄接口爲以前設置的ttyS0
KVM qcow二、raw、vmdk等鏡像格式說明: http://blog.csdn.net/zhengmx100/article/details/53887162
# 建立一塊qcow2的虛擬硬盤(僅測試使用,無實際意義) [root@kvm01 data]# qemu-img create -f qcow2 nfsnobody.qcow2 2G
查看當前虛擬機硬盤信息
[root@kvm01 ~]# qemu-img info /data/nfsnobody.raw image: /data/nfsnobody.raw file format: raw virtual size: 10G (10737418240 bytes) disk size: 1.1G
raw轉qcow2格式:
# 參數說明 [root@kvm01 data]# qemu-img --help |grep convert qemu-img convert [-f fmt] [-O output_fmt] filename output_filename
轉換原有磁盤格式
[root@kvm01 data]# qemu-img convert -f raw -O qcow2 nfsnobody.raw nfsnobody.qcow2
修改nfsnobody 虛擬機配置文件
[root@kvm01 data]# virsh edit nfsnobody 修改前: <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/data/nfsnobody.raw'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </disk> 修改後: <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/data/nfsnobody.qcow2'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </disk>
刪除原磁盤文件
[root@kvm01 data]# \rm nfsnobody.raw
啓動虛擬機
[root@kvm01 data]# virsh start nfsnobody [root@kvm01 data]# virsh list --all Id 名稱 狀態 ---------------------------------------------------- 22 nfsnobody running
連接克隆腳本
#!/bin/bash # kvm link clone scripts # user nfsnobody # blog: https://www.nfsnobody.com # 2018-02-06 ### # init if [ $# -ne 2 ] then echo "Usage: $0 OLD_VMNAME NEW_VMNAME" exit 2 fi LOG=/var/log/messages old_vm=$1 new_vm=$2 new_xml="/tmp/${new_vm}.xml" . /etc/init.d/functions # dump old xmlfile virsh dumpxml $old_vm >$new_xml old_disk=`awk -F "'" '/source file/{print $2}' $new_xml` tmp_dir=`dirname $old_disk` new_disk=${tmp_dir}/${new_vm}.qcow2 # make link disk qemu-img create -f qcow2 -b $old_disk $new_disk &>> $LOG # make over xml info sed -i '/uuid/d' $new_xml sed -i '/mac address/d' $new_xml sed -i '2s#'$old_vm'#'$new_vm'#' $new_xml sed -i "s#$old_disk#$new_disk#g" $new_xml sed -i '/source mode/d' $new_xml # import new xml file virsh define $new_xml &>> $LOG # start new vm virsh start $new_vm &>> $LOG if [ $? -eq 0 ] then action "vmhost $new_vm start" /bin/true else action "vmhost $new_vm start" /bin/false echo "log info : $LOG" fi # END \rm $new_xml
說明:
第一步:複製虛擬磁盤文件
第二步:修改xml配置文件
1)name
2)uuid
3)虛擬磁盤存儲路徑
4)mac地址
1) 備份old_vm的配置文件,並重定向生成一個新的虛擬機配置文件 2)取出old_vm的磁盤路徑 3)建立新的連接磁盤文件 4) 修改xml配置文件 5) 導入新虛擬機 6)啓動測試