宿主机网络桥接配置
我们要求创建的虚拟机可以和宿主主机共享网段,拓扑图如下:
图1
而桥接环境的宿主机的网络构架如下:
图2
这是宿主机有两块网卡的情况下,如果没有两块网卡(如上图没有eth1)也行,只要把物理网卡(eth0)作为对外接口,而桥接设备(br0)作为宿主机网卡也可以正常通信。
宿主机桥接工具
yum -y install bridge-utils
# 说明:很多Centos的系统都已经自带了,不用安装,可用(rpm -qa | grep birdge)指令查看。
宿主机的网络配置
# 对网络接口(图2中eth0)的修改
cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
ONBOOT=yes
BRIDGE=br0
# 说明:以上三项是必须的,至于HWADDR、NAME、。。。等等,我不知道是不是必须写,自己尝试。
# 对桥接设备(图2中的br0)的修改
cat /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE="br0"
TYPE=Bridge
BOOTPROTO=dhcp
ONBOOT=yes
# 说明:这个设备大多数情况是没有的,需要自己创建,同时这个设备是可以有网址的,作为宿主机的网卡使用(如果图2中宿主机没有eth1,那么eth0被作为接口使用,而这个br0就用来当原来eth0了)。
然后重启网卡就行了
宿主机kvm安装
工具安装
yum install -y qemu-kvm qemu-kvm-tools libvirt
yum install -y virt-install net-tools
systemctl enable libvirtd
systemctl start libvirtd
虚拟机的创建
# Centos7环境下的创建
qemu-img create -f raw 磁盘名.raw 磁盘大小
virt-install --virt-type kvm --name 虚拟机名 --ram 内存大小 --vcpus=CPU核数 --cdrom=镜像路径 --disk path=磁盘路径 --network bridge=桥接设备(图2中的br0),model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole
# Centos6环境下的创建
qemu-img create -f raw 磁盘名.raw 磁盘大小
virt-install --name 虚拟机名 --ram 内存大小 --vcpus=CPU核数 --disk path=镜像路径 --network bridge=桥接设备(图2中的br0) --cdrom 镜像路径 --vnclisten=0.0.0.0 --vncport=5900 --vnc
# Centos6下这么创建有一个问题,就是vnc监听端口是固定的不会自动修改,需要修改配置文件。操作如下:
virsh edit 虚拟机名
。。。。。
<graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
<listen type='address' address='0.0.0.0'/>
</graphics>
。。。。
# 将 autoport 选项改成 yes
# 如果不处理,那么批量克隆的时候就只能启动一台虚拟机。
创建完成后需要安装,用自带的 virt-manager 图形界面和 vncviewer 图形界面进行安装。注意vnc链接的端口就是上图中的 vnclisten 和 port,即 0.0.0.0:5900,当然这个端口只是你创建的第一台,如果创建很多了虚拟机会自动分配端口。可以自行查看端口,操作如下:
# netstat -tunlp //查看端口
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:5900 0.0.0.0:* LISTEN 4878/qemu-kvm
tcp 0 0 0.0.0.0:5901 0.0.0.0:* LISTEN 5051/qemu-kvm
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 1590/rpc.mountd
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 2821/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1474/sshd
tcp 0 0 0.0.0.0:46200 0.0.0.0:* LISTEN -
.........
# vncviewer //启动后按照端口链接图示为0.0.0.0:5900和0.0.0.0:5901两台虚拟机
# ......... //按照自己的要求安装成功后修改文件
如果想用命令行进行控制虚拟机,有两种方法,一是ssh服务,需要虚拟机搭建好网络环境,而且宿主机和虚拟机都安装有openssh软件;二是virsh console your_vm_names 的指令,但是这个指令需要在虚拟机内部做一些修改具体如下:
# 对于CentOS7
grubby --update-kernel=ALL --args="console=ttyS0"
reboot
# 对于其他linux
# 首先在 sercuretty 中添加 ttyS0
echo "ttyS0" >> /etc/sercuretty
# 其次在 grub.conf 中特定行加入 console=ttyS0
cat /etc/grub.conf | grep console=ttyS0
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=128M rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet console=ttyS0
# 最后在 inittab 添加 S0:12345:respawn:/sbin/agetty ttyS0 115200
echo "S0:12345:respawn:/sbin/agetty ttyS0 115200" >> /etc/inittab
reboot
# 如果不操作那么他会停在如下位置
[root@h97 myCentos]# virsh console 虚拟机名
Connected to domain centos7
Escape character is ^]
这样就可以用命令行操控虚拟机了
如果想用脚本操作的话需要用到 expect 脚本来处理登录交互界面,我的一个例子如下
# cat connect.exp
set timeout 3s
set ip [lindex $argv 0]
set setip [lindex $argv 1]
spawn ssh $ip
expect "password:"
send "123456\n"
expect "#"
send "cd /home/\n"
expect "#"
send "./vmset.sh $setip\n"
expect eof
exit
# timeout 是指交互时延,超过了脚本就自动结束
# ip 和 setip 是和 shell 脚本一样的传入值,值得注意的是 expect 脚本传值是从 $argv 0 开始
# spawn 后面接的是要执行的指令
# 然后就是没捕捉到一个关键字(即 expect "关键字"),就发送你想要发送的(即 send "发送的内容")
顺便将kvm虚拟机管理工具的部分常用命令写出来
virt-install # 建立kvm虚拟机
virsh list --all # 查看正在运行的KVM虚拟机
virsh list --all # 查看所有KVM虚拟机
virsh start name # 启动KVM虚拟机
virsh shutdown name # 正常关闭KVM虚拟机(一般要等几分钟)
virsh destroy name # 强制关闭KVM虚拟机(类似于直接断电)
virsh suspend name # 挂起KVM虚拟机
virsh resume name # 恢复挂起的KVM虚拟机
virsh dumpxml name # 查看KVM虚拟机配置文件
virsh edit name # 编辑KVM虚拟机的xml配置文件(虚拟机关机后生效)
virsh undefine name # 彻底删除KVM虚拟机,建议先用virsh dumpxml name > xxx.xml 保存配置文件)
virsh define xxx.xml # 根据xxx.xml文件定义虚拟机
virsh console name # 字符界面控制虚拟机
virsh domiflist name # 显示虚拟机的网卡信息
virsh attach-interface name --type bridge --source br0 --medol virtio--config
# 给虚拟机增加网卡,后面是网卡参数,根据 domiflist 查看情况来确定(虚拟机关机后生效,宿主机重启后失效,需要保存到配置文件中,在重新define)
virsh detach-interface name --type bridge --mac 物理地址
# 删除虚拟机网卡,参数根据 domiflist 查看情况来