пятница, 1 февраля 2008 г.

PXE GRUB

Начал развлекаться с удаленной загрузкое по PXE и столлкнулся с небольшой проблемой. Ели использовать загрузчик от Syslinux - pxelinux.0, то проблем нет. Но хочется же красоты! Решил попробывать для наведения этой самой красоты загрузчик GRUB. И тут появилась проблема - не компилируется GRUB с поддержкой сетевой загрузки в Debian. По порядку:
конфигурим (у меня в сети водятся карточки Realtech и 3COM, а pci-direct - на всякий случай ;) ):
./configure --enable-diskless ----enable-pci-direct --enable-3c90x --enable-rtl8139
компилим:
make
и тут начинается ошибка:
main.c:57: error: static declaration of 'bootp_data' follows non-static declaration
./etherboot.h:534: error: previous declaration of 'bootp_data' was here
main.c:59: error: static declaration of 'end_of_rfc1533' follows non-static declaration
./etherboot.h:536: error: previous declaration of 'end_of_rfc1533' was here
Решение проблемы нашел тут: http://blog.aimz.de/?p=141
качаем и распаковываем исходники:
apt-get sourse grub
В результате получаем директорию /usr/src/grub-0.97 (на момент написания этой заметки версия 0.97 - крайняя), куда собсна и направляемся.
Если есть желаение применяем патчи (совсем даже не помешает) (код безжалостно выдран из скрипта сборки deb пакета):
set -e ;
for i in `cat debian/patches/00list  grep -v ^#` ;
do
echo "--- $i ---" ;
patch -p1
ну и в заключение находим в файле main.c такие строки:
static struct bootpd_t bootp_data;
и
static unsigned char *end_of_rfc1533 = NULL;
и правим их соотвественно до
struct bootpd_t bootp_data;
и
unsigned char *end_of_rfc1533 = NULL;
Конечно вместо такого вероломства лучше сделать патчик и применить его как полагается, но что-то мне стало лень и лом разбираться куда там чего пишется и я решил что быстрее будет так ;)

Собсна все! make и ищем так вожделенный нами pxegrub.