虛擬化之KVM


創建NAT網絡虛擬機:

KVM管理工具:

libvirt
使用最多的KVM虛擬化管理工具和應用程序接口,即通過libvirt調用KVM創建虛擬機,libvirt是KVM通用的訪問API,其不但能管理KVM,還能管理VMware、Xen、Hyper-V、virtualBox等虛擬化方案。

virsh:
是一個常用的管理KVM虛擬化的命令行工具,常用於管理運行在單個宿主機上的虛擬機,virsh是一個使用C語言編寫調用libvirt API的虛擬化管理命令行工具。

virt-manager:
virt-manager是一個虛擬化管理圖形軟件,其底層也是調用libvirt API來完成對虛擬機的操作,包括虛擬機的創建、刪除、啟動、停止以及一些簡單的監控功能等。

openstack:
openstack是一個開源的虛擬化編排工具,常用於構建大規模的虛擬化環境,用於管理成千上萬虛擬機的創建、啟
動、刪除等整個生命周期。

virsh-install命令使用幫助:

# virt-install --help
usage: virt-install --name NAME --ram RAM STORAGE INSTALL [options]
使用指定安裝介質新建虛擬機。
optional arguments:
-h, --help show this help message and exit
--version show program's version number and exit
--connect URI 使用 libvirt URI 連接到 hypervisor

通用選項:
-n NAME, --name NAME 客戶端事件名稱
--memory MEMORY 配置虛擬機內存分配。例如:
--memory 1024 (in MiB)
--memory 512,maxmemory=1024
--vcpus VCPUS 為虛擬機配置的 vcpus 數。例如:
--vcpus 5
--vcpus 5,maxcpus=10,cpuset=1-4,6,8
--vcpus sockets=2,cores=4,threads=2,
--cpu CPU CPU 型號及功能。例如:
--cpu coreduo,+x2apic
--cpu host
--metadata METADATA 配置虛擬機元數據。例如:
--metadata name=foo,title="My pretty title",uuid=...
--metadata description="My nice long description"

