Linux學習之路-KVM(2)安裝及使用20180306

KVM

    kvm: Kernel-based Virtual Machine

            Qumranet公司 --> RedHat

            (1) X86_64

            (2) HVM:

                Intel VT

                AMD AMD-v

                

        KVM的組件:

            兩類組件:

                (kvm.ko)/dev/kvm:工作爲hypervisor,在用戶空間可通過系統調用ioctl()與內核中的kvm模塊交互

                        從而完成虛擬機的創建、啓動、停止、刪除等各種管理功能;

                qemu-kvm進程:工作於用戶空間,用於實現IO設備模擬;用於實現一個虛擬機實例;

                

        KVM模塊load進內存之後,系統的運行模式:

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

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

            來賓模式:GuestOS的用戶模式;所有的非IO類請求;

            

        安裝使用KVM:

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

                grep -i -E '(vmx|svm|lm)' /proc/cpuinfo

                    vmx:Intel VT-x

                    svm:AMD AMD-v

[root@L~]#grep -i -E '(vmx|svm|lm)' /proc/cpuinfo    #lm—>long mode 只能支持64位的
[root@L~]#modinfo kvm


       KVM運行邏輯,虛擬機運行需要虛擬出CPU的核心數,即vcpu0、vcpu1、vcpuN,CPU和內存的虛擬是由kvm kernel module來管理,vcpu是當做一個線程進行管理的。

        IO設備用Qemu進行虛擬,並且進行管理。

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

                    

            kvm工具棧:

                qemu:

                    qemu-kvm(命令的管理界面、僅能用在本機上運行) 

                    Qemu-img (虛擬機硬盤管理)

                libvirt:

                    GUI:virt-manager, virt-viewer(virt-manager 能做虛擬機的全生命週期管理)

                    CLI: virsh, virt-install (virsh 只能管理,但不能安裝,virt-install負責安裝虛擬機的工具)

                            虛擬機能使用很多種格式的硬盤

                                Raw格式的(dd命令,kvm可以使用)

                                vmdk(VMware格式的)

                                vdi(virtualbox格式的)

                                Qcow、Qcow2(Qemu-kvm格式的,qemu copy on write 寫時複製技術)

                    

                    C/S:

                        libvirtd

                    

            安裝:

                (1) 裝載內核模塊

                    kvm:核心模塊

                    kvm-intel|kvm-amd

                    

    使用virt-manager管理KVM

        # yum install qemu-kvm libvirt-daemon-kvm  virt-manager

        # modprobe kvm

        

        # systemctl start libvirtd.service

        

        # virt-manager &

        

    安裝kvm相關包

[root@L~]#yum install qemu-kvm libvirt-daemon-kvm  virt-manager libvirt 
#centos6 沒有daemon包,裝libvirt
[root@Lapp]#lsmod | grep kvm
kvm_intel             166504  0 
kvm                  515469  1 kvm_intel
[root@Lapp]#ls /dev/ | grep kvm
kvm
    加載kvm模塊
[root@L~]#modprobe kvm
    啓動libvirtd
[root@L~]#systemctl start libvirtd.service
[root@L~]#service libvirtd start
Starting libvirtd daemon:                                  [  OK  ]
[root@L~]#ssh -X [email protected]
[root@Llibvirt]#ll
總用量 48
-rw-r--r--. 1 root root   518 1月   5 03:20 libvirt.conf    
-rw-r--r--. 1 root root 13204 1月   5 03:20 libvirtd.conf   #守護進程的文件
-rw-r--r--. 1 root root  1176 1月   5 03:20 lxc.conf
drwx------. 2 root root  4096 4月  27 16:25 nwfilter
drwx------. 3 root root  4096 4月  27 16:25 qemu
-rw-r--r--. 1 root root 15340 1月   5 03:20 qemu.conf
[root@L~]#virsh iface-bridge wlan0 br0       #一定要注意,附加失敗就遠程斷開了,最好設置個自動重啓服務
Created bridge br0 with attached device wlan0
[root@L~]#brctl delbr br0                    #刪除橋


    網絡虛擬化:

        二層的虛擬網絡設備:

            kernel net bridge/brctl

            openvswitch

            

        CentOS 7創建物理橋,使用內核自帶的橋接模塊實現:

            橋接口配置文件保留地址信息;

                TYPE=Bridge

                Device=BRIDGE_NAME

                

            物理網卡配置文件:

                刪除地址、掩碼和網關等相關的配置,添加

                BRIDGE=BRIDGE_NAME

                

            重啓網絡服務即可:

                

        使用qemu-kvm管理vms:

            

Qemu命令:

                處理器模擬器

                仿真各種IO設備

                將仿真設備連接至主機的物理設備

                提供用戶接口

            qemu-kvm命令語法:

                qemu-kvm [options] [disk_image]

                

                選項有很多類別:

                    標準選項、塊設備相關選項、顯示選項、網絡選項、...

                    

                    標準選項:定義虛擬機的基本屬性

                        -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:當前虛擬機的名稱,要惟一;

                        

                    塊設備相關的選項:磁盤鏡像文件

                        -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/imag es/

                            

                    顯示選項:提供顯示接口

                         -display type:顯示的類型,sdl, curses, none和vnc;

                        -nographic:不使用圖形接口; 

                        -vga [std|cirrus|vmware|qxl|xenfb|none]:模擬出的顯卡的型號;

                        -vnc display[,option[,option[,...]]]]:啓動一個vnc server來顯示虛擬機接口; 讓qemu進程監聽一個vnc接口; 

                            display:

                                (1) HOST:N

                                    在HOST主機的第N個桌面號輸出vnc;

                                        5900+N

                                (2) unix:/PATH/TO/SOCK_FILE

                                (3) none

                                

                            options:

                                password:連接此服務所需要的密碼;

                        

                        -monitor stdio:在標準輸出上顯示monitor界面;

                            Ctrl-a, c:在console和monitor之間切換;

                            Ctrl-a, h

                    網絡選項:

                            兩種網絡設備形式

                                    用戶空間模擬網絡(比較安全,普通用戶就可以運行)

                                    內核空間模擬網絡

                        -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 n;

                            script=file:                啓動虛擬機時要執行的腳本,默認爲/etc/qemu-ifup

                            downscript=dfile:    關閉虛擬機時要執行的腳本,/etc/qemu-ifdown

                            ifname=NAME:        自定義接口名稱;

                            

                            /etc/qemu-ifup
                            
                                #!/bin/bash
                                #
                                bridge=br0
                                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

 

                    其它選項:

                            -daemonize:以守護進程運行;

                            

#試驗:生成虛擬機並完成網絡轉發模型

[root@L~]#ln -sv /usr/libexec/qemu-kvm /usr/bin/       #想使用,需要添加變量
"/usr/bin/qemu-kvm" -> "/usr/libexec/qemu-kvm”
[root@L~]#vim /etc/qemu-ifup
[root@L~]#bash -n /etc/qemu-ifup 
[root@L~]#chmod u+x /etc/qemu-ifup 

[root@L~]#qemu-kvm -name Cos7 -m 512 -cpu qemu64 -smp 2 -drive file=/app/centos-src/CentOS-7-x86_64-GenericCloud-1802.qcow2,if=virtio,media=disk,format=qcow2 -net nic,macaddr=52:54:00:00:00:00,model=virtio -net tap,script=/etc/qemu-ifup -vnc :0

#上面的就是僅主機模式,如果想與互聯網通訊,就打開核心轉發功能,添加規則即可
[root@L~]echo 1 > /etc/sys/net/ipv4/ip_forward
#虛擬機內部添加默認網關
#route add default gw 192.168.122.1

#添加 IPtables 規則,構建NAT模型,也可以使用-j —to-source
[root@L~]iptables -t net -A PSOTROUTING -s 192.168.122.0/24 -j MASQUERADE
示例1:(硬盤直接啓動)
[root@L~]#qemu-kvm -name c2 -smp 2,maxcpus=4,sockets=2,cores=2 -m 128 -drive file=/images/kvm/cos-i386.qcow2,if=virtio -vnc  :1 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:11 -net tap,script=/etc/qemu-ifup
示例2:(通過光盤安裝)
[root@L~]#qemu-kvm -name winxp -smp 1,maxcpus=2,sockets=1,cores=2 -m 1024 -drive file=/data/vms/winxp.qcow2,media=disk,cache=writeback,format=qcow2 file=/tmp/winxp.iso,media=cdrom -boot order=dc,once=d -vnc :1 -net nic,model=rtl8139,macaddr=52:54:00:00:aa:11 -net tap,ifname=tap1,script=/etc/qemu-ifup -daemonize


                        

                半虛擬化:virtio

                    建議:Network IO, Disk IO使用virtio,性能會有顯著提升;

                    

                dnsmasq:

                    有兩個功能,1、dns forwarder轉發器 2、dns server 服務器

                    Dnsmasq是輕量級的,易於配置DNS轉發器和DHCP服務器。它旨在爲小型網絡提供DNS和(可選)DHCP。 它可以提供不在全球DNS中的本地機器的名稱。 DHCP服務器與DNS服務器集成,並允許具有DHCP分配地址的計算機出現在DNS中,並在每個主機或中央配置文件中配置名稱。 Dnsmasq支持無盤機器的靜態和動態DHCP租賃和BOOTP網絡引導。

                        

                    listen-address=192.168.1.132,127.0.0.1   #指定的是要綁定的橋的地址段

                    dhcp-range=192.168.1.50,192.168.1.150,48h   #dns地址池及租約期限

                    dhcp-option=3,192.168.0.1     #3是選項,指定網關地址

#試驗:完成dns設置,IP地址自動獲取

[root@L~]#yum install dnsmasq
[root@L~]#man dnsmasq
[root@L~]#dnsmasq —-listen-address=10.1.0.1,127.0.0.1 —dhcp-range=10.1.0.100,10.1.0.150,24h —-dhcp-option=3,10.1.0.1


#試驗:手動創建物理橋

[root@L~]#cd /etc/sysconfig/network-scripts/
[root@L~]#cp ifcfg-ens33 ifcfg-mybr0

[root@L~]#vim ifcfg-ens33     
#把ip地址及網關等信息刪除,添加一條
BRIDGE=mybr0

[root@L~]#vim ifcfg-mybr0   
NAME=mybr0
DEVICE=mybr0
TYPE=Bridge
#其餘的地址信息保留即可

[root@L~]#service network restart
#後續再啓動的虛擬機,把網絡關聯到物理橋上,即可完成物理橋連接


  作業:使用kvm搭建LNMP,Nginx連接兩個橋,一個物理橋與外部通訊,一個內網橋實現內網通訊,php-fpm及mariadb連接內網橋,最好寫成腳本,一鍵搞定(一個虛擬機加兩塊網卡只需要-net多幾次即可實現,腳本先搞定網絡實現及虛擬機啓動起來,在使用固定的ip地址,使用ansible往上一推)

                        

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')

                    Storage Volume (help keyword 'volume')

                    

                Domain Management (help keyword 'domain')

                    創建虛擬機:

                        create:從xml格式的配置文件創建並啓動虛擬機;(基於虛擬機鏡像文件創建虛擬機配置的CPU、內存、用什麼IO等)

                        define:從xml格式的配置文件創建虛擬機;(可以定義一個模板,用交互式的形式填寫,創建但不啓動虛擬機)

                    

                    停止:

                        destroy:強行關機;(相當於拔電源)

                        shutdown:關機;   (正常的關機)

[root@Lqemu]#pwd
/etc/libvirt/qemu
[root@Lqemu]#ls                 #xml文件在這個目錄下,就是能被直接識別爲虛擬機的
C1.xml  Centos7.xml  networks   #可以直接cp相關文件進行修改,就可以創建新的虛擬機
[root@Lqemu]#virsh create —-console c2.xml   #用create創建的,直接啓動,並且連接到控制檯
Starting dropbear sshd: OK
  ____               ____  ____
