安装创建TAP界面的工具:
sudo apt-get install uml-utilities
将用户cbpos加入到uml-net组
sudo gpasswd -a cbpos uml-net
chmod 666 /dev/net/tun
然后在host(即主ubuntu 10.04 server)上编辑网络界面配置文件sudo vi
/etc/network/interfaces,内容如下:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet manual
up ifconfig $IFACE 0.0.0.0 up
down ifconfig $IFACE down
tunctl_user posftp \\cbpos是我的用户名,在这里换为你的用户名
auto tap0
iface tap0 inet manual
up ifconfig $IFACE 0.0.0.0 up
down ifconfig $IFACE down
tunctl_user cbpos \\cbpos是我的用户名,在这里换为你的用户名
auto br0
iface br0 inet static \\当然这里也可以使用DHCP分配
bridge_ports eth0 tap0
address 192.168.11.68
netmask 255.255.255.0
network 192.168.11.0
broadcast 192.168.11.255
gateway 192.168.11.1
bridge_stp off
bridge_maxwait 0
bridge_fd 0
激活tap0和br0: //有些时候会不奏效,但重启后就行了
sudo /sbin/ifup tap0
sudo /sbin/ifup br0
好了以后ifconfig看一下,多了一个tap0和br0, br0上的IP地址就是你本机的IP地址。
然后创建虚拟磁盘(用qemu-img命令):
mkdir kvm
cd kvm
kvm create -f qcow2 ubuntu.img 20G
创建虚拟机:
kvm -m 1024 -drive file=/home/cbpos/kvm/ubuntu.img,cache=writeback
-net nic,vlan=0,model=virtio,macaddr=52-54-00-12-34-01 -net
tap,vlan=0,ifname=tap0,script=no -boot d -nographic -daemonize
-cdrom /home/cbpos/ubuntu-10.04.2-server-amd64.iso -no-acpi
这里对各个参数说明一下:
-m 1024 分配1024MB的内存给GUEST OS(即KVM下的虚拟操作系统)
-drive file=/home/cbpos/kvm/ubuntu.img,cache=writeback 使用虚拟磁盘的文件的路径,并启用writeback缓存
-net nic,vlan=0,model=virtio,macaddr=52-54-00-12-34-01 -net
tap,vlan=0,ifname=tapo,script=no
使用网络,并连接到一个存在的网络设备tap0,注意mac地址一定要自己编一个,特别是如果你虚拟了多个系统并且要同时运行的话,不然就MAC冲突了,使用高速网络模式(model=virtio)
-boot d 从光盘启动(从硬盘启动则为 -boot c)
从光盘启动之后就会安装系统。系统安装好了之后用下面命令启动虚拟机
kvm -m 1024 -drive file=/home/cbpos/kvm/ubuntu.img,cache=writeback
-net nic,vlan=0,model=virtio,macaddr=52-54-00-12-34-01 -net
tap,vlan=0,ifname=tap0,script=no -boot c
然后在guest os下用命令ifconfig查看ip,并设置IP,在我的电脑上用命令sudo vi
/etc/network/interface查看到的情况如下:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet manual
up ifconfig $IFACE 0.0.0.0 up
down ifconfig $IFACE down
tunctl_user posftp \\cbpos是我的用户名,在这里换为你的用户名
如果同时运行多个GUEST OS ,则网络设置要改一下,在/etc/network/interfaces
里加几个tap界面就行了,每个GUEST OS单独使用一个TAP,比如说现在要同时运行3个GUEST OS ,则配置文件如下:
auto tap0
iface tap0 inet manual
up ifconfig $IFACE 0.0.0.0 up
down ifconfig $IFACE down
tunctl_user cbpos
\\cbpos是我的用户名,在这里换为你的用户名
auto tap1
iface tap1 inet manual
up ifconfig $IFACE 0.0.0.0 up
down ifconfig $IFACE down
tunctl_user cbpos
\\cbpos是我的用户名,在这里换为你的用户名
auto tap2
iface tap2 inet manual
up ifconfig $IFACE 0.0.0.0 up
down ifconfig $IFACE down
tunctl_user cbpos
\\cbpos是我的用户名,在这里换为你的用户名
auto br0
iface br0 inet static \\当然这里也可以使用DHCP分配
bridge_ports eth0 tap0
address 192.168.11.68
netmask 255.255.255.0
network 192.168.11.0
broadcast 192.168.11.255
gateway 192.168.11.1
bridge_stp off
bridge_maxwait 0
bridge_fd 0
启动GUEST OS
kvm -m 512 -drive file=/home/posftp/kvm/posftp.img,cache=writeback
-net nic,vlan=0,model=virtio,macaddr=52-54-00-12-34-01 -net
tap,vlan=0,ifname=tap0,script=no -boot c -nographic -daemonize
把ifname=tap0换为你要tap1或者tap2就行了,MAC也要改
要注意,系统重启后要重新加载kvm内核模块:
sudo modprobe kvm
sudo modprobe kvm-amd //如果使用AMD处理器
sudo modprobe kvm-intel //如果是用INTEL处理器
当然,你也可以修改系统相关设置在启动时自动加载该模块。
下面是kvm下的虚拟机联网问题(此方法配置好了之后从启电脑需要从新进行一些配置才能上网),所以不要用此方法配置虚拟机联网。
解决方法一:
首先说一下实现原理。我是想先在host上造一块假网卡,然后guest的系统跟这假网卡连接构成一个局域网。guest想连外网的话,就把host当路由器。至于域名服务器,在guest系统里直接指定。
本人实验的host是ubuntu 10.04 server,guest是ubuntu 10.04 server。(都是64位)
接下来我会假设你已经装了kvm,而且能用它启动虚拟机。
(以下一到四网络设定,都在host下操作)
一,首先把必要的工具装了:
sudo apt-get install uml-utilities
二,再造假网卡tap0(名字随便取)并作一些基本配置
sudo tunctl -t tap0 -u xxx
此处xxx换成你自己的用户名
sudo chmod 0666 /dev/net/tun
这样大家都有权力去读写那个假网卡。即使在上面那行代码中你指定了自己的用户名,你还是没有办法读写tap0(很奇怪),所以这条命令是有用的。
三,配置网卡的网络参数。
sudo ifconfig tap0 192.168.0.10 netmask 255.255.255.0 up
随便设,但是你要确保你待会设置的guest的网卡ip跟tap0的属于同一个网段。
四,接下来是系统的配置(连外网所必须)
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
这样开启了linux的ip转发功能,host可以当路由器用了。如果你想让guest连上外网的话这条一定要。
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
这条命令也是连外网所必须的。
五,启动kvm虚拟机
kvm -M pc -m 512 -hda /root/hda.img -net nic -net
tap,ifname=tap0,script=no -boot c
-net nic -net
tap,ifname=tap0,script=no是跟网络相关的,上面的命令的其他部分自己跟据实际情况修改。ifname=你造的假网卡的名字,我的是tap0。
六,guest系统的配置。
guest启动后应该会认出一张网卡,eth0的。把那网卡的ip设定成192.168.0.x,(这个ip跟host下tap0的ip不能相同!但要确保它们同在一个子网。我的是192.168.0.11),并把netmask设成
255.255.255.0。到现在,guest和host应该是同在一个子网了。你可以试一下在guest里ping
192.168.0.10,在host里ping 192.168.0.11,如无意外,应该能ping通。到现在已实现host
guest之间的互访。
七,让guest连上外网。(前提是host已经连上外网)
只需要把guest的默认网关设置成192.168.0.10(你的假网卡的ip)就可以了,非常的简单。
域名服务器手动设置,不会很麻烦(sudo vi
/etc/resolv.conf然后在nameserver后添加DNS就可以了)。