Ладно, случилось нечто раздражающе глупое. Я хотел скопировать 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
Вот несколько связанных вопросов, которые я нашел:
- https://askubuntu.com/questions/94421/есть-способ-восстановить-файлы-с-устройства-хранения-частично-перезаписанных-с
- Случайно перезаписал не тот диск с помощью dd, как восстановить?
Я уже установил 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
- Выключите компьютер (немедленно)
- Загрузите его с помощью системы восстановления.
- Запустите
testdisk
, чтобы попытаться восстановить данные. (Если у вас достаточно места, возьмите образ с устройстваdd
и запустите егоtestdisk
на этом образе)
Почему вы должны немедленно выключить компьютер? Если будет создан новый файл (что-то в /run, вероятно) или добавлен в (/var/log/...), то файловая система должна просмотреть существующую (плохую!) информацию, чтобы решить, где хранить данные. Когда это решение принимается на основе плохой информации, высок риск того, что существующие блоки данных будут перезаписаны. Это делает их потерянными навсегда. Даже для таких инструментов, как testdisk
и photorec
.