长期支持版本

    社区创新版本

      分布式文件系统概述

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

      • 两台设备组网,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备份