Как быстро запустить добровольные распределённые вычисления на сотне машин
Работая в ИТ-подразделении, я постоянно наблюдаю простаивающие по разным организационным причинам компьютеры, которые очень скучают. Золотые времена майнинга биткойнов на CPU прошли, и в поисках нового полезного дела я пришёл к добровольным распределённым вычислениям, в частности, к World Community Grid. Первым делом поиском лекарства от рака были озадачены сервер из холодного резерва и виртуальная машина с низким приоритетом на кластере виртуализации. Сложнее с рабочими станциями, они постоянно приходят и уходят, на каждой устанавливать, настраивать, а потом удалять BOINC долго и нетехнологично.Решено было собрать live-дистрибутив с вшитым BOINC’ом и раздавать его по сети. Включил компьютер, нажал F12, выбрал нужный пункт — и уже приносишь пользу человечеству! Платформой был выбран Debian, который а) давно знаком и б) обладает замечательным мануалом на нужную тему. Тем не менее, без граблей не обошлось, а в данном случае почти каждые новые грабли обозначают достаточно длительную пересборку образа. Надеюсь, этот пост сэкономит некоторое количество админского времени, а заодно напомнит о существовании такого замечательного проекта, как WCG.
Заметьте, делалось всё в весьма закрытой среде, и безопасности понадобилось уделить совсем немного внимания. Возможно, в вашем случае над безопасностью нужно будет дополнительно поработать.
ПодготовкаСистема состоит вот из чего: Сервер сетевой загрузки. NFS-сервер Сборочная станция У меня 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.Использование Включаем компьютер и выбираем загрузку по сети (обычно для этого достаточно нажать 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. Хорошо это или нет — я не могу с уверенностью сказать. Не давайте компьютерам скучать! И пишите комментарии, с радостью отвечу или дополню статью.