本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

一、分布式文件系统(hmdfs)

  • 定义:hmdfs(HarmonyOS Distributed File System)提供跨设备的文件访问能力

  • 适用场景

    1. 两台设备组网,一台设备上的编辑软件编辑另一台设备上的文档

    2. 平板保存的音乐,车载系统直接可见并可播放

    3. 户外拍摄的照片,回家打开平板直接访问原设备拍摄的照片

技术特点

  • 在分布式软总线动态组网基础上提供全局一致的访问视图

  • 支持开发者通过基础文件系统的接口进行读写访问

  • 具有高性能、低延时等优点

二、系统架构

2.1 架构组件

  1. distributedfile_daemon

    • 主要负责设备上线监听

    • 通过软总线建立链路

    • 根据分布式的设备安全等级执行不同的数据流转策略

  2. hmdfs

    • 实现在内核的网络文件系统

    • 包括缓存管理、文件访问、元数据管理和冲突管理等

2.2 重要目录

  • /data/storage/el2/distributedfiles/ 目录下面的文件不能随意删除

三、核心功能

3.1 缓存管理

  • 设备分布式组网后,hmdfs提供文件的互访能力,但不会主动进行文件数据传输和拷贝

  • 如果应用需要将数据保存到本地,需主动拷贝

  • hmdfs保证Close-to-Open的一致性:

    • 一端写关闭后,另外一端可以读取到最新数据

    • 不保证文件内容的实时一致性

  • 数据在远端写入,由于网络原因未及时回刷,文件系统会在下次网络接入时回刷本地

  • 但是如果远端已修改则无法回刷

3.2 文件访问

  • 文件访问接口与本地一致(使用ohos.file.fs

  • 如果文件在本地,则堆叠访问本地文件系统

  • 如果文件在其他设备,则同步网络访问远端设备文件

  • 不支持:symlink

3.3 元数据管理

  • 分布式组网下,文件一端创建、删除、修改,另一端可以"立即"查看到最新文件

  • 查看速度取决于网络情况

  • 远端设备离线后,该设备数据将不再在本端设备呈现

  • 设备离线的感知具有延迟,可能会造成部分消息4s超时

  • 开发者需要考虑接口的网络超时或一些文件虽然可以看到,但实际设备可能已离线的场景

3.4 冲突处理

冲突场景 处理方式
本地与远端冲突 远端文件被重命名,看到的同名文件是本地同名文件
远端多个设备冲突 以接入本设备ID为顺序,显示设备ID小的同名文件,其他文件被依次重命名
组网场景下创建同名文件 提示文件已存在
冲突文件命名规则 显示_conflict_dev后依次加id,id从1自动递增
同名目录处理 仅融合不存在冲突
文件和远端目录同名冲突 远端目录后缀加_remote_directory

四、分布式文件数据等级

4.1 目的

  • 不同设备本身的安全能力差异较大(小嵌入式设备安全能力远弱于平板等设备)

  • 用户或应用不同的文件数据有不同安全诉求(如健康信息、银行卡信息等不期望被弱设备读取)

  • HarmonyOS提供完整的数据分级、设备分级标准

  • 针对不同设备制定不同的数据流转策略

4.2 接口说明

支持同步和异步操作

接口名 功能 接口类型 支持同步 支持异步
setSecurityLabel 设置文件安全标签 方法
getSecurityLabel 获取文件安全标签 方法

4.3 注意事项

  1. 对于不满足安全等级的文件,跨设备仍然可以看到该文件,但是无权限打开访问该文件

  2. 分布式文件系统的数据等级默认为S3

  3. 应用可以主动设置文件的安全等级

五、代码实现

5.1 设置文件数据等级

import { securityLabel } from '@kit.CoreFileKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';
import { fileIo as fs } from '@kit.CoreFileKit';

// 获取需要设备数据等级的文件沙箱路径
let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
let pathDir = context.filesDir;
let filePath = pathDir + '/test.txt';

// 打开文件
let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);

// 设置文件的数据等级为s0
securityLabel.setSecurityLabel(filePath, 's0').then(() => {
  console.info('Succeeded in setSecurityLabeling.');
  fs.closeSync(file);
}).catch((err: BusinessError) => {
  console.error(`Failed to setSecurityLabel. Code: ${err.code}, message: ${err.message}`);
});

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