仓库源文站点原文


title: 榨干这台 NAS 第 003 话-硬链接 tags:


这是一系列关于 NAS 的文章,系列的名称你们也看到了:「榨干这台 NAS」。我将尽可能详细的介绍 NAS 相关的知识,帮助你最大限度的发挥你的手中 NAS 的威力!

<!-- more -->

上一话中已经介绍了下载工具,想必很多人在接触 NAS 的时候也或多或少会接触到 PT 吧,今天我就来介绍一个 PT 利器:硬链接。

起因

什么是 PT 呢,大家可以自己 Google,或者之后我再来讲。在 PT 下载中,不是说你下载完就好了,而是秉承着我为人人,人人为我的精神,在下载完成后最好一直保持做种,这样在别人下载这个资源的时候,也可以有较快的速度。

但是做种的时候,有一个问题,就是下载好的文件,不能改名也不能修改目录结构。这样一来,对后期的刮削操作来说是完全不能接受的。所以我们就要用到「硬链接」。

那么什么是硬链接呢?与硬链接相对应的,还有一种软链接,软链接其实就相当于 Windows 中的快捷方式,只是一个指向源文件的文件。在我们删除源文件后,快捷方式将无法使用。而硬链接就不一样了,你同样可以像创建软链接一样创建多个硬链接。但是当你删除源文件后,硬链接还是可以正常使用,和普通文件没有区别。只有当你删除所有的源文件和硬链接后,这个文件才算是真正的被删除。并且多个硬链接和源文件只会占用一个文件的空间。

举例来说:

  1. 你下载了最新的电影 不能说的秘密2.mp4,它存放在:Downloads/qBittorrentDownloads/media/moive/不能说的秘密/不能说的秘密2.mp4

  2. 你就可以创建一个硬链接,在另一个文件夹下面:media/moive/不能说的秘密2(2034)/不能说的秘密2(2034).mp4

  3. 这时候,你可以将 Downloads/qBittorrentDownloads/media/moive/不能说的秘密/不能说的秘密2.mp4 删除,media/moive/不能说的秘密2(2034)/不能说的秘密2(2034).mp4 仍然可以使用,反过来也是一样。但是不能将两个文件同时删除;

  4. 如果你创建的硬链接源文件发生了变化,你的所有硬链接同时也会将变化同步,例外的:文件名的变化将不会同步。

如何创建硬链接

简单的方法是使用 ln 命令,以上面的例子来说,只需要执行以下命令:

ln /Downloads/qBittorrentDownloads/media/moive/不能说的秘密/不能说的秘密2.mp4 /media/moive/不能说的秘密2(2034)/不能说的秘密2(2034).mp4

就可以创建一个硬链接。

但是这样对于一个文件来说还好说,对于众多的电影来说,却是一项大工程。所以我们需要用到 hLink 这一硬链接工具。

安装 hLink

在 UNRAID 的应用市场中并没有 hLink,所以无法通过应用市场直接安装。

我们可以直接通过命令来进行安装:

docker run -d --name hlink \
-e HLINK_HOME=$YOUR_HLINK_HOME_DIR \
-p 9090:9090 \
-v $YOUR_NAS_VOLUME_PATH:$DOCKER_VOLUME_PATH \
likun7981/hlink:latest

在上方的命令中你需要将你要硬链接的源文件的目录和硬链接文件的目录的共同的父目录映射进容器。

在我的机器上,具体命令是这样的:

docker run -d --name hlink \
-e HLINK_HOME=/share/appdata/hlink \
-p 9090:9090 \
-v /mnt/user:/share \
likun7981/hlink:latest

运行命令后稍等片刻就安装完成了。

使用 hLink

前往浏览器访问「你设备的IP地址:9090」,例如:http://192.168.1.223:9090,即可进入操作页面。

  1. 首先点击「创建配置」

    创建配置.png

  2. 为配置输入一个名字,用于标记这个配置的作用,例如:Moive;

  3. 接下来就要对配置文件进行修改,可以先看一下默认的配置文件:

     // 重要说明路径地址都请填写 绝对路径!!!!
     export default {
       /**
        * 源路径与目标路径的映射关系
       * 例子:
       *  pathsMapping: {
       *     '/path/to/exampleSource': '/path/to/exampleDest',
       *     '/path/to/exampleSource2': '/path/to/exampleDest2'
       *  }
       */
       pathsMapping: {},
       /**
        * 需要包含的后缀,如果与exclude同时配置,则取两者的交集
       * include 留空表示包含所有文件
       *
       * 后缀不够用? 高阶用法: https://hlink.likun.me/other/v2.html#%E6%96%B0%E5%A2%9E%E5%8A%9F%E8%83%BD
       */
       include: [
         'mp4',
         'flv',
         'f4v',
         'webm',
         'm4v',
         'mov',
         'cpk',
         'dirac',
         '3gp',
         '3g2',
         'rm',
         'rmvb',
         'wmv',
         'avi',
         'asf',
         'mpg',
         'mpeg',
         'mpe',
         'vob',
         'mkv',
         'ram',
         'qt',
         'fli',
         'flc',
         'mod',
         'iso',
       ],
       /**
        * 需要排除的后缀,如果与include同时配置,则取两者的交集
       *
       * 后缀不够用? 高阶用法: https://hlink.likun.me/other/v2.html#%E6%96%B0%E5%A2%9E%E5%8A%9F%E8%83%BD
       */
       exclude: [],
       /**
        * @scope 该配置项 hlink 专用
       * 是否保持原有目录结构,为false时则只保存一级目录结构
       * 可选值: true/false
       * 例子:
       *  - 源地址目录为:/a
       *  - 目标地址目录为: /d
       *  - 链接的文件地址为 /a/b/c/z/y/mv.mkv;
       *  如果设置为true  生成的硬链地址为: /d/b/c/z/y/mv.mkv
       *  如果设置为false 生成的硬链地址为:/d/y/mv.mkv
       */
       keepDirStruct: true,
       /**
        * @scope 该配置项 hlink 专用
       * 是否打开缓存,为true表示打开
       * 可选值: true/false
       * 打开后,每次硬链后会把对应文件存入缓存,就算下次删除硬链,也不会进行硬链
       */
       openCache: false,
       /**
        * @scope 该配置项 hlink 专用
       * 是否为独立文件创建同名文件夹,为true表示创建
       * 可选值: true/false
       */
       mkdirIfSingle: true,
       /**
        * @scope 该配置项为 hlink prune 命令专用
       * 是否删除文件及所在目录,为false只会删除文件
       * 可选值: true/false
       */
       deleteDir: false,
     }
    

    可以到看到大部分配置都已经有的了,我们只要修改部分就行。例如最重要的 pathsMapping 属性。这是时候需要注意,此时填写的路径不是当前宿主机中的路径,而是容器中的路径,你需要根据启动容器时候的目录映射参数来修改相对应的路径。

    例如我的启动参数中映射是:-v /mnt/user:/share,即在宿主机的路径 /mnt/user 等于容器中的 /share,所以我原本电影(源文件)的下载路径:/mnt/user/UNRAID/downloads/qBittorrentDownloads/Media/Moive,这时候就要改为:/share/UNRAID/downloads/qBittorrentDownloads/Media/Moive,原本硬链接的存放位置:/mnt/user/UNRAID/media/Moive,就要更改为:/share/UNRAID/media/Moive

    所以最后我的 pathsMapping 属性就是:

     pathsMapping: {
       '/share/UNRAID/downloads/qBittorrentDownloads/Media/Moive': '/share/UNRAID/media/Moive'
     },
    
  4. 然后点击「确定」;

  5. 之后点击「创建任务」

    创建任务.png

  6. 输入任务名称,任务类型选择 硬链(hlink),然后选择你刚刚创建的配置文件,最后点击「确定」;

  7. 最后在任务列表点击你刚刚点击的任务,就可以开始进行创建硬链接了。

需要注意的点

  1. 我在 {% post_link 榨干这台NAS第002话-下载工具 %} 文章中有提到 qBittorrent 一些使其更好使用的配置(「工具」-「选项」-「下载」勾选「为不完整的文件添加扩展名 .!qB」),为的就是在创建硬链接的时候不将未下载完成的电影包括进去;

  2. 可以为任务设置定时任务,这样就不需要在每次有新电影时再进入 Web 页面进行手动操作了,一般来说一个小时执行一次任务即可;

  3. 我在 {% post_link 榨干这台NAS第000话-目录结构 %} 中提到电影,电视剧不同类型的影音文件最好可以分文件夹保存,这时候在创建硬链接的时候就需要根据不同的分类创建不同的配置才可以,例如我就根据不同的媒体类型创建了不同的配置:

    hLink.png

  4. 当文件夹中有文件你不想进行硬链接时,可以在 exclude 中添加规则。

参考

https://github.com/likun7981/hlink