Как стать автором
Обновить
Флант
DevOps-as-a-Service, Kubernetes, обслуживание 24×7

Извлекаем файлы из образа повреждённого диска: ddrescue, losetup и немного магии

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров7.5K

Проблема повреждённых жёстких дисков знакома многим: диск начинает работать со сбоями, система зависает, файлы неожиданно исчезают. В таких ситуациях обычные методы восстановления могут только усугубить проблему, вызывая перезапись данных.

Лучшее решение — создать образ диска и работать с ним, а не с оригиналом. 

В этой статье разберём, как:

  • скопировать весь диск в файл-образ;

  • смонтировать повреждённый раздел и извлечь файлы;

  • восстановить удалённые файлы или повреждённую файловую систему NTFS.

Сначала рассмотрим основные шаги, а затем сложности, которые могут возникнуть в процессе, и пути их решения. 

Шаг 1. Создаём образ диска с утилитой ddrescue

Если диск «умирает», в первую очередь стоит создать его образ. Попытки работы с диском напрямую могут только ухудшить ситуацию. 

Обычно для создания копии диска рекомендуют утилиту dd. Однако она работает по принципу «всё или ничего»: если диск содержит повреждённые секторы, dd может зависнуть. 

Утилита ddrescue эффективнее. Она:

  • пропускает битые блоки и продолжает копирование;

  • создаёт карту повреждений (mapfile), позволяя продолжить процесс при сбоях;

  • позволяет объединять копии дисков, например из двух разных попыток.

Мы будем использовать именно ddrescue. 

Создание образа

Сначала определим имя диска (/dev/sdX):

~ $ lsblk

Теперь создадим образ:

~ $ sudo ddrescue -d /dev/sdX image.img mapfile

Параметры команды:

  • /dev/sdX — оригинальный диск;

  • image.img — файл, куда будет сохраняться образ;

  • mapfile — файл — контрольная карта битых секторов (позволяет перезапустить процесс создания образа, не начиная заново).

Как узнать, сколько данных удалось восстановить?

Во время работы ddrescue показывает:

  • количество прочитанных и пропущенных секторов;

  • скорость копирования;

  • сколько раз пытались перечитать повреждённые блоки.

Шаг 2. Анализ содержимого образа

Теперь у нас есть образ image.img, но что внутри?

Определяем разметку и таблицу разделов:

~ $ sudo parted image.img unit B print

Вывод может выглядеть так:

Model:  (file)
Disk image.img: 500107862016B
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number  Start        End             Size           File system  Name  Flags
 1      1048576B     2097151B        1048576B       fat32
 2      2097152B     105906175B      103809024B     ext4
 3      105906176B   500107861375B   499001955200B  ntfs

Из вывода видно следующее:

  • Partition Table: gpt (разметка GPT).

  • Третий раздел sda3 (NTFS), он нам и нужен.

  • Раздел начинается с 105906176B.

Как определить, какой раздел нужен

Смотрим на тип файловой системы. 

  • Если восстанавливаем файлы с Windows-раздела, ищем NTFS.

  • Если работаем с Linux-разделом, нас интересуют ext4, ext3, xfs и т. д.

  • Если ищем загрузочный раздел, он часто бывает FAT32 (например, EFI-раздел).

Альтернативные методы анализа образа:

~ $ fdisk -l image.img
~ $ sfdisk -d image.img

Шаг 3. Подключаем и монтируем образ

Теперь нам нужно получить доступ к нужному разделу. Для этого создадим в Linux эмулятор диска, который откроет доступ ко всем разделам.

Использование losetup

Создаём loop-устройство для работы с образом. Это виртуальное устройство, которое позволяет работать с образом диска так, как будто это обычный физический диск. Для его создания используется команда losetup:

~ $ sudo losetup -Pf --show image.img

Вывод:

/dev/loop0

Теперь разделы отображаются как /dev/loop0p1, /dev/loop0p2, /dev/loop0p3.

Утилита losetup входит в состав пакета util-linux. Ключ -P, который появился в версии 2.21, позволяет автоматически сканировать и добавлять разделы при подключении loop-устройства. 

Для проверки версии использовать команду:

~ $ losetup --version
losetup from util-linux 2.37.2

Если у вас старый losetup, без -P, можно использовать kpartx:

~ $ sudo kpartx -a image.img
~ $ ls /dev/mapper/

Монтирование нужного раздела: sda3, NTFS

Теперь создадим точку монтирования:

~ $ sudo mkdir -p /mnt/recovery

Монтируем раздел /dev/loop0p3:

~ $ sudo mount -o ro,uid=$(id -u),gid=$(id -g) /dev/loop0p3 /mnt/recovery

Флаги uid и gid позволяют работать с файлами не только root-пользователю, но и обычному пользователю.

Если файловая система была повреждена, монтирование может не пройти. Тогда стоит использовать другие методы, о которых рассказано дальше в статье.

Шаг 4. Извлечение файлов

Теперь файлы доступны в /mnt/recovery. Можно их копировать:

~ $ cp -r /mnt/recovery/имя_папки ~/backup/

Если требуется копирование с сохранением структуры и прав:

~ $ rsync -av /mnt/recovery/ ~/backup/

Для архивации:

~ $ tar czvf backup.tar.gz -C /mnt/recovery 

Шаг 5. Завершение работы

После копирования данных нужно отключить loop-устройство:

~ $ sudo umount /mnt/recovery
~ $ sudo losetup -d /dev/loop0

Что делать с ошибкой device is busy

Используйте fuser для поиска процессов, которые удерживают монтирование:

~ $ sudo fuser -vm /mnt/recovery

Затем завершите их с помощью команды:

kill -9 PID

