Содержание
Обновление BIOS по сети
Задача: обновить BIOS ROM на всех компьютерах в сети. Материнские платы одинаковые. Программа flashrom
их не поддерживает. Выходит, остаётся единственный вариант перепрошивать из DOS ручками? Как бы не так! Наш девиз: «Автоматизация или смерть!» Приступим…
Конечно же, перепрошивка BIOS из операционной системы FreeDOS - это частный случай использования сетевой загрузки по PXE. Но цельного мануала именно по такой задаче в Интернетах найдено не было, поэтому и появилась на свет эта статья. Помимо перепрошивки BIOS ROM на некоторых современных материнских платах можно массово записывать NVRAM (CMOS settings, BIOS settings). Например, такую функцию поддерживают платы Asus имеющие функцию O.C. Profile
. То есть можно не только массово обновлять BIOS ROM, но и менять настройки BIOS на компьютерах. Мечта любого админа, не правда ли?
Подготовка загрузочного образа
Воспользуемся готовым образом дискеты FreeDOS от проекта nfsroot. Склонируем исходники к себе в каталог и скопируем загрузочный образ FreeDOS:
git clone https://code.google.com/p/nfsroot cp ./nfsroot/freedos/freedos.img ./itmodos.img
Скачаем архив с программами reboot.com
и poweroff.exe
отсюда1). Они нам понадобится чтобы выключать или перезагружать компьютер после перепрошивки, а в FreeDOS этих программ нет в комплекте. Распакуем программы и переместим в каталог tools
.
Скопируем в текущий каталог необходимые для работы файлы: прошивки, программы-прошивальщики, файлы с настройками BIOS и т.д.
Далее по инструкции с wiki проекта добавим все нужные нам файлы в образ дискеты:
export MTOOLSRC=mtoolsrc echo 'drive y: file="myfreedos.img"' >mtoolsrc mcopy -s 151_UNI.CMO 151.bat autoexec.bat bios/ tools/ y:
Autoexec.bat
Следующий шаг - изменить файл autoexec.bat
так, чтобы он автоматически запускал скрипт прошивки, если мы попросим. Для этого сначала вытащим файл из образа дискеты:
mcopy y:\autoexec.bat ./
Изменим его. В моем случае если передать параметр model=xxx
, то во время загрузки автоматически запустится скрипт xxx.bat (который предварительно нужно положить в образ дискеты) и компьютер выключится. Для выключения будет использована программа poweroff.exe
, которую мы скачали и положили в каталог tools
:
- autoexec.bat
@echo off rem Borrowed from the top of freedos\fdauto.bat rem kasatkin.org set DEBUG=N set NLSPATH=A:\FREEDOS set DIRCMD=/P /OGN /4 set LANG=EN set PATH=A:\FREEDOS;A:\DRIVER;A:\TOOLS rem Get boot arguments getargs >temp.bat call temp.bat del temp.bat rem Serial console redirect if "%sercons%"=="" goto end1 echo Redirecting console to %sercons% if not "%baudhard%"=="" mode %sercons% baudhard=%baudhard% if not "%baud%"=="" mode %sercons% baud=%baud% ctty %sercons% :end1 rem Flash BIOS if "%model%"=="" goto end2 echo Flashing BIOS for motherboard model %model% call %model%.bat poweroff :end2
Положим файл autoexec.bat
обратно. На запрос системы о перезаписи файла ответим o
(Overwrite
):
mcopy -s autoexec.bat y: Long file name "autoexec.bat" already exists. a)utorename A)utorename-all r)ename R)ename-all o)verwrite O)verwrite-all s)kip S)kip-all q)uit (aArRoOsSq): o
Скрипт перепрошивки
Здесь всё как обычно и особо останавливаться на этом пункте я не буду. Конкретный алгоритм перепрошивки зависит от производителя микропрограммы BIOS и материнской платы, но в общем случае скрипт будет выглядеть так:
Более интересен скрипт для перезаписи NVRAM. Для этого будем использовать замечательную программу uniflash. Скачиваем и добавляем её в наш загрузочный образ. Загружаем эталонный компьютер, настраиваем BIOS и сохраняем. Перезагружаемся во FreeDOS и делаем дамп всех настроек BIOS в файл с помощью uniflash
:
bios\uniflash.exe -cmoss xxx_uni.cmo
Обычно настройки хранятся в той же микросхеме, что и BIOS ROM, но в специальной перезаписываемой области памяти называемой NVRAM2). Сохранив эту область памяти в файл, можно её использовать для записи в NVRAM другой материнской платы такой же модели. Таким образом на другой компьютер можно перенести все настройки, включая пароль на BIOS, порядок загрузки и так далее.
Пишем скрипт для восстановления настроек с использованием программы uniflash
:
Копируем скрипт в образ дискеты:
mcopy -s 151.bat y:
Не забываем тщательно всё протестировать на подопытном компьютере.
Сетевая загрузка
Теперь осталось переместить наш образ дискеты FreeDOS на сервер сетевой загрузки и добавить пункт меню. Здесь предполагается, что у вас уже есть настроенный сервер сетевой загрузки. Для загрузки с помощью iPXE и автоматического запуска скрипта 151.bat
(параметр model=151
) я использую следующее меню:
#!ipxe # kernel http://dolly/memdisk nopassany=1 stack=2048 raw=1 model=151 initrd http://dolly/itmodos.img boot exit 0
Делаем тестовый запуск на одном компьютере, и если всё прошло успешно обновляем настройки на всех остальных компьютерах. Победа!