項目實戰13—企業級虛擬化Virtualization - KVM技術

  項目實戰系列,總架構圖 http://www.cnblogs.com/along21/p/8000812.htmlhtml

KVM的介紹、準備工做和qemu-kvm 命令詳解

一、介紹

(1)介紹node

  KVM:就是Keyboard Video Mouse的縮寫。KVM 交換機經過直接鏈接鍵盤、視頻和鼠標 (KVM) 端口,讓您可以訪問和控制計算機。KVM 技術無需目標服務器修改軟件。這就意味着能夠在 Windows 的 BIOS 環境下,隨時訪問目標計算機。KVM 提供真正的主板級別訪問,並支持多平臺服務器和串行設備。 linux

  KVM 技術已經從最初的基礎SOHO辦公型,發展成爲企業 IT 基礎機房設施管理系統。能夠從kvm 客戶端管理軟件輕鬆的直接訪問位於多個遠程位置的服務器和設備。KVM over IP 解決方案具有完善的多地點故障轉移功能、符合新服務器管理標準 (IPMI) 的直接界面,以及將本地存儲媒體映射至遠程位置的功能。web

  KVM 是個"怪胎",本來是類型2 的主機虛擬化;但一旦在OS 上加載了kvm.ko 模塊,就會"感染"OS,使其變爲hypervisor(kvm),本來的軟件空間做爲控制檯,轉化成類型1 模式的主機虛擬化編程

 

(2)KVM的組件ubuntu

① kvm.ko:模塊vim

  API 應用程序編程接口windows

qemu-kvm:用戶空間的工具程序;後端

  qemu-KVM是一種開源虛擬器,它爲KVM管理程序提供硬件仿真。centos

   運行中的一個kvm虛擬機就是一個qemu-kvm進程,運行qemu-kvm程序並傳遞給它合適的選項及參數即能完成虛擬機啓動,終止此進程即能關閉虛擬機;

③ libvirt 虛擬化庫:Libvirt是一個C工具包,能夠與最近版本的Linux(以及其餘操做系統)的虛擬化功能進行交互。主包包含了導出虛擬化支持的libvirtd服務器。

  C/S:

    Client:

      libvirt-client

      virt-manager

  Daemon:

    libvirt-daemon

 

(3)KVM模塊load進內存以後,系統的運行模式:

  內核模式:GuestOS執行IO類的操做時,或其它的特殊指令操做時的模式;它也被稱爲"Guest-Kernel"模式;

  用戶模式:Host OS的用戶空間,用於代爲GuestOS發出IO請求;

  來賓模式:GuestOS的用戶模式;全部的非IO類請求

 

二、使用KVM 的準備

(1)前提:

① 必須跑在x86 系統的架構上

② 必須支持硬件級虛擬化

  vmx:Intel VT-x

  svm:AMD AMD-v

③ 在虛擬機上再虛擬化,需開啓虛擬化 Intel VT-x/EPT

 

(2)判斷CPU是否支持硬件虛擬化:

[root@master ~]# grep -i -E '(vmx|svm|lm)' /proc/cpuinfo

注意:vmx 或 svm 必須出現一個,表示是支持的

  vmx:Intel VT-x

  svm:AMD AMD-v

 

(3)安裝前準備

① 裝載KVM 模塊

[root@master ~]# yum install libvirt-daemon-kvm qemu-kvm virt-manager -y

[root@master ~]# modprobe kvm 裝載kvm 模塊

 

② 檢測kvm 模塊是否裝載

[root@master ~]# lsmod |grep kvm

[root@master ~]# ll /dev/kvm 字符設備

 

③ 安裝用戶端工具 qemu-kvm

[root@master ~]# yum install libvirt-daemon-kvm qemu-kvm virt-manager -y

 

三、qemu-kvm命令語法

qemu-kvm [options] [disk_image]

選項有不少類別:標準選項、塊設備相關選項、顯示選項、網絡選項、...

1)標準選項:
  -machine [type=]name:-machine help來獲取列表,用於指定模擬的主機類型; 
  -cpu cpu:-cpu help來獲取列表;用於指定要模擬的CPU型號;
  -smp n[,maxcpus=cpus][,cores=cores][,threads=threads]多少線程[,sockets=sockets]多少核:指明虛擬機上vcpu的數量及拓撲;
  -boot [order=drives][,once=drives]只用一次(如按照系統時只用一次光盤引導)[,menu=on|off] [,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_time][,strict=on|off]
  order:各設備的引導次序:c表示第一塊硬盤,d表示第一個光驅設備;-boot order=dc,once=d
  -m megs:虛擬機的內存大小;
  -name NAME:當前虛擬機的名稱,要唯一;

(2)塊設備相關的選項:
  -hda/-hdb file:指明IDE總線類型的磁盤映像文件路徑;第0和第1個;
  -hdc/-hdd file:第2和第3個;
  -cdrom file:指定要使用光盤映像文件; 
  -drive [file=file路徑][,if=type接口][,media=d接口對應的設備類型][,index=i] [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]:
    ① file=/PATH/TO/SOME_IMAGE_FILE:映像文件路徑;
    ②
if=TYPE:塊設備總線類型,ide, scsi, sd, floppy, virtio,...     ③ media=TYPE:介質類型,cdrom和disk;     ④ index=i:設定同一類型設備多個設備的編號;     ⑤ cache=writethrough|writeback|none|directsync|unsafe:緩存方式;     ⑥ format=f:磁盤映像文件的格式;   CentOS磁盤鏡像文件下載: https://cloud.centos.org/centos/7/images/ 3)顯示選項:   -display type:顯示的類型,sdl, curses, none和vnc;   -nographic:不使用圖形接口; 顯卡型號   -vga [std|cirrus|vmware|qxl|xenfb|none]:模擬出的顯卡的型號;   -vnc display[,option[,option[,...]]]]:啓動一個vnc server來顯示虛擬機接口; 讓qemu進程監聽一個vnc接口;     display:       ① HOST:N         在HOST主機的第N個桌面號輸出vnc;       ② unix:/PATH/TO/SOCK_FILE       ③ none     options:       password:鏈接此服務所須要的密碼;
  -monitor stdio:在標準輸出上顯示monitor界面;     Ctrl-a, c:在console和monitor之間切換;     Ctrl-a, h (4)網絡選項:   -net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]     爲虛擬機建立一個網絡接口,並將其添加至指定的VLAN;     model=type:指明模擬出的網卡的型號,ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio;       net nic,model=?     macaddr=mac:指明mac地址;52:54:00:   -net tap[,vlan=n][,name=str][,fd=h][,fds=x:y:...:z][,ifname=name][,script=file][,downscript=dfile]:     經過物理的TAP網絡接口鏈接至vlan;     script=file:啓動虛擬機時要執行的腳本,默認爲/etc/qemu-ifup     downscript=dfile:關閉虛擬機時要執行的腳本,/etc/qemu-ifdown     ifname=NAME:自定義接口名稱; 其它選項:   -daemonize:以守護進程運行;

 

實戰一:圖形化工具virt-manager 建立虛擬機

一、建立物理橋橋接接口br0

[root@master ~]# systemctl start libvirtd.service

[root@master ~]# virsh iface-bridge eth0 br0

分析:把本身的物理網卡eth0 做爲交換機,把br0 當網卡,提供IP

注意:命令可能會卡死或出錯,終端被強制退出;等一會,在登陸就OK 了

 

二、圖形化工具建立虛擬機

(1)打開窗口

[root@master ~]# virt-manager

注意:這個命令需在支持圖形化界面的機器才能執行, 用其餘機器 ssh -X 鏈接,再執行

 

(2)建立虛擬機

① 建立新的虛擬機

② 選擇操做系統類型和版本

③ 選擇內存和CPU 設置

④ 虛擬硬盤有多大

⑤ 網絡選擇

⑥ 詳細配置,開始安裝

⑦ 進入虛擬化圖形管理窗口,選擇安裝系統版本

 

實戰二:命令行工具qemu-kvm建立使用虛擬機

一、準備橋

(1)命令管控虛擬網橋:brctl

[root@master ~]# yum -y install bridge-utils   下載brctl 命令的包

[root@master ~]# brctl addbr br-int0   添加網橋

