企业私有云容器化架构
什么是虚拟化:
虚拟化(Virtualization)技术最早出现在 20 世纪 60 年代的 IBM 大型机系统,在70年代的 System 370 系列中逐渐流行起来,这些机器通过一种叫虚拟机监控器(Virtual Machine Monitor,VMM)的程序在物理硬件之上生成许多可以运行独立操作系统软件的虚拟机(Virtual Machine)实例。随着近年多核系统、集群、网格甚至云计算的广泛部署,虚拟化技术在商业应用上的优势日益体现,不仅降低了 IT 成本,而且还增强了系统安全性和可靠性。
常用的虚拟化产品有哪些
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之前所有版本默认用的虚拟化产品)
虚拟化技术的分类:
平台虚拟化(Platform Virtualization),针对计算机和操作系统的虚拟化//针对计算机操作系统。 资源虚拟化(Resource Virtualization),针对特定的系统资源的虚拟化,比如内存、存储、网络资源等。 应用程序虚拟化(Application Virtualization),包括仿真、模拟、解释技术等。把硬件的东西变成了一个应用
我们通常所说的虚拟化主要是指平台虚拟化技术,通过使用控制程序(Control Program,也被称为 Virtual Machine Monitor(虚拟监控器VMM) 或Hypervisor,隐藏特定计算平台的实际物理特性,为用户提供抽象的、统一的、模拟的计算环境(称为虚拟机)。
平台虚拟化类型
操作系统虚拟化
常见的操作系统叫openvz,他的特点是所有虚拟机共享你宿主机的内核。
全虚拟化(Full Virtualization):
全虚拟化是指虚拟机模拟了完整的底层硬件,包括处理器、物理内存、时钟、外设等,使得为原始硬件设计的操作系统或其它系统软件完全不做任何修改就可以在虚拟机中运行。
现在的kvm与vmware都支持全虚拟化
全虚拟化的运行速度要快于硬件模拟,但是性能方面不如裸机,因为Hypervisor需要占用一些资源
半虚拟化(Para Virtualization):
半虚拟化(也叫超虚拟化)是另一种类似于全虚拟化的技术,它使用Hypervisor分享存取底层的硬件,但是它的guest操作系统集成了虚拟化方面的代码。因为操作系统自身能够与虚拟进程进行很好的协作。
半虚拟化需要guest操作系统做一些修改,使guest操作系统意识到自己是处于虚拟化环境的,但是半虚拟化提供了与原操作系统相近的性能。
硬件辅助虚拟化
硬件辅助虚拟化是指借助硬件(主要是主机处理器)的支持来实现高效的全虚拟化。
企业级虚拟化与桌面级虚拟化的区别
桌面级虚拟化:
App ---在安装APP,通过App实现各种功能
guestos ---客户机也叫客户操作系统
vmware-workstation(hypervisor(虚拟机管理程序)+图形管理工具)
os
硬件企业级虚拟化
App(图形管理工具)
guestos
os+hypervisor:在操作系统级别加上了虚拟机管理程序
硬件
KVM虚拟化技术简介
KVM 针对运行在 x86 硬件上的、驻留在内核中的虚拟化基础结构。KVM 是第一个成为原生 Linux 内核(2.6.20)的一部分的 hypervisor,它是由 Avi Kivity 开发和维护的,现在归 Red Hat 所有。KVM 是作为内核模块实现的
KVM安装
kvm虚拟化平台软件一般装在操作系统为Centos上面
大家不想把电脑装为Centos的操作系统,可以用VMware workstations装一台配置较高的虚拟机(cpu、内存、磁盘)给的尽可能最大,然后需要在开启之前做如下操作
然后打开虚拟机,安装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 -y librbd1-devel qemu-kvm libvirt virt-manager virt-installqemu-kvm : 主包
libvirt:api接口
virt-manager:图形化界面在所谓的kvm技术中,应用到的其实有2个东西:qemu+kvm
kvm负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm不能模拟其他设备;
qemu是模拟IO设备(网卡,磁盘),kvm加上qemu之后就能实现真正意义上服务器虚拟化。
因为用到了上面两个东西,所以一般都称之为qemu-kvm。
libvirt则是调用kvm虚拟化技术的接口用于管理的,用libvirt管理方便,直接用qemu-kvm的接口太繁琐。5.启动服务:
centos7:
[root@kvm-server ~]# systemctl start libvirtd
6.查看kvm模块加载:
[root@kvm-server ~]# lsmod | grep kvm
kvm_intel 188644 0
kvm 621480 1 kvm_intel
irqbypass 13503 1 kvm
如果看到有这两行,说明支持kvm模块
KVM gustos图形方式部署安装虚拟机---需要掌握
[root@kvm-server ~]# virt-manager
====================
下面就是点点点安装完成一台虚拟机之后,网络模式默认是NAT的。
完全文本方式安装虚拟机
[root@kvm-server ~]# yum install -y vsftpd #安装ftp,并配置最后将镜像上传到ftp中
[root@kvm-server ~]# systemctl start vsftpd
[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没问题。kvm 限制:内存不低于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 无图形,文本模式
注意:命令敲下去,不要误操作退出安装
需要等一会了大约20分钟左右
按空格退出!
下面的操作根据提示点点就可以了
模板镜像+配置文件 方式安装虚拟机---需要掌握
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 --allId 名称 状态
----------------------------------------------------- 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 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 vm3
域 vm3标记为自动开始[root@kvm-server ~]# ls /etc/libvirt/qemu/autostart/ //此目录默认不存在,在有开机启动的虚拟机时自动创建
vm3.xml关闭开机启动
[root@kvm-server ~]# virsh autostart --disable vm3
域 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]# virsh define /etc/libvirt/qemu/vm3.xml
[root@kvm-server qemu]# systemctl restart libvirtd
[root@kvm-server qemu]# virsh list --allId 名称 状态
----------------------------------------------------6 centos7.0 running- vm3 关闭
[root@kvm-server qemu]# virsh start vm3
可以看到我们新添加的磁盘vdb
然后可以正常分区,制作文件系统,进行挂载
创建磁盘
qemu-img create -f qcow2 /var/lib/libvirt/images/vm11-1.img 5G
添加磁盘
virsh attach-disk vm11 /var/lib/libvirt/images/vm11-1.img vdc --driver qemu --subdriver qcow2 --config查看磁盘信息
[root@kvm-sever libvirt]# virsh domblklist vm11
Target Source
------------------------------------------------
vda /var/lib/libvirt/images/vm11.img
vdb /var/lib/libvirt/images/vm11-1.img
提示:不论使用哪种方式,都需要先关闭虚拟机
虚拟机克隆
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 --allId 名称 状态
----------------------------------------------------- vm2 关闭- vm2-clone 关闭- vm3 关闭- vm5 关闭- vm6 关闭
kvm高级命令
建立虚拟机磁盘镜像文件:
磁盘镜像文件格式:
qed ----不用了raw 原始格式,性能最好 直接占用你一开始给多少 系统就占多少 不支持快照qcow 先去网上了解一下cow(写时拷贝copy on write) ,性能远不能和raw相比,所以很快夭折了,所以出现了qcow2(性能低下 早就被抛弃)qcow2 性能上还是不如raw,但是raw不支持快照,qcow2支持快照。现在默认安装好的用的是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网络配置
两种网络
nat与isolate()
NAT default方式:支持主机与虚拟机互访,虚拟机访问外界网络,但不支持外界访问虚拟机。
isolate 隔离,host-host-only:仅主机模式。外网不能访问虚拟机,虚拟机也不能访问外网
一种接口 --- bridge桥接
nat网络
桥接网络
隔离网络
可以通过查看mac地址是否一致来确定是不是一根线上的两个接口
[root@kvm-server ~]# brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.525400831963 yes virbr0-nicvnet0vnet1注意:这里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 #宿主的网关
NETMASK=255.255.255.0
DNS1=114.144.144.144
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
# 虚拟机使用桥接: 文本模式
vim 编辑虚拟机配置文件<interface type='bridge'><mac address='52:54:00:2e:c1:7a'/><source bridge='br0'/><model type='virtio'/><address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/></interface>
然后去查看有没有新设备生成
可以看到,我们先添加的网卡设备
移除操作
删除桥接网卡步骤:
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
[root@kvm-server netwoeks]# systemctl restart libvirtd
在某个(比如vm3)虚拟机去添加此设备测试
配置文件方式创建isolated网络(host-only):host-only模式我从来没用过,我们不再操作,有兴趣可以操作一下
[root@kvm-server networks]# cp default.xml isolated200.xml
[root@kvm-server networks]# vim isolated200.xml
启动:
[root@kvm-server networks]# systemctl restart libvirtd
开机自启动:
[root@kvm-server networks]# virsh net-autostart isolated200
查看所有的网络:
[root@kvm-server networks]# virsh net-list
KVM存储配置
存储池
概念:kvm必须要配置一个目录当作他存储磁盘镜像(存储卷)的目录,我们称这个目录为存储池kvm默认存储池的位置:/var/lib/libvirt/images/ 1.创建基于文件夹的存储池(目录,可自定义)
[root@kvm-server ~]# mkdir -p /data/vmfs2.定义存储池与其目录
[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 --allName 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注1:KVM存储池主要是体现一种管理方式,可以通过挂载存储目录,lvm逻辑卷的方式创建存储池,虚拟机存储卷创建完成后,剩下的操作与无存储卷的方式无任何区别了。
注2:KVM存储池也要用于虚拟机迁移任务。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 rawraw
使用文件来模拟实际的硬盘(当然也可以使用一块真实的硬盘或一个分区)。由于原生的裸格式,不支持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.1lazy 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.1lazy 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 runningvm2-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 runningvm2-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迁移(了解)
最简单的方法:
拷贝配置文件,磁盘
热迁移192.168.1.1/24 192.168.1.2/24++++++++++++ +++++++++++++ + + + + KVM-A + =======> + KVM-B ++ + + + ++++++++++++ ++++++++++++images images/var/lib/libvirt/images /var/lib/libvirt/images
自动化脚本管理kvm
#!/bin/bash
#kvm batch create vm tool
#version:0.1
#author:name
#需要事先准备模板镜像和配置文件模板
echo "1.创建自定义配置单个虚拟机
2.批量创建自定义配置虚拟机
3.批量创建默认配置虚拟机
4.删除虚拟机"read -p "选取你的操作(1/2/3):" opbatch_self_define() {kvmname=`openssl rand -hex 5`sourceimage=/var/lib/libvirt/images/vmmodel.imgsourcexml=/etc/libvirt/qemu/vmmodel.xmlnewimg=/var/lib/libvirt/images/${kvmname}.imgnewxml=/etc/libvirt/qemu/${kvmname}.xmlcp $sourceimage $newimgcp $sourcexml $newxmlkvmuuid=`uuidgen`kvmmem=${1}000000kvmcpu=$2kvmimg=$newimgkvmmac=`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@" $newxmlvirsh define $newxmlvirsh list --all
}
self_define() {read -p "请输入新虚机名称:" newnameread -p "请输入新虚机内存大小(G):" newmemread -p "请输入新虚机cpu个数:" newcpusourceimage=/var/lib/libvirt/images/vmmodel.imgsourcexml=/etc/libvirt/qemu/vmmodel.xmlnewimg=/var/lib/libvirt/images/${newname}.imgnewxml=/etc/libvirt/qemu/${newname}.xmlcp $sourceimage $newimgcp $sourcexml $newxmlkvmname=$newnamekvmuuid=`uuidgen`kvmmem=${newmem}000000kvmcpu=$newcpukvmimg=$newimgkvmmac=`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@" $newxmlvirsh define $newxmlvirsh list --all
}case $op in
1)self_define;;
2)read -p "请输入要创建的虚拟机的个数:" numread -p "请输入新虚机内存大小(G):" newmemread -p "请输入新虚机cpu个数:" newcpufor((i=1;i<=$num;i++))dobatch_self_define $newmem $newcpudone;;3)read -p "请输入要创建的虚拟机的个数:" numfor((i=1;i<=$num;i++))dobatch_self_define 1 1done;;*)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>
随机生成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设置输入法
虚拟机开启虚拟化无法启动
Win10系统下提示VMware与Device/Credential Guard不兼容如何解决-win7之家
kvm 无法安装虚拟机解决
1、查看安装的kvm主包
2、出现异常解决办法
方法1、
将问题包[带有ev的包卸载掉],然后重新安装,但是这里存在一个问题,可能在重装的时候还是会将ev的包进行安装,这时候我们选择第二种方法方法2、
使用文档上面的卸载语句将kvm全部卸载
[root@kvm-server ~]# yum remove `rpm -qa | egrep 'qemu|virt|kvm'` -y
[root@kvm-server ~]# rm -rf /var/lib/libvirt /etc/libvirt/
然后重新安装kvm,并检查是否带有ev字样。
相关文章:
企业私有云容器化架构
什么是虚拟化: 虚拟化(Virtualization)技术最早出现在 20 世纪 60 年代的 IBM 大型机系统,在70年代的 System 370 系列中逐渐流行起来,这些机器通过一种叫虚拟机监控器(Virtual Machine Monitor,VMM&#x…...
SpringBoot+modbus4j实现ModebusTCP通讯读取数据
场景 Windows上ModbusTCP模拟Master与Slave工具的使用: Windows上ModbusTCP模拟Master与Slave工具的使用-CSDN博客 Modebus TCP Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。 1996年施耐德公司推出基于以太网TCP/IP的Modbus协议&…...
Linux性能优化全景指南
Part1 Linux性能优化 1、性能优化性能指标 高并发和响应快对应着性能优化的两个核心指标:吞吐和延时 应用负载角度:直接影响了产品终端的用户体验系统资源角度:资源使用率、饱和度等 性能问题的本质就是系统资源已经到达瓶颈,但…...
树莓派 ubuntu20.04下 python调讯飞的语音API,语音识别和语音合成
目录 1.环境搭建2.去讯飞官网申请密钥3.语音识别(sst)4.语音合成(tts)5.USB声卡可能报错 1.环境搭建 #环境说明:(尽量在ubuntu下使用, 本次代码均在该环境下实现) sudo apt-get install sox # 安装语音播放软件 pip …...
分布式系统架构设计之分布式系统实践案例和未来展望
分布式系统在过去的几十年里经历了长足的发展,从最初的简单分布式架构到今天的微服务、云原生等先进架构,取得了丰硕的成果。本文将通过实际案例分享分布式系统的架构实践,并展望未来可能的发展方向。 一、实践案例 1、微服务化实践 背景 …...
【办公软件】Excel双坐标轴图表
在工作中整理测试数据,往往需要一个图表展示两个差异较大的指标。比如共有三个数据,其中两个是要进行对比的温度值,另一个指标是两个温度的差值,这个差值可能很小。 举个实际的例子:数据如下所示,NTC检测温…...
彻底理解前端安全面试题(1)—— XSS 攻击,3种XSS攻击详解,建议收藏(含源码)
前言 前端关于网络安全看似高深莫测,其实来来回回就那么点东西,我总结一下就是 3 1 4,3个用字母描述的【分别是 XSS、CSRF、CORS】 一个中间人攻击。当然 CORS 同源策略是为了防止攻击的安全策略,其他的都是网络攻击。除了这…...
UE5.1_AI随机漫游
UE5.1_AI随机漫游 目录 UE5.1_AI随机漫游 AI随机漫游方法 方法1:AI角色蓝图直接写方法...
智慧城市新型基础设施建设综合方案:文件全文52页,附下载
关键词:智慧城市建设方案,智慧城市发展的前景和趋势,智慧城市项目方案,智慧城市管理平台,数字化城市,城市数字化转型 一、智慧城市新基建建设背景 1、城市化进程加速:随着城市化进程的加速&am…...
GitHub Copilot 终极详细介绍
编写代码通常是一项乏味且耗时的任务。现代开发人员一直在寻找新的方法来提高编程的生产力、准确性和效率。 像 GitHub Copilot 这样的自动代码生成工具可以使这成为可能。 GitHub Copilot 到底是什么? GitHub Copilot 于 2021 年 10 月推出,是 GitHub 的…...
LeetCode第63题 - 不同路径 II
题目 解答 class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m obstacleGrid.length;int n obstacleGrid[0].length;if (obstacleGrid[0][0] 1) {return 0;}if (obstacleGrid[m - 1][n - 1] 1) {return 0;}int[][] dp new int[m][n];dp…...
python+django网上银行业务综合管理系统vue_bvj8b
本课题主要研究如何用信息化技术改善传统网上银行综合管理行业的经营和管理模式,简化网上银行综合管理的难度,根据管理实际业务需求,调研、分析和编写系统需求文档,设计编写符合银行需要的系统说明书,绘制数据库结构模…...
【软件工程】走进瀑布模型:传统软件开发的经典之路
🍎个人博客:个人主页 🏆个人专栏: 软件工程 ⛳️ 功不唐捐,玉汝于成 目录 前言: 正文 主要阶段: 优点: 缺点: 应用范围: 结语 我的其他博客 前言&am…...
两个字符串间的最短路径问题 (100%用例)C卷 (JavaPythonNode.jsC语言C++)
给定两个字符串,分别为字符串A与字符串B。例如A字符串为ABCABBA,B字符串为CBABAC可以得到下图m*n的二维数组,定义原点为(0,0),终点为(m,n),水平与垂直的每一条边距离为1,映射成坐标系如下图 从原点(0,0)到(0,A)为水平边,距离为1,从(0,A)到(A,C)为垂直边,距离为1;假设两…...
通过ADB来实现脚本来控制手机
ADB 简介 adb的全称为Android Debug Bridge,安卓调试桥,可以通过调试命令来控制手机,诸如开机,关机等按键控制;或者启动,关闭应用;异或进行触摸模拟. 通过学习adb,可以实现简单的脚本控制,最大的特点是不需要root,对于普通手机都可以进行,帮助我们完成一些简单的重复性事件,…...
机器学习之K-means聚类
概念 K-means是一种常用的机器学习算法,用于聚类分析。聚类是一种无监督学习方法,它试图将数据集中的样本划分为具有相似特征的组(簇)。K-means算法的目标是将数据集划分为K个簇,其中每个样本属于与其最近的簇中心。 以下是K-means算法的基本步骤: 选择簇的数量(K值)…...
SSH 端口转发:如何将服务绑定到本地 IP 地址
在日常工作中,我们经常需要访问位于远程服务器上的服务,如数据库、Web 应用程序或其他类型的服务器。直接访问这些服务可能会因为安全限制或网络配置而变得复杂或不可能。这时,SSH 端口转发就成了我们的得力助手。在本篇博客中,我…...
回归预测 | MATLAB实ZOA-LSTM基于斑马优化算法优化长短期记忆神经网络的多输入单输出数据回归预测模型 (多指标,多图)
回归预测 | MATLAB实ZOA-LSTM基于斑马优化算法优化长短期记忆神经网络的多输入单输出数据回归预测模型 (多指标,多图) 目录 回归预测 | MATLAB实ZOA-LSTM基于斑马优化算法优化长短期记忆神经网络的多输入单输出数据回归预测模型 (…...
python实现图像的二维傅里叶变换——冈萨雷斯数字图像处理
原理 二维傅里叶变换是一种在图像处理中常用的数学工具,它将图像从空间域(我们通常看到的像素排列)转换到频率域。这种变换揭示了图像的频率成分,有助于进行各种图像分析和处理,如滤波、图像增强、边缘检测等。 在数学…...
We are a team - 华为OD统一考试
OD统一考试 题解: Java / Python / C 题目描述 总共有 n 个人在机房,每个人有一个标号 (1<标号<n) ,他们分成了多个团队,需要你根据收到的 m 条消息判定指定的两个人是否在一个团队中,具体的: 消息构成为 a b …...
NFC物联网智慧校园解决方案
近场通信(Near Field Communication,NFC)又称近距离无线通信,是一种短距离的高频无线通信技术,允许电子设备之间进行非接触式点对点数据传输交换数据。这个技术由免接触式射频识别(RFID)发展而来,并兼容 RFID,主要用于…...
鸿蒙系列--组件介绍之容器组件
一、Badge 描述:给其他组件添加标记 子组件:支持单个子组件 1.创建数字标记 Badge(value: {count: number, position?: BadgePosition, maxCount?: number, style: BadgeStyle}) 2.创建字符串标记 Badge(value: {value: string, position?: Badge…...
perl使用find函数踩坑
前言 写了一个脚本可以同时检查多个仿真log文件,并生成html表格。按照文件修改时间从新到旧排序。但是一直无法使用stat函数获取修改时间。 结论:find函数会改变程序执行的当前目录,find(\&process_files, $dir);函数是在$dir目录下运行…...
Java IDEA JUnit 单元测试
JUnit是一个开源的 Java 单元测试框架,它使得组织和运行测试代码变得非常简单,利用JUnit可以轻松地编写和执行单元测试,并且可以清楚地看到哪些测试成功,哪些失败 JUnit 还提供了生成测试报告的功能,报告不仅包含测试…...
深入理解 c++ 函数模板
函数模板是C中的一种强大特性,它允许程序员编写一个可以处理多种数据类型的函数。通过使用模板,我们可以编写一次函数,然后在多种数据类型上使用它,这大大提高了代码的复用性。 1. 基本概念 函数模板是一种参数化类型的工具&…...
系列十二、Linux中安装Zookeeper
一、Linux中安装Zookeeper 1.1、下载安装包 官网:Index of /dist/zookeeper/zookeeper-3.4.11 我分享的链接: 链接:https://pan.baidu.com/s/14Hugqxcgp89f2hqGWDwoBw?pwdyyds 提取码:yyds 1.2、上传至/opt目录 1.3、解…...
k8s之陈述式资源管理
1.kubectl命令 kubectl version 查看k8s的版本 kubectl api-resources 查看所有api的资源对象的名称 kubectl cluster-info 查看k8s的集群信息 kubectl get cs 查看master节点的状态 kubectl get pod 查看默认命名空间内的pod的信息 kubectl get ns 查看当前集群所有的命…...
7天玩转 Golang 标准库之 http/net
在构建web应用时,我们经常需要处理HTTP请求、做网页抓取或者搭建web服务器等任务,而Go语言在这方面为我们提供了强大的内置工具:net/http标准库,它为我们操作和处理HTTP协议提供了便利。 基础用法 一:处理HTTP请求 首…...
钡铼技术集IO数据采集可编程逻辑控制PLC无线4G环保物联网关
背景 数据采集传输对于环保企业进行分析和决策是十分重要的,而实时数据采集更能提升环保生产的执行力度,从而采取到更加及时高效的措施。因此实时数据采集RTU成为环保企业的必备产品之一。 产品介绍 在推进环保行业物联网升级过程中,环保RTU在…...
STM32CubeMX教程10 RTC 实时时钟 - 周期唤醒、闹钟A/B事件和备份寄存器
目录 1、准备材料 2、实验目标 3、实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.1 、时钟树配置 3.1.2、外设参数配置 3.1.3 、外设中断配置 3.2、生成代码 3.2.1、外设初始化函数调用流程 3.2.2、外设中断函数调用流程 3.2.3、添加其他必要代码 4、常用函数 …...
网站备案归/2021年网络营销案例
这段时间没有详细记录,但是很充实,为了宁缺毋滥,记为20小时,主要进行的是项目。...
企业建设门户网站有哪些/成都外贸seo
2019独角兽企业重金招聘Python工程师标准>>> 设CPU初始状态: CS2000H IP0000H 内存中存放的机器码和对应的汇编指令如图: 上图对应的指令执行过程如下: (1)mov ax,6622(2)jmp 1000:3(3)mov ax,0000(4)mov bx,ax(5)jmp bx(6)mov ax…...
网站部署 模板/培训体系
目录 JavaScript介绍 JavaScript基础 JavaScript在HTML中的引入方式 变量 运算符 数组 函数 自定义对象 JavaScript中的事件 常用的事件 事件注册(绑定) DOM模型 Document对象 Document对象中的方法 节点的常用属性和方法 正则表达式(补充&#…...
简单的网站设计模板下载/百度搜索排名优化
React速度很快与其它框架相比,React采取了一种特立独行的操作DOM的方式。它并不直接对DOM进行操作。它引入了一个叫做虚拟DOM的概念,安插在JavaScript逻辑和实际的DOM之间。这一概念提高了Web性能。在UI渲染过程中,React通过在虚拟DOM中的微操…...
佛山企业网站建设服务/网络营销成功的原因
解说linux启动流程 一:概述 关于linux的系统启动流程我们可以从下面图片中的流程一步一步展开,其实linux系统的启动过程中,我们可以比喻为一个接力赛,计算机的不同模块负责这个接力赛中接力棒的交接(为了更好的理解&a…...
做综合医院网站/免费的个人网站html代码
Document.get获取记录数据,或获取根据查询条件筛选后的记录数据函数签名如下:function get(options?: object): Promise参数说明options 为可选参数,是一个如下格式的对象,如传入 success、fail、complete 三者之一,则…...