在同一主机上的2个vmware工作站之间进行文件传输

时间:2014-08-26 17:32:50

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

我需要将文件从 aProcess1 传输到VmWare工作站内的 VM1 到另一个 VM2 在同一主机上的同一个VmWare Workstation虚拟机管理程序,以便计算这两个虚拟机之间的 数据传输速率

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

  2. 还有如何管理虚拟机中的端口(让我们说两个Ubuntu都在工作) 在编写服务器客户端程序..?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

假设您的 VM1 VM2 具有一些有效的ISO-OSI-L2 / L3连接,因此可以使用一些传输,设置流程到流程通信的更好方法是使用一些经过行业验证的消息传递框架,而不是花时间构建另一个ftp-c / s。

对于发送/接收任何内容(包括BLOB类似于整个文件),尝试 ZeroMQ nanomsg 库,因为这些是无代理框架,具有许多编程的绑定语言准备好&amp;具有真正的性能/低延迟。

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

检查http://zguide.zeromq.org/c:fileio3以获得有关其他附加功能的其他见解,例如负载均衡,故障恢复等。

根据您的Q1:FTP服务器本身报告文件传输时间。在ZeroMQ中,您可以通过语法测量文件传输所花费的时间量作为两个时间戳之间的距离

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