【问题标题】:How exactly does unlink work?取消链接究竟是如何工作的?
【发布时间】:2014-12-16 16:44:06
【问题描述】:

我有点难以理解这是如何工作的。

unlink() 似乎会删除引用文件数据的 inode,但实际上不会删除数据。如果是这样的话,

a) 数据会发生什么变化?大概它不会永远存在,或者人们会一直用完磁盘空间。最终是否有其他方法可以在没有关联 inode 的情况下删除数据,还是什么?

b) 如果数据没有发生任何变化:我如何才能真正删除它?如果某些事情自动发生在它身上:我怎样才能在命令中实现它?

(辅助问题:如果 shell 命令 rmunlink 本质上做同样的事情,就像我在这里读到的其他问题一样,而 Perl unlink 只是另一个调用,那么有什么意义像File::Remove 这样的模块,它似乎又做了同样的事情?我意识到“有不止一种方法可以做到这一点”,但这似乎是“不止一种方法来说 it”,其中“it”总是指同一个操作。)

简而言之:我能否确保删除文件实际上会立即释放其磁盘空间?

【问题讨论】:

  • File::Remove 执行递归,rmdir 并为您进行 globing,而 unlink 没有。 data deleting 到底是什么意思? AFAIK 磁盘空间在取消链接后被释放,所有 PID 都为其关闭文件句柄。
  • @mpapec: unlink 只是删除了一个链接。在不再有任何指向数据的链接之前,不会回收空间

标签: perl file unix io


【解决方案1】:

磁盘上的每个 inode 都有一个引用计数 - 它知道有多少地方引用它。目录条目是一个引用。可以存在对同一 inode 的多个引用。 unlink 删除引用。当引用计数为零时,inode 不再使用,可能会被删除。这就是有多少东西可以工作,例如硬链接和快照。

特别是 - 打开的文件句柄是一个引用。因此,您可以打开一个文件,取消链接,然后继续使用它——它只会在文件句柄关闭后才会被实际删除(前提是引用计数降至零,并且在其他任何地方都没有打开/硬链接)。

【讨论】:

  • @ysth,在那篇文章中,“它”是 inode,所以它会在 Sobrique 说的时候消失,而不是在你说的时候消失。不过,只要调用unlink,目录条目就会消失。
【解决方案2】:

unlink() 删除指向数据(由 inode 引用)的链接(如果需要,也可以是名称,但技术上是某个目录文件中的记录)。一旦没有更多的数据链接,系统会自动释放相关空间。指向 inode 的链接数被跟踪到 inode 中。您可以使用ls -l 观察文件的实际链接数量,例如:

789994 drwxr-xr-x+  29 john  staff      986 11 nov  2010 SCANS
 23453 -rw-r--r--+   1 erik  staff      460 19 mar  2011 SQL.java

这意味着 inode 789994 有 29 个指向它的链接,而 inode 23453 只有 1 个。 SQL.java 是指向当前目录的条目,指向 inode 23453,如果从目录中删除该记录(系统调用 unlink 或命令 rm),则计数变为 0,系统释放相应的空间,因为如果计数为 0,那么这意味着没有更多的链接/名称来访问数据!这样就可以释放了。

【讨论】:

    【解决方案3】:

    删除链接只是意味着不再为某个文件名保留空间。当其他东西分配给该空间时,数据将被擦除/销毁。这就是为什么人们在删除财务记录等敏感数据后将零或随机数据写入驱动器的原因。

    【讨论】:

    • 覆盖通常有利于擦除,但取消链接与空间预留没有直接关系——它纯粹是通过目录条目进行引用。
    猜你喜欢
    • 2013-10-28
    • 2016-08-07
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 2011-06-26
    • 2021-08-15
    • 2012-06-08
    • 2011-10-11
    相关资源
    最近更新 更多