我将大约 3.7TB 的数据从一个带有 HFS+ 文件系统的 4TB 外置硬盘复制到另一个带有 exFAT 文件系统的 4TB 外置硬盘。新硬盘在只传输了大约 75% 的数据后就被填满了,我猜是因为 exFAT 的分配单元大小对于小文件占用了更多的空间。
我正在复制大量(约数百万)小文件(每个 1.5kB)。所以我想弄清楚如何做到这一点。
因此我需要一个满足以下要求的文件系统:
块大小足够小,我可以容纳数百万个大小为 1.5kB 的文件,浪费最少的空间。(这里 exFAT 有问题)
与 Linux 读/写兼容。(此处 HFS+ 有问题)
能够在Linux上创建4T分区。(这里ext4有问题)
有任何替代文件系统吗?
更新:该问题被标记为已在另一篇文章中回答(针对大量小文件优化文件系统?)。然而,接受的答案对我来说不起作用:
mkfs.ext4 -b 1024 /dev/your_partition
Warning: specified blocksize 1024 is less than device physical sectorsize 4096
/dev/sdc: Cannot create filesystem with requested number of inodes while setting up superblock
答案1
您可以使用的文件系统
支持某种块子分配. 有很多形式,例如
- 地块细分:多次将一个区块分成两个
- 尾部包装:在一个块中共享多个文件的最后一个部分块
- 可变块大小:允许合并或分割块
一些具有块子分配的文件系统:雷泽文件系统,赖泽4,捷豹路虎,西北渔业局,虚拟文件系统,文件系统,UFS1/2,虚拟机文件系统... 例如VMFS5/6块大小为 1 MB,但支持 1 KB 小文件
但是考虑到你的问题的规模,涉及数百万个文件、ReiserFS/Reiser4、Btrfs 和 ZFS 可能是最佳解决方案
欲了解更多详情,请阅读下文
由于您的文件大小约为 1.5 KB,因此理想的您的情况的块大小将是 512 字节。但是您的磁盘有4 KB 物理扇区大小(又名高级格式)从错误信息可以看出:
警告:指定的块大小 1024 小于设备物理扇区大小 4096
意思是你不能创建比这更小的块大小。您需要使用块子分配来减少浪费的空间。您可以打开文件系统比较 - 分配和布局策略并排序块子分配 / 尾部打包 / 可变块大小了解哪些文件系统支持此类功能
另一种选择是将数据存储在元数据空间中多条记录被分配到一个块中
在 NTFS 中,每个文件都由一个MFT 记录类似于索引节点在 *nix 中。小文件将直接存储在 MFT 记录中,节省空间,并缩短访问时间,因为您不需要再次读取磁盘来获取真实数据。这些被称为常驻文件后来在 ext4 中也添加了类似的功能,称为内联文件:
内联数据功能旨在处理文件数据非常小以至于可以轻松放入 inode 中的情况,这(理论上)可以减少磁盘块消耗并减少寻道。如果文件小于 60 字节,则数据将以内联方式存储在 中
inode.i_block
。
60 字节的值是针对默认的 256 字节 inode 大小。inode 结构占用 156 字节,其他 40 字节可能用于某些扩展功能。但是您可以更改 inode 大小到 2 KB,以适应所有 1.5 KB 文件-I inode-size
选项格式化时
Btrfs 中也有类似的功能,小文件直接写入元数据流
max_inline=bytes
(默认值:最小值(2048,页面大小))
指定元数据 B 树叶中可内联的最大空间量。该值以字节为单位指定,可选地带有 K 后缀(不区分大小写)。
它似乎Reiser4 也有这样的功能尽管我无法证实。
在 NTFS 中,当前默认 MFT 记录为 1 KB,尽管在 Windows NT 3.1 中的 NTFS 1.0 中为 4 KB。这只允许驻留约 600-900 字节或更少的文件,因此您必须更改 MFT 记录大小。这是可能的尽管你很难找到允许更改默认 MFT 记录大小的格式化软件
有些人的情况和你差不多
你那边也有很多误解
与 Linux 读/写兼容。(此处 HFS+ 有问题)
Linux 中有许多可用的读/写 HFS+ 驱动程序,所以这应该不是问题。HFS+ 的唯一问题是它与 ext2 处于同一时代,因此与 ext4、NTFS、ZFS 或 Btrfs 等现代文件系统相比,它要差得多
能够在Linux上创建4T分区。(这里ext4有问题)
ext4 和 exFAT 都能够以 1 KB 块大小创建 4 TB 分区。事实上任何 32 位文件系统都可以创建具有 1 KB 块大小的 4 TB 卷因为 2 32块 × 2 10字节/块 = 4 × 2 40字节 = 4 TB,并且使用默认的 4 KB 块大小,则最大分区大小为 16 TB。ext4 使用 48 位地址,因此最大大小要大得多
块大小足够小,我可以容纳数百万个大小为 1.5kB 的文件,浪费最少的空间。(这里 exFAT 有问题)
事实上,exFAT 的唯一问题是默认块大小太大. exFAT 上的最小块大小为1 个扇区因此它可以在具有 512 位扇区的磁盘中拥有 512 字节块大小(参见9.2 集群大小限制在规格中)。您可以在格式对话框中看到 512 字节和 1 KB 选项,如下所示。不幸的是,您的磁盘有 4 KB 扇区,因此 exFAT 不起作用
答案2
“能够在 Linux 上创建 4T 分区。(此处 ext4 有问题)”
Ext4 对于 4TB 分区没有任何问题。
~# LANG=C; df -hT |grep T
Filesystem Type Size Used Avail Use% Mounted on
/dev/sdb1 ext4 33T 12T 20T 37% /RAIDDATA