?分布式文件系統提供跨設備的文件訪問能力,適用于如下場景:
-
兩臺設備組網,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 的數據包。
說明
安裝
說明:如果碰到步驟未成功執行,可參考后面?常見問題?進行解決。
-
完整地使用分布式文件系統,需要安裝?
hmdfs
?和?filemanagement_dfs_service
?兩個軟件包。使用以下命令安裝:sudo dnf install hmdfs filemanagement_dfs_service
-
安裝 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 文件
配置
-
后續有服務啟動依賴?
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
-
配置每個設備的 SN 號。目前?
softbus_sever
?等服務獲取設備的?udid
?還是使用?/etc/SN
?文件中設置的 SN 號,因此需要在每臺 openEuler 設置?不同的 SN 號。echo "111" > /etc/SN # 注意:不同設備設置不同的數值
使用
分布式文件系統的使用分為兩塊:掛載 hmdfs 目錄
?和?啟動 distributed_file_daemon 服務
。注意:以下步驟需要在每臺 openEuler 設備下執行。
掛載 hmdfs 目錄
-
掛載 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
?下。
-
啟動?
dfs_service
?分布式文件服務:cd /system/bin ./start_services.sh dfs
-
停止?
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
?暫時關閉防火墻進行測試)。