Kvm 只支持x86 64的硬件虚拟化 要求cpu必须支持硬件虚拟化 HVM
Kvm两个组件:
1 kvm.ko模块装入后为/dev/kvm 工作为hypervisor ,在用户空间通过系统调用loctl()与内核中的kvm模块交互,从而完成虚拟机的创建,启动
2qemu-kvm进程:在用户空间用于实现IO设备模拟,用于实现一个虚拟机实例
Kvm架构
Virtio:开源的半虚拟化解决方案
KSM:扫描内存,如发现有多个虚拟机实例的内存有共同的数据内存空间,将其合唯一(用的不多)
Kvm管理工具
1 使用qemu-kvm管理kvm
qemu:
处理器模拟器
仿真各IO设备
将仿真设备连接至主机的物理设备
提供用户接口
想命令使用qemu 创建链接 ln -sv /usr/libexec/qemu-kvm /usr/bin
Qemu-kvm
-machine [type=]name:-machine help来获取列表,用于指定模拟的主机类型;
-cpu cpu:-cpu help来获取列表;用于指定要模拟的CPU型号;
-smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]:指明虚拟机上vcpu的数量及拓扑;
-boot [order=drives][,once=drives][,menu=on|off] [,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_time][,strict=on|off]
order:各设备的引导次序:c表示第一块硬盘,d表示第一个光驱设备;-boot order=dc,once=d
-m megs:虚拟机的内存大小;
-name NAME:当前虚拟机的名称,要惟一;
块设备相关的选项:
-hda/-hdb file:指明IDE总线类型的磁盘映射文件路径;第0和第1个;
-hdc/-hdd file:第2和第3个;
-cdrom file:指定要使用光盘映像文件;
-drive [file=file][,if=type][,media=d][,index=i][,cache=writethrough|writeback|none|directsync|unsafe][,format=f]:
file=/PATH/TO/SOME_IMAGE_FILE:映像文件路径;
if=TYPE:块设备总线类型,ide, scsi, sd, floppy, virtio,...
media=TYPE:介质类型,cdrom和disk;
index=i:设定同一类型设备多个设备的编号;
cache=writethrough|writeback|none|directsync|unsafe:缓存方式;
format=f:磁盘映像文件的格式;
显示选项:
-display type:显示的类型,sdl, curses, none和vnc;
-nographic:不使用图形接口;
-vga [std|cirrus|vmware|qxl|xenfb|none]:模拟出的显卡的型号;
-vnc display[,option[,option[,...]]]]:启动一个vnc server来显示虚拟机接口; 让qemu进程监听一个vnc接口;
display:
(1) HOST:N
在HOST主机的第N个桌面号输出vnc;
5900+N
(2) unix:/PATH/TO/SOCK_FILE
(3) none
options:
password:连接此服务所需要的密码;
-monitor stdio:在标准输出上显示monitor界面;
Ctrl-a, c:在console和monitor之间切换;
Ctrl-a, h
模拟:
网络选项:
-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
创建个磁盘影像文件:
qemu-img create -f qcow2 -o perallocation=metadate,size=80g /vms/centos/centos.img
创建虚拟网络:
创建虚拟网卡,都是成对出现的一个在虚拟机上,另一个添加到桥上这样就可以通信了
ip link add vethm.1 type veth peer name vethm.2
ip link show 显示
ip link del vethx.1 type veth peer name vethx.2 删除
这里可以模拟个空间,然后将一个网卡放进去
ip netns add router1 创建
ip netns list 查看
ip link set dev vethm.2 netns router1 vethm.2 添加 router1 中
在router1 中查看
ip netns exec router1 ifconfig -a
配置 ip 后激活就可以通信了
一般虚拟机都会将另一个网卡添加到桥中
brctl show 显示
创建一个桥:brctl addbr br-int
Ifconfig br-int up 激活
脚本:
#!/bin/bash
Bridge=br-int
If [ -n “$1” ]; then
Ip link set $1 up
Sleep 1
Brctl addif $bridge $1
[ $? -eq 0] && exit 0 || exit 1
Else
Echo “no interface specified”
Exit 2
Fi
启动虚拟机实例:
#qemu-kvm -name c1 -m 256 -smp 2 -drive file=/vms/ cirros1.img,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:00:00 -net tap,script=/etc/qemu-ifup -vnc :0 -daemonize
再起一个
~]# qemu-kvm -name c2 -m 256 -smp 2 -drive file=/vms/cirros/cirros1.img,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:00:01 -net tap,script=/etc/qemu-ifup -vnc :2 -daemonize
此时看在桥中关联了两个网卡tap01 tap02
# vncviewer :0 & 进入虚拟机
基于net与外面交互
打开核心转发:sysctl -w net.ipv4.ip_forward=1
在虚拟机中,指定网关 :route add default gw 10.1.1.254
iptables -t nat –vnL
ping 进行抓包发现是宿主机在访问
tcpdump -i ens33 icmp
如何将外面服务器连接到虚拟机,添加dnat规则
Iptables -t nat -A preroutung -d 172.16.0.67 -p tcp --dport 22922 -j DNAT --to destination 10.1.1.1:22
#ssh -p 22922 root@172.16.0.67
Dnsmasq 是一个轻量级的dns和dhcp服务器
#dnsmasq -i br-int -F 10.1.1.11,10.1.1.100 -o 3,10.1.1.254