Map LBA to File

From Attie's Wiki
Jump to: navigation, search

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

http://smartmontools.sourceforge.net/badblockhowto.html

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

Bad LBA = 0x0a8ae67d = 176875133

Find out some stuff

$ 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
Partition 1 does not end on cylinder boundary.
/dev/sda2          409663   168181822    83886080   83  Linux
/dev/sda3       168181823   172376126     2097152   82  Linux swap / Solaris
/dev/sda4       172376127   976768064   402195969   83  Linux

therefore it's on /dev/sda4, which is mounted on /home (ext4)

$ sudo tune2fs -l /dev/sda4 | grep Block
Block count:              100548992
Block size:               4096
Blocks per group:         32768
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
(int) denotes the integer part (round it DOWN to a whole number).
b = (int)((176875133-172376127) * 512 / 4096)
b = (int)562375.75
b = 562375


$ sudo debugfs
debugfs 1.41.9 (22-Aug-2009)
debugfs:  open /dev/sda4
debugfs:  testb 562375
Block 562375 not in use
debugfs:  quit

** OR **

$ 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
^C
debugfs:  quit
Personal tools
Namespaces

Variants
Actions
Navigation
Toolbox