kvm — linux virtual server深入解识



(一)虚拟化 Kernel-baseed Virtual Machine 入门


  • 虚拟化分类

 
 
1:完全虚拟化(Full Virtualization) 需要跑在宿主机之上
全虚拟化也成为原始虚拟化技术,该模型使用虚拟机协调guest操作系统和原始硬件,VMM在guest操作系统和裸硬件之间用于工作协调,一些受保护指令必须由Hypervisor(虚拟机管理程序)来捕获处理。
guest执行特权级操作,只能通过Hypervisor来处理。例如,guest执行 shutdown -h now,这条指令将会被Hypervisor所捕获到,因此不会真正的被CPU执行,而是被Hypervisor协调执行,从而关闭了虚拟机guest,而不是这个物理机上的OS
代表作品:Vmware Workstation, KVM
2:半虚拟化(Para Virtualization)直接跑在硬件之上
半虚拟化是另一种类似于全虚拟化的技术,它使用Hypervisor分享存取底层的硬件,但是它的guest操作系统集成了虚拟化方面的代码。
代表作品:Xen, VMware vSphere,Huawei FusionSphere

Alt text

  • KVM 入门

 
 
KVM必须保证 CPU支持硬件虚拟化
Intel CPU:VT-x
AMD CPU:AMD-V

Alt text

  • KVM 管理、查看工具分类

 
 
qemu:
qemu-kvm
qemu- img
libvirt
libvirtd 守护进程
图形化管理程序:virt-manager程序、virt-viewer程序
命令行管理程序:virt-install程序、virsh程序
  • 在Wmware虚拟机上如何检查是否CPU支持虚拟化 和 加载kvm模块

 
 
# vmx或svm :表示VCPU支持虚拟化
cat /proc/cpuinfo | grep vmx
# 装载kvm模块
modprobe kvm
# 查看模块是否已经安装,必须保证安装了kvm_intel模块
[root@7 ~] # lsmod | grep kvm
kvm_intel 162153 0
kvm 525259 1 kvm_intel
# 存在kvm设备文件
[root@7 ~] # ll /dev/kvm
crw-------. 1 root root 10, 232 Sep 28 20:40 /dev/kvm
  • 安装libvirt管理套件(C/S架构模式,用户管理kvm虚拟机)

 
 
# 1:安装程序包
yum install -y libvirt virt-manager virt-viewer virt-install qemu-kvm
# 2:启动libvirtd守护进程
systemctl start libvirtd.service
systemctl enable libvirtd.service
# 3:输入ifconfig命令之后可以看到 virbr0,这是一个NAT网络
[root@7 ~] # ifconfig
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:cf:ae:68 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# 在图形化界面启动virt-manager
# 如果创建虚拟机不成功,请查看如下配置,查看是否CPU虚拟化嵌套功能开启
cat /sys/module/kvm_intel/parameters/nested 如果是N,那么需要设置为Y
# 开启CPU虚拟化嵌套功能
modprobe -r kvm_intel
modprobe kvm_intel nested=1
# 再次查看是否CPU虚拟化嵌套功能开启
cat /sys/module/kvm_intel/parameters/nested
Y
# 由于linux的镜像比较大,如果大于4G是无法使用rz -y 从Windows系统上传的,因此可以选择挂载
# 挂载之前需要下载Windows的ntfs文件系统
yum install -y fuse-ntfs-3g
# 查看USB的设备文件
fdisk -l
# 一般是/dev/sdb1为USB的设备文件
# 挂载已经有Centos镜像的USB设备
mount.ntfs-3g /dev/sdb1 /mnt
# 此时就可以使用U盘或硬盘中的CentOS镜像了

Alt text

  • 使用命令virsh管理网络设备,创建桥设备 和 使用virt-manager创建虚拟机

 
 
# 1:查看网卡接口
virsh iface-list
Name State MAC Address
---------------------------------------------------
eno16777736 active 00 :0c :29 :34 :06 :15
lo active 00 :00 :00 :00 :00 :00
# 2:完毕 NetworkManager服务,不让 nmtui接口管理网络设备
systemctl stop NetworkManager .service
systemctl disable NetworkManager .service
# 3:创建 br0桥设备, eno16777736就是交换机, br0就是桥设备,且具有 IP地址,也可以认为是虚拟网卡
virsh iface-bridge eno16777736 br0
# 4:创建虚拟机
virt-manager
# 5:可以使用 cobbler引导,或使用光盘镜像,如果使用 cobbler需要 PXE环境
  • virsh命令创建虚拟机

 
 
# 查看已经创建的虚拟机
virsh list
# 创建virsh的帮助
virsh help domain
# 停止虚拟机
virsh destroy centos6 .8
cat /proc/ 345232/cmdline 查看qemu-kvm的进程的启动命令
  • 虚拟化网络介绍

Alt text

  • 使用qemu-img创建虚拟磁盘文件

 
 
# 安装qemu-img
yum install -y qemu-img
# 获取帮助
qemu-img --help
# 支持的虚拟磁盘文件格式
Supported formats: vvfat vpc vmdk(vmware,virtualbox磁盘文件) vhdx vdi ssh sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2(kvm的虚拟磁盘格式) qcow parallels(Mac上的parallels) nbd iscsi gluster dmg tftp ftps ftp https http cloop bochs blkverify blkdebug
# 创建一个稀疏格式的虚拟磁盘文件, -f: 指定格式, -o:指定选项,/root/kvm.qcow2表示指定创建的虚拟磁盘路径, 80G指定磁盘大小
qemu-img create -f qcow2 -o preallocation=metadata /root/kvm.qcow2 80G
# 查看虚拟磁盘的预定大小
[root@ 7 ~]# ls -lh /root/kvm.qcow2
-rw-r--r--. 1 root root 81G Sep 29 11: 30 /root/kvm.qcow2
# 查看虚拟磁盘的实际大小
[root@ 7 ~]# du -sh /root/kvm.qcow2
16M /root/kvm.qcow2
# 需改大小,不能缩小,只能扩大
qemu-img resize /root/kvm.qcow2 300G
  • 使用 virt-install 创建虚拟机

 
 
virt- install --help
  • 使用 qemu-kvm 创建虚拟机 介绍

 
 
1:命令路径:/usr/libexec/qemu-kvm
2:添加至环境变量PATH中(也可以使用软连接 ln - sv /etc/ profile.d/kvm. sh /usr/bin)
编辑 /etc/ profile.d/kvm. sh 添加
export PATH=/usr/libexec:$PATH
. /etc/ profile.d/kvm. sh
  • 使用字符界面 qemu-kvm 创建虚拟机

 
 
qemu-kvm的基本用法:指定系统类型,CPU运行模式,NUMA(Non Uniform Memory Access Architecture), 软驱设备,光驱设备,硬件设备
# 查看qemu-kvm的帮助
# 查看支持的系统类型
qemu-kvm -M ?
# 下载磁盘镜像文件
wget http://download.cirros-cloud.net/ 0.3 .3/cirros -0.3 .3-x86_64-disk.img
# 查看镜像文件的信息
qemu-img info cirros -0.3 .3-x86_64-disk.img
# 创建一个虚拟机实例domain,-name 指明实例的名称,-m指定内存大小,-smp指明CPU的核心数,-drive指明驱动的设备和镜像文件,file=指明磁盘镜像文件,media=指定从地方启动虚拟机实例,if=指定网卡驱动,format=指定虚拟磁盘文件类型 -net指定网络,-nographic指定文本界面启动
qemu-kvm -name kvm_linux -m 200 -smp 2 -drive file=/root/cirros -0.3 .3-x86_64-disk.img,media=disk, if=virtio, format=qcow2 -net none -nographic
# 切换到root用户
sudo su -
# 可以启动另外一个终端,查看创建虚拟机实例的命令
cat / proc/2989/cmdline
# 使用Ctrl+a 再按h键,可以查看到帮助
C-a h print this help
C-a x exit emulator
C-a s save disk data back to file (if -snapshot)
C-a t toggle console timestamps
C-a b send break (magic sysrq)
C-a c switch between console and monitor
C-a C-a sends C-a
# 使用Ctrl+a 再按c键,可以来到虚拟机的管理接口界面
help 命令可以查看帮助
system_powerdown 可以关闭计算机
  • 使用vnc客户端连接到 qemu-kvm 创建的虚拟机

 
 
# 使用图形界面可以使用vnc将图形转发,可以指定vnc提供的端口,:1表示监听于5901端口,:2指定监听于5902端口,依次类推
qemu-kvm -name kvm_linux -m 200 -smp 2 -drive file=/root/cirros -0.3 .3-x86_64-disk.img,media=disk, if=virtio, format=qcow2 -net none -vnc 192.168 .43 .11: 1
# 下载vnc客户端
yum install -y tigervnc
# tigervnc客户端有客户端命令/usr/bin/vncviewer,在图形界面使用vncviewer连接到kvm_linux虚拟节点
vncviewer 192.168 .43 .11: 1
  • 给新建的kvm虚拟机创建网络接口

 
 
