Неправильная команда dd на основном диске — как восстановить данные?

Неправильная команда dd на основном диске — как восстановить данные?

Ладно, случилось нечто раздражающе глупое. Я хотел скопировать ISO-файл Arch Linux на свой USB-флешку, но торопился и случайно ввел в качестве параметра свой основной диск of.

Вот подробности:

$ sudo dd bs=4MB if=archlinux-2017.08.01-x86_64.iso of=/dev/nvme1n1

/dev/nvme1n1должно было /dev/sdb.

Мой основной диск /dev/nvme1n1содержал два раздела:

  • Один загрузочный раздел EFI размером 512 МБ
  • Один раздел ext4, охватывающий всю оставшуюся часть диска объемом 1 ТБ

Размер файла archlinux-2017.08.01-x86_64.isoсоставляет 541065216 байт, или516 МБ

Компьютер все еще работает и, кажется, работает нормально, и у меня есть вывод lsblkиdf -h довыполнение ddкоманды. Вывод:точно так жекак когда я запускаю команды сейчас. Я предполагаю, потому что данные кэшируются:

$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
nvme1n1     259:5    0 931.5G  0 disk 
├─nvme1n1p1 259:6    0   512M  0 part /boot
└─nvme1n1p2 259:7    0   931G  0 part /

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme1n1p2  916G   22G  848G   3% /
/dev/nvme1n1p1  511M   36M  476M   7% /boot

ls /bootпо-прежнему печатает содержимое каталога (вероятно, кэшированную информацию), но содержимое файла повреждено и работает ls /boot/EFI, или ls /boot/loaderзаполняет экран случайными символами, включая множество Input/output error.

Вот еще немного информации:

$ cat /proc/partitions
major minor  #blocks  name

 259        5  976762584 nvme1n1
 259        6     524288 nvme1n1p1
 259        7  976237255 nvme1n1p2

$ sudo fdisk -l /dev/nvme1n1
Disk /dev/nvme1n1: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x282bad86

Device         Boot Start     End Sectors  Size Id Type
/dev/nvme1n1p1 *        0 1056767 1056768  516M  0 Empty
/dev/nvme1n1p2        164  131235  131072   64M ef EFI (FAT-12/16/32)

Глядя на вывод fdisk, становится совершенно ясно, что таблица разделов (и, вероятно, все данные на загрузочном разделе) были уничтожены. Это должен быть gptтип disklabel, а размеры/типы разделов неверны. К сожалению, из-за размера файла ISO (516 МБ) он также перезаписал первые 4 МБ моего корневого раздела.

Немного другой вывод gdisk:

$ sudo gdisk /dev/nvme1n1

# selected GPT when asked "Found valid MBR and GPT. Which do you want to use?"

Command (? for help): p
Disk /dev/nvme1n1: 1953525168 sectors, 931.5 GiB
Model: Samsung SSD 960 EVO 1TB                 
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): <guid>
Partition table holds up to 248 entries
Main partition table begins at sector 2 and ends at sector 63
First usable sector is 64, last usable sector is 1056704
Partitions will be aligned on 8-sector boundaries
Total free space is 1 sectors (512 bytes)

Number  Start (sector)    End (sector)  Size       Code  Name
   2             164          131235   64.0 MiB    0700  ISOHybrid1

Вот несколько связанных вопросов, которые я нашел:

Я уже установил testdiskутилиту, которая выглядит многообещающе, но я хочу убедиться, что выполняю правильные шаги.пока компьютер все еще работает. Если я его сейчас выключу, он больше не загрузится, поэтому вот вопросы:

  • Каков наилучший способ выхода из этой ситуации?
  • Как восстановить таблицу разделов в прежнем виде и как заново создать раздел /boot? Я использую Arch Linux с последним ядром.
  • Есть ли способ узнать, что содержалось (и было уничтожено?) в первых 4 МБ моего корневого раздела?

