我有一个文件系统,其中包含许多我定期擦除的小文件(这些文件是可以轻松重新生成的缓存)。rm -rf
简单地创建一个新的文件系统而不是运行或rsync
删除所有文件(即有效地删除包含数千个文件的大目录)要快得多。
创建一个新的文件系统来擦除文件系统的唯一问题是它的 UUID 发生了变化,导致例如/etc/fstab
.
有没有办法简单地从例如 ext4 文件系统中“取消链接”一个目录,或者完全清除它的 inode 列表?
我有一个文件系统,其中包含许多我定期擦除的小文件(这些文件是可以轻松重新生成的缓存)。rm -rf
简单地创建一个新的文件系统而不是运行或rsync
删除所有文件(即有效地删除包含数千个文件的大目录)要快得多。
创建一个新的文件系统来擦除文件系统的唯一问题是它的 UUID 发生了变化,导致例如/etc/fstab
.
有没有办法简单地从例如 ext4 文件系统中“取消链接”一个目录,或者完全清除它的 inode 列表?
由于您正在使用
ext4
,您可以格式化文件系统,然后将 UUID 设置为已知值。man tune2fs
写道,同样,
man mkfs.ext4
写道,就个人而言,我更喜欢按标签引用文件系统。例如,在
/etc/fstab
我的一个系统中,我有这样的条目此类标签可以使用 和 的标志
-L
添加。它们避免了在重新格式化的文件系统上导致重新发现或损坏的inode 校验和问题,并且它们更容易在视觉上识别。(但在多个系统中不太可能是唯一的,因此在交换磁盘时要小心。)tune2efs
mkfs.ext4
您可以使用
-U
withmkfs.ext4
来指定您自己的 UUID,因此在重新创建文件系统时,您可以简单地重用以前的 UUID。为新文件系统重用 ext3/ext4 上的 UUID 是个坏主意。
UUID 用于 inode 校验和计算,以允许 fsck 区分属于当前文件系统的 inode 和来自先前文件系统的 inode。
如果您使用相同的 UUID 重新格式化现有的扩展文件系统,文件系统检查很有可能会找到旧数据并尝试挽救它。通常,这是一个交互式过程,因此启动时的非交互式自动文件系统检查将失败,然后您将被放入救援 shell。
如果您的分区表是 GPT,那么您可以在 fstab 中使用分区 UUID,或者如果您使用 LVM,您还可以通过它获得一个持久名称。
您可以更改 /etc/fstab 以使用文件系统标签进行挂载(“LABEL=testfs”而不是“UUID=.... "),然后在格式化时使用 "mke2fs -L testfs ..." 指定标签。
我只是将文件系统放在LVM 精简池上,并在创建后制作精简快照。然后,我只是回滚到那个快照,而不是重新创建文件系统。存储方面,这几乎没有开销。
您也可以在创建后立即拍摄文件系统的映像,并将其保存以供以后
dd
恢复;如果底层存储是 SSD,这将特别有吸引力,因为它将使用丢弃将块标记为零/未使用,因此图像的创建将很快,图像文件大多是稀疏的,因此在有效存储需求中微不足道,并且恢复将也非常快。请注意,根据文件的大小,文件系统之间的速度实际上存在显着差异(请参阅页面底部的基准)。对于中等大小的文件,XFS可能更快!
但是有一个更简单的解决方案,如果您习惯
mkfs
按需使用:mkfs.ext4 -U ${your_uuid_here}
让您设置文件系统的 UUID :)另一个要考虑的选项是将 fstab 更改为使用标签或分区 UUID (PARTUUID) 而不是文件系统 UUID。这样,您可以根据需要重新格式化分区,并且仍然可以正确安装。