主頁 > 資料庫 > KVM#TyporaKVM虛擬機筆記

KVM#TyporaKVM虛擬機筆記

2020-10-07 08:34:59 資料庫

-企業私有云容器化架構運維實戰

一、虛擬化技術概述

了解

什么是虛擬化:
虛擬化(Virtualization)技術最早出現在 20 世紀 60 年代的 IBM 大型機系統,在70年代的 System 370 系列中逐漸流行起來,這些機器通過一種叫虛擬機監控器(Virtual Machine Monitor,VMM)的程式在物理硬體之上生成許多可以運行獨立作業系統軟體的虛擬機(Virtual Machine)實體,隨著近年多核系統、集群、網格甚至云計算的廣泛部署,虛擬化技術在商業應用上的優勢日益體現,不僅降低了 IT 成本,而且還增強了系統安全性和可靠性,

Hypervisor:虛擬化管理程式
#vmm、Hypervisor 是提供正真虛擬機管理程式的,---創建,洗掉-開關機,,,Hypervisor是屬于內核功能的作業系統內核的一個模塊,把和內核互動的工具稱之為用戶肽工具:比如:virsh命令列--virt-manager圖形界面,

虛擬化技術的分類:

平臺虛擬化(Platform Virtualization),針對計算機和作業系統的虛擬化,
資源虛擬化(Resource Virtualization),針對特定的系統資源的虛擬化,比如記憶體、存盤、網路資源等,
應用程式虛擬化(Application Virtualization),包括仿真、模擬、解釋技術等,把硬體的東西變成了一個應用

? 我們通常所說的虛擬化主要是指平臺虛擬化技術,通過使用控制程式(Control Program,也被稱為 Virtual Machine Monitor(虛擬監控器VMM) 或Hypervisor,為用戶提供抽象的、統一的、模擬的計算環境(稱為虛擬機),

平臺虛擬化型別

作業系統虛擬化
常見的作業系統叫openvz,他的特點是所有虛擬機共享宿主機的內核,

vps--虛擬服務器--底層虛擬機比如kvm
全虛擬化(Full Virtualization):
全虛擬化是指虛擬機模擬了完整的底層硬體,包括處理器、物理記憶體等,使原始硬體的作業系統或其它系統軟體完全不做任何修改就可以在虛擬機中運行,

現在的kvm與vmware都支持全虛擬化
半虛擬化(Para Virtualization):
半虛擬化(也叫超虛擬化)是另一種類似于全虛擬化的技術,它使用Hypervisor分享存取底層的硬體,它的guest作業系統集成了虛擬化方面的代碼,因為作業系統自身能夠與虛擬行程進行很好的協作,#半虛擬化要比全虛擬化先進

半虛擬化需要guest作業系統做一些修改,使guest作業系統意識到自己是處于虛擬化環境的,
硬體輔助虛擬化
硬體輔助虛擬化是指借助硬體(主要是主機處理器)的支持來實作高效的全虛擬化,#必須得是cpu支持虛擬化 
常用的虛擬化產品有哪些
1.桌面版虛擬化
2.企業級虛擬機化

產品分類:
1.Kvm(redhat-----企業級
2.Vmware:
Vmware-workstation(windows和linux)----桌面級
Vmware-fusion(mac)
Vmware-esxi-----(企業級別)本身就是一個作業系統,
3.hyper-v(微軟)
4.Ovm(oracle公司--Windows linux) virtulbox
5.Xen(rhel6之前所有版本默認用的虛擬化產品)
企業級虛擬化與桌面級虛擬化的區別
1.桌面級虛擬化:
App  ---在安裝APP,也就是應用
guest os  ---客戶機也叫客戶作業系統
虛擬化軟體---(hypervisor+{圖形管理工具(gui)+文本管理工具(tui)}--Api介面)位于作業系統之上
作業系統--(wind\linux\mac)
物理機--硬體

2.企業級虛擬化
App
guest os
虛擬化軟體-----(gui或者tui)
作業系統---內核(hypervisor):屬于內核里面的一個模塊,直接安裝企業級的作業系統就可以了
物理機

#桌面級比企業級虛擬化多了一層互動,所以企業級虛擬化要比桌面級虛擬化性能高,但是hyprtvisor會占用系統的資源
虛擬化的應用場景
1.機器配置比較高,應用需求配置低的情況下,--宿主機--安裝虛擬機--使用虛擬機
2.云平臺:
最傳統的方式還沒有虛擬機的時候:有機房---有物理服務器---使用,最大浪費點---磁盤,記憶體CPU這些資源,
有了虛擬化機之后優點是---虛擬機遷移--拍快照--隨意定義配置---vps虛擬服務器--虛擬機比如kvm,--通過虛擬機管理程式管理
云主機--底層還是虛擬機比如kvm,管理方式上有區別:云平臺管理,比如阿里云,,華為云,openstack--默認呼叫還是kvm

#云服務器可以為企業節約成本,實作資源的最大使用,計費方式很靈活可以包年包月,按需付費,,自定義配置

3.云分類:
iaas:infrastructure as a service---基礎設施及服務,比如我們購買的云主機然后在用-openstack屬于這個
paas: platform as a serivce ---平臺及服務,在基礎設施服務上面安裝好了軟體,連軟體一塊賣出去給用戶使用
saas:softeare as a service ----軟體及服務,比如云檔案騰訊檔案,只需要瀏覽器什么都不用,直接拿來使用
dsaas:data storage as a service ---資料存盤及服務--比如百度網盤
caas:container as a serivce ---容器服務

4.kvm使用

二、KVM虛擬化技術簡介

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NxDLM8Bg-1601901684238)(assets/5cf61b854224d74429.png)]

KVM 針對運行在 x86 硬體上的、駐留在內核中的虛擬化基礎結構,KVM 是第一個成為原生 Linux 內核(2.6.20)的一部分的 hypervisor,它是由 Avi Kivity 開發和維護的,現在歸 Red Hat 所有,
#KVM 是作為內核模塊實作的
KVM安裝
kvm虛擬化平臺軟體一般裝在作業系統為Centos上面
大家不想把電腦裝為Centos的作業系統,可以用VMware workstations裝一臺配置較高的虛擬機(cpu、記憶體、磁盤)給的盡可能最大,然后需要在開啟之前做如下操作

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-X8QFUd8s-1601901684240)(assets/1571883832374.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-O979QTxz-1601901684243)(assets/1571883850670.png)]

!(assets/1571883863183.png)

然后打開虛擬機,安裝kvm即可

查看cpu是否支持虛擬化
# cat /proc/cpuinfo | grep -E 'vmx|svm'
"關閉防火墻和selinux"   --注:如果虛擬機ping不通就把防火墻開起來

一般企業如果使用kvm虛擬機平臺,都會把物理服務器裝成Centos的作業系統,然后裝上kvm,創建使用虛擬機

1.需求內核(rhel6以上):
[root@kvm-server ~]# uname -r 
3.10.0-1062.el7.x86_64
2.如果之前安裝kvm了清理環境:卸載kvm
[root@kvm-server ~]# yum remove `rpm -qa | egrep 'qemu|virt|kvm'` -y

[root@kvm-server ~]# rm -rf /var/lib/libvirt  /etc/libvirt/
3.升級系統:(在安裝虛擬機出錯的情況下,一般是作業系統的版本問題)
[root@kvm-server ~]# yum upgrade
4.安裝軟體:
[root@kvm-server ~]# yum install *qemu*  *virt*  librbd1-devel -y
其實下載的是下面幾款軟體
[root@kvm-server ~]# yum install qemu-kvm libvirt virt-manager  librbd1-devel -y 
qemu-kvm libvirt virt-manager 

qemu:模擬器
qemu-kvm : 主包
libvirt:api介面
virt-manager:圖形化界面

#在所謂的kvm技術中,應用到的其實有2個東西:qemu+kvm
kvm負責cpu虛擬化+記憶體虛擬化,實作了cpu和記憶體的虛擬化,但kvm不能模擬其他設備;
qemu是模擬IO設備(網卡,磁盤),kvm加上qemu之后就能實作真正意義上服務器虛擬化,
因為用到了上面兩個東西,所以一般都稱之為qemu-kvm,
libvirt則是呼叫kvm虛擬化技術的介面用于管理的,用libvirt管理方便,直接用qemu-kvm的介面太繁瑣,

#kvm xen  qemu三者區別:
kvm與xen的區別;
xen是紅帽6之前紅帽5的虛擬化應用,6出來之后用kvm替代了,

#kvm和qemu有什么關系:
qemu就是一款開源的虛擬化軟體,后來被紅帽收購了,進行了優化變成了,qemu-kvm,這也是我們現在用的kvm全稱,

ji

KVM gustos圖形方式部署安裝虛擬機—需要掌握

[root@kvm-server ~]# virt-manager
====================
下面就是點點點

#安裝完成一臺虛擬機之后,網路模式默認是NAT的,也只有這一種網路

備注

#####一、GuestOS安裝問題決議

問題1:用圖形安裝guest os的時候卡住不動

解決:升級系統
[root@qfedu.com ~]#  yum upgrade -y

問題2:升級系統后安裝guest os的時候還是卡住不動

解決:需要在安裝宿主機的時候安裝兼容性程式(有的同學就沒有安裝也可以使用,這可能是bug)

問題3:如果安裝了各種兼容程式之后還是不行

如果所有問題都排查過后還是安裝不上guestos,最后的原因就是在安裝宿主機系統的時候各種兼容性軟體沒有安裝而且Yum也沒有自動處理導致的

完全文本方式安裝虛擬機

[root@kvm-server ~]# yum install -y vsftpd  #安裝ftp,并配置最后將鏡像上傳到ftp中
[root@kvm-server ~]# mkdir /var/ftp/centos7u4
[root@kvm-server IOS]# mount CentOS-7-x86_64-DVD-1708.iso /var/ftp/centos7u4/
[root@kvm-server ~]# virt-install --connect qemu:///system -n vm10 -r 2050 --disk path=/var/lib/libvirt/images/vm10.img,size=5  --os-type=linux --os-variant=centos7.0 --vcpus=1  --location=ftp://10.0.111.182/centos7u4 -x console=ttyS0 --nographics

用這種方式安裝的作業系統有一個毛病:純文本安裝的輸入時大小寫莫名的變換,遠程ssh沒問題,記憶體不低于2G

注意:
virt-install 
bash: virt-install: 未找到命令...
# yum install libguestfs-tools -y
# yum install virt-install.noarch -y

引數解釋:
-n name
-r  以M為單位指定分配給虛擬機的記憶體大小
--disk 指定作為客戶機存盤的媒介 size以G為單位的存盤
--os-type   系統型別
--os-variant 系統型別版本
--vcpus 指定核數,不能超過物理cpu
--location  客戶虛擬機安裝源下載,必須為鏡像掛載在ftp目錄下
-x console=ttyS0 執行終端0
--nographics 無圖形,文本模式

按空格退出!

下面的操作根據提示點點就可以了

模板鏡像+組態檔 方式安裝虛擬機—需要掌握

1.虛擬機組態檔
[root@kvm-server ~]# ls /etc/libvirt/qemu
networks  vm2.xml
2.儲存虛擬機的介質
[root@kvm-server ~]# ls /var/lib/libvirt/images/
vm2.img
==============================
define方式創建好,不會啟動
create方式創建好,會啟動
實戰:
1.拷貝模板鏡像和組態檔
[root@kvm-server ~]# cp /etc/libvirt/qemu/vm2.xml /etc/libvirt/qemu/vm3.xml
[root@kvm-server ~]# cp /var/lib/libvirt/images/vm2.img /var/lib/libvirt/images/vm3.img 
2.修改組態檔
生成新的UUID
[root@kvm-server ~]# uuidgen
2e3fa6db-ff7f-41c3-bc8f-0428e81ebb57
[root@kvm-server ~]# vim /etc/libvirt/qemu/vm3.xml
domain type='kvm'>
  <name>vm3</name>  #名字不能一樣需要修改
  <uuid>2e3fa6db-ff7f-41c3-bc8f-0428e81ebb57</uuid> #uuid不能一樣需要修改
  <memory unit='KiB'>1024000</memory>  #記憶體,可選
  <currentMemory unit='KiB'>1024000</currentMemory>  #當前記憶體與上面定義一樣
  <vcpu placement='static'>2</vcpu>  #cpu可選
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='custom' match='exact' check='partial'>
    <model fallback='allow'>SandyBridge-IBRS</model>
    <feature policy='require' name='md-clear'/>
    <feature policy='require' name='spec-ctrl'/>
    <feature policy='require' name='ssbd'/>
  </cpu>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/vm3.img'/>   #磁盤鏡像需要修改
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='virtio-serial' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </controller>
    <interface type='network'>
      <mac address='52:54:00:82:d6:3c'/>  #mac地址不能一樣需要修改,只能修改后三段,
      <source network='default'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='unix'>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <channel type='spicevmc'>
      <target type='virtio' name='com.redhat.spice.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='2'/>
    </channel>
    <input type='tablet' bus='usb'>
      <address type='usb' bus='0' port='1'/>
    </input>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='spice' autoport='yes'>
      <listen type='address'/>
      <image compression='off'/>
    </graphics>
    <sound model='ich6'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </sound>
    <video>
      <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <redirdev bus='usb' type='spicevmc'>
      <address type='usb' bus='0' port='2'/>
    </redirdev>
    <redirdev bus='usb' type='spicevmc'>
      <address type='usb' bus='0' port='3'/>
    </redirdev>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
    </memballoon>
    <rng model='virtio'>
      <backend model='random'>/dev/urandom</backend>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
    </rng>
  </devices>
</domain>

#必須修改name,uuid,mac地址,其余可選

用vim修改完之后需要define一下組態檔
[root@kvm-server ~]# virsh define /etc/libvirt/qemu/vm3.xml
重啟一下:
[root@kvm-server ~]# systemctl restart libvirtd
宿主機開啟路由轉發:
[root@kvm-server ~]# vim /etc/sysctl.conf 
[root@kvm-server ~]# sysctl -p
net.ipv4.ip_forward = 1
=============
查看虛擬機串列:
[root@kvm-server ~]# virsh list --all
 Id    名稱                         狀態
