Нашел замечательную статью, как определить файл, находящийся на определенном LBA. В основном это надо например, если на диске появились сбойные сектора и надо понять, где именно появились сбои, чтобы принять решение, спасать ли файлы немедленно или можно еще подождать. Статья применима к GNU\Linux файловым системам ext3\4, однако думаю общую идею можно развить и на другие файловые системы, если для них существуют соответствующие утилиты, позволяющие получить нужную информацию.
Суть состоит в следующем:
- Находим с помощью smartmontools LBA-адрес ошибки, что можно сделать с помощью длинного теста:
smartctl -t long /dev/hdd
и затем смотрим его логsmartctl -l selftest /dev/hdd
- Далее смотрим, с какого номера блока начинается интересующий нас раздел диска:
fdisk -lu /dev/hdd
- Допустим это первый раздел, тогда определяем размер блока
tune2fs -l /dev/hdd1 | grep Block
- Далее считаем номер блока, используя вот эту формулу:
b = (int)(((L-S)*512)/B)
, где int — функция отбрасывания дробной части, оставшейся от деления, L — LBA-адрес, полученный ранее, S — начальный блок раздела, найденного в пункте 2, B — размер блока, найденный в пункте 3. -
Допустим, размер блока равен b = 562375, тогда с помощью утилиты debugfs можно определить нужный файл:
$ sudo debugfs debugfs 1.41.9 (22-Aug-2009)
debugfs: open /dev/hdd1
debugfs: testb 562375
Block 562375 marked in use
debugfs: icheck 562375
Block Inode number
562375 132344
debugfs: ncheck 132344
Inode Pathname
132344 /home/user/banner.jpg
debugfs: quit
UPD. 10.2017
Вышеприведенный рецепт работает только для «обычных» разделов. В случае применения надстроек типа LVM и Software-RAID данные файловой системы располагаются не с начала раздела, а где скажет эта надстройка. Так например для разделов mdraid необходимо выяснить т.н. Data Offset:
mdadm -E /dev/hdd1 | grep Data
Data Offset : 262144 sectors
Указанное количество секторов нужно прибавлять к началу раздела hdd1 при вычислении номера блока.
Вот собственно и все. Надеюсь, это кому-то поможет.