我有一个文件系统,其中包含许多我定期删除的小文件(这些文件是可以轻松重新生成的缓存)。简单地创建一个新的文件系统比运行rm -rf
或rsync
删除所有文件要快得多(即高效删除包含数千个文件的大型目录)。
创建新文件系统来擦除文件系统的唯一问题是它的 UUID 发生变化,从而导致例如/etc/fstab
.
有没有一种方法可以简单地从 ext4 文件系统中“取消链接”目录,或者完全清除其 inode 列表?
答案1
由于您正在使用,ext4
您可以格式化文件系统,然后将 UUID 设置为已知值。
man tune2fs
写道,
-U UUID
将文件系统的通用唯一标识符 (UUID) 设置为 UUID。 UUID 的格式是一系列由连字符分隔的十六进制数字,如下所示c1b9d5a2-f162-11cf-9ece-0020afc76f16
。
同样,man mkfs.ext4
写道,
-U UUID
将文件系统的通用唯一标识符 (UUID) 设置为 UUID。[…如上…]
就我个人而言,我更喜欢通过标签来引用文件系统。例如,在/etc/fstab
我的一个系统中,我有这样的条目
# <file system> <mount point> <type> <options> <dump> <pass>
LABEL=root / ext4 errors=remount-ro 0 1
LABEL=backup /backup ext4 defaults 0 2
可以使用和-L
标志添加此类标签。他们避免出现问题tune2efs
mkfs.ext4
索引节点校验和导致重新格式化的文件系统重新发现或损坏,并且它们更容易通过视觉识别。 (但在多个系统中不太可能是唯一的,因此在交换磁盘时要小心。)
答案2
您可以使用-U
withmkfs.ext4
指定您自己的 UUID,以便在重新创建文件系统时您可以简单地重用以前的 UUID。
答案3
在 ext3/ext4 上为新文件系统重复使用 UUID 是一个坏主意。
UUID 用于 inode 校验和计算,以允许 fsck 区分属于当前文件系统的 inode 和来自先前文件系统的 inode。
如果您使用相同的 UUID 重新格式化现有的扩展文件系统,文件系统检查很可能会找到旧数据,并尝试挽救它。通常,这是一个交互式过程,因此启动时的非交互式自动文件系统检查将失败,然后您将进入救援 shell。
如果您的分区表是 GPT,那么您可以在 fstab 中使用分区 UUID,或者如果您使用 LVM,您还可以通过它获得持久名称。
答案4
我只是将文件系统放在LVM精简池,并在创建后制作精简快照。然后,我只需回滚到该快照,而不是重新创建文件系统。在存储方面,这几乎没有开销。
您还可以在创建后立即拍摄文件系统的映像,并将其保存以供以后dd
恢复;如果底层存储是 SSD,这尤其有吸引力,因为它将使用丢弃将块标记为零/未使用,因此图像的创建速度会很快,图像文件大多稀疏,因此在有效存储需求方面微不足道,并且恢复将速度也快得惊人。
请注意,根据文件的大小,实际上有相当大的影响文件系统之间的速度差异(请参阅页面底部的基准)。对于中等大小的文件,XFS可能快一点!
mkfs
但如果您习惯按需使用,还有一个更简单的解决方案:mkfs.ext4 -U ${your_uuid_here}
让您设置文件系统的 UUID :)