在回答这个标题为“ U&L”的问题时,如何使用什么命令查看文件系统中文件的开始和结束块?,我试图弄清楚是否可以使用文件的inode来确定文件的LBA。
我的回答确定了我可以hdparm
用作查找LBA的一种方法:
$ sudo hdparm --fibmap afile
afile:
filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
byte_offset begin_LBA end_LBA sectors
0 282439184 282439191 8
但是我很好奇是否有某种方法使用文件的索引节点来获取LBA。不使用hdparm
。
我觉得可能是替代方法躲在工具filefrag
,stat
,debugfs
,和tune2fs
,但逗弄它是躲避我。
谁能想到替代方案?
到目前为止,我的一些研究可能对那些勇于尝试回答这一问题的人有用。
文件片段
我怀疑您可以使用该工具filefrag
来执行此操作,特别是使用其-e
开关的结果,也许是通过执行几次计算以达到我不太熟悉的程度。
样本输出
$ filefrag -e afile
Filesystem type is: ef53
File size of afile is 20 (1 block of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 0: 35304898.. 35304898: 1: eof
afile: 1 extent found
索引节点
我怀疑可能存在的另一种可能的方法是直接使用文件的inode信息,或者通过一些复杂的数学来使用这些信息,而这些数学却很少在互连网上记录。
例
首先,我们找出文件的索引节点。我们就可以利用这样做stat
的命令或ls -i
。
统计
$ stat afile
File: ‘afile’
Size: 20 Blocks: 8 IO Block: 4096 regular file
Device: fd02h/64770d Inode: 6560281 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ saml) Gid: ( 1000/ saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2013-12-27 18:40:12.788333778 -0500
Modify: 2013-12-27 18:40:23.103333073 -0500
Change: 2013-12-27 18:44:03.697317989 -0500
Birth: -
ls -i
$ ls -i
6560281 afile
有了inode信息,我们现在可以使用工具打开该文件所在的文件系统debugfs
。
注:要确定文件所在的文件系统,可以使用命令df <filename>
。
现在,如果我们运行debugfs
并运行命令,stat <inode #>
我们将获得包含该文件数据的扩展区列表。
$ sudo debugfs -R "stat <6560281>" /dev/mapper/fedora_greeneggs-home
debugfs 1.42.7 (21-Jan-2013)
Inode: 6560281 Type: regular Mode: 0664 Flags: 0x80000
Generation: 1999478298 Version: 0x00000000:00000001
User: 1000 Group: 1000 Size: 20
File ACL: 0 Directory ACL: 0
Links: 1 Blockcount: 8
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x52be10c3:a640e994 -- Fri Dec 27 18:44:03 2013
atime: 0x52be0fdc:bbf41348 -- Fri Dec 27 18:40:12 2013
mtime: 0x52be0fe7:18a2f344 -- Fri Dec 27 18:40:23 2013
crtime: 0x52be0dd8:64394b00 -- Fri Dec 27 18:31:36 2013
Size of extra inode fields: 28
Extended attributes stored in inode body:
selinux = "unconfined_u:object_r:user_home_t:s0\000" (37)
EXTENTS:
(0):35304898
现在我们有了上面的扩展信息,这是我迷路而又不知道如何进行的地方。
filefrag -b512 -v ..
说“ physical_offset:211787168..211795719”,这些等同于LBA吗?这似乎与hdparm --fibmap
211787168..211795719的文件相同。如果我放下-b512 -v
并使用def。1024,然后尝试换乘。通过8,26473396⋅8..26474464⋅8,我得到211787168..211795712,它接近但有点偏离。我在想第二个值应该是(26474465⋅8)-1 = 211795719,但不确定为什么。