Не секрет, что современные образы 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:
Заходим во вкладку "Launcher Settings" и прописываем в "Path to 'qemu'" путь к исполняемому файлу, в зависимости от архитектуры PC. Путь по умолчанию некорректен. Жмём "Save".
Возвращаемся на вкладку "Configurations". Возле 'Hard disk 0' щелкаем "New" для создания нового диска. В открывшемся окне выбираем "Create empty raw image", прописываем имя и путь к создаваемому образу. Выбираем также размер диска, 50 Мб хватит за глаза на все прошивки. Имейте в виду, что этот образ будем копировать в /boot, поэтому там должно быть достаточно места для его хранения. Здесь всё, жмём OK.
В самой вкладке "Configurations" ставим галочку "Use CD-ROM", выбираем "Boot disk: CD-ROM" и в поле CD-ROM, кнопкой "Open" выбираем наш скачанный образ FreeDOS. Внизу, в поле "RAM" выберем, сколько оперативной памяти выдать нашему DOS-у. Хватит ему и 16 Мб. Всё, жмём "Launch".
Настройка Qemu закончена. Теперь пошла установка FreeDOS.
3. Установка FreeDOS
Видим вот такое веселое окошко. Жмём "Enter".
Выбираем "Install to hard disk using FreeDOS SETUP".
После пары очевидных вопросов, приходим к необходимости разметки нашего образа диска.
В интерфейсе XFdisk выбираем Options - New Partition - Primary Partition.
После чего, выбираем "Install Bootmanager".
Затем пытаемся выйти по F3, и нас останавливают вопросом "Не хотите ли записать таблицу разделов на диск?"
Обреченно соглашаемся с этим, как и с тем, что новый раздел нужно будет (после перезагрузки по требованию XFdisk) отформатировать:
Дальше всё довольно просто, единственное, нужно убрать все галки с дополнительных утилит, предлагаемых инсталлятором к установке. Образ диска не вместит их всех в себя, да они и не нужны для целей прошивки BIOS.
После нескольких секунд всё кончено, система установлена.
Поздравляю, вы установили 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 со всеми необходимыми инструментами для прошивки.
Удачи!