kvm快速配置大量虚拟机思路:封装一个虚拟机,然后做快照。
封装虚拟机作为模板,提供给后面大量快照克隆虚拟机使用。
[root@localhost images]# pwd //镜像文件存放路径/var/lib/libvirt/images
[root@localhost images]# ll mather.img //已经制作好的mather模板
-rw------- 1 qemu qemu 8589934592 Apr 8 09:25 mather.img
//这里已经做好了一个模板镜像,名字"mather.img",制作过程就是安装一个本地虚拟机
模板创建完成之后,就不要再开启;模板只是做克隆,
模板创建细节问题:
rm -fr /etc/udev/rules.d/70-* ##会自动记录网卡信息,注意:70-是记录物理网卡信息的文件,每个虚拟机不同,所以在这里要删除掉;删除掉,每次启动系统会自动创建响应70-文件。
/etc/sysconfig/network-scripts/ifcfg-erh0 的配置;这个是逻辑IP,为了避免IP冲突,每个虚拟机不同,所以每次克隆新的虚拟机,都需要设置新的不同的IP地址。
rm -fr /etc/ssh/ssh_host_* ##删除公钥文件
/etc/yum.repo/*.repo ##yum源指引文件,最好在模板中就配置好一个稳定的全面的yum源,方便操作
/etc/sysconfig/network ##永久修改hostname,克隆虚拟机,每个虚拟机的hostsname也应该不同,易于识别,所以每次创建新的虚拟机,都需要更改hostname
chkconfig iptables off ##关闭防火墙,大部分实验使用不需要防火墙参与(专门学习防火墙时再开启),所以默认关闭比较方便
/etc/sysconfig/selinux ##修改selinux策略,直接设置SELINUX=disabled
建议下载几个比较方便的软件,如:vim ssh httpd等
创建完毕模板虚拟机后,就可以再真机上进行克隆操作。
[root@localhost images]# pwd ##进入到该目录下进行操作,该目录存放虚拟机镜像信息/var/lib/libvirt/images
[root@localhost images]# qemu-img create -f qcow2 -b mather.img test
Formatting 'test', fmt=qcow2 size=8589934592 backing_file='mather.img' encryption=off cluster_size=65536 lazy_refcounts=off
//使用内核自带kvm工具,
create
是子命令,标示要创建一个子虚拟机;-f qcow2
,标示创建格式;-b mather.img
,指定模板镜像;test
是子虚拟机的名字。创建成功后该目录会生成一个test
文件。[root@localhost images]# ll mather.img test
-rw------- 1 qemu qemu 8589934592 Apr 8 09:25 mather.img-rw-r--r-- 1 root root 197120 Apr 24 14:13 test
[root@localhost images]# du -sh mather.img test
1.7G mather.img
196K test
[root@localhost images]# file mather.img test
mather.img: x86 boot sector; GRand Unified Bootloader, stage1 version 0x3, boot drive 0x80, 1st sector stage2 0x849fc, GRUB version 0.94; partition 1: ID=0x83, active, starthead 32, startsector 2048, 1024000 sectors; partition 2: ID=0x8e, starthead 221, startsector 1026048, 15751168 sectors, code offset 0x48
test: QEMU QCOW Image (v3), has backing file (path mather.img), 8589934592 bytes
完成之后,就可以使用virt-manager
工具快速开启一个新的虚拟机。
具体过程:
当我们创建好虚拟机之后,设置好IP地址,hostname等,需要通过ssh
远程连接时,突然发现真机和虚拟机ping
不通的问题。如何解决呢?
思路:当真机和虚拟机无法ping
通,应该按顺序考虑以下三为问题:
首先考虑防火墙是否过滤。然后考虑IP是否在同一网段。最后考虑桥接问题。
ping
命令依靠网络层的ICMP协议(网络控制信息协议),没有端口,一般情况,防火墙都默认放行ping
。
[root@test ~]# iptables -L -n
Chain INPUT (policy ACCEPT)target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 //在filter表的INPUT链上,默认放行icmp协议
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
如果是因为防火墙问题,可以直接简单粗暴关掉防火墙(仅仅是做实验情况)。
[root@test ~]# /etc/init.d/iptables stop
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
网段问题就是设置时,可能设置真机和虚拟机不在同一网段。可以使用ip addr show
查看网络逻辑地址(ip地址):
真机:
[root@localhost shell]# ip addr show br0 4: br0:mtu 1500 qdisc noqueue state UP link/ether 00:21:cc:4a:b0:47 brd ff:ff:ff:ff:ff:ff inet 172.25.254.111/24 brd 172.25.254.255 scope global br0 valid_lft forever preferred_lft forever inet 172.25.11.11/24 brd 172.25.11.255 scope global br0 valid_lft forever preferred_lft forever inet6 fe80::221:ccff:fe4a:b047/64 scope link valid_lft forever preferred_lft forever
虚拟机:
[root@test ~]# ip addr show eth0 2: eth0:mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:04:4f:c2 brd ff:ff:ff:ff:ff:ff inet 172.25.254.15/24 brd 172.25.254.255 scope global eth0 inet6 fe80::5054:ff:fe04:4fc2/64 scope link valid_lft forever preferred_lft forever
这里,真机和虚拟机都在172.25.254
网段(注意看netmask值)。
如果不在同一网段,使用ip
或者ifconfig
手动添加临时IP
,或者在配置文件中修改IP
都可以。
如果防火墙和网段都没有问题,那么很有可能时真机上桥接没有设置成功。
可以在真机上使用brctl show
查看桥接信息:
设置正确时的显示
[root@localhost shell]# brctl show bridge name bridge id STP enabled interfaces br0 8000.0021cc4ab047 no enp0s25 vnet0 virbr0 8000.000000000000 yes //开启虚拟机,就会多一个vnet信息;从vnet0开始,每多开启一个虚拟机,就会多一项vnet信息,vnet0,vnet1,vnet2依次类推
设置错误时的显示
[root@localhost shell]# brctl show bridge name bridge id STP enabled interfaces br0 8000.0021cc4ab047 no enp0s25 virbr0 8000.fe5400044fc2 yes vnet0
此时我们发现,vnet0项信息在virbr0上,说明br0和vnet(虚拟机)没有桥接成功。
执行ping
命令也就无法连通:
[root@localhost shell]# ping 172.25.254.15
PING 172.25.254.15 (172.25.254.15) 56(84) bytes of data.
From 172.25.254.111 icmp_seq=10 Destination Host Unreachable
From 172.25.254.111 icmp_seq=11 Destination Host Unreachable
From 172.25.254.111 icmp_seq=12 Destination Host Unreachable
From 172.25.254.111 icmp_seq=13 Destination Host Unreachable
^C
--- 172.25.254.15 ping statistics ---13 packets transmitted, 0 received, +4 errors, 100% packet loss, time 11999
mspipe 4
将vnet
桥接到br0
上,使用brctl
命令:
[root@localhost shell]# brctl delif virbr0 vnet0 //删除virbr0对vnet0的桥接[root@localhost shell]# brctl addif br0 vnet0 //增加br0对vnet0的桥接
此时,就可以ping
通:
[root@localhost shell]# ping 172.25.254.15
PING 172.25.254.15 (172.25.254.15) 56(84) bytes of data.64 bytes
from 172.25.254.15: icmp_seq=1 ttl=64 time=0.358 ms64 bytes
from 172.25.254.15: icmp_seq=2 ttl=64 time=0.246 ms
^C
--- 172.25.254.15 ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 999msrtt min/avg/max/mdev = 0.246/0.302/0.358/0.056 ms
我们使用virt-manager
打开图形界面,选择test
虚拟机双击打开。点击管理菜单栏中的"小灯泡",找到"Virtual Network Interface"
将Source device
的选项改称Bridge 'br0'
,重启虚拟机即可。
不同机子,可能位置不同,细心找找就能找到这些信息