长期支持版本

    分布式文件系统概述

    分布式文件系统提供跨设备的文件访问能力,适用于如下场景:

    • 两台设备组网,A 设备可以无感读取和修改 B 设备的文件。

    • 边缘服务器可以自动同步组网中多个嵌入式设备中的文件数据。

    hmdfs 在分布式软总线动态组网的基础上,为网络上各个设备结点提供一个全局一致的访问视图,支持开发者通过基础文件系统接口进行读写访问,具有高性能、低延时等优点。

    其包括如下几个核心模块:

    • distributed_file_daemon:分布式文件管理常驻用户态服务,负责接入设备组网、数据传输能力,并负责挂载 hmdfs。

    • hmdfs(Harmony Distributed File System):分布式文件系统核心模块,是一种面向移动分布式场景的、高性能的、基于内核实现的、堆叠式文件系统。

    约束

    接口支持情况

    分布式文件管理当前不支持或有限支持如下 VFS 系统调用:

    • symlink:不支持。
    • mmap:仅支持读。
    • rename:仅支持同目录操作。

    规格

    • 最大目录层级

      与被堆叠文件系统,即 data 分区所用文件系统,如 ext4、f2fs 等保持一致。

    • 最大文件名长度

      取决于 680B 与被堆叠文件支持长度的最小值。f2fs 和 ext4 均为 255B。

    • 最大单文件大小

      取决于 $2^{64}$B 与被堆叠文件系统支持最大单文件大小的最小值。ext4 单文件最大为 16TB,f2fs 单文件最大为 3.94TB。

    环境约束

    • 运行环境的有线网卡名称必须是 eth0 ,无线网卡的名称必须是 wlan0 。可使用 ip a 命令查看当前环境的网卡名称,如果没有 eth0 或者 wlan0 的网卡,那么 softbus_server 会启动失败,功能失效。解决方案参考 常见问题

    • 不能同时安装 dsoftbus 和 distributed-utils 两个包。dsoftbus 包中是 3.1.2 版本的软总线,distributed-utils 包中包含 3.2 版本的软总线,如果想使用 3.2 版本的软总线,需要先卸载 dsoftbus 包。

    • 运行环境的内核需要开启 binder 的功能,可以通过以下命令来判断内核是否开启 binder 功能。如果未开启,可以通过插入 binder 的 ko 文件或者重编内核来解决,具体解决方法参考 communication_ipc 仓 openEuler-22.03-LTS-SP2 分支的 README

    • openEuler 的内核版本需要是 5.10.x,可以通过使用 uname -r 查看内核版本。

    • openEuler 各个设备在同一个网段中,并且设备之间网络通畅,防火墙未拦截 softbus 的数据包。

    说明

    安装

    说明: 如果碰到步骤未成功执行,可参考后面 常见问题 进行解决。

    1. 完整地使用分布式文件系统,需要安装 hmdfsdistributed-utilsdfs_service 三个软件包。使用以下命令安装:

      sudo dnf install hmdfs distributed-utils dfs_service
      
    2. 安装 hmdfs 文件系统。安装 hmdfs 之后会提供一个 hmdfs.ko 文件,其存放在 /lib/modules/$(uname -r)/hmdfs 目录下,需要插入该 ko 来安装 hmdfs 文件系统:

      cd /lib/modules/$(uname -r)/hmdfs
      insmod hmdfs.ko
      

    配置

    各个 SA 服务是通过 sa_main 二进制来拉起,而 sa_main 拉起服务依赖服务的 profile 配置文件,因此在启动服务之前,需要配置各个服务的 profile 文件,步骤如下:

    1. 新建 /system/profile 目录,并新建 device_managerdfs_servicehuks_servicehuks_service 的 xml 文件。

      mkdir -p /system/profile
      cd /system/profile
      touch device_manager.xml distributedfiledaemon.xml huks_service.xml softbus_server.xml
      
    2. 各个 xml 文件填入以下内容,配置服务的一些基本信息:

      • device_manager.xml
        <?xml version="1.0" encoding="utf-8"?>
        <info>
            <process>device_manager</process>
            <loadlibs>
                <libpath>libdevicemanagerservice.z.so</libpath>
            </loadlibs>
            <systemability>
                <name>4802</name>
                <libpath>libdevicemanagerservice.z.so</libpath>
                <run-on-create>true</run-on-create>
                <distributed>false</distributed>
                <dump-level>1</dump-level>
            </systemability>
        </info>
        
      • softbus_server.xml
        <?xml version="1.0" encoding="utf-8"?>
        <info>
            <process>softbus_server</process>
            <loadlibs>
                <libpath>libsoftbus_server.z.so</libpath>
            </loadlibs>
            <systemability>
                <name>4700</name>
                <libpath>libsoftbus_server.z.so</libpath>
                <run-on-create>true</run-on-create>
                <distributed>false</distributed>
                <dump-level>1</dump-level>
            </systemability>
        </info>
        
      • huks_service.xml
        <?xml version="1.0" encoding="utf-8"?>
        <info>
            <process>huks_service</process>
            <loadlibs>
                <libpath>libhuks_service.z.so</libpath>
            </loadlibs>
            <systemability>
                <name>3510</name>
                <libpath>libhuks_service.z.so</libpath>
                <run-on-create>true</run-on-create>
                <distributed>false</distributed>
                <dump-level>1</dump-level>
            </systemability>
        </info>
        
      • distributedfiledaemon.xml
        <?xml version="1.0" encoding="utf-8"?>
        <info>
            <process>distributedfiledaemon</process>
            <loadlibs>
                <libpath>libdistributedfiledaemon.z.so</libpath>
            </loadlibs>
            <systemability>
                <name>5201</name>
                <libpath>libdistributedfiledaemon.z.so</libpath>
                <depend>4802;4700</depend>
                <depend-time-out>60000</depend-time-out>
                <run-on-create>true</run-on-create>
                <distributed>false</distributed>
                <dump-level>1</dump-level>
            </systemability>
        </info>
        
    3. 后续有服务启动依赖 libsec_shared.z.so 这个动态库,而在 openEuler 下这个动态库叫做 libboundscheck.so(由 libboundscheck 软件包提供),因此需要在 /usr/lib64 下软链接出一个 libsec_shared.z.so

      ln -s /usr/lib64/libboundscheck.so /usr/lib64/libsec_shared.z.so
      
    4. 配置每个设备的 SN 号。目前 softbus_sever 等服务获取设备的 udid 还是使用 /etc/SN 文件中设置的 SN 号,因此需要在每台 openEuler 设置 不同的 SN 号

      echo "111" > /etc/SN # 注意:不同设备设置不同的数值
      

    使用

    分布式文件系统的使用分为两块:挂载 hmdfs 目录启动 distributed_file_daemon 服务。注意:以下步骤需要在每台 openEuler 设备下执行

    挂载 hmdfs 目录

    1. 挂载 hmdfs 目录,可以直接使用 mount 命令进行挂载,保持 OpenHarmony 的目录结构一样,挂载 /data/service/el2/100/non_account/mnt/hmdfs/100/non_account

      mkdir -p /data/service/el2/100/non_account
      mkdir -p /mnt/hmdfs/100/non_account
      sudo mount -t hmdfs -o merge,local_dst="/mnt/hmdfs/100/non_account" "/data/service/el2/100//non_account" "/mnt/hmdfs/100/non_account"
      

      挂载之后,可以使用 df -h 命令查看新增了挂载的目录,并且挂载目录下会有 device_viewmerge_view 两个目录:

      ├── device_view
      │   └── local
      └── merge_view
      

    启动 dfs_service 服务

    安装 libdistrbited-utilsdfs_service 后,相关的可执行二进制会存放在 /system/bin/ 目录下,库文件会存放在 /system/lib64 下。以下操作都在 /system/bin/ 目录下操作。

    1. 启动 samgr
      cd /system/bin/
      ./samgr
      
    2. 启动 huks_service
      ./sa_main /system/profile/huks_service.xml
      
    3. 启动 device_auth_service
      ./deviceauth_service
      
    4. 启动 softbus_server
      ./sa_main /system/profile/softbus_server.xml
      
    5. 启动 device_manager
      ./sa_main /system/profile/device_manager.xml
      
    6. 启动 distributed_file_daemon
      ./sa_main /system/profile/distributedfiledaemon.xml
      

    功能使用

    每台 openEuler 设备启动完 distributed_file_daemon 之后,可以在挂载的 /mnt/hmdfs/100/non_account 下看到远端设备的目录(示例是只有两台 openEuler 设备互联):

    ├── device_view
    │   ├── fceda1e26c36d1dd0ba65c00d71c1ab619fcf088ad2adf33cd1e2f396dc70ee2
    │   └── local
    └── merge_view
    

    ⽬录下会有两个⽂件视图:device_view 是分设备的视图,local 是本地⽂件视图,另外⼀个是远端设备的⽂件视图;merge_view 是合并视图,多个设备的⽂件都在这⼀个⽬录。

    后续需要跨设备进行⽂件操作,只需要操作 device_view 下⾯远端设备⽬录下的⽂件即可。

    常见问题

    • 启动各个服务日志一直在报错 Binder Driver died

      原因:说明系统未开启 binder,可以查看 /dev/binder 文件是否存在,如果不存在则说明未开启 binder。

      解决办法:参考 communication_ipc 仓 openEuler-22.03-LTS-SP2 分支的 README 开启 binder。

    • 无法插入 hmdfs.ko 文件,报错 insmod: ERROR: could not insert module hmdfs.ko: Invalid parameters

      原因:hmdfs 编译时依赖的 kernel 版本和现在运行环境不一致或者当前系统未开启。

      解决方法一:参考 hmdfs 仓库的 README 下关于手动编译生成 hmdfs.ko 的说明,编译一个和运行环境内核匹配的 hmdfs.ko,然后插入该 ko 文件使用。

      解决方法二:更换和 SP2 的 kernel 版本一致的 openEuler 版本。

    • softbus_server 服务未成功起来,报错 GetNetworkIfIp ifName:eth0 fail

      原因:使用命令 ip a 查看当前系统的网卡名称,查看是否有 eth0 有线网卡名。 因为 softbus_server 是通过 eth0 这个有线网卡名来获取 ip 等信息,如果没有 eth0 网卡则无法启动 softbus_server

      解决方法一:修改网卡名称为 eth0

      解决方法二:修改 softbus_server 源码,将依赖的有线网卡名称改成当前系统的网卡名。

    • 多台 openEuler 设备拉起 softbus_server 服务之后,但是在 distributed_file_daemon 服务的日志显示未发现上线设备。

      原因:设备之间的网络不通,或者开启了防火墙把 softbus 的数据拦截了。

      解决:检查网络是否通畅。(如果不影响业务,可通过 systemctl stop firewalld.service 暂时关闭防火墙进行测试)。

    文档捉虫

    “有虫”文档片段

    问题描述

    提交类型 issue

    有点复杂...

    找人问问吧。

    PR

    小问题,全程线上修改...

    一键搞定!

    问题类型
    规范和低错类

    ● 错别字或拼写错误;标点符号使用错误;

    ● 链接错误、空单元格、格式错误;

    ● 英文中包含中文字符;

    ● 界面和描述不一致,但不影响操作;

    ● 表述不通顺,但不影响理解;

    ● 版本号不匹配:如软件包名称、界面版本号;

    易用性

    ● 关键步骤错误或缺失,无法指导用户完成任务;

    ● 缺少必要的前提条件、注意事项等;

    ● 图形、表格、文字等晦涩难懂;

    ● 逻辑不清晰,该分类、分项、分步骤的没有给出;

    正确性

    ● 技术原理、功能、规格等描述和软件不一致,存在错误;

    ● 原理图、架构图等存在错误;

    ● 命令、命令参数等错误;

    ● 代码片段错误;

    ● 命令无法完成对应功能;

    ● 界面错误,无法指导操作;

    风险提示

    ● 对重要数据或系统存在风险的操作,缺少安全提示;

    内容合规

    ● 违反法律法规,涉及政治、领土主权等敏感词;

    ● 内容侵权;

    您对文档的总体满意度

    非常不满意
    非常满意
    提交
    根据您的反馈,会自动生成issue模板。您只需点击按钮,创建issue即可。
    文档捉虫
    编组 3备份