[root@master ~]# brctl show   查詢全部網橋

[root@master ~]# ifconfig -a   每個橋,在機器上都表現爲一個網卡接口,只是沒有激活

[root@master ~]# ip link set br-int0 up   激活橋,會分配mac 地址

刪除網橋

[root@master ~]# ip link set br-int0 down   先down掉網橋

[root@master ~]# brctl delbr br-int0   再刪除

[root@master ~]# ifconfig -a   查詢不到這個網卡了

[root@master ~]# brctl show   查詢不到網橋

 

(2)手動建立物理網橋

① 建立網橋對應的配置文件

[root@master network-scripts]# pwd

/etc/sysconfig/network-scripts

[root@master network-scripts]# cp ifcfg-eth1 ifcfg-br0

[root@master network-scripts]# vim ifcfg-br0

DEVICE=br0
NAME=br0
TYPE=Bridge
ONBOOT=yes
IPADDR=172.16.1.7
NETMASK=255.255.0.0
GATEWAY=172.16.0.1
DNS1=172.16.0.1

注意:是要充當正常網卡使用的,全部IP、NETMASK、GATEWAY、DNS1 都要有

 

② 把主機的網卡鏈接到橋上

[root@master network-scripts]# vim ifcfg-eth1

DEVICE=eth1
ONBOOT=yes
BRIDGE=br0

注意:主機的網卡鏈接網橋後,是要充當交換機的,因此不須要IP、NETMASK、GATEWAY、DNS1

 

③ 重啓網絡服務

[root@master network-scripts]# systemctl restart network

[root@master ~]# ifconfig

[root@master ~]# brctl show 也能查到

 

二、建立虛擬機前準備

使用virt-manager管理KVM

(1)準備 qemu-kvm 命令

[root@master ~]# yum install qemu-kvm libvirt-daemon-kvm virt-manager   安裝qemu-kvm 命令行工具

[root@master ~]# modprobe kvm   加載模塊

[root@master ~]# lsmod |grep kvm

[root@master ~]# rpm -ql qemu-kvm 由於qemu-kvm 命令路徑不在PATH 路徑下

建立軟鏈接,或者寫入PATH 變量都行

[root@master ~]# ln -sv /usr/libexec/qemu-kvm /usr/bin/

[root@master ~]# qemu-kvm -h 查詢命令幫助

 

三、建立一個虛擬機

(1)建立一個虛擬機,用kubuntu 的鏡像文件(用windows、linux 什麼鏡像文件都行)

[root@master ~]# qemu-kvm -cpu host -smp 2,sockets=1,cores=2,threads=1 -m 512 -drive file=/data/imgs/test.img,if=virtio,media=disk,format=qcow2 -drive file=/root/kubuntu-17.10-desktop-amd64.iso,if=ide,media=cdrom -boot order=dc,once=d -vnc 172.16.1.7:0

分析:命令詳解見上邊

 

(2)vnc 登陸實驗虛擬機

[root@master ~]# vncviewer 172.16.1.7:0

 

實戰三:手動構建虛擬機間的虛擬通道、僅主機網橋和NAT 網橋

一、準備虛擬機鏡像文件

(1)下載cirros 鏡像文件

用cirros 來演示測試,由於它很小,不佔資源

去網站下載cirros

CentOS磁盤鏡像文件下載: https://cloud.centos.org/centos/7/images/

[root@master ~]# qemu-img info cirros-no_cloud-i386.img

 

(2)準備2分建立虛擬機的鏡像文件

[root@master ~]# mkdir -pv /data/imgs/

[root@master ~]# cp cirros-no_cloud-i386.img /data/imgs/c1.img

[root@master ~]# cp cirros-no_cloud-i386.img /data/imgs/c2.img

 

二、建立虛擬的準備

(1)準備物理網橋

[root@master imgs]# brctl addbr br-c1-and-c2 建立網橋接口

[root@master imgs]# ifconfig br-c1-and-c2 up 激活網橋

[root@master imgs]# brctl show

 

(2)準備激活鏈接網橋腳本

① [root@master ~]# vim /etc/qemu-ifup-pn1

