MBR, разделы и загрузчики

ru
Software FAQ MBR О себе Лос-Аламос

MBR, разделы и загрузчики

Введение

Это первая версия FAQ'а.
Красным цветом выделены самые последние изменения, а синим -- остальные.
Большую роль в подготовке этого FAQ'а сыграл [user=anCHORiTe], спасибо ему за вопросы, советы и другую полезную информацию.
Здесь будут рассмотрены некоторые вопросы, касающиеся MBR, разделов жесткого диска и загрузчиков Windows и Linux. Большая часть из написанного основывается на личном опыте и опыте других форумчан.
В некоторых местах шестнадцатиричные числа выделены жирным цифром, а в некоторых местах они никак не выделяются :) Не смотря на то, что BIOS это система, и она женского рода, я все же буду использовать мужской род, так как это привычнее.

Общая теория о разделах

Жесткий диск можно представить как один длинный массив из секторов. Один сектор это 512 байт, сектора нумеруются с нуля. Нулевой сектор еще называют MBR (Master Boot Record). Раздел это несколько подряд идущих секторов, раздел можно описать двумя числами: номером первого сектора (или сдвигом в секторах относительно начала диска) и количеством секторов в разделе. Разделы бывают либо основными (primary), либо логическими (logical). Разделы также можно делить по типу на обычные и расширенные (extended). Будем называть первый сектор раздела boot-сектором, хотя по смыслу это не всегда так. Основных разделов на диске может быть не больше четырех. Информация о каждом основном разделе записывается в MBR, информация о логических разделах записывается в boot-секторах расширенных разделов. Аналогичное ограничение: расширенный раздел может нести информацию максимум о четырех логических разделах. В обоих случаях эта информация всегда хранится в конце boot-сектора, начиная с 446-го байта. Для каждого раздела отводится блок по 16 байт. После четырех блоков еще остается два байта -- подпись, она должна быть (55 AA). Внутри 16-байтного блока первый байт отвечает флагу bootable у раздела (об этом подробнее в части про загрузчики), потом 3 байта -- CHS-адрес начала раздела(про CHS будет рассказано дальше), 5-й байт -- тип раздела, еще три байта -- CHS-адрес конца раздела, следующие четыре байта -- сдвиг начала раздела, последние четыре байта -- длина раздела. Самое сложное, это понять от чего отсчитывается сдвиг начала раздела. Для обычных и основных разделов он отсчитывается с того сектора, в котором и записана эта информация. Для расширенных логических разделов отсчет похоже идет от начала основного расширенного раздела, "внутри" которого они находятся. Если суть последнего предложения не ясна, то в этом нет ничего страшного, может потом станет яснее на примерах ;)
Итак, отсчет идет от MBR (от сектора с номером 0) для всех основных (primary) разделов, как для обычных, так и для расширенного, и только для основных. Все обычные логические (not extended logical) разделы задаются сдвигом относительно начала того расширенного раздела, в котором они описаны. Все расширенные логические (extended logical) разделы задаются сдвигом относительно начала основного расширенного раздела (extended primary).
Внутри одного расширенного раздела может быть описание другого расширенного, что позволяет строить цепочки расширенных разделов произвольной длины. Вы можете также попробовать сделать цикл, если хотите проверить свою операционную систему на вшивость :grin:
Рассмотрим MBR моего винчестера:
0000000: 33 c0 8e d0 bc 00 7c fb 50 07 50 1f fc be 1b 7c
0000010: bf 1b 06 50 57 b9 e5 01 f3 a4 cb bd be 07 b1 04
0000020: 38 6e 00 7c 09 75 13 83 c5 10 e2 f4 cd 18 8b f5
0000030: 83 c6 10 49 74 19 38 2c 74 f6 a0 b5 07 b4 07 8b
0000040: f0 ac 3c 00 74 fc bb 07 00 b4 0e cd 10 eb f2 88
0000050: 4e 10 e8 46 00 73 2a fe 46 10 80 7e 04 0b 74 0b
0000060: 80 7e 04 0c 74 05 a0 b6 07 75 d2 80 46 02 06 83
0000070: 46 08 06 83 56 0a 00 e8 21 00 73 05 a0 b6 07 eb
0000080: bc 81 3e fe 7d 55 aa 74 0b 80 7e 10 00 74 c8 a0
0000090: b7 07 eb a9 8b fc 1e 57 8b f5 cb bf 05 00 8a 56
00000a0: 00 b4 08 cd 13 72 23 8a c1 24 3f 98 8a de 8a fc
00000b0: 43 f7 e3 8b d1 86 d6 b1 06 d2 ee 42 f7 e2 39 56
00000c0: 0a 77 23 72 05 39 46 08 73 1c b8 01 02 bb 00 7c
00000d0: 8b 4e 02 8b 56 00 cd 13 73 51 4f 74 4e 32 e4 8a
00000e0: 56 00 cd 13 eb e4 8a 56 00 60 bb aa 55 b4 41 cd
00000f0: 13 72 36 81 fb 55 aa 75 30 f6 c1 01 74 2b 61 60
0000100: 6a 00 6a 00 ff 76 0a ff 76 08 6a 00 68 00 7c 6a
0000110: 01 6a 10 b4 42 8b f4 cd 13 61 61 73 0e 4f 74 0b
0000120: 32 e4 8a 56 00 cd 13 eb d6 61 f9 c3 49 6e 76 61
0000130: 6c 69 64 20 70 61 72 74 69 74 69 6f 6e 20 74 61
0000140: 62 6c 65 00 45 72 72 6f 72 20 6c 6f 61 64 69 6e
0000150: 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74
0000160: 65 6d 00 4d 69 73 73 69 6e 67 20 6f 70 65 72 61
0000170: 74 69 6e 67 20 73 79 73 74 65 6d 00 00 00 00 00
0000180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00001a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00001b0: 00 00 00 00 00 2c 44 63 2e 69 2e 69 00 00 00 01
00001c0: 01 00 07 34 ff ff 3f 00 00 00 c1 25 8c 02 80 00
00001d0: c1 ff 83 34 ff ff 00 26 8c 02 00 13 46 01 00 00
00001e0: c1 ff 07 34 ff ff 00 39 d2 03 00 13 46 01 00 00
00001f0: c1 ff 0f 34 ff ff 00 4c 18 05 55 2b e4 01 55 aa
В нем указаны все четыре основных раздела, рассмотрим отдельно 16-байтный блок первого раздела:
00001be: 00 01 01 00 07 34 ff ff 3f 00 00 00 c1 25 8c 02
Он не активный или, говоря иначе, не bootable (первый байт 00, а для bootable должно быть 80), далее три байта пропустим, в них записан CHS-адрес начала раздела. Следующий байт -- тип раздела, 07 -- NTFS. Список типов можно узнать с помощью fdisk/sfdisk. Отмечу лишь, что типы 05, 0f и 85 соответствуют расширенным разделам. Далее смещение начала раздела -- 0x0000003f (заметьте, что мы переставили байты в четверке в другом порядке), и длина -- 0x028c25c1. В приведенном MBR четвертый раздел --расширенный и он начинается с сектора номер 0x05184c00=85478400, у меня этот сектор почти весь нулевой, ненулевая только подпись в конце (55 AA) и таблица разделов:
00001be: 00 00 00 00 83 00 00 00 ef 67 e3 01 66 c3 00 00
00001ce: 00 00 00 00 05 00 00 00 01 00 00 00 01 00 00 00
00001de: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00001ee: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Здесь указаны два логических раздела: нормальный (тип 83 -- Linux) и расширенный. Смещение первого считается относительно начала текущего сектора, а смещение второго относительно начала основного расширенного раздела. В этом случае это одно и то же, но это уже будет не так, если перейдем в сектор, где начинается наш новый логический расширенный раздел. Начинается он в секторе номер 85478400+1=85478401. В нем также почти везде нули, выделим лишь таблицу разделов:
00001be: 00 00 00 00 0b 00 00 00 3e 00 00 00 c1 6a ae 01
00001ce: 00 00 00 00 05 00 00 00 00 6b ae 01 01 00 00 00
00001de: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00001ee: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Первый раздел типа FAT32, его сдвиг -- 0x0000003e=62, и считается он относительно текущего сектора, то есть реально раздел начинается с сектора номер 85478401+62=85478463. Второй раздел -- расширенный, его сдвиг -- 0x01ae6b00=28207872, но его сдвиг считается от сектора 85478400, так как этот раздел расширенный. То есть его первый сектор имеет номер 85478400+28207872=113686272, и именно там мы должны снова искать таблицу разделов.
В приведенных примерах размеры расширенных разделов равны 1 сектору. Это результат лично моих ручных действий над таблицей разделов. Обычно разбивалки выставляют длину раздела либо до самого конца основного расширенного (extended primary) раздела, либо до конца обычного раздела, указанного в таблице разделов. В первом случае получается, что в основном расширенном разделе лежит обычный и расширенный занимает оставшуюся часть, в нем опять один обычный и один расширенный. В итоге мы имеем что-то вроде матрешки. Во втором случае получим, что основной расширенный раздел "разбит" на много маленьких расширенных, в каждом из которых один обычный и ссылка на следующий расширенный раздел. У меня сейчас нет возможности проверить, какой из подходов используется различными разбивалками, так что любая информация по этому поводу может быть полезна.

