среда, 11 февраля 2015 г.

Изготавливаем универсальную мультизагрузочную флешку

В сети полно статей по изготовлению загрузочных флешек с применением разного рода утилит, но такие утилиты не универсальны, а в статьях не описываются сами принципы загрузки.
Мне, системному администратору, по роду занятия часто требуется большое количество загрузочных инструментов: дистрибутивов операционных систем, утилит, Live систем, но содержать для этого большое количество флешек не эффективно, поэтому для этих целей я использую USB-HDD с двумя разделами (загрузочный раздел и раздел с данными) и собираю нужное мне самостоятельно.
Здесь я опишу как создать универсальное загрузочное устройство на USB-Flash, SD/MMC, USB-HDD, HDD, опишу на простом техническом языке принцип и инструменты для создания любых по составу загрузочных устройств, попробую понятно и без лишних технических подробностей описать этапы загрузки на примере создания мультизагрузочного устройства с использованием GRUB4DOS на разделе NTFS.
Этапы загрузки
В общем случае (достаточном для создания своей мультизагрузочной системы) в BIOS системах загрузка происходить в 3-5 этапов:
1. Инициализация BIOS.
2. Выполнение кода из MBR.
3. Выполнение кода из загрузочного сектора раздела.
4. Передача управления загрузчику ОС.
5. Загрузка ядра ОС, инициализация драйверов, инициализация пользовательского окружения.
Далее рассмотрим каждый этап отдельно в минимально необходимом контексте, для более полного понимания рекомендую ознакомиться с непонятными терминами в вики и на просторах интернета.
1. Инициализация BIOS
При включении ПК управление переходит коду BIOS, который загружает код расположенный в MBR.
2. Выполнение кода из MBR
MBR (Master Boot Record) - самый первый сектор на носителе информации, содержит в себе описание структуры разделов на носителе и загрузочный код, который выполняется на втором этапе. MBR присутствует на флешках, картах памяти, жёстком диске (На флешках и на картах памяти есть возможность создания более одного раздела, аналогично жёсткому диску, но из-за ограничений в винде не имеет смысла, т.к. она видит только первый раздел).
В таблице разделов MBR есть признак, который обозначает, что данный раздел является загрузочным (активным). Для того, что бы код из MBR смог определить с какого раздела необходимо загрузиться, нужно пометить раздел как загрузочный, сделать можно любой утилитой для редактирования разделов, например: fdisk, GParted, Acronis Disk Director, Parted Magic, MiniTool Partition Wizard Home Edition.
По умолчанию (если вы не устанавливали загрузчики GRUB, LILO и т.п. на носитель в загрузочные сектора) загрузочный код расположенный в MBR ищет активный раздел, считывает загрузочный сектор в оперативную память и передаёт ему управление.
3. Выполнение кода из загрузочного сектора раздела
В общем случае, в самом первом секторе раздела содержится информация о разделе (тип файловой системы, размер и т.п.) и загрузочный код, в задачи которого входит поиск следующего кода, который необходимо загрузить и передать ему управление.
Не будем рассматривать разные файловые системы, остановимся на NTFS (именно на ней будем делать наше устройство). При форматировании раздела диска в NTFS (при форматировании флешки) в загрузочный сектор раздела записывается код, который ищет специальный файл в корне диска (для отформатированных в Windows XP, ищется файл "ntldr", для отформатированных в Windows Vista и выше - "bootmgr").
Таким образом нам необходимо отформатировать раздел в NTFS, пометить его как активный и поместить в корень диска файл с необходимым именем.
3.1 Форматирование флешки
Отформатировать раздел можно разными способами, приведу универсальный, подходящий для всех версий выше Windows XP:
3.1.1 Запускаем консоль - Нажимаем Win+R (Пуск->Выполнить). Набираем комманду "cmd", нажимаем "OK" или Enter.
3.1.2 В консоли набираем "format <буква диска>: /q /fs:ntfs", нажимаем Enter. Читаем сообщения и выполняем всё что от нас требуют.
Если у вас Linux, то в консоли набираем "mkfs.ntfs -Q /dev/<имя устройства>", нажимаем Enter.
3.2 Ntldr, bootmgr
Далее необходимо найти то, что можно положить в специальный файл. В теории в качестве этого файла можно использовать много программ не использующих ресурсы операционной системы (она ведь ещё не загружена) и работающих в реальном режиме процессора. Не буду в даваться в подробности, приведу несколько вариантов:
3.2.1 На диске с дистрибутивом Windows 7 или на диске с WinPE 2+ (основанном на Windows Vista+) уже присутствует файл "bootmgr", поэтому, что бы сделать из такого CD диска загрузочную флешку, достаточно содежимое диска скопировать в корень нашего раздела и создать копию файла "bootmgr" с именем "ntldr" (для того, что бы не заморачиваться с тем в какой ОС был отформатирован наш раздел). После этого с нашего устройства можно будет загрузиться.
3.2.2 Но мы не будем ограничиваться одной системой, нам нужно сделать мультизагрузочную.
Для этого будем использовать GRUB4DOS, который умеет грузить практически любую ОС. Качаем архив например от сюда (http://code.google.com/p/grub4dos-chenall/downloads/list), в нём много файлов, но все они нам не нужны. Из архива берём "grldr" - это собственно сам загрузчик, который нам нужен, переименовываем его в "ntldr" и копируем на наш раздел (так же делаем копию с именем "bootmgr"). Так же из архива берём файл "menu.lst" (конфигурационный файл Grub), копируем его на флешку и используем как каркас для нашей дальнейшей мультизагрузочной системы.
4. Настраиваем Grub
Для настройки Grub необходимо подредактировать файл "menu.lst". Подробную информацию по формату файла и опциям можно нати наhttp://greenflash.su/Grub4Dos/Grub4dos.htm. Тут я только приведу некоторые используемые мной способы загрузки и краткое описание, чтоб вы в дальнейшем могли сделать своё по аналогии.
4.1 WinPE и то что сможет успешно грузиться из ISO образа.
WinPE начиная с версии 2+ (основанные на версии Windows Vista и выше) прекрасно грузятся через эмуляцию в grub.
---menu.lst---
title Windows Preinstall Enviroupment 3.0 - Заголовок, так будет выглядить пункт меню при загрузке
find --set-root /winpe.iso - Найдёт файл "winpe.iso" и установит раздел с этим файлом в качестве корневого (поиск будет проведён на всех доступных разделах, поэтому не обязательно файл располагать на нашем разделе, можно и на другой раздел положить)
map /winpe.iso (0xff) || map --mem /winpe.iso (0xff) - Загрузит наш образ в оперативную память
map --hook
chainloader (0xff) - Передаст дальнейшую загрузку нашему iso образу.
------
4.2 Инсталятор Windows 7, 2008, 8, 2012 (что нужно грузить напрямую)
С инсталяторами Windows немного по сложнее, т.к. из iso образа они загрузиться смогут, но установить систему не получится из-за особенностей эмуляции (есть способ заставить, но нужно проводить дефрагментацию и интегрировать специальный драйвер  в инсталятор), опишу способ который меня удовлетворил. С DVD диска Windows 7 необходимо в корень нашего раздела скопировать папки: "boot", "sources", а файл "bootmgr" с DVD диска необходимо переименовать например в "bootwin7".
---menu.lst---
title Windows 7 installer - Заголовок
find --set-root /bootwin7
chainloader /bootwin7 - Передаст дальнейшую загрузку нашему файлу.
------
4.3 Загрузка из образа дискеты (floppy)
Для загрузки утилит из образа дискеты, например: MSDOS, Memtest необходимо положить образ floppy диска на наш раздел и прописать
---menu.lst---
title Memory Test
find --set-root /Memtest.img
map --mem /Memtest.img (fd0) - Загрузит наш образ дискеты в оперативную память
map --hook
chainloader (fd0)+1
------
4.4 Загрузка LiveCD Linux
В общем случае загрузка разных LiveCD Linux сводится к поиску на CD ядра, образа initrd и указания необходимых опций, как правило на CD присутствует файл с необходимой информацией, его только нужно найти. Приведу на примере загрузки LiveCD Arch Linux
---menu.lst---
title Boot Arch Linux (x86_64)
kernel /arch/boot/x86_64/vmlinuz archisobasedir=arch archisolabel=Bootable - Указываем файл с ядром и опции загрузки
initrd /arch/boot/x86_64/archiso.img - Указываем файл с образом initrd
boot
------
Пример загрузки ntpasswd (утилита основанная на Linux для сброса пароля в Windows системах)
---menu.lst---
kernel /ntpasswd/vmlinuz
initrd /ntpasswd/scsi.cgz
initrd /ntpasswd/initrd.cgz
------
4.5 И на последок:
---menu.lst---
title Boot from CD
cdrom --init
map --hook
chainloader (cd0)

title Command Line
commandline

title Reboot PC
reboot

title ShutDown PC
halt

Комментариев нет: