Так получилось, что в последнее время одним из каналов общения для меня стали IRC чаты. Практически сразу стало понятно, что «голый» IRC лишен некоторых удобств, к которым я так привык в скайпе, например:
- История сообщений, доступная непосредственно из окна чата
- Возможность подключаться из нескольких точек
Для решения этих проблем через некоторое время у нас в компании появилась виртуалка с IRC боунсером, и все стало гораздо лучше и удобнее. Понятно, что для компании держать виртуалку под такие цели совершенно не проблема, но как быть, если захочется завести такого зверька для личных нужд (а мне в какой-то момент захотелось)? Отбросив варианты с
Краткое описание того, на чем все собрано и о чем будет упомяунуто в статье:
- Платформа — RaspberryPi Model B (512 Mb / Ethernet).
- ОС — Raspbian.
- Особенности установки ОС — корневой раздел полностью перенесен на USB 2.0 жесткий диск, на SD карте оставлен только загрузочный раздел. Об этом, к сожалению, ни слова, но могу написать, если будет интересно.
- Боунсер — ZNC, версия 1.2.
- Особенности установки боунсера — сборка из тарбола, установка в chroot, сборка модуля modpython (modperl, modtcl по желанию).
В качестве боунсера я выбрал ZNC по следующим причинам:
- Достаточно распространенный боунсер.
- Возможность расширения функциональности за счет модулей.
- Достаточно много этих самых модулей.
- Возможность писать свои модули на python (а также perl и tcl, хотя это мне было не нужно).
- После чтения вики проекта еще одним пунктом добавилась возможность простого переноса боунсера в chroot.
Для начала я попробовал поставить ZNC на «нормальную» убунту, просто чтобы посмотреть, как оно должно выглядеть в рабочем состоянии. Все оказалось просто и понятно, так что воодушевленный этим промежуточным успехом я приступил к настройке RPi.
Первым неприятным сюрпризом стало наличие весьма древней сборки ZNC в репозиториях — кажется это была 0.206. Впрочем, это лишь укрепило мое намерение собрать ZNC из тарболла, тем более что процес хорошо описан на вики проекта.
В основном я буду приводить команды, набираемые в консоли, чтобы совсем не дублировать имеющееся и вполне годное руководство по установке. Большая часть комментариев будет только в тех местах, где будут различия с официальным документом.
Сначала надо установить необходимые пакеты для сборки:
pi@raspberrypi ~ $ sudo apt-get install build-essential pkg-config libssl-dev
Если нужно собрать модуль поддержки python, perl или tcl, потребуется установить соответствующие пакеты из списка:
- modpython — пакет python-dev.
- modperl — пакет libperl-dev.
- modtcl — пакет tcl-dev.
Мне нужен только модуль для питона:
pi@raspberrypi ~ $ sudo apt-get install python-dev
Скачиваем и распаковываем тарболл:
pi@raspberrypi ~ $ wget http://znc.in/releases/znc-1.2.tar.gz
pi@raspberrypi ~ $ tar xzvf znc-1.2.tar.gz
Создаем пользователя для запуска боунсера:
pi@raspberrypi ~ $ sudo adduser bouncer
pi@raspberrypi ~ $ sudo passwd bouncer
Создаем структуру каталогов для chroot (я буду ставить все в /opt/znc):
pi@raspberrypi ~ $ sudo mkdir /opt/znc
pi@raspberrypi ~ $ cd /opt/znc/
pi@raspberrypi /opt/znc $ sudo mkdir -p etc dev usr/lib usr/local/{share,bin,lib} lib home/bouncer
pi@raspberrypi /opt/znc $ sudo mkdir -p lib/arm-linux-gnueabihf usr/lib/arm-linux-gnueabihf
pi@raspberrypi /opt/znc $ sudo chown bouncer:bouncer home/bouncer/
pi@raspberrypi /opt/znc $ cd dev/
pi@raspberrypi /opt/znc/dev $ sudo mknod -m 644 random c 1 8
pi@raspberrypi /opt/znc/dev $ sudo mknod -m 644 urandom c 1 9
pi@raspberrypi /opt/znc/dev $ sudo mknod -m 666 null c 1 3
pi@raspberrypi /opt/znc $ sudo cp /etc/hosts etc/
pi@raspberrypi /opt/znc $ sudo cp /etc/resolv.conf etc/
pi@raspberrypi /opt/znc $ sudo cp /lib/arm-linux-gnueabihf/libnss_dns.so.2 lib/arm-linux-gnueabihf/
pi@raspberrypi /opt/znc $ sudo cp /lib/arm-linux-gnueabihf/libresolv.so.2 lib/arm-linux-gnueabihf/
pi@raspberrypi /opt/znc/dev $ cd
Конфигурируем исходники для сборки. Для сборки модулей для perl или tcl нужно добавить --enable-perl
и/или --enable-tcl
соответственно:
pi@raspberrypi ~ $ cd znc-1.2/
pi@raspberrypi ~/znc-1.2 $ ./configure --enable-python
Запускаем сборку (процесс занимает примерно 1.5-2 часа):
pi@raspberrypi ~/znc-1.2 $ make
Устанавливаем в chroot каталог. При таком способе установки (DESTDIR=/opt/znc
) все файлы сразу оказываются в указанном подкаталоге, и не затрагивают основную систему. Кроме того, мы избавляемся от необходимости копировать файлы в chroot, как предлагается в официальном документе:
pi@raspberrypi ~/znc-1.2 $ sudo DESTDIR=/opt/znc make install
Теперь нужно посмотреть, какие библиотеки необходимы для работы приложения…
pi@raspberrypi ~/znc-1.2 $ ldd /opt/znc/usr/local/bin/znc
… и скопировать их:
pi@raspberrypi ~/znc-1.2 $ cd /opt/znc/
pi@raspberrypi /opt/znc $ sudo cp /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so ./usr/lib/arm-linux-gnueabihf/libcofi_rpi.so
pi@raspberrypi /opt/znc $ sudo cp /lib/arm-linux-gnueabihf/libdl.so.2 ./lib/arm-linux-gnueabihf/libdl.so.2
pi@raspberrypi /opt/znc $ sudo cp /lib/arm-linux-gnueabihf/libz.so.1 ./lib/arm-linux-gnueabihf/libz.so.1
pi@raspberrypi /opt/znc $ sudo cp /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 ./usr/lib/arm-linux-gnueabihf/libstdc++.so.6
pi@raspberrypi /opt/znc $ sudo cp /lib/arm-linux-gnueabihf/libm.so.6 ./lib/arm-linux-gnueabihf/libm.so.6
pi@raspberrypi /opt/znc $ sudo cp /lib/arm-linux-gnueabihf/libgcc_s.so.1 ./lib/arm-linux-gnueabihf/libgcc_s.so.1
pi@raspberrypi /opt/znc $ sudo cp /lib/arm-linux-gnueabihf/libpthread.so.0 ./lib/arm-linux-gnueabihf/libpthread.so.0
pi@raspberrypi /opt/znc $ sudo cp /lib/arm-linux-gnueabihf/libc.so.6 ./lib/arm-linux-gnueabihf/libc.so.6
pi@raspberrypi /opt/znc $ sudo cp /lib/ld-linux-armhf.so.3 ./lib/ld-linux-armhf.so.3
Осталось только создать несколько симлинков на каталоги znc, чтобы боунсер можно было запускать не только из chroot, но и «как обычно». Это потребуется нам при первом запуске (чтобы создать конфигурационный файл), а также в будущем, если нужно будет запускать компиляцию модулей для ZNC.
Создаем симлинки:
pi@raspberrypi ~ $ sudo ln -sv /opt/znc/usr/local/lib/znc /usr/local/lib/
pi@raspberrypi ~ $ sudo ln -sv /opt/znc/usr/local/share/znc /usr/local/share/
pi@raspberrypi ~ $ sudo ln -sv /opt/znc/usr/local/include/znc /usr/local/include/
Прежде чем запускать боунсер, необходимо создать для него начальный конфиг и скопировать полученный конфиг в chroot каталог. Для этого становимся пользователем bouncer, переходим в домашний каталог и запускаем znc c ключом --makeconf
:
pi@raspberrypi ~ $ su bouncer
bouncer@raspberrypi /home/pi $ cd
bouncer@raspberrypi ~ $ /opt/znc/usr/local/bin/znc --makeconf
Сам процесс настройки достаточно прост благодаря весьма информативным подсказкам. По завершении настройки мы должны получить запущенный работоспособный боунсер. Продолжить настройку можно открыв веб-интерфейс боунсера (если был активирован модуль webadmin), или через IRC клиента.
Последнее, что осталось сделать — это переместить полученный конфиг в chroot и запустить боунсер уже оттуда. Кстати, не стоит редактировать конфиг файл боусера руками. Для этого рекомендуется использовать webadmin.
Сначала останавливаем боунсер. Первая команда сохранит текущую конфигурацию в конфиг файл, а вторая остановит боунсер:
bouncer@raspberrypi ~ $ pkill -SIGUSR1 znc
bouncer@raspberrypi ~ $ pkill znc
Копируем каталог с настройками в chroot:
bouncer@raspberrypi ~ $ cp -r .znc /opt/znc/home/bouncer
И запускаем уже из chroot каталога командой:
pi@raspberrypi ~ $ sudo start-stop-daemon --chroot /opt/znc/ --chuid bouncer:bouncer --start --exec /usr/local/bin/znc
Остановить боунсер можно командой:
pi@raspberrypi ~ $ sudo start-stop-daemon --chroot /opt/znc/ --chuid bouncer:bouncer --stop --exec /usr/local/bin/znc
Ну вот вроде бы и все. Для автоматического запуска боунера при старте системы можно добавить команду запуска в /etc/rc.local.
Как обычно, вопросы и комментарии приветствуются.
Ссылка на сайт проекта: ZNC
Автор: dteselkin