Что такое C/H/S?

Под C/H/S можно понимать две вещи: геометрию диска или адрес сектора. В обоих случаях это тройка чисел. Пусть (C,H,S) будет означать геометрию, а (c,h,s) -- адрес. В адресе значения c и h отсчитываются с нуля, а s с единицы. Общая формула перевода такого адреса в номер сектора похоже следующая: n = (H*c + h)*S + (s-1). А размер диска в таком случае равен C*H*S секторов. Подобная адресация используется BIOS'ом на самом низком уровне и была необходима раньше, когда винчестеру надо было конкретно указывать местоположение сектора на диске (номер головки, номер дорожки, и номер сектора на дорожке). И значения C/H/S соответствовали реальной "геометрии" диска. Например C=614, H=4, S=17. В таком винчестере могло быть два "блина", а информация могла храниться на двух сторонах, то есть всего было 4 головки у винчестера. На каждой стороне было 614 дорожек, а на каждой дорожке хранилось 17 секторов. Общая емкость такого диска будет 614*4*17*512 байт = 21 377 024 байт (~20 Mb). Не удивляйтесь, если обнаружите, что у вашего винчестера H=255. Это еще не значит, что в нем 127 с половиной блинов :o Современные винчестеры имеют большие объемы, и они куда более интелектуальнее своих предков. Им можно сразу отдавать номер сектора, и они его сами найдут. Но для совместимости они должны поддерживать и CHS-адресацию. Трансляция этого адреса в нормальный адрес происходит уже внутри винчестера. Чтобы BIOS мог адресовать таким образом как можно больше секторов, то часто делают значения H и S максимальными: H=255, S=63. Максимум чего сможет добиться BIOS в этом случае, это 1023*255*63 секторов или чуть меньше 8 гигабайт.
В большинстве случаев операционным системам все равно, что указывается в CHS-адресах начала и конца разделов, но это может быть иногда критично для загрузчика MBR, поэтому я стараюсь их сохранять для основных разделов, и совсем не обращаю на них внимания при работе с логическими.