----------------------------------------------------
 -     vm2                            關閉
 -     vm3                            關閉
或者如下:

三、KVM虛擬機管理

虛擬機的基本管理命令:
查看
啟動
關閉
重啟
重置 
===================
[root@kvm-server ~]# virsh list  #列出在運行狀態中的虛擬機
 Id    名稱                         狀態
----------------------------------------------------
 2     vm3                            running
[root@kvm-server ~]# virsh list --all  #列出所有虛擬機
 Id    名稱                         狀態
----------------------------------------------------
 2     vm3                            running
 -     vm2                            關閉
查看kvm虛擬機組態檔:
#語法:virsh dumpxml vm_name
[root@kvm-server ~]# virsh dumpxml vm3

將vm3虛擬機的組態檔保存至vm4.xml
[root@kvm-server ~]# virsh dumpxml vm3 > /etc/libvirt/qemu/vm4.xml


啟動
[root@kvm-server ~]# virsh start vm2
域 vm2 已開始

暫停虛擬機:
[root@kvm-server ~]# virsh suspend vm_name
域 vm2 被掛起

恢復虛擬機:
[root@kvm-server ~]# virsh resume vm_name
域 vm2 被重新恢復

關閉:
方法1:
[root@kvm-server ~]# virsh shutdown vm3
域 vm3 被關閉
    
方法2:
[root@kvm-server ~]# virsh destroy vm3

重啟:
[root@kvm-server ~]# virsh reboot vm3
域 vm3 正在被重新啟動

重置:
[root@kvm-server ~]# virsh reset vm3   #斷電重啟,速度快
Domain vm3 was reset

洗掉虛擬機:
[root@kvm-server ~]# virsh undefine vm2
Domain vm2 has been undefined

注意:虛擬機在開啟的情況下undefine是無法洗掉的只是將組態檔洗掉了,不能洗掉磁盤檔案,需要手動rm
======================

虛擬機開機自動啟動:
#如果虛擬機開機自啟,里面的服務應該設定的有開機自啟,不然沒有意義
[root@kvm-server ~]# virsh autostart vm_name
域 vm3標記為自動開始

[root@kvm-server ~]# ls /etc/libvirt/qemu/autostart/     //此目錄默認不存在,在有開機啟動的虛擬機時自動創建
vm3.xml

關閉開機啟動
[root@kvm-server ~]# virsh autostart --disable vm_name
域 vm3取消標記為自動開始
[root@kvm-server ~]# ls /etc/libvirt/qemu/autostart/

如何查看已啟動的虛擬機ip地址
假如vm3虛擬機已啟動
[root@kvm-server ~]# virsh domifaddr vm3
 名稱     MAC 地址           Protocol     Address
-------------------------------------------------------------------------------
 vnet0      52:54:00:82:d6:3c    ipv4         192.168.122.85/24

四、虛擬機添加設備

1.圖形方式:
    首先,關閉要添加硬體的虛擬機
    雙擊虛擬機,在打開的對話框點擊上方的View,點擊Details,點擊Add Hardware可以選擇要添加的虛擬硬體

按需求點點就可以了,

2.修改組態檔方式:

我們給虛擬機vm3添加磁盤為例:

