User Tools

Site Tools


linux:debian:map-lba

This is an old revision of the document!


Map LBA to File

You might see something like this on your console / dmesg:

[  394.051961] end_request: I/O error, dev sda, sector 128999424
[  394.055674] Buffer I/O error on device sda3, logical block 8800768

In this situation you can use the following assumptions: * The bad sector / LBA is 128999424 (L) * The bad block is 8800768 in the filesystem on sda3 (b)

How to:

For this example, I'll be using the following information. The second line of the output above was not provided, we need to calculate the logical block offset first.

Bad LBA = 0x0a8ae67d = 176875133

Find out the partition

$ sudo fdisk -lu /dev/sda

Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders, total 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Disk identifier: 0x030818eb

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *          63      409662      204800   83  Linux
/dev/sda2          409663   168181822    83886080   83  Linux
/dev/sda3       168181823   172376126     2097152   82  Linux swap / Solaris
/dev/sda4       172376127   976768064   402195969   83  Linux

Therefore this LBA is on partition: /dev/sda4

Get block size of the partition

$ sudo tune2fs -l /dev/sda4 | grep Block
Block count:              100548992
Block size:               4096
Blocks per group:         32768

This partition has block size: 4096

Calculate the block

b = (int)(((L-S)*512)/B)

where:

  b = File System block number
  B = File system block size in bytes
  L = LBA of bad sector
  S = Starting sector of partition as shown by fdisk -lu

Denotes the integer part (round it DOWN to a whole number).

b = (int)((176875133-172376127) * 512 / 4096)
b = (int)562375.75
b = 562375

The block on this partition corresponding to this LBA is: 562375

Identify the file

Use debugfs to locate the inode stored in this block, and the file that contains that inode:

$ sudo debugfs

debugfs 1.41.9 (22-Aug-2009)
debugfs:  open /dev/sda4
debugfs:  testb 562375
Block 562375 marked in use
debugfs:  icheck 562375
Block   Inode number
562375  132344
debugfs:  ncheck 132344
Inode   Pathname
132344  /attie/banner.jpg
debugfs:  quit

Or if the block appears not in use anymore:

$ sudo debugfs
debugfs 1.41.9 (22-Aug-2009)
debugfs:  open /dev/sda4
debugfs:  testb 562375
Block 562375 not in use
debugfs:  quit
linux/debian/map-lba.1664605383.txt.gz ยท Last modified: by oscar