erc*_*rch 8 filesystems inode journaling
我希望我说对了:文件inode
包含数据,例如 inode 编号、上次修改时间、所有权等 – 以及条目:»删除时间«。这让我感到好奇:
删除文件意味着删除它的 inode number,从而将链接到它的存储空间标记为可用。有一些工具可以恢复(意外)删除的文件(例如从日志中,如果可用)。我知道stat
命令。
日志中的“已删除文件”条目是什么样的?
我的猜测是一个非常不起眼的输出,例如发出stat
命令。
我知道删除文件并尝试恢复它会是一种亲身体验,但是我现在还没有在没有外部帮助的情况下可以做到这一点,我想确切地了解我在做什么。目前进入数据复活对我来说是一种偏题,因为我试图牢牢掌握基本的东西......我不懒惰,这不是家庭作业,这是私人学习。
当文件或目录被“删除”时,它的 inode 编号将从包含该文件的目录中删除。您可以使用该tree
命令查看给定目录包含的 inode 列表。
$ tree -a -L 1 --inodes .
.
|-- [9571121] dir1
|-- [9571204] dir2
|-- [9571205] dir3
|-- [9571206] dir4
|-- [9571208] dir5
|-- [9571090] file1
|-- [9571091] file2
|-- [9571092] file3
|-- [9571093] file4
`-- [9571120] file5
5 directories, 5 files
Run Code Online (Sandbox Code Playgroud)
了解硬链接的工作原理很重要。如果您刚开始尝试对 inode 的工作方式有基本的了解,那么本题为:Intro to Inodes 的教程有很好的详细信息。
摘抄
inode 编号是唯一的,但您可能已经注意到某些文件名和 inode 编号列表确实显示了一些具有相同编号的文件。重复是由硬链接引起的。当一个文件被复制到多个目录中时,就会建立硬链接。同一个文件存在于同一个存储单元的不同目录中。目录列表显示了两个具有相同编号的文件,这些文件将它们链接到同一个物理存储单元。硬链接允许同一个文件“存在”在多个目录中,但只存在一个物理文件。然后在存储单元上节省空间。例如,如果将一个 1 兆字节的文件放在两个不同的目录中,则存储上使用的空间是 1 兆字节,而不是 2 兆字节。
同一个教程也有关于删除 inode 时会发生什么的内容。
删除文件会导致大小和直接/间接块条目为零,并且存储单元上的物理空间设置为未使用。要取消删除文件,如果使用了元数据,将从日志中恢复元数据(请参阅日志文章)。一旦元数据被恢复,文件就可以再次访问,除非物理数据在存储单元上被覆盖。
您可能还想了解范围及其工作方式。再次来自 linux.org 站点,另一个很好的教程,标题为:Extents will help you get the basics down。
您可以使用该命令filefrag
来确定给定文件/目录正在使用多少个区。
$ filefrag dir1
dir1: 1 extent found
$ filefrag ~/VirtualBox\ VMs/CentOS6.3/CentOS6.3.vdi
/home/saml/VirtualBox VMs/CentOS6.3/CentOS6.3.vdi: 5 extents found
Run Code Online (Sandbox Code Playgroud)
您可以使用-v
开关获得更详细的输出:
$ filefrag -v dir1
Filesystem type is: ef53
File size of dir1 is 4096 (1 block of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 0: 38282243.. 38282243: 1: eof
dir1: 1 extent found
Run Code Online (Sandbox Code Playgroud)
注意:请注意,目录始终至少消耗 4K 字节。
我们可以使用我们的一个示例文件并向其中写入 1MB 的数据,如下所示:
$ dd if=/dev/zero of=file1 bs=1k count=1k
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 0.00628147 s, 167 MB/s
$ ll | grep file1
-rw-rw-r--. 1 saml saml 1048576 Dec 9 20:03 file1
Run Code Online (Sandbox Code Playgroud)
如果我们使用filefrag
以下命令分析此文件:
$ filefrag -v file1
Filesystem type is: ef53
File size of file1 is 1048576 (256 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 255: 35033088.. 35033343: 256: eof
file1: 1 extent found
Run Code Online (Sandbox Code Playgroud)
您可以做的一个有趣的实验是创建一个文件,例如file1
上面的文件,然后删除它,然后重新创建它。看看会发生什么。删除文件后,我立即重新运行dd ...
命令并在命令中file1
显示如下filefrag
:
$ filefrag -v file1
Filesystem type is: ef53
File size of file1 is 1048576 (256 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 255: 0.. 255: 256: unknown,delalloc,eof
file1: 1 extent found
Run Code Online (Sandbox Code Playgroud)
一段时间后(几秒钟到几分钟过去):
$ filefrag -v file1
Filesystem type is: ef53
File size of file1 is 1048576 (256 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 255: 38340864.. 38341119: 256: eof
file1: 1 extent found
Run Code Online (Sandbox Code Playgroud)
文件终于出现了。我不完全确定这里发生了什么,但看起来文件状态需要一些时间才能在日志和磁盘之间稳定下来。运行stat
命令显示带有 inode 的文件,因此它在那里,但使用的数据filefrag
尚未解析,因此我们处于一种不确定状态。
归档时间: |
|
查看次数: |
3407 次 |
最近记录: |