EDIT: Добавляю сюда больше информации и подробностей на основе предложения @WumpusQ.Wumbley выполнить команду dumpe2fs.

Базовый вывод (первые 50 строк) dumpe2fs:https://pastebin.com/fBuFRQfE

На мой взгляд, все выглядит вполне нормально, даже магическое число файловой системы ( 0xEF53) верно.

Далее следует Group 0:

Group 0: (Blocks 0-32767) csum 0x9569 [ITABLE_ZEROED]
  Primary superblock at 0, Group descriptors at 1-117
  Reserved GDT blocks at 118-1141
  Block bitmap at 1142 (+1142)
  Inode bitmap at 1158 (+1158)
  Inode table at 1174-1685 (+1174)
  21349 free blocks, 8177 free inodes, 2 directories, 8177 unused inodes
  Free blocks: 11419-32767
  Free inodes: 16-8192

За которой следует МНОГО групп, которые говорят [...]8192 free inodes, 0 directories, 8192 unused inodes [...]Первая группа, которая действительно сообщает о некоторых каталогах, появилась только Group 3648, или примерно через 25 000 строк:

Group 3648: (Blocks 119537664-119570431) csum 0xa9ea [ITABLE_ZEROED]
  Block bitmap at 119537664 (+0)
  Inode bitmap at 119537680 (+16)
  Inode table at 119537696-119538207 (+32)
  23930 free blocks, 1670 free inodes, 614 directories, 1670 unused inodes
  Free blocks: 119546502-119570431
  Free inodes: 29890939-29892608

В файловой системе имеется множество резервных суперблоков:

$ sudo dumpe2fs /dev/nvme1n1p2 | grep -i superblock | wc -l
dumpe2fs 1.43.5 (04-Aug-2017)
19

решение1

Я предполагаю, что таблицу разделов и загрузочный раздел можно легко воссоздать, поэтому сосредоточусь на разделе ext4.

Макет файловой системы в некоторой степени зависит от опций, используемых при ее создании. Я опишу общий случай. Вы можете увидеть, соответствует ли это вашему, запустив его dumpe2fsна устройстве (которое, как мы надеемся, найдет все метаданные верхнего уровня в кэше, а не будет считываться с диска).

Обычный размер блока для файловых систем ext4 составляет 4096 байт, поэтому вы потеряли 1024 блока.

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

Затем идут битовые карты блоков и битовые карты инодов. Вот тут новости начинают становиться немного хуже. Если какие-либо из них находятся ниже блока 1024, что, скорее всего, так и есть, вы потеряли информацию о том, какие иноды и блоки используются. Эта информация избыточна и будет восстановлена ​​fsck на основе того, что он найдет, пройдя по всем каталогам и инодам, если они не повреждены.

Но следующая вещь — таблица инодов, и здесь вы, вероятно, потеряли много инодов, включая корневой каталог, журнал и другие специальные иноды. Было бы неплохо вернуть их. Очевидно, что корневой каталог по крайней мере все еще функционирует, иначе почти все команды, которые вы пытаетесь запустить, уже терпели неудачу.

Если вы запустите dd if=/dev/nvme1n1p2 of=/some/external/device bs=4096 count=1024сейчас, вы получите резервную копию всего, что находится в вашем кэше в данный момент, смешанную с плохими данными для блоков, которые не кэшированы. Затем, после загрузки диска восстановления, вы можете сделать то же самое ddв обратном порядке, чтобы вернуть эти частично хорошие данные на диск, перезаписав все плохие вещи, которые там сейчас.

После этого вы можете обнаружить, что автоматизированные инструменты восстановления ( fsck, testdisk) работают достаточно хорошо. Если нет, у вас есть карта, которую вы можете использовать для помощи в ручном восстановлении. Используя списки "свободных блоков" из dumpe2fs, вы знаете, какие блоки следует игнорировать.

