Bri*_*mas 13 filesystems zfs directory recursive rm
我想删除zfs
数据集子目录的内容。这是大量的数据。对于池“nas”,路径是/nas/dataset/certainFolder
$ du -h -d 1 certainFolder/
1.2T certainFolder/
Run Code Online (Sandbox Code Playgroud)
而不是我必须等待,rm -rf certainFolder/
我不能只是销毁该目录的句柄,以便它可以覆盖(如果我选择重新创建它,甚至可以使用相同的目录名称)??
因此,例如,对于zfs
文件系统内部结构知之甚少,特别是它如何记录其文件,我想知道我是否能够直接访问该日志/映射,例如,然后删除正确的条目,以便不再显示目录。该空间目录也必须从某种审计中删除。
是否有捷径可寻?即使在ext3 fs 上,或者这已经是递归删除命令首先要做的事情,即窃取和编辑期刊?
我只是希望做一些类似的事情kill thisDir
,它只是删除某种 ID,并且目录不再出现在ls -la
. 数据显然仍然在驱动器上,但现在空间将被重用(覆盖),因为 ZFS 就那么酷?
我的意思是我认为zfs真的很酷,我们该怎么做?理想情况下?搓手:-)
我的具体用例(除了我对 的热爱zfs
)是管理备份存档。数据通过 freefilesync (AWESOME PROG) 推送到 zfs,在 SMB 上/从 win box 到 zfs 池。删除rm -rf /nas/dataset/certainFolder
一个putty
词条时,它就卡住了,这个词条现在很长一段时间都不能用了。我当然必须打开另一个终端才能继续。那已经过时了,而且监视 rm -rf 没有乐趣,这可能需要几个小时。
也许我应该将命令设置为仅释放句柄,例如&
,然后打印到标准输出,这可能很好。 更现实的是,zfs destroy nas/dataset; zfs create -p -o compression=on nas/dataset
根据@Gilles 的响应,在几秒钟内重新创建数据集。
jll*_*gre 16
在任何体面的文件系统中跟踪释放的块是不可避免的,ZFS也不例外。然而,在 ZFS 下有一种简单的方法可以通过“推迟”底层清理来实现几乎即时的目录删除。它在技术上与 Gilles 的建议非常相似,但本质上是可靠的,不需要额外的代码。
如果在删除目录之前创建文件系统的快照,则目录删除将非常快,因为在其下不需要探索/释放任何内容,所有内容仍由快照引用。然后您可以在后台销毁快照,以便逐渐恢复空间。
d=yourPoolName/BackupRootDir/hostNameYourPc/somesubdir
zfs snapshot ${d}@quickdelete && {
rm -rf /${d}/certainFolder
zfs destroy ${d}@quickdelete &
}
Run Code Online (Sandbox Code Playgroud)
你所要求的是不可能的。或者,更准确地说,删除目录及其文件需要付出代价;如果您在删除时不付款,则必须在其他地方付款。
你不只是删除一个目录——这将是近乎即时的。您正在删除一个目录及其中的所有文件,并且同样递归地删除其所有子目录。删除文件意味着减少其链接数,然后如果链接数达到 0 并且文件不是,则将其资源(用于文件内容和文件元数据的块,以及如果文件系统使用 inode 表的 inode)标记为空闲打开。这是一个必须对目录树中的每个文件都进行的操作,所以它所花费的时间至少与文件数量成正比。
您可以延迟将资源标记为免费的成本。例如,有垃圾收集文件系统,您可以在其中删除目录而不删除它包含的文件。垃圾收集器的运行将检测无法通过目录结构访问的文件并将它们标记为空闲。这样做rm -f directory; garbage-collect
的一个垃圾回收文件系统做了同样的事情,rm -rf
在传统文件系统上,具有不同的触发器。垃圾收集文件系统很少,因为 GC 是很少需要的额外复杂性。GC 时间可能随时出现,当文件系统需要一些空闲块而没有找到时,因此操作的性能将取决于过去的历史记录,而不仅仅是操作,这通常是不可取的。您需要运行垃圾收集器才能获得实际的可用空间量。
如果要在普通文件系统上模拟 GC 行为,可以这样做:
mv directory .DELETING; rm -rf .DELETING &
Run Code Online (Sandbox Code Playgroud)
(我省略了许多重要的细节,例如错误检查、断电恢复能力等。)目录名称立即变得不存在;空间被逐步回收。
在没有 GC 的情况下避免在移除期间支付成本的另一种方法是在分配期间支付。将目录树标记为已删除,并在分配块时遍历已删除的目录。这很难与硬链接相协调,但在没有硬链接的文件系统上,可以通过 O(1) 分配成本增加来完成。然而,这会使非常常见的操作(创建或扩大文件)更加昂贵,唯一的好处是相对少见的操作(删除大目录树)更便宜。
如果将目录树存储为其自己的块池,则可以批量删除该目录树。(注意:我使用的“池”一词与 ZFS 的“存储池”的含义不同。我不知道正确的术语是什么。)这可能会非常快。但是你用自由空间做什么?如果您将其重新分配给另一个池,则会产生成本,但比单独删除文件要少得多。如果将空间留作未使用的保留空间,则无法立即收回。为目录树设置一个单独的池意味着增加或减少该池的大小(无论是动态的还是明确的)都会增加成本。使树成为自己的存储池也会增加将文件移入和移出树的成本。
归档时间: |
|
查看次数: |
7086 次 |
最近记录: |