iノードを使用してファイルのLBAの範囲を確認するにはどうすればよいですか?


9

タイトル付きのこのU&L質問に答えている間:ファイルシステム内のファイルの開始ブロックと終了ブロックを表示するには、どのコマンドを使用しますか?、私はそれがそのinodeを使用してファイルのLBAを決定することが可能であるかどうかを理解しようとしました。

私の答えhdparmは、LBAを見つけるための1つの方法として使用できると判断しました。

$ 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も取得するためにファイルのiノードを使用する方法があるかどうか、私は興味を持っていました。使用せずにhdparm

私はそこのツールの中に隠れて代替の方法かもしれないと思うfilefragstatdebugfs、およびtune2fsそれをからかって私を逃亡されます。

誰かが代替案を考えることができますか?


これまでの私の研究のいくつかは、これに答えようとする勇敢な人々に役立つかもしれません。

filefrag

ツール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

iノード

可能性があると私が思う別の潜在的な方法は、ファイルのiノード情報を直接使用するか、またはWeb間で十分に文書化されていないいくつかの複雑な計算を通して使用することです。

まず、ファイルのiノードを見つけます。statコマンドまたはを使用してこれを行うことができますls -i

stat

$ 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

iノード情報を入手したら、ツールを使用して、このファイルが存在するファイルシステムを開くことができます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

これで上記のエクステント情報が得られました。ここで迷子になり、続行方法がわかりません。

参考文献

回答:


5

filefragdebugfsファイルシステムブロックの数で表されたオフセットを報告します。

512バイト単位の数でオフセットを取得するには、512バイト単位でブロックのサイズを乗算する必要があります。ext4 FSでは、ブロックサイズは多くの場合4kであるため、8を掛ける必要があります。

ではfilefrag-b 512オプションを使用してオフセットを512バイト単位で取得することもできます。

statsコマンドdebugfsまたはGNU statを使用してブロックサイズを取得できます。

stat -fc%s /mount/point

(またはそのファイルシステム内の任意のファイル)。

これhdparmはハードディスクユーティリティであることに注意してください。ファイルシステムがマウントされているブロックデバイスとは対照的に、ディスク内にオフセットを提供しようとします(ブロックデバイスがディスクに常駐していると想定)。これは、パーティション(/sys/class/block/the-block-device/start実際のオフセットに内容を追加することによる)、およびmd RAID 1デバイスに対してのみ機能しますが、デバイスマッパーデバイス、他のRAIDレベル、dmraidデバイス、ループ、nbdなどのディスクバックアップブロックデバイスタイプでは機能しません。 ..また、古いバージョンのhdparmFIBMAP ioctlは、使用できるブロックデバイスに制限されていましたが、新しいバージョンではFIEMAPを使用していますfilefrag

たとえば、ext2ファイルシステムがにある場合などです/dev/sda1

# hdparm --fibmap /file/in/there
/file/in/there:
 filesystem blocksize 1024, begins at LBA 2048; assuming 512 byte sectors.
 byte_offset  begin_LBA    end_LBA    sectors
           0     109766     109767          2

これらの2つのセクターを取得できます(ただし、ファイルはその一部のみを使用している可能性があります)。

dd skip=109766 count=2 if=/dev/sda # not /dev/sda1

ながら、filefragまたはdebugfs。

# filefrag -v /file/in/there
Filesystem type is: ef53
Filesystem cylinder groups is approximately 12
File size of /file/in/there is 87 (1 block, blocksize 1024)
 ext logical physical expected length flags
   0       0    53859               1 merged,eof

実際のブロックデバイスから取得します。

dd bs=1024 skip=53859 count=1 if=/dev/sda1

それで、私があなたを正しく理解している場合、filefrag -b512 -v ..「physical_offset:211787168 .. 211795719」と表示されている場合、これらはLBAに相当しますか?これはhdparm --fibmap、211787168..211795719 と同じファイルで動作するようです。私がドロップして-b512 -v、defを使用する場合。1024、そしてマルチしようとします。8によって26473396⋅8..264744648,8になると、211787168..211795712になります。これは近いですが少しずれています。2番目の値は(26474465⋅8)-1 = 211795719になるはずですが、理由はわかりません。
slm

debugfsから512ユニットのブロックを取得する方法についての考えはありますか?
slm

上記と同じ計算を使用して、エクステントからLBAに変換する計算を実行しました。
slm

2

エクステントからLBAへの変換は、数値がどこから来ているのかを理解すれば、実際にはかなり簡単です。@StephaneChazelasの回答は、この理解を得るために重要でした。

元のdebugfs出力

質問で言及された次の例を使用します。

$ 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

エクステント情報を使用して、次の計算を実行できます。しかし、もう1つの情報が必要です。基本となるファイルシステムのブロックサイズ。このコマンドを使用して取得できます。

ブロックサイズ

$ sudo tune2fs -l /dev/mapper/fedora_greeneggs-home | grep "Block size"
Block size:               4096

エクステントからLBAへの変換

したがって、ここで認識すべき重要な変換は、LBAが512バイト単位であり、debugfsエクステント数を報告した上記のコマンドが4096バイトブロックで報告していることです。

つまり、4096/512 = 8です。したがって、エクステントに8を掛けて、LBA値に変換する必要があります。

したがって、次の数学は私たちに最初のLBAを与えます:

$ calc -d
; 35304898 * 8
    282439184
; 

それで、私たちの終わりのLBAは何ですか?そのためには、inodeが単一のブロック内に収まることを認識する必要があるため、その終了範囲は開始範囲と同じです。終了LBAを計算するには、この方程式を使用できます。

ending LBA = ( (extent + 1) * 8 ) - 1

したがって、この計算を実行します:

$ calc -d
; ( (35304898 + 1) * 8 ) - 1
    282439191

結果を確認する

元のhdparm出力を見る:

 byte_offset  begin_LBA    end_LBA    sectors
           0  282439184  282439191          8

物事が一致していることがわかります。

もう一つの例

2つ目の例として、ここに大きなファイルがあることを確認します。

$ ls -i util-linux-2.19.tar.bz2 
6559005 util-linux-2.19.tar.bz2

次にiノードのエクステントを示します。

$ sudo debugfs -R "stat <6559005>" /dev/mapper/fedora_greeneggs-home
...
EXTENTS:
(0-1068):26473396-26474464

今度はエクステントからLBAへの変換を行います。

$ calc -d
; 26473396*8
    211787168
; (26474464+1)*8 - 1
    211795719

そして確認します。

$ sudo hdparm --fibmap util-linux-2.19.tar.bz2 
...
 byte_offset  begin_LBA    end_LBA    sectors
           0  211787168  211795719       8552

そしてまたマッチします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.