2019
25 августа, 21:43

Вы всё ещё не чистите строки в JS? Тогда мы идём к вам!

Интересная особенность движка V8 (это который в Chrome), из-за которой нужно быть осторожнее при разработке дополнений или "долгоживущих" сайтов, иначе можно получить утечку памяти. Зависит от объёма данных и продолжительности работы приложения, конечно.

24 июня, 18:14

Стала доступна бета-версия S.T.A.L.K.E.R. Зов припяти на движке OpenXRay

https://www.linux.org.ru/news/games/15070064, https://github.com/OpenXRay/xray-16

Лучше бы SoC =( Но всё равно большие молодцы, что допилили и портировали движок.

17 марта, 13:44
Что такое IITC-CE

Для телеграм-канала Инвестигейт по-русски рассказал о запущенном мной проекте IITC-CE, где являюсь одним из разработчиков. Если вкратце, то это карта для многопользовательской онлайн-игры с дополненной реальностью Ingress, а если подробнее, то вот...

(перепечатка статьи с платформы teletype)

Рассказывает разработчик проекта, агент modos189, Белгород.

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

Так могло продолжаться ещё долгое время, однако в один прекрасный день вышел Ingress Prime. Niantic Labs изменила адрес к карте Intel, поэтому агентам приходилось либо самим вносить правки в адрес, либо использовать чьи-то сборки.

В 2019 году, после завершения перехода на новую версию сканера Niantic Labs обещает заняться Intel, и тогда старый IITC совсем перестанет работать. Именно потому я решил самостоятельно заняться поддержкой проекта и запустил проект IITC Community Edition.

Довольно быстро стали приходить первые отзывы, а иные люди и сами подключились к разработке. По итогу я принял часть внутренних изменений, предложенных различными разработчиками, не считая моих собственных улучшений. Особо хочется выделить вклад MikeLambert (агент, Санкт-Петербург), а также johnd0e и McBen с гитхаба, все они внесли значительный вклад в проект.

На данный момент, в основном, изменения касаются внутренних частей IITC (обновлены сторонние библиотеки, повышена производительность, исправлены некоторые баги), но есть и более заметные отличия. Например, мобильное приложение получило материальный дизайн, снова работает плагин синхронизации данных между устройствами пользователя, добавлены новые карты, появилась возможность перейти к порталу по нажатию на кнопку рядом с названием портала в окне информации (а также возможность использовать draw tools с мобильных телефонов, что особенно радует, как пользователя — прим. редакции).

Из планов на ближайшее будущее — рассмотреть и принять изменения в плагинах, которые накопились за время отсутствия поддержки проекта. Например, там предложили плагины, позволяющие подсвечивать порталы, которые легко сбить с дороги (удобно для планирования ферм), или копировать разом название и ссылку на портал для расшаривания в чатики. Рассматриваю создание отдельного дополнения IITC для браузеров, что должно упростить установку модификации. Ну и надо исправить оставшиеся баги.

На чуть более дальнее будущее — хочется обновить визуальный вид IITC. В нашем местном комьюнити это было очень хорошо принято, и агенты даже нарисовали несколько довольно красивых макетов того, как они видят IITC (один из которых от InexCode изображён ниже — прим. редакции). Также хочется добавить переводы на другие языки, это поможет понизить порог входа для пользователей.

Что касается сторонних плагинов, на данный момент они продолжают поддерживаться, однако если при работе используются устаревшие, ныне удалённые возможности сторонних библиотек Leaflet или jQuery, то потребуется их обновить на новые версии библиотек. Об этом можно найти информацию в интернете. Но, безусловно, когда-то совместимость будет поломана (например, в результате глобального обновления дизайна), и в этом случае в репозитории будет описан процесс обновления плагинов.

Так же, как и старый IITC, новый никуда не рапортует об используемых пользователем плагинах, потому можно не бояться запускать секурные плагины фракций. Прогресс разработки полностью открыт на гитхабе, а новости проекта можно читать либо на сайте, либо на канале IITC News.

20!8
09 августа, 18:39

Иногда мне приходится набирать кавы́чки−ё́лочки «», и́ли дли́нное тире́ —. Оказалось, существует таинственный третий уровень клавиатуры (и даже больше уровней), позволяющий легко вводить спецсимволы. Даже заучивать числа не нужно.

Что касается моего любимого KDE, эта магия включается в Настройках клавиатуры и раскладок — нужно лишь назначить функциональную клавишу для переключения на третий уровень.

Важно: чтобы всё заработало, необходимо там же, в пункте "Разные параметры совместимости" установить флаг на "Включить дополнительные типографские символы".

23 июня, 22:30
NVIDIA Optimus без Bumblebee на Debian

Ранее я уже писал пост об установке Bumblebee, чтобы дискретная карта использовалась только для тяжелых задач, типа игр.

Плюсы: для обычных задач расходуется значительно меньше энергии, продлевая работу от батареи, ноутбук немного меньше греется.

Минусы: необходимо менять параметры запуска, вручную указывая ключевое слово optirun для нужных приложений, ну и могут возникать различные проблемы.

Например, после использования дискретной карты ноутбук может с какой-то вероятностью не выйти из спящего режима, или не суметь снова запустить карту. Или, как в моём случае, после очередного обновления current версия видеодрайвера отказалась работать, только legacy, хотя моя видеокарта (nvidia geforce 840m) ещё поддерживается.

Поэтому, раз аккумулятор уже старый и в автономном режиме ноут работает не дольше 10 минут, я решил отказаться от bumblebee, задействовав дискретную карту на постоянной основе.

Впринципе, способ уже описан в Debian wiki, но там неполная статья и на английском, потому решил сюда написать инструкцию.

1. Убедимся, что установлен пакет x11-xserver-utils

apt install x11-xserver-utils

2. Устанавливаем проприетарный видеодрайвер

apt install nvidia-driver

Или какой-то из разряда nvidia-legacy-???-driver. Если не уверены, какой нужен, утилита nvidia-detect подскажет.

3. Дальше необходимо создать файл /etc/X11/xorg.conf, в который поместить конфигурацию:

Section "Module"
    Load "modesetting"
EndSection

Section "Device"
    Identifier "nvidia"
    Driver "nvidia"
    BusID "PCI:X:Y:Z"
    Option "AllowEmptyInitialConfiguration"
EndSection

где параметры для BusID можно получить из вывода

lspci | grep -E "VGA|3D"

Например, у меня вывод:

04:00.0 3D controller: NVIDIA Corporation GM108M [GeForce 840M] (rev a2)

значит, BusID "PCI:4:0:0"

4. Так как у меня KDE, то используется экранный менеджер SDDM (аналогично и в LXQt), поэтому добавил в файл /usr/share/sddm/scripts/Xsetup строки:

xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto
xrandr --dpi 96

чтобы при запуске SDDM начинала использоваться дискретная карта вместо интегрированной.

Готово, вы прекрасны!

Для других экранных менеджеров, или в случае проблем можно почитать статью на arch wiki, там больше информации, чем в дебиановской.

13 июня, 17:58
Как найти пакет с отсутствующей библиотекой

При установке программ из пакетов пакетного менеджера, или устанавливая программу с помощью Flatpak, все зависимости устанавливаются автоматически, но при запуске программы с каких-нибудь торрентов, каких-то необходимых библиотек может не оказаться в системе.

Спасибо пользователю chibiko c rutracker за инструкцию, как легко найти необходимый пакет в Debian-like системах.

1) Устанавливаем apt-file:

