Yvision.kzYvision.kz
kk
Разное
Разное
399 773 постов41 подписчиков
Всяко-разно
0
23:54, 20 сентября 2014

Прошивка больших образов BIOS и Intel ME

Не секрет, что современные образы BIOS, а также региона ME (Intel Management Engine) занимают достаточно много места. Например, на днях столкнулся вот с такой barebone-системой. Вышедшее для неё обновление BIOS весит больше 3 Мб, а ME - больше 8 Мб.

Беда в том, что большинство таких обновлений предполагают выполнение процедуры в среде DOS, а стремительный технический прогресс постепенно оставляет в прошлом знакомые DOS-у носители (floppy disk, файловые системы FAT16/32). В итоге в распоряжении рядового пользователя остаются только USB-порты, SSD-накопитель внутри, образ BIOS-а и горячее желание этот образ прошить в CMOS :)

До недавнего времени, можно было скачать в сети готовый образ дискетки с FreeDOS, раскрыть его, записать туда образ BIOS и загрузиться с неё через grub. Однако, упомянутая выше проблема с непомерными габаритами этих самых образов ставит крест на попытке втиснуть их в маленькую, но когда-то такую уютную комнатку образа floppy-диска.

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

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

Сделать загрузочный диск с DOS можно в эмуляторе Qemu, установив в нем дистрибутив FreeDOS. Моя система была Ubuntu 14.04.1, для других систем сложностей возникнуть не должно. Приступим.

1. Установка qemu

 

yerden@home:~$ sudo apt-get install qemu qemuctl qemu-launcher
 

qemu-launcher - это GUI на GTK2+, для простоты работы с Qemu.

2. Получение образа FreeDOS

На официальном сайте проекта в разделе "Download FreeDOS" нужно взять версию 1.0. Последняя версия 1.1 почему-то под Qemu не установилась, ну а я не стал разбираться, да это и не так важно.

 

yerden@home:~$ wget http://www.freedos.org/download/download/fdbasecd.iso
 

3. Настройка Qemu

Запускаем Qemu Launcher:

Blog post image

Заходим во вкладку "Launcher Settings" и прописываем в "Path to 'qemu'" путь к исполняемому файлу, в зависимости от архитектуры PC. Путь по умолчанию некорректен. Жмём "Save".

Blog post image

Возвращаемся на вкладку "Configurations". Возле 'Hard disk 0' щелкаем "New" для создания нового диска. В открывшемся окне выбираем "Create empty raw image", прописываем имя и путь к создаваемому образу. Выбираем также размер диска, 50 Мб хватит за глаза на все прошивки. Имейте в виду, что этот образ будем копировать в /boot, поэтому там должно быть достаточно места для его хранения. Здесь всё, жмём OK.

Blog post image

В самой вкладке "Configurations" ставим галочку "Use CD-ROM", выбираем "Boot disk: CD-ROM" и в поле CD-ROM, кнопкой "Open" выбираем наш скачанный образ FreeDOS. Внизу, в поле "RAM" выберем, сколько оперативной памяти выдать нашему DOS-у. Хватит ему и 16 Мб. Всё, жмём "Launch".

Blog post image

Настройка Qemu закончена. Теперь пошла установка FreeDOS.

3. Установка FreeDOS

Видим вот такое веселое окошко. Жмём "Enter".

Blog post image

Выбираем "Install to hard disk using FreeDOS SETUP".

Blog post image

После пары очевидных вопросов, приходим к необходимости разметки нашего образа диска.

Blog post image

В интерфейсе XFdisk выбираем Options - New Partition - Primary Partition.

Blog post image

После чего, выбираем "Install Bootmanager".

Blog post image

Затем пытаемся выйти по F3, и нас останавливают вопросом "Не хотите ли записать таблицу разделов на диск?"

Blog post image

Обреченно соглашаемся с этим, как и с тем, что новый раздел нужно будет (после перезагрузки по требованию XFdisk) отформатировать:

Blog post image

Дальше всё довольно просто, единственное, нужно убрать все галки с дополнительных утилит, предлагаемых инсталлятором к установке. Образ диска не вместит их всех в себя, да они и не нужны для целей прошивки BIOS.

Blog post image

После нескольких секунд всё кончено, система установлена.

Blog post image

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

4. Копирование прошивок и утилит на образ диска

Мы имеем образ диска, но кроме FreeDOS там ничего нет. Нужно скопировать туда образы BIOS/ME и утилиты для их прошивки. Давайте рассмотрим наш свежий образ диска:

 

yerden@home:~$ fdisk -u -l dos_image.raw 

Disk dos_image.raw: 52 MB, 52428800 bytes
16 heads, 63 sectors/track, 101 cylinders, total 102400 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

        Device Boot      Start         End      Blocks   Id  System
dos_image.raw1   *          63      101807       50872+   e  W95 FAT16 (LBA)
 

Как мы видим, раздел на диске смещен от начала образа на 63 сектора или на 63 * 512 = 32256 байт (см. последнюю строчку). Используем этот факт и ассоциируем файл образа с данным смещением с loop-устройством:

 

yerden@home:~# sudo losetup -o32256 /dev/loop0 dos_image.raw
 

После этого, мы можем примонтировать этот раздел к системе. Создаем каталог /mnt/freedos и монтируем туда /dev/loop0:

 

yerden@home:~$ sudo mkdir /mnt/freedos
yerden@home:~$ sudo mount -t vfat /dev/loop0 /mnt/freedos/
yerden@home:~$ ls -l /mnt/freedos/
total 116
-rwxr-xr-x 1 root root 66945 Aug 28 2006  COMMAND.COM
drwxr-xr-x 2 root root 2048  Sep 21 00:22 FDOS
-rwxr-xr-x 1 root root 45341 Aug 29 2006  KERNEL.SYS
 

Вуаля! Мы видим содержимое раздела. Теперь можно скопировать туда прошивки и утилиты, полученные от производителя:

 

yerden@home:~$ cd /mnt/freedos
yerden@home:/mnt/freedos$ sudo unzip ~/Downloads/AT7000_C25F1P03_Update_20131122.zip
Archive: /home/yerden/Downloads/AT7000_C25F1P03_Update_20131122.zip
creating:   AT7000_C25F1P03_Update_20131122/
inflating:  AT7000_C25F1P03_Update_20131122/AT7000_C25F1P03-Release note.doc
creating:   AT7000_C25F1P03_Update_20131122/DOS Image/
creating:   AT7000_C25F1P03_Update_20131122/DOS Image/HPUSBFW/
inflating:  AT7000_C25F1P03_Update_20131122/DOS Image/HPUSBFW.exe
inflating:  AT7000_C25F1P03_Update_20131122/DOS Image/HPUSBFW/ANSI.SYS
inflating:  AT7000_C25F1P03_Update_20131122/DOS Image/HPUSBFW/CHOICE.COM
inflating:  AT7000_C25F1P03_Update_20131122/DOS Image/HPUSBFW/COMMAND.COM
inflating:  AT7000_C25F1P03_Update_20131122/DOS Image/HPUSBFW/EMM386.EXE
inflating:  AT7000_C25F1P03_Update_20131122/DOS Image/HPUSBFW/HIMEM.SYS
inflating:  AT7000_C25F1P03_Update_20131122/DOS Image/HPUSBFW/IO.SYS
inflating:  AT7000_C25F1P03_Update_20131122/DOS Image/HPUSBFW/MSCDEX.EXE
extracting: AT7000_C25F1P03_Update_20131122/DOS Image/HPUSBFW/MSDOS.SYS
inflating:  AT7000_C25F1P03_Update_20131122/DOS Image/HPUSBFW/OAKCDROM.SYS
inflating:  AT7000_C25F1P03_Update_20131122/DOS Image/HPUSBFW/RAMDRIVE.SYS
inflating:  AT7000_C25F1P03_Update_20131122/HISTORY.TXT
creating:   AT7000_C25F1P03_Update_20131122/MEBIOS/
inflating:  AT7000_C25F1P03_Update_20131122/MEBIOS/C25F1P03.bin
extracting: AT7000_C25F1P03_Update_20131122/MEBIOS/flash.bat
inflating:  AT7000_C25F1P03_Update_20131122/MEBIOS/fparts.txt
inflating:  AT7000_C25F1P03_Update_20131122/MEBIOS/fpt.exe
creating:   AT7000_C25F1P03_Update_20131122/SYSBIOS/
inflating:  AT7000_C25F1P03_Update_20131122/SYSBIOS/AFUDOS.exe
inflating:  AT7000_C25F1P03_Update_20131122/SYSBIOS/C25F1P03.ROM
extracting: AT7000_C25F1P03_Update_20131122/SYSBIOS/FLASH.BAT
 

Отмонтируем образ диска и закроем loop-устройство:

 

yerden@home:/mnt/freedos$ cd ~/
yerden@home:~$ sudo umount /mnt/freedos
yerden@home:~$ sudo losetup -d /dev/loop0
 

Замечательно, теперь в образе диска у нас записаны прошивки. Можно прошивать! Правда, надо ещё с этого образа загрузиться. С помощью загрузчика. Он же GRUB.

5. Настройка загрузки образа через GRUB

Проблема в том, что в процессе загрузки образ диска должен быть развернут в оперативной памяти, причем в пространстве выше 1Мб, адресуемого DOS. Затем этот образ должен быть представлен системе именно как жесткий диск через специальный драйвер. Все эти задачи решает программа memdisk из проекта syslinux.

Для начала проверьте, что syslinux установлен:

 

yerden@home:~$ sudo apt-get install syslinux-common
 

Затем скопируем наш образ и memdisk в /boot. Ведь там же хватит места, правда?

UPD: упустил из виду, что memdisk поддерживает сжатые образы дисков (через gzip или zip), что дает существенную экономию места. Образ очень хорошо сжимается, и 50 Мб превращаются в чуть больше 4 Мб. Два момента - (1) у образа должно быть расширение .gz или .zip, в зависимости от алгоритма компрессии и (2) у меня memdisk не захотел кушать gzip (ошибка Decompression error: output buffer overrun), но проглотил zip.

 

yerden@home:~$ sudo cp dos_image.raw /boot
yerden@home:~$ sudo cp /usr/lib/syslinux/memdisk /boot
 

Чтобы GRUB добавил ещё один пункт в меню загрузки, добавьте такие строчки в /etc/grub.d/40_custom:

 

yerden@home:~$ cat /etc/grub.d/40_custom 
...
menuentry "FreeDOS (flash bios)" {
        set root='hd0,msdos1'
        linux16 /memdisk
        initrd16 /dos_image.raw
}
 

Ну а чтобы иметь возможность выбрать этот пункт, установите необходимые параметры в /etc/default/grub:

 
GRUB_DEFAULT=0
# Таймаут в 5 сек для вызова меню через "Esc"
GRUB_HIDDEN_TIMEOUT=5
# Не загружать систему втихаря
GRUB_HIDDEN_TIMEOUT_QUIET=false
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
 

Обновляем загрузчик:

 

yerden@home:~# sudo update-grub
 

Теперь можно перегружаться и, нажав Esc, выбрать пункт "FreeDOS (flash bios)" в меню загрузчика. Загрузится DOS со всеми необходимыми инструментами для прошивки.

Удачи!

0
1420
0