Table of Contents

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)

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