Pull to refresh

Как быстро запустить добровольные распределённые вычисления на сотне машин

Reading time6 min
Views14K
Работая в ИТ-подразделении, я постоянно наблюдаю простаивающие по разным организационным причинам компьютеры, которые очень скучают. Золотые времена майнинга биткойнов на CPU прошли, и в поисках нового полезного дела я пришёл к добровольным распределённым вычислениям, в частности, к World Community Grid. Первым делом поиском лекарства от рака были озадачены сервер из холодного резерва и виртуальная машина с низким приоритетом на кластере виртуализации. Сложнее с рабочими станциями, они постоянно приходят и уходят, на каждой устанавливать, настраивать, а потом удалять BOINC долго и нетехнологично.

Решено было собрать live-дистрибутив с вшитым BOINC'ом и раздавать его по сети. Включил компьютер, нажал F12, выбрал нужный пункт — и уже приносишь пользу человечеству!

Платформой был выбран Debian, который а) давно знаком и б) обладает замечательным мануалом на нужную тему. Тем не менее, без граблей не обошлось, а в данном случае почти каждые новые грабли обозначают достаточно длительную пересборку образа. Надеюсь, этот пост сэкономит некоторое количество админского времени, а заодно напомнит о существовании такого замечательного проекта, как WCG.

Заметьте, делалось всё в весьма закрытой среде, и безопасности понадобилось уделить совсем немного внимания. Возможно, в вашем случае над безопасностью нужно будет дополнительно поработать.

Подготовка


Система состоит вот из чего:
  1. Сервер сетевой загрузки.
  2. NFS-сервер
  3. Сборочная станция
У меня 2 и 3 — одна машина.

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.

Использование


  1. Включаем компьютер и выбираем загрузку по сети (обычно для этого достаточно нажать F12).
  2. В зависимости от загрузочного меню либо выбираем пункт «BOINC-live», либо просто ждём, пока загрузится по таймауту.
  3. В появившуюся (если всё пошло как надо) командную строку пишем sudo ifconfig (пароль вводить не потребуется) и записываем IP-адрес.
  4. На компьютере управления (одном из тех, что мы указали в config/includes.chroot/etc/init.d/boinc-preps) запускаем boinc-manager, нажимаем «Дополнительно — Сменить компьютер» (эта кнопка есть только в «Полном виде»). При этом BOINC не должен запрашивать никаких паролей у пользователя.
  5. После подключения появится мастер, в котором нужно будет выбрать проект (в моём случае это World Community Grid) и ввести логин/пароль.

Всё, через несколько минут появятся новые задачи в состоянии «Готово к запуску» и «Работает».
Эту процедуру нужно выполнить только один раз для каждого компьютера (точнее, для каждого MAC-адреса). Даже вернувшись к вам после длительной эксплуатации в другом месте, компьютер по MAC-адресу найдёт свои данные на NFS-сервере и продолжит работу сразу после включения (только некоторые задания будут уже просрочены, но это мелочь, получит новые).

Итоги


Что осталось нерешённым:
  • Автологин в WCG. Наверное, можно вшить в образ конфиг проекта, чтобы вообще ничего не вводить руками, но за приемлемое время решение не нагуглилось.
  • Почтовые уведомления. Чтобы не вводить «sudo ifconfig», можно автоматом отсылать админу адрес запустившегося компьютера. Однако, я этого не сделал, потому что костыли, и лучше вместо этого реализовать предыдущий пункт.
  • Два раза указан IP NFS-сервера, возможно, один из них можно убрать.
  • Для создания директории компьютера всегда используется MAC-адрес интерфейса eth0. Хорошо это или нет — я не могу с уверенностью сказать.

  • Не давайте компьютерам скучать! И пишите комментарии, с радостью отвечу или дополню статью.
Tags:
Hubs:
+12
Comments10

Articles