早期 linux 拼接多个目录的内容到一个目录,只能通过软链接,新的 linux 内核带的 overlayfs 支持将多个目录内容重新挂载至一个目录。
使用 overlay 文件系统的这个特性,我们可以把两个50T的目录合并成一个100T的目录,并且不改变目录结构。比如医学影像系统,即我们俗称的PACS系统,它存储的文件都在一个目录中。当需要做数据迁移时,只能找一个更大的目录来存,不然原目录内容就需要拆分。
有了 overlayfs ,我们就可以将拆分后的目录重新组合成一个目录。为了说明目录结构间的变化 ,我们以真实场景进行举例,比如原存储目录内容为平面按天存储。长年累月使用之后,目录会变得非常大,非常不利于数据迁移。

我们把原数据按年迁移至新的目录 2018、2019、2020,新的目录在不同的存储介质上。因新存储比老存储空间小,所以拆成多个目录存储。将多个目录通过 NFS 挂载在一台主机上。然后通过如下操作将多个目录合并成一个目录。
# 挂载多个存储至一台主机mount 192.168.1.1:/pacs/2018 2018mount 192.168.1.2:/pacs/2019 /2019mount 192.168.1.3:/pacs/2020 /2019# 准备 overlay 挂载目录mkdir -p newpacsmkdir -p newpacswork# 挂载 只读 overlay 文件系统mount -t overlay overlay \-o lowerdir=/2018:/2019:/2020,\workdir=/newpacswork newpacs
其中 lowerdir 是原始目录,workdir 在使用中一直是空目录,是 overlay 需要的,最终目录为 newpacs 。使用以上命令挂载的新的目录与拆分前的目录结构一致,所有数据都在一个目录中。这里没有用到 overlay 的 upperdir 参数,所以挂载出来的目录是只读的。
如果启用 upperdir 参数,则挂载目录 newpacs 是可写的,所有改变的部分会存储至 upperdir 目录。修改后可读写的挂载命令如下:
# 准备 upperdir 目录mkdir -p /newpacsupper# 挂载 可读写 overlay 文件系统mount -t overlay overlay \-o lowerdir=/2018:/2019:/2020,\upperdir=/newpacsupper,\workdir=/newpacswork /newpacs
注意 -o 选项后面的 lowerdir 、upperdir、workdir 逗号之间不能有空格,不然会报错。对于 lowerdir 来说,overlay 文件系统会将其作为只读目录处理,不会写入原目录。所有变动部分会体现在 upperdir 目录中。当删文件时,只会在 upperdir 目录中留下一个标记,并不会真的删除原目录内容。写入的文件也同样生成新的文件,不会覆盖 lowerdir 中的原文件。
overlay 文件在 docker 中用得比较多,这里我们把它拿来处理 PACS 存储迁移后文件合并的场景。
全文完。
如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。




