Работая в ИТ-подразделении, я постоянно наблюдаю простаивающие по разным организационным причинам компьютеры, которые очень скучают. Золотые времена майнинга биткойнов на CPU прошли, и в поисках нового полезного дела я пришёл к добровольным распределённым вычислениям, в частности, к World Community Grid. Первым делом поиском лекарства от рака были озадачены сервер из холодного резерва и виртуальная машина с низким приоритетом на кластере виртуализации. Сложнее с рабочими станциями, они постоянно приходят и уходят, на каждой устанавливать, настраивать, а потом удалять BOINC долго и нетехнологично.
Решено было собрать live-дистрибутив с вшитым BOINC'ом и раздавать его по сети. Включил компьютер, нажал F12, выбрал нужный пункт — и уже приносишь пользу человечеству!
Платформой был выбран Debian, который а) давно знаком и б) обладает замечательным мануалом на нужную тему. Тем не менее, без граблей не обошлось, а в данном случае почти каждые новые грабли обозначают достаточно длительную пересборку образа. Надеюсь, этот пост сэкономит некоторое количество админского времени, а заодно напомнит о существовании такого замечательного проекта, как WCG.
Заметьте, делалось всё в весьма закрытой среде, и безопасности понадобилось уделить совсем немного внимания. Возможно, в вашем случае над безопасностью нужно будет дополнительно поработать.
Система состоит вот из чего:
1. Сервер сетевой загрузки. У меня всё уже было готово, настроенные TFTP и DHCP у меня остались от проекта по тонким клиентам. Если у вас нет, то поднять новый несложно. В двух словах, устанавливаем и запускаем tftpd-hpa, а в DHCP указываем параметры 66 и 67. Только не давайте загружаться по сети кому попало (в моём случае это курсанты), это может быть опасно. Кроме BIOS, запаролить можно часть загрузочного меню TFTP-сервера.
2. NFS-сервер. Во-первых, BOINC должен иметь возможность в процессе работы сохранять свои данные. Предполагается, что локальный жёсткий диск трогать нельзя, поэтому по NFS разрешим писать в директорию, например,
В
после чего перезапускаем сервис (почему-то рекомендуемый
3. Сборочная станция. Это просто виртуальная машина с обычным Debian Wheezy. Установлен пакет
Отправляемся на сборочную станцию.
Создаём базовый конфиг для нашего дистрибутива, указав адрес NFS-сервера:
Формируется некоторое дерево директорий, располагая в них разный контент можно кастомизировать свою сборку. Мы добавим следующее:
1.
2.
3.
После добавления нужных настроек запускаем собственно сборку:
Ценность для нас представляет получившийся файл
Он распакуется в
Содержимое
Теперь всё лежит на своих местах.
Если после сборки хочется проверить содержимое корневой ФС, то не обязательно загружаться с нею, её можно просто смонтировать как loop-устройство:
Если нужно пересобрать дистрибутив с новыми параметрами, то перед этим можно сделать либо
Всё, через несколько минут появятся новые задачи в состоянии «Готово к запуску» и «Работает».
Эту процедуру нужно выполнить только один раз для каждого компьютера (точнее, для каждого MAC-адреса). Даже вернувшись к вам после длительной эксплуатации в другом месте, компьютер по MAC-адресу найдёт свои данные на NFS-сервере и продолжит работу сразу после включения (только некоторые задания будут уже просрочены, но это мелочь, получит новые).
Что осталось нерешённым:
Решено было собрать live-дистрибутив с вшитым BOINC'ом и раздавать его по сети. Включил компьютер, нажал F12, выбрал нужный пункт — и уже приносишь пользу человечеству!
Платформой был выбран Debian, который а) давно знаком и б) обладает замечательным мануалом на нужную тему. Тем не менее, без граблей не обошлось, а в данном случае почти каждые новые грабли обозначают достаточно длительную пересборку образа. Надеюсь, этот пост сэкономит некоторое количество админского времени, а заодно напомнит о существовании такого замечательного проекта, как WCG.
Заметьте, делалось всё в весьма закрытой среде, и безопасности понадобилось уделить совсем немного внимания. Возможно, в вашем случае над безопасностью нужно будет дополнительно поработать.
Подготовка
Система состоит вот из чего:
- Сервер сетевой загрузки.
- NFS-сервер
- Сборочная станция
1. Сервер сетевой загрузки. У меня всё уже было готово, настроенные TFTP и DHCP у меня остались от проекта по тонким клиентам. Если у вас нет, то поднять новый несложно. В двух словах, устанавливаем и запускаем tftpd-hpa, а в DHCP указываем параметры 66 и 67. Только не давайте загружаться по сети кому попало (в моём случае это курсанты), это может быть опасно. Кроме BIOS, запаролить можно часть загрузочного меню TFTP-сервера.
2. NFS-сервер. Во-первых, BOINC должен иметь возможность в процессе работы сохранять свои данные. Предполагается, что локальный жёсткий диск трогать нельзя, поэтому по NFS разрешим писать в директорию, например,
/srv/boinc-nfs
. Здесь каждый компьютер будет создавать поддиректорию с именем, совпадающим с его MAC-адресом. Во-вторых, в директории /srv/debian-live
будет лежать корневая ФС для сетевой загрузки. Итак:mkdir /srv/debian-live
mkdir /srv/boinc-nfs
chown nobody:nogroup /srv/boinc-nfs
chmod 755 /srv/boinc-nfs
В
/etc/exports
дописываем:/srv/boinc-nfs *(rw,sync,no_root_squash,no_subtree_check)
/srv/debian-live *(ro,async,no_root_squash,no_subtree_check)
после чего перезапускаем сервис (почему-то рекомендуемый
exportfs -rv
мне результата не дал):/etc/init.d/nfs-kernel-server restart
3. Сборочная станция. Это просто виртуальная машина с обычным Debian Wheezy. Установлен пакет
live-build
, который и будет делать основную работу. Здесь должен быть интернет.Процесс сборки
Отправляемся на сборочную станцию.
mkdir /srv/live-default && cd /srv/live-default
Создаём базовый конфиг для нашего дистрибутива, указав адрес NFS-сервера:
lb config -b netboot --net-root-path "/srv/debian-live" --net-root-server "192.168.15.20"
Формируется некоторое дерево директорий, располагая в них разный контент можно кастомизировать свою сборку. Мы добавим следующее:
1.
config/package-lists/boinc.list
— список пакетов, которые понадобятся в нашей сборке. Пишем в него:boinc-client
nfs-common
2.
config/includes.chroot/etc/init.d/boinc-preps
— init-скрипт, который будет монтировать NFS, настраивать BOINC и менять hostname (возможно, одинаковые хостнеймы мешают WCG идентифицировать компьютер, с ними у меня многие задания переходили в состояние detached). В этот скрипт нужно вставить адрес своего NFS и адреса хостов, с которых будет разрешено беспарольное управление. Содержимое скрипта:#!/bin/bash
### BEGIN INIT INFO
# Provides: boinc-preps
# Required-Start: nfs-common
# Required-Stop:
# Should-Start:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Various stuff for BOINC
# Description: Various stuff for BOINC
### END INIT INFO
PATH=/sbin:/usr/sbin:/bin:/usr/bin
. /lib/init/vars.sh
do_start () {
MYMAC=`ifconfig eth0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}' | sed s/://g`
ancien=`hostname`
nouveau=DYNWCG-$MYMAC
mkdir -p /mnt/boinc-nfs
mount 192.168.15.20:/srv/boinc-nfs /mnt/boinc-nfs && mkdir -p /mnt/boinc-nfs/$MYMAC
service boinc stop
sed -i "s/^BOINC_DIR=.*/BOINC_DIR=\/mnt\/boinc-nfs\/$MYMAC/;s/^BOINC_USER=.*/BOINC_USER=\"root\"/" /etc/default/boinc-client
echo "192.168.10.60" > /mnt/boinc-nfs/$MYMAC/remote_hosts.cfg
echo "192.168.10.61" >> /mnt/boinc-nfs/$MYMAC/remote_hosts.cfg
echo "" >> /mnt/boinc-nfs/$MYMAC/gui_rpc_auth.cfg
for file in \
/etc/hostname \
/etc/hosts
# сюда можно добавить
#/etc/ssh/ssh_host_rsa_key.pub \
#/etc/ssh/ssh_host_dsa_key.pub \
# если нужен SSH
do
[ -f $file ] && sed -i.old -e "s:$ancien:$nouveau:g" $file
done
invoke-rc.d hostname.sh start
invoke-rc.d networking force-reload
service boinc start
}
case "$1" in
start|"")
do_start
;;
restart|reload|force-reload|status)
echo "Error: argument '$1' not supported" >&2
exit 3
;;
stop)
# NOP
exit 3
;;
*)
echo "Usage: ... [start|stop]" >&2
exit 3
;;
esac
:
3.
config/hooks/boinc-preps-init.chroot
— скрипт из одной команды, который выполнится при сборке и добавит boinc-preps
из предыдущего пункта в автозагрузку:#!/bin/sh
update-rc.d boinc-preps defaults
После добавления нужных настроек запускаем собственно сборку:
lb build
Ценность для нас представляет получившийся файл
binary.netboot.tar
. Распакуем его в /srv
:cd /srv && tar -xvf live-default/binary.netboot.tar
Он распакуется в
/srv/debian-live
(корневая ФС для сетевой загрузки) и /srv/tftpboot
(файлы для TFTP-сервера). В моём случае сборочная станция и NFS-сервер — это один компьютер, поэтому /srv/debian-live
уже находится на своём месте.Содержимое
tftpboot
— готовое загрузочное меню, его нужно разместить на TFTP-сервере. Его работу я не проверял, так как у меня есть работающий TFTP-сервер со своим меню, и отсюда мне понадобилась лишь часть данных. Во-первых, я скопировал все файлы из tftpboot/live/
на TFTP-сервер в images/debian-live/
(относительно корневой директории TFTP-сервера). Во-вторых, из tftpboot/live.cfg
я позаимствовал текст, добавляющий новый пункт меню, при этом изменив его до такого состояния (здесь тоже нужно указать адрес своего NFS-сервера):label live-686-pae
menu label BOINC-live (686-pae)
linux images/debian-live/vmlinuz1
initrd images/debian-live/initrd1.img
append boot=live config nosplash root=/dev/nfs nfsroot=192.168.15.20:/srv/debian-live
Теперь всё лежит на своих местах.
Если после сборки хочется проверить содержимое корневой ФС, то не обязательно загружаться с нею, её можно просто смонтировать как loop-устройство:
mount -o loop,ro /srv/debian-live/live/filesystem.squashfs /mnt/squash/
Если нужно пересобрать дистрибутив с новыми параметрами, то перед этим можно сделать либо
lb clean --binary
, либо lb clean
.Использование
- Включаем компьютер и выбираем загрузку по сети (обычно для этого достаточно нажать F12).
- В зависимости от загрузочного меню либо выбираем пункт «BOINC-live», либо просто ждём, пока загрузится по таймауту.
- В появившуюся (если всё пошло как надо) командную строку пишем
sudo ifconfig
(пароль вводить не потребуется) и записываем IP-адрес. - На компьютере управления (одном из тех, что мы указали в
config/includes.chroot/etc/init.d/boinc-preps
) запускаем boinc-manager, нажимаем «Дополнительно — Сменить компьютер» (эта кнопка есть только в «Полном виде»). При этом BOINC не должен запрашивать никаких паролей у пользователя. - После подключения появится мастер, в котором нужно будет выбрать проект (в моём случае это World Community Grid) и ввести логин/пароль.
Всё, через несколько минут появятся новые задачи в состоянии «Готово к запуску» и «Работает».
Эту процедуру нужно выполнить только один раз для каждого компьютера (точнее, для каждого MAC-адреса). Даже вернувшись к вам после длительной эксплуатации в другом месте, компьютер по MAC-адресу найдёт свои данные на NFS-сервере и продолжит работу сразу после включения (только некоторые задания будут уже просрочены, но это мелочь, получит новые).
Итоги
Что осталось нерешённым:
- Автологин в WCG. Наверное, можно вшить в образ конфиг проекта, чтобы вообще ничего не вводить руками, но за приемлемое время решение не нагуглилось.
- Почтовые уведомления. Чтобы не вводить «sudo ifconfig», можно автоматом отсылать админу адрес запустившегося компьютера. Однако, я этого не сделал, потому что костыли, и лучше вместо этого реализовать предыдущий пункт.
- Два раза указан IP NFS-сервера, возможно, один из них можно убрать.
- Для создания директории компьютера всегда используется MAC-адрес интерфейса eth0. Хорошо это или нет — я не могу с уверенностью сказать.
Не давайте компьютерам скучать! И пишите комментарии, с радостью отвечу или дополню статью.