一、为什么使用 DwarFS#
DwarFS 和普通压缩方式相比有几个主要优势:
重复数据共享
- DwarFS 会识别并合并相同的文件和数据块,只存储一份
- 对于备份来说特别有用,因为备份经常包含大量重复文件
随机访问能力
- 可以直接访问压缩文件系统中的任意文件
- 普通压缩包需要先解压才能访问文件
只读特性
- DwarFS 是只读文件系统,数据不会被意外修改
- 非常适合长期归档存储
更好的压缩率
- 针对特定文件类型优化的压缩算法
- 可以达到比普通压缩更高的压缩比
不过 DwarFS 也有一些局限:
- 不支持写入,只能读取
- 创建过程较慢
- 需要额外的系统支持
二、基础使用#
以下以 archlinux
平台为例,其他系统可以略作参考。
- 安装
paru -S dwarfs-bin
- 创建镜像
mkdwarfs -i <文件夹路径> -o <镜像文件路径/镜像文件名.dwarfs>
- 解压镜像
dwarfsextract -i <镜像文件路径/镜像文件名.dwarfs> -o <文件夹路径>
- 挂载镜像(注意:内容为只读)
sudo dwarfs <镜像文件路径/镜像文件名.dwarfs> <挂载路径> -o allow_other -o readonly
- 卸载挂载后的镜像
sudo umount <挂载路径>
三、实践#
3.1 安装#
paru -S dwarfs-bin
然后编辑 /etc/fuse.conf
文件,取消注释 user_allow_other
行,以允许非 root 用户挂载文件系统。
3.2 设置单独文件 MIME#
- 创建
/usr/share/mime/packages/x-dwarfs.xml
sudo vim /usr/share/mime/packages/x-dwarfs.xml
- 添加内容
<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
<mime-type type="application/x-dwarfs">
<comment>DwarFS Archive</comment>
<icon name="application-zip"/>
<glob-deleteall/>
<glob pattern="*.dwarfs"/>
</mime-type>
</mime-info>
- 更新 MIME 数据库
sudo update-mime-database /usr/share/mime
3.3 其他#
为了方便使用(gnome
+wayland
),我安装了 Actions For Nautilus
,并且使用 notify-send
发送通知。
相关 json 配置如下(请替换 username
为你的用户名):
{
"actions": [
{
"type": "command",
"label": "DwarFS 压缩",
"command_line": "notify-send \"DwarFS 压缩\" \"请等待压缩完成\" && mkdwarfs -i %f -o %f.dwarfs && notify-send \"DwarFS 压缩\" \"文件夹 %b 压缩成功\" || notify-send \"DwarFS 压缩\" \"文件夹 %b 压缩失败\"",
"use_shell": true,
"filetypes": ["directory"]
},
{
"type": "command",
"label": "DwarFS 解压",
"command_line": "[ ! -d \"%D/%W\" ] && mkdir -p \"%D/%W\" && dwarfsextract -i \"%f\" -o \"%D/%W\" && notify-send \"DwarFS 解压成功\" \"%b 解压成功\" || { [ -d \"%D/%W\" ] && notify-send \"DwarFS 解压失败\" \"文件夹 %D/%W 已存在\" || notify-send \"DwarFS 解压失败\" \"%b 解压失败\"; }",
"use_shell": true,
"mimetypes": ["application/x-dwarfs"]
},
{
"type": "command",
"label": "DwarFS 挂载",
"command_line": "PASSWORD=$(zenity --password --title \"挂载DwarFS镜像:%w\" --width 500) && echo \"$PASSWORD\" | sudo -S true && sudo mkdir -p /run/media/username/%w && sudo dwarfs %f /run/media/username/%w -o allow_other -o readonly && notify-send \"DwarFS 挂载\" \"%b 挂载成功\" || notify-send \"DwarFS 挂载\" \"%b 挂载失败\"",
"use_shell": true,
"mimetypes": ["application/x-dwarfs"]
},
{
"type": "command",
"label": "DwarFS 卸载",
"command_line": "PASSWORD=$(zenity --password --title \"卸载DwarFS镜像:%w\" --width 500) && echo \"$PASSWORD\" | sudo -S true && sudo umount /run/media/username/%w && sudo rm -rf /run/media/username/%w && notify-send \"DwarFS 卸载\" \"%b 卸载成功\" || notify-send \"DwarFS 卸载\" \"%b 卸载失败\"",
"use_shell": true,
"mimetypes": ["application/x-dwarfs"]
}
],
"sort": "manual",
"debug": true
}