安裝方法選項:
--cdrom CDROM 光驅安裝介質
-l LOCATION, --location LOCATION
安裝源(例如:nfs:host:/path、http://host/path
ftp://host/path)
--pxe 使用 PXE 協議從網絡引導
--import 在磁盤映像中構建虛擬機
--livecd 將光驅介質視為 Live CD
-x EXTRA_ARGS, --extra-args EXTRA_ARGS
附加到使用 --location 引導的內核的參數
--initrd-inject INITRD_INJECT
使用 --location 為 initrd 的 root
添加給定文件
--os-variant DISTRO_VARIANT
在其中安裝 OS 變體的虛擬機,比如
'fedora18'、'rhel6'、'winxp' 等等。
--boot BOOT 配置虛擬機引導設置。例如:
--boot hd,cdrom,menu=on
--boot init=/sbin/init (for containers)
--idmap IDMAP 為 LXC 容器啟用用戶名稱空間。例如:
--idmap uid_start=0,uid_target=1000,uid_count=10

設備選項:
--disk DISK 使用不同選項指定存儲。例如:
--disk size=10 (new 10GiB image in default location)
--disk /my/existing/disk,cache=none
--disk device=cdrom,bus=scsi
--disk=?
-w NETWORK, --network NETWORK
配置虛擬機網絡接口。例如:
--network bridge=mybr0
--network network=my_libvirt_virtual_net
--network network=mynet,model=virtio,mac=00:11...
--network none
--network help
--graphics GRAPHICS 配置虛擬機顯示設置。例如:
--graphics vnc
--graphics spice,port=5901,tlsport=5902
--graphics none
--graphics vnc,password=foobar,port=5910,keymap=ja
--controller CONTROLLER
配置虛擬機控制程序設備。例如:
--controller type=usb,model=ich9-ehci1
--input INPUT 配置虛擬機輸入設備。例如:
--input tablet
--input keyboard,bus=usb
--serial SERIAL 配置虛擬機串口設備
--parallel PARALLEL 配置虛擬機並口設備
--channel CHANNEL 配置虛擬機溝通頻道
--console CONSOLE 配置虛擬機與主機之間的文本控制台連接
--hostdev HOSTDEV 將物理 USB/PCI/etc
主機設備配置為與虛擬機共享
--filesystem FILESYSTEM
將主機目錄傳遞給虛擬機。例如:
--filesystem /my/source/dir,/dir/in/guest
--filesystem template_name,/,type=template
--sound [SOUND] 配置虛擬機聲音設備模擬
--watchdog WATCHDOG 配置虛擬機 watchdog 設備
--video VIDEO 配置虛擬機視頻硬件。
--smartcard SMARTCARD
配置虛擬機智能卡設備。例如:
--smartcard mode=passthrough
--redirdev REDIRDEV 配置虛擬機重定向設備。例如:
--redirdev usb,type=tcp,server=192.168.1.1:4000
--memballoon MEMBALLOON
配置虛擬機 memballoon 設備。例如:
--memballoon model=virtio
--tpm TPM 配置虛擬機 TPM 設備。例如:
--tpm /dev/tpm
--rng RNG 配置虛擬機 RNG 設備。例如:
--rng /dev/random
--panic PANIC 配置虛擬機 panic 設備。例如:
--panic default

虛擬機配置選項:
--security SECURITY 設定域安全驅動器配置。
--numatune NUMATUNE 為域進程調整 NUMA 策略。
--memtune MEMTUNE 為域進程調整內存策略。
--blkiotune BLKIOTUNE
為域進程調整 blkio 策略。
--memorybacking MEMORYBACKING
為域進程設置內存后備策略。例如:
--memorybacking hugepages=on
--features FEATURES 設置域 <features> XML。例如:
--features acpi=off
--features apic=on,eoi=on
--clock CLOCK 設置域 <clock> XML。例如:
--clock offset=localtime,rtc_tickpolicy=catchup
--pm PM 配置 VM 電源管理功能
--events EVENTS 配置 VM 生命周期管理策略
--resource RESOURCE 配置 VM 資源分區(cgroups)

虛擬化平台選項:
-v, --hvm 客戶端應該是一個全虛擬客戶端
-p, --paravirt 這個客戶端一個是一個半虛擬客戶端
--container 這台虛擬機需要一個容器客戶端
--virt-type HV_TYPE 要使用的管理程序名稱(kvm、qemu、xen
等等)
--arch ARCH 模擬的 CPU 構架
--machine MACHINE 要模擬的機器類型

其它選項:
--autostart 引導主機時自動啟動域。
--wait WAIT 等待安裝完成的分鍾數。
--noautoconsole 不要自動嘗試連接到客戶端控制台
--noreboot 完成安裝后不要引導虛擬機。
--print-xml [XMLONLY]
輸出所生成域 XML,而不是創建虛擬機。
--dry-run 完成安裝步驟,但不要創建設備或者定義
虛擬機。
--check CHECK 啟用或禁用驗證檢查。例如:
--check path_in_use=off
--check all=off
-q, --quiet 禁止無錯誤輸出
-d, --debug 輸入故障排除信息
使用 '--option=?' 或者 '--option help' 查看可用子選項
有關示例及完整選項語法,請查看 man page

虛擬機管理命令virsh:

[root@s1 ~]# virsh list #列出當前開機的
[root@s1 ~]# virsh list --inactive #列出關閉的虛擬機
[root@s1 ~]# virsh list --all #列出所有
[root@s1 ~]# virsh shutdown CentOS-7-x86_64 #正常關機
[root@s1 ~]# virsh start CentOS-7-x86_64 #正常開機
[root@s1 ~]# virsh destroy centos7 #強制停止/關機
[root@s1 ~]# virsh undefine Win_2008_r2-x86_64 #強制刪除
[root@s1 ~]# virsh autostart centos7 #設置當前虛擬機開機自啟動

檢查是否支持虛擬化

[root@s1 ~]# grep -E "vmx|svm" /proc/cpuinfo | wc -l
2

Ubuntu 18.04:

https://ubuntu.com/server/docs/virtualization-libvirt

[root@s1 ~]# apt install qemu-kvm virt-manager libvirt-daemon-system
# kvm-ok #驗證是否支持kvm

安裝kvm 軟件(CentOS7.x)

[root@s1 ~]# yum install qemu-kvm qemu-kvm-tools libvirt libvirt-client virt-manager virt-install -y

改virbr0 IP地址(默認是:192.168.122.1)

[root@s1 ~]# grep 192.168.122.1 /etc/ -R
[root@s1 ~]# vim /etc/libvirt/qemu/networks/default.xml

啟動libvirt服務

[root@s1 ~]# systemctl enable --now libvirtd

創建用於存放ISO鏡像的目錄

[root@s1 ~]# mkdir /data/ISOs -p
[root@s1 ~]# ll /data/ISOs/CentOS-7-x86_64-Minimal-2009.iso

創建磁盤

[root@s1 ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/centos7.qcow2 10G

創建虛擬機(默認網絡模式)

[root@s1 ~]# virt-install \
--virt-type kvm \
--name centos7-vm1 \
--ram 1024 --vcpus 2 \ --cdrom=/data/ISOs/CentOS-7-x86_64-Minimal-2009.iso  \
--disk path=/var/lib/libvirt/images/centos7.qcow2 \
--network network=default \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole \
--autostart 

啟動kvm管理器

[root@s1 ~]# virt-manager

使用命令列出所有虛擬機

[root@s1 ~]# virsh list --all

案例:創建Bridge網橋模式虛擬機

[root@s1 ~]# cd /etc/sysconfig/network-scripts/
[root@s1 ~]# cp ifcfg-eth0 ifcfg-br0

[root@s1 ~]# vim ifcfg-eth0
TYPE="Ethernet"
BOOTPROTO="static"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
BRIDGE=br0

#IPADDR=172.31.0.27
#NETMASK=255.255.0.0
#GATEWAY=172.31.0.254
#DNS1=114.114.114.114
#DNS2=223.6.6.6

[root@s1 ~]# vim ifcfg-br0
TYPE="Bridge"
BOOTPROTO="static"
DEFROUTE="yes"
NAME="br0"
DEVICE="br0"
ONBOOT="yes"

IPADDR=172.18.8.127
NETMASK=255.255.0.0
GATEWAY=172.18.1.1
DNS1=172.18.1.1
DNS2=223.6.6.6

# 重啟網絡
[root@s1 ~]# systemctl restart network

# 查看br網橋
[root@s1 ~]# brctl show

# 創建磁盤
[root@s1 ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/centos7-Bridge.qcow2 10G

# 創建虛擬機
[root@s1 ~]# virt-install \
--virt-type kvm \
--name centos7-vm2-Bridge \
--ram 1024 --vcpus 2 \ --cdrom=/data/ISOs/CentOS-7-x86_64-Minimal-2009.iso \
--disk path=/var/lib/libvirt/images/centos7-Bridge.qcow2 \ --network bridge=br0 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole

案例:制作模板啟動文件

通過copy虛擬機磁盤文件,可以快速創建虛擬機

[root@s1 ~]# cd /var/lib/libvirt/images/

[root@s1 ~]# cp centos7-Bridge.qcow2 centos7-Bridge2.qcow2

[root@s1 ~]# virt-install \
--virt-type kvm \
--name centos7-vm2-Bridge2 \
--ram 1024 --vcpus 2 \
--cdrom=/data/ISOs/CentOS-7-x86_64-Minimal-2009.iso \
--disk path=/var/lib/libvirt/images/centos7-Bridge2.qcow2 \ --network bridge=br0 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole

注意:啟動kvm虛擬機不需要進入系統,直接關機,然后設置boot下的IDE Disk啟動即可,copy完記得要改IP地址

案例:使用KVM創建虛擬機並配置好網橋

通過網橋安裝haproxy訪問后端web服務器

# 先准備好兩個網橋br0和br1,一個br0連接外網,一個不能連接外網br1
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost ~]# cp ifcfg-eth0 ifcfg-br0

[root@localhost ~]# vim ifcfg-eth0
TYPE="Ethernet"
BOOTPROTO="static"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
BRIDGE=br0

[root@localhost ~]# vim ifcfg-br0
TYPE="Bridge"
BOOTPROTO="static"
DEFROUTE="yes"
NAME="br0"
DEVICE="br0"
ONBOOT="yes"
IPADDR=172.31.0.27
NETMASK=255.255.0.0
GATEWAY=172.31.0.254
DNS1=223.6.6.6

[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost ~]# cp ifcfg-eth1 ifcfg-br1

[root@localhost ~]# vim ifcfg-eth1
TYPE="Ethernet"
BOOTPROTO="static"
NAME="eth1"
DEVICE="eth1"
ONBOOT="yes"
BRIDGE=br1

[root@localhost ~]# vim ifcfg-br1
TYPE="Bridge"
BOOTPROTO="static"
DEFROUTE="yes"
NAME="br1"
DEVICE="br1"
ONBOOT="yes"
IPADDR=10.0.0.27
NETMASK=255.255.255.0

# 重啟網絡
[root@localhost ~]# systemctl restart network
# 重啟網絡
[root@localhost ~]# systemctl restart network

# 創建兩台kvm虛擬機
#第一台這樣創建
[root@localhost ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/centos7-vm-bridge.qcow2 10G

[root@localhost ~]# virt-install \
--virt-type kvm \
--name centos-vm1-bridge \
--ram 1024 --vcpus 2 \ --cdrom=/data/ISOs/CentOS-7-x86_64-Minimal-2009.iso \ 
--disk path=/var/lib/libvirt/images/centos7-vm-bridge.qcow2 \ --network bridge=br0 --graphics vnc,listen=0.0.0.0 \ --noautoconsole

# 第一台虛擬機做好優化比如關閉selinux,防火牆
[root@kvm3 ~]# sed -ri 's#^(SELINUX=).*#\1disabled#' /etc/selinux/config

#第二台可以直接拷貝已經安裝好系統的創建
[root@localhost ~]# cd /var/lib/libvirt/images/
[root@localhost images]# ll
-rw-r--r--. 1 qemu qemu 1789657088 Jul  8 14:10 centos7-vm-bridge.qcow2
[root@localhost images]# cp centos7-vm-bridge.qcow2 vm2-bridge2.qcow2

[root@localhost ~]# virt-install \
--virt-type kvm \
--name centos-vm2-bridge \
--ram 1024 --vcpus 2 \
--cdrom=/data/ISOs/CentOS-7-x86_64-Minimal-2009.iso \
--disk path=/var/lib/libvirt/images/vm2-bridge2.qcow2 \ --network bridge=br0 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole

# 啟動管理
[root@localhost ~]# virt-manager
# 立馬關機不安裝,然后再重新運行kvm虛擬機

# 第二台測試ping外網,安裝web服務器
[root@localhost ~]# yum install httpd -y
[root@localhost ~]# systemctl enable --now httpd
制作測試頁面
[root@localhost ~]# echo 123456 web > /var/www/html/index.html

測試看看能不能ping外網
[root@localhost ~]# ping www.baidu.com
ping: www.baidu.com: Name or service not known

# 第一台對外的機器安裝haproxy代理服務
[root@localhost ~]# yum install haproxy -y
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg

listen web-80
  bind 0.0.0.0:80
  server 10.0.0.27 10.0.0.27:80 check inter 3000 fall 2 rise 5

# 啟動服務
[root@localhost ~]# systemctl start haproxy

# 開啟路由轉發
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1

[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1

# 第一台可以連接外網的測試網絡連接
[root@localhost ~]# curl 10.0.0.27
123456 web
# 使用瀏覽器訪問http://10.0.0.27 看到的界面跟上面一樣

腳本

#!/bin/bash
# Date: 2021-07-08
# 用於拷貝多個kvm模板文件

muber=500
for i in `seq $muber`;do
    # cpoy KVM模板文件
    cp -av /vms/vmdisk/test-v1.qcow2 /vms/vmdisk/v${i}.qcow2

    # 安裝並拉起kvm虛擬機
    virt-install --virt-type kvm --name v${i} --ram 1024 --vcpus 2 \
    --disk path=/vms/vmdisk/v${i}.qcow2 --network bridge=br0 \
    --boot hd \
    --graphics vnc,listen=0.0.0.0 \
    --noautoconsole --autostart
done

案例1:VMware遷移到KVM 機器

[root@localhost ~]# qemu-img --help

convert [-c] [-p] [-q] [-n] [-f fmt] [-t cache] [-T src_cache] [-O output_fmt] [-o options] [-s snapshot_name] [-S sparse_size] filename [filename2 [...]] output_filename

說明:
-f:原文件格式
-O:輸出什么格式ram,qcow2
filename:原文件名
output_filename:輸出什么文件名

范例:轉換VMware里面的格式為KVM(路徑要寫絕對路徑,要么進到路徑里面)

[root@localhost ISOs]# ll
-rw-r--r--. 1 root root 1936523264 Jul  8 15:25 centos8.vmdk

[root@localhost ~]# qemu-img convert -f vmdk -O qcow2 centos8.vmdk centos8.qcow2

[root@localhost ~]# mv centos8.qcow2 /var/lib/libvirt/images/

# 使用命令行
[root@localhost ~]# virt-install \
--virt-type kvm \
--name centos7-vm2 \
--ram 1024 --vcpus 2 \
--boot hd \
--disk path=/var/lib/libvirt/images/CentOS7-vmware.qcow2 \ --network bridge=br0 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole \
--autostart

[root@localhost ~]# mv centos8.qcow2 /var/lib/libvirt/images/
# 啟動virt-manager圖形界面選擇import導入,然后測試看看是否能正常使用(不推薦使用)

案例2:跨主機遷移(不會保留本機虛擬機)

准備兩台機器
172.31.0.17
172.31.0.27

# 把鏡像拷貝到其他機器
創建目錄
[root@localhost ~]# mkdir /data/ISOs -p
[root@localhost ISOs]# scp CentOS-7-x86_64-Minimal-2009.iso 172.31.0.27:/data/ISOs/
# 把磁盤拷貝到其他機器


# 安裝軟件
[root@s1 ~]# yum install qemu-kvm qemu-kvm-tools libvirt libvirt-client virt-manager virt-install -y

[root@localhost ~]# systemctl enable --now libvirtd

# 另外一台機器也要配置好網橋

# 啟動管理(必須要改不能相同的主機名)
[root@localhost ~]# virt-manager
# 立馬關機不安裝,然后再重新運行kvm虛擬機

[root@localhost ~]# yum install openssh-askpass -y

案例3:搭建NFS服務共享存儲跨主機遷移

准備三台服務器
172.31.0.17
172.31.0.27
172.31.0.37

# 172.31.0.37做共享存儲服務
# 安裝軟件NFS
[root@localhost ~]# yum install nfs-utils -y

創建掛載目錄並共享
[root@localhost ~]# mkdir /data/vmdata -p
[root@localhost ~]# vim /etc/exports
# 注意:*和()不能有空格,不然掛載會報錯為只讀
/data/vmdata *(rw,no_root_squash)

# 在172.31.0.17
[root@localhost ~]# showmount -e 172.31.0.37
Export list for 172.31.0.37:
/data/vmdata *

[root@localhost images]# ll
-rw-r--r--. 1 root root 1794899968 Jul  8 16:03 centos7-vm2-bridge2.qcow2

[root@localhost images]# scp centos7-vm2-bridge2.qcow2 172.31.0.37:/data/vmdata

# 命令掛載nfs
[root@localhost ~]# mount -t nfs 172.31.0.37:/data/vmdata /var/lib/libvirt/images/

# 命令創建虛擬機
[root@localhost ~]# virt-install --virt-type kvm --name centos7-vm1 --ram 1024 --vcpus 2 --cdrom=/var/lib/libvirt/images/CentOS-7-x86_64-Minimal-2009.iso --disk path=/var/lib/libvirt/images/centos7-vm1-test.qcow2 --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole

案例:遠程控制其他機器

打開virt-manager選擇添加其他機器

案例:通過virt-manager管理界面遷移虛擬機

注意:一定要開啟虛擬化技術,不然會報錯

總結:

報錯:比如權限問題?
關閉selinux,關閉防火牆,改文件夾的所屬和所屬組,同時在虛擬機里面重新創建虛擬機

#這是在nfs機器操作
[root@mysql2 ~]# id qemu
uid=107(qemu) gid=107(qemu) groups=107(qemu),36(kvm)

[root@mysql2 ~]# chown qemu:qemu /data/vmdata/centos7-vm-bridge.qcow2

[root@mysql2 ~]# setfacl -m u:qemu:rwx /data/vmdata/centos7-vm-bridge.qcow2
[root@mysql2 ~]# setfacl -m u:qemu:rwx /data/vmdata/

# 下面的操作是在kvm機器上操作
[root@kvm3 ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/centos7-vm-bridge.qcow2 10G

[root@kvm3 ~]# ll /var/lib/libvirt/images/centos7-vm-bridge.qcow2

[root@kvm3 ~]# virt-install --virt-type kvm --name centos7-vm1 --ram 1024 --vcpus 2 --disk path=/var/lib/libvirt/images/centos7-vm-bridge.qcow2 --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole --import


免責聲明!

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



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