我有一个相当大的数据集(约 160TB),需要不时地传送给客户端。此数据集由相当大的文件组成,通常每个文件在 2GB 到 20GB 之间。它们存在于在 RAID 集群上运行的 BeeGFS 文件系统上,总容量为 1.1TB。目前,当需要传送数据时,它按以下方式完成:
- 创建文件及其大小的主索引
- 统计文件大小,直到 4Tb,并从主索引中创建所述文件的子索引
- 将文件复制到 4Tb USB 驱动器
- 重复步骤 2 和 3,直到整个数据集被复制
- 给客户一盒 U 盘
我想做的只是将其 rsync 到已安装的文件系统,所以我想知道是否有可用的文件系统可以将存储空间分布到多个磁盘上?显而易见的候选者是 LVM 和 RAID,但问题是客户端需要能够单独读取每个磁盘,这超出了这一点(至少据我所知)。有没有一种方法可以模拟 LVM 或类似的东西,但允许以相当标准的方式读取单个磁盘?实际上,允许我运行单个 rsync 操作,将数据分布到多个单独的磁盘/文件系统上
数据来自一台 Redhat 机器,所以到目前为止,我只在 USB 驱动器上使用了 ext4。但是,如果可能的话,如果我可以使用与 Windows10 兼容的文件系统,那么对每个人都非常有益(尽管不是绝对必要的)。
PS:对于同时连接的 USB 驱动器数量,我没有限制。我唯一真正的限制是,数据必须一次只能在一个磁盘/文件系统上访问。
答案1
创建文件和大小的完整列表,例如:
查找/路径-type f-printf“%s%h%f \ n”> all_files.txt
运行一个 awk
all_files.txt
,根据每个部分的总大小将其拆分成多个部分(此处的 MAXSIZE 是最大大小(以字节为单位)的占位符)
BEGIN {total=0;part=0;}
{total += $1;
if (total > MAXSIZE) {part++;total=0;}
$1="";print substr($0,2) >> "partial-"part}
现在,您可以将所有磁盘挂载到不同的挂载点(例如
/mnt/send/partial-1
,,/mnt/send/partial-2
...),并在每个挂载点中使用您想要的文件系统。在循环中,您
rsync
将--files-from=FILE
找到正确的挂载点。 类似这样的内容:
for f in partial*
do
rsync --files-from=$f / /mnt/$f/
done