#!/bin/bash
#
bridge=br-c1-and-c2
if [ -n "$1" ];then
        ip link set $1 up
        sleep 1
        brctl addif $bridge $1
        [ $? -eq 0 ] && exit 0 || exit 1
else
        echo "Error: no interface specified."
        exit 2
fi

② 加執行權限

[root@master ~]# chmod +x /etc/qemu-ifup-pn1

 

三、建立、登陸兩個虛擬機

(1)建立並開啓虛擬機

[root@master ~]# qemu-kvm -name c1 -cpu host -smp 2 -m 64 -drive file=/data/imgs/c1.img,if=virtio,media=disk,format=qcow2 -vnc :0 -net nic,model=e1000,macaddr=52:54:00:00:01:01 -net tap,script=/etc/qemu-ifup-pn1 -daemonize

[root@master ~]# qemu-kvm -name c2 -cpu host -smp 2 -m 64 -drive file=/data/imgs/c2.img,if=virtio,media=disk,format=qcow2 -vnc :1 -net nic,model=e1000,macaddr=52:54:00:00:00:01 -net tap,script=/etc/qemu-ifup-pn1 -daemonize

注意:-vnc :0/1 是窗口號;MAC 地址52:54:00 不能改,後邊隨意

[root@master ~]# ss -nutl 開啓了5900 和5901 的端口

 

(2)登陸鏈接2個虛擬機

開2個終端,vnc 鏈接虛擬機

[root@master ~]# vncviewer 192.168.30.107:0

[root@master ~]# vncviewer 192.168.30.107:1

登陸用戶:cirros

登陸密碼:cubswin:)

$ sudo su - 切換到管理用戶

# poweroff 關機

 

四、創建虛擬機間的虛擬通道

① 給2個虛擬機加 IP ,在同一網段

# ifconfig eth0 10.1.0.1/16 up

# ifconfig eth0 10.1.0.2/16 up

分析:一旦添加了IP,就是僅主機模式了

 

② 測試虛擬通道是否連通

# ping 10.1.0.2

# ping 10.1.0.1

 

五、經過僅主機網橋連通宿主機

(1)在宿主機上的br-c1-and-c2 網橋,添加虛擬機網段的地址

① 每建立一個虛擬主機,都會有另外一半在宿主機上

② [root@master ~]# ip addr add 10.1.0.10/16 dev br-c1-and-c2

[root@master ~]# ip a show br-c1-and-c2

 

(2)測試僅主機網橋

# ping 10.1.0.10 在虛擬機上ping

 

六、經過NAT 網橋實現NAT 模式

(1)在宿主機上開啓路由轉發功能

[root@master ~]# sysctl -w net.ipv4.ip_forward=1

 

(2)在2個虛擬機上添加路由

# route add default gw 10.1.0.10

# ping 172.16.1.7 發現ping 宿主機的另外一塊網卡能ping 通了,由於內核機制

# ping 172.16.0.1 可是外網仍是ping不一樣,緣由:宿主機上只有出包,沒有進包

[root@master ~]# tcpdump -i eth1 -nn icmp 只有出包,沒有進包

 

(3)作SNAT 策略

[root@master ~]# iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 172.16.1.7

[root@master ~]# iptables -vnL -t nat 查詢

 

(4)測試NAT 網橋

① 在宿主機上ping 外網

# ping 172.16.0.1

② 宿主機也有回包了

 

七、關閉虛擬機

① 在虛擬機上poweroff

# poweroff 關機

② 在宿主機上殺死進程

 

實戰四:命令行工具virt 建立虛擬機及命令管理虛擬機

一、建立前準備

(1)準備cirros 鏡像文件

[root@master imgs]# yum install libvirt-daemon-kvm virt-install -y

[root@master ~]# mkdir -pv /data/imgs/

[root@master ~]# cp cirros-no_cloud-i386.img /data/imgs/c1.img

 

(2)建立物理網橋br0

[root@master imgs]# brctl addbr br0 建立網橋接口

[root@master imgs]# ifconfig br0 up 激活網橋

[root@master imgs]# brctl show

 

(3)把br0 網橋鏈接到eth0 網卡上

[root@master ~]# systemctl start libvirtd.service

[root@master ~]# virsh iface-bridge eth0 br0

 