首先需要創建出要添加的磁盤
[root@kvm-server ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/vm4-1.qcow2 5G

注:創建空的磁盤檔案:這里我們創建一個5G的磁盤,不過創建出來,通過ll -h查看大小,看不出它是5G,添加上之后才能看到
[root@kvm-server ~]# cd /etc/libvirt/qemu/
[root@kvm-server qemu]# vim vm3.xml/
加好之后,啟動虛擬機
[root@kvm-server qemu]# systemctl restart libvirtd
[root@kvm-server qemu]# virsh list --all
 Id    名稱                         狀態
----------------------------------------------------
 6     centos7.0                      running
 -     vm3                            關閉
[root@kvm-server qemu]# virsh start vm3
可以看到我們新添加的磁盤vdb
#然后可以正常磁區,制作檔案系統,進行掛載

虛擬機克隆

1.圖形界面:Applications (左上角)-----> System Tools ------>Virtual Machine Manager
   關閉要克隆的虛擬機,右鍵點擊虛擬機選擇Clone
2.在終端執行命令克隆
[root@kvm-server ~]# virt-clone -o vm2 --auto-clone
正在分配 'vm2-clone.qcow2'                              | 5.0 GB  00:00     
成功克隆 'vm2-clone',
-o       origin-原始
    
[root@kvm-server ~]# virt-clone -o vm2 -n vm5 --auto-clone
正在分配 'vm5.qcow2'                                    | 5.0 GB  00:00     
成功克隆 'vm5',
-n :指定新客戶機的名字
        
[root@kvm-server ~]# virt-clone -o vm2 -n vm6 -f /var/lib/libvirt/images/vm6.img 
正在分配 'vm6.img'                                      | 5.0 GB  00:00     
成功克隆 'vm6',
-f ,--file NEW_DISKFILE:為新客戶機使用新的磁盤鏡像檔案

這條命令在克隆的同時,可以指定鏡像檔案的位置和名稱,

[root@kvm-server ~]# virsh list --all
 Id    名稱                         狀態
----------------------------------------------------
 -     vm2                            關閉
 -     vm2-clone                      關閉
 -     vm3                            關閉
 -     vm5                            關閉
 -     vm6                            關閉

kvm高級命令

#建立虛擬機磁盤鏡像檔案:
磁盤鏡像檔案格式:
    1.qed  ----不用了
    2.raw     原始格式,性能最好 直接占用你一開始給多少 系統就占多少 不支持快照
    qcow  先去網上了解一下cow(寫時拷貝copy on write) ,性能遠不能和raw相比,所以很快夭折了,所以出現了qcow2(性能低下 早就被拋棄)
    3.qcow2 性能上還是不如raw,但是raw不支持快照,qcow2支持快照,

#什么叫寫時拷貝?
raw立刻分配空間,不管你有沒有用到那么多空間
qcow2只是承諾給你分配空間,但是只有當你需要用空間的時候,才會給你空間,最多只給你承諾空間的大小,避免空間浪費

作業當中用哪個?看你用不用快照,本身做快照也是需要存盤空間的,

[root@kvm-server images]# pwd
/var/lib/libvirt/images

建立qcow2格式磁盤檔案:
[root@kvm-server images]# qemu-img create -f qcow2 test.img 5G
Formatting 'test.img', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 lazy_refcounts=off 

qemu-kvm  qemu是早先的一個模擬器,kvm是基于qemu發展出來的,

建立raw格式磁盤檔案:
[root@kvm-server images]# qemu-img create -f raw test.raw 5G
Formatting 'test.raw', fmt=raw size=5368709120 

查看已經創建的虛擬磁盤檔案:
[root@kvm-server images]# qemu-img info test.img 
[root@kvm-server images]# qemu-img info test.raw 

=============================================================================
#掛載磁盤,,,先前條件:檔案系統沒有壞掉

將vm2虛擬機先關閉
查看vm2的磁盤鏡像磁區資訊:
[root@kvm-server images]# virt-df -h -d vm2
檔案系統                                  大小      已用空間    可用空間     使用百分比%
vm2:/dev/sda1                            1014M        92M       922M         10%
vm2:/dev/centos/root                      3.5G       863M       2.6G         25%

1.創建一個掛載目錄
[root@kvm-server images]# mkdir /test
2.掛載虛擬機的跟磁區到test目錄
[root@kvm-server images]# guestmount -d vm2 -m /dev/centos/root --rw /test/
[root@kvm-server images]# cd /test/
[root@kvm-server test]# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
[root@kvm-server test]# cat etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

取消掛載
[root@kvm-server ~]# guestunmount /test

五、KVM存盤配置

#存盤池
概念:
    kvm必須要配置一個目錄當作他存盤磁盤鏡像(存盤卷)的目錄,我們稱這個目錄為存盤池
    
#kvm默認存盤池的位置:
    /var/lib/libvirt/images/    

1.創建基于檔案夾的存盤池(目錄,可自定義)
[root@kvm-server ~]# mkdir -p /data/vmfs

2.定義存盤池與其目錄
[root@kvm-server ~]# virsh pool-define-as vmdisk --type dir --target /data/vmfs
Pool vmdisk defined
解釋:vmdisk是新建的存盤池的名稱,可自定義

3.創建已定義的存盤池
(1)創建已定義的存盤池
[root@kvm-server ~]# virsh pool-build vmdisk
Pool vmdisk built

(2)查看已定義的存盤池,存盤池不激活無法使用,
[root@kvm-server ~]# virsh pool-list --all
Name                 State      Autostart 
-------------------------------------------
 default              active     yes       
 ISO                 active     yes       
 vmdisk               inactive   no     

4.激活并自動啟動已定義的存盤池
[root@kvm-server ~]# virsh pool-start vmdisk
Pool vmdisk started
[root@kvm-server ~]# virsh pool-autostart vmdisk
Pool vmdisk marked as autostarted

[root@kvm-server ~]# virsh pool-list --all
 Name                 State      Autostart 
-------------------------------------------
 default              active     yes       
 ISO                 active     yes       
 vmdisk               active     yes   
這里vmdisk存盤池就已經創建好了,可以直接在這個存盤池中創建虛擬磁盤檔案了,

5.在存盤池中創建虛擬機存盤卷
[root@kvm-server ~]# virsh vol-create-as vmdisk vm99.qcow2 2G --format qcow2
Vol vm99.qcow2 created


[root@kvm-server ~]# ll /data/vmfs/ -h
總用量 196K
-rw------- 1 root root 193K 10月 25 16:04 vm99.qcow2



6.存盤池相關管理命令
(1)在存盤池中洗掉虛擬機存盤卷
[root@kvm-server ~]# virsh vol-delete --pool vmdisk vm99.qcow2
Vol vm99.qcow2 deleted

(2)取消激活存盤池
[root@kvm-server ~]# virsh pool-destroy vmdisk
Pool vmdisk destroyed

(3)洗掉存盤池定義的目錄/data/vmfs
[root@kvm-server ~]# virsh pool-delete vmdisk
Pool vmdisk deleted

(4)取消定義存盤池
[root@kvm-server ~]# virsh pool-undefine vmdisk
Pool vmdisk has been undefined

到此kvm存盤池配置與管理操作完畢, 

六、kvm快照

為虛擬機vm2創建一個快照(磁盤格式必須為qcow2)
[root@kvm-server ~]# virsh snapshot-create-as vm2 vm2.snap1


注意:如果在創建快照的時候報錯:
error: unsupported configuration: internal snapshot for disk vda unsupported for storage type raw

raw
不支持snapshot

qcow2
現在比較主流的一種虛擬化鏡像格式,經過一代的優化,目前qcow2的性能上接近raw裸格式的性能,這個也算是redhat的官方渠道了
對于qcow2的格式,幾點還是比較突出的:
	?更小的存盤空間
	?支持多個snapshot,對歷史snapshot進行管理
查看磁盤檔案格式
[root@kvm-server images]# qemu-img info /var/lib/libvirt/images/vm2.qcow2
image: /var/lib/libvirt/images/vm2.qcow2
file format: qcow2
virtual size: 5.0G (5368709120 bytes)
disk size: 5.0G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: true

[root@kvm-server ~]# virsh snapshot-list  vm2   #查看某臺虛擬機設備的快照
 Name                 Creation Time             State
------------------------------------------------------------

創建一塊磁盤
[root@kvm-server ~]# qemu-img create -f raw /var/lib/libvirt/images/vm2-1.raw 2G
Formatting '/var/lib/libvirt/images/vm2-1.raw', fmt=raw size=2147483648 

[root@kvm-server ~]# ll -h /var/lib/libvirt/images/vm2-1.raw
-rw-r--r-- 1 root root 2.0G 10月 25 16:25 /var/lib/libvirt/images/vm2-1.raw

將其添加到vm2虛擬機上面
[root@kvm-server ~]# cd /etc/libvirt/qemu/
[root@kvm-server qemu]# vim vm2.xml 
[root@kvm-server images]# virsh define /etc/libvirt/qemu/vm2.xml
[root@kvm-server images]# virsh start vm2
[root@kvm-server qemu]# virsh snapshot-create-as vm2 vm2.snap1
錯誤:不支持的配置:存盤型別 vdb 不支持磁盤 raw 的內部快照



#磁盤格式的轉換

由于raw的磁盤格式,不支持快照功能,我們需要將其轉換為qcow2的格式
[root@kvm-server qemu]# qemu-img convert -O qcow2 /var/lib/libvirt/images/vm2-1.raw  /var/lib/libvirt/images/vm2-1.qcow2
[root@kvm-server qemu]# cd /var/lib/libvirt/images/
[root@kvm-server images]# ll -h 
總用量 21G
-rw------- 1 root root 5.1G 10月 24 18:59 centos7.0.qcow2
-rw-r--r-- 1 root root 193K 10月 25 16:44 vm2-1.qcow2
-rw-r--r-- 1 root root 2.0G 10月 25 16:25 vm2-1.raw
-rw------- 1 root root 5.1G 10月 25 16:13 vm2.qcow2


[root@kvm-server images]# qemu-img info /var/lib/libvirt/images/vm2-1.qcow2
image: /var/lib/libvirt/images/vm2-1.qcow2
file format: qcow2
virtual size: 2.0G (2147483648 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false


然后去修改vm2虛擬機的磁盤格式和名稱
[root@kvm-server images]# vim /etc/libvirt/qemu/vm2.xml
[root@kvm-server images]# virsh define /etc/libvirt/qemu/vm2.xml

創建快照
[root@kvm-server qemu]# virsh snapshot-create-as vm2 vm2.snap2
已生成域快照 vm2.snap2

然后我們開始做快照,圖形化方式不再介紹

登錄vm2的虛擬機:
[root@vm2 ~]# mkdir /opt/test
[root@kvm-server ~]# virsh snapshot-create-as vm2 vm2-snap3
已生成域快照 vm2-snap3

再次登錄vm2的虛擬:
[root@vm2 ~]# rm -rf /opt/test/
[root@kvm-server ~]# virsh shutdown vm2
[root@kvm-server ~]# virsh snapshot-create-as vm2 vm2-snap4
已生成域快照 vm2-snap4

查看快照
[root@kvm-server ~]# virsh snapshot-list vm2 
 名稱               生成時間              狀態
------------------------------------------------------------
 vm2-snap3            2019-10-30 15:27:15 +0800 running
 vm2-snap4            2019-10-30 15:29:37 +0800 shutoff

然后將vm2關閉,恢復到快照vm2.snap3
[root@kvm-server ~]# virsh snapshot-revert vm2 vm2-snap3
[root@kvm-server ~]# virsh start vm2
Domain vm2 started

在vm2虛擬機上查看
[root@vm2 ~]# ls /opt/
test
可以再恢復到vm2.snap4測驗一下

洗掉虛擬機快照操作:
[root@kvm-server ~]# virsh shutdown vm2
[root@kvm-server ~]# virsh snapshot-list vm2
 名稱               生成時間              狀態
------------------------------------------------------------
 vm2-snap3            2019-10-30 15:27:15 +0800 running
 vm2-snap4            2019-10-30 15:29:37 +0800 shutoff

[root@kvm-server ~]# virsh snapshot-delete --snapshotname vm2-snap3 vm2
已洗掉域快照 vm2-snap3

[root@kvm-server ~]# virsh snapshot-list vm2
 名稱               生成時間              狀態
------------------------------------------------------------
 vm2-snap4            2019-10-30 15:27:15 +0800 running

七、KVM網路配置

四種網路

NAT default方式:支持主機與虛擬機互訪,虛擬機訪問外界網路,但不支持外界訪問虛擬機,
isolated 隔離,vmware--host-only:僅主機模式,外網不能訪問虛擬機,虛擬機也不能訪問外網
bridge  ----橋接模式屬于橋介面
路由模式

nat網路

橋接網路

隔離網路

#查看管理介面對應的網卡
[root@kvm-server ~]# brctl show 
bridge name	bridge id		STP enabled	interfaces
virbr0		8000.525400831963	yes		virbr0-nic
							           vnet0
							           vnet1

注意:這里vnet網卡,是每臺啟動的虛擬機正在使用的網卡設備,每臺虛擬機使用的不同						                             					                             
#從交換機上把vnet網卡洗掉:
[root@kvm-server ~]# brctl delif virbr0 vnet0

來到vm2的虛擬機,ping不通百度
添加vnet網卡添加到交換機上:
[root@kvm-server ~]# brctl addif virbr0 vnet0
	
來到vm2的虛擬機,恢復正常

組態檔方式配置橋接:在宿主機上

先將kvm虛擬機關閉

組態檔方式配置橋接:在宿主機上
[root@kvm-server ~]# ip a   #先找出宿主機用的哪個網卡設備,我的是enp0s25
[root@kvm-server ~]# cd /etc/sysconfig/network-scripts/
1.定義網卡組態檔
[root@kvm-server network-scripts]# vim ifcfg-br0    #創建該橋接網卡,默認沒有此檔案需要新建
[root@kvm-server network-scripts]# cat ifcfg-br0
TYPE=Bridge
NAME=br0
DEVICE=br0
ONBOOT="yes"
BOOTPROTO=static
IPADDR=10.0.111.182   #要和宿主機在一個網路,這里我用的是宿主機的ip
GATEWAY=10.0.111.1    #宿主的網關,nat的是.2,橋接是.1
NETMASK=255.255.255.0
DNS1=114.114.114.114
DNS2=8.8.8.8

然后看清楚宿主機正在使用的網卡,修改組態檔,(將物理機網卡橋到橋接網卡)
[root@kvm-server network-scripts]# cp ifcfg-enp0s25 ifcfg-enp0s25.back
[root@kvm-server network-scripts]# vim ifcfg-enp0s25
NAME=enp0s25   #定義網卡設備名稱
DEVICE=enp0s25   #宿主機正在使用的網卡設備
ONBOOT=yes
BRIDGE=br0     #和ifcfg-br0檔案里面的設備對應,新添加
  
2.重啟libvirtd服務
[root@kvm-server network-scripts]# systemctl restart libvirtd 
3.重啟network服務 
[root@kvm-server network-scripts]# systemctl restart network     

然后去查看有沒有新設備生成

洗掉橋接網卡步驟:
1.洗掉br0的組態檔
2.修改正常網卡的組態檔
3.重啟系統

[root@kvm-server network-scripts]# mv ifcfg-br0 ifcfg-br0.bak
[root@kvm-server network-scripts]# mv ifcfg-enp0s25 ifcfg-enp0s25.bak
[root@kvm-server network-scripts]# mv ifcfg-enp0s25.back ifcfg-enp0s25
[root@kvm-server network-scripts]# systemctl restart libvirtd
[root@kvm-server network-scripts]# systemctl restart network
[root@kvm-server network-scripts]# ping www.baidu.com
PING www.a.shifen.com (39.156.66.14) 56(84) bytes of data.
64 bytes from 39.156.66.14 (39.156.66.14): icmp_seq=1 ttl=52 time=13.3 ms

組態檔方式創建nat網路:

組態檔方式創建nat網路:
[root@kvm-server ~]# cd /etc/libvirt/qemu/networks
[root@kvm-server networks]# ls
autostar default.xml
[root@kvm-server networks]# cp default.xml nat1.xml
[root@kvm-server networks]# vim nat1.xml  

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-GmoJYkfo-1601901684295)(assets/1571986218420.png)]

重啟服務

[root@kvm-server netwoeks]# systemctl  restart libvirtd

在某個(比如vm3)虛擬機去添加此設備測驗

組態檔方式創建isolated網路隔離網路:這個模式我從來沒用過,我們不再操作,有興趣可以操作一下   
[root@kvm-server networks]# cp default.xml isolated200.xml
[root@kvm-server networks]# vim isolated200.xml

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Ws8r3kCb-1601901684300)(assets/1571989161632.png)]

啟動:
[root@kvm-server networks]# systemctl restart libvirtd
開機自啟動:
[root@kvm-server networks]# virsh net-autostart  isolated200
查看所有的網路:
[root@kvm-server networks]# virsh net-list

kvm遷移(了解)

最簡單的方法:
拷貝組態檔,磁盤鏡像檔案
冷遷移:將虛擬機關閉,將虛擬機放到另外一臺宿主機上面


熱遷移----有一個毛病:遷移程序中會暫停虛擬機

			  192.168.1.1/24	            192.168.1.2/24
				++++++++++++            	++++++++++++
				+		   +			    +		    +		
				+    KVM-A  +  =======>     +	KVM-B 	+
				+	    	+			    +	        +	
				++++++++++++				++++++++++++
			images                              images
		/var/lib/libvirt/images	          /var/lib/libvirt/images                   

添加磁盤和記憶體腳本

virsh list --all

查看一個域的資訊

virsh dominfo rhel6
啟動虛擬機
virsh start vhostname

正常關閉虛擬機
virsh shutdown  vhostname

強制關閉虛擬機
virsh destroy vhostname


取消定義一個域
virsh undefine vhostname

//編輯默認虛擬網路組態檔
virsh net-edit default
systemctl restart lirbvirtd

創建一個虛擬磁盤
qemu-img create -f qcow2 /home/virtimg/rhel6.img 10G

改變虛擬磁盤大小
qemu-img resize /home/virtimg/rhel6.img +1G
qemu-img info /home/virtimg/rhel6.img


改變虛擬記憶體的大小
1 設定一個虛擬機的最多使用記憶體,前提是此虛擬機關閉狀態
   這里僅僅會更改組態檔中的設定
virsh setmaxmem centos3 4096M --config

2 啟動虛擬機,當前實際使用的記憶體還是原來的大小
virsh start centos3

3  假如希望增加正在運行中的虛擬機的記憶體,使用如下命令
virsh setmem centos3 2048M
傳檔案到虛擬主機里
virt-install --filesystem /host/soource/dir,/dir/in/virthost

在線添加洗掉硬碟

可以查看虛擬機所有磁盤

virsh domblklist vmname
  • 準備一塊虛擬磁盤
qemu-img create -f qcow2 /path/to/vm1-1.qcow2 2G

在線添加硬碟

  • 首先配置一份磁盤的xml檔案,作為模板

配置需要的引數項,比如:
cache=writeback,io=third

disk_mod.xml
[root@kvm-shark ~]# cat disk_mod.xml
echo "<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2' cache='writeback' io='threads'/>
  <source file='"${vdisk_path}"'/>
  <target dev='"${device_name}"' bus='virtio'/>
</disk>
"

使用模板檔案產生一個新的組態檔片段

[root@shark ~]# vdisk_path=/path/to/vm1-1.qcow2
[root@shark ~]# device_name=vdb
[root@shark ~]# source disk_mod.xml > disk.xml
  • 然后使用attach-device命令添加

attach-device - 從一個XML檔案附加裝置

virsh attach-device vm1 disk.xml --persistent

attach-device [–persistent] [–config] [–live] [–current]
選項
[–domain] domain name, id or uuid
[–file] XML 檔案
--persistent 讓實時更改并且持久生效,
--config 影響下一次引導,域無論是否運行,都可以直接修改組態檔,單獨使用,不會影響當前正確運行中的域
--live 影響運行的域,只能用于域啟動的時候
--current 影響當前域
當前域處于關機狀態下,會直接修改組態檔
當前域處于開機狀態下,不會修改組態檔,臨時生效而已,和單獨使用 --live 一樣,

永久移除vdb磁盤

virsh detach-disk vmname vdb --persistent

自動化找到我們需要創建的硬碟名稱

虛擬硬碟名一般都是 vda vdb vdc, 可以利用 a-z 的連續行找到我們新建磁盤的名稱,

# 目前虛擬機已經存在的盤符

disk_name_w="a b  e f"

declare -A tmp_arr

for i in $disk_name_w
do
    tmp_arr[$i]=1
done

for i in {a..z}
do
   w=${tmp_arr[$i]}
   if [ -z "$w" ];then
       disk_name=vd$i
      echo "磁盤名稱是$disk_name"
      break
   fi
done

八、自動化腳本管理kvm

#!/bin/bash
#kvm batch create vm tool
#version:0.1
#author:name
#需要事先準備模板鏡像和組態檔模板

echo "1.創建自定義配置單個虛擬機
2.批量創建自定義配置虛擬機
3.批量創建默認配置虛擬機
4.洗掉虛擬機"

read -p "選取你的操作(1/2/3):" op

batch_self_define() {

        kvmname=`openssl rand -hex 5`

        sourceimage=/var/lib/libvirt/images/vmmodel.img
        sourcexml=/etc/libvirt/qemu/vmmodel.xml

        newimg=/var/lib/libvirt/images/${kvmname}.img
        newxml=/etc/libvirt/qemu/${kvmname}.xml

        cp $sourceimage  $newimg
        cp $sourcexml $newxml

        kvmuuid=`uuidgen`
        kvmmem=${1}000000
        kvmcpu=$2
        kvmimg=$newimg
        kvmmac=`openssl rand -hex 3 | sed -r 's/..\B/&:/g'`

        sed -i "s@kvmname@$kvmname@;s@kvmuuid@$kvmuuid@;s@kvmmem@$kvmmem@;s@kvmcpu@$kvmcpu@;s@kvmimg@$kvmimg@;s@kvmmac@$kvmmac@" $newxml
        virsh define $newxml
        virsh list --all
}
self_define() {
        read -p "請輸入新虛機名稱:" newname
        read -p "請輸入新虛機記憶體大小(G):" newmem
        read -p "請輸入新虛機cpu個數:" newcpu

        sourceimage=/var/lib/libvirt/images/vmmodel.img
        sourcexml=/etc/libvirt/qemu/vmmodel.xml

        newimg=/var/lib/libvirt/images/${newname}.img
        newxml=/etc/libvirt/qemu/${newname}.xml

        cp $sourceimage  $newimg
        cp $sourcexml $newxml

        kvmname=$newname
        kvmuuid=`uuidgen`
        kvmmem=${newmem}000000
        kvmcpu=$newcpu
        kvmimg=$newimg
        kvmmac=`openssl rand -hex 3 | sed -r 's/..\B/&:/g'`

        sed -i "s@kvmname@$kvmname@;s@kvmuuid@$kvmuuid@;s@kvmmem@$kvmmem@;s@kvmcpu@$kvmcpu@;s@kvmimg@$kvmimg@;s@kvmmac@$kvmmac@" $newxml
        virsh define $newxml
        virsh list --all
}

case $op in
1)self_define;;
2)
        read -p "請輸入要創建的虛擬機的個數:" num
        read -p "請輸入新虛機記憶體大小(G):" newmem
        read -p "請輸入新虛機cpu個數:" newcpu

        for((i=1;i<=$num;i++))
        do
                batch_self_define $newmem $newcpu
        done;;

3)
        read -p "請輸入要創建的虛擬機的個數:" num

        for((i=1;i<=$num;i++))
        do
                batch_self_define 1 1
        done;;

*)echo "輸入錯誤,請重新執行腳本"
  exit;;
esac

組態檔模板

# vim /etc/libvirt/qemu/vmmodel.xml
<domain type='kvm'>
  <name>kvmname</name>
  <uuid>kvmuuid</uuid>
  <memory unit='KiB'>kvmmem</memory>
  <currentMemory unit='KiB'>kvmmem</currentMemory>
  <vcpu placement='static'>kvmcpu</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='custom' match='exact' check='partial'>
    <model fallback='allow'>Haswell-noTSX</model>
  </cpu>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='kvmimg'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='virtio-serial' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </controller>
    <interface type='network'>
      <mac address='52:54:00:kvmmac'/>
      <source network='default'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='unix'>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </memballoon>
  </devices>
</domain>

B:字母數字與字母數字分割,非字母數字與非字母數字分割

&:表示原來的內容

隨機生成mac地址

其中方式如下:
# echo `openssl rand -hex 1`:`openssl rand -hex 1`:`openssl rand -hex 1`
99:6e:67

