鸿蒙 分布式文件系统(一)
摘要:HarmonyOS分布式文件系统(hmdfs)支持跨设备文件访问,提供全局一致的访问视图。系统架构包含distributedfile_daemon和hmdfs内核模块,实现设备组网、文件管理和数据同步。核心功能包括缓存管理、文件访问、元数据管理和冲突处理,支持Close-to-Open一致性但不保证实时同步。系统采用数据分级机制,根据设备安全等级控制文件访问权限。开发接口与本地文件系统一致,
本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
一、分布式文件系统(hmdfs)
-
定义:hmdfs(HarmonyOS Distributed File System)提供跨设备的文件访问能力
-
适用场景:
-
两台设备组网,一台设备上的编辑软件编辑另一台设备上的文档
-
平板保存的音乐,车载系统直接可见并可播放
-
户外拍摄的照片,回家打开平板直接访问原设备拍摄的照片
-
技术特点
-
在分布式软总线动态组网基础上提供全局一致的访问视图
-
支持开发者通过基础文件系统的接口进行读写访问
-
具有高性能、低延时等优点
二、系统架构
2.1 架构组件
-
distributedfile_daemon:
-
主要负责设备上线监听
-
通过软总线建立链路
-
根据分布式的设备安全等级执行不同的数据流转策略
-
-
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 注意事项
-
对于不满足安全等级的文件,跨设备仍然可以看到该文件,但是无权限打开访问该文件
-
分布式文件系统的数据等级默认为S3
-
应用可以主动设置文件的安全等级
五、代码实现
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}`);
});
更多推荐



所有评论(0)