Создание mbr

Создаем MBR и пишем свой менеджер мультизагрузки / Восстановление данных. Практическое руководство / Библиотека (книги, учебники и журналы) / В помощь Веб-Мастеру

Создание mbr

Создаем MBR и пишем свой менеджер мультизагрузки

В этом разделе я расскажу, как написать собственный менеджер мультизагрузки. Менеджер мультизагрузки представляет собой код, находящийся в загрузочном секторе, и по выбору пользователя загружающий любую из нескольких операционных систем, установленных на компьютере. В процессе обсуждения вы познакомитесь с прерыванием INT 13h, таблицей разделов и т.д.

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

Вот и давайте напишем свой! Пока мы будем его писать, мы познаем дао и дзен ассемблера, научимся отлаживать программы без отладчика и поближе познакомимся с низкоуровневыми интерфейсами винчестера.

Управлять дисками можно как через порты ввода/вывода, так и через BIOS. Порты намного более могущественны и интересны, однако BIOS программируется намного проще, к тому же она поддерживает большое количество разнокалиберных накопителей, абстрагируясь от конструктивных особенностей каждой конкретной модели. Поэтому будем действовать через нее, а точнее, через интерфейс прерывания INT 13h.

Попробуем прочитать сектор с диска в режиме CHS. Действовать нужно из самой MBR или из “голой” MS-DOS, иначе у нас ничего не получится, ведь Windows NT блокирует прямой доступ к диску даже из режима эмуляции MS-DOS.

Номер функции заносится в регистр AH. В случае чтения он равен двум. Регистр AL отвечает за количество обрабатываемых секторов. Так как мы собираемся читать по одному сектору за операцию, занесем сюда единицу.

Регистр DH хранит номер головки, a DL — номер привода (80h — первый жесткий диск, 81h — второй и т.д.). Пять младших битов регистра CL задают номер сектора, оставшиеся биты регистра CL и восемь битов регистра CH определяют номер цилиндра, который мы хотим прочитать.

Регистровая пара ES:BX указывает на адрес буфера-приемника. Вот, собственно говоря, и все.

После выполнения команды INT 13h считываемые данные окажутся в буфере, а если произойдет ошибка (например, головка “споткнется” о BAD-сектор), то BIOS установит флаг переноса (carry flag), и мы будем вынуждены либо повторить попытку, либо вывести грустное сообщение на экран.

Код этой программы на языке ассемблера представлен в листинге 5.6.

Листинг 5.6. Код, считывающий загрузочный сектор или расширенную таблицу разделов

MOV SI, 1BEh ; Перейти к первому разделу MOV AX, CS   ; Настраиваем ES MOV ES, AX MOV BX, buf  ; Смещение буфера …

read_all_partitions:  MOV AX, bud            ; Читать 1 сектор с диска  MOV DL, 80h            ; Читать с первого диска  MOV DH, [SI+1]         ; Стартовый номер головки  MOV CX, [SI+2]         ; Стартовый сектор с цилиндром INT 13h  JC error               ; Ошибка чтения  ;Обрабатываем считанный boot-сектор или расширенную таблицу разделов  ;===================================================================  ;  CMP byte [SI], 80h  JZ LOAD_BOOT            ; Это загрузочный сектор                          ; Передаем на него управление  CMP byte [SI+4], 05h  JZ LOAD_CHS_EXT         ; Это расширенная таблица разделов                          ; в формате CHS  CMP byte [SI+4], 0Fh  JZ LOAD_LBA_EXT         ; Это расширенная таблица разделов                          ; в формате LBA  ADD SI, 10h             ; Переходим на следующий раздел  CMP SI, 1EEh  JNA read_all_partitions ; Читаем все разделы один за другим

…buf rb 512               ; Буфер на 512 байт

Запись сектора в режиме CHS происходит практически точно так же, только регистр AH равен не 02h, a 03h. С режимом LBA разобраться намного сложнее, но мы, как настоящие хакеры, его обязательно осилим.

Чтение сектора осуществляется функцией 42h(AH = 42h). В регистр DL, как и прежде, заносится номер привода, а вот регистровая пара DS:SI указывает на адресный пакет (disk address packet), представляющий собой продвинутую структуру формата, описанного в табл. 5.4.

Таблица 5.4. Формат адресного пакета, используемый для чтения и записи секторов в режиме LBA

Смещение Тип Описание
00hBYTEРазмер пакета — 10h или 18h
01hBYTEПоле зарезервировано и должно быть равно нулю
02hWORDСколько секторов читать
04hDWORD32-разрядный адрес буфера-приемника в формате seg:offs
08hQWORDСтартовый номер сектора для чтения
10hQWORD64-разрядный плоский адрес буфера-приемника. Используется только в случае, если 32-разрядный адрес равен FFFF:FFFF

Код, читающий сектор в режиме LBA, в общем случае выглядит так, как показано в листинге 5.7.

Листинг 5.7. Код, осуществляющий чтение сектора с диска в режиме LBA

MOV DI, 1BEh      ; Перейти к первому разделу MOV AX, CS        ; Настраиваем… MOV buf_seg       ; …сегмент MOV EAX, [DI+08h] ; Смещение partition относительно                   ; начала раздела ADD EAX, EDI      ; EDI должен содержать номер сектора                   ; текущего MBR MOV [X_SEC]       ; …

read_all_partitions:  MOV АН, 42h      ; Читать сектор в режиме LBA  MOV DL, 80h      ; Читать с первого диска  MOV SI, dap      ; Смещение адресного пакета INT 13h  JC error         ; Ошибка чтения …

dap: packet_size db 10h ; размер пакета 10h байт reserved    db 00h ; “Заначка” для будущих расширений N_SEC       dw 01h ; Читаем один сектор buf_seg     dw 00h ; Сюда будет занесен сегмент буфера-приемника buf_off     dw buf ; Смещение буфера-приемника X_SEC       dd 0   ; Сюда будет занесен номер сектора для чтения dd 0               ; Реально не используемый хвост                    ; 64-битного адреса
buf rb 512         ; Буфер на 512 байт

Запись осуществляется аналогично чтению, только регистр AH содержит не 42h, a 43h. Регистр AL определяет режим: если бит 0 равен 1, BIOS выполняет не запись, а ее эмуляцию. Бит 2, будучи взведенным, задействует запись с проверкой. Если регистр AL равен 0, выполняется обыкновенная запись по умолчанию.

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

Лучше всего загрузчики программируются на FASM. С точки зрения ассемблера загрузчик представляет собой обыкновенный двоичный файл, предельно допустимый объем которого составляет 1BBh (443) байт. Немного? Но не будем спешить с выводами.

Всякий раздел всегда начинается с начала цилиндра, а это значит, что между концом MBR и началом раздела имеется, по меньшей мере, n свободных секторов, где n == sectors per track. Практически все современные винчестеры имеют по 64 сектора на дорожку, что дает нам: 443 + 63*512 == 32 699 байт или приблизительно 32 Кбайт.

Да в этот объем даже графический интерфейс с мышью уместить можно! Однако делать этого мы не будем. Настоящие хакеры работают в текстовом режиме с командной строкой.

Как уже говорилось, BIOS загружает MBR по адресу 7C00h, поэтому в начале ассемблерного кода должна стоять директива ORG 7C00h, а еще — USE16, ведь загрузчик выполняется в 16-разрядном реальном режиме. Позже, при желании, он может перейти в защищенный режим, но это будет уже потом. Не будем лезть в такие дебри.

Обнаружив загрузочный раздел (а обнаружить это можно по флагу 80h, находящемуся по нулевому смещению от начала раздела), загрузчик должен считать первый сектор этого раздела, поместив его в памяти по адресу 0000:7C00h, то есть в точности поверх своего собственного тела.

А вот это уже нехорошо! И чтобы не вызвать крах системы, загрузчик должен заблаговременно перенести свое тело по другому адресу, что обычно осуществляется командой MOVSB. Копироваться можно по любому из адресов памяти — от 0080:0067h до 9FE00h.

Память, расположенную ниже 0080:0067h, лучше не трогать, так как здесь находятся вектора прерываний и системные переменные BIOS, а от A000h и выше начинается область отображения ПЗУ, так что предельно доступный адрес равен A000h – 200h (размер сектора) == 9FE00h.

Не забывайте, что трогать регистр DL ни в коем случае нельзя, поскольку в нем передается номер загрузочного привода. Некоторые загрузчики содержат ошибку, всегда загружаясь с первого жесткого диска, и это в то время, как BIOS уже больше 10 лет как позволяют менять порядок загрузки, и потому загрузочным может быть любой привод.

По правде говоря, FASM — это единственный известный мне ассемблер, “переваривающий” команду дальнего вызова JMP 0000:7C00h напрямую. Все остальные ассемблеры заставляют извращаться приблизительно так: PUSH offset_of_target/PUSH segment_of_target/RETF.

Здесь мы заталкиваем в стек сегмент и смещение целевого адреса и выполняем дальний RETF, переносящий нас на нужное место.

Еще можно воспользоваться самомодифицирующимся кодом, собрав команду JMP FAR “вручную”, или просто расположить целевой адрес в одном сегменте с исходным адресом (например, 0000:7C00h ? 0000:7E00h). Однако эти подходы муторны и утомительны.

В общем, скелет нашего загрузчика будет выглядеть так, как показано в листинге 5.8.

Листинг 5.8. Скелет простейшего загрузчика, написанный на FASM

use16 ORG 7C00h CLD            ; Копируем слева направо                ; (в сторону увеличения адресов) MOV SI,7C00h   ; Откуда копировать MOV DI,7E00h   ; Куда копировать MOV CX,200h    ; Длина сектора REP MOVSB      ; Копируем ; // Выбираем раздел, который мы хотим загрузить, ; // считываем его в память по адресу 0000:7C00h ; // (см. листинги 5.7 и 5.6)

JMP 0000:7C00h ; Передаём управление на загрузочный сектор

Под старушкой MS-DOS записать свой загрузчик в MBR было просто. Для этого достаточно дернуть прерывание INT 13h, функция 03h (запись сектора). Но под Windows NT этот прием уже не работает, и приходится прибегать к услугам функции CreateFile. Если вместо имени открываемого файла указать название устройства, например, .

PHYSICALDRIVE0 (первый физический диск), мы сможем свободно читать и записывать его сектора вызовами ReadFile и WriteFile соответственно. При этом флаг dwCreationDisposition должен быть установлен на значение OPEN_EXISTING, а флаг dwShareMode — на значение FILE_SHARE_WRITE.

Еще потребуются права системного администратора, иначе ничего не получится.

Законченный пример вызова CreateFile выглядит, как показано в листинге 5.9.

Листинг 5.9. Открытие непосредственного доступа к жесткому диску под Windows NT

XOR EAX,EAX PUSH EAX                                   ; hTemplateFile PUSH dword FILE_ATTRIBUTE_NORMAL           ; dwFlagsAndAttributes PUSH dword OPEN_EXISTING                   ; dwCreationDisposition PUSH EAX                                   ; lpSecurityAttributes PUSH dword FILE_SHARE_WRITE                ; dwShareMode PUSH dword (GENERIC_WRITE OR GENERIC_READ) ; dwDesiredAccess PUSH DEVICE_NAME                           ; Имя устройства CALL CreateFile                            ; Открываем устройство INC EAX TEST EAX,EAX JZ error DEC EAX … DEVICE_NAME db “.PHYSICALDRIVE0”,0
BUF RB 512 ; Буфер

Открыв физический диск и убедившись в успешности этой операции, мы должны прочитать оригинальный MBR-сектор в буфер, перезаписать первые 1BBh байт, ни в коем случае не трогая таблицу разделов и сигнатуру 55h AAh (мы ведь не хотим, чтобы диск перестал загружаться, верно?). Теперь остается записать обновленный код MBR на место и закрыть дескриптор устройства. После перезагрузки все изменения вступят в силу.

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

Под Windows 9x, разумеется, трюк с CreateFile не работает. Но там можно воспользоваться симуляцией прерываний из DMPI или обратиться к драйверу ASPI. Оба способа были подробно описаны в моей книге “Техника защиты компакт-дисков от копирования”. Однако, хотя в ней речь идет о CD, а не о HDD, жесткие диски программируются аналогично.

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

? Ge2000.asm — тщательно прокомментированный Stealth-вирус, подменяющий системный загрузчик своим собственным. Хоть это и вирус, но он не опасен и может быть использован в учебных целях.

? Mbr.asm — предельно простой, но полнофункциональный загрузчик с поддержкой разделов свыше 8 Гбайт.

Источник: https://wm-help.net/lib/b/book/259146216/50

Как создать MBR-загрузчик с помощью программы EasyBCD

Создание mbr

Как создать MBR-загрузчик Windows с нуля? Не восстановить его, не пересоздать, а именно создать с нуля – выделить дисковое пространство под загрузочный раздел, сформировать таковой со всеми необходимыми атрибутами, внедрить файлы загрузчика, сделать запись о загрузке Windows.

Необходимость в этом возникает, как правило, когда Windows установлена на одном жёстком диске, а её загрузочный раздел находится на другом диске. И этот другой диск с загрузчиком необходимо либо извлечь, либо переразметить.

В этой статье будем воссоединять Windows и её загрузчик – разместим их обоих на одном жёстком диске, с которого и будет загружаться компьютер. А поможет нам в этом деле программа EasyBCD.

***

Но программа EasyBCD – не единственный инструмент, который будет участвовать в нашей операции. Нам также потребуются возможности системного управления дисками. Его можно запустить в меню Win+X (в Win8.1 и Win10) или через поиск в меню «Пуск», введя название утилиты – diskmgmt.msc.

Итак, имеем обозначенную выше ситуацию – Windows установлена на одном диске, значащемся как диск 0, а её загрузочный MBR-раздел «Зарезервировано системой» размещается на другом диске, диске 1.

Как их объединить на одном диске – диске 0? У задачи есть несколько путей решения. Один – это клонирование загрузочного раздела на диск 0 и внесение записи о загрузке Windows в клонированный загрузчик. Для этой операции потребуется программа, умеющая клонировать разделы.