Стандарты

Здесь собраны некоторые наблюдения, которые возможно является некоторого рода стандартами для разметки дисков, но на практике многие из них могут быть нарушены. По возможности пытайтесь их придерживаться, так как это может быть критично для DOS'а, и для программ типа Partition Magic.

Выравнивание

Начало раздела должно начинаться на первом секторе в дорожке, то есть в CHS-адресе s=1, Конец раздела должен заканчиваться на последнем секторе дорожки (s=S). Более того часто стараются начало выранивать еще и по головкам диска, то есть (h=0 или h=1, если сектор с h=0 занят MBR или началом расширенного раздела), и конец также выравнивают по головкам (h=H-1). Почти всегда основные разделы, кроме первого, и расширенные разделы начинаются с h=0, а все нормальные логические и первый основной с h=1. В Windows XP и Linux все равно, выполняется ли условие выравнивания. Обычные разделы не должны пересекаться между собой, каждый обычный логический раздел должен лежать целиком внутри расширенного раздела, в котором он описан. Внутри таблицы разделов разделы должны перечисляться в нормальном порядке. Почти ничего из этого никак не влияет на работу Windows XP и Linux, даже пересекающиеся разделы. Единственное, что вырубает Windows еще во время загрузки, так это два раздела, начинающихся с одного и того же сектора, Linux при этом работает отлично.

