Command-Line
我使用什麼命令來查看文件系統中文件的開始和結束塊?
是否有任何命令可以輸出文件系統中任何文件的開始和結束塊號?
hdparm
我不是 100% 確定這就是你要找的東西,但我相信你可以使用 command 來做到這一點
hdparm
,特別是使用它的--fibmap
開關。摘抄
--fibmap When used, this must be the only option given. It requires a file path as a parameter, and will print out a list of the block extents (sector ranges) occupied by that file on disk. Sector numbers are given as absolute LBA numbers, referenced from sector 0 of the physical device rather than from the partition or filesystem. This information can then be used for a variety of purposes, such as examining the degree of fragmenation of larger files, or determining appropriate sectors to deliberately corrupt during fault-injection testing procedures. This option uses the new FIEMAP (file extent map) ioctl() when available, and falls back to the older FIBMAP (file block map) ioctl() otherwise. Note that FIBMAP suffers from a 32-bit block-number interface, and thus not work beyond 8TB or 16TB. FIBMAP is also very slow, and does not deal well with preallocated uncommitted extents in ext4/xfs filesystems, unless a sync() is done before using this option.
例子
假設我們有一個範例文件。
$ echo "this is a test file" > afile
現在當我們執行
hdparm
.$ 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
文件碎片
找出文件的開始和結束塊的另一種好方法是
filefrag
. 不過,您需要使用適當的開關來獲得所需的輸出。這個工具的一個優點hdparm
是任何使用者都可以執行它,所以sudo
不需要。您需要使用該-b512
開關,以便輸出以 512 字節塊的形式顯示。我們還需要告訴我們filefrag
要冗長。例子
$ filefrag -b512 -v afile Filesystem type is: ef53 File size of afile is 20 (8 block of 512 bytes) ext: logical_offset: physical_offset: length: expected: flags: 0: 0.. 7: 282439184.. 282439191: 8: eof afile: 1 extent found
調試文件
獲取文件 LBA 的第三種方法是使用
debugfs
. 這種方法需要一點數學知識,但我認為重要的是展示如何從debugfs
LBA 報告的範圍值轉換為那些可能好奇的人。因此,讓我們從文件的 inode 開始。
$ ls -i afile 6560281 afile
**注意:**我們也可以在其中使用文件名,
debugfs
但在此展示中,我將使用 inode 代替。現在讓我們
stat
通過debugfs
我們的 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: 0x52bff8a1:a9f08020 -- Sun Dec 29 05:25:37 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
重要資訊位於範圍部分。這些實際上是這個 inode 正在使用的文件系統塊。我們只需要將它們轉換為 LBA。我們可以通過以下等式做到這一點。
**注意:**假設我們的文件系統使用 4k 塊大小並且底層硬體使用 512 字節單元,我們需要將 exents 乘以 8。
beginning LBA = (BEGIN EXTENT) * 8 ending LBA = (((ENDING EXTENT) + 1) * 8) - 1
例子
所以在我們的範例中,我們的開始和結束範圍是相同的,因為我們的文件適合單個範圍。
beginning LBA = 35304898 * 8 = 282439184 ending LBA = ((35304898 + 1) * 8) - 1 = 282439191
所以我們的 LBA 是 282439184..282439191。
參考