При этом если не работать с командной строкой, то всё равно потребуется участие программ типа EasyBCD для внесения записи о загрузке системы в новый загрузчик. Другой путь – создание раздела загрузчика с нуля с использованием системного управления дисками и возможностей той же программы EasyBCD.

Этим путём мы и пойдём.

1. Создание активного раздела для загрузчика

В управлении дисками создадим загрузочный раздел за счёт небольшого пространства, отобранного у раздела Windows. Кликаем раздел С, выбираем в контекстном меню «Сжать том».

В графе указания размера сжимаемого пространства указываем 350 Мб. Кликаем «Сжать».

На образовавшемся пустом месте в контекстном меню выбираем «Создать простой том».

В приветственном окне мастера и на этапе указания размера создаваемого раздела просто жмём «Далее».

На этапе назначения буквы диска тоже просто жмём «Далее». Загрузочному разделу обычно не назначается буква, но при его создании вручную она нам будет нужна. Потом мы её уберём. В качестве метки тома можем указать стандартное название раздела MBR-загрузчика – «Зарезервировано системой».

И жмём «Готово».

Раздел на 350 Мб создан. Теперь нам нужно сделать его активным. В контекстном меню на нём выбираем «Сделать раздел активным».

Важно: на MBR-диске может быть только один активный раздел. Если на диске есть уже другой активный раздел, его нужно сделать неактивным. И только потом в управлении дисками станет доступной возможность сделать активным новосозданный раздел.

И вот итог: у нас после раздела С появился активный раздел «Зарезервировано системой».

Теперь нужно на этом разделе создать файлы загрузчика.

2. Создание MBR-загрузчика

Создавать файлы MBR-загрузчика Windows будем с помощью упомянутой программы EasyBCD. Она бесплатная, скачать её можно на официальном сайте: https://neosmart.net/EasyBCD/

Устанавливаем и запускаем программу. Идём в раздел «Установка BCD». В графе «Создание загрузочного внешнего носителя» из выпадающего списка выбираем наш созданный раздел на 350 Мб. В нашем случае это раздел с буквой D.

Затем жмём «Установить BCD». На запрос программы, хотим ли мы загрузить новый файл BCD можем нажать «Да».

Но может быть и так, что EasyBCD не сможет автоматически загрузить для редактирования новый файл BCD. И в её интерфейсе останется файл BCD текущего системного загрузчика. Лучше перестраховаться и вручную загрузить файл BCD нового загрузчика. В меню программы «Файл» выбираем «Выбрать BCD». Жмём «Ок» в окошке предупреждения, что мы загружаем внешний файл BCD.

В окне открывшегося проводника вручную прописываем в адресной строке путь к файлу BCD по типу: D:\Boot

Где вместо буквы D вам нужно подставить свою букву нового загрузочного раздела. Жмём Enter в адресной строке, в открывшемся пути выбираем файл BCD и открываем его.

Как видим в разделе EasyBCD «Текущее меню», в нашем новом загрузчике нет ни единой записи о загрузке Windows.

Исправим это. Идём в раздел «Добавить запись». И добавляем нашу Windows: в графе «Имя» указываем имя системы, в графе «Диск» указываем раздел, где стоит система. И жмём кнопку-плюсик. По этому же принципу добавляем другие Windows, если их на диске имеется несколько.

Далее можем зайти в раздел «Редактировать меню загрузки» и выбрать для меню загрузчика русский язык. Это нужно, чтобы среда восстановления была на русском. Если в загрузчик добавлялись несколько Windows, в этом разделе можем настроить меню загрузки – установить таймаут автовыбора системы, установить порядок систем в списке и т.п. По итогу настроек жмём «Сохранить».

Вот, собственно, и всё.

3. Удаление буквы загрузочного раздела

Буква нового загрузочного раздела сыграла свою роль, будучи указателем при создании файлов MBR-загрузчика в программе EasyBCD. И теперь она не нужна. Идём снова в управление дисками, на новом загрузочном разделе в контекстном меню выбираем изменение буквы.

И удаляем букву.

На этом всё: можем перезагружаться, выставлять в BIOS загрузку с диска с новым загрузчиком и тестировать запуск Windows. Работа с дисками, Руководства

Источник: https://altarena.ru/kak-sozdat-mbr-zagruzchik-s-pomoshhyu-programmy-easybcd/

GPT и MBR: Что это такое, как определить и конвертировать разметку диска

Создание mbr

Простыми словами о сложном — что такое MBR и GPT, как работают разметки и как преобразовать одну в другую? Обо всем этом подробно вы можете узнать в нашей статье.

Назначение MBR и GPT разметки носителя данных

MBR (Master Boot Record) и GPT (GUID Partition Table) представляют собой два разных способа хранения информации о разделах на жестком диске. Данная информация включает в себя как сведения о принципе работы накопителей, так и определяет какой раздел станет загрузочным для системы.

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

