zoukankan      html  css  js  c++  java
  • 记录一次vxworks下使用NFS组件的过程

    问题:有三块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[20] = {''};
        char cpu3_host_name[20] = {''};
        char cpu3_host_ip[20] = {0};
        
        memset(cpu12_host_name, 0, 20);
        memset(cpu3_host_name, 0, 20);
        memset(cpu3_host_ip, 0, 20);
        
        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(2 == cpu_flag)
        {
            /*- 设置本地名称 */
            if(ERROR == iam(cpu3_host_name, NULL))
            {
                printf("Error: set iam host name(%s) failed. --- %s 
    ", cpu3_host_name, strerror(errnoGet()));
            }
            
            printf("
    ====== Local machine name is: ");
            whoami();
            printf("
    ");
            
    
            if(ERROR == nfsExport(NFS_HOST_DIR, 0, TRUE, 0))
            {
                printf("Error: NFS export %s Failed --- %s.
    ",NFS_HOST_DIR, strerror(errnoGet()));
            }
            else
            {
                printf("====== OK: NFS export OK (%s)
    ", NFS_HOST_DIR);
            }
        }
        else if((0 == cpu_flag) || (1 == cpu_flag))
        {
            if (0 == cpu_flag)
            {
                strcat(cpu12_host_name, "1");
                if(ERROR == iam(cpu12_host_name, NULL))
                {
                    printf("Error: Set iam host name(%s) failed. --- %s 
    ", cpu12_host_name, strerror(errnoGet()));
                }
            }
            else
            {
                strcat(cpu12_host_name, "2");
                if(ERROR == iam(cpu12_host_name, NULL))
                {
                    printf("Error: Set iam host name(%s) failed. --- %s 
    ", cpu12_host_name, strerror(errnoGet()));
                }
            }
            
            printf("
    ====== Local machine name is: ");
            whoami();
            printf("
    ");
                    
            
            if(ERROR == hostAdd(cpu3_host_name, cpu3_host_ip))
            {
                printf("Error: NFS host Add failed. (HostName:%s, ip:%s)  --- %s
    ", cpu3_host_name, cpu3_host_ip, strerror(errnoGet()));
            }
            else
            {
                printf("====== OK: NFS hostAdd ok (HostName:%s, ip:%s)
    ", cpu3_host_name, cpu3_host_ip);
                
                taskDelay(sysClkRateGet()*12); /* 这里有延时,否则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
    ", cpu3_host_name, NFS_HOST_DIR, NFS_LOCAL_DIR, strerror(errnoGet()));
                }
                else
                {
                    printf("====== OK: NFS mount ok
    ");
                    nfsDevShow();
                    cd(NFS_LOCAL_DIR);
                }
            }
        }
        else
        {
            printf("Error: Unknown cpu id:%d
    ",cpu_flag);
        }
    }

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

        whoami    : 查看本机的名称

        iam           : 设置本机的名称

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

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

        nfsHelp     : nfs相关帮助信息

        netHelp     : net相关帮助信息

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

    码完收工!

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

  • 相关阅读:
    什么是tomcat集群?
    cmd黑客入侵命令大全
    Linix基本命令
    Windows CMD命令大全
    python 函数1
    Python 集合(set)使用
    python 数据字典应用
    python 数据运算
    python 数据类型(元组(不可变列表),字符串
    python 数据类型(列表)学习笔记
  • 原文地址:https://www.cnblogs.com/gklovexixi/p/11283240.html
Copyright © 2011-2022 走看看