【问题标题】:File transfer between 2 vmware workstations on same host同一主机上的 2 个 vmware 工作站之间的文件传输
【发布时间】:2014-08-26 17:32:50
【问题描述】:

我需要将文件从 VmWare 工作站内 VM1 上的 aProcess1 传输到另一个 VM2 内相同的 VmWare Workstation hypervisor在同一台主机上,从而计算这 2 个虚拟机之间的数据传输率

  1. 要么写一个FTP服务器客户端服务器程序,那么如何计算时间..?

  2. 以及如何管理虚拟机中的端口(假设在两个 Ubuntu 上都可以工作) 在编写服务器客户端程序..?

【问题讨论】:

  • 为什么要开发任何东西?现有资源很多:iperf、FTP服务器和客户端、SFTP服务器和客户端等。
  • 实际上我正在尝试分析为虚拟机提供 RAM 以进行云计算,为此我需要获得 2 个虚拟机中的数据传输率

标签: networking ubuntu-12.04 virtual-machine vmware ftp-client


【解决方案1】:

您需要做的事情并非微不足道,您必须付出一些努力。首先,您需要在两个 VM 之间创建一个桥接器,并让每个 VM 在该桥接器上都有一个 tap 接口。

我在下面有一个脚本,您可以将其视为示例 - 它创建一些屏幕会话(您将需要一个基本的 .screenrc),并且我在每个屏幕选项卡中启动一个 VM。真正让您感兴趣的是网桥设置以及如何启动 qemu。

您需要静态路由的网络设置 - 下面是我的示例,其中 eth0 作为用户网络接口,eth1 作为连接到对等 VM 的接口。你可以摆脱 eth0。对等 VM 路由是此路径的镜像

sudo vi /etc/network/interfaces

auto lo
iface lo inet loopback
auto eth0
  iface eth0 inet dhcp
  up route add default gw 10.0.2.2 eth0
auto eth1
iface eth1 inet static
  address 20.0.0.1
  netmask 255.255.255.0
  network 20.0.0.0
  broadcast 20.0.0.255
  gateway 20.0.0.2
  up route add -host 21.0.0.1  gw 20.0.0.2 dev eth1
  up route add -host 21.0.0.2  gw 20.0.0.2 dev eth1
  up route del default gw 20.0.0.2 eth1

# You want it like this:
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.0.2.2        0.0.0.0         UG    0      0        0 eth0
default         20.0.0.2        0.0.0.0         UG    0      0        0 eth1
10.0.2.0        *               255.255.255.0   U     0      0        0 eth0
20.0.0.0        *               255.255.255.0   U     0      0        0 eth1
link-local      *               255.255.0.0     U     1000   0        0 eth0

# on the peer
default         10.0.2.2        0.0.0.0         UG    0      0        0 eth0
default         21.0.0.2        0.0.0.0         UG    0      0        0 eth1
10.0.2.0        *               255.255.255.0   U     0      0        0 eth0
21.0.0.0        *               255.255.255.0   U     0      0        0 eth1
link-local      *               255.255.0.0     U     1000   0        0 eth0

一旦您启动了虚拟机并在每个虚拟机上配置了静态路由,您就可以使用 iperf,一端作为接收器,另一端作为源,例如:

iperf -s
iperf -c 20.0.0.1 -t 10 -i 1

桥接脚本设置:

#
# Settings
#
INCLUDE_QEMU_AS_SCREEN=
A_TELNET_1=6661
A_NAME="A-VM"
A_MEMORY=1G

B_TELNET_1=6665
B_NAME="B-VM"
B_MEMORY=1G

A_DISK_IMAGE=.A.disk.img
B_DISK_IMAGE=.B.disk.img

A_PID=.A.pid
B_PID=.B.pid

A_CMD_1=.A.cmd.1
B_CMD_1=.B.cmd.1

#
# Run QEMU in background or foreground
#
if [ "$INCLUDE_QEMU_AS_SCREEN" != "" ]
then
    SCREEN_QEMU_A='screen -t "A-qemu"'
    SCREEN_QEMU_B='screen -t "B-qemu"'
else
    SCREEN_QEMU_A='bg'
    SCREEN_QEMU_B='bg'
fi

#
# Store logs locally and use the date to avoid losing old logs
#
LOG_DATE=`date "+%a_%b_%d_at_%H_%M"`
HOME=$(eval echo ~${SUDO_USER})
LOG_DIR=logs/$LOG_DATE
mkdir -p $LOG_DIR
if [ $? -ne 0 ]; then
    LOG_DIR=/tmp/$LOGNAME/logs/$LOG_DATE
    mkdir -p $LOG_DIR
    if [ $? -ne 0 ]; then
        LOG_DIR=.
    fi
fi

LOG_DIR_TEST=$LOG_DIR
mkdir -p $LOG_DIR_TEST

#
# create the tap
#
echo
echo ================ create taps ================
sudo tunctl -b -u $LOGNAME -t $LOGNAME-tap1
sudo tunctl -b -u $LOGNAME -t $LOGNAME-tap2

#
# bring up the tap
#
echo
echo =============== bring up taps ===============
sudo ifconfig $LOGNAME-tap1 up
sudo ifconfig $LOGNAME-tap2 up

#
# show the tap
#
echo
echo =================== tap 1 ===================
ifconfig $LOGNAME-tap1
echo
echo =================== tap 4 ===================
ifconfig $LOGNAME-tap2

#
# create the bridge
#
sudo brctl addbr $LOGNAME-br1

#
# bring up the bridge
#
sudo ifconfig $LOGNAME-br1 1.1.1.1 up

#
# show my bridge
#
echo
echo =================== bridge 1 ===================
ifconfig $LOGNAME-br1
brctl show $LOGNAME-br1
brctl showmacs $LOGNAME-br1

#
# attach tap interface to bridge
#
sudo brctl addif $LOGNAME-br1 $LOGNAME-tap1
sudo brctl addif $LOGNAME-br1 $LOGNAME-tap2

SCRIPT_START="echo Starting..."
SCRIPT_EXIT="echo Exiting...; sleep 3"

cat >$A_CMD_1 <<%%%
$SCRIPT_START
script -f $LOG_DIR_TEST/VM-A -f -c 'telnet localhost $A_TELNET_1'
$SCRIPT_EXIT
%%%

cat >$B_CMD_1 <<%%%
$SCRIPT_START
script -f $LOG_DIR_TEST/VM-B -f -c 'telnet localhost $B_TELNET_1'
$SCRIPT_EXIT
%%%

chmod +x $A_CMD_1
chmod +x $B_CMD_1

run_qemu_in_screen_or_background()
{
    SCREEN=$1
    shift

    if [ "$SCREEN" = "bg" ]
    then
        $* &
    else
        $SCREEN $*
    fi
}

echo
echo
echo
echo "##########################################################"
echo "#                   Starting QEMU                        #"
echo "##########################################################"
echo
echo
echo

run_qemu_in_screen_or_background \
    $SCREEN_QEMU_A \
        qemu-system-x86_64 -nographic \
            -m $A_MEMORY \
            -enable-kvm \
            -drive file=$A_DISK_IMAGE,if=virtio,media=disk \
            -serial telnet:localhost:$A_TELNET_1,nowait,server \
            -net nic,model=e1000,vlan=21,macaddr=10:16:3e:00:01:12 \
            -net tap,ifname=$LOGNAME-tap1,vlan=21,script=no \
            -boot c \
            -pidfile $A_PID

run_qemu_in_screen_or_background \
    $SCREEN_QEMU_B \
        qemu-system-x86_64 -nographic \
            -m $B_MEMORY \
            -enable-kvm \
            -drive file=$B_DISK_IMAGE,if=virtio,media=disk \
            -serial telnet:localhost:$B_TELNET_1,nowait,server \
            -net nic,model=e1000,vlan=21,macaddr=30:16:3e:00:03:14 \
            -net tap,ifname=$LOGNAME-tap2,vlan=21,script=no \
            -boot c \
            -pidfile $B_PID

sleep 1

screen -t "$A_NAME"   sh -c "sh $A_CMD_1"
screen -t "$B_NAME"   sh -c "sh $B_CMD_1"

sleep 5

echo
echo
echo
echo "##########################################################"
echo "#                   Hit enter to quit                    #"
echo "##########################################################"
echo
echo
echo

read xx

cat $A_PID 2>/dev/null | xargs kill -9 2>/dev/null
rm -f $A_PID 2>/dev/null
cat $B_PID 2>/dev/null | xargs kill -9 2>/dev/null
rm -f $B_PID 2>/dev/null

rm -f $A_CMD_1 2>/dev/null
rm -f $B_CMD_1 2>/dev/null

sudo brctl delif $LOGNAME-br1 $LOGNAME-tap1
sudo brctl delif $LOGNAME-br1 $LOGNAME-tap2

sudo ifconfig $LOGNAME-br1 down

sudo brctl delbr $LOGNAME-br1

sudo ifconfig $LOGNAME-tap1 down
sudo ifconfig $LOGNAME-tap2 down

sudo tunctl -d $LOGNAME-tap1
sudo tunctl -d $LOGNAME-tap2

【讨论】:

    【解决方案2】:

    假设您的 VM1VM2 有一些活动的 ISO-OSI-L2/L3 连接,所以有一些可用的传输,这是一种更好的方法设置进程间通信是使用一些经过行业验证的消息传递框架,而不是花时间构建另一个 ftp-c/s。

    对于发送/接收任何东西(包括整个文件的 BLOB),请尝试 ZeroMQnanomsg 库,因为这些是无代理框架,具有许多编程的绑定语言准备就绪并具有真正的性能/低延迟。

    任何分布式流程到流程系统项目都将受益于早期采用和使用这种方法。

    查看http://zguide.zeromq.org/c:fileio3,了解有关负载平衡、故障恢复等附加优势的更多见解。

    根据您的 Q1:FTP 服务器本身会报告文件传输时间。在 ZeroMQ 中,您可以以两个时间戳之间的距离,以实用的方式测量文件传输所花费的时间

    根据您的 Q2:对于 ZeroMQ,使用 Ubuntu 中允许(不受限制)的任何端口

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      • 2021-06-29
      • 2013-06-01
      • 1970-01-01
      相关资源
      最近更新 更多