虚拟机及网络终极方案(VBox 与 KVM 齐行)(2012-03-06 更新)

Kvm、VMware、Virtualbox、Xen、Qemu 等
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

虚拟机及网络终极方案(VBox 与 KVM 齐行)(2012-03-06 更新)

#1

帖子 自由建客 » 2012-01-12 20:04

虚拟机及网络终极方案(VBox 与 KVM 齐行)

[text]
# 更新日志:
2012-03-06
行文排版有所变动。取消 starbr 脚本,直接利用 ifplugd 特性在后台启动网桥,因此也就显得简洁了些。
2012-03-03
较上次无实质性改变,仅因 ifplugd 可弹出消息而略有变动。
2012-02-27
此次更新及以前并无记录。
[/text]

环境:
Debian 6 squeeze
Ubuntu 兼容,其特别之处文中均有说明

壹:虚拟机安装
一、 VirtualBox
[bash]
# ============================================================================
# 虚拟机(VirtualBox)
# http://www.virtualbox.org/wiki/Linux_Downloads
cd /tmp
wget http://download.virtualbox.org/virtualb ... e_vbox.asc
apt-key add oracle_vbox.asc
rm oracle_vbox.asc
cd -
cat >> /etc/apt/sources.list <<EOF
deb http://download.virtualbox.org/virtualbox/debian squeeze contrib non-free
EOF
aptitude update
aptitude search virtualbox
aptitude install -R dkms virtualbox-4.1

# ----------------------------------------------------------------------------
# 入组
gpasswd -a $XXX vboxusers
[/bash]
非 Debian squeeze 系统的源列表请参看 VBox 官网说明。必须注意,只要你那系统版本对应的那一行便是,加多了定会造成混乱。不清楚自己所用版本名称的去这里看, Debian Ubuntu
顺便说句,少数情况下, VBox 可能无法使用 USB 设备,对此可用下面 qemu / kvm 那招(给 plugdev 组赋予操作权)解决。

二、 Qemu / KVM
[bash]
# ============================================================================
# 虚拟机(qemu / kvm)
aptitude install -R qemu-system qemu-utils qemu-kvm
rm -f /lib/udev/rules.d/60-qemu-system.rules

# 若主机用 64 位系统,将默认 qemu 设为 qemu-system-x86_64 更妥
update-alternatives --config qemu

# 给 plugdev 组(不推荐 kvm 组)赋予 USB 设备操作权,不与 VBox 冲突,放心使用
vi /etc/udev/rules.d/10-usb-plugdev.rules #{
SUBSYSTEM=="usb_device", GROUP="plugdev", MODE="0664"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GROUP="plugdev", MODE="0664"
#}

# ----------------------------------------------------------------------------
# 入组
gpasswd -a $XXX kvm
# 若尚未入 plugdev 组,则再
gpasswd -a $XXX plugdev
[/bash]
若无需模拟 ARM 等非 x86 架构,只要安装 qemu-kvm 即可。
Debian / Ubuntu 中 qemu-system(含 qemu 命令)与 qemu-kvm(含 kvm 命令)并不冲突。奇特的是, qemu 命令在 -enable-kvm 时只能使用单处理器, kvm 命令能用多核但在未加载 kvm 模块时并不出错而自动转用软模拟从而导致系统缓慢。所以最好两者都装上,然后更具需要用哪个命令。基本上 kvm 命令可看作就是自动带上 -enable-kvm 的 qemu 命令。
若只安装 qemu-system 而又不愿意安装 qemu-kvm,为了能自由切换 VBox 和 kvm,则应当提取 qemu-kvm 包中的 /etc/init.d/qemu-kvm 文件。
qemu-utils 包含的工具 qemu-kvm 中都有,貌似仅命令名不同而已。另, Ubuntu 11.10 并不含该包。
个人认为, qemu-system 应当是 qemu-kvm 的超集且两者互斥更为妥当。需要更多功能的就只装 qemu-system,否则就只装 qemu-kvm。