sudo apt-get install apt-file

2) Обновляем его списки пакетов:

sudo apt-file update

3) И ищем нужные библиотеки:

sudo apt-file search libSDL2_image-2.0.so.0
libsdl2-image-2.0-0: /usr/lib/x86_64-linux-gnu/libSDL2_image-2.0.so.0
libsdl2-image-2.0-0: /usr/lib/x86_64-linux-gnu/libSDL2_image-2.0.so.0.0.0

Теперь нам стало ясно, что пакет, который нам нужен = libsdl2-image-2.0-0.

08 июня, 16:18

Написал на хабр своё мнение о существующих мессенджерах и то, как я вижу идеальный мессенджер. Кому интересно - велком.

11 марта, 23:59
Немного графиков про графики

Многие помнят о графиках, показывающих фальсификации на российских выборах 2011-2012-х годов, так вот, после просмотра замечательного эфира программы Облако про математику выборов, с Сергеем Шпилькиным в гостях, мне захотелось это повторить, но только в пределах своей, Белгородской области.

Код программы, который формировал данные для графиков Сергей в передаче я не нашёл, однако нашёл похожий репозиторий, который, впринципе, делал то же самое.

Просто так запустить не получилось. Толи код не полный, толи внесены какие-то изменения в сайт избиркома, что оно прежним образом не парсится, вобщем оставил только визуализацию, а загрузку участков полностью переписал. Удалось получить следующий график распределения голосов в зависимости от явки для Белгородской области на выборах в госдуму 2016 года:

