Строка в выводе lsblk, где ещё вчера значился раздел с терабайтами архивов, исчезла. На её месте теперь неразмеченное пространство, а вместе с разделом пропали точки монтирования, базы и вечерние дампы. Первый порыв у большинства инженеров одинаков: пересоздать раздел с теми же параметрами, смонтировать и жить дальше. Именно этот порыв чаще всего и портит файлы, которые до него были почти целы. Утилита testdisk восстанавливает не файлы, а саму запись о разделе в таблице, и при аккуратной работе не пишет ни байта в области данных соседних томов. Ниже реальная процедура: от резервной копии разметки до проверки списка файлов перед записью таблицы, с разбором типичных ошибок.

Раздел исчезает из таблицы но файлы остаются на месте

Таблица разделов живёт в первых секторах диска и по размеру скромна до смешного. В классической разметке MBR на каждую запись отводится 16 байт, четыре первичных записи умещаются в 64 байта, а в конце сектора стоит сигнатура 55AA. В GPT запись занимает 128 байт, по умолчанию их 128, и лежат они в секторах со второго по тридцать третий, а резервная копия таблицы хранится в конце диска. Удаление раздела в fdisk, gdisk или графическом gparted меняет только эти байты. Сами файлы, каталоги и метаданные остаются на своих местах, пока их место не займёт новая запись.

Отсюда главное правило: после обнаружения пропажи на диск нельзя писать. Каждая новая порция данных повышает шанс, что освободившееся место будет перекрыто. Задачи с записью останавливаются, соседние разделы отмонтируются, и по возможности вся работа ведётся из живого дистрибутива, загруженного с флешки. Система, которая стоит на пострадавшем диске, тоже запишет что-нибудь в свои журналы, поэтому живой носитель это не перестраховка, а способ заморозить картину.

Причины пропажи обычно банальны. Неточная команда fdisk не на том устройстве, прерванное изменение размеров в gparted, восстановление копии таблицы не туда, невнимательность в установщике операционной системы, редкий сбой при записи в область таблицы. Железо в большинстве случаев ни при чём, и это лучшая новость в плохой день.

Отдельно стоит помнить про диски с GPT: у них в нулевом секторе лежит защитный MBR, и часть старых утилит видит устройство целиком как один раздел неизвестного типа. Отсюда классическая ошибка диагностики: программа показывает неразмеченный диск, хотя полноценная таблица жива в секторах дальше. Прежде чем что-либо восстанавливать, стоит посмотреть на диск двумя инструментами, lsblk и parted, и сравнить картину. Если parted видит таблицу, а lsblk нет, проблема глубже случайного удаления, и речь уже о повреждении самих секторов с таблицей.

Подготовка диска и резервная копия текущей разметки

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

  1. прекратить любые записи на диск и отмонтировать разделы которые ещё видны;
  2. зафиксировать текущее состояние командами lsblk -f и blkid в текстовый файл;
  3. снять копию таблицы утилитой sfdisk --dump в файл на другом носителе;
  4. для диска с MBR сохранить первые 512 байт командой dd в отдельный образ;
  5. при ошибках ввода-вывода в dmesg сначала снять полную копию диска ddrescue;
  6. запускать testdisk из живого дистрибутива а не из системы на этом же диске.

Команды резервного копирования выполняются за секунды:

sudo sfdisk --dump /dev/sda > /root/sda-table-backup.txt
sudo dd if=/dev/sda of=/root/mbr-copy.bin bs=512 count=1

Для GPT удобна утилита sgdisk из пакета gdisk:

sudo sgdisk -b /root/sda-gpt-backup.bak /dev/sda

Копии хранятся на другом носителе или на машине администратора. Если dmesg показывает ошибки ввода-вывода, план меняется: сначала побитовая копия утилитой ddrescue на исправный диск, и уже с копии ведётся поиск. testdisk умеет работать с файлом-образом как с диском, так что сама процедура восстановления от этого не меняется. Разница в том, что при ошибках на живом носителе каждая попытка чтения способна ухудшить состояние поверхности.

Если копия sfdisk снималась до пропажи и свежая, план А выглядит иначе: разметка возвращается из файла одной командой, и testdisk не нужен вовсе:

sudo sfdisk /dev/sda < /root/sda-table-backup.txt

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

Пошаговая процедура в testdisk от выбора диска до анализа Quick Search

Утилита распространяется свободно, работает в Linux, Windows и macOS, интерфейс у неё консольный, из меню по стрелкам, и это единственный экран, который придётся освоить. Запуск требует прав суперпользователя, иначе списка устройств не будет:

sudo testdisk

Первый экран предлагает создать журнал сессии testdisk.log в рабочем каталоге, и с этим стоит согласиться: журнал пригодится, если что-то пойдёт не по плану. Дальше выбирается устройство, и внимание на размер в списке: он должен совпадать с ожидаемым, особенно когда в сервере стоит несколько накопителей одной модели. Ошибиться здесь означает искать разделы на соседнем диске.

Третий экран спрашивает тип разметки. Программа обычно сама подставляет верное значение в квадратных скобках, [Intel] для классической MBR или [EFI GPT] для современной разметки, и автодетект оставляют как есть. Подтверждать смену геометрии, если утилита предлагает параметры цилиндров и головок, не нужно: значения по умолчанию в почти всех случаях корректны.