В этой статье мы разберем что из себя представляют разметки GPT и MBR, какая из них лучше, приведем способ определения уже существующих разметок и как их изменить на более подходящие.

Что такое MBR на жестком диске

загрузочная запись (Master Boot Record, MBR) — представляет собой код и набор данных, необходимый для последующей загрузки операционной системы. Применялась с 1983 года вплоть до введения в эксплуатацию UEFI схемы GPT в 2010-м году.

Как вы помните, ранее в ходу были компьютеры с операционной системой, которая поддерживала только 32-битный формат.

При запуске этих машин, первым в работу вступает BIOS (MBR использует версию Legacy) и далее происходит выбор устройства, с которого будет произведен последующий запуск. Это может быть дискета, жесткий диск или любой указанный в настройках сетевой ресурс.

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

Master Boot Record работает с дисками размером до 2 Тб и не поддерживает носители, превышающие этот порог. Кроме того, MBR поддерживает только до 4 основных разделов. Если вам нужно больше, придется один из основных блоков сделать расширенным. Это приведет к потере одного из разделов, который сольется с основным, выбранным вами.

Legacy BIOS, с которым работает MBR, характеризуется следующими особенностями:

  • Драйверы загружаются при старте операционной системы после загрузки самого BIOS.
  • Все подключенные устройства запускаются в порядке очереди.
  • Может быть создано только 4 логических раздела размером до 2 Тб.

В 2020 году Master Boot Record морально устарел и не подходит для использования на современных компьютерах. Почти все они используют GPT.

Что такое GPT на HDD и SSD дисках

Понятие GPT состоит из трех сокращенных слов — GUID Partition Table. Согласно Википедии, GPT — это стандарт формата размещения таблиц разделов на физическом жестком диске.

Он является частью расширяемого микропрограммного интерфейса (Unified Extensible Firmware Interface, UEFI) — стандарта, предложенного Intel на замену BIOS.

Таким образом, GUID Partition Table — это новое поколение разметок дисков, пришедшее на смену устаревшей MBR.

Диск GPT состоит из трех частей:

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

В GPT больше не используется привычный нам BIOS. Данное “предзагрузочное” состояние по прежнему продолжают так именовать, по памяти, но официально оно имеет совершенно другое название — UEFI. И оно имеет существенные отличия, в сравнении с предшественником:

  • Прежде всего, это совершенно новая разметка, никак не относящаяся к старой MBR и BIOS.
  • Позволяет создавать неограниченное количество разделов любого объема.
  • Обладает более высокой скоростью загрузки, особенно при использовании нескольких объемных жестких дисков.
  • Драйверы загружаются одновременно с UEFI и затем переходят под управление операционной системы.
  • Присутствует Secure Boot — система, обеспечивающая безопасность загрузки Windows.
  • Поддерживает улучшенный графический интерфейс.

На сегодняшний день, GUID Partition Table является единственной подходящей разметкой для полноценной работы компьютера. Работает разметка только в сочетании с UEFI, в то время как MBR кооперирует только с Legacy BIOS.

Как определить разметку диска

Определить разметку жесткого диска или твердотельного накопителя довольно просто. Для этого нужно воспользоваться утилитой “Управление дисками” или же командной строкой. Начнем мы с самого простого.

Определение разметки с помощью утилиты “Управление дисками”

1. Щелкните правой кнопкой мыши по меню пуск или используйте комбинацию клавиш Windows + X.

2. Откройте утилиту Управление дисками.

3. В новом окне вы увидите полный список подключенных устройств, который включает в себя как физические диски, так и их логические разделы.

4. Далее нужно открыть свойства диска. Но не торопитесь кликать по физическим и логическим разделам (в верхней части окна). Через них нельзя получить доступ к нужной информации. Вместо этого обратите внимание на нижнюю часть и выберите нужный физический диск.

5. Щелкните по диску правой кнопкой мыши и откройте Свойства.

6. В новом окне найдите вкладку Тома и кликните по ней.

7. Обратите внимание на блок Стиль раздела. Он содержит информацию о разметке вашего диска. В нашем случае это Таблица GUID.

Определение разметки с помощью командной строки

Второй способ определить разметку жесткого диска — использование командной строки. Он менее удобен и требует знания вводимых команд. Тем не менее, результативность способа от этого не страдает.

1. Откройте командную строку от имени администратора.

2. Введите команду diskpart и нажмите Enter.

3. Далее введите команду list disk.

4. Обратите внимание на представленный список дисков. Если ваше устройство работает с разметкой GPT, оно будет отмечено символом “*” (звездочкой). Иногда индикатор может смещаться в сторону.

Конвертация MBR в GPT и обратно

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

Для того чтобы преобразовать один тип разметки в другой, рекомендуем скачать и установить приложение Acronis Disk Director.

1. Запустите приложение.

2. Выберите диск, который нужно преобразовать.

