calculate pxe через grub2

Даже не знаю к какому разделу стоило отнести данный пост, так что решил писать сюда.

Решил попробовать запустить calculate через PXE.
Что сказать - в общем идея перспективная, однако хватает недоработок.
К примеру - syslinux, имхо, не лучший выбор загрузчика.
Как минимум у него неудобная “деревянная” система конфигов, нет возможности (как минимум сейчас) выбрать разные iso-образы.
В связи с этим решил поставить pxe-загрузчик от grub:2

Тут я постараюсь расписать как это получилось сделать.
Сразу предупрежу - это не руководство к действию, скорее это дневник, чтоб самому не забыть и другим подсказать.


Установка pxe

Итак, первым делом я особо не мудрствуя следуя документации выполнил

cl-install -s cldg --pxe --march=i686

и стал разбираться что же получилось.

Создание и установка grub2pxe

Слегка погуглив и поковыряв документацию в сорцах я пришел к следующей последовательности действий:

cd /var/calculate/pxe
ln -s . boot
cp -a /lib/grub/i386-pc grub
cp -a /usr/share/grub/unicode.pf2 grub/
mkdir grub/locale
ls /usr/share/locale/*/LC_MESSAGES/grub.mo |
sed -rne 's:(/usr/share/locale/([^/]+)/LC_MESSAGES/grub.mo):\1 grub/locale/\2.mo:p' |
xargs -l1 cp -va
grub-mkimage --format=i386-pc --output=core.img --prefix='(pxe)/boot/grub' pxe pxecmd
cat grub/pxeboot.img core.img >grub2pxe

Все вышеперечисленные действия абсолютно не влияют на работоспособность ранее установленного pxe сервера. Чтоб заставить грузиться grub-овский загрузчик вместо syslinux-ово , нужно заменить в файле /etc/dhcp/dhcpd.conf строку
filename “pxelinux.0”; ## она установлена командой cl-install --pxe …
на строку
filename “grub2pxe”;
Все, теперь после перезапуска сервера dhcp (/etc/init.d/dhcpd restart) мы увидим, что с этого сервера грузится grub 1.99*

творческая работа по написанию конфига

Осталось самая малость - конфиг. /var/calculate/pxe/grub/grub.cfg
Скажу сразу - мой конфиг не является эталоном крастоы и удобства, но некоторый намек на это есть ;).
Поскольку я уже выше писал - что это не является туториалом, не буду прикреплять файл, а выложу его листинг здесь(ну люблю я красивости, цветные буковки) поскольку предполагаю вносить в него еще изменения.
Также необходим файл /var/calculate/pxe/grub/calculate.defaults
Следующего содержания

<code class="bash">
cl_defaults="real_root=/dev/nfs nfsroot=192.168.256.1:/var/calculate/pxe/calculate init=/linuxrc looptype=squashfs unionfs doload=squashfs,isofs,unionfs loop=/livecd.squashfs nodevfs cdroot video=uvesafb:ywrap,1024x768-32@60,mtrr:3,splash=silent,theme:tty1 console=tty1 udev noresume doscsi"
cl_lang=ru_RU
cl_domain=domain:192.168.256.1,domain_pw:SeCrEtClIeNtPaSsWoRd
## calculate_iso=/linux/cldg-20120119-i686.iso
</code>

Я решил включить в свой конфиг “переключатель разрешений” “(строки 45-80)”:http://pastebin.calculate-linux.ru/ru/show/3276 оставив по дефолту графический режим отключенным. Дело в том, что на некоторых комбинаиях видео+монитор я сталкивался с тем, что графическое меню grnu-а не отображалось.
Нечто подобное, как задел на будущее, я решил сделать и для локалей.
Собственно это лишь попытка скопировать меню выбора дистрибутива для загрузки “(85-98)”:http://pastebin.calculate-linux.ru/ru/show/3276 Поскольку этот конфиг - неточная копия конфига с моей загрузочной флешки. Кстати, в строках 35-40 видно как у меня iso-шки грузятся с флешки без необходимости распаковвывать iso-образ. К сожалению по сети такой вариант не прокатил, пришлось распаковвывать iso-шку в директорию, но как вы понимаете таких директорий можно налепить сколько угодно.
За обилие закомментированых кусков в конфиге прошу простить. Ну спешил я на последнюю маршрутку когда допилилвал этот скрипт конфиг. Если найду время - постараюсь завтра/на_днях допилить данный конфиг и вечером выложить, но не обещаю. Работы много, а сейчас важно “чтоб все свистело и крутилось”, сейчас не до красоты кода.

Даже не знаю к какому разделу стоило отнести данный пост, так что решил писать сюда.

В блог, куда же ещё!

Михаил Гагауз wrote:

Собственно это лишь попытка скопировать меню выбора дистрибутива для загрузки “(85-98)”:http://pastebin.calculate-linux.ru/ru/show/3276 Поскольку этот конфиг - неточная копия конфига с моей загрузочной флешки. Кстати, в строках 35-40 видно как у меня iso-шки грузятся с флешки без необходимости распаковвывать iso-образ. К сожалению по сети такой вариант не прокатил, пришлось распаковвывать iso-шку в директорию, но как вы понимаете таких директорий можно налепить сколько угодно.

т.е. получается строчки 85-92 нужно привести к виду:

isolist="/linux/*первый_дистр* /linux/*второй_дистр* /linux/............ "
submenu "Select iso, default:${calculate_iso} >" --class calculate_iso {
  menuentry "Select /linux/*первый_дистр*" {
    set calculate_iso="/linux/*первый_дистр*/"
  }
  menuentry "Select /linux/*второй_дистр*" {
    set calculate_iso="/linux/*второй_дистр*/"
  }
.................................
}

так?

а думали как можно заставить исошки понимать? было бы удобно для установки форточек…

я не юзал ещё pxe от calculate, но из этого поста уже понятно что было бы разумно использовать всё же grub. Почему выбран syslinux? Ведь даже в гентушных манах о pxe используется grub.

Когда-то давно на livecd был граб. Но не везде граб грузился.
На самом деле не вижу никакой проблемы загрузившись ставить любой из образов. При этом в pxe держать какой-нибудь легкий CSS. В общем кому как удобно. Любое решение имеет место быть.

Alexander Tratsevskiy wrote:

Когда-то давно на livecd был граб. Но не везде граб грузился.

как понять “не везде граб грузился”? :slight_smile: собственно что за проблемы были?

Если честно, не помню. Это было много лет назад.

По поводу выбора Iso-шки.
Во первых - isolist="/linux/*первый_дистр* /linux/*второй_дистр* /linux/… " это на будущее. Дело в том, что grub2 умеет циклы, но пока у меня не получилось в submenu оформить циклом добавление menuentry, вот и оставил на проверить такую возможность в более новом grub-е (а разрабы явно работают над grub-ом, в примеру в прошлой версии небыло поддержки submenu).
Однако, если в консоли grub2 ввести строки “(93-97)”:http://pastebin.calculate-linux.ru/ru/show/3276 , то добавятся пункты меню, что означает, что в принципе добавление пунктов меню в цикле возможно.
Думаю, если подменю оформить в отдельный конфиг, и инклудить его в подменю командой source “/configname” или configfile “/configname”, подобное можно будет оформить.
Единственное надо решить с этими подменю - это как выходить из подменю сразу после выбора пункта(сейчас приходится, к примеру после выбора разрешения нажимать чтоб вернуться в предыдущее меню), а также продумать вариант обновления подписи подменю, к примеру submenu “Select iso, default:${calculate_iso} >” своего названия после фактического изменения переменной не меняет. Есть у меня мысли как это оформить с кучей маленьких конфигов и описания их зависимостей друг от друга - но это еще тот уродский неудобочитаемый костыль получится, почти как в syslinux-е ;-).

Далее по поводу submenu "Select iso…
привел как пример того как это происходит на флешке. Подобным же макаром можно выбирать и директории в которые эти iso-образы распакованы (есть у меня мысли как можно avfs попробовать на сервере использовать чтоб не распаковывать iso-шки, но та многое надо учесть и переделать, проще образы монтировать перед запуском tftp).
К примеру можно оформить нечто вида

