Command-Line

我使用什麼命令來查看文件系統中文件的開始和結束塊?

  • April 29, 2021

是否有任何命令可以輸出文件系統中任何文件的開始和結束塊號?

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. 這種方法需要一點數學知識,但我認為重要的是展示如何從debugfsLBA 報告的範圍值轉換為那些可能好奇的人。

因此,讓我們從文件的 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。

參考

引用自:https://unix.stackexchange.com/questions/106802