Дерево логических разделов

Все логические разделы можно представить в виде дерева, где родитель -- расширенный радел, в котором хранится информация о текущем разделе, а сыновья есть только у расширенных разделов. Листья -- нормальные разделы. Корень -- основной расширенный раздел. По "стандартам" расширенным может быть только один основной раздел. Если их будет хотя бы два, то Windows скорее всего упадет с синим экраном еще при загрузке, Linux обработает их нормально, но GRUB сможет увидеть только логические разделы первого основного расширенного диска, второй расширенный он просто игнорирует. Поэтому все таки лучше иметь только один расширенный раздел. Как правило в расширенном разделе указывают из четырех возможных разделов не больше двух: один обычный и, возможно, еще один расширенный (следующий в цепочке). То есть дерево можно представить как одну длинную ветку, в каждом узле которой по одному листу. У меня нет подтверждения работы Windows XP, с развлетвленным деревом разделов, однако Linux похоже справляется.

Нумерация разделов

В общем случае при рекурсивном обходе дерева логических разделов их можно просто перенумеровать. Основные разделы нумеруют отдельно. Как правило логические расширенные разделы не учитывают, и вообще доступ пользователя к ним скрыт. В Windows также пропускают основной расширенный раздел, а в Linux его учитывают. После этого в списке сначала идут основные разделы, а потом логические. В Linux логические разделы всегда начинаются с номера 5 независимо от количества основных. В Linux есть ограничение на максимальный номер раздела, это 63 для /dev/hd* и всего 15 для /dev/sd*, хотя при этом fdisk видит до 60 разделов, а sfdisk до 128. В Windows подобное ограничение мне не известно, но оно не меньше 118 :D

MBR, GRUB, ntloader и пр. загрузчики

Теперь рассмотрим процесс загрузки операционной системы. При включении компьютера управление процессором получает BIOS, и если он астроен на загрузку (boot) с винчестера, то он подгружает в оперативную память компьютера первый сектор диска (MBR) и передает управление ему. Фактически MBR можно считать очень маленькой программкой. В MBR может быть записан как "стандартный" загрузчик, так и загрузчики типа LILO/GRUB. Сначала я расскажу, что я знаю про стандартный загрузчик. Похоже он просто находит в таблице основных разделов первый раздел с флагом bootable, считывает его первый сектор (boot-сектор) и передает управление коду, записанному в этом boot-секторе. Если вместо стандартного загрузчика MBR стоит другой, то скорее всего он не смотрит на флаг bootable и не передает управление другим boot-секторам.

Windows NT

Сюда относятся Windows'ы типа Windows NT/2k/XP/2003. Сюда не входят Windows Vista и Windows 95/98. В boot-секторе записывается код, загружающий с текущего раздела в память основной загрузчик (ntloader). Для каждой файловой системы FAT16/FAT32/NTFS используется свой загрузчик. В корне раздела обязательно должен присутствовать файл ntldr. Если вы видете при попытке загрузить Windows сообщение "NTLDR is missing", то это как раз тот случай, когда файл ntldr отсутствует. Также для нормальной работы ntldr возможно нужны файлы bootfont.bin, ntbootdd.sys, ntdetect.com и правильно написанный boot.ini.

boot.ini

Пример файла boot.ini:
C:\boot.ini
[boot loader]
timeout=8
default=C:\gentoo.bin
[operating systems]
C:\gentoo.bin="Gentoo Linux"
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows XP (32-bit)" /fastdetect /NoExecute=OptIn
multi(0)disk(0)rdisk(0)partition(3)\WINDOWS="Windows XP (64-bit)" /fastdetect /usepmtimer
В секции [operating systems] перечислены описания операционных систем в виде destination="title" options, где destination имеет вид multi(x)disk(y)rdisk(z)partition(p)\folder для Windows NT/XP/2003 и X:\file для других систем. title -- название системы в меню выбора, options для Windows NT/XP/2003 -- дополнительные опции для загрузки. В секции [boot loader] указывается таймаут (timeout=seconds) и система по умолчанию (default=destination). Если система по умолчанию указана неправильно, то похоже ntloader пытается загрузить Windows из папки WINDOWS текущего раздела. За дополнительной информацией обращайтесь к справке Windows по ключевому слову "boot.ini". Сам по себе ntloader умеет загружать только Windows NT/XP/2003, поэтому для других систем указывается файл, в котором записан код, загружающий другую систему. Если имя файла опущено, то по умолчанию берется bootsect.dos. Как правило в качестве такого кода используют образ boot-сектора раздела, в который установлена другая операционная система.

Загрузка Linux с помощью ntloader'а

Как уже было сказано ntloader сам не может загрузить Linux, для этого все равно придется использовать LILO или GRUB. Предположим, что ntloader у вас расположен на C: или /dev/hda1, и этот раздел примонтирован в /mnt/win_c, а раздел /dev/hda2 у вас линуксовый, и вы используете GRUB. Устанавливаем загрузчик GRUB'а в boot-сектор /dev/hda2
# grub-install /dev/hda2
После чего сохраняем образ boot-сектора в C:\bootsect.lin
# dd bs=512 count=1 if=/dev/hda2 of=/mnt/win_c/bootsect.lin
Добавляем cтрочку в C:\boot.ini
C:\bootsect.lin="Linux"
Вообще говоря, теперь можно даже стереть загрузчик из boot-сектора /dev/hda2, он останется в образе C:\bootsect.lin и будет загружаться с помощью ntloader'а.

Linux (GRUB)