<code class="bash">
######### calculate.defaults
cl_defaults="real_root=/dev/nfs init=/linuxrc looptype=squashfs unionfs doload=squashfs,isofs,unionfs loop=/livecd.squashfs nodevfs cdroot video=uvesafb:ywrap,1024x768-32@60,mtrr:3,splash=silent,theme:tty1 console=tty1 udev noresume doscsi" 
nfs_srv="nfsroot=192.168.256.1:/var/calculate/pxe"
DEFAULT_cl_lang=ru_RU
DEFAULT_cl_keymap=ru_RU
....
function get_nfsroot{
  nfsroot=${nfs_srv}${iso_dir}
  save_env nfsroot
}
function get_calculate_env{
  if [ -z "${cl_lang}" ];then
    cl_lang="${DEFAULT_cl_lang}"
  fi
  ## то же самое для cl_keymap ...
  ## cl_timezone - вряд-ли с одного pxe сервера будете в разных таймзонах грузиться, 
  ## ... но для универсальности решил что нужно оформить аналогично ...
  ## cl_video ...
  ## cl_composite ...
  ## cl_kbd_grp - а что, мало ли, вдруг разрабы признают, что выбор
  ## ... ПОЛЬЗОВАТЕЛЕМ переключателя раскладок - это благо ;-)
  calculate_env="lang:${cl_lang},keymap:${cl_keymap},timezone:${cl_timezone},video=${cl_video},composite=${cl_composite}"
  if [ -n "${cl_domain}" ]; then
    calculate_env="${calculate_env},${cl_domain}"
  fi
  save_env calculate_env
}
....
######### уже непосредственно в grub.cfg ...
## результат чего-то вроде submenu "Select distr"
iso_dir="/linux/cldg" ## or "/linux/cld" or "/linux/cldx"
....
get_nfsroot
get_calculate_env
linux ${iso_dir}/boot/vmlinuz "nfsroot=${nfsroot}" ${cl_defaults} "calculate=${calculate_env}"
initrd ${iso_dir}/boot/initrd
....
</code>

Чтоб не нагружать листинг, решил повторяющиеся или неключевые моменты изобразить условно.

Когда-то давно на livecd был граб. Но не везде граб грузился.
На самом деле не вижу никакой проблемы загрузившись ставить любой из образов. При этом в pxe держать какой-нибудь легкий CSS. В общем кому как удобно. Любое решение имеет место быть.

Незнаю как у вас с grub на liveCD, но у меня с флешкой одна проблема была - на недобуках нетбуках или очень-ОЧЕНЬ старых компах нормальное разрешение(1024x768) не отображалось. Для этого я и использую “Select resolution”

PS

Еще очень СИЛЬНАЯ сторона grub-а, это то, что можно запретить консоль-grub-а или изменять параметры запуска. Только надо еще над шаблонами для этого режима поработать
Дело в том, что сейчас загруженная по pxe система позволяет локальному юзеру слишком многое. К примеру получить root-а как на livecd.
С другой стороны - не запускается sshd, а его запуск требует ввода пароля root-а.
ИМХО - должно быть наоборот. Локального root-а по возможности подрезать, а по ssh позволить root-у логиниться по ключам(открытый ключ можно брать откуда угодно, хоть с nfs, хоть шаблонами из remote).

Небольшое добавление к вопросу о grub2 vs syslinux over pxe

Обнаружил по одной неприятной особенности каждого загрузчика:
# grub не грузится на определенных сетевухах(Atheros, некоторые realtek). Возможно просто плохо искал.
# pxelinux из состава syslinux обрезает параметры передаваемые ядру до 101-о символа.
В связи с этим конструкция calculate=lang:ru_RU,keymap:ru_RU,timezone:Europe/Chisinau,domain:<IP сервера>,domain_pw:<длинный предлиннуй пароль> обрезается.

Как, думаю, ясно из написанного выше - первую проблему я обошел задав для нужного хоста “старый” кальковский загрузчик(хорошо что не стал его удалять или переписывать)

host <проблемный хост> {
    fixed-address <его IP>;
    hardware ethernet <его MAC>;
    filename "pxelinux.0";
    option host-name "<проблемный хост>";}

Тут же option host-name

Спасибо автору этого поста за наводку.
При помощи опции option host-name в dhcpd.conf и шаблона на клиенте

$ cat /var/calculate/templates/install/1merge/dhcpcd/30-hostname 
 # Calculate format=patch path=/lib/dhcpcd/dhcpcd-hooks
<reg>\|localhost\|localhost.localdomain</reg>
<text>|localhost|calculate|calculate.local|localhost.localdomain</text>

решается проблема hostname-а загружаемой машины.

Попробуйте поставить sys-boot/calcboot-4.03.2

Mike Hiretsky wrote:

Попробуйте поставить sys-boot/calcboot-4.03.2

Это для решения какой из проблем?

Для решения второй проблемы, так как решение для первой вы нашли. Для решения первой возможно придется переходить на grub-2.0.

Alexander Tratsevskiy wrote:

Даже не знаю к какому разделу стоило отнести данный пост, так что решил писать сюда.

В блог, куда же ещё!

Ну чтож, последовал совету, продолжение эпопеи "PXE и все-все-все" таки решил выложить в блог .