Как оказалось позже, эти данные слегка неточны (например, для подсчёта явки не берутся в рассчёт бюллютени из надомного голосования) и некоторые участки отсутствуют, но общую тенденцию это не меняет.

Тогда мне захотелось посмотреть, какие номера у участков, которые отображаются, и вообще неплохо бы и их адреса иметь, а возможности того решения это не позволяли, потому приступил к созданию своего сервиса.

При выборе технологий возник большой вопрос: так как посмотреть статистику по своему городу может быть интересно многим, но при этом недостаточно интересно, чтобы устанавливать приложение, необходимо делать web приложение. А раз web, то писать тонны джаваскрипта? Нет уж, увольте.

К счастью, нашёл библиотеку Dash для Python, который позволяет html страницу и логику описать на Python, а страница будет сама сформирована, с использованием ReactJS. Страница составляется из готовых блоков, если их не хватает, можно и свои добавить. Dash предоставляет реактивный декоратор для управления данными страницы в стиле событий: например, меняется значение в поле, это приводит к вызову привязанной функции, которая какой-то вычисленный результат возвращает, скажем, в заголовок. В итоге, из собственноручно написанного js кода там присутствует только всплывающее окно с помощью по использованию сервиса.

Также следовало выбрать, какую базу данных использовать. Пока мы живём не в Северной Корее, в каждых выборах меняются кандидаты, а как следствие, и столбцы в базе данных. Создавать по собственной таблице в MySQL для каждых выборов? Возможно, и имело смысл, пренебрежа и повторением названием названий городов, номеров и адресов УИКов в каждой таблице, или как-то хитро их выносить в отдельную таблицу и всё это не менее хитро объёдинять при выводе, но решил попробовать NoSQL решение MongoDB, о которой так много слышал восторженных гласов, о чём и не жадею.

Как минимум, в случае использования MySQL пришлось бы искать хороший ORM, ведь вручную работать с БД не особо хочется, а MongoDB предоставляет интерфейс управления, до которому любому ORM ещё расти и расти. Но вообще понравился подход, в котором не нужно заморачиваться со столбцами, и приводить структуру к третьей нормальной форме - напротив, здесь рекомендуется дублирование информации в каких-то случаях, где благодаря этому удобнее работать с базой данных.

Вобщем так я за полтора месяца создал сервис, который делает всё, что я хотел - можно посмотреть результаты на участках любой территори для любых (пока доступны 3) выборах, формируются 3 наиболее важных графика зависимости различных параметров от явки и даже показываются адреса УИКов. Адреса я парсил не сам, а воспользовался готовой базой данных, которую выкачали ребята с GIS-Lab. Исходники я выложил на gitlab, только там слегка устаревшая версия - обновлю в ближайшее время, нужно исправить метод хранения данных о результатах выборов, т.к. вручную я это сделал и web приложение с этим работает, а парсер пока сохраняет в устаревшем виде.

На днях выложил сервис на сервере, по адресу cikinfo.modos189.ru, а сегодня я накатил обновление, где внес изменения в дизайне, чтобы всё выглядело понятно и красиво, исправил небольшие баги и добавил окно с помощью по использованию сайта, ибо по первым тестам заметил, что стороннему человеку сперва не совсем понятно, как всем этим пользоваться.