三、 VBox / KVM 切换
[bash]
# ============================================================================
# VBox / KVM 切换
tar xf "${LOCALPKG}/swapvm.tar.gz" -C /

# 设置特权,方便切换
visudo #{
%kvm localhost= /usr/local/bin/swapvm
%vboxusers localhost= /usr/local/bin/swapvm
#}

# 若以 KVM 为主 VBox 为辅
insserv -r vboxballoonctrl-service
insserv -r vboxweb-service
insserv -r vboxdrv
# 若以 VBox 为主 KVM 为辅
insserv -r qemu-kvm
[/bash]
VBox 与 KVM 的模块虽可同时加载,但无法同时使用,后加载的会令先加载的无效(后来居上)。若要同时运行两种虚拟机,必然有一种无法使用处理器的虚拟化技术而用纯软件模拟。所以,用 swapvm 命令切换也只不过是权宜之计。
swapvm.tar.gz
(391 Bytes) 已下载 392 次
SHA1: 86030614b3b9ae305f4df69861707458fea5a52b


贰:虚拟机网络终极方案
说终极难免有些夸张,但应该可以说是“已经能较好地满足大部分人的需求”了。或许你的需求没这么苛刻,简单的桥接一台虚拟机或用虚拟机自己的 NAT 或 USER 模式即可满足,但也不妨看上一眼。

一、需求
1. 能同时将多台虚拟机置于与宿主机同一网络之中(桥接多台虚拟机),从而使各虚拟机各物理主机都能两两通信。
2. 能将多台虚拟机置于一个内部局域网之中,以隔离更多的物理主机。但保证各虚拟机和宿主机之间可两两通信,同时能上因特网。
3. 统一 VBox、 Qemu 或 KVM 网络。当然, VBox 和 KVM 受限于内部机制而不能同时运行,但和 Qemu 同时运行没有任何问题。
3. 普通账户或某特定组即可操作(无须 root 账户或 sudo)。

二、网络结构
虚拟网络结构.png
三、安装配置
前提:剥夺 network-manager 对 eth0 的控制权,断线重连交由 ifplugd 负责。

1. 安装 ifplugd 网卡监视器:
[bash]
# ============================================================================
# 安装 ifplugd 网卡监视器
aptitude install -R ifplugd
tar xf "${LOCALPKG}/ifplugd-action.tar.gz" -C /
vi /etc/default/ifplugd #{
INTERFACES="eth0"
ARGS="-q -f -u3 -d10 -I"
#}
[/bash]
ifplugd-action.tar.gz,此处并不附包,其下载及相关信息请看《令 ifplugd 支持网桥和弹出消息》。若链接已死请看我签名,若未直接显示相关信息,请点击【更多在此】!
/etc/default/ifplugd 中的 ARGS 默认或许有 -w,务必要将其去掉,否则在开机时将要花上很长的时间等待获取 IP,如果你用 DHCP 的话。

2. 安装虚拟网络基本工具:
[bash]
# ============================================================================
# 虚拟网络
aptitude install -R bridge-utils vde2
# VBox 需要 libvdeplug.so,否则无法连接 VDE
cd /usr/lib/
ln -s libvdeplug.so.2.1.0 libvdeplug.so
cd -
[/bash]
此二包或许已安装,但此处仍显式说明以求强调。

3. 配置网络:
[bash]
# ----------------------------------------------------------------------------
# 网络配置
vi /etc/network/interfaces #{
auto lo tap0
#allow-hotplug eth0

iface lo inet loopback
pre-up iptables-restore </etc/network/iptables.rules || true
pre-up [ "`runlevel`" = "unknown" ] && echo 'eth0=br0' >/var/run/ifplugd.map || true
#pre-up runlevel >/root/runlevel

iface eth0 inet dhcp
pre-up ifdown br0
post-up sed -i '/^eth0=/d' /var/run/ifplugd.map || true

## NAT
iface tap0 inet static
address 192.168.10.1
netmask 255.255.255.0
vde2-switch -
vde2-slirp -n 192.168.10.0 -dhcp
up ifconfig tap0 down
up ifconfig tap0 hw ether 52:53:00:00:00:00
up ifconfig tap0 up

## Bridge
iface tap1 inet static
address 192.168.0.1
netmask 255.255.255.0
vde2-switch -
up ifconfig tap1 down
up ifconfig tap1 hw ether 52:53:00:00:00:01
up ifconfig tap1 up
iface br0 inet dhcp
pre-up ifdown eth0
pre-up ifup tap1
pre-up ifconfig tap1 0.0.0.0
bridge_ports eth0 tap1
post-up sed -i '/^eth0=/d' /var/run/ifplugd.map || true
post-up echo 'eth0=br0' >>/var/run/ifplugd.map
#}
[/bash]
eth0 和 br0 构成互斥项,启动任何一个将自动停止另外一个。 tap1 可随 br0 启动但绝不可随 br0 关闭,因为 tap1 连接着若干虚拟机,不可轻易断开。
tap1 中 address 与 netmask 纯粹摆设,因为那是 static 方式必须的字段。不能用 manual 方式,因为那将导致 vde_switch 并不与之连接。
tap0、 tap1 最后都有三行为其专门特设一物理地址,以便于管理和使用。
无论开机时是要自动启动 eth0 还是启动网桥 br0, auto 与 allow-hotplug 行都不要填写 eth0 及 br0,我们利用 ifplugd 代劳。因为网桥通过 DHCP 获取 IP 太慢了, ifplugd 可在后台工作而不会拖延开机时间。
若希望一开机就能使用网桥,则应启用“iface lo”下面有“eth0=br0”那行,上例便是如此。若希望开机时自动启动 eth0 而不要网桥,则应注释掉该行。注意,该行是一个而不是两个大于号。
若启用了“eth0=br0”行但实际上开机后见到的只是 eth0 而不是 br0,则说明“[ "`runlevel`" = "unknown" ]”那里判断有误,只要临时开启下面一行“pre-up runlevel >/root/runlevel”并重启后查看 /root/runlevel 文件,将其内容替换掉“unknown”再重启即可。

4. 设置特权:
[bash]
# ----------------------------------------------------------------------------
# 设置特权,方便切换
visudo #{
%vde2-net localhost= /sbin/ifup br0
%vde2-net localhost= /sbin/ifup eth0
%vde2-net localhost= /sbin/ifup tap0, /sbin/ifdown tap0
%vde2-net localhost= /sbin/ifup tap1, /sbin/ifdown tap1
#}

# ----------------------------------------------------------------------------
# 入组
gpasswd -a $USERNAME vde2-net
[/bash]
br0 和 eth0 只有 ifup 而没有 ifdown,正如前面所说——互斥。
之所以对 vde2-net 组启用特权在于最小化风险范围,因为要使用 vde 的账户必然是该组成员。

5. 毕:
至此,凡是连接到 /var/run/vde2/tap0.ctl/ 的所有虚拟机都处于一内网之中,宿主机通过 tap0 加入该网络。所以宿主机和各虚拟机两两通信绝无障碍。
slirpvde 进程提供 DHCP 和 NAT 服务,以使该局域网中的机器能访问外网。当然,高级用户也可不用 slirpvde 而配置 iptable。

同理,凡是连接到 /var/run/vde2/tap1.ctl/ 的所有虚拟机都为桥接,与宿主机处于同一网络之中。
此处可连接多台虚拟机,而不再仅限一台,因为我们用了“交换机”,虚拟机接的是交换机而不是宿主机的 tap1。

正常使用虚拟机时并不需要 sudo 等提权手段。

四、何时用桥接
如果你只是想宿主机能访问虚拟机的服务或者各虚拟机之间能相互通信,那请用 NAT。
只有在你确定宿主机之外的其它物理主机需要访问你的虚拟机时才用桥接。
桥接是一种依赖外部网络的接入方式,如果外部网络出现问题(比如宿主掉线),那宿主机和虚拟机也将断掉联系。所以说没事别用桥接。

五、感慨
Debian 的 ifupdown 确实是个灵活统一而又优雅的机制。
其实整个配置并不难,关键在于你想要什么。总归一句“拓扑明而众结解”。

六、附
连接 VDE 示例,请配合相应虚拟机文档共同参考

1. Qemu / KVM:
启动参数加 -net vde,sock=...

代码: 全选

-net nic,model=rtl8139,macaddr=52:53:00:00:08:01 -net vde,sock=/var/run/vde2/tap1.ctl
2. VirtualBox(两种方法):
其一,命令行:
[bash]
# 在关闭相应虚拟机(例如 vm-debian1)的情况下,执行下述命令,一次便可,日后可照常启动虚拟机
VBoxManage modifyvm vm-debian1 --nic1 generic
VBoxManage modifyvm vm-debian1 --nicgenericdrv1 VDE
VBoxManage modifyvm vm-debian1 --nicproperty1 network=/var/run/vde2/tap1.ctl
[/bash]
其二,图形界面设置:
网络设置页 -> 连接方式 -> Generic Driver -> 界面名称 -> VDE -> 高级 -> Generic Properties(属性) -> 输入“network=/var/run/vde2/tap1.ctl” -> 确定
上次由 自由建客 在 2012-03-08 19:37,总共编辑 35 次。
头像
Cherrot
帖子: 981
注册时间: 2011-04-03 10:01
系统: Ubuntu 12.XX
来自: 帝都
联系:

Re: 虚拟机网络终极方案

#2

帖子 Cherrot » 2012-01-12 20:23

感谢! :em11
Ubuntu技巧汇总http://wiki.ubuntu.org.cn/UbuntuSkills --你遇到的各种问题可能已经在里面了
我的技术博客http://www.cherrot.com
Code tells you how, comments should tell you why.
头像
qy117121
论坛版主
帖子: 50528
注册时间: 2007-12-14 13:40
系统: Winbuntu
来自: 志虚国乌由市
联系:

Re: 虚拟机网络终极方案

#4

帖子 qy117121 » 2012-01-16 10:13

多个犀牛角 :em20
渠月 · QY   
本人只会灌水,不负责回答问题
无聊可以点一下→ http://u.nu/ubuntu

Ubuntu 20.04 快速设置指南,请配合浏浏览器自动翻译使用

邮箱 chuan@ubuntu.org.cn
头像
英拉嫁到
帖子: 1240
注册时间: 2011-08-09 15:33

Re: 虚拟机网络终极方案

#5

帖子 英拉嫁到 » 2012-01-16 11:47

“已经能较好地满足大部分人的性需求”了
代理网店

囗囗,被计划生育毁了;童年,被教育毁了;青春,被大学毁了;理想,被现实毁了;婚姻,被小三毁了;幸福,被房价毁了;健康,被地沟油毁了;安全,被铁道部毁了;民生,被城管毁了;真相,被央视毁了;慈善,被红十字会毁了;速度,被动车毁了;隐私,被微博毁了……口袋里一点金钱,还被 CPI 给毁了……老天啊,这日子没法活了!
头像
月下叹逍遥
论坛版主
帖子: 33994
注册时间: 2010-10-07 14:23
系统: Archdows10
来自: 某系某星某洲某国某省某市
联系:

Re: 虚拟机网络终极方案

#6

帖子 月下叹逍遥 » 2012-01-16 11:52

:em09
浮生七十今三十,从此凄惶未可知
头像
YeLee
论坛版主
帖子: 26406
注册时间: 2008-08-13 8:48
系统: Fundu i64
来自: 东海硇州,一双管钥。
联系:

Re: 虚拟机网络终极方案

#7

帖子 YeLee » 2012-01-16 13:31

建客的技术贴,支持一下。 :em11 :em11 :em11
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关
plepman
帖子: 72
注册时间: 2008-12-17 23:09

Re: 虚拟机网络终极方案

#8

帖子 plepman » 2012-01-29 12:31

方案很好。
头像
TeliuTe
论坛版主
帖子: 7668
注册时间: 2007-11-25 13:29
系统: 16/18/20/w7
来自: 新疆博乐
联系:

Re: 虚拟机网络终极方案

#9

帖子 TeliuTe » 2012-01-31 23:45

标记备用
hanscea
帖子: 1
注册时间: 2012-01-31 22:37

Re: 虚拟机网络终极方案

#10

帖子 hanscea » 2012-02-01 8:21

:em11 mark之。
头像
TeliuTe
论坛版主
帖子: 7668
注册时间: 2007-11-25 13:29
系统: 16/18/20/w7
来自: 新疆博乐
联系:

Re: 虚拟机安装 及 虚拟网络终极方案(VBox 与 KVM 齐行)

#11

帖子 TeliuTe » 2012-02-04 11:03

试了一下,在 insserv startbr 似乎出错(U10.10+Openbox+Vbox4.0.2r69518)

代码: 全选

root@TeliuTe:/usr/lib# insserv startbr
The script you are attempting to invoke has been converted to an Upstart
job, but lsb-header is not supported for Upstart jobs.
insserv: warning: script 'S32portmap' missing LSB tags and overrides
insserv: warning: script 'K20tftpd-hpa' missing LSB tags and overrides
The script you are attempting to invoke has been converted to an Upstart
job, but lsb-header is not supported for Upstart jobs.
insserv: warning: script 'K20acpi-support' missing LSB tags and overrides
The script you are attempting to invoke has been converted to an Upstart
job, but lsb-header is not supported for Upstart jobs.
The script you are attempting to invoke has been converted to an Upstart
job, but lsb-header is not supported for Upstart jobs.
The script you are attempting to invoke has been converted to an Upstart
job, but lsb-header is not supported for Upstart jobs.
The script you are attempting to invoke has been converted to an Upstart
job, but lsb-header is not supported for Upstart jobs.
The script you are attempting to invoke has been converted to an Upstart
job, but lsb-header is not supported for Upstart jobs.
insserv: Service mountkernfs has to be enabled to start service startbr
insserv: exiting now!
建议加上步骤序号,看着有些费劲
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: 虚拟机安装 及 虚拟网络终极方案(VBox 与 KVM 齐行)

#12

帖子 自由建客 » 2012-02-04 12:32

TeliuTe, 是我的错。抱歉,不过现在没心情搞。过些天吧。
mooling
帖子: 3
注册时间: 2008-04-25 11:05

Re: 虚拟机及网络终极方案(VBox 与 KVM 齐行)(2012-02-13 更新)

#13

帖子 mooling » 2012-02-15 16:27

学习了,很强的技术贴啊
头像
独孤
帖子: 838
注册时间: 2008-02-02 13:06
来自: 寶能科技
联系:

Re: 虚拟机及网络终极方案(VBox 与 KVM 齐行)(2012-02-13 更新)

#14

帖子 独孤 » 2012-02-19 8:43

tag_by_firstuan.l 虚拟机 方案 网络
头像
anonymity
帖子: 645
注册时间: 2009-03-14 16:31
来自: 不在故乡的地方

Re: 虚拟机及网络终极方案(VBox 与 KVM 齐行)(2012-02-13 更新)

#15

帖子 anonymity » 2012-02-19 15:49

lz,使用无线的话,理论上是不是只需要吧eth0修改为wlan0,并保证连通?
Only the dead have seen the end of war!
回复