(一)首先必须创建网卡连接桥接口的启动脚本和停止脚本,其中脚本中的 $ 1:表示为虚拟机的网卡的右边接口,这两个脚本就是讲虚拟机的网卡的右边接口接在网桥上,实现桥接模型
# 1:/etc/qemu-ifup脚本,且给脚本一个执行权限
###################################### 启动脚本的内容 ########################
#! /bin/bash
bridge=br0
# 如果$ 1的值不为空
if [ -n "$1" ];then
# 启动网卡接口地址
ip link set $ 1 up
sleep 1
# 将网卡接口连接至物理桥上,此时为桥接模式
brctl addif $bridge $ 1
# 确保以上命令执行成功后退出
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: RONG interface" && exit 1
fi
###################################### 启动脚本的内容 ########################
chmod +x /etc/qemu-ifup
# 2:/etc/qemu-ifdown脚本, 且给脚本一个执行权限
###################################### 停止脚本的内容 ########################
#! /bin/bash
bridge=br0
# 如果$ 1的值不为空
if [ -n "$1" ];then
# 停止网卡接口地址
ip link set $ 1 down
sleep 1
# 将网卡接口从物理桥上删除
brctl delif $bridge $ 1
# 确保以上命令执行成功后退出
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: RONG interface" && exit 1
fi
###################################### 停止脚本的内容 ########################
chmod +x /etc/etc/qemu-ifdown
(二)创建一个有网络接口的虚拟机实例
# -net nic指明为网卡接口,model指明virtio虚拟网卡驱动,macaddr为虚拟网卡的Mac地址
# -net 指定网卡的连接方式,物理机的TAP网络接口连接至vlan中,ifname=virtual_eth0 指定宿主机虚拟网卡名称,默认连接的是br0,桥接模型
# -daemonize:指明以daemon的方式运行
qemu-kvm -name kvm_linux -m 200 -smp 2 -drive file=/root/cirros -0.3 .3-x86_64-disk.img,media=disk, if=virtio,format=qcow2 -net nic,model=virtio,macaddr= 52: 54: 00: 01: 01: 01 -net tap,ifname=virtual_eth1 -vnc 192.168 .43 .11: 1 -daemonize
(三)通过vnc连接
vncviewer 192.168 .43 .11: 1
(四)输入用户和密码,登入,看看网卡eth0是否有IP,且ping一下www.baidu.com是否ping通

(二)再说virsh 命令行管理虚拟机


  • 重用命令和选项

 
 
1:查看运行的虚拟机
virsh list
2:查看所有的虚拟机(关闭和运行的虚拟机)
virsh list --all
3:连接虚拟机
virsh console +域名(虚拟机的名称)
4:退出虚拟机
ctrl+]
5:关闭虚拟机
5.1 virsh shutdown +域名
5.2 virsh destroy +域名
这种方式的关闭,是一种删除的方式,只是在virsh list中删除了该虚拟机。
6:挂起虚拟机
virsh suspend +域名
7:恢复被挂起的虚拟机
virsh resume +域名
8:子机随宿主主机(母机)启动而启动
virsh autostart + 域名
9:取消自动启动
virsh auotstart --disable +域名
10:彻底删除虚拟机
1, 删除虚拟机 virsh destroy +域名
2,解除标记 virsh undefine +域名
3,删除虚拟机文件
11:启动虚拟机并进入该虚拟机
virsh start 域名 --console

(三)linux 虚拟网络模型介绍


  • 第一种隔离模型

Alt text


 
 
每一个虚拟机实例的网卡都有两个接口,一端接在虚拟机内部,一端接在宿主机内部,如上图所示eth0就是接在虚拟机内部的,而vnet0就是接在宿主机内部的,只要再创建一个虚拟网桥( virtual Bridge)就可以虚拟机实例之间通信
  • 启用隔离模型

 
 
