在不同的磁盘上有2个文件夹的行为就好像他们是1个文件夹

我有两个1TB硬盘驱动器的服务器。 我在/disk2/uploads上有一个上传文件夹,那个文件夹已经填满了整个硬盘。 另一个磁盘基本上是空的。 我想要在空驱动器上有一个溢出文件夹,该文件夹承载了任何不适合第一个磁盘的附加上传文件。

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

是否有可能创build一个符号链接(或什么东西),这将允许我上传新文件到/ var / www / uploads,并允许我从/ var / www / uploads文件夹中find/ disk2 / uploads中的文件?

例如:

如果/disk2/uploadsfolder1folder2/var/www/uploadsfolder3 。 那我想要这个:

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

如果存在这样的解决scheme,如果/disk2/uploads/folder1/foo.log存在,会发生什么情况,我尝试将foo.log上传到/var/www/uploads/folder1/foo.log ? 这对我来说可能不是问题,因为我们的文件都以他们的名字加盖了时间戳,但我很好奇。

如果您只想在呈现单个文件系统名称空间的情况下跨两个块设备(磁盘,在本例中)线性分配数据,则可以使用LVM。 使用具有两个物理卷的卷组和一个分配的消耗所有空间的逻辑卷将非常简单。 它也将允许更有弹性的音量调整。 这将在块级别处理这个问题,而顶层的select文件系统在很大程度上是不相关的。 下面是关于如何在一般意义上做到这一点的RedHat指南的链接 。

BTRFS可以通过向单个文件系统池添加多个磁盘来实现同样的效果,而BTRFS具有LVM不一定包括的很强的耐久性function,例如校验和和完全在线的文件系统检查。 这将解决文件系统级别的问题。 这是一个通用的多设备BTRFS指南。

这两个解决scheme都要求您将数据复制到新的文件系统。 所以这不一定是一个完整的迁移计划。 就我个人而言,在这种情况下,我可能会使用BTRFS,除非您也从相同的磁盘上运行类似于数据库工作负载的东西,我会推荐LVM和传统的文件系统。

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

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

编辑 JDS的回答提醒我,你可能会认真寻找一个接近完全的在线迁移,而且有一种方法(几个,实际上)提供完全透明的跨文件系统覆盖,将允许您访问两个系统的内容统一的方式。

我对工会的个人经验有一个公正的看法,工作很好,而且相当简单。 您也可以根据您需要的function来查看aufs。 这些文件系统对我来说对于应用程序和数据中心迁移非常重要。

根据您提供的详细信息,无法将这些目录链接在一起,并使它们显示为一个单独的目录。

有,但是,解决您的问题。 不过,这些解决scheme大多需要重build文件系统。 其中包括备份所有数据,重大破坏性文件系统更改,然后恢复数据等步骤。

你没有提供足够的关于服务器和现有文件系统的细节来确定最好的方法是什么,但我可以做出一些有教育意义的猜测。

LVM是制作跨越多个物理磁盘的单个“文件夹”的最佳select。 LVM很容易configuration,但肯定需要一些规划。

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

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

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

我在这里错过了什么? 为什么不简单地保持它简单复制/移动整个上传目录到新的(空)磁盘并指向服务器?