二、建立虛擬機

[root@master imgs]# virt-install -n c1 --vcpus 2 --memory 64 -w bridge=br0 --import --disk /data/imgs/c1.img --dry-run

[root@master imgs]# virt-install -n c1 --vcpus 2 --memory 64 -w bridge=br0 --import --disk /data/imgs/c1.img

分析:--dry-run 先幹跑,測試一下

 

三、virsh命令詳解,下有實例

1)virsh命令:
虛擬機的生成須要依賴於預約義的xml格式的配置文件;其生成工具備兩個:virt-manager, virt-install; 
virsh [OPTION]... COMMAND [ARG]..
子命令的分類:
    Domain Management (help keyword 'domain')   域管理(幫助關鍵字「域」)
    Domain Monitoring (help keyword 'monitor')   域監視(幫助關鍵字「監視器」)
    Host and Hypervisor (help keyword 'host')   主機和管理程序(幫助關鍵字「主機」)
    Interface (help keyword 'interface')   接口(幫助關鍵字「接口」)
    Networking (help keyword 'network')   網絡(幫助關鍵字「網絡」)
    Network Filter (help keyword 'filter')   網絡過濾器(幫助關鍵字「過濾器」)
    Snapshot (help keyword 'snapshot')   快照(幫助關鍵字「快照」)
    Storage Pool (help keyword 'pool')   存儲池(help關鍵字「池」)
    Storage Volume (help keyword 'volume')   存儲卷(幫助關鍵字「卷」)
                
(2)域管理 Domain Management (help keyword 'domain')
建立虛擬機:
  create:從xml格式的配置文件建立並啓動虛擬機;
  define:從xml格式的配置文件建立虛擬機;
中止:
  destroy:強行關機、拔電源;
  shutdown:關機;
start:啓動
reboot:重啓;
undefine:刪除虛擬機;
suspend/resume:暫停於內存中,或繼續運行暫停狀態的虛擬機;真正實現的效果:pause/unpause
save/restore:掛起/繼續;保存虛擬機的當前狀態至文件中,或從指定文件恢復虛擬機;
console:鏈接至指定domain的控制檯;
                    
(3)域的設備資源管理:
① cpu
  cpu-stats     查看cpu 信息
  vcpuinfo      查看vcpu 信息
  vcpucount     看有幾個cpu
  setvcpus   能夠調整cpu數(若是是調整的是動態的,在建立虛擬機時設置,靜態的不行)
  vcpupin    把vcpu 綁定到真正的cpu 上
② memcache                        
  setmaxmem   修改最大內存(建立虛擬機時設置的是否能夠修改)
  setmem   修改內存大小(沒超過上限時)
③ 設備                       
  attach-disk/detach-disk:磁盤設備的熱插拔;
  domblklist:查詢虛擬機的磁盤設備
  attach-interface/detach-interface:網絡接口設備的熱插拔;
  domiflist:查詢虛擬機的網卡設備

四、virsh命令演示

(1)簡單查詢

[root@master imgs]# virsh list 列出全部正在開啓running 的虛擬機

[root@master imgs]# virsh list --all 列出全部的虛擬機,包括關機的、沒運行的

[root@master imgs]# virsh 交互式執行命令

[root@master imgs]# virsh nodeinfo 查詢信息

[root@master imgs]# virsh uri 查詢uri 路徑

(2)鏈接虛擬機

[root@master imgs]# virsh console c1 鏈接至c1 虛擬機的控制檯

# ping 172.16.0.1 由於物理橋已經鏈接到了網卡,因此有地址,且能ping 通外網

(3)刪除虛擬機

[root@master ~]# virsh destroy c1 先關掉虛擬機

[root@master ~]# virsh undefine c1 在刪除虛擬機

[root@master ~]# ls /etc/libvirt/qemu/ .xml 文件被刪除

[root@master ~]# virsh list --all 查詢不到c1 虛擬機,刪除成功

 

(4)暫停和掛起虛擬機

[root@master ~]# virsh suspend c1 暫停虛擬機

[root@master ~]# virsh resume c1 恢復暫停

[root@master ~]# virsh save /app/c1.bin 掛起虛擬機

[root@master ~]# virsh restore /app/c1.bin 恢復掛起

 

(5)域設備資源管理查詢

[root@master ~]# virsh cpu-stats c1 查看cpu 信息

[root@master ~]# virsh vcpuinfo c1 查看vcpu 信息

[root@master ~]# virsh vcpucount c1 看有幾個cpu

 

五、利用已有的虛擬機配置文件,建立一個新的虛擬機

原理:利用已下好的虛擬機,用命令把建立虛擬機的過程生成一個.xml的文件,利用這個文件建立新的虛擬機

(1)生成.xml的文件

[root@master ~]# virsh dumpxml c1 > /app/c2.xml

[root@master ~]# vim /app/c2.xml   須要修改的,都在下面列出了

<domain type='kvm' id='5'>
  <name>c2</name>   #名字
  <uuid>7303d4d3-b8d2-4e22-aac8-feb881882a73</uuid>  #UUID隨便改,只要不相同
<source file='/data/imgs/c2.img'/>   #鏡像文件
<mac address='52:54:00:52:10:34'/>   #mac隨便改,只要不相同
      <source bridge='br0'/>   #橋接的網橋
      <target dev='vnet1'/>   #默認的後端設備

(2)建立新的虛擬機

[root@master ~]# virsh create /app/c2.xml --console

注:--console 直接鏈接虛擬機,或不加;再用下邊的命令鏈接虛擬機

[root@master ~]# virsh console c2

 

(3)檢查

[root@master ~]# virsh list 已有2個虛擬機了

 

(4)把.xml 文件放入/etc/libvirt/qemu

[root@master ~]# ls /etc/libvirt/qemu

[root@master ~]# cp /app/c2.xml /etc/libvirt/qemu/

用virsh 自動啓動等各類高級設置了

  

六、c1 虛擬機磁盤設備的熱插拔

(1)建立10G 大小稀疏格式的磁盤映像文件

[root@master ~]# qemu-img create -f qcow2 -o preallocation=metadata,size=10G /data/imgs/c1.2.img

[root@master ~]# qemu-img info /data/imgs/c1.2.img 查詢

 

(2)把磁盤設備加到c1 上

[root@master ~]# virsh domblklist c1 查看c1 已有的磁盤設備

[root@master ~]# virsh attach-disk c1 /data/imgs/c1.2.img vda

 

(3)鏈接至虛擬機,能夠對這個磁盤作分區、文件系統格式化、掛載等操做

[root@master ~]# virsh console c1

# fdisk /dev/vda

# fdisk -l /dev/vda1

 

(3)把磁盤設備拔掉

 

七、網卡的熱插拔

(1)在宿主機上添加一個新的物理橋

[root@master ~]# brctl addbr br-int0

[root@master ~]# ifconfig br-int0 up

(2)激活網橋,給ip

[root@master ~]# ip addr add 10.1.0.254/16 dev br-int0

[root@master ~]# ifconfig br-int0

 

(3)給c1 虛擬機插上這個網卡設備 ---> "熱插"

[root@master ~]# virsh attach-interface c1 bridge br-int0

 

(4)鏈接至虛擬機,激活網卡

[root@master ~]# virsh console c1

# ifconfig eth1 10.1.0.1/16 up

# ping 10.1.0.254 ping宿主機,測試是否生效

[root@master ~]# virsh domiflist c1 查詢虛擬機的網卡設備

 

(5)拆除網卡 ---> "熱拔"

# ifconfig eth1 down

[root@master ~]# virsh detach-interface c1 bridge --mac 52:54:00:5b:d8:04

 

實戰五:推薦幾個圖形化管理虛擬機的工具

(1)圖形管理工具:

  kimchi:基於H5研發的web GUI;virt-king; 網上搜索kimchi kvm 有安裝使用教程

  OpenStack:IaaS 很是重量級,很是吃資源;至少10臺以上的虛擬機才用它

  oVirt:比kimchi 功能強大的多,比OpenStack輕量;但配置也較麻煩

  proxmox VE

(2)kvm 官方的管理工具棧:https://www.linux-kvm.org/page/Management_Tools

相關文章
相關標籤/搜索