# 由于安装管理kvm虚拟机的包组的时候,已经将bridge-utils -1.5 -9.el7.x86_64包作为依赖安装了,因此可以直接使用brctl命令
# 获取帮助
brctl --help
# 创建虚拟桥
brctl addbr host_only_br0
# 激活虚拟桥
ifconfig host_only_br0 up
# 创建虚拟磁盘文件
mkdir /root/vm/
cp /root/cirros -0.3 .3-x86_64-disk.img /root/vm/disk1.qcow2
cp /root/cirros -0.3 .3-x86_64-disk.img /root/vm/disk2.qcow2
cp /root/cirros -0.3 .3-x86_64-disk.img /root/vm/disk3.qcow2
# 修改创建的那两个脚本文件,将桥设备从 br0 改为 host_only_br0
###################################### 启动脚本的内容 ########################
#! /bin/bash
# 把这里修改为host_only_br0
bridge=host_only_br0
# 如果$ 1的值不为空
if [ -n "$1" ];then
# 启动网卡接口地址
ip link set $ 1 up
sleep 1
# 将网卡接口连接至物理桥上,此时为桥接模式
brctl addif $bridge $ 1
# 确保以上命令执行成功后退出
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: RONG interface" && exit 1
fi
###################################### 启动脚本的内容 ########################
chmod +x /etc/qemu-ifup
# 2:/etc/qemu-ifdown脚本, 且给脚本一个执行权限
###################################### 停止脚本的内容 ########################
#! /bin/bash
# 这里也需要修改为host_only_br0
bridge=host_only_br0
# 如果$ 1的值不为空
if [ -n "$1" ];then
# 停止网卡接口地址
ip link set $ 1 down
sleep 1
# 将网卡接口从物理桥上删除
brctl delif $bridge $ 1
# 确保以上命令执行成功后退出
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: RONG interface" && exit 1
fi
###################################### 停止脚本的内容 ########################
chmod +x /etc/etc/qemu-ifdown
# 创建第一个虚拟机实例,这里在创建实例的时候,ifname:为宿主机这端网卡的名称。script:指定创建虚拟机的时候,虚拟网卡连接的是哪个桥设备。downscript:执行在停止虚拟机的时候,如何删除虚拟网卡与桥设备的连接
qemu-kvm -name kvm_linux1 -m 200 -smp 2 -drive file=/root/vm/disk1.qcow2,media=disk, if=virtio,format=qcow2 -net nic,model=virtio,macaddr= 52: 54: 00: 01: 01: 01 -net tap,ifname=virtual_eth1,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -vnc : 1 -daemonize
# 创建第二个虚拟机实例
qemu-kvm -name kvm_linux2 -m 200 -smp 2 -drive file=/root/vm/disk2.qcow2,media=disk, if=virtio,format=qcow2 -net nic,model=virtio,macaddr= 52: 54: 00: 01: 01: 02 -net tap,ifname=virtual_eth2,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -vnc : 2 -daemonize
# 连接到虚拟机的控制台(在windows上调用xmanager,在Mac上调用XQuartz)
# 使用vnc连接第一个虚拟节点
vncviewer : 1
sudo ifconfig eth0 192.168 .23 .10/ 24 up
# 使用vnc连接第二个虚拟节点
vncviewer : 2
sudo ifconfig eth0 192.168 .23 .11/ 24 up
  • 第二种路由host-only模型

Alt text

  • 开启host-only模型很简单,在隔离模式上,给host_only_br0一个IP地址即可

 
 
ifconfig host_only_br0 192.168 .23 .1/ 24 up
  • 第三种NAT模型

Alt text

  • 在原有的基础之上,启用NAT模型

 
 
# 给虚拟主机实例添加一个网关
route add default gw 192.168 .23 .1
# 在宿主机打开网卡间转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
# 再ping宿主机的 IP发现可以ping通了,因为网卡间转发功能打开
# 但是此时ping其他外网的主机,还是ping不通的,可以使用tcpdump -i eno16777736 -nn icmp抓包分析下。这是因为,外网主机收到ping报文后不知道发给谁,解决办法有两种,第一种是给外网主机添加一条路由条目,让来自 192.168 .23 .0/ 24的报文,都发往 192.168 .43 .11这个 IP所在的网卡,或者在宿主机上写一条SNAT规则,让来自 192.168 .23 .0/ 24的报文都的原 IP地址都是宿主机网卡的 IP地址,都是这样宿主机的 IP将会被此虚拟机实例捆绑,因此,我们在br0上,再添加一个 IP地址
ifconfig br0: 0 192.168 .43 .12/ 24 up
# 再添加SNAT规则
iptables -t nat -A POSTROUTING -s 192.168 .23 .0/ 24 -j SNAT --to-source 192.168 .43 .12
# 最后添加DNAT规则,使得外网主机ping内网主机的时候,也可以ping通,这时宿主机就像四层负载均衡调度器一样了
iptables -t nat -A PREROUTING -d 192.168 .43 .12/ 24 -j DNAT --to-destination 192.168 .23 .10
# 在虚拟机实例中再ping一下外网主机,此时就可以ping通了
ping 192.168 .43 .80(Mac电脑的 IP
# 在Mac电脑的terminal终端,ping 192.168 .43 .12也能够ping通,但是响应用户ping的不是 192.168 .43 .12网卡,而是内网主机 192.168 .23 .10网卡
  • 第四种桥接模型

Alt text


 
 
桥接模型前面已经说过,这里不再累述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值