本文共 5062 字,大约阅读时间需要 16 分钟。
如何去使用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容易些转载地址:http://wckgn.baihongyu.com/