/ __/ __ ____ ____ / __ \/ __/
/ /__ / // __// __// /_/ /\ \ 
\___//_//_/  /_/   \____/___/ 
http://launchpad.net/cirros
login as 'mageedu' user. default password: 'mageedu.com'. use 'sudo' for root.
cirros login:


                    啓動:

                        start:啓動

                    

                        reboot:重啓;

                    

                        undefine:刪除虛擬機;

                    

                        Suspend(掛起)/resume(繼續):暫停於內存中,或繼續運行暫停狀態的虛擬機;

                                真正實現的效果:pause/unpause

                    

[root@L~]#virsh suspend C2
域 C2 被掛起
[root@L~]#virsh list
Id    名稱                         狀態
----------------------------------------------------
2     Centos7                        running
3     C1                             running
4     C2                             暫停
[root@L~]#virsh resume C2
域 C2 被重新恢復


                        save/restore:保存虛擬機的當前狀態至文件中,或從指定文件恢復虛擬機;    

                    

[root@L~]#virsh save C2 /app/C2.snap
Domain C2 saved to /app/C2.snap
[root@L~]#virsh list
Id    名稱                         狀態
----------------------------------------------------
2     Centos7                        running
3     C1                             running
[root@L~]#ll /app/C2.snap
-rw-------. 1 root root 40291928 4月  28 14:48 /app/C2.snap
[root@L~]#virsh restore /app/C2.snap --paused
從 /app/C2.snap 恢復域
[root@L~]#virsh list
Id    名稱                         狀態
----------------------------------------------------
2     Centos7                        running
3     C1                             running
5     C2                             暫停


                        console:連接至指定domain的控制檯;

                    

                    域的設備資源管理:

                        cpu-stats

                        vcpuinfo

                        vcpucount

                        setvcpus

                        vcpupin

                        

                        setmaxmem          #修改最大能修改的內存上線

                        setmem                 #修改內存大小,修改後會觸發重啓服務

                       

                    磁盤設備的熱插拔; 

                        attach-disk           #插入新的硬盤

                        detach-disk          #拔出硬盤

                        domblklist            #查看當前硬盤列表

                    試驗:磁盤創建及熱插拔

Quem-img create [-f fmt] [-o options] filename [size] 創建磁盤
        -f 指定磁盤的格式  -o 指定一些選項  文件路徑及大小
支持的格式有下列:
        Supported formats: raw cow qcow vdi vmdk cloop dmg bochs vpc vvfat qcow2 qed vhdx parallels nbd blkdebug null host_cdrom host_floppy host_device file gluster

[root@Lc1]#qemu-img create -f qcow2 -o ? ./second.img
Supported options:
size             Virtual disk size               #可以直接指定磁盤大小
Compat           compatibility level (0.10 or 1.1) #是否使用緊緻格式
backing_file     File name of a base image       #可以基於摸個鏡像做的二級鏡像,類似快照
backing_fmt      Image format of the base image  
encryption       Encrypt the image
cluster_size     qcow2 cluster size
preallocation    Preallocation mode (allowed values: off, metadata, falloc, full)
Preallocation 是指創建完磁盤後,立即創建出那些文件,off就是不創建,metadate就是磁盤的元數據直接以對象格式存到當前磁盤,falloc先預分配文件,full直接分配真實的存儲(性能好),一般使用metadata。

[root@Lc1]#qemu-img create -f qcow2 -o size=20G,preallocation=metadata ./second.img
Formatting './second.img', fmt=qcow2 size=21474836480 encryption=off cluster_size=65536 preallocation='metadata' 

[root@Lc1]#qemu-img info second.img 
image: second.img
file format: qcow2
virtual size: 20G (21474836480 bytes)
disk size: 3.3M
cluster_size: 65536

[root@Lc1]#virsh help attach-disk
attach-disk <domain>哪個虛擬機<source>哪個磁盤鏡像文件<target>添加爲哪個磁盤設備

[root@Lc1]#virsh attach-disk C1 /home/VMs/c1/second.img vdb
成功附加磁盤
[root@Lc1]#virsh domblklist C1
Target     Source
------------------------------------------------
hda        /home/VMs/c1/c1.img
vdb        /home/VMs/c1/second.img
後續直接分區格式化即可使用
拆除的時候一定要注意沒有掛載使用,否則容易導致數據損壞

