4

Ладно, случилось что-то досадно глупое. Я хотел скопировать 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 , а размеры / типы разделов неверны. К сожалению, из-за размера файла 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 МБ моего корневого раздела?

РЕДАКТИРОВАТЬ: Добавление дополнительной информации и деталей здесь на основе предложения @ 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

3 ответа3

3

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

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

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

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

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

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

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

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

Большая часть того, что вы потеряли, это, вероятно, иноды. На самом деле вполне вероятно, что у вас не было содержимого файла на первых 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 чтобы увидеть, что он думает.

1

Если на диске используется 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 или другие средства. То же самое для вашего загрузчика или менеджера загрузки.

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .