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

banderon

MBR, разделы и загрузчики
Введение
Это первая версия FAQ'а.
Красным цветом выделены самые последние изменения, а синим — остальные.
Большую роль в подготовке этого FAQ'а сыграл (качать нужно 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

x
Полезная вещь для просмотра heump'а файла, а также для восстановления файла по его heump'у. Позволяет также просто патчить отдельные байты. Не рекомендуется применять обратное преобразование сразу на /dev/hda. Лучше сохраните требуемый сектор в файл, исправьте файл с помощью , проверьте, что все исправлено верно, и только потом заливайте обратно на диск.
В следующей версии возможно вы увидите:
Как поменять логический порядок разделов, не меняя при этом физический и наоборот?
Как использовать один раздел для виртуальной памяти Windows и swap Linux'а?
Как устроить скрытый компактный раздел с загрузчиком и Linux и Windows в самом начале диска?
Задавайте вопросы, дополняйте и исправляйте меня, если где ошибся.

Geddi-S

понять от чего отсчитывается сдвиг начала раздела... Для обычных и основных разделов он отсчитывается с того сектора, в котором и записана эта информация. Для расширенных логических разделов отсчет похоже идет от начала основного расширенного раздела, "внутри" которого они находятся.
Правильно ли я понимаю, что для основных и расширенных (не обычных) сдвиг начала раздела отсчитывается от MBR, т.е. от первого сектора? Тогда лучше так и написать.
А для логических разделов в составе расширенных (не расширенных логических; и вложенных расширенных, видимо) отсчет похоже идет от начала основного расширенного раздела, "внутри" которого они находятся. Аналогично.
Внутри 16-байтного блока первый байт отвечает флагу bootable у раздела
Многие называют это: "активный раздел". Имхо, неплохо было бы об этом сказать (а то я сначала никак не мог взять толк, что значит сделать раздел "активным").
В приведенном MBR четвертый раздел —расширенный и он начинается с сектора номер 0x05184c00=85478400
...
сектор, где начинается наш новый логический расширенный раздел. Начинается он в секторе номер 85478400+1=85478401
Получается, что если сдвиг раздела от сектора с номером M есть N секторов, то его начало находится в секторе с номером M+N. Однако что если сдвиг раздела от MBR есть N секторов, то его начало находится в секторе с номером N, а не N+1 (т.к. у MBR номер сектора 1). Странно (это не претензия к автору, а просто неудоумение).
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
Получается, что размер раздела, стоящего вторым в списке, есть 1 сектор? Как это вообще понимать?
А тут у меня совсем пар из ушей пошел:
Второй раздел — расширенный, его сдвиг — 0x01ae6b00=28207872, но его сдвиг считается от сектора 85478400, так как этот раздел расширенный.
Если я правильно тебя понял, у тебя есть 1 расширенный с началом в 85478400, в нем содержится еще один расширенный с началом 8547840+1, а в нем еще расширенный с началом в 85478400+28207872? Т.е. такая матрешка, если я правильно понял... И Непонятно, почему начала всех вложенных расширенных разделов имеют сдвиг относительно первого, корневого расширенного раздела, а не относительно расширенного раздела, их породившего...
все, дальше ниасилил пока
P.S. Это не критика, если чо, это мое непонимание и в лучшем случае корректировка формулировок

banderon

Еще раз про отсчет сдвигов:
Отсчет идет от MBR (от сектора с номером 0) для всех основных (primary) разделов, как для обычных, так и для расширенного, и только для основных.
Все логические разделы задаются сдвигом относительно начала некоторого расширенного раздела, более детально:
Все обычные логические (not extended logical) разделы задаются сдвигом относительно начала того расширенного раздела, в котором они описаны.
Все расширенные логические (extended logical) разделы задаются сдвигом относительно начала основного расширенного раздела (extended primary).
Для чего это сделано, мне, честно говоря, не совсем понятно, но работает это именно так.
По поводу MBR. Если я пишу где-то "первый" сектор, то имею ввиду, что перед ним больше ничего нет, однако на самом деле у него номер 0. А если я пишу "1-й" сектор, то это уже будет означать сектор с номером 1. Этот недочет я постараюсь исправить.
По поводу моих примеров, они не очень хороши, так как винт у меня побит не по "стандартам". В частности, у меня у всех логических расширенных разделов длина стоит как 1 сектор. И это имеет некий смысл, так как реально от расширенного раздела нужна только таблица его разделов, то есть только его первый сектор. Более того, есть мнение, что на длину расширенных логических разделов никто никогда не смотрит (кроме дотошных разбивалок типа Partition Magic)
Про активный раздел добавил, спасибо

janlynn

маладэц

Geddi-S

Отсчет идет от MBR (от сектора с номером 0)
Тогда все понятно, меня почему-то переглючило, что он имеет номер 1 (т.к. Acronis Disk Editor ему присвает номер 1, а он же показывает данные в формате (c,h,s)).
Все обычные логические (not extended logical) разделы задаются сдвигом относительно начала того расширенного раздела, в котором они описаны.
Все расширенные логические (extended logical) разделы задаются сдвигом относительно начала основного расширенного раздела (extended primary).
Да, это становится понятно из разбора тобой примера твоей разбивки, но хорошо бы было цитату выше занести и в фак до начала разбора примеров. И сказать, что можно создавать бесконечную вложенность расширенных разделов (ну или по крайней мере уровня вложенности 3, как у тебя на твоем винте).
По поводу моих примеров, они не очень хороши, так как винт у меня побит не по "стандартам". В частности, у меня у всех логических расширенных разделов длина стоит как 1 сектор. И это имеет некий смысл, так как реально от расширенного раздела нужна только таблица его разделов, то есть только его первый сектор. Более того, есть мнение, что на длину расширенных логических разделов никто никогда не смотрит (кроме дотошных разбивалок типа Partition Magic)
Что еще в инете прочитал:
Штатные утилиты разбивки (FDISK.EXE, Disk Manager) в каждой таблице разделов создает один основной и один расширенный раздел. Т. е. если при разбиении винчестера на четыре логических диска, на нем образуется четыре partition table, хотя в данном случае можно было бы обойтись и одной.
А про единичную длину логических расширенных не знал :о Это по стандартам (fdisk там разметил), или ты вручную делал?

Geddi-S

маладэц
риспектов пятОк

Geddi-S

Сюда относятся Windows'ы типа Windows NT/XP/2003. Сюда не входят Windows Vista, Windows 95/98, Windows 2k (могу и ошибаться, так как Windows 2k никогда не видел ).
Поправочка: Windows 2000 использует ntloader ^)

Geddi-S

Так как stage1 GRUB'а использует прерывания BIOS'а для чтения секторов, то могут возникнуть проблемы при попытке загрузить stage2, если он лежит достаточно далеко от начала диска. GRUB поддерживает и CHS-адресацию и LBA. Вполне возможно, что граница, за котороую нельзя выходить находится где-то около 128 Гигабайт.
И LILO, и ntloader, да и наверное почти все (если знаете, кто не использует, обязательно поделитесь такой ценной инфой) стандартные загрузчики при загрузке некоего своего подобия "stage2" (т.е. тот код, которому передается управление после загрузки начальных 512-ти байт) испоьзуют прерывания BIOS'а Поэтому, если этот "stage2" лежит за той границей, которую может напрямую адресовать BIOS (а сейчас некоторые старые (года 4 и больше) BIOS'ы используют 28битную адресацию, поэтому такая граница есть 128 стандартных ГБ (ну или 136 "десятичных" ГБ, как показывается в БИОС - по крайней мере у меня)), то загрузить систему Вы не сможете, даже если правильно проделали операцию по добавлению новой ОС в Ваш любимый загрузчик
Я не настаиваю, но предлагаю поместить некий вариант сказанного мной выше, дабы я на этом уже собаку съел И не хочу, чтобы другие наступали на эти же грабли

Geddi-S

Инструменты
Windows
Я бы сюда, пожалуй, еще добавил DiskExplorer for FAT\NTFS от Runtime Software. Также платный, но мне понравился больше Acronis Disk Editor - особенно то (не считаю остальных плюсов), что при ресайзе окна в строчке в режиме "просмотр HEX" как было 16 значений, так и осталось. А акронисовская утилитка меняет в зависимости от размера окна количество значений в строке.
*Офф.*
Жаль, что на новую версию я кряк так и не нашел

Geddi-S

Инструменты
Windows
и еще я бы поместил сюда какой-нить hex-редактор\вьюер, который позволяет копировать в шестнадцатеричном виде содержимое секторов в обычные текстовые файлы (смотри примеры секторов выше). Под линуксом-то это просто, просто копирнул мышкой из терминала вывод hexedit'а, а в винде ни акронис, ни дискэксплорер так сделать не дают. В фаре мне тоже этого сделать не удалось (даже с плагином hexed, хотя опыта большого у меня нет). Как сделать в винде это просто, я не знаю (Джерри, может подскажешь?). В итоге остановился на выборе cygwin+hexedit+мышь

banderon

Не, под винду я могу разве что посоветовать также мышкой выделять и копировать в буфер. Но для этого надо по менюшкам консольки ползать, что не всегда удобно. В FAR'е у меня иногда срабатывает такая фишка: жмешь Alt+Insert(который на NumPade) и после этого можно мышкой/клавиатурой выделить прямоугольную область.
PS: Чтобы в консоли Linux мышью выделить прямоугольную область надо использовать Alt+Ctrl или что-то вроде этого при выделении.

Soslan

Скажите, а есть ли "правильный" способо установить винду на САТА диск если в системе также есть Иде диски, не отключая ИДЕ? (если не отключать ИДЕ то загрузчик пишется на него, а если Иде отформатирован как экстендед или динамик, то винду вообще не установить - она не найдет правильнх партиций)

oleg701

Вот вопрос появился, мож кто знает.
Был у меня винчестер с установленным Windows и загрузочным сектором.
Потом я купил другой винт, установил на него Windows и сделал его основным загрузочным диском.
Старую винду я стер, но ссылка на лоадер где-то в MBR первого винта осталась.
Вопрос - как ее удалить, то есть сделать второй винт не загрузочным?
В принципе не критично, но хвосты лишние не нужны.

dickofan

это не в мбр, это в бут.ини

Fragaria

oleg701

Нет, до boot.ini нужно еще добраться.
Я не имею в виду хвосты от старых операционок, которые появляются при выборе ОС.
Я имею в виду, что если я поставлю в BIOS загрузку с первого винчестера, я хочу, чтобы ничего не грузилось.
То есть мне нужно сделать первый раздел винчестера не "bootable" (система грузилась с первого раздела).
Не совсем понятно, достаточно ли для этого поставить '00' вместо '80' в MBR.
И какими тулзами можно делать подобные фишки.
Acronis это сможет?

Geddi-S

Если я правильно тебя понял, то у тебя новый винт сделан первым в загрузке, на всем все установлено, работает и вообще все зашибись
А на старом (втором), раньше была винда, но сейчас там ее нет, однако если этот самый второй винт сделать первым в загрузке, он будет пытаться что-то грузить (однако ничего не загрузит, т.к. кроме первичного загрузчика в MBR самого ntloader как такового не существует).
Если это так, то открываешь любой hex-редактор диска, который позволяет записывать изменения, сделанные в секторах (например, тот же самый Acronis disk editor), смотришь на запись в принятых выше обозначениях (0,0,1) для твоего старого диска (второго) - т.е. его MBR, первый сектор, и просто смотришь в конец этого сектора. И если тебе со старого винта ничо грузить не наадо, просто все флаги активности разделов ставишь вместо 80 на 00, и сохраняешь на диск изменения. Все.

Аддон. Недавно проверял у себя, если сменить 80 на 00, ntloader точно грузиться не будет

Geddi-S

Acronis Disk Editor
Было бы неплохо добавить, что сейчас как отдельная утилита не распространяется, я является частью Acronis DiskDirectorSuite.
dd
К счастью, недавно нашел небольшую программку dd под Win32 на сайте http://www.chrysocome.net/dd (качать нужно http://www.chrysocome.net/downloads/dd-0.4beta4.zip, в ней добавлена полезная опция --list). Полноценный dd, который может работать напрямую с устройствами. Т.е. можно запросто сделать образ диска\дискеты, или переписать boot-сектор или MBR, не прибегая к платным и тяжелым Acronis\Runtime. Синтаксис такой же, как и в Линуховой 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

Обратите внимание на название устройств (перед этим лучше вызвать dd с опцией --list и посмотреть, а что же есть в наличии и как все называется).
В распакованном виде весит 333Кб
И еще, я бы добавил инфу о Far и Alt+Num.Ins.

oleg701

Ага, все именно так.
Попробую, спасибо

banderon

Скажите, а есть ли "правильный" способо установить винду на САТА диск если в системе также есть Иде диски, не отключая ИДЕ? (если не отключать ИДЕ то загрузчик пишется на него, а если Иде отформатирован как экстендед или динамик, то винду вообще не установить - она не найдет правильнх партиций)
Это уже скорее тонкости работы установщика винды (которому уже наверно лет 5, если речь идет о WindowsXP).
Кстати, как верно было подмечено, на диске может использоваться и другая система разбиения на разделы. Например новые Windows (2003 SP1, XP x64) поддерживают GUID-разбиение (или GPT). Про него я почти ничего не знаю, кроме того, что на обычных компьютерах системный раздел должен находится на диске, побитом старым "MBR-методом"

Geddi-S

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

banderon

MBR, разделы и загрузчики. Часть 2.
(черновик)
Как поменять логический порядок разделов, не меняя при этом физический и наоборот?
Основные разделы
Тут все просто и прозрачно. Просто меняте порядок записей в таблице разделов в MBR. При этом большая часть partition manager'ов будет ругаться на неправильный порядок разделов. Однако проблем в работе Windows и Linux замечено не было.
Логические разделы
Рассмотрим случай, когда все логические разделы уложены в цепочку. Напомню, что в этом случае каждый логический раздел описан "внутри" одного расширенный раздела. В каждом таком расширенном разделе на первом месте указан обычный логический раздел, а на втором — следующий расширенный. Идея состоит в том, чтобы просто поменять ссылки в этой цепочке. Как поведут себя Partition Magic и другие, мне не известно. В лучшем случае они вернут нормальный порядок, а в худшем устроят цикл или оборвут цепочку логических разделов. И Windows и Linux отлично работают при измененном порядке логических разделов.
Физическое перемещение разделов
Как это ни странно, в данном случае проще целиком положиться на какой-нибудь софт типа Partition Magic. Для некоторых файловых систем достаточно сделать банальное перемещение информации с одного места на винчестере в другое. Для некоторых файловых систем при этом возможно придется что-то исправить в информационном секторе этой системы. Если вы физически передвинули раздел, на котором расположен /boot/grub вашего Linux'а, то скорее всего придется сделать grub-install еще разок
Сложные случаи
Можно попробовать превратить primary раздел в logical. Для этого у вас должен быть хотя бы один свободный сектор где-нибудь перед началом раздела. Или если первый сектор раздела не используется, то можно использовать его. В этом свободном секторе мы устроим расширенный раздел, и добавим его в цепочку логических. После этого ссылка на primary раздел удаляется из MBR. Возможно позже будет приведен конкретный пример
Logical в primary чуть проще. Просто указываете его в MBR, и удаляете одно звено из цепочки логических разделов.

Lord456

ситуация такая: были установлены ubuntu на ext3 раздел и винда на нтфс, загрузкой управлял grub
после переустановки винды, она загружается по умолчанию
как корректно восстановить grub?

slonishka

загрузиться с livecd убунты в консоль, зачрутиться в убунту и сделать grub-install на тот диск, на котором он раньше был.

Lord456

а если он выдает сообщение типа "device not found or no bios entry"?
команда sudo grub-install /dev/sda3
sda3 - ext3 раздел, на котором линукс стоит

slonishka

- sudo grub-install /dev/sda3
+ sudo grub-install /dev/sda
надо, чтоб груб затер то, что винда записала в MBR

slonishka

да, и /boot примонтируй перед этим. а то у тебя он наверное отмонтирован по дефолту.
к тому же если чрутиться будешь.
кстати, можно и не чрутиться:
# mount /dev/sda3 /mnt/ubuntu
# mount /dev/sda1 /mnt/ubuntu/boot (ну или где у тебя /boot)
# grub-install --root-directory=/mnt/ubuntu /dev/sda
Оставить комментарий
Имя или ник:
Комментарий: