记录一次vxworks下使用NFS组件的过程
阅读原文时间:2023年07月16日阅读:1

问题:有三块CPU都运行vxworks6.9,现在想要CPU3做server,CPU1-2通过NFS访问CPU3上的文件

补充:使用防火墙可能会影响NFS访问,目前我还没有找到解决办法。。。

下面是过程,本文采用nfs v3版本, 仅记录使用过程,不涉及详细的知识点讲解,可以在workbench里帮助文档中搜索 NFS 关键字查看详细的帮助文档,如下图:

1、在vxworks镜像工程配置里添加NFS组件:

打开镜像的配置文件,搜索 INCLUDE_CORE_NFS_SERVER ,定位到组件处,把  Core NFS client 、 NFS server 、 NFS server V3 、 NFS v3 client 四个组件都添加引用,如下图所示:

2、在代码里调用相关接口:

(1) server端调用

server端直接调用 nfsExport 接口即可,该接口的原形如下:

STATUS nfsExport
(
char * directory, /* Directory to export - FS must support NFS */
int id, /* ID number for file system */
BOOL readOnly, /* TRUE if file system is exported read-only */
int options /* Reserved for future use - set to 0 */
)

其中:directory 表示server端想要挂出去的文件目录; id使用0即可表示系统随机分配; readOnly设置为TRUE时表示NFS只读; options填写0预留。

(2) client端调用

client端需要依次调用 hostAdd 和 nfsMount 两个接口,其原形如下:

STATUS hostAdd
(
char *hostName, /* host name */
char *hostAddr /* host addr in standard Internet format */
)
STATUS nfsMount
(
const char *host, /* name of remote host */
const char *fileSystem, /* name of remote directory to mount */
const char *localName /* local device name for remote dir */
)

其中:hostAdd接口第一个参数表示server端主机的名字(不知道server主机的名字时,可在server主机上调用 whoami 函数查看),第二个参数表示server端的IP地址(点分十进制形式的字符串);  nfsMount接口第一个参数同上,表示server端主机的名字, 第二个参数表示server端用于NFS的文件目录(与nfsExport的第一个参数值需相同), 第三个参数表示将NFS挂载到本地后的目录标识。

以上两步即可使用nfs,下边看一个demo:

该demo函数运行成功后,在CPU1-2上访问 /mmc0:0/nfs_local_dir 即等同于访问CPU3上的 /mmc0:0/nfs_host_dir

#include "nfs/mountd.h"
#include "nfs/nfsCommon.h"

#define NFS_LOCAL_DIR "/mmc0:0/nfs_local_dir"
#define NFS_HOST_DIR "/mmc0:0/nfs_host_dir"

void nfsFuncInit(int slot_flag, int cpu_flag)
{
char cpu12_host_name[] = {'\0'};
char cpu3_host_name[] = {'\0'};
char cpu3_host_ip[] = {};

memset(cpu12\_host\_name, , );  
memset(cpu3\_host\_name, , );  
memset(cpu3\_host\_ip, , );

strcpy(cpu12\_host\_name, "HostCpu\_");  
strcpy(cpu3\_host\_name, "HostCpu3\_");

/\*- 左系 \*/  
if((0x00u == (uint8\_t)slot\_flag) || (0x02u == (uint8\_t)slot\_flag))  
{  
    strcat(cpu3\_host\_name, "L");  
    strcat(cpu12\_host\_name, "L");  
    strcpy(cpu3\_host\_ip, "192.168.200.5");  
}  
else  
{  
    strcat(cpu3\_host\_name, "R");  
    strcat(cpu12\_host\_name, "R");  
    strcpy(cpu3\_host\_ip, "192.168.200.6");  
}

/\*- 是CPU3,做server \*/  
if( == cpu\_flag)  
{  
    /\*- 设置本地名称 \*/  
    if(ERROR == iam(cpu3\_host\_name, NULL))  
    {  
        printf("Error: set iam host name(%s) failed. --- %s \\n", cpu3\_host\_name, strerror(errnoGet()));  
    }

    printf("\\n====== Local machine name is: ");  
    whoami();  
    printf("\\n");

    if(ERROR == nfsExport(NFS\_HOST\_DIR, , TRUE, ))  
    {  
        printf("Error: NFS export %s Failed --- %s.\\n",NFS\_HOST\_DIR, strerror(errnoGet()));  
    }  
    else  
    {  
        printf("====== OK: NFS export OK (%s)\\n", NFS\_HOST\_DIR);  
    }  
}  
else if(( == cpu\_flag) || ( == cpu\_flag))  
{  
    if ( == cpu\_flag)  
    {  
        strcat(cpu12\_host\_name, "");  
        if(ERROR == iam(cpu12\_host\_name, NULL))  
        {  
            printf("Error: Set iam host name(%s) failed. --- %s \\n", cpu12\_host\_name, strerror(errnoGet()));  
        }  
    }  
    else  
    {  
        strcat(cpu12\_host\_name, "");  
        if(ERROR == iam(cpu12\_host\_name, NULL))  
        {  
            printf("Error: Set iam host name(%s) failed. --- %s \\n", cpu12\_host\_name, strerror(errnoGet()));  
        }  
    }

    printf("\\n====== Local machine name is: ");  
    whoami();  
    printf("\\n");

    if(ERROR == hostAdd(cpu3\_host\_name, cpu3\_host\_ip))  
    {  
        printf("Error: NFS host Add failed. (HostName:%s, ip:%s)  --- %s\\n", cpu3\_host\_name, cpu3\_host\_ip, strerror(errnoGet()));  
    }  
    else  
    {  
        printf("====== OK: NFS hostAdd ok (HostName:%s, ip:%s)\\n", cpu3\_host\_name, cpu3\_host\_ip);

        taskDelay(sysClkRateGet()\*); /\* 这里有延时,否则client端查询不到server端的export \*/

        nfsExportShow(cpu3\_host\_name);

        if(ERROR == nfsMount(cpu3\_host\_name, NFS\_HOST\_DIR, NFS\_LOCAL\_DIR))  
        {  
            printf("Error: NFS mount failed. %s,%s,%s   --- %s\\n", cpu3\_host\_name, NFS\_HOST\_DIR, NFS\_LOCAL\_DIR, strerror(errnoGet()));  
        }  
        else  
        {  
            printf("====== OK: NFS mount ok\\n");  
            nfsDevShow();  
            cd(NFS\_LOCAL\_DIR);  
        }  
    }  
}  
else  
{  
    printf("Error: Unknown cpu id:%d\\n",cpu\_flag);  
}  

}

下面再简列几个常用的调试函数(这几个函数在demo里都有使用):

    whoami    : 查看本机的名称

    iam           : 设置本机的名称

    nfsExportShow: 查看server上export的目录(这个接口是在client端调用的)

    nfsDevShow    : 查看当前的nfs设备(这个接口也是在client端调用的)

    nfsHelp     : nfs相关帮助信息

    netHelp     : net相关帮助信息

以上。需了解详细信息,可在帮助文档中搜索 NFS  、 nfsCommon 等关键字查看。

码完收工!

(吐槽一下CSDN的博客:登录很慢,我本来发在那里的,点击发布卡了半天,最后啥也没了,浪费我时间。。。)