3. Щелкните по номеру диска и выберите действие Преобразовать в MBR/GPT. Обратите внимание! Кликать нужно именно по нумерации диска, а не по его названию или букве.

4. Подтвердите действие. Не переживайте, данный процесс работы проходит в режиме “подготовки”. Если вы передумаете, предварительные настройки перед запуском конвертации можно отменить и диск не перенесет какие-либо изменения.

5. Щелкните по клавише Применить ожидающие операции и дождитесь завершения процесса преобразования. Это отнимет не больше пары минут.

Одна технология смещает другую. Так было и всегда будет. Раньше и MBR казалось чем-то невероятным, но не так давно GPT практически вытеснил своего предшественника из конкурентов и занял лидирующую позицию в списке доступных пользователю разметок. Может быть в ближайшие годы мы увидим что-то новое.

Источник: www.starusrecovery.ru

Источник: https://zen.yandex.ru/media/starusrecovery/gpt-i-mbr-chto-eto-takoe-kak-opredelit-i-konvertirovat-razmetku-diska-5f1037d4cfe4dd15a4e03c1f

MBR для флешки своими руками или как сделать из одного устройства три

Создание mbr

Мое почтение читающему! Топик мог бы получиться просто катастрофически огромным, поэтому перейдем сразу к делу. Впереди вас ждет рассказ, о том, как можно одну флешку сделать одновременно загрузочной как для ОС семейства Windows, так и *nix, а также сделать из нее live-usb. Заранее прошу прощения за жаргон, не сторонник, но так короче.

Аннотация

Как-то пришлось много раз подряд устанавливать на одну и ту же машину кучу разных операционных систем, как от товарищей господ из Майкрософт, так и любимых всеми нами *nix`ов. При этом инсталляторы вновь устанавливаемых ОСей периодически терли загрузчики ранее установленных, так что приходилось их восстанавливать вручную, загружаясь с live-usb.

Но самое ужасное, что при всем при этом под рукой была всего одна флешка (и еще 15 компьютеров правда, но толку от них было мало, так как разбирать их по причинам гарантии в надежде на лишний жесткий диск было нельзя). Флешка к счастью была большого объема.

Вот тут-то и возникла идея сделать из одной флешки две, а лучше три (хотя можно и 4) разных девайса.

Немного теории

Как сделать из одной флешки несколько с целью последующей установки на нее одновременно нескольких установщиков ОС и еще live-операционки? Ответ очевиден — сделать на флешке несколько разделов!

Покопавшись в интернете глубинах подсознания вспомнил из институтского курса, что информация о разделах хранится в первом секторе диска флешки, называющемся Master Boot Table (MBR), а точнее в отдельной его части, называемой partitions. Находится эта часть по смещению 0x01BE и представляет собой 4 поля по 16 байт, каждое из которых представляет собой запись об отдельном разделе. При этом в принципе возможно на одном устройстве иметь и большее количество разделов, но это сложнее и нам для флешки хватит и четырех.

Инструментарий

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

Собственно это и определило выбор средств для форматирования флешки.

Будем работать с линуксовым fdisk`ом!

Сам загрузчик будем писать на FASM`е, так как для программирования кода, выполняющегося вне ОС он наиболее удобен на мой взгляд.

Работать с флешкой в виде блочного устройства можно с помощью ужасной destroy data (dd), но раз уж тут выходит такая мешанина операционок, то воспользуемся более дружественной оконной DMDE.

Краткое лирическое отступление

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

Зубофлешко-дробильный аппарат

Начнем с самого простого, разметим файловую систему на нашей флешке. В частности я использовал флешку Transcend JetFlash 16 GB (была получена в качестве подарка, а дареному коню как известно… Хотя нареканий в ее адрес у меня за 1,5 года использования нет).

Как я уже говорил, пользоваться будем линуксовым fdisk`ом (под рукой оказалась старенькая виртуальная машина Ubuntu 9). Итак, монтируем флешку (так как сидим под X-ми, то просто втыкаем ее в порт). Получаем устройство /dev/sdb. Запускаем fdisk, натравив его на новое устройство: root@kubuntu:/# fdisk /dev/sdb Имеем выхлоп:The number of cylinders for this disk is set to 1953.

There is nothing wrong with that, but this is larger than 1024,and could in certain setups cause problems with:1) software that runs at boot time (e.g., old versions of LILO)2) booting and partitioning software from other OSs (e.g.

, DOS FDISK, OS/2 FDISK) Command (m for help): mCommand action a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition l list known partition types m print this menu n add a new partition o create a new empty DOS partition table p print the partition table q quit without saving changes s create a new empty Sun disklabel t change a partition's system id u change display/entry units v verify the partition table w write table to disk and exit x extra functionality (experts only) Считаем, что диск чистый и не содержит ни одного раздела. В противном случае командой d исправляем этот недостаток (не забыв скопировать нужные данные заранее). Задача проста — создать три раздела. Разделы будем создавать основные (primary), чтобы вся информация о них хранилась в partitions MBR`а. Воспользуемся командой n. Первый раздел самый большой (14 ГБ), так как его потом будет видеть Windows, и его будем использовать в качестве обычной флешки:Command (m for help): nCommand action e extended p primary partition (1-4)pPartition number (1-4): 1First cylinder (1-15320, default 1): 1Last cylinder or +size or +sizeM or +sizeK (1-15320, default 15320): +14336M Второй и третий по гигабайту:Command (m for help): nCommand action e extended p primary partition (1-4)pPartition number (1-4): 2First cylinder (13674-15320, default 13674):Using default value 13674Last cylinder or +size or +sizeM or +sizeK (13674-15320, default 15320): +1024M Command (m for help): nCommand action e extended p primary partition (1-4)pPartition number (1-4): 3First cylinder (14652-15320, default 14652):Using default value 14652Last cylinder or +size or +sizeM or +sizeK (14652-15320, default 15320):Using default value 15320 Проверим полученные результаты, распечатав сформированную таблицу разделов командой p:Command (m for help): p Disk /dev/sdb: 16.0 GB, 16064184320 bytes64 heads, 32 sectors/track, 15320 cylindersUnits = cylinders of 2048 * 512 = 1048576 bytesDisk identifier: 0x0dee0000 Device Boot Start End Blocks Id System/dev/sdb1 1 13673 14001136 83 Linux/dev/sdb2 13674 14651 1001472 83 Linux/dev/sdb3 14652 15320 685056 83 Linux Как видим имеем три раздела: 14 ГБ, 1ГБ и остатки (чуть меньше гига). Остается сохранить полученные изменения командой w:Command (m for help): wThe partition table has been altered! Calling ioctl() to re-read partition table.Syncing disks.root@kubuntu:/# Отключаем флешку от виртуальной машины и моментально лицезреем всплывающее окошко следующего вида: Видно, что флешка стала восприниматься Windows, как устройство значительно меньшего размера. Что ж, форматируем! Получаем первый раздел, готовый к использованию. Но что делать с двумя другими? Первое, не факт, что самое умное (но главное, что рабочее!), что пришло на ум — это обмануть старушку Windows и поменять местами записи в таблице разделов. Итак, воспользуемся программой DMDE, откроем флешку, как блочное устройство и покопаемся в байтиках загрузочного сектора. Выбрали подходящее по размеру устройство. Открыли его и первое, что видим — это таблицу разделов, разбитую по полям. Не устраивает, лезем к сырым байтам. Нажимаем F2 и видим содержимое MBR. Помним, что partitions (записи о разделах) хранятся с 446 байта. Красным выделена запись о первом разделе. Далее делаем ход конем! Сохраняем все три записи куда-нибудь в блокнотик, а на место первой записи записываем вторую (crtl+e, записываем, ctrl+w сохраняем). Закрываем DMDE, перетыкаем флешку и… бинго! Видим следующее окошко: Windows на этот раз увидела второй раздел в гигтар размером. Потираем руки и форматируем. Как не сложно догадаться, далее стоит на место первого записать третий, а на место второго скопировать с первого. Снова отформатировать и вернуть полученную запись на третью позицию (не забываем, что записи 16 байт, а при форматировании меняется байт идентификатора файловой системы). На последнем шаге возвращаем из блокнотика на место первую запись. В результате, если подмонтировать такую флешку к Ubuntu, получим три разных раздела, а в случае Windows — только один — первый. Способом, аналогичным способу форматирования разделов, на флешку легко устанавливаются всевозможные операционки. Я на свою установил следующие:

  • Раздел 1 (14 ГБ) — установщик Windows 7 (+ также используется как обычная флешка)
  • Раздел 2 (1 ГБ) — live-usb Windows (bartPE)
  • Раздел 3 — live-usb Linux (backtrack)

А где же код?

Что дальше? Имеем прекрасную флешку с тремя операционками и… огромным минусом! Чтобы после загрузки BIOS компьютер начинал грузиться с флешки, один из ее разделов должен быть активным (значение первого байта в записи partitions 0x01).

Легко, скажите вы, воспользуемся все той же любимой DMDE. Возможно, но тут сталкиваемся с очередной проблемой — что, если мы часто меняем мнение по поводу того, с какого раздела флешки грузиться? Не редактировать же каждый раз таблицу разделов из DMDE вручную.

Конечно нет, автоматизируем этот процесс!

Еще немного теории

Из чего состоит MBR? MBR — это загрузчик + запись таблицы разделов.

После того, как микропрограмма BIOS проверит компьютер (POST), она производит копирование первого сектора диска, с которого предполагается проводить загрузку операционной системы в память по адресу 0x7С00 (процессор работает в реальном режиме адресов) и передает туда управление.

Далее кодом загрузчика MBR (все, что до 446го байта) осуществляется проверка готовности диска, проверка записей таблицы разделов (активной должна быть только одна!) и выбор активного раздела с последующей передачей управления загрузчику ОС.

Что сделаем мы

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

Как я уже говорил, код будем писать на FASM (а отладка осуществлялась в Bochs). Далее представлен листинг без особых пояснений, иначе топик никогда не закончится. Хотелось бы только отметить, что так сложилось, что это моя первая программа на ассемблере, поэтому не судите строго. Что делает код было описано выше.

;регистр dl cодержит номер загрузочного диска! use16;======== Копируем самого себя по адресу 0000:0600h =================== mov ax, 7C0h mov ds, ax xor si, si mov ax, 60h mov es, ax xor di, di mov cx, 0FFh ;в cx лежит число повторений функции копирования слов ;[DS:SI] => [ES:DI]; SI += 2; DI += 2; rep movsw ;Передаем управление на новое расположение кода jmp 0000:0618h ;======== Приветствуем пользователя =================================== mov ax, hello_msg_1 call print mov ax, hello_msg_2 call print ;======== Проверяем таблицу разделов =================================== mov si, [part_adr] mov bh, 80h mov cl, -1partitions_chek: cmp cl, 3 ;если уже было проверено 4 записи, выходим из цикла и переходим к обработке записей je partition_select add si, 10h inc cl mov bl, [es:si] cmp bl, bh jne partitions_chek ;запись не является загрузочной call partitions_process ;запись загрузочная! ;[es:si] содержит адрес записи в таблице разделов ;cl – номер раздела jmp partitions_chek ;======== Подпрограмма вывода инофрмации об активном разделе =============================partitions_process: mov ax, boot_part_msg call print mov di, part_num add [ds:di], cl mov ax, part_num call print sub [ds:di], cl mov di, boot_flags mov ch, 0 add di, cx mov byte[ds:di], 1 ret;;======================================================================= partition_select: ;Обрабатываем пользовательский ввод mov ax, select_part_msg call print choise: mov di, boot_flags mov si, [part_adr] mov ah, 0 int 16h p0: cmp al, 48 jne p1 add si, 10h jmp disk p1: cmp al, 49 jne p2 add si, 20h jmp disk p2: cmp al, 50 jne p3 add si, 30h jmp disk p3: add si, 40h cmp al, 51 je disk wrong_choise: mov ax, wrong_input_msg call print jmp choise disk: mov ah, 0 sub al, 48 ; сначала проверка, выбрал ли пользователь действительно загрузочный раздел add di, ax cmp byte [ds:di], 0 je wrong_choise ; по [es:si] содержится запись таблицы разделов ; о выбранном загрузочном диске mov ah, 41h ; проверка поддержки диском расширенного режима (> 8 GB) ; dl содержит номер диска mov bx, 55AAh int 13h jc ext_not_present_error shr cx, 1 jnb ext_not_present_error cmp bx, 0AA55h je read_boot_sect ext_not_present_error: mov ax, ext_not_pres_msg call print int 18h read_boot_sect: mov ah, 42h mov di, DAP_structure add di, 8 add si, 8 mov ebx, [ds:si] mov [ds:di], ebx mov si, DAP_structure int 13h jc ext_not_present_error jmp 0000:7C00h;======== Подпрограмма вывода сообщений ================================print: push si push bx mov bx, ax xor si, si mov ah, 0Eh p: mov al, [bx + si] cmp al, 0Ah int 10h je end_print inc si jmp p end_print: pop bx pop si ret ;=======================================================================hello_msg_1 db '************************', 0Dh, 0Ahhello_msg_2 db '*WELL`s LOADER (c) 2011*', 0Dh, 0Ahboot_part_msg db 'Find bootable partitions:', 0Dh, 0Ahselect_part_msg db 'Select part to boot from (press 0 … 3)', 0Dh, 0Ahwrong_input_msg db 'Wrong choise. Try again', 0Dh, 0Ahext_not_pres_msg db 'a disk read error occured', 0Dh, 0Ahpart_num db '0', 0Dh, 0Ahpart_adr dw 1AEhboot_flags db 4 dup (0)DAP_structure db 10h, 0, 1, 0, 0, 7Ch, 0, 0, 8 dup (0) Как видно, программа загрузчика представляет из себя чистый бинарник без всяких точек входа, секций и прочей сложноты. Режим работы процессора — реальный (16-разрядный). Чтобы использовать этот загрузчик, его необходимо залить на флешку в первый сектор (с помощью DMDE, например), при этом сохранив нетронутой таблицу разделов. Размер скомпилированного бинарного файла 442 байта.

Перспективы

Источник: https://habr.com/ru/post/122699/

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.