Архив метки: hdd

Определение файла по LBA

Нашел замечательную статью, как определить файл, находящийся на определенном LBA. В основном это надо например, если на диске появились сбойные сектора и надо понять, где именно появились сбои, чтобы принять решение, спасать ли файлы немедленно или можно еще подождать. Статья применима к GNU\Linux файловым системам ext3\4, однако думаю общую идею можно развить и на другие файловые системы, если для них существуют соответствующие утилиты, позволяющие получить нужную информацию.

Суть состоит в следующем:

  1. Находим с помощью smartmontools LBA-адрес ошибки, что можно сделать с помощью длинного теста: smartctl -t long /dev/hdd и затем смотрим его лог smartctl -l selftest /dev/hdd
  2. Далее смотрим, с какого номера блока начинается интересующий нас раздел диска: fdisk -lu /dev/hdd
  3. Допустим это первый раздел, тогда определяем размер блока tune2fs -l /dev/hdd1 | grep Block
  4. Далее считаем номер блока, используя вот эту формулу: b = (int)(((L-S)*512)/B), где int — функция отбрасывания дробной части, оставшейся от деления, L — LBA-адрес, полученный ранее, S — начальный блок раздела, найденного в пункте 2, B — размер блока, найденный в пункте 3.
  5. Допустим, размер блока равен 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 при вычислении номера блока.

Вот собственно и все. Надеюсь, это кому-то поможет.