跳过正文
  1. 文章/

使用DwarFS压缩文件

··316 字·2 分钟
Tools Linux Mac Win
目录

一、为什么使用 DwarFS
#

DwarFS 和普通压缩方式相比有几个主要优势:

  1. 重复数据共享

    • DwarFS 会识别并合并相同的文件和数据块,只存储一份
    • 对于备份来说特别有用,因为备份经常包含大量重复文件
  2. 随机访问能力

    • 可以直接访问压缩文件系统中的任意文件
    • 普通压缩包需要先解压才能访问文件
  3. 只读特性

    • DwarFS 是只读文件系统,数据不会被意外修改
    • 非常适合长期归档存储
  4. 更好的压缩率

    • 针对特定文件类型优化的压缩算法
    • 可以达到比普通压缩更高的压缩比

不过 DwarFS 也有一些局限:

  • 不支持写入,只能读取
  • 创建过程较慢
  • 需要额外的系统支持

二、基础使用
#

以下以 archlinux平台为例,其他系统可以略作参考。

  1. 安装
paru -S dwarfs-bin
  1. 创建镜像
mkdwarfs -i <文件夹路径> -o <镜像文件路径/镜像文件名.dwarfs>
  1. 解压镜像
dwarfsextract -i <镜像文件路径/镜像文件名.dwarfs> -o <文件夹路径>
  1. 挂载镜像(注意:内容为只读)
sudo dwarfs <镜像文件路径/镜像文件名.dwarfs> <挂载路径> -o allow_other -o readonly
  1. 卸载挂载后的镜像
sudo umount <挂载路径>

三、实践
#

3.1 安装
#

paru -S dwarfs-bin

然后编辑 /etc/fuse.conf文件,取消注释 user_allow_other行,以允许非 root 用户挂载文件系统。

3.2 设置单独文件 MIME
#

  1. 创建 /usr/share/mime/packages/x-dwarfs.xml
sudo vim /usr/share/mime/packages/x-dwarfs.xml
  1. 添加内容
<?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>
  1. 更新 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
}

88. 参考资料
#

xiadengma
作者
xiadengma