Чёрт его знает как это произошло. По-глупому в общем-то. Старею? Первый раз со мной такое за долгие годы.
Преамбула.Нужно было гибридный образ лежащий на usb-hdd /dev/sdc "положить" на usb-flash /dev/sdd.
Ну я его четырёхсотметровый и положил. На /dev/sdc.
Естественно бит-карта разделов накрылась медным тазом.
Собственно структура винчестера 500Gb проста.
20Gb FAT32 под MagOS
233Gb ext3 зеркала
233Gb ext3 всякой-всячины включая более 60Gb линуксовых игр и примочек, собиравшихся годами.
Остальное swap.
Первые неудачи.Из всего были взяты на вооружение:
testdisk
parted
gpart
Первые две вообще никаких разделов не нашли, включая режим глубокого сканирования.
Ничего, это значит совсем ничего. Никак.
gpart что-то показал после
gpart -vvif /dev/sdc
Но даже грубо по-памяти это совсем не соответствовало содержимому винчестера.
Все три утилиты в общей сложности отняли что-то около 9-10 часов. Полностью впустую.
Да собственно где-то третьим чувством уже знал, что результат будет нулевой.
Старая гвардия не стареет.Пока все три утилиты бодро чем-то по очереди занимались, вспомнилось, что где-то должен болтаться sysreport, и таки был найден, вспомнилась старая привычка генерировать его после изменения хотя бы одного раздела.
Собственно архив с выводами генерируется программой, которая входит в одноимённый пакет:
# apt-cache search system-report
system-report - Collect hardware infomation for developers
# rpm -ql system-report|grep bin
/usr/bin/system-report
Самым необходимым был:
# tar -jtf ./sysreport-20101130.tar.bz2 |grep fdisk
hardware/sysreport.fdisk
который и содержит самое важное и нужное:
# Tue Nov 30 03:03:32 EET 2010
# 'fdisk -l' output
Disk /dev/sda: 250.1 GB, 250059350016 bytes
<skip>
Disk /dev/sdb: 500.1 GB, 500107837440 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000cd275
Device Boot Start End Blocks Id System
/dev/sdb1 * 1 2611 20972826 c W95 FAT32 (LBA)
/dev/sdb2 2612 31642 233191507+ 83 Linux
/dev/sdb3 31643 60673 233191507+ 83 Linux
/dev/sdb4 60674 60801 1028160 82 Linux swap / Solaris
./sysreport.fdisk lines 1-31/31 (END)
Т.е. структуру винчестера:
Start/End - номера цилиндров, начальный и последний в пределах которых располагается (располагался :) )) раздел.
Вся штука в том, что бит-карта раздела располагается в начале каждого цилиндра с которого начинается раздел.
Дальнейшие действия донельзя тривиальны и понятны без комментариев, если поглядывать на вывод выше, т.е. номера цилиндров
(правда перед этим в cfdisk был удалён раздел с записью гибридного образа для воссоздания разделов, чтобы винчестер уж совсем был пуст, для первого раздела с MagOS это значения не имеет - он всё равно разрушен):
# fdisk /dev/sdc
Команда (m для справки): m
Действие команды
a переключение флага загрузки
b редактирование метки диска bsd
c переключение флага dos-совместимости
d удаление раздела
l список известных типов файловых систем
m вывод этого меню
n добавление нового раздела
o создание новой пустой таблицы разделов DOS
p вывод таблицы разделов
q выход без сохранения изменений
s создание новой чистой метки диска Sun
t изменение id системы раздела
u изменение единиц измерения экрана/содержимого
v проверка таблицы разделов
w запись таблицы разделов на диск и выход
x дополнительная функциональность (только для экспертов)
Команда (m для справки): u
Changing display/entry units to cylinders (DEPRECATED!)
Команда (m для справки): p
Disk /dev/sdc: 500.1 GB, 500107837440 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = цилиндры of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x5875182e
Устр-во Загр Начало Конец Блоки Id Система
Команда (m для справки): n
Действие команды
e расширенный
p основной раздел (1-4)
p
Номер раздела (1-4, по умолчанию 1): 1
Первый цилиндр (1-60801, по умолчанию 1): 1
Last цилиндр, +цилиндры or +size{K,M,G} (1-60801, по умолчанию 60801): 2611
Команда (m для справки): n
Действие команды
e расширенный
p основной раздел (1-4)
p
Номер раздела (1-4, по умолчанию 2): 2
Первый цилиндр (2612-60801, по умолчанию 2612): 2612
Last цилиндр, +цилиндры or +size{K,M,G} (2612-60801, по умолчанию 60801): 31642
Команда (m для справки): n
Действие команды
e расширенный
p основной раздел (1-4)
p
Номер раздела (1-4, по умолчанию 3): 3
Первый цилиндр (31643-60801, по умолчанию 31643): 31643
Last цилиндр, +цилиндры or +size{K,M,G} (31643-60801, по умолчанию 60801): 60673
Команда (m для справки): n
Действие команды
e расширенный
p основной раздел (1-4)
p
Выбранный раздел 4
Первый цилиндр (60674-60801, по умолчанию 60674): 60674
Last цилиндр, +цилиндры or +size{K,M,G} (60674-60801, по умолчанию 60801): 60801
Команда (m для справки): w
Таблица разделов была изменена!
Вызывается ioctl() для перечитывания таблицы разделов.
Синхронизируются диски.
В интерактивном режиме, units переключено командой 'u' в режим units=cylinders - сохранившаяся карта винчестера (вывод выше) в цилиндрах.
Обратите внимание:
Воссоздаём только границы/пределы разделов и более ничего не предпринимаем!
Собственно самый важный раздел из двух восстановленных:
# du -shx /media/Transcend2/*
182G /media/Transcend2/ALTLinux
642M /media/Transcend2/cdimage.debian.org
4,0K /media/Transcend2/Games
772M /media/Transcend2/live.debian.net
16K /media/Transcend2/lost+found
Thanks toЗа маленький, но поистине бесценный пакет:
# rpm -qi system-report|grep -i pack
Packager : Alexey Gladkov <legion@...>
Пара советов* Спокойствие, только спокойствие! Холодный трезвый анализ и отсутствие поспешных решений.
* Держать под руками программы и результат их работы после работы с разделами хранить от греха подальше - подальше положишь, поближе возьмёшь:
# system-report
# fdisk -l > file
* Предотвратить любые возможности внесения изменений для винчестера с разрушенными данными - поспешность и необдуманность может привести к необратимым последствиям.
Необязательная болтовняСобственно в столь серьёзных ситуациях, fdisk второй раз восстанавливает статус кво:
Первой была ситуация на чужом винчестере, когда накрылся идентификатор раздела, а с ним и раздел на котором лежала дипломная.
Вот всё, что хотелось сказать по-поводу маленькой, скромной, но очень полезной программы под shell.
Некоторое может быть излишнее дополнение.Всё-таки данные о винчестере(рах) лучше хранить в секторах:
# fdisk -lu /dev/sdX
u - units, дефолтно в секторах.
Но академически более правильно с жёстко и однозначно заданным units:
# fdisk -l -u=sectors /dev/sdX
Выбор юнитов (Cylinders/Sectors) возможен и в интерактивном режиме (клавиша 'u' в интерактивном режиме или 'm' - справка).
С учётом:
fdisk does not use DOS-compatible mode and cylinders as display units by default. The old deprecated DOS behavior can be enabled with the '-c=dos -u=cylinders' command-line options.
Но тогда здесь system-report напрашивается (?) на баг-трекер:
# cat /usr/bin/system-report |grep 'fdisk -l'
printf "# 'fdisk -l' output\n\n" >> "$r"
поскольку вывод будет в цилиндрах.
Т.е. выбор инструмента должен быть осознанным.
Выше описывалось на основе данных которые имелись.