Linux 文件构成

  • 数据块:存放文件真实内容的地方。
  • 索引节点

    • 文件的身份。存储权限、大小等元数据,并指向真实数据即数据块
    • Link Count (链接计数):索引节点上的一个数字,记录有多少个文件名指向它。与Telegram类似 :链接数为 0 时,数据才会被系统删除
  • 文件名:指向文件的索引节点的“标签”。关系: 文件名 -> 索引节点 -> 数据块

硬链接 (Hard Link)

  • 本质:多个文件名指向同一个索引节点
  • 特性

    • 所有链接地位平等,没有“源文件”和“快捷方式”之分。
    • 删除任一链接,仅使索引节点的链接计数减 1
    • 数据只在链接数为 0 时才被删除。
    • 不能跨硬盘/文件系统。

软链接 (Soft Link / 快捷方式)

  • 本质:一个特殊文件,其内容是另一个文件的路径地址
  • 特性

    • 只是一个指针,地位不平等。
    • 删除源文件,软链接会失效(变成“断开的链接”)。
    • 可以跨硬盘/文件系统。

    Docker

    发现 radarr 无论如何都不能硬链接 qbit 下载的电影。才发现 docker 的卷映射到主机上不同目录,对 docker 来说就是跨硬盘/文件系统。

这是原来的目录树:

/mnt/Storage1/
├── AppData/
├── Downloads/       <-- 下载目的地
├── Media/           <-- 媒体库存放地
├── qbittorrent-nox/ <-- qb 的配置
├── radarr/          <-- Radarr 的配置
└── ... (其他各种文件夹)
  • /mnt/Storage1/Media/Movies -> /movies
  • /mnt/Storage1/Downloads -> /downloads

这样 movies 和 downloads 映射不是同一个目录。

最初的配置虽然在主机上满足了硬链接的条件,但在 Docker 的虚拟化层面上,通过创建多个独立的挂-载点,人为地制造了“跨文件系统”的假象,从而导致了失败。

这是最终的目录树:

/mnt/Storage1/Plex-Media-Server/
├── configs
│   ├── jellyfin
│   ├── prowlarr
│   ├── qbittorrent-nox
│   ├── qbittorrent-nox\011
│   └── radarr
└── data
    ├── downloads
    └── media
  • /mnt/Storage1/Plex-Media-Server/data -> /data
    全部的容器的 data 都映射到 /mnt/Storage1/Plex-Media-Server/data

总而言之,对容器来说,卷映射最重要的还是映射 config 和 data,config 可以放在一个 configs 目录下为不同容器创建的目录,data 比如说像这种影视库要共用影视文件的则映射到同一个 data 目录就行了。