Ближе к вечеру паблик Сатира Без Позитива опубликовал пост со ссылкой на сервис, и оказалось, что я напрасно боялся даже 450 одновременных подключений. Нет, не потому, что их не было, а потому что нагрузка от них была почти незаметна.

Как видно, эта нагрузка на уровне нагрузки от создания бэкапа, несмотря на то, что активно используется база данных.

Жаль только, что пакет unattended-upgrades, который должен был бороться со злом, решил примкнуть к нему и удалил мне один из пакетов php, который был ответственен за графику, из-за чего мой блог некоторое время лежал, но уже всё работает и я не волнуюсь, что сервис без проблем выдержит и тысячи одновременных подключений.

Следующий важный шаг - анализ предстоящих выборов 18 марта. В этот день я буду наблюдателем на участке, потому не получится сделать вывод в реальном времени данных о явке на участках, но зато будет анализ данных уже после подведения итогов.

Этот пост немного сумбурный, написал его как небольшой отчёт за сегодня, хотелось поделиться этой информацией, заодно вспомнил, с чего всё начиналось.

Также я опубликовал подробную статью с анализом выборов на хабре, рекомендую заглянуть и туда, чекнуть комментарии, они весьма полезные: Анализ результатов президентских выборов 2018 года. На федеральном и региональном уровне

14 января, 15:34
О том, как я переизобретал медиацентр

Это перепечатка моей статьи на хабре, так что рекомендую заглянуть и туда, чекнуть комментарии.

С приобретением нового телевизора возник вопрос, какую приставку для него брать. Возможностей Chromecast уже не хватало и хотелось полноценный медиацентр на Kodi. Телевизор со SmartTV покупать не вариант — Kodi можно установить только на Android (из SmartTV платформ), а к нему я отношусь без особой любви, к тому же он уже внутри телевизора, а не в отдельной коробке, которую можно безбоязненно перепрошивать. Ну а зачем мне полноразмерный Android, со всеми его сервисами и программами в виртуальной машине, без полноценного GNU/Linux окружения и, скорее всего, без обновлений? По той же причине также были отметены многочисленные готовые медиацентры на Android, хотя та же приставка от Xiaomi довольно хороша. Можно было бы подумать насчёт SmartTV на TizenOS, но для него нет Kodi.

С такими требованиями, и при том, что это мой первый одноплатный компьютер, очевиден выбор — Raspberry Pi, а конкретно я взял RPi 3 model B.

Установка и предварительная настройка Raspbian

Как пользователь Debian, я сразу же установил Raspbian и начал играться с новой системой. Записать скачанный образ системы можно с помощью программы Etcher, либо из консоли:

Сначала очищаем содержимое карты, всё заполнив нулями…

sudo dd if=/dev/zero of=/dev/mmcblk0 bs=512 count=2047

затем записываем образ…

sudo dd if=/path/to/raspbian.img of=/dev/mmcblk0

Запустив малинку с Raspbian установить Kodi очень просто — командой

sudo apt update && sudo apt install kodi

Чтобы медиацентр запускался при включении малинки необходимо добавить в файл /home/pi/.config/lxsession/LXDE-pi/autostart строку

@kodi -fs

Несмотря на всю прелесть Raspberry Pi, у него есть один важный недостаток: при внезапном отключении питания есть вероятность того, что на SD карту успеет перезаписаться только часть данных, а потому карты памяти долго не живут и, в среднем, через год выходят из строя. На рынке существуют решения, которые решают эту проблему с помощью источника дополнительной энергии (например, конденсатора). Также SD карты имеют ограниченное количество циклов перезаписи и важно уменьшить количество этих самых перезаписей, чтобы карта памяти прослужила дольше.

Удаление нежелательных программ

Удалил dphys-swapfile, чтобы с концами удалить своп-файл, который расходует ресурс карты памяти, а также удалил разные игрушки и совсем лишние программы, по крайней мере, для меня.

