23 августа 2015

Как я YaCy на Raspberry Pi 2 ставил.



YaCy - это такой распределенный поисковик на Java. Что-то вроде "Сам себе гугл". С появлением разного рода цензуры стал довольно актуальным. Мне была интересно чисто техническая часть вопроса, ну и желание занять купленную плату хоть чем-то.


В моём распоряжении была плата Raspberry Pi 2 и карта формата microSD Class 10 на 32 гигабайта.
Раздел подкачки в 128 мегабайт я вынес в zram-диск, под систему оставил раздел на 16 гигабайт, остальное место поделили между собой загрузочный раздел (128 мегабайт) и раздел под данные. Последний я как раз и решил задействовать по данные поисковика.
Для начала надо добавить в систему JDK от Oracle. Для этого надо скачать с этой страницы архив с актуальной версией JDK8. Строка с ней называется "Linux ARM v6/v7 Hard Float ABI". Архив я распаковал в каталог "/opt" и для простоты переименовал в "jdk".
Для установки самого поисковика ничего сложного делать не надо, всё уже придумано и описано здесь. В инструкции по ссылки упоминается установка OpenJDK из репозиториев Debian. Эти пункты можно смело пропускать, потому что пакет "openjdk-7-jre-headless" при проверке зависимостей всё равно будет установлен.
При установке самого пакета "yacy" будет запущен мастер первичный настройки. Среди прочих он попросит задать начальный и максимальный размер оперативной памяти, который займет java-машина. Для первого значения будет вполне достаточно 128-160 мегабайт. Экспериментальным путем я выяснил, что OOM killer не убивает процесс поисковика при задании второго значения в размере 384МБ или меньше. Оба параметра в любое время можно будет поменять в конфиге программы.
Итак, поисковик установился и возможно даже запустился, но использовать в таком виде его не будем. Сначала надо его остановить такой командой:

sudo service yacy stop

Теперь можно приступать к "оптимизациям".
Сначала я отформатировал упомянутый в начала раздел под данные в файловую систему f2fs, которая по заверениям должна максимально щадяще относиться к SD-карте:

sudo mkfs.f2fs /dev/mmcblk0p3

Если вместо форматирования появляется ругань, что команда не найдена, то надо установить пакет "f2fs-tools".
Поддержка файловой системы f2fs реализована в виде модуля, который надо до монтирования раздела загрузить и прописать в "/etc/modules":

sudo modprobe f2fs

Теперь раздел можно примонтировать в "/mnt":

sudo mount -t f2fs /dev/mmcblk0p3 /mnt

На смонтированный раздел надо перенести  содержимое каталога "/var/lib/yacy". Сам каталог при этом удалять не надо, он еще пригодится.
Далее надо позаботиться о хранение логов, которые YaCy генерирует в огромном объеме. В изначальной конфигурации создается не более 20 файлов объемом 1 мегабайт, при этом самые последние записи находятся в файле с именем "yacy00.log". Логи будут храниться на zram-диске в оперативной памяти.

Сначала надо изменить параметры загрузки модуля в "/etc/modules" на такие:

zram num_devices=2

Потом изменить правила udev для zram-дисков в файле "/etc/udev/rules.d/10-zram.rules":

KERNEL=="zram0", SUBSYSTEM=="block", DRIVER=="", ACTION=="add", ATTR{disksize}=="0", ATTR{disksize}="128M", RUN="/sbin/mkswap $env{DEVNAME}"
KERNEL=="zram1", SUBSYSTEM=="block", DRIVER=="", ACTION=="add", ATTR{disksize}=="0", ATTR{disksize}="42M", RUN="/sbin/mkfs.ext2 $env{DEVNAME}"

Первая строка отвечает за swap-диск, вторая за диск для логов. Размер взять с запасом, но памяти больше из-за этого потребляться не будет.

Теперь надо правильно прописать монтирование разделов при загрузке в файле "/etc/fstab":

/dev/zram0      none                    swap    discard           0       0
/dev/mmcblk0p3  /var/lib/yacy           f2fs    defaults          0       3
/dev/zram1      /var/lib/yacy/LOG       ext2    discard,defaults  0       0

Первой строкой подключается подкачка, второй монтируется раздел с данными YaCa, и третьей строкой монтируется диск для логов.

Наконец надо немного подправить стартовый скрипт "/etc/init.d/yacy", чтобы вместо системной Java-машины использовалась та, которую скачали, и чтобы правильно выставлялись права на каталог с логами.
Первое делается установкой переменной JAVA примерно на 43 строке:

JAVA=/opt/jdk/bin/java

Второе же реализуется примерно таким кодом на 117 строке после команды "echo -n "Starting $DESC: "":

chown yacy -R $DATA_HOME/LOG/
rm -rf $DATA_HOME/LOG/*

Осталось для верности включить запуска YaCy при загрузке:

sudo update-rc.d yacy enable
sudo update-rc.d yacy defaults

Еще надо поправить права на каталоги, иначе запуск закончится неудачно. Сначала надо смонтировать раздел с данными, потом изменить владельца:

sudo mount /var/lib/yacy
sudo chown yacy -R /usr/share/yacy
sudo chown yacy -R /var/lib/yacy

После этого можно отправить плату на перезагрузку и проверить, что всё нормально смонтировалось и запустилось.

Для zram-дисков в системном журнале должны присуствовать примерно такие записи

[    8.789057] zram: Created 2 device(s)
[    8.789754] zram0: detected capacity change from 0 to 134217728
[    8.794195] zram1: detected capacity change from 0 to 44040192
[   10.726350] Adding 131068k swap on /dev/zram0.  Priority:-1 extents:1 across:131068k SSDscFS
[   12.619215] EXT4-fs (zram1): mounting ext2 file system using the ext4 subsystem
[   12.630871] EXT4-fs (zram1): mounted filesystem without journal. Opts: discard

Так же надо проверить вывод команды "mount".
Web-интерфейс поиска должен открываться по адресу http://raspberry_pi_ip:8090