上传文件至 'MD'

main
diandian 1 year ago
parent c53aa1ba42
commit c766934b96

@ -0,0 +1,587 @@
<h1><center>KVM进阶使用</center></h1>
**作者:行癫(盗版必究)**
------
## 一KVM克隆
#### 1.图形化管理方式
关闭要克隆的虚拟机右键点击虚拟机选择Clone
<img src="D:\行癫kubernetes\虚拟化技术\KVM进阶使用.assets\image-20220711223317768.png" alt="image-20220711223317768" style="zoom:50%;" />
#### 2.字符终端
```shell
[root@localhost ~]# virt-clone -o centos7.0 -n xingdian -f /var/lib/libvirt/images/xingdian.qcow2
Allocating 'xingdian.qcow2' | 10 GB 00:00:03
Clone 'xingdian' created successfully.
注意:
-o需要克隆的虚拟机名字
-n克隆后虚拟机的名字
-f指定克隆后的镜像文件
```
验证:
<img src="D:\行癫kubernetes\虚拟化技术\KVM进阶使用.assets\image-20220711223701321.png" alt="image-20220711223701321" style="zoom:50%;" />
## 二KVM网络
#### 1.NAT网络拓扑
![file://C:\Users\huawei\AppData\Local\Temp\ct_tmp/1.png](D:\行癫kubernetes\虚拟化技术\KVM进阶使用.assets\1.png)
注意:
默认情况下使用的就是NAT网络模式
#### 2.桥接网络拓扑
![file://C:\Users\huawei\AppData\Local\Temp\ct_tmp/1.png](D:\行癫kubernetes\虚拟化技术\KVM进阶使用.assets\1-16575503229552.png)
#### 3.网络相关基本命令
查看一个guest主机的网络接口信息
```shell
[root@localhost ~]# virsh domiflist xingdian
Interface Type Source Model MAC
-------------------------------------------------------
- network default virtio 52:54:00:89:aa:71
```
列出运行网络信息:
```shell
[root@localhost ~]# virsh net-list
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
```
列出网络详细信息:
```shell
[root@localhost ~]# virsh net-info default
Name: default
UUID: cdea1242-f581-4624-86d7-c52629b52774
Active: yes
Persistent: yes
Autostart: yes
Bridge: virbr0
```
导出默认网络信息:
```shell
[root@localhost ~]# virsh net-dumpxml default > default.xml
[root@localhost ~]# cat default.xml
<network>
<name>default</name>
<uuid>cdea1242-f581-4624-86d7-c52629b52774</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:10:80:ce'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
```
生成网络xml文件
```shell
[root@localhost ~]# cp default.xml xingdian.xml
[root@localhost ~]# cat xingdian.xml
<network>
<name>xingdian</name>
<uuid>cdea1242-f581-4624-86d7-c52629b52794</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr1' stp='on' delay='0'/>
<mac address='52:54:00:10:81:ce'/>
<ip address='10.0.1.1' netmask='255.255.255.0'>
<dhcp>
<range start='10.0.1.2' end='10.0.1.254'/>
</dhcp>
</ip>
</network>
```
利用xml生成新的文件
```shell
[root@localhost ~]# virsh net-create xingdian.xml
Network xingdian created from xingdian.xml
```
开启持久化网络:
```shell
[root@localhost ~]# virsh net-define xingdian.xml //利用xml文件开启
Network xingdian defined from xingdian.xml
[root@localhost ~]# virsh net-list
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
diandian active yes yes
xingdian active no yes
```
取消持久化网络:
```shell
[root@localhost ~]# virsh net-undefine xingdian
Network xingdian has been undefined
[root@localhost ~]# virsh net-list
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
diandian active yes yes
xingdian active no no
```
自启动网络:
```shell
[root@localhost ~]# virsh net-autostart --disable diandian
Network diandian unmarked as autostarted
[root@localhost ~]# virsh net-list --all
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
diandian active no yes
xingdian active no no
[root@localhost ~]# virsh net-autostart --network diandian
Network diandian marked as autostarted
[root@localhost ~]# virsh net-list --all
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
diandian active yes yes
xingdian active no no
```
查看虚拟机IP地址
```shell
[root@localhost ~]# virsh dumpxml xingdian | grep mac
<partition>/machine</partition>
<type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
<mac address='52:54:00:89:aa:71'/>
[root@localhost ~]# arp -a | grep 52:54:00:89:aa:71
? (192.168.122.54) at 52:54:00:89:aa:71 [ether] on virbr0
```
#### 4.创建桥接网络
创建桥接网卡br0把br0作为网桥使用绑定enp2s0到br0网桥
```shell
[root@localhost ~]# virsh iface-bridge ens33 br0
```
执行上述命令,实际上就是在/etc/sysconfig/networking-script目录下增加一个虚拟网桥 br0,文件名称为ifcfg-br0
```shell
[root@localhost network-scripts]# cat ifcfg-br0
DEVICE="br0"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO="dhcp"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
DHCPV6C="no"
STP="on"
DELAY="0"
```
查看网卡配置文件
```shell
[root@localhost network-scripts]# cat ifcfg-ens33
DEVICE="ens33"
ONBOOT="yes"
BRIDGE="br0"
```
重启网络:
```shell
[root@localhost network-scripts]# systemctl restart network
```
查看桥接:
```shell
[root@localhost network-scripts]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29f4ba45 yes ens33
vnet1
virbr0 8000.5254001080ce yes virbr0-nic
vnet0
virbr1 8000.5254001081ce yes virbr1-nic
virbr2 8000.525400035e3c yes virbr2-nic
```
使用桥接:
![image-20220712010957461](D:\行癫kubernetes\虚拟化技术\KVM进阶使用.assets\image-20220712010957461.png)
![image-20220712011322733](D:\行癫kubernetes\虚拟化技术\KVM进阶使用.assets\image-20220712011322733.png)
## 三KVM快照
#### 1.图形化方式
![image-20220712011431460](D:\行癫kubernetes\虚拟化技术\KVM进阶使用.assets\image-20220712011431460.png)
#### 2.命令方式
为虚拟机创建快照:
```shell
[root@localhost ~]# virsh snapshot-create-as xingdian xingdian.snap
Domain snapshot xingdian.snap created
```
查看镜像信息:
```shell
[root@localhost ~]# qemu-img info /var/lib/libvirt/images/xingdian.qcow2
image: /var/lib/libvirt/images/xingdian.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.5G
cluster_size: 65536
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK
1 xingdian.snap 248M 2022-07-12 01:16:13 00:40:55.839
Format specific information:
compat: 1.1
lazy refcounts: true
```
虚拟机增加内容,创建快照:
```shell
[root@localhost ~]# touch a.txt
[root@localhost ~]# virsh snapshot-create-as xingdian xingdian.snap2
Domain snapshot xingdian.snap2 created
```
关闭虚拟机,恢复到第一个快照:
```shell
[root@localhost ~]# virsh shutdown xingdian
Domain xingdian is being shutdown
[root@localhost ~]# virsh snapshot-revert xingdian xingdian.snap
```
验证:
```shell
[root@localhost ~]# virsh list
Id Name State
----------------------------------------------------
6 xingdian running
[root@localhost ~]# ssh 192.168.122.54
root@192.168.122.54's password:
Last login: Tue Jul 12 00:56:36 2022 from 192.168.122.1
[root@localhost ~]# ls
anaconda-ks.cfg
```
注意:
没有a.txt代表恢复快照成功
## 四脚本管理KVM
```shell
[root@localhost ~]# cat kvm-manager.sh
#!/bin/bash
#kvm manager
#by xingdian.
#for centos7
images_dir=/var/lib/libvirt/images
xml_dir=/etc/libvirt/qemu
red_col="\e[1;31m"
blue_col="\e[1;34m"
reset_col="\e[0m"
centos6u8_base_img=centos6u8_base.qcow2
centos7u3_base_img=centos7u3_base.qcow2
win7_base_img=win7_base.qcow2
centos6u8_base_xml=centos6u8_base.xml
centos7u3_base_xml=centos7u3_base.xml
win7_base_xml=win7_base.xml
menu() {
cat <<-EOF
+------------------------------------------------+
| |
| ====================== |
| 虚拟机基本管理 v4.0 |
| by xingdian |
| ====================== |
| 1. 安装KVM |
| 2. 安装或重置CentOS-6.8 |
| 3. 安装或重置CentOS-7.3 |
| 4. 安装或重置Windows-7 |
| 5. 删除所有虚拟机 |
| q. 退出管理程序 |
| |
+------------------------------------------------+
EOF
}
kvm_install_hint() {
systemctl libvirtd status &>/dev/null
if [ $? -ne 0 ];then
echo -e "${red_col}未安装KVM软件或未启动libvirtd进程请检查${reset_col}"
continue
fi
}
download_kvm_script() {
wget -O /root/Desktop/virt-manager.desktop ftp://10.18.40.100/kvm/virt-manager.desktop &>/dev/null
wget -O /root/Desktop/Readme.txt ftp://10.18.40.100/kvm/readme.txt &>/dev/null
chmod a+x /root/Desktop/virt-manager.desktop &>/dev/null
wget -O /root/桌面/virt-manager.desktop ftp://10.18.40.100/virt-manager.desktop &>/dev/null
wget -O /root/桌面/Readme.txt ftp://10.18.40.100/kvm/readme.txt &>/dev/null
chmod a+x /root/桌面/virt-manager.desktop &>/dev/null
wget -O /usr/local/sbin/kvm-manager ftp://10.18.40.100/kvm/kvm-manager.sh &>/dev/null
chmod a+x /usr/local/sbin/kvm-manager &>/dev/null
}
conn_test() {
ping -c1 10.18.40.100 &>/dev/null
if [ $? -ne 0 ];then
echo -e "${red_col}无法访问10.18.40.100, 请检查网络或稍后再试!${reset_col}"
echo
exit
fi
}
menu
while :
do
echo -en "${blue_col}请选择相应的操作[1-7], 显示菜单[m]: ${reset_col}"
read choose
case $choose in
1)
conn_test
download_kvm_script
read -p "确认开始安装KVM [y]: " kvm_install
if [ ! "${kvm_install}" = "y" ];then
echo -e "$red_col输入不正确! $reset_col"
continue
fi
rpm -q virt-manager &>/dev/null
if [ $? -ne 0 ];then
echo "开始安装KVM......"
yum -y groupinstall "virtual*"
systemctl start libvirtd
systemctl enable libvirtd
fi
echo "-----------------------------------------------------------"
echo "KVM 安装完成请查看桌面上的Readme文件..."
echo "-----------------------------------------------------------"
;;
2)
conn_test
download_kvm_script
read -p "确认重置CentOS 6.8 虚拟机吗?[y]: " rebuild_centos6u8
if [ ! "${rebuild_centos6u8}" = "y" ];then
echo -e "$red_col输入不正确! $reset_col"
continue
fi
if [ ! -f ${images_dir}/${centos6u8_base_img} ];then
echo "正在下载镜像文件,请稍候......"
wget -O ${images_dir}/${centos6u8_base_img} ftp://10.18.40.100/kvm/base_image/${centos6u8_base_img}
fi
for i in {1..5}
do
vm_name=centos6u8-${i}
vm_uuid=$(uuidgen)
vm_disk=${vm_name}.qcow2
vm_xml=${xml_dir}/${vm_name}.xml
vm_mac="52:54:$(dd if=/dev/urandom count=1 2>/dev/null | md5sum | sed -r 's/^(..)(..)(..)(..).*$/\1:\2:\3:\4/')"
base_xml=${xml_dir}/centos6u8_base.xml
virsh destroy ${vm_name} &>/dev/null
virsh undefine ${vm_name} &>/dev/null
rm -rf ${xml_dir}/${vm_xml}
rm -rf ${images_dir}/${vm_name}.*
#disk
qemu-img create -f qcow2 -b ${images_dir}/${centos6u8_base_img} ${images_dir}/${vm_disk} &>/dev/null
#xml
wget -q ftp://10.18.40.100/kvm/base_xml/${centos6u8_base_xml} -O ${base_xml}
cp ${base_xml} ${vm_xml}
sed -i -r "s#VM_NAME#$vm_name#" ${vm_xml}
sed -i -r "s#VM_UUID#$vm_uuid#" ${vm_xml}
sed -i -r "s#VM_DISK#$vm_disk#" ${vm_xml}
sed -i -r "s#VM_MAC#$vm_mac#" ${vm_xml}
#define
virsh define ${vm_xml} &>/dev/null
echo "虚拟机${vm_name} 重置完成..."
done
;;
3)
conn_test
download_kvm_script
read -p "确认重置所有的CentOS7.3虚拟机吗?[y]: " rebuild_centos7u3
if [ ! "${rebuild_centos7u3}" = "y" ];then
echo -e "$red_col输入不正确! $reset_col"
continue
fi
if [ ! -f ${images_dir}/${centos7u3_base_img} ];then
echo "正在下载镜像文件,请稍候......"
wget -O ${images_dir}/${centos7u3_base_img} ftp://10.18.40.100/kvm/base_image/${centos7u3_base_img}
fi
for i in {1..5}
do
vm_name=centos7u3-${i}
vm_uuid=$(uuidgen)
vm_disk=${vm_name}.qcow2
vm_xml=${xml_dir}/${vm_name}.xml
vm_mac="52:54:$(dd if=/dev/urandom count=1 2>/dev/null | md5sum | sed -r 's/^(..)(..)(..)(..).*$/\1:\2:\3:\4/')"
base_xml=${xml_dir}/centos7u3_base.xml
virsh destroy ${vm_name} &>/dev/null
virsh undefine ${vm_name} &>/dev/null
rm -rf ${xml_dir}/${vm_xml}
rm -rf ${images_dir}/${vm_name}.*
#disk
qemu-img create -f qcow2 -b ${images_dir}/${centos7u3_base_img} ${images_dir}/${vm_disk} &>/dev/null
#xml
wget -q ftp://10.18.40.100/kvm/base_xml/${centos7u3_base_xml} -O ${base_xml}
cp ${base_xml} ${vm_xml}
sed -i -r "s#VM_NAME#$vm_name#" ${vm_xml}
sed -i -r "s#VM_UUID#$vm_uuid#" ${vm_xml}
sed -i -r "s#VM_DISK#$vm_disk#" ${vm_xml}
sed -i -r "s#VM_MAC#$vm_mac#" ${vm_xml}
#define
virsh define ${vm_xml} &>/dev/null
echo "虚拟机${vm_name} 重置完成..."
done
;;
4)
conn_test
download_kvm_script
read -p "确认重置 windows 7 虚拟机吗?[y]: " rebuild_win7
if [ ! "${rebuild_win7}" = "y" ];then
echo -e "$red_col输入不正确! $reset_col"
continue
fi
if [ ! -f ${images_dir}/${win7_base_img} ];then
echo "正在下载镜像文件,请稍候......"
wget -O ${images_dir}/${win7_base_img} ftp://10.18.40.100/kvm/base_image/${win7_base_img}
fi
virsh destroy win7 &>/dev/null
virsh undefine win7 &>/dev/null
rm -rf ${xml_dir}/win7.xml
rm -rf ${images_dir}/win7.qcow2
qemu-img create -f qcow2 -b ${images_dir}/${win7_base_img} ${images_dir}/win7.qcow2 &>/dev/null
wget -q ftp://10.18.40.100/kvm/base_xml/win7_base.xml -O ${xml_dir}/win7.xml
virsh define ${xml_dir}/win7.xml &>/dev/null
echo "虚拟机 windows 重置完成..."
;;
5)
conn_test
download_kvm_script
all_vm=$(virsh list --all |awk '/[0-9]/{print $2}')
echo -en "${red_col}确认删除所有虚拟机吗?[y]:${reset_col} "
read delete_all
if [ ! "${delete_all}" = "y" ];then
echo -e "$red_col放弃删除! $reset_col"
continue
fi
for vm in ${all_vm}
do
virsh destroy $vm &>/dev/null
virsh undefine $vm &>/dev/null
rm -rf ${xml_dir}/${vm}.xml
rm -rf ${images_dir}/${vm}*
echo "已删除虚拟机 $vm"
done
;;
m)
clear
menu
;;
q)
exit
;;
'')
;;
*)
echo "输入错误!"
esac
done
```

@ -0,0 +1,429 @@
<h1><center>KVM部署与使用</center></h1>
**作者:行癫(盗版必究)**
------
## 一KVM安装
#### 1.普通方式安装
查看CPU是否支持VT技术:
```shell
[root@xingdian ~]# cat /proc/cpuinfo | egrep 'vmx|svm'
注意:
vmx是英特尔
svm是AMD
```
安装:
```shell
[root@xingdian ~]# yum install *qemu* *virt* *kvm* -y
```
#### 2.组包方式安装
```shell
[root@xingdian ~]# yum -y groupinstall Virtualization Host
```
#### 3.启动服务
```shell
[root@xingdian ~]# systemctl start libvirtd
[root@xingdian ~]# systemctl enable libvirtd
```
#### 4.查看kvm模块加载
```shell
[root@xingdian ~]# lsmod | grep kvm
kvm_intel 53484 3
kvm 316506 1 kvm_intel
```
#### 5.安装图形化管理工具
```shell
[root@xingdian ~]# yum -y install virt-manager
```
#### 6.使用图形化管理工具
```shell
[root@xingdian ~]# virt-manager
```
<img src="D:\行癫kubernetes\虚拟化技术\KVM部署与使用.assets\image-20220710224049107.png" alt="image-20220710224049107" style="zoom:50%;" />
## 二KVM使用
#### 1.虚拟机的组成部分
虚拟机配置文件:
```shell
[root@xingdian ~]# ls /etc/libvirt/qemu
centos7.0.xml centos7.xml networks
```
储存虚拟机的介质:
```shell
[root@xingdian ~]# ls /var/lib/libvirt/images/
centos7.0.qcow2
```
#### 2.存储池
概念:
kvm必须要配置一个目录当作他存储磁盘镜像(存储卷)的目录,我们称这个目录为存储池
默认存储池:
/var/lib/libvirt/images/
创建基于文件夹的存储池(目录):
```shell
[root@xingdian ~]# mkdir -p /home/vmfs
```
定义存储池与其目录:
```shell
[root@xingdian ~]# virsh pool-define-as vmdisk --type dir --target /home/vmfs/
Pool vmdisk defined
```
创建已定义的存储池:
```shell
[root@xingdian ~]# virsh pool-build vmdisk
Pool vmdisk built
```
查看已定义的存储池,存储池不激活无法使用:
```shell
[root@xingdian ~]# virsh pool-list --all
Name State Autostart
-------------------------------------------
default active yes
vmdisk inactive no
```
激活并自动启动已定义的存储池:
```shell
[root@xingdian ~]# virsh pool-start vmdisk
Pool vmdisk started
[root@xingdian ~]# virsh pool-autostart vmdisk
Pool vmdisk marked as autostarted
```
注意:
这里vmdisk存储池就已经创建好了可以直接在这个存储池中创建虚拟磁盘文件了
在存储池中创建虚拟机存储卷:
```shell
[root@xingdian ~]# virsh vol-create-as vmdisk centos7.qcow2 20G --format qcow2
Vol centos7.qcow2 created
```
根据创建的虚拟机存储卷安装虚拟机:
```shell
[root@xingdian ~]# virt-install --name=centos7 --os-variant=RHEL7 --ram 3000 --vcpus=1 --disk path=/home/vmfs/centos7.qcow2,format=qcow2,size=20,bus=virtio --accelerate --cdrom /home/镜像/CentOS-7-x86_64-Minimal-1708.iso --vnc --vncport=5910 --vnclisten=0.0.0.0 --network=default --noautoconsole
```
注意:
KVM存储池主要是体现一种管理方式可以通过挂载存储目录lvm逻辑卷的方式创建存储池
KVM存储池也要用于虚拟机迁移任务
#### 3.存储池相关管理命令
在存储池中删除虚拟机存储卷:
```shell
[root@xingdian ~]# virsh vol-delete --pool vmdisk oeltest03.qcow2
```
取消激活存储池:
```shell
[root@xingdian ~]# virsh pool-destroy vmdisk
```
删除存储池定义的目录/data/vmfs
```shell
[root@xingdian ~]# virsh pool-delete vmdisk
```
取消定义存储池:
```shell
[root@xingdian ~]# virsh pool-undefine vmdisk
```
注意:
存储池Storage pools是放置虚拟机的存储位置可以是本地的也可以是网络存储本实例放置在卷Volume
在创建卷之前,先要创建存储池,存储池可以建立在好几种方式的存储上,现在主要建立一个基于目录的存储池
#### 4.根据配置文件创建虚拟机
需要有磁盘文件:
```shell
[root@xingdian images]# cp centos7.qcow2 centos7-1.qcow2
```
需要有配置文件:配置文件需要修改必要的东西:
```shell
[root@xingdian qemu]# cp centos7.xml centos7-1.xml
```
修改配置文件:(如下)
创建虚拟机:
```shell
[root@xingdian qemu]# virsh define /etc/libvirt/qemu/centos7-1.xml
```
配置文件:
```shell
[root@xingdian qemu]# vim /etc/libvirt/qemu/centos7-1.xml
<domain type='kvm'>
<name>vm3</name>
<uuid>a2f62549-c6b7-4b8f-a8e2-c14edda35a78</uuid>
<memory unit='KiB'>2099200</memory>
<currentMemory unit='KiB'>2099200</currentMemory>
<vcpu placement='static'>2</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='/var/lib/libvirt/images/vm3.img'/>
<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:f2:28:6f'/>
<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>
```
5.图形化安装虚拟机
<img src="D:\行癫kubernetes\虚拟化技术\KVM部署与使用.assets\image-20220710232445811.png" alt="image-20220710232445811" style="zoom:50%;" />
![image-20220710232523493](D:\行癫kubernetes\虚拟化技术\KVM部署与使用.assets\image-20220710232523493.png)
![image-20220710232621518](D:\行癫kubernetes\虚拟化技术\KVM部署与使用.assets\image-20220710232621518.png)
![image-20220710232657633](D:\行癫kubernetes\虚拟化技术\KVM部署与使用.assets\image-20220710232657633.png)
![image-20220710232718965](D:\行癫kubernetes\虚拟化技术\KVM部署与使用.assets\image-20220710232718965.png)
![image-20220710232748416](D:\行癫kubernetes\虚拟化技术\KVM部署与使用.assets\image-20220710232748416.png)
![image-20220710232850844](D:\行癫kubernetes\虚拟化技术\KVM部署与使用.assets\image-20220710232850844.png)
#### 5.虚拟机基本命令
查看正在运行虚拟机:
```shell
[root@xingdian ~]# virsh list
Id Name State
----------------------------------------------------
2 centos7 running
```
查看所有虚拟机:
```shell
[root@xingdian ~]# virsh list --all
Id Name State
----------------------------------------------------
2 centos7 running
- centos7.0 shut off
```
查看kvm虚拟机配置文件
```shell
[root@xingdian ~]# virsh dumpxml centos7
```
将node4虚拟机的配置文件保存至node6.xml
```shell
[root@xingdian ~]# virsh dumpxml node4 > /etc/libvirt/qemu/node6.xml
```
修改node6的配置文件
```shell
[root@xingdian ~]# virsh edit node6
```
注意:
如果直接用vim编辑器修改配置文件的话需要重启libvirtd服务
启动:
```shell
[root@xingdian ~]# virsh start vm1
Domain vm1 started
```
暂停虚拟机:
```shell
[root@xingdian ~]# virsh suspend vm_name
```
恢复虚拟机:
```shell
[root@xingdian ~]# virsh resume vm_name
```
关闭:
```shell
[root@xingdian ~]# virsh shutdown vm1
Domain vm1 is being shutdown
```
重启:
```shell
[root@xingdian ~]# virsh reboot vm1
Domain vm1 is being reboote
```
重置:
```shell
[root@xingdian ~]# virsh reset vm1
Domain vm1 was reset
```
删除虚拟机:
```shell
[root@xingdian ~]# virsh undefine vm2
Domain vm2 has been undefined
```
注意:
虚拟机在开启的情况下undefine是无法删除的
#### 6.连接虚拟机的方法
使用virt-viewer图形连接已启动的虚拟机
```shell
[root@xingdian ~]# virt-viewer vm1
```
虚拟机开机自动启动:
```shell
[root@xingdian ~]# virsh autostart vm1
```
此目录默认不存在,在有开机启动的虚拟机时自动创建:
```shell
[root@xingdian ~]# ls /etc/libvirt/qemu/autostart/
vm1.xml
```
取消开机启动:
```shell
[root@xingdian ~]# virsh autostart --disable vm1
[root@xingdian ~]# ls /etc/libvirt/qemu/autostart/
```

@ -0,0 +1,143 @@
<h1><center>大型网站架构技术</center></h1>
**作者:行癫(盗版必究)**
------
## 一:大型架构的特点
1.高并发,大流量
goole日均pv数35亿日均IP访问数3亿腾讯QQ的最大在线用户数5.74 亿2021年数据淘宝2012年“双11”活动一天交易额超过191亿活动开始第一分钟独立访问用户达1000万微信以及WeChat的月活跃帐户达到12.6亿等
2.高可用
系统7x24小时不间断服务
3.海量数据
需要存储、管理海量数据需要大量服务器。Facebook每周上传的照片数目接近10亿百度收录的网页数据有数百亿google有近百万台服务器为全球用户提供服务。
4.用户分布广泛,网络情况复杂
许多大型互联网站都是为全球用户提供服务的,用户分布范围广,各地网络情况千差万别。在国内,还有各个运营商网络互通困难的问题
5.安全环境恶劣
由于互联网的开放性,使得互联网站更容易受到攻击,大型网站几乎每天都会被黑客攻击
6.需求快速变更,发布频繁
和传统软件的版本发布频率不同,互联网产品为快速适应市场,满足用户需求,其产品发布频率极高
7.渐进式发展
几乎所有的大型网站都是从一个小网站开始facebook是扎克伯格在哈弗大学的宿舍里开发的google第一台服务器部署在斯坦福大学的实验室里阿里巴巴是在马云家的客厅里诞生的。
## 二:架构演进
#### 1.初始阶段的网站架构
大型网站都是从小型网站发展而来,网站架构也是一样,是从小型网站架构逐步演化而来。小型网站最开始没有太多人访问,只需要一台服务器就绰绰有余,这时的网站架构如下图所示,应用程序、数据库、文件等所有资源都在一台服务器上
<img src="D:\行癫kubernetes\虚拟化技术\大型网站架构技术.assets\image-20220710151757707.png" alt="image-20220710151757707" style="zoom:50%;" />
#### 2.应用服务和数据服务分离
随着网站业务的发展一台服务器逐渐不能满足需求越来越多的用户访问导致性能越来越差越来越多的数据导致存储空间不足这时就需要将应用和数据分离应用和数据分离后整个网站使用3台服务器应用服务器、文件服务器和数据库服务器这3台服务器对硬件资源的要求各不相同。
应用服务器需要处理大量的业务逻辑因此需要更快更强大的CPU
数据库服务器需要快速磁盘检索和数据缓存,因此需要更快的磁盘和更大的内存
文件服务器需要存储大量用户上传的文件,因此需要更大的硬盘
<img src="D:\行癫kubernetes\虚拟化技术\大型网站架构技术.assets\image-20220710151937584.png" alt="image-20220710151937584" style="zoom:50%;" />
#### 3.使用缓存改善网站性能
网站访问的特点和现实世界的财富分配一样遵循二八定律80% 的业务访问集中在20% 的数据上;既然大部分业务访问集中在一小部分数据上,那么如果把这一小部分数据缓存在内存中,就可以减少数据库的访问压力,提高整个网站的数据访问速度,改善数据库的写入性能了;网站使用的缓存可以分为两种:缓存在应用服务器上的本地缓存和缓存在专门的分布式缓存服务器上的远程缓存。
本地缓存的访问速度更快一些,但是受应用服务器内存限制,其缓存数据量有限,而且会出现和应用程序争用内存的情况
远程分布式缓存可以使用集群的方式,部署大内存的服务器作为专门的缓存服务器,可以在理论上做到不受内存容量限制的缓存服务
<img src="D:\行癫kubernetes\虚拟化技术\大型网站架构技术.assets\image-20220710152124678.png" alt="image-20220710152124678" style="zoom:50%;" />
#### 4.使用集群改善网站并发能力
应用服务器作为网站的入口,会承担大量的请求,我们往往通过应用服务器集群来分担请求数;应用服务器前面部署负载均衡服务器调度用户请求,根据分发策略将请求分发到多个应用服务器节点。
<img src="D:\行癫kubernetes\虚拟化技术\大型网站架构技术.assets\image-20220710152332946.png" alt="image-20220710152332946" style="zoom:50%;" />
常用的负载均衡技术硬件的有F5价格比较贵软件的有LVS、Nginx、HAProxy。LVS是四层负载均衡根据目标地址和端口选择内部服 务器Nginx和HAProxy是七层负载均衡可以根据报文内容选择内部服务器因此LVS分发路径优于Nginx和HAProxy性能要高些而 Nginx和HAProxy则更具配置性如可以用来做动静分离根据请求报文特征选择静态资源服务器还是应用服务器
#### 5.数据库读写分离和分库分表
随着用户量的增加,数据库成为最大的瓶颈,改善数据库性能常用的手段是进行读写分离以及分表,读写分离顾名思义就是将数据库分为读库和写库,通过主备功能实现数据同步。分库分表则分为水平切分和垂直切分,水平切换则是对一个数据库特大的表进行拆分,例如用户表。垂直切分则是根据业务不同来切换,如用户业务、商品业务相关的表放在不同的数据库中。
<img src="D:\行癫kubernetes\虚拟化技术\大型网站架构技术.assets\image-20220710152631824.png" alt="image-20220710152631824" style="zoom:50%;" />
#### 6.使用CDN和反向代理
假如我们的服务器都部署在成都的机房,对于四川的用户来说访问是较快的,而对于北京的用户访问是较慢的,这是由于四川和北京分别属于电信和联通的不 同发达地区,北京用户访问需要通过互联路由器经过较长的路径才能访问到成都的服务器,返回路径也一样,所以数据传输时间比较长。对于这种情况,常常使用 CDN解决CDN将数据内容缓存到运营商的机房用户访问时先从最近的运营商获取数据这样大大减少了网络访问的路径。比较专业的CDN运营商有蓝汛、 网宿。
而反向代理则是部署在网站的机房当用户请求达到时首先访问反向代理服务器反向代理服务器将缓存的数据返回给用户如果没有没有缓存数据才会继续走应用服务器获取也减少了获取数据的成本。反向代理有SquidNginx。
<img src="D:\行癫kubernetes\虚拟化技术\大型网站架构技术.assets\image-20220710152631824.png" alt="image-20220710152631824" style="zoom:50%;" />
#### 7.使用分布式文件系统
用户一天天增加业务量越来越大产生的文件越来越多单台的文件服务器已经不能满足需求。需要分布式的文件系统支撑。常用的分布式文件系统有NFS。
![file://C:\Users\huawei\AppData\Local\Temp\ct_tmp/1.png](D:\行癫kubernetes\虚拟化技术\大型网站架构技术.assets\1.png)
#### 8.使用NoSql和搜索引擎
对于海量数据的查询我们使用nosql数据库加上搜索引擎可以达到更好的性能。并不是所有的数据都要放在关系型数据中。常用的NOSQL有mongodb和redis搜索引擎有lucene
![file://C:\Users\huawei\AppData\Local\Temp\ct_tmp/1.png](D:\行癫kubernetes\虚拟化技术\大型网站架构技术.assets\1-16574383609512.png)
#### 9.将应用服务器进行业务拆分
随着业务进一步扩展,应用程序变得非常臃肿,这时我们需要将应用程序进行业务拆分,如百度分为新闻、网页、图片等业务。每个业务应用负责相对独立的业务运作。业务之间通过消息进行通信或者同享数据库来实现。
![file://C:\Users\huawei\AppData\Local\Temp\ct_tmp/1.png](D:\行癫kubernetes\虚拟化技术\大型网站架构技术.assets\1-16574384224444.png)
#### 10.搭建分布式服务
这时我们发现各个业务应用都会使用到一些基本的业务服务例如用户服务、订单服务、支付服务、安全服务这些服务是支撑各业务应用的基本要素。我们将这些服务抽取出来利用分部式服务框架搭建分布式服务。淘宝的Dubbo是一个不错的选择。
![file://C:\Users\huawei\AppData\Local\Temp\ct_tmp/1.png](D:\行癫kubernetes\虚拟化技术\大型网站架构技术.assets\1-16574385141946.png)
总结:
大型网站的架构是根据业务需求不断完善的,根据不同的业务特征会做特定的设计和考虑,本文只是讲述一个常规大型网站会涉及的一些技术和手段。
## 三:架构模式
关于什么是模式,这个来自建筑学的词汇是这样定义的:"每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复工作"。模式的关键在于模式的可重复性,问题与场景的可重复性带来解决方案的可重复使用。
分层:一般可分为,应用层,服务层,数据层,管理层,分析层
分割:一般按照业务/模块/功能特点进行划分,比如应用层分为首页,用户中心
分布式:将应用分开部署(比如多台物理机),通过远程调用协同工作
集群:一个应用/模块/功能部署多份(如:多台物理机),通过负载均衡共同提供对外访问
缓存:将数据放在距离应用或用户最近的位置,加快访问速度
异步:客户端发出请求,不等待服务端响应,等服务端处理完毕后,使用通知或轮询的方式告知请求方
冗余:增加副本,提高可用性,安全性,性能
安全:对已知问题有有效的解决方案,对未知/潜在问题建立发现和防御机制
自动化:将重复的,不需要人工参与的事情,通过工具的方式,使用机器完成
敏捷性:积极接受需求变更,快速响应业务发展需求

@ -0,0 +1,82 @@
<h1><center>虚拟化技术概述</center></h1>
**作者:行癫(盗版必究)**
------
## 一:虚拟化概述
#### 1.什么是虚拟化
虚拟化是云计算的基础。简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 CPU、内存、IO 硬件资源,但逻辑上虚拟机之间是相互隔离的
物理机我们一般称为宿主机Host宿主机上面的虚拟机称为客户机Guest
那么 Host 是如何将自己的硬件资源虚拟化,并提供给 Guest 使用的呢
主要是通过一个叫做 Hypervisor 的程序实现的
虚拟化技术最早出现在 20 世纪 60 年代的 IBM 大型机系统在70年代的 System 370 系列中逐渐流行起来这些机器通过一种叫虚拟机监控器Virtual Machine MonitorVMM的程序在物理硬件之上生成许多可以运行独立操作系统软件的虚拟机Virtual Machine实例。随着近年多核系统、集群、网格甚至云计算的广泛部署虚拟化技术在商业应用上的优势日益体现不仅降低了 IT 成本,而且还增强了系统安全性和可靠性,虚拟化的概念也逐渐深入到人们日常的工作与生活中
虚拟化是一个广义的术语对于不同的人来说可能意味着不同的东西这要取决他们所处的环境。在计算机科学领域中虚拟化代表着对计算资源的抽象而不仅仅局限于虚拟机的概念。例如对物理内存的抽象产生了虚拟内存技术使得应用程序认为其自身拥有连续可用的地址空间Address Space而实际上应用程序的代码和数据可能是被分隔成多个碎片页或段甚至被交换到磁盘、闪存等外部存储器上即使物理内存不足应用程序也能顺利执行
#### 2.虚拟化分类
平台虚拟化Platform Virtualization针对计算机和操作系统的虚拟化
资源虚拟化Resource Virtualization针对特定的系统资源的虚拟化比如内存、存储、网络资源等
应用程序虚拟化Application Virtualization包括仿真、模拟、解释技术等
我们通常所说的虚拟化主要是指平台虚拟化技术,通过使用控制程序(也被称为 Virtual Machine Monitor 或Hypervisor隐藏特定计算平台的实际物理特性为用户提供抽象的、统一的、模拟的计算环境称为虚拟机。虚拟机中运行的操作系统被称为客户机操作系统Guest OS运行虚拟机监控器的操作系统被称为主机操作系统Host OS当然某些虚拟机监控器可以脱离操作系统直接运行在硬件之上如 VMWARE 的 ESX 产品)。运行虚拟机的真实系统我们称之为主机系统。
![file://C:\Users\huawei\AppData\Local\Temp\ct_tmp/1.png](D:\行癫kubernetes\虚拟化技术\虚拟化技术概述.assets\1.png)
部分虚拟化Partial Virtualization
VMM 只模拟部分底层硬件,因此客户机操作系统不做修改是无法在虚拟机中运行的,其它程序可能也需要进行修改。在历史上,部分虚拟化是通往全虚拟化道路上的重要里程碑,最早出现在第一代的分时系统 CTSS 和 IBM M44/44X 实验性的分页系统中
全虚拟化Full Virtualization
全虚拟化是指虚拟机模拟了完整的底层硬件,包括处理器、物理内存、时钟、外设等,使得为原始硬件设计的操作系统或其它系统软件完全不做任何修改就可以在虚拟机中运行;比较著名的全虚拟化 VMM 有 Microsoft Virtual PC、VMware Workstation、Sun Virtual Box、Parallels Desktop for Mac 和 QEMU
超虚拟化Paravirtualization
这是一种修改 Guest OS 部分访问特权状态的代码以便直接与 VMM 交互的技术。在超虚拟化虚拟机中,部分硬件接口以软件的形式提供给客户机操作系统,这可以通过 HypercallVMM 提供给 Guest OS 的直接调用,与系统调用类似)的方式来提供,由于不需要产生额外的异常和模拟部分硬件执行流程,超虚拟化可以大幅度提高性能,比较著名的 VMM 有 Denali、Xen
硬件辅助虚拟化Hardware-Assisted Virtualization
硬件辅助虚拟化是指借助硬件(主要是主机处理器)的支持来实现高效的全虚拟化。例如有了 Intel-VT 技术的支持Guest OS 和 VMM 的执行环境自动地完全隔离开来Guest OS 有自己的“"套寄存器"可以直接运行在最高级别Intel-VT 和 AMD-V 是目前 x86 体系结构上可用的两种硬件辅助虚拟化技术
#### 3.KVM简介
从rhel6开始使用 直接把kvm的模块做成了内核的一部分KVM 针对运行在 x86 硬件上的、驻留在内核中的虚拟化基础结构。KVM 是第一个成为原生 Linux 内核2.6.20)的一部分的 hypervisor它是由 Avi Kivity 开发和维护的,现在归 Red Hat 所有
KVM 是作为内核模块实现的,因此 Linux 只要加载该模块就会成为一个hypervisor。KVM 为支持 hypervisor 指令的硬件平台提供完整的虚拟化(比如 Intel® Virtualization Technology [Intel VT] 或 AMD Virtualization [AMD-V] 产品。KVM 还支持准虚拟化来宾操作系统,包括 Linux 和 Windows
#### 4.KVM hypervisor 视图
![file://C:\Users\huawei\AppData\Local\Temp\ct_tmp/1.png](D:\行癫kubernetes\虚拟化技术\虚拟化技术概述.assets\1-16574414328342.png)
#### 5.kvm、xen、qemu三者区别
KVM(Kernel-based Virtual Machine)基于内核的虚拟机:
KVM是集成到Linux内核的Hypervisor是X86架构且硬件支持虚拟化技术Intel VT或AMD-V的Linux的全虚拟化解决方案。它是Linux的一个很小的模块利用Linux做大量的事如任务调度、内存管理与硬件设备交互等
Xen
Xen是第一类运行在裸机上的虚拟化管理程序(Hypervisor)。它支持全虚拟化和半虚拟化,Xen支持hypervisor和虚拟机互相通讯而且提供在所有Linux版本上的免费产品包括Red Hat Enterprise Linux和SUSE Linux Enterprise Server。Xen最重要的优势在于半虚拟化此外未经修改的操作系统也可以直接在xen上运行(如Windows)能让虚拟机有效运行而不需要仿真因此虚拟机能感知到hypervisor而不需要模拟虚拟硬件从而能实现高性能
QEMU
QEMU是一套由Fabrice Bellard所编写的模拟处理器的自由软件。它与BochsPearPC近似但其具有某些后两者所不具备的特性如高速度及跨平台的特性。经由kqemu这个开源的加速器QEMU能模拟至接近真实电脑的速度
#### 6.KVM和QEMU的关系
准确来说KVM是Linux kernel的一个模块。可以用命令modprobe去加载KVM模块。加载了模块后才能进一步通过其他工具创建虚拟机。但仅有KVM模块是 远远不够的,因为用户无法直接控制内核模块去作事情,你还必须有一个运行在用户空间的工具才行。这个用户空间的工具kvm开发者选择了已经成型的开源虚拟化软件 QEMU。说起来QEMU也是一个虚拟化软件。它的特点是可虚拟不同的CPU。比如说在x86的CPU上可虚拟一个Power的CPU并可利用它编译出可运行在Power上的程序。KVM使用了QEMU的一部分并稍加改造就成了可控制KVM的用户空间工具了。所以你会看到官方提供的KVM下载有两大部分(qemu和kvm)三个文件(KVM模块、QEMU工具以及二者的合集)。也就是说你可以只升级KVM模块也可以只升级QEMU工具。这就是KVM和QEMU 的关系
Loading…
Cancel
Save