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
Считаем, что диск чистый и не содержит ни одного раздела. В противном случае командой d исправляем этот недостаток (не забыв скопировать нужные данные заранее).
Задача проста — создать три раздела. Разделы будем создавать основные (primary), чтобы вся информация о них хранилась в partitions MBR`а. Воспользуемся командой n. Первый раздел самый большой (14 ГБ), так как его потом будет видеть Windows, и его будем использовать в качестве обычной флешки:
Второй и третий по гигабайту:
Проверим полученные результаты, распечатав сформированную таблицу разделов командой p:
Как видим имеем три раздела: 14 ГБ, 1ГБ и остатки (чуть меньше гига). Остается сохранить полученные изменения командой w:
Отключаем флешку от виртуальной машины и моментально лицезреем всплывающее окошко следующего вида:
Видно, что флешка стала восприниматься 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). Далее представлен листинг без особых пояснений, иначе топик никогда не закончится. Хотелось бы только отметить, что так сложилось, что это моя первая программа на ассемблере, поэтому не судите строго. Что делает код было описано выше.
Как видно, программа загрузчика представляет из себя чистый бинарник без всяких точек входа, секций и прочей сложноты. Режим работы процессора — реальный (16-разрядный). Чтобы использовать этот загрузчик, его необходимо залить на флешку в первый сектор (с помощью DMDE, например), при этом сохранив нетронутой таблицу разделов. Размер скомпилированного бинарного файла 442 байта.
ПерспективыЕсли такое решение станет пользоваться популярностью, то функциональность загрузчика легко можно расширить например добавив вывод информации о разделах на экран в процессе выбора. Для удобства залилтия загрузчика на флешку и выбора, какие из разделов будут активными можно написать небольшой инструмент. В общем ваши пожелания и предложения принимаются в комментариях.