На этом с основными шагами мы закончили. Переходим к сложностям, с которыми вы можете столкнуться в процессе, и вариантам их решения. 

Что делать, если NTFS-раздел не монтируется

Если NTFS-раздел повреждён, стандартный драйвер может отказать в монтировании. Используем вместо него ntfs-3g.

Принудительное монтирование NTFS

Если стандартная команда mount -t ntfs не сработала, попробуйте отключить стандартный драйвер и явно указать ntfs-3g:

~ $ sudo mount -t ntfs-3g /dev/loop0p3 /mnt/recovery

Восстановление файловой системы с ntfsfix

Если получаете ошибку «NTFS is inconsistent», «$MFTMirr does not match $MFT» или «The disk contains an unclean file system», переходите к исправлению. Исправить повреждённый NTFS-раздел можно с помощью ntfsfix.

Попробуйте выполнить команду:

~ $ sudo ntfsfix /dev/loop0p3

Что делает ntfsfix?

  • Очищает «грязный флаг» (dirty bit), который может помешать монтированию.

  • Исправляет основные ошибки файловой системы.

  • Устанавливает флаг проверки chkdsk, чтобы Windows могла корректно восстановить раздел при следующей загрузке.

ntfsfix не заменяет полноценный chkdsk в Windows, но в 80 % случаев позволяет примонтировать раздел.

Если ничего не помогло — использовать chkdsk в Windows

Если даже ntfsfix не решает проблему, лучше загрузиться в Windows и выполнить chkdsk:

~ $ chkdsk /f /r D:

Здесь D: — это буква повреждённого раздела, у вас она может быть другой.

Восстановление удалённых файлов c TestDisk и PhotoRec

При возникновении ситуации, когда файлы были удалены, следует перемонтировать диск в режиме только для чтения (RO). Это позволит избежать перезаписи данных. Если это системный диск, рекомендуется загрузиться с флешки и тоже примонтировать его в RO. 

В данном случае диск не будет затёрт новыми данными, и восстановить удалённые данные можно с помощью TestDisk или PhotoRec. Обе утилиты бесплатны и работают с различными файловыми системами. 

Восстановление файловой структуры с TestDisk

Утилиту TestDisk стоит использовать: 

  • если раздел стал «нечитаемым», но структура файлов осталась;

  • если диск или флешка требуют форматирования после сбоя, но файлы ещё существуют.

Разберём пошаговые действия для восстановления файлов.

1. Установите TestDisk, если его нет:

~ $ sudo apt install testdisk  # Для Debian/Ubuntu.
~ $ sudo yum install testdisk  # Для CentOS.

2. Запустите TestDisk:

~ $ sudo testdisk image.img

Как теперь восстановить файлы?

  1. Выберите диск (image.img) → Proceed.

  2. Выберите Intel (MBR) или EFI/GPT.

  3. Выберите Analyze, нажмите p, чтобы увидеть файлы.

    • Если файлы видны, выберите Write, чтобы восстановить повреждённую файловую таблицу.

    • Если не видны — используйте утилиту PhotoRec. 

  4. Перезагрузите систему и попробуйте снова смонтировать раздел.

Восстановление отдельных файлов с PhotoRec

Утилиту PhotoRec стоит использовать: 

  • если файлы удалены и не видны в TestDisk;

  • если файловая система повреждена, а файлы нужны по сигнатурам (типам файлов).

Шаги мало чем отличаются от описанных выше.

  1. Установите PhotoRec — она идёт в комплекте с TestDisk. 

  2. Запустите утилиту:

~ $ sudo photorec image.img

Как восстановить файлы?

  1. Выберите диск.

  2. Укажите, с какого раздела искать файлы.

  3. Выберите, какие типы файлов восстанавливать (JPG, DOC, PDF).

  4. Укажите папку для сохранения данных.

  5. Запустите поиск.

Восстановленные файлы появятся в указанной директории.

Использование ntfs-3g при работе с NTFS

Если NTFS-раздел повреждён (например, из-за сбоя диска или неправильного отключения), стандартный драйвер NTFS в ядре Linux (ntfs) может не монтировать его вообще или смонтировать в режиме «только для чтения» с ошибками.

Однако ntfs-3g более гибкий и умеет:

  • принудительно монтировать «грязные» NTFS-разделы;

  • работать с повреждёнными MFT (Master File Table);

  • исправлять ошибки файловой системы с помощью ntfsfix.

Вот как установить этот драйвер и получить полноценную поддержку NTFS:

~ $ sudo apt install ntfs-3g  # Debian/Ubuntu
~ $ sudo yum install ntfs-3g  # CentOS
~ $ sudo pacman -S ntfs-3g  # Arch

Альтернативные методы эмуляции: qemu-nbd

Если losetup не работает, можно эмулировать физический диск с помощью qemu-nbd. Это утилита, которая использует сетевые блочные устройства (NBD) для работы с образами дисков:

~ $ sudo modprobe nbd
~ $ sudo qemu-nbd --connect=/dev/nbd0 image.img
~ $ lsblk
~ $ sudo mount -o ro /dev/nbd0p3 /mnt/recovery

Отключение:

~ $ sudo qemu-nbd --disconnect /dev/nbd0

Заключение

Основные выводы:

  • Не работайте напрямую с повреждённым диском.

  • Создавайте образ прежде, чем пытаться восстанавливать данные.

  • Используйте losetup, TestDisk, PhotoRec для восстановления.

P. S.

Читайте также в нашем блоге: 

Теги:
Хабы:
Всего голосов 28: ↑28 и ↓0+35
Комментарии22

Публикации

Информация

Сайт
flant.ru
Дата регистрации
Дата основания
Численность
201–500 человек
Местоположение
Россия
Представитель
Александр Лукьянов