[root@Lc1]#virsh detach-disk C1 vdb
成功分離磁盤


                網絡接口設備的熱插拔:

                        attach-interface       #插入新的網絡接口

                                type:bridge

                                source:BRIDGE_NAME

                        detach-interface      #拔出網絡接口,注意拆除的時候,一定要指明MAC,否則將拆除這個接口上的所有的網卡

                        domiflist                   #網絡接口列表

                           

                            注意 :無須事先創建網絡接口設備;

                        

[root@Lc1]#virsh attach-interface C1 bridge virbr0
成功附加接口
[root@Lc1]#brctl show
bridge name    bridge id        STP enabled    interfaces
pan0        8000.000000000000    no        
virbr0        8000.5254002ebf66    yes        virbr0-nic
                            vnet0
                            vnet1
                            vnet2
                            vnet3

                            [root@Lc1]#virsh detach-interface C1 bridge --mac 52:54:00:F4:C5:84
成功分離接口


                Domain Monitoring (help keyword 'monitor')

                    domiflist

                    domblklist

                    ...

          

          

        圖形管理工具:

            kimchi(泡菜):基於H5研發web GUI; virt-king; 

            OpenStack: IaaS

                OpenStack Dashboard 就是一個web GUI

                nova 是核心組件,Horizon接收到用戶的情況,轉發給nova,nova-compute通過調度羣調到某一臺物理機上

                cider-api 提供塊級別存儲的服務,sahara-all 數據處理,swift分佈式文件系統對象存儲

                OpenStack Database Service 就是DBaas數據庫存儲服務,glance-api存放鏡像文件的系統

                Neutron-server 是管理虛擬網絡的,ceilometer-collector 計量服務(各種計量方式及計算方式)

                ironic-api 可以管理虛擬機及物理服務器的服務,heat-api是OpenStack Orchestration的虛擬機編排服務

                keystone-api 認證服務

            oVirt:紅帽主推的服務,虛擬化管理工具,也是一個web GUI工具

            proxmox:不單單是個管理工具,就是一個Linux的發行版。

            

            管理工具棧:https://www.linux-kvm.org/page/Management_Tools

    cirros測試鏡像

https://download.cirros-cloud.net/     下載地址

qemu-img info cirros-0.3.0-i386-disk.img     查看cirros鏡像信息

mkdir -pv /data/VMs/cirros    創建一個存放鏡像的目錄

    

    說明: CirrOS(測試鏡像)是專門從事雲計算的Tiny OS,CirrOS是一個最小的Linux發行版,專爲在OpenStack Compute之類的雲上用作測試映像而設計。 您可以從CirrOS下載頁面以各種格式下載CirrOS映像。 如果您的部署使用QEMU或KVM,我們建議使用qcow2格式的圖像。

    圖形工具安裝

vir-manager    打開圖形工具

   

[root@L~]#mkdir /home/VMs/c1 -pv
mkdir: 已創建目錄 "/home/VMs"
mkdir: 已創建目錄 "/home/VMs/c1"

[root@Lc1]#qemu-img info c1.img 
image: c1.img
file format: qcow2
virtual size: 39M (41126400 bytes)
disk size: 11M
cluster_size: 65536
virsh # list
Id    名稱                         狀態
----------------------------------------------------
2     Centos7                        running
3     C1                             running
virsh # console C1
連接到域 C1
Escape character is ^]
login as 'mageedu' user. default password: 'mageedu.com'. use 'sudo' for root.
cirros login: mageedu
Password: 
Ctrl + 】就可以切換回來
然後如果在console C1  直接切回去,不需要再登錄
virsh # domstate C1            #查看虛擬機C1的狀態
 
virsh # domstats C1            #查看虛擬機C1使用的資源情況


磁盤設置

Writethrough 同寫,寫到內存的時候同時寫到磁盤上

Writeback 回寫,後續由緩存自動同步到磁盤上 ,建議使用的模式

Directsync 直接同步,屬於緩存沒有用

Unsafe  不安全模式,只要提交就認爲寫完成了 ,性能最好的




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章