emmc ファイル ブロック マッピングについて

emmc ファイル ブロック マッピングについて

ext4 ファイルシステム上のファイルの場所を正常に見つけました。たとえば、ファイル「cyclic.txt」の最初の 4k ブロックは 105441 です。しかし、emmc カードから直接読み取ると、最初の emmc ブロックはそこになく、5168904 に変更されています。emmc メモリ全体を検索して取得するだけですが、非常に時間がかかります。実際の場所を直接取得するにはどうすればよいですか? それを後のセキュア消去操作に使用できますか? どうもありがとうございます!!!

答え1

ext4 で使用されるブロック番号は、debugfs の「stat」コマンドまたは「filefrag -v」を使用して確認できる論理 4k ブロック番号です。つまり、パーティションの先頭を基準として 4k 単位になっています。

fdisk や gdisk などのプログラムを使用すると、512 バイトのセクターでパーティションが開始されます。

では、例を挙げてみましょう。/boot/vmlinuz-4.19.0-2-amd64 の場所を見つけたいとします。(コマンド「df /boot/vmlinuz-4.19.0-2-amd64」を使用すると、/boot ファイル システムとして /dev/nvme0n1p4 にあることがわかります。) 使用中の論理ブロック番号は、複数の方法で見つけることができます。

  • ファイルフラグ -v /boot/vmlinuz-4.19.0-2-amd64
  • debugfs -R "extents vmlinuz-4.19.0-2-amd64" /dev/nvme0n1p4
  • debugfs -R "stat vmlinuz-4.19.0-2-amd64" /dev/nvme0n1p4

これらのメカニズムのいずれを使用しても、ファイルがブロック番号 60416 ~ 61680 を使用していることがわかります。

/dev/nvme0n1p4 の先頭からの相対位置を確認するには、バイト オフセットが必要な場合はブロック番号を 4096 倍にし、512 バイト セクター単位で必要な場合はブロック番号を 8 倍にします。

デバイスの先頭からの相対位置を知りたい場合 (この場合は /dev/nvme0n1 など)、次のコマンドで検索できます。

  • cat /sys/block/nvme0n1/nvme0n1p4/start

または、gdisk コマンドを使用してパーティション テーブルを印刷することもできます。どちらの場合も、パーティション「p4」の開始位置が 512 バイト セクタ単位で表示されます。

最後の注意: Linux カーネルで使用される 512 セクター番号について話しているときに、LBA 番号と言う人が時々いますが、少し注意が必要です。ストレージ デバイスの観点から見ると、LBA は論理ブロック アドレスの略で、ストレージ デバイスが論理ブロック サイズと見なす単位です。歴史的に、ほとんどのデバイスでは、ほぼすべてのストレージ デバイスの論理ブロック デバイス サイズは 512 バイトでした。IBM メインフレーム DASD などの例外はありましたが、2048 バイトのセクター サイズでしたが、512 が実質的な標準でした。最新のストレージ デバイスには、たとえば 4k 論理ブロック サイズを使用する「高度なフォーマットの HDD」があり、CPU と HDD の間に SATA アナライザーを接続すると、I/O 要求が 4k LBA 番号単位で送信されていることがわかります。ただし、Linux カーネルは、ブロック デバイス レイヤーですべての番号が 512 バイト セクター単位であると想定しますが、デバイス ドライバー レベルではそうではない場合があります。私たちのほとんどは、作業台に SCSI や SATA バス アナライザを常備していないので、ホスト バス アダプタのデバイス ドライバをデバッグまたは作成しているのでなければ、この区別はそれほど重要ではないでしょう。したがって、512 バイト セクターを指すときに「LBA」という用語を使用しても、実際には害はありません。これは非常に一般的に行われており、Linux カーネルとそのユーザー空間ユーティリティの観点からのみ物事を心配する場合は害はありません。ただし、そのようなことについて細かいことを気にする人もいます。KB ではなく KiB を使用する必要があると指摘することで、自分が道徳的に優れていると信じたいタイプの人であれば、これで、うるさい細かいことを気にする別の方法がわかりました。 :-)

関連情報