# openssl rand -hex 3 | sed -r 's/(..)(..)(..)/\1:\2:\3/g'
94:89:e3

# openssl rand -hex 3 | sed -r 's/..\B/&:/g'
c5:66:90

Centos設定輸入法

管理 KVM 虛擬機

列出所有的虛擬機

virsh list --all

查看一個域的資訊

virsh dominfo rhel6
啟動虛擬機
virsh start vhostname

正常關閉虛擬機
virsh shutdown  vhostname

強制關閉虛擬機
virsh destroy vhostname


取消定義一個域
virsh undefine vhostname

//編輯默認虛擬網路組態檔
virsh net-edit default
systemctl restart lirbvirtd

創建一個虛擬磁盤
qemu-img create -f qcow2 /home/virtimg/rhel6.img 10G

改變虛擬磁盤大小
qemu-img resize /home/virtimg/rhel6.img +1G
qemu-img info /home/virtimg/rhel6.img


改變虛擬記憶體的大小
1 設定一個虛擬機的最多使用記憶體,前提是此虛擬機關閉狀態
   這里僅僅會更改組態檔中的設定
virsh setmaxmem centos3 4096M --config

2 啟動虛擬機,當前實際使用的記憶體還是原來的大小
virsh start centos3

3  假如希望增加正在運行中的虛擬機的記憶體,使用如下命令
virsh setmem centos3 2048M
傳檔案到虛擬主機里
virt-install --filesystem /host/soource/dir,/dir/in/virthost

在線添加洗掉硬碟

可以查看虛擬機所有磁盤

virsh domblklist vmname
  • 準備一塊虛擬磁盤
qemu-img create -f qcow2 /path/to/vm1-1.qcow2 2G

在線添加硬碟

  • 首先配置一份磁盤的xml檔案,作為模板

配置需要的引數項,比如:
cache=writeback,io=third

disk_mod.xml
[root@kvm-shark ~]# cat disk_mod.xml
echo "<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2' cache='writeback' io='threads'/>
  <source file='"${vdisk_path}"'/>
  <target dev='"${device_name}"' bus='virtio'/>
</disk>
"

使用模板檔案產生一個新的組態檔片段

[root@shark ~]# vdisk_path=/path/to/vm1-1.qcow2
[root@shark ~]# device_name=vdb
[root@shark ~]# source disk_mod.xml > disk.xml
  • 然后使用attach-device命令添加

attach-device - 從一個XML檔案附加裝置

virsh attach-device vm1 disk.xml --persistent

attach-device [–persistent] [–config] [–live] [–current]
選項
[–domain] domain name, id or uuid
[–file] XML 檔案
--persistent 讓實時更改并且持久生效,
--config 影響下一次引導,域無論是否運行,都可以直接修改組態檔,單獨使用,不會影響當前正確運行中的域
--live 影響運行的域,只能用于域啟動的時候
--current 影響當前域
當前域處于關機狀態下,會直接修改組態檔
當前域處于開機狀態下,不會修改組態檔,臨時生效而已,和單獨使用 --live 一樣,

永久移除vdb磁盤

virsh detach-disk vmname vdb --persistent

自動化找到我們需要創建的硬碟名稱

虛擬硬碟名一般都是 vda vdb vdc, 可以利用 a-z 的連續行找到我們新建磁盤的名稱,

# 目前虛擬機已經存在的盤符
disk_name_w="vda vdb  vdc vde"

declare -A tmp_arr

for i in $disk_name_w
do
    tmp_arr[$i]=1
done


for i in {a..z}
do
   w=${tmp_arr[vd$i]}
   if [ -z "$w" ];then
       disk_name=vd$i
      echo "磁盤名稱是$disk_name"
      break
   fi
done

virt-install

下面是命令列方式創建虛擬磁盤的

qemu-img create -f qcow2 /home/kvm/data/kube-master.qcow2 50G

一、 安裝kvm 虛擬機的腳本

install-virtualhost.sh
#!/usr/bin/env bash
set -ue
set -o pipefail

# 創建相關目錄
ls /home/kvm/{ks,virtualhost,virtual-img} 1>/dev/null 2>&1 || mkdir -p /home/kvm/{ks,virtualhost,virtual-img}


# 此程式的變數
KVM_HOME=/home/kvm
KVM_ISO=${KVM_HOME}/iso/CentOS-7-x86_64-Minimal.iso
KVM_KS_FILE=${KVM_HOME}/ks/ks.cfg
KVM_IMG_DIR=${KVM_HOME}/virtual-img
KVM_HOST_DIR=${KVM_HOME}/virtualhost

OS_TYPE="linux"
DEF_OS_VARIANT="rhel7"
DEF_VM_NAME="centos$(date +%Y%m%dT%H%M%S)"

# 設定默認記憶體大小 1024 M,這個單位是固定的 M,不支持其他單位
DEF_MEM_SIZE=1024
DEF_VCPUS=1
DEF_DISK_SIZE=10G

#  互動式安裝
echo  "輸入將要創建的KVM虛擬機名稱,不是主機名哦"
read -p "默認值${DEF_VM_NAME}>>:" VM_NAME


echo  "輸入將要創建的服務器主機名"
read -p "默認 localhost>>:"  HOST_NAME

read -p "輸入虛擬機 CPU 核心數默認 1 示例:2>>:" VCPUS

echo "輸入虛擬機記憶體大小,默認1024M,不支持其他單位"
read -p "只需要添數字即可>>:" MEM_SIZE

echo "輸入虛擬機使用的磁盤容量"
read -p "默認 10G,[示例寫法:15G]>>:"  DISK_SIZE


# 變數替換, 假如沒有輸入值, 就使用默認值
VM_NAME=${VM_NAME:-$DEF_VM_NAME}
HOST_NAME=${HOST_NAME:-localhost.localdomain}

VCPUS=${VCPUS:-$DEF_VCPUS}
MEM_SIZE=${MEM_SIZE:-$DEF_MEM_SIZE}
DISK_SIZE=${DISK_SIZE:-$DEF_DISK_SIZE}
OS_VARIANT=${OS_VARIANT:-$DEF_OS_VARIANT}

new_disk=${KVM_IMG_DIR}/${VM_NAME}.qcow2


if [[ ! "${DISK_SIZE}" =~ G$ ]] || [[ ! "${DISK_SIZE::-1}" =~ ^[0-9]+$ ]]
then
    echo "格式不正確,正確示例:20G"
    exit
fi


if [ ! -f "${new_disk}" ];then
    qemu-img create -f qcow2 ${new_disk} ${DISK_SIZE}
fi


# 開始創建

virt-install -v \
     --arch x86_64 --virt-type kvm \
     --name ${VM_NAME} \
     --memory ${MEM_SIZE} \
     --vcpus ${VCPUS} \
     --os-type ${OS_TYPE} \
     --location ${KVM_ISO} \
     --network default \
     --graphics none \
     --os-variant     ${OS_VARIANT} \
     --initrd-inject  "${KVM_KS_FILE}" \
     --extra-args     "ks=file:/ks.cfg  \
                       console=tty0 console=ttyS0,115200n8 \
                       hostname=${HOST_NAME}" \
     --disk ${new_disk},cache=writeback,io=threads,bus=virtio

# 橋接模式,前提是你已經建立好了網橋
#     --network bridge=virbr0 --network bridge=docker0 \


# end

引數說明:

  • --arch 指定平臺架構
  • --virt-type 虛擬化型別 kvm 是最佳選擇
  • --name 虛擬機名稱
  • --memory 記憶體大小
  • --vcpus cpu 核心數
  • --os-type 作業系統型別
  • --os-variant 發行版本,必須是 virt-install 規定好的
  • --network 網路型別 default 是 NAT 型別的網路
  • --graphics 是否使用 vnc 這個的 none 意思是不使用
  • --location ISO 鏡像檔案路徑
  • --initrd-inject 內核注入,指定一個 ks.cfg 檔案的路徑,會把此檔案主人到跟目錄下
  • --extra-args 額外的引數
    • ks=file:/ks.cfg 這個值不要變
    • console=ttyS0 表示使用 console 口控制服務器
  • --disk 指定虛擬硬碟檔案路徑

二、使用KICKSTART自動化安裝

  1. 安裝工具包,定制并獲取到 ks.cfg 檔案
yum -y install system-config-kickstart
system-config-kickstart
  1. 驗證自定義的 Kickstart 檔案

在創建或自定義Kickstart檔案時,在嘗試在安裝中使用它之前驗證它是否有效很有用,紅帽企業Linux 7包含ksvalidator命令列實用程式,可用于執行此操作,該工具是pykickstart軟體包的一部分,要安裝此軟體包,請用 root 執行以下命令:

 yum install pykickstart

安裝軟體包后,可以使用以下命令驗證Kickstart檔案:

ksvalidator /path/to/kickstart.ks

/path/to/kickstart.ks 替換為要驗證的Kickstart檔案的路徑,

重要

請記住,驗證工具有其局限性,Kickstart檔案可能非常復雜,ksvalidator可以確保語法正確并且檔案不包含不建議使用的選項,但是不能保證安裝成功,它也不會嘗試驗證的%pre,%post并且%packagesKickstart檔案的各個部分,

  1. ks.cfg 示例
#platform=x86, AMD64, 或 Intel EM64T
#version=DEVEL
# Install OS instead of upgrade
install
# Keyboard layouts
keyboard 'us'
# Root password
rootpw --iscrypted $1$KXeyOPUO$5JlUe3pPpi.hplHB71JdX/
# 系統語言
#lang zh_CN.UTF-8
lang en_US

# System authorization information
auth  --useshadow  --passalgo=sha512
# Use CDROM installation media
#cdrom

# Use text mode install
# 使用字符界面安裝作業系統
text

# Do not configure the X Window System
# 不配置圖形界面系統
skipx

# SELinux configuration
selinux --disabled

# Firewall configuration
firewall --disabled

# 設定動態獲取 IP
network  --bootproto=dhcp --device=eth0 --onboot=on
network  --hostname=HOSNAME

# 設定靜態 IP
# network  --bootproto=static --device=eth0 --gateway=192.168.122.1 --ip=192.168.122.100 --nameserver=192.168.122.1 --netmask=255.255.255.0 --activate

# 系統安裝完成后 重啟系統
#halt
reboot

# System timezone 系統時區
timezone Asia/Shanghai

# System services  系統啟動時候自動啟動的服務
services --enable="chronyd"

# System bootloader configuration
#系統啟動引導方式 vda 是kvm 虛擬機時候的第塊磁盤名稱
bootloader --location=mbr --boot-drive=vda

# 清除主引導記錄
zerombr

# 洗掉原來的磁區和磁盤標簽
clearpart --all --initlabel

# 磁盤磁區資訊,這里采用的是 lvm 自動磁區
autopart --type=lvm

# 下面是自定義磁區
#part /boot --fstype="xfs" --ondisk=vda --size=200
#part / --fstype="xfs" --ondisk=vda --size=10040
#part /var --fstype="xfs" --ondisk=vda --size=2048
#part /home --fstype="xfs" --ondisk=vda --size=2048

# 安裝軟體
%packages
@^minimal
@core
chrony
%end

# 禁用 kdump
%addon com_redhat_kdump --disable --reserve-mb='auto'

%end

# 安裝系統完成后執行的命令腳本
%post --interpreter=/bin/bash
yum install -y epel-release bash-completion vim-enhanced wget
yum group install "Development Tools" -y
%end

# 用戶密碼策略
%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end

注意:

  • 由于安裝源直接在virt-install 命令中指定,因此ks檔案中沒有安裝源配置項
    install

Keyboard layouts

keyboard ‘us’

Root password

rootpw --iscrypted 1 1 1KXeyOPUO$5JlUe3pPpi.hplHB71JdX/

系統語言

#lang zh_CN.UTF-8
lang en_US

System authorization information

auth --useshadow --passalgo=sha512

Use CDROM installation media

#cdrom

Use text mode install

使用字符界面安裝作業系統

text

Do not configure the X Window System

不配置圖形界面系統

skipx

SELinux configuration

selinux --disabled

Firewall configuration

firewall --disabled

設定動態獲取 IP

network --bootproto=dhcp --device=eth0 --onboot=on
network --hostname=HOSNAME

設定靜態 IP

network --bootproto=static --device=eth0 --gateway=192.168.122.1 --ip=192.168.122.100 --nameserver=192.168.122.1 --netmask=255.255.255.0 --activate

系統安裝完成后 重啟系統

#halt
reboot

System timezone 系統時區

timezone Asia/Shanghai

System services 系統啟動時候自動啟動的服務

services --enable=“chronyd”

System bootloader configuration

#系統啟動引導方式 vda 是kvm 虛擬機時候的第塊磁盤名稱
bootloader --location=mbr --boot-drive=vda

清除主引導記錄

zerombr

洗掉原來的磁區和磁盤標簽

clearpart --all --initlabel

磁盤磁區資訊,這里采用的是 lvm 自動磁區

autopart --type=lvm

下面是自定義磁區

#part /boot --fstype=“xfs” --ondisk=vda --size=200
#part / --fstype=“xfs” --ondisk=vda --size=10040
#part /var --fstype=“xfs” --ondisk=vda --size=2048
#part /home --fstype=“xfs” --ondisk=vda --size=2048

安裝軟體

%packages
@^minimal
@core
chrony
%end

禁用 kdump

%addon com_redhat_kdump --disable --reserve-mb=‘auto’

%end

安裝系統完成后執行的命令腳本

%post --interpreter=/bin/bash
yum install -y epel-release bash-completion vim-enhanced wget
yum group install “Development Tools” -y
%end

用戶密碼策略

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end


> ### 注意:
>
> - 由于安裝源直接在virt-install 命令中指定,因此ks檔案中沒有安裝源配置項
> - 由于安裝的是虛擬機,而kvm中中qemu-img創建的磁盤,在kvm中默認識別為vda、vdb...之類的磁盤,因此ks檔案中,不能再像安裝物理機一樣指定為sda、sdb之類的磁盤

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/160945.html

標籤:其他

上一篇:appium桌面工具一篇輕松搞定

下一篇:鏈接命令

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more