HarmonyOS开发实战:分布式文件系统-hmdfs

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

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

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

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

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

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

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

约束

接口支持情况

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

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

规格

  • 最大目录层级

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

  • 最大文件名长度

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

  • 最大单文件大小

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

环境约束

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

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

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

说明

安装

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

  1. 完整地使用分布式文件系统,需要安装 hmdfs 和 filemanagement_dfs_service 两个软件包。使用以下命令安装:

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

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

    注意: 如果 /lib/modules/$(uname -r)/hmdfs/ 目录下没有 hmdfs.ko 文件,是因为 hmdfs 工程构建时依赖的内核版本和当前运行环境内核版本不一致,可以在 /lib/modules 其他内核版本目录下查找 hmdfs.ko 文件

配置

  1. 后续有服务启动依赖 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
  2. 配置每个设备的 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_view 和 merge_view 两个目录:

    ├── device_view
    │   └── local
    └── merge_view
启动 dfs_service 服务

安装 filemanagement_dfs_service 及其依赖的软件包后,相关的可执行二进制会存放在 /system/bin/ 目录下,库文件会存放在 /system/lib64 下。

  1. 启动 dfs_service 分布式文件服务:

    cd /system/bin
    ./start_services.sh dfs
  2. 停止 dfs_service 分布式文件服务:

    cd /system/bin
    ./stop_service.sh dfs

功能使用

每台 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-SP3 分支的 README 开启 binder。

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

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

    解决方法一:编译一个和运行环境内核匹配的 hmdfs.ko,然后插入该 ko 文件使用。

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

  • 树莓派 22.03-LTS-SP3 openEuler版本下,无法插入 hmdfs.ko 文件,报错 insmod: ERROR: could not insert module hmdfs.ko: Invalid module format.

    原因:树莓派使用的 kernel 版本是树莓派特有版本,而 repo 源中 hmdfs 软件在工程构建时依赖的是服务器 22.03-LTS-SP3 版本的内核,所以无法插入。

    解决方法:使用 基于 22.03-LTS-SP3 raspberry-pi kernel 编译出来的 hmdfs.ko

  • 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 暂时关闭防火墙进行测试)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/759341.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

昇思25天学习打卡营第7天之二 | 模型保存与加载

1. 保存与加载 在训练网络模型的过程中,实际上我们希望保存中间和最后的结果,用于微调(fine-tune)和后续的模型推理与部署,本章节我们将介绍如何保存与加载模型。 1.1 导入依赖 # 导入numpy库,并将其重命…

【C语言】--分支和循环(1)

🍿个人主页: 起名字真南 🧇个人专栏:【数据结构初阶】 【C语言】 目录 前言1 if 语句1.1 if1.2 else1.3 嵌套if1.4 悬空else 前言 C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构。 我们可以用if、switch实现分支…

51单片机第6步_stdlib.h库函数

本章重点学习stdlib.h库函数。 #include <REG51.h> //包含头文件REG51.h,使能51内部寄存器; #include <stdlib.h> //float atof (char *s1); //参数s1字符串可包含正负号,小数点或E(e)来表示指数部分,如123.456或123e-2; //若首字符是非数据字符,或为正负号…

力扣每日一题 6/30 记忆化搜索/动态规划

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 494.目标和【中等】 题目&#xff1a; 给你一个非负整数数组 nums 和一个…

VMware中的三种虚拟网络模式

虚拟机网络模式 1 主机网络环境2 VMware中的三种虚拟网络模式2.1 桥接模式NAT模式仅主机模式网络模式选择1 VMware虚拟网络配置2 虚拟机选择网络模式3 Windows主机网络配置 配置静态IP 虚拟机联网方式为桥接模式&#xff0c;这种模式下&#xff0c;虚拟机通过主机的物理网卡&am…

mysql8.0-学习

文章目录 mysql8.0基础知识-学习安装mysql_8.0登录mysql8.0的体系结构与管理体系结构图连接mysqlmysql8.0的 “新姿势” mysql的日常管理用户安全权限练习查看用户的权限回收:revoke角色 mysql的多种连接方式socket显示系统中当前运行的所有线程 tcp/ip客户端工具基于SSL的安全…

2024最新boss直聘岗位数据爬虫,并进行可视化分析

前言 近年来,随着互联网的发展和就业市场的变化,数据科学与爬虫技术在招聘信息分析中的应用变得越来越重要。通过对招聘信息的爬取和可视化分析,我们可以更好地了解当前的就业市场动态、职位需求和薪资水平,从而为求职者和招聘企业提供有价值的数据支持。本文将介绍如何使…

Linux系统编程--进程间通信

目录 1. 介绍 1.1 进程间通信的目的 1.2 进程间通信的分类 2. 管道 2.1 什么是管道 2.2 匿名管道 2.2.1 接口 2.2.2 步骤--以父子进程通信为例 2.2.3 站在文件描述符角度-深度理解 2.2.4 管道代码 2.2.5 读写特征 2.2.6 管道特征 2.3 命名管道 2.3.1 接口 2.3.2…

【驱动篇】龙芯LS2K0300之i2c设备驱动

实验背景 由于官方内核i2c的BSP有问题&#xff08;怀疑是设备树这块&#xff09;&#xff0c;本次实验将不通过设备树来驱动aht20&#xff08;i2c&#xff09;模块&#xff0c;大致的操作过程如下&#xff1a; 模块连接&#xff0c;查看aht20设备地址编写device驱动&#xff…

K8S之网络深度剖析(一)(持续更新ing)

K8S之网络深度剖析 一 、关于K8S的网络模型 在K8s的世界上,IP是以Pod为单位进行分配的。一个Pod内部的所有容器共享一个网络堆栈(相当于一个网络命名空间,它们的IP地址、网络设备、配置等都是共享的)。按照这个网络原则抽象出来的为每个Pod都设置一个IP地址的模型也被称作为I…

忍法:声音克隆之术

前言&#xff1a; 最近因为一直在给肚子里面的宝宝做故事胎教&#xff0c;每天&#xff08;其实是看自己心情抽空讲下故事&#xff09;都要给宝宝讲故事&#xff0c;心想反正宝宝也看不见我&#xff0c;只听我的声音&#xff0c;干脆偷个懒&#xff0c;克隆自己的声音&#xf…

信息学奥赛初赛天天练-40-CSP-J2021基础题-组合数学-缩倍法、平均分组、2进制转10进制、面向过程/面向对象语言应用

PDF文档公众号回复关键字:20240630 2021 CSP-J 选择题 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 1.以下不属于面向对象程序设计语言是( ) A. C B. Python C. Java D. C 2.以下奖项与计…

R包的4种安装方式及常见问题解决方法

R包的4种安装方式及常见问题解决方法 R包的四种安装方式1. install.packages()2. 从Bioconductor安装3. 从本地源码安装4. 从github安装 常见问题的解决1. 版本问题2. 网络/镜像问题3.缺少Rtools R包的四种安装方式 1. install.packages() 对于R自带的包的安装一般都可以通过…

HarmonyOS--路由管理--组件导航 (Navigation)

文档中心 什么是组件导航 (Navigation) &#xff1f; 1、Navigation是路由容器组件&#xff0c;一般作为首页的根容器&#xff0c;包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式 2、Navigation组件适用于模块内和跨模块的路由切换&#xff0c;一次开发&#xff0…

实现点击按钮导出页面pdf

在Vue 3 Vite项目中&#xff0c;你可以使用html2canvas和jspdf库来实现将页面某部分导出为PDF文档的功能。以下是一个简单的实现方式&#xff1a; 1.安装html2canvas和jspdf&#xff1a; pnpm install html2canvas jspdf 2.在Vue组件中使用这些库来实现导出功能&#xff1a;…

网线直连电脑可以上网,网线连tplink路由器上不了网

家里wifi网络连不上好几天了&#xff0c;用网线直连电脑可以上网&#xff0c;但网线连tplink路由器wan口上不了网&#xff0c;无Internet连接&#xff0c;网线连lan口可以电脑上网&#xff0c;手机上不了。 后来发现网线的主路由用的192.168.0.1&#xff0c;我的路由器wan口自…

在node环境使用MySQL

什么是Sequelize? Sequelize是一个基于Promise的NodeJS ORM模块 什么是ORM? ORM(Object-Relational-Mapping)是对象关系映射 对象关系映射可以把JS中的类和对象&#xff0c;和数据库中的表和数据进行关系映射。映射之后我们就可以直接通过类和对象来操作数据表和数据了, 就…

【大数据导论】大数据序言

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 目录 数据概念及类型及可用及组织形式数据概念数据…

golang项目基于gorm框架从postgre数据库迁移到达梦数据库的实践

一、安装达梦数据库 1、登录达梦数据库官网&#xff0c;下载对应系统版本的安装包。 2、下载地址为&#xff1a;https://www.dameng.com/list_103.html 3、达梦数据库对大小写敏感&#xff0c;在安装初始化数据库实例时建议忽略大小写&#xff1b;具体安装教程可参考以下博客: …

python办公自动化之pandas

用到的库&#xff1a;pandas 实现效果&#xff1a;创建一张空白的表同时往里面插入准备好的数据 代码&#xff1a; import pandas # 准备好要写入的数据&#xff0c;字典格式 data{日期:[7.2,7.3],产品型号:[ca,ce],成交量:[500,600]} dfpandas.DataFrame(data) # 把数据写入…