Так как у меня под рукой нет LILO, то опишу только GRUB. Дополнения к ФАКу всячески приветствуются. GRUB как правило состоит из двух частей: stage1 (512 байт) и stage2 (несколько десятков килобайт). stage1 прописывается в boot-сектор, а stage2 обычно копируют в /boot/grub. В stage1 прописан адрес сектора, в котором находятся первые 512 байт файла stage2, stage1 подгружает этот сектор в память и передает управление ему. Он в свою очередь подгружает остальную часть файла stage2 в память, для этого в конце первых 512 байт записан список секторов, где лежит остальная часть. Такая сложная схема обусловлена маленьким количеством свободного места для загрузчика внутри MBR/boot-сектора. После загрузки stage2 читает конфигурационный файл (по умолчанию /boot/grub/menu.lst из раздела, в котором лежит stage2). Однако на самом деле stage2 может находиться в любом месте диска, и даже не принадлежать ни одному разделу. Его конфигурационный файл может называться как-угодно и лежать на любом разделе с любой файловой системой, которая доступна для stage2 (зависит от версии GRUB'а). Скорее всего FAT будет доступен, а NTFS нет. На самом деле он даже может и не существовать как файл ни в одной файловой системе и не принадлежать ни одному разделу, но это уже на очень большого любителя :) Даже если возникнут проблемы с загрузкой конфигурационного файла, то у вас всегда остается возможность загрузить Linux с помощью встроеннго мини-шелла.
Так как stage1 GRUB'а использует прерывания BIOS'а для чтения секторов, то могут возникнуть проблемы при попытке загрузить stage2, если он лежит достаточно далеко от начала диска. GRUB поддерживает и CHS-адресацию и LBA. В некоторых BIOS используется только 28-битная адресация в режиме LBA, в таком случае для stage1 (и любого аналогичного загрузчика типа стандартного MBR, LILO, ntloader) будут доступны только первые 128Гб, или даже меньше, если загрузчик не дружит с LBA. Это говорит о том, что вторая часть, которая подгружается этим миниатюрным кодом, должна находиться в начале диска. Если вы установили Linux, и никак не можете заставить его загружаться, проверьте, умеет ли ваш BIOS адресовать с помощью CHS или LBA то место на винчестере, в котором находится /boot/grub вашего Linux. Если есть возможность, то вынесите /boot отдельно в самое начало диска, для уверенности, что он сможет загрузиться.
После того, как stage2 будет загружен, он похоже все равно использует прерывания BIOS для доступа к секторам, а значит ядра и конфигурационные файлы GRUB'а должны находится в пределах границы адресации BIOS.

menu.lst

Пример файла /boot/grub/menu.lst
menu.lst
default 0
timeout 8

title Windows
chainloader  (hd0,0)+1

title Gentoo Linux
kernel (hd0,4)/kernel-current root=/dev/hda2
Формат файла достаточно сложный, чтобы здесь его описывать, тем более он достаточно хорошо документирован (info grub) и есть прокомментированные примеры в /usr/share/doc/grub-.../. Здесь лишь показан самый примитивный случай. Для загрузки Linux нужно использовать команду kernel, указав ей где находится ядро и дополнительные параметры (/usr/src/linux/Documentation/kernel-parameters.txt). Главное разобраться с тем, как GRUB называет разделы. Как правило соответствие следующее: /dev/hda -- (hd0), /dev/hdaX -- (hd0,X-1). В данном примере указано ядро /kernel-current на разделе /dev/hda5, а в параметрах сказано, что корневая файловая система находится на /dev/hda2.

Загрузка Windows с помощью GRUB'а

Для загрузки других операционных систем используется подход аналогичный ntloader'у. chainloader file подгружает файл file и передает управление ему. Однако в случае GRUB'а не придется париться с образами boot-секторов, так как вместо имени файла можно явно указать список секторов: (hd0,0)0+1, здесь (hd0,0) означает раздел, 0 -- смещение от начала раздела, 1 -- количество секторов. 0 часто опускают. Поэтому если у вас в /dev/hda1 установлен загрузчик Windows NT/XP/2003, то просто добавьте следующие строчки в файл menu.lst
title Windows XP
chainloader  (hd0,0)+1

Инструменты

Windows

Описана лишь малая часть софта под эту платформу, а именно то, что я когда использовал или использую сейчас. Дополнения приветствуются.

fixmbr, fixboot

Скажу честно, не пользовался ими очень давно, поэтому следующая информация может быть неточной или даже неверной, поправьте меня обязательно. fixmbr и fixboot доступны из консоли востановления Windows. Смысл fixmbr -- найти и исправить ошибки в MBR, перед запуском рекомендую сделать резервную копию MBR. fixboot должна пометить раздел как bootable, прописать загрузчик ntloader'а в boot-сектор раздела, скопировать на раздел необходимые файлы, сгенерировать файл boot.ini.

Partition Magic

Хороший платный продукт для управления разделами с дружественным интерфейсом. Некоторые версии очень не любят, если разделы размечены не по "стандартам" и вылетают с ошибкой сразу после запуска. По этой самой причине я ими давно не пользовался :) Также полезна их более устойчивая утилита PartitionInfo для получения подробной информации о текущей разметке на разделы. Возможны некоторые проблемы при работе 32-битной версии в Windows XP x64.

Windows Computer Management

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

Установка Windows

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

Acronis Disk Editor

Теперь этот редактор распространяется в пакете Acronis DiskDirectorSuite. Отличный редактор содержимого диска, тоже платный и с дружественным интерфейсом. Позволяет наглядно посмотреть на таблицу разделов, прогуляться по дереву разделов. Умеет сохранять сектора в файл и загружать их потом обратно. Из особых недостатков: при ресайзе окна в режиме hex меняется и ширина таблицы (гораздо удобнее, когда в таблице всегда 16 колонок). Отлично работает и в Windows XP x64.

DiskExplorer for FAT\NTFS

Еще один редактор, тоже платный, на этот раз от Runtime Software. Некоторым может понравится больше, чем Acronis Disk Editor. Особых недостатков замечено не было.

hex-редактор

Используйте ваш любимый hex-редактор. Если вы хотите сохранить hexdump файла в текстовый файл, то сделать это можно с помощью обычного FAR'а, откройте в нем файл в режиме hex, нажмите Alt+Num.Ins, выделите мышью или курсором область, нажмите Enter, и hexdump в буфере обмена.

dd

Да, именно так, dd есть и под Win32 на сайте http://www.chrysocome.net/dd (качать нужно http://www.chrysocome.net/downloads/dd-0.4beta4.zip, в ней добавлена полезная опция --list). Синтаксис такой же, как и в Линуховой dd, изменения касаются только наименования устройств. Посмотреть список доступных устройств:
dd --list
Cделать образ CD или скопировать в файл MBR второго винчестера:
dd if=\\?\Device\CdRom0 of=c:\temp\disc1.iso bs=1M
dd if=\\?\Device\Harddisk1\Partition0 of=c:\temp\hdc.mbr bs=512 count=1

Linux

Всегда держите под рукой LiveCD с Linux, это может спасти ваши данные и ваше время. Критичную информацию (резервные копии MBR и других секторов) храните на дискете или другом сменном носителе. Всегда перед тем как пробовать какую-нибудь из привиденных мной команд прочтите хотя бы по диагонали man.

сfdisk

Чем-то напоминает менеджер из установки Windows, но в отличии от него в случае "нестандартной" разметки предпочитает сразу выходить с ошибкой а-ля Partition Magic. При этом все же есть возможность запустить его для полной переразметки диска.

fdisk

Более устойчивая программа для разметки диска, основана на командом интерфейсе. Очень удобна для сбора информации о разделах. Советую запускать с ключом -u, чтобы информация печаталась в секторах. Полезно где-нибудь сохранить вывод команды 'p' в обычном режиме, а также команд 'p' и 'e' в экспертном режиме. В дальнейшем эта информация может пригодится при восстановлении разметки диска.

sfdisk

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

dd

Полезная утилита для работы с диском. С ее помощью можно вытащить любой сектор с диска, а также записать его обратно. Внимательно проверяйте все ее параметры перед запуском. Она настолько же полезна насколько и опасна в случае опечатки. В общем случае для считывания сектора номер N диска /dev/hda в файл hda_sector_N запустите
dd bs=512 count=1 if=/dev/hda of=hda_sector_N skip=N
а для записи его обратно запустите
dd bs=512 count=1 if=hda_sector_N of=/dev/hda seek=N
Очень удобным может оказаться называть файлы просто номерами секторов и складывать их в отдельной директории. Тогда восстановить все файлы можно будет одной командой
for n in *; do dd bs=512 count=1 if=${n} of=/dev/hda seek=${n}; done

xxd

Полезная вещь для просмотра hexdump'а файла, а также для восстановления файла по его hexdump'у. Позволяет также просто патчить отдельные байты. Не рекомендуется применять обратное преобразование сразу на /dev/hda. Лучше сохраните требуемый сектор в файл, исправьте файл с помощью xdd, проверьте, что все исправлено верно, и только потом заливайте обратно на диск.

В следующей версии возможно вы увидите:

Как поменять логический порядок разделов, не меняя при этом физический и наоборот?
Как использовать один раздел для виртуальной памяти Windows и swap Linux'а?
Как устроить скрытый компактный раздел с загрузчиком и Linux и Windows в самом начале диска?

Задавайте вопросы, дополняйте и исправляйте меня, если где ошибся.

25.08.2006
2006 Александр Данилов