最近在开发过程中遇到这么一个场景:
- 老王只有一台 Windows 操作系统的台式机,要对一款嵌入式 Linux 的产品进行开发与调试,需要在 Ubuntu 系统下进行软件编译。
- 由于公司的网络资源紧张,一个员工只分配一个固定的 IP 地址,但是要调试的嵌入式 Linux 产品是预留了一个 IP 地址的。
- 为了提升调试效率,嵌入式 Linux 的这款产品需要用 NFS 服务直接挂载 Ubuntu 系统的指定目录,从而避免在宿主机与嵌入式设备之间进行大量的文件拷贝。
针对场景的三个要求,选择实现方案如下:
- 公司没有 Ubuntu 的服务器,那就在 Windows 操作系统上安装 VMware Ubuntu虚拟机。
- 公司局域网 IP 地址紧缺,台式机有 IP 地址,要调试的嵌入式 Linux 设备也有 IP 地址,但是 Ubuntu 虚拟机没有可用的局域网 IP 了。所以,只能将虚拟机配置为 NAT 模式。
- 嵌入式设备需要通过 NFS 挂载 Ubuntu 系统的指定目录,但是 NAT 模式下,嵌入式 Linux 设备没办法直接对虚拟机进行网络访问啊,这咋办?简单,把 Ubuntu 虚拟机上 NFS 相关的网络端口映射到 Windows 台式机上就可以了。
首先,确定 VMware 虚拟机处于 NAT 模式。
第二,确定虚拟机的 IP 地址。
linux@linux-virtual-machine:~$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.233.142 netmask 255.255.255.0 broadcast 192.168.233.255
inet6 fe80::c1c8:818d:cc84:c2d3 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:55:23:85 txqueuelen 1000 (Ethernet)
RX packets 73 bytes 8393 (8.3 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 107 bytes 10855 (10.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 126 bytes 10034 (10.0 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 126 bytes 10034 (10.0 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
第三,确定 NFS 服务相关的主要端口(portmapper,nfs,mountd)。
linux@linux-virtual-machine:~$ rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100005 1 udp 40001 mountd
100005 1 tcp 40001 mountd
100005 2 udp 40001 mountd
100005 2 tcp 40001 mountd
100005 3 udp 40001 mountd
100005 3 tcp 40001 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049
100003 3 udp 2049 nfs
100227 3 udp 2049
100021 1 udp 40002 nlockmgr
100021 3 udp 40002 nlockmgr
100021 4 udp 40002 nlockmgr
100021 1 tcp 40002 nlockmgr
100021 3 tcp 40002 nlockmgr
100021 4 tcp 40002 nlockmgr
可以看到,portmapper 端口号是 111,nfs 端口号是 2049,mountd 的端口号是 40001。
注意:portmapper(111) 和 nfs(2049) 两个端口号是固定的,mountd 的端口号随机的。为了映射方便,老王将其配置为固定的 40001端口了(配置方法可以参考之前的文章:Ubuntu 18.04 固定 NFS 端口)。
第四,运行“虚拟网络编辑器“,以下两种方法可以任选一种。
第五,添加端口映射(以 111 端口为例,依次完成 2049 和 40001 的端口映射)
OK,到这一步,端口映射的步骤就配置完了。嵌入式 Linux 设备端在执行 mount
命令时,只要指定老王台式机的 IP 地址和 mountd 端口号,就可以挂载虚拟机上了目录了。