sudo apt purge dphys-swapfile wolfram-engine logrotate nodejs nodered minecraft-pi oracle-java8-jdk openjdk-7-jre oracle-java7-jdk openjdk-8-jre

sudo apt autoremove --purge

Замена менеджера логов

Также я сменил сервис для записи логов:

sudo apt install busybox-syslogd
sudo dpkg --purge rsyslog

Теперь логи записываются в кольцевой буфер, расположенный в ОЗУ, смотреть их можно командой logread

Увеличение надёжности при отключении питания

Самый логичный шаг — сделать раздел с системой доступным только для чтения, и тогда по определению не будет проблем при записи, ведь записи не будет. Но Raspbian — это полноценная система, которая не может работать на разделе, на котором полностью запрещена запись. Как минимум, необходимо вынести /var/log, /var/tmp и /tmp в tmpfs, т. е. хранить содержимое этих папок в ОЗУ. Но для практического использования необходимо внести значительно больше изменений.

Я решил сделать по-другому: создать многослойную файловую систему, где основу, хранящуюся на карте памяти, держать как read-only, а все изменения, которые производятся в системе, сохранять в оперативной памяти. Соответственно, все изменения сбрасываются при отключении питания и никому не вредят. Подход не новый, часто применяется в роутерах, например, а с помощью overlayfs очень легко реализуется.

На гиктаймс уже публиковалась ссылка на аналогичное решение с использованием UnionFS, но с момента его публикации в ядро линукс была добавлена поддержка файловой системы OverlayFS, разработанной компанией SUSE в качестве более прогрессивной замены UnionFS и AUFS, поэтому и настраивается всё это немного по-другому.

Я нашёл скрипт, который делает именно то, что я задумал: раздел системы на карте памяти монтирует в режиме только чтение, а все изменения сохраняются в верхнем слое, располагаемом в ОЗУ. К слову, этот скрипт поддерживает и AUFS.

Установка довольно проста:

  1. Создаём файл root-ro в папке /etc/initramfs-tools/scripts/init-bottom/, в который кладём содержимое скрипта
    cd /etc/initramfs-tools/scripts/init-bottom && sudo wget https://gist.github.com/sbonfert/7044eced553ea5c5c2346bcde6bb12e7/raw/7ef62bd5553faae1cb2d2eb79d84dde5197e8c56/root-ro 
  2. Изменяем права доступа к скрипту:
    sudo chmod 0755 /etc/initramfs-tools/scripts/init-bottom/root-ro
  3. Добавляем overlay в список модулей, которые будут подгружаться в initramfs
    sudo echo "overlay" >> /etc/initramfs-tools/modules 
  4. Пересоздаём initramfs образ:
    mkinitramfs -o /boot/initrd
  5. Осталось добавить параметр root-ro-driver=overlay в загрузчик, в файл /boot/cmdline.txt  
  6. И ещё 3 строки в конфигурацию загрузчика по адресу /boot/config.txt:
    initramfs initrd followkernel
    ramfsfile=initrd
    ramfsaddr=-1

Отключить режим только чтения, кстати, можно либо добавлением disable-root-ro=true в /boot/cmdline.txt, либо созданием файла disable-root-ro в корне файловой системы.

В Debian (соответсвенно, и в Raspbian) существует пакет bilibop-lockfs, который делает примерно то же, что и этот скрипт. Однако, несмотря на то, что bilibop доступен для установки, он предназначен для работы совместно с GRUB, а не используемого в Raspbian загрузчика. В x86 версии Raspbian он корректно работает. Возможно, читатели смогут его пропатчить и для Raspberry Pi.

Защита от переполнения файловой системы в памяти

Для tmpfs по-умолчанию отводится половина объёма ОЗУ, и так как как память ограничена, то когда-то изменения корневой файловой системы достигнут предела. Очистить её можно простой перезагрузкой системы, для этого в /etc/crontab добавляем строку:

# Когда место в корневой файловой системе закончится (100%) перезагрузить систему. 
* * * * * root /bin/df -h | /bin/grep /$ | /usr/bin/awk '{if ($5=="100%") system ("/sbin/shutdown -r now")}'

и перезапускаем cron

sudo service cron restart

это позволит отреагировать на проблему в течение одной минуты.

Корни отдельно, хомяки отдельно

Использовал какое-то время такую конфигурацию, но надоело терять настройки и плагины в Kodi, а заранее всё не настроить, и решил я корневую систему оставить в режиме только чтения, а домашнюю папку хранить как есть, всё таки в ней производится не так много изменений.

Естественно, тогда и раздел должен быть под F2FS — оптимизированной для SSD и прочих flash накопителей файловой системе. Как уже сказано, у карт памяти есть две беды: вероятность потерять часть данных при записи и относительно малое количество поддерживаемых перезаписей ячейки. F2FS относится к файловым системам, которые используют концепцию копирования при записи (Copy-On-Write), то есть новые данные не перезаписываются в те же ячейки, а записываются в новое место, и только если операция завершена успешно, ссылка на старую область носителя удаляется.

Для работы с F2FS необходимо установить пакет f2fs-tools как в нашей raspberry pi, так и в системе, с помощью которой производится создание нового раздела. Для Debian-like (в том числе, Raspbian) необходимо выполнить команду

sudo apt install f2fs-tools

Отрезал половину с помощью GParted, создал F2FS раздел и заодно дал метку home, чтобы удобнее обращаться к разделу.

После этого внёс изменения в /etc/fstab, добавив строку

LABEL=home /home f2fs rw,noatime,defaults 0 1

Всё хорошо, но как теперь ставить обновления?

Это я тоже продумал, вспомнив о проекте Ubuntu Core Snappy. В нём предусмотрено существование 2-х разделов, доступных на чтение всем остальным. Обновление системы атомарно записывается на неактивный раздел и производится перезагрузка системы, уже используя обновлённый раздел. Эти два раздела System-a/b также позволяют производить механизм отката на рабочую версию в случае проблем в обновлении.

Аналогично сделал и я, разбив системный раздел на 2 равных раздела. Предварительно, конечно, скопировав данные с карты памяти на компьютер. Для этого удобно использовать утилиту копирования файлов rsync. Например:

sudo rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/var/backups/*","/var/cache/apt/*","/var/lock/*","/var/tmp/*","/lost+found", "/home"} /media/user/folder /home/user/backup_raspbian

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

  • -aAXv – Файлы передаются в режиме «архив», который гарантирует, что символические ссылки, устройство, разрешение, владение, время изменения, списки контроля доступа, а также расширенные атрибуты сохраняются.
  • --exclude – Исключает данные каталоги из резервной копии.
  • /media/user/folder – Исходный каталог.
  • /home/user/backup_raspbian – Это папка назначения резервной копии.

Итого я получил 4 раздела, где первый содержит загрузчик, два следующих — идентичные по размеру и содержат копию файловой системы (для удобства я их назвал root1fs и root2fs соответственно), и в последнем разделе — пользовательские данные.

Осталось обратно скопировать резервную копию с компьютера на оба раздела карты памяти и прописать изменения в fstab и загрузчике.

В разделе root1fs в файле /etc/fstab в строке, в которой монтируется корень меняем строку на

LABEL=root1fs / ext4 defaults,noatime 0 1

а в разделе root2fs соответственно на root2fs

Осталось внести изменения в /boot/cmdline.txt
Надо там найти параметр root=PARTUUID=… и заменить на root=LABEL=root1fs или root=LABEL=root2fs, от этого будет зависеть, с какого раздела производится загрузка.

Приготовления окончены, теперь можно провести первое обновление системы. На компьютере, где мы сохранили бэкап, нужно установить пакеты proot и qemu-system. Для Debian-like:

sudo apt install proot qemu-system

Теперь можем сделать чрут в сохранённый бэкап...

sudo proot -q qemu-arm -S /home/user/backup_raspbian

и внести нужные изменения. Например, то самое обновление, которое я выше предложил провести.

apt update && apt upgrade

после загрузки и установки обновлений выходим из чрута командой exit и можем синхронизировать с картой памяти:

sudo rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/var/backups/*","/var/cache/apt/*","/var/lock/*","/var/tmp/*","/lost+found", "/home", "/etc/fstab"} /home/user/backup_raspbian /media/user/root2fs

Заметьте, к уже упомянутой команде rsync я добавил исключение синхронизации /etc/fstab, так как этот файл уже настроен на каждом разделе отдельно.

В данном случае изменения синхронизируются со вторым разделом (root2fs). Выбирая активный раздел в /boot/cmdline.txt есть возможность загрузиться как с исходной версии системы, так и с обновлённой.

И было интересно поиграться с подобной синхронизацией, как и синхронизацией по сети с рабочей малинкой, однако необходимость управления с отдельного устройства неудобна. Будь у меня стойка из миникомпьютеров, или если бы предлагал использовать мой дистрибутив — конечно, подобные недоатомарные обновления были бы очень удобны, но в масштабах одного устройства нет смысла. И начал я уже думать о том, чтобы в автоматическом режиме скрипт производил обновления, либо чтобы некий скрипт даже прямо из Raspbian чрутился ко второму разделу и обновлял его, а затем менял загрузочный раздел, но прежде я решил ещё раз изучить существующие дистрибутивы, предназначенные для развёртывания медиацентра на Kodi. И вдруг…

Счастье с XBian

Не знаю, как я раньше проходил мимо XBian, но это именно то, что мне нужно. В отличии от других дистрибутивов с Kodi, представляющих собой вариации количества изначально установленного ПО, именно в XBian применены множество оптимизаций специально для работы в качестве медиацентра. В XBian релизовано то, к чему я стремился, только лучше продуманно.

XBian основан на Debian, и, как и Debian, использует роллинг-релизы, потому пакеты всегда в актуальном состоянии. Более того — можно обновляться на тестовую ветку и возвращаться обратно на стабильную.

Система находится на разделе с файловой системой Btrfs, которая, как и F2FS, использует механизм копирования при записи, но также поддерживает создание снапшотов, и в меню XBian есть удобные утилиты для управлениями снапшотами и настройки для автоматического создания снапшотов. Если всё таки какой-то файл будет повреждён, Btrfs мгновенно переведёт систему в режим только чтения, чтобы не допустить дальнейших повреждений системы, и предоставит средства для восстановления и отката на рабочую версию. Я считаю, Btrfs — это идеальный выбор для системного раздела в данном случае, а F2FS решил использовать на флешке с файлами, подключенной к Raspberry Pi. На флешке снапшоты мне не нужны, а вот данные в F2FS записываются строго последовательно, в отличии от Btrfs, не заботясь о фрагментации, что обеспечивает более равномерную нагрузку на ячейки.

В XBian сервисы настроены на минимальное количество производимой записи на microSD, потому отсутствием Read-Only раздела можно пренебречь. В конце концов, мне магазин дал 10 лет гарантии на карту памяти, если что — поменяю.

Единственный недостаток для меня — XBian в качестве системы инициализации использует upstart. Принято ругать systemd, да я и сам в шутку ругаю, но мне с ним гораздо удобнее. Но об этом можно не волноваться: upstart с 2014 года не развивается, однажды разработчикам придётся менять систему инициализации.

Потом я нашёл замечательный плагин для Kodi под названием Quasar, о котором хочу отдельно рассказать. Он позволяет выбрать из различных топов, либо найти желаемый фильм или сериал и начать смотреть его, используя технологию torrent, а после просмотра плагин предложит сохранить этот фильм или сериал в библиотеку. Причем можно сохранить как загруженный файл, так и ссылку на него — тогда при нажатии на произведение начнётся загрузка с торрентов.

Quasar Burst — это дополнение для Quasar, в котором находятся настройки того, какие торрент-трекеры использовать для поиска контента. В нём уже присутствуют популярные русские торрент-трекеры, например, rutor и rutracker, поэтому Quasar абсолютно подходит русскоязычным пользователям.

UP: В комментариях порекомендовали Elementum — форк переставшего развиваться Quasar. Рекомендую его попробовать.

Обход блокировок

Однако, всё не так хорошо, как хотелось бы. Как известно, роскомнадзор требует от провайдеров блокировки кучи сайтов, в роде рецепта крафта динамита в майнкрафте или торрент-трекеров, и если для обхода блокировки на десктопе достаточно установки одного из дополнений для браузера, то для медиацентра это не так просто.

Если весь трафик отправлять через Tor, VPN или прокси, то это скажется на скорости загрузки. Особенно в случае с Tor. Потому необходимо обходить блокировку только заблокированных адресов, а подключаться к другим пользователям torrent напрямую.

Можно найти различные варианты обхода, различной степени надёжности и сложности, я выбрал использование VPN, причём не для всего трафика, а для специально указанного списка адресов.

Можно использовать свой VPN сервер, где-то приобрести, или воспользоваться сервисом antizapret.prostovpn.org. Вроде как при установке этого VPN трафик до сайтов должен идти напрямую, если этот сайт не находится в списке заблокированных, но у меня на Raspberry Pi почему-то весь трафик шел в обход VPN, потому я принудительно указал, для каких адресов его использовать, о чём чуть позже.

Команда для установки OpenVPN:

sudo apt install openvpn

Затем необходимо добавить модуль ядра tun в автозагрузку при запуске системы для того, чтобы обеспечить работу OpenVPN

sudo echo "tun" >> /etc/modeles

и в первый раз вручную его загрузить

sudo modprobe tun

В случае с использованием VPN от antizapret, я скачал хранящийся там файл antizapret.ovpn, сохранил как файл /etc/openvpn/client.conf и добавил нужные мне адреса, которые должны передаваться через VPN

route 195.82.146.214 255.255.255.255 vpn_gateway # rutracker
route 185.112.157.181 255.255.255.255 vpn_gateway # nnm-club
route 104.27.140.149 255.255.255.255 vpn_gateway # rutor
route 104.24.106.53 255.255.255.255 vpn_gateway # kinozal

важно, чтобы в конфигурации не было строки, начинающейся с redirect-gateway, иначе весь трафик будет идти через VPN.

В файле /etc/default/openvpn производится настройка, какие конфигурации будут по-умолчанию запускаться при запуске OpenVPN. Достаточно раскомментировать AUTOSTART="all", либо вместо all указать client, то есть созданную нами конфигурацию.

Запуск OpenVPN:

sudo service openvpn start

и добавление в автостарт:

sudo update-rc.d openvpn enable

Также, для обхода блокировки служебных трекеров .t-ru.org выполнил команду в консоли и добавил в /etc/rc.local перед exit для автовыполнения команды при загрузке:

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -d 195.82.146.120/30 -j DNAT --to-destination 163.172.167.207:3128

Казалось бы, всё? Но нет. Мой провайдер оказался хитрым, потому мои DNS запросы, адресованные в гугл на адрес 8.8.4.4, перехватываются и изменяются, если я запрашиваю IP адрес заблокированного ресурса. Вот, что мне nslookup выдаёт:

nslookup rutracker.org
Server:         8.8.4.4
Address:        8.8.4.4#53

Non-authoritative answer:
Name:   rutracker.org
Address: <ip заглушки>

Что-ж, давно было пора перейти на DNSCrypt. Эта утилита, соединяется с DNS сервером по зашифрованному каналу, поэтому провайдер, или другой MitM не сможет прослушать, подменить или отфильтровать пакеты. Установил DNSCrypt на роутере, запустил и теперь всё шикарно.

Как итог, я получил замечательный медиацентр, с огромным количеством доступного контента, который основан на лучших (по крайней мере, по моей оценке) технологиях, а использование Raspberry Pi открывает огромные возможности по кастомизации. Можно установить инфракрасный приёмник, чтобы управлять медиацентром с помощью пульта даже при подключении к телевизору, который не поддерживает HDMI-CEC, или играть в старые игры, подключив джойстик, а можно вовсе преобразовать из медиацентра в другое устройство.

20k7
25 декабря, 20:53

Огромное спасибо НЛО за инвайт на хабр =) Похоже, пора заняться своим аккаунтом.