Основной маршрут выглядит как Analyse и затем Quick Search. Поиск опирается на сигнатуры файловых систем и заголовки логических разделов, занимает от пары секунд на SSD до десятков минут на больших HDD, и прерывать его не стоит. По завершении на экране появляется список найденных разделов с колонкой признаков: P для первичного, L для логического, звёздочка для загрузочного. Рядом с живыми записями размещаются кандидаты на возврат, и дальше начинается проверка, ради которой всё затевалось.

Проверка найденного перед записью новой таблицы разделов

Самый ответственный момент наступает до записи, а не после. Список из Quick Search сверяется с зафиксированным ранее выводом lsblk: каждый существующий раздел обязан сохранить ту же стартовую позицию и размер в секторах. Расхождение хотя бы по одному живому разделу означает, что найденная структура не соответствует текущей, и писать её нельзя ни при каком давлении сроков.

Содержимое кандидата проверяется прямо из testdisk: курсор на найденный раздел, клавиша P открывает список файлов и каталогов. Просмотр ничего не изменяет на диске, это чистое чтение. Если в списке знакомая структура и файлы с прежними именами, перед вами настоящий раздел, а не след прошлой разметки. Выход из списка по клавише q возвращает к таблице.

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

Проверка проще всего запоминается на числах. Пусть на диске было три раздела, и второй пропал после неудачного редактирования. До инцидента вывод lsblk запечатлел начало и конец каждого раздела в секторах. После Quick Search кандидат обязан показать те же стартовые позиции, что в зафиксированном файле. Совпали числа, а одно отличается на десяток секторов? Это не совпадение, это чужая запись, и писать её нельзя. Таблица не терпит приблизительности: раздел либо стоит на своих секторах, либо это уже другой раздел.

Клавиши со стрелками меняют статус записи: раздел помечается как первичный, логический или исключается из таблицы. Когда раскладка сошлась с реальностью, выбирается Write. Механизм у кнопки честный: перезаписываются только секторы с таблицей, области данных соседних томов не затрагиваются. После записи программа предлагает перезагрузку, и ядро при старте прочитает новую разметку. Без перезагрузки иногда спасает partprobe, но при живой системе надёжнее перезапустить машину. Для GPT после загрузки стоит открыть диск в gdisk: утилита сама предупредит, если основная и резервная копии таблицы разошлись, и предложит исправить.

Глубокий поиск Deeper Search для сложных случаев со старыми следами

Когда Quick Search не находит раздел или находит заведомо не тот, в дело идёт Deeper Search. Утилита сканирует всю поверхность в поисках сигнатур файловых систем и поднимает разделы, у которых уцелели только метаданные внутри области данных. На многотерабайтных накопителях это часы работы, зато выкапываются разделы после многократных переразметок, неудачных изменений размеров и частичной перезаписи начала диска. Старые разделы времён MBR, начинавшиеся с 63 сектора, и современные, выровненные по сектору 2048, находятся одинаково.

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

Утилита понимает распространённые файловые системы: NTFS, FAT и exFAT, ext2, ext3 и ext4, btrfs с ограничениями, HFS+, XFS. Если цель лишь вытащить файлы без возврата раздела, соседняя PhotoRec из того же комплекта собирает файлы по сигнатурам, но это уже крайний случай с потерей структуры каталогов.

На практике после записи таблицы требуется ещё раз собрать стек над разделом. Для LVM это vgscan и затем vgchange -ay, для массивов mdadm это mdadm --assemble --scan, для шифрованного тома luksOpen из cryptsetup. Запись о разделе для них просто вход, дальше каждый слой поднимается своими инструментами.

Бывает, что раздел вернулся, а файловая система на нём выглядит повреждённой, если эксперименты затронули начало области данных. У ext2, ext3 и ext4 резервные копии суперблока хранятся в известных местах, и e2fsck умеет работать с ними. Список позиций выводится командой mke2fs с флагом -n, которая ничего не пишет на диск, а затем проверка запускается с указанием нужной копии:

sudo mke2fs -n /dev/sda3
sudo e2fsck -b 32768 /dev/sda3

Число 32768 это стандартная позиция первой резервной копии на томе с обычной геометрией, точное значение подскажет вывод первой команды.

Типичные ошибки при восстановлении и правила безопасности

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

После успешной записи раздел монтируется только для чтения:

sudo mount -o ro /dev/sda3 /mnt/check
sudo fsck -n /dev/sda3

Проверка fsck с флагом -n ничего не меняет на диске и честно докладывает о найденных несоответствиях. Критичные файлы копируются на другой носитель немедленно, и лишь затем раздел возвращается в штатную работу с записью.

Нюанс для SSD: команда TRIM сообщает накопителю, что блоки удалённого раздела можно чистить в фоновом режиме, и возврат отдельных файлов на твердотельных дисках даёт худшие результаты, чем на старых HDD. Таблица разделов при этом не страдает: testdisk правит метаданные, а не содержимое разделов, и восстановление записи на SSD проходит так же надёжно. Ограничение TRIM накрывает только сценарий, когда раздел удалён давно, а вытащить хочется файлы внутри него. Чем меньше времени прошло с пропажи, тем выше шансы, и первая реакция на инцидент это остановка записи, а не запуск утилит.

Убедиться, что ядро приняло новую разметку, помогает dmesg: строки вида "sda: sda1 sda2 sda3" подтверждают, что таблица прочитана. Файл testdisk.log и сделанная в начале копия sfdisk остаются в архиве: при любом странном поведении накопителя они позволяют восстановить ход мысли и сравнить разметку до и после. Восстановление таблицы это операция на метаданных, и при аккуратном подходе соседние тома даже не заметят, что рядом с ними что-то происходило.