Большая часть того, что вы потеряли, вероятно, это inodes. На самом деле, вполне вероятно, что у вас не было файласодержаниев первых 4 МБ диска. (Я запустил mkfs.ext4без параметров на файле образа размером 1 ТБ, и первым блоком, не содержащим метаданных, оказался блок 9249)

Каждый инод, который вам удастся восстановить, будет идентифицировать блоки данных целого файла. И эти блоки данных могут быть расположены по всему диску, не обязательно поблизости.

День 2

Дамп, размещенный на pastebin, раскрывает отличные новости:

Group 0: (Blocks 0-32767) csum 0x9569 [ITABLE_ZEROED]
  Primary superblock at 0, Group descriptors at 1-117
  Reserved GDT blocks at 118-1141
  Block bitmap at 1142 (+1142)
  Inode bitmap at 1158 (+1158)
  Inode table at 1174-1685 (+1174)
  21349 free blocks, 8177 free inodes, 2 directories, 8177 unused inodes
  Free blocks: 11419-32767
  Free inodes: 16-8192

Поскольку мы думаем, что перезаписано только 4 МБ в начале файловой системы, нам нужно беспокоиться только о блоках 0-1023. А зарезервированные блоки GDT идут до самого блока 1141! Это тот тип повреждений, который должен быть исправлен простым e2fsck -b $backup_superblock_number(после перезагрузки). Вы можете хотя бы попробовать это с помощью , -nчтобы посмотреть, что он думает.

решение2

Если диск использовал GPT, таблица разделов должна быть восстановлена ​​с помощью резервной копии данных GPT в конце диска. Вы можете сделать это с помощью gdisk; см.документация gdiskпо восстановлению данныхдля подробностей. Вкратце: Когда вы запускаете gdiskна диске, он будетвероятнообратите внимание на повреждение и спросите, хотите ли вы использовать резервные данные GPT или данные MBR. Если вы выберете опцию GPT и затем запишете изменения, таблица разделов будет исправлена. Если gdiskне спрашивает, какую таблицу разделов использовать, вы все равно сможете загрузить резервную таблицу с помощью cопции в меню восстановления и преобразования.

Если это не удается, вы все равно можете пересоздать таблицу разделов (или, по крайней мере, начальные и конечные точки разделов), используя данные в файлах /sys/block/nvme1n1/nvme1n1p1/startи /sys/block/nvme1n1/nvme1n1p1/size(и аналогично для /dev/nvme1n1p2). Если вы прибегаете к этим данным, то крайне важно, чтобы выНЕТвыключите компьютер, вопреки тому, что советовал hek2mgl. Тем не менее, hek2mgl не ошибается, что продолжение использования диска в его текущем состоянии рискует ухудшить ситуацию. В целом, я бы сказал, что лучшим компромиссом будет попытаться исправить проблему с таблицей разделов как можно быстрее, а затем выключить и исправить проблему с файловой системой с аварийного диска.

К сожалению, ваш ESP поджарен. Учитывая разметку вашего диска, я предполагаю, что вы смонтировали ESP в /bootи сохранили свои ядра там. Таким образом, вам нужно будет переустановить пакеты ядра с помощью chrootили каким-то другим способом. То же самое касается вашего загрузчика или менеджера загрузки.

решение3

  1. Выключите компьютер (немедленно)
  2. Загрузите его с помощью системы восстановления.
  3. Запустите testdisk, чтобы попытаться восстановить данные. (Если у вас достаточно места, возьмите образ с устройства ddи запустите его testdiskна этом образе)

Почему вы должны немедленно выключить компьютер? Если будет создан новый файл (что-то в /run, вероятно) или добавлен в (/var/log/...), то файловая система должна просмотреть существующую (плохую!) информацию, чтобы решить, где хранить данные. Когда это решение принимается на основе плохой информации, высок риск того, что существующие блоки данных будут перезаписаны. Это делает их потерянными навсегда. Даже для таких инструментов, как testdiskи photorec.

Связанный контент