不同磁盘上的 2 个文件夹表现得像 1 个文件夹一样

不同磁盘上的 2 个文件夹表现得像 1 个文件夹一样

我有一台带有两块 1TB 硬盘的服务器。我有一个上传文件夹/disk2/uploads,该文件夹已经占满了整个硬盘。另一个磁盘基本上是空的。我想在空驱动器上有一个溢出文件夹,用于存放第一个磁盘上放不下的任何其他上传内容。

问题是我的 Web 应用程序需要知道文件在哪里。一种解决方案是让我的 Web 应用程序将所有新文件上传到空磁盘上,当应用程序需要获取文件时,它会查看文件是否存在于新位置,如果不存在,它会检查旧位置。不过我想用 Linux 来解决这个问题。

是否可以创建一个符号链接(或类似的东西),让我能够将新文件上传到 /var/www/uploads 并允许我从 /var/www/uploads 文件夹中找到 /disk2/uploads 中的文件?

例如:

如果/disk2/uploadsfolder1folder2/var/www/uploadsfolder3那么我想要的是:

> ls /disk2/uploads
folder1 folder2
> ls /var/www/uploads
folder1 folder2 folder3

如果存在这样的解决方案,如果/disk2/uploads/folder1/foo.log存在,并且我尝试上传foo.log到,会发生什么/var/www/uploads/folder1/foo.log?这对我来说可能不是问题,因为我们的文件名称中都有时间戳,但我很好奇。

答案1

如果您只想在两个块设备(本例中为磁盘)之间线性分配数据,同时提供单个文件系统命名空间,则可以使用 LVM。使用具有两个物理卷和一个逻辑卷的卷组(该卷组分配为占用您所需的所有空间)非常简单。它还允许更弹性地调整卷大小。这将解决块级问题,而顶层文件系统的选择基本上无关紧要。下面是链接到 RedHat 指南,了解如何以一般方式执行此操作

通过将多个磁盘添加到单个文件系统池,BTRFS 也可以实现相同的功能,并且 BTRFS 具有 LVM 不一定包含的出色耐用性功能,例如校验和和完全在线文件系统检查。这将在文件系统级别解决问题。以下是通用的多设备 BTRFS 指南。

不过,这两种解决方案都要求您将数据复制到新文件系统。因此,这不一定是一个完整的迁移计划。就我个人而言,在这种情况下,我可能会选择 BTRFS,除非您还在同一个磁盘上运行数据库工作负载之类的东西,在这种情况下,我建议使用 LVM 和传统文件系统。

就迁移而言,几个中间符号链接和一个文件副本可能就足够了。但是,我不知道您正在运行的应用程序,因此您的策略可能会受到影响。

编辑 仔细想想,不要在较旧的系统上使用 BTRFS(例如 CentOS/RHEL 7 或 SLES 12 之前的任何系统)。内核 2.6 中的早期软件包在功能支持和稳定性方面相当不稳定。

编辑 JDS 的回答提醒我,您可能正在认真寻找近乎完全在线的迁移,并且有一种方法(实际上有几种)可以提供完全透明的跨文件系统覆盖,使您能够以各种统一的方式访问两个系统的内容。

我对 unionfs 有相当多的个人经验,它工作得很好,而且相当简单。您也可以根据所需的功能查看 aufs。这些文件系统对于我的应用程序和数据中心迁移非常有用。

答案2

通过您提供的详细信息,无法将目录链接在一起并使它们显示为一个目录。

不过,您的问题还是有解决办法的。不过,解决办法大多需要重建文件系统。其中包括备份所有数据、进行重大、破坏性的文件系统更改,然后恢复数据等步骤。

您没有提供有关服务器和现有文件系统的足够详细信息来确定最佳方法是什么,但我可以做出一些有根据的猜测。

LVM 是创建跨多个物理磁盘的单个“文件夹”的不错选择。LVM 的配置非常简单,但肯定需要一些规划。

将现有服务器(分别安装两个硬盘)重建为将两个硬盘安装为单个 LVM 卷的服务器的最简单方法是备份所有数据并从头开始重新安装操作系统。现代操作系统安装程序具有可以自动设置 LVM 部分的步骤。

如果两个 1TB 驱动器只是数据驱动器,而操作系统位于另一个磁盘上,则可以备份所有数据,将两个 1TB 驱动器组合成一个接近 2TB 的单个 LVM 卷,并将其安装在原始位置。然后恢复数据。

还有其他文件系统提供与 LVM 类似的解决方案(例如 ZFS),但它们都归结为同一件事:1)备份;2)将 fs 重建为连续的逻辑卷,并将其挂载在原始位置,3)恢复数据。

答案3

我是不是漏掉了什么?为什么不简单地将整个上传目录复制/移动到新的(空)磁盘并将服务器指向那里呢?

相关内容