如何去使用kvm命令行工具去尝试管理虚拟机当中的,比如创建虚拟机的时候的,指明硬盘说明文件,光盘什么文件的,来尝试安装虚拟机实例,
企业在用虚拟机的实例的时候,很多时候显示不是关键的,更多的是磁盘io和网络
kvm的网络建构是如何进行
没准将来使用的是虚拟机管理平台
网络模型,同一个物理服务器上,启动两个虚拟机实例,这两个虚拟机通信,需要有虚拟网卡,需要介入到2层的通信设备上,交换机(网桥)
对于linux系统,这个网卡构建是独特的,可以通过名称空间中来实现,窗口一个成对的以太网设备,并将其一部分关联到主机上,另外一部分送到,虚拟机实例内部来,虚拟网络名称空间就可以隔离网络的,基于内核中的网络名称空间技术,实现可以创建多个网络,使用容器的时候,就是实现网络名称空间隔离,来构建出多个用户空间的,几个核心技术之一,网卡是成对出现的,可以把一对当作一半放到虚拟机上,另外一半放到虚拟交换机上。
创建出这么一对网卡,ip命令即可实现
ip link add 添加一个设备,还可以指定类型,veth虚拟的以太网卡
veth虚拟以太网卡
linux内建有模块可以让你创建桥接接口,直接在内核模拟出一个交换机设备,而这个内核模块输出的应该是系统调用
brctl命令行工具 show 可以显示你有几个桥设备
添加网桥addr
addif 向桥添加一个虚拟网卡,
delbr删除桥
delif 删除桥上的网络接口
peer另外一端
创建一堆虚拟网卡,一半关联桥上,相当于把网线插进来,把另外一半放到虚拟机上、
add 随便起个名字veth。1 type类型,
12 是一对网卡设备
给它个地址并激活这个设备,彼此间就能通信 了,
网络名称空间,list可以列出已经有多少空间
add可以添加 空间 router
可以把刚才创建的接口一半扔到router1里
set可以指明哪个设备、
show的时候就看不到2了,exec在哪个名称空间使用命令,网卡没有激活所有不显示
这就是一个网卡怎么去创建一半一半,如果把网卡激活各自赋予地址,它们是可以进行通信的,相当于veth就是个虚拟机一样,虚拟的是网络地址空间
在本机的vethx。1也给个地址
现在可以ping通
现在就可以删除网卡了
创建一个内部通信的桥、
还没有激活,ifconfig -a显示,激活可以使用ifconfig br-int up
就能显示了
相当于一半在虚拟机上,插网线类似
在每个虚拟机上需要指定两个nat选项
第一个用来指明自己一段网卡怎么创建
第二个指明添加到哪个网络中去
网络选项:
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v] 指明网卡怎么创建
为虚拟机创建一个网络接口,并将其添加至指定的VLAN;
model=type:指明模拟出的网卡的型号,ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,
virtio;
-net nic,model=?
macaddr=mac:指明mac地址;52:54:00:
-net tap[,vlan=n][,name=str][,fd=h][,fds=x:y:...:z][,ifname=name][,script=file][,downscript=dfile]: 加入到哪个桥
通过物理的TAP网络接口连接至vlan n;
script=file:启动虚拟机时要执行的脚本,默认为/etc/qemu-ifup
downscript=dfile:关闭虚拟机时要执行的脚本,/etc/qemu-ifdown
ifname=NAME:自定义接口名称;
/etc/qemu-ifup + 参数(是你的网卡接口)
#!/bin/bash
#
bridge=br0
if [ -n "$1" ];then 判定网卡接口是否非空
ip link set $1 up 如果不空就激活
sleep 1
brctl addif $bridge $1 添加到这个桥上来
[ $? -eq 0 ] && exit 0 || exit 1 如果正常添加了就退出返回0
else
echo "Error: no interface specified."
exit 1
fi
-n测一下有没有语法错误
下一次启动虚拟机的时候,就可以尝试连接到这个网络上来了、
qemu会创建网卡,一半链接桥一半链接虚拟机上
启动两个实例
可以使用 --daemonize 以守护进程方式运行
-m 256m 内存
-name c1 名字
-smp 2个核心
-drive 映像文件
media 媒介 磁盘
-net 加哪个桥上去 tap可以设置脚本,script
-vnc 显示为0
-daemonize 以守护进程方式运行
mac地址开头必须是 54:54:00 因为是kvm得到的,后面自己去些即可
、
创建另外一个虚拟机、
**br-int已经关联了两个网卡 ,tap0,tap1
**
每个网卡都有两半,tap0另外一半在c1上,tap1在c2上
他们之前可以通信,但是无法和外部通信,因为这个桥是在主机没有地址的,宿主机通信没办法实现
br-init虽然叫桥,但是显示是个网卡,如果配置个地址,就相当于宿主机的网卡,直接可以当网卡用
跟宿主机就可以通信了,这就是仅主机了
也可以变为nat,物理机有网卡连接到外部网络中去的,如果打开了宿主机的核心转发,这两个虚拟主机指向254,254收到报文以后,2层到网桥用,3层当网卡路由用,
报文发给宿主机,宿主机发现报文地址不是自己,找一个网卡转发出去
配置网关
最后一条记录
按照道理对方收到,但是是不知道你在什么位置的,所以用了地址转换
其实是67去ping的68
现在已经使用nat模式了,现在是外部访问不到里面的
在c1主机上试图去启动ssh服务
现在是路由信息不可到达,要有dnat规则
如果目标地址是172.16.0.67 目标端口是 22922 -j DNAT为10…1.1.1的22端口
-p指定端口
如果有两个虚拟机和两个宿主机,每宿主机都跑了虚拟机实例,现在期望两个宿主机上的虚拟机能互相通信,最简单就是每个宿主机上的虚拟机都用桥接,但是这样主机就等于暴露在外部网络,所有端口都能被人访问
A主机是私有网络,要想被外部访问,加一个DNAT规则才可以
B主机是私有网络
事实上就是两个宿主机的网卡在进行通信,那就再两个虚拟机上做vpn,是可信可达的
要想两个虚拟机之间无障碍通信,用叠加网络的方式,隧道网络模型,可以想象成vpn模式,非加密的隧道网络,比如
可以使用GRE,建立一个4层的udp协议隧道,中间的2层的任何报文都可以通过隧道发往另外一台交换机上,这两台交换机好像就直接用网线链接起来了一样,就等 两个都在同一个2层网络,
需要借助一个物理网络,构建出一个隧道网络来,
哪怕物理上是隔离的,链接交换机,再交换机上基于端口划分vlan
现在A1和A2可以通信,B1B2可以通信
没准一家公司中的A1A2配置了不同的网络地址,还期望双方路由以后互相通信,中间就需要设置虚拟的路由,不光是交换机设备,linux内核在内核级就支持,虚拟路由设置叫NATNS,可以当虚拟路由来用
现在交换机和路由都是软件实现的,但是彼此他通信还是要硬件设备的,每一个网络设备都是自制系统,对我们是不利的
SDN,交由软件统一控制和驱动的网络
NFV,将来建立云化的IDC的话,这些技术需要了解
一般不会用内核里的桥更多的是使用OVS开放的虚拟交换机(OPEN Vswitch
刚才的地址是自己配置的,能否自己获取,启动一个dhcp服务器即可,在刚才的交换机那里,设置一个dhcp服务,只负责这个网段的
dnsmsq,是非常轻量化的,dns转发器和dhcp服务器
man dnsmsq
监听所有地址
-i表示只监听在哪个端口上
dhcp地址池
-i仅监听 在哪个网卡接口上
选项,42代表ntp-server
-Fdhcp地址范围,-O 3,网关,
在br-init上 67号端口已经被监听 了
一旦在网络名称空间中,地址什么冲突了,再启用一个名称空间即可,把这个dnsmsq单独运行再网络名称空间 中
1,2成对出现,没有问题
一半放到网络名称空间去,因此先去激活前一半,添加到桥br-int上,类似插网线到交换机上
add一个dhcpserver,y。2添加到dhcpsrv的虚拟机上,启动dnsmasq
现在dnsmsq已经运行起来了
现在重启第二个虚拟机查看能否获取地址
获取到地址了
网关指向254
到此dhcp服务功能的再单机下构建网络
网络选项:
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v] 为虚拟机定义网卡
为虚拟机创建一个网络接口,并将其添加至指定的VLAN;
model=type:指明模拟出的网卡的型号,ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,
virtio;
-net nic,model=?
macaddr=mac:指明mac地址;52:54:00:
-net tap[,vlan=n][,name=str][,fd=h][,fds=x:y:...:z][,ifname=name][,script=file][,downscript=dfile]: 把网卡另外一头插到交换机上去
通过物理的TAP网络接口连接至vlan n;
script=file:启动虚拟机时要执行的脚本,默认为/etc/qemu-ifup
downscript=dfile:关闭虚拟机时要执行的脚本,/etc/qemu-ifdown
示例1:
~]# qemu-kvm -name c2 -smp 2,maxcpus=4,sockets=2,cores=2 -m 128 -drive file=/images/kvm/cos-i386.qcow2,if=virtio -vnc :1 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:11 -net tap,script=/etc/qemu-ifup
示例2:
~]# qemu-kvm -name winxp -smp 1,maxcpus=2,sockets=1,cores=2 -m 1024 -drive file=/data/vms/winxp.qcow2,media=disk,cache=writeback,format=qcow2 file=/tmp/winxp.iso,media=cdrom -boot order=dc,once=d -vnc :1 -net nic,model=rtl8139,macaddr=52:54:00:00:aa:11 -net tap,ifname=tap1,script=/etc/qemu-ifup -daemonize
要想启动多个centos虚拟机,需要先安装centos7虚拟机,当作模板,复制模板几个,完全克隆,每个虚拟机之间是没有关系的,当然也可以每个虚拟机间做快照,去克隆出多个链接克隆来,
但如果基于同一个镜像文件复制多份,启动很多的虚拟机,很多信息是冲突的,尤其是mac地址,
我们需要装好系统后,把里面的地址删除,比如mac地址,把当面主机的私有信息,比如主机名之类的,全部删除,
下次重启再初始化即可,
cloud-init 是一系列的初始化脚本,这个脚本可以尝试把你删除的mac地址i,初始化出来,在这之前要剥离与内核相干的东西
没必要自己去创建,因为centos官方给你做好了镜像文件,也要继续cloud-init做一些初始化
或者基于OZ的工具做初始化
kvm管理起来太麻烦了,还是建议用其他的管理工具,virsh命令行工具,对于虚拟机的管理,是基于xml文件来实现的
其他命令还挺好用,比qemu-kvm容易些