Русский
Русский
English
Статистика
Реклама

Ubuntu

Bedrock Linux лего-набор для создания идеального linux-дистрибутива

22.02.2021 16:14:10 | Автор: admin


С момента появления Linux достаточно скоро возникло множество дистрибутивов: Slack, RedHat, Debian, SUSE и т. д. Тогда же возникла и проблема выбора дистрибутива, ведь каждый из них имеет свои особенности и преимущества, которые делают его особенным. RedHat и Debian наиболее стабильные и консервативные из дистрибутивов, Ubuntu заточен на удобство и имеет прекрасный пользовательский интерфейс, Gentoo свобода выбора и гибкость.

У каждого пользователя Linux были моменты, когда ему не хватало некоторых функций, реализованных в других дистрибутивах. Многим в свое время не понравилось, что Debian перешел на systemd и они создали на его основе новый дистрибутив Devuan. Некоторые перешли на Gentoo, где пользователь может создать среду с двумя системами инициализации: как с openrc, так и с systemd.

В разных дистрибутивах этот вопрос решается по-разному. Установка пакета, который отсутствует в штатном репозитории, решается с помощью docker-контейнеров, или использованием систем самодостаточных пакетов snap и flatpak. Можно даже ставить RPM пакеты на системах с пакетным менеджером DEB. В Gentoo имеется поддержка RPM и DEB пакетов. Все это работает, однако плохо масштабируется и не очень стабильно.

Создатели Bedrock Linux пошли дальше и создали полноценный мета-дистрибутив. В нем возможно использование не только пакетов, но и компонент различных Linux дистрибутивов, как кубиков Лего. В одном окружении можно создать систему из нескольких Linux OS, например установку дополнительных пакетов Ubuntu поверх базовых компонент Debian и Arch. Установочный скрипт доступен для следующих платформ.

  • aarch64;
  • armv7hl;
  • armv7l;
  • mips64el;
  • mips64;
  • mips;
  • mipsel;
  • ppc64;
  • ppc64le;
  • ppc;
  • s390;
  • x86_64;
  • x86;

Кстати, а почему установочный скрипт, а не полноценный установочный диск, или образ? Причина в том, что Bedrock Linux не имеет своего канонического дистрибутива, вместо этого имеется набор рецептов по сборке операционной системы из некоего набора ингредиентов. В этом Bedrock Linux похож на другой мета-дистрибутив Gentoo, однако в попытке объять необъятное продвинулся к самым границам здравомыслия, а возможно и перешел их.

Установка Bedrock и базовые команды


Используя уже установленный традиционный дистрибутив Linux с помощью установочного скрипта Bedrock трансформирует его в гибридную систему. Например, у вас уже установлена ОС Debian, с помощью установочного скрипта, вы получаете совмещенную среду с Ubuntu. Для начала надо запустить из под пользователя root.

sh ./bedrock-linux-<release>-<arch>.sh --hijack

Скрипт выдаст предупреждение, что это не учения.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **                                                               ** Continuing will:                                              ** - Move the existing install to a temporary location           ** - Install Bedrock Linux on the root of the filesystem         ** - Add the previous install as a new Bedrock Linux stratum     **                                                               ** YOU ARE ABOUT TO REPLACE YOUR EXISTING LINUX INSTALL WITH A   ** BEDROCK LINUX INSTALL! THIS IS NOT INTENDED TO BE REVERSIBLE! **                                                               ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *Please type "Not reversible!" without quotes at the prompt to continue:> Not reversible!__          __             __\ \_________\ \____________\ \___ \  _ \  _\ _  \  _\ __ \ __\   /  \___/\__/\__/ \_\ \___/\__/\_\_\          Bedrock Linux 0.7.19 Poki

Самое время ознакомиться с таблицей совместимости Linux дистрибутивов. Основные популярные дистрибутивы имеют хорошую степень поддержки, кроме возможно OpenSUSE. Для Linux Mint не поддерживается выгрузка и автоматическое установка. Не надо также забывать про таблицу совместимости компонент между собой. Бинарники, например, переносятся хорошо из одного дистрибутива в другой, а шрифты плохо.

Если все проверки прошли успешно, скрипт вносит необходимые изменения в ОС, после чего нужно перезагрузить компьютер, чтобы изменения вступили в силу. С этого момента пользователь находится в окружении Bedrock Linux. Теперь можно установить дополнительную ОС в контейнер, называемый stratum нечто наподобие chroot окружения, в котором проделаны специальные дыры для коммуникации с другими strata.
Однако прежде, чем начинать желательно ознакомиться с руководством по эксплуатации, вызвав brl tutorial basics. Простейшие команды Bedrock, назначение каждой очевидно.

# brl update# brl version# brl ctatus

Просмотр списка доступных дистрибутивов и установка.

# brl fetch --list# brl fetch alpine# brl fetch void


Как взаимодействуют дистрибутивы в составе Bedrock?


В определенных ситуациях можно выполнять команды из разных strata так, как будто они часть одной привычной Linux OS. Например команды из void и alpine можно использовать в одном конвейере. Первая команда устанавливает пакет jq на alpine, вторая jo на void. Конвейер читает из второй и передает на первую, все происходит прозрачно для пользователя.

$ sudo apk add jq$ sudo xbps-install -y jo$ jo "distro=bedrock" | jq ".distro"

Первоначальная ОС Debian Linux, над которой произвели действие --hijack теперь также является всего лишь stratum. О её существовании можно догадаться, выполнив некоторые из этих команд.

$ brl which lsdebian$ brl which /debian

Более определенно, вывод этих команд будет совпадать с содержимым файла /etc/os-release, который виден из текущего процесса shell. Это логично, так как каждый stratum видит лишь свой локальный файл, иначе параллельно установленные Debian и Ubuntu споткнулись бы о содержимое файла /etc/apt/sources.list.

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

$ brl which /bedrock/etc/bedrock.confglobal$ brl which /runglobal$ brl which /tmpglobal

Для тех случаев, когда процессам одного дистрибутива необходимо достучаться до локальных файлов другого, реализованы cross пути. Например чтобы из одной strata прочитать файл os-release другой нужно обращаться к ресурсам файловой системы используя путь /bedrock/strata/. Сам stratum bedrock служит лишь для cross чтения и записи файлов. Внутри crossfs файловая система FUSE, в которой запрашиваемые файлы перезаписываются на лету для обеспечения совместимости между различными strata.

$ brl which /bedrock/strata/bedrock/etc/os-release bedrock$ cat /bedrock/strata/bedrock/etc/os-releaseNAME="Bedrock Linux"ID=bedrockID_LIKE=bedrocklinuxVERSION="0.7.19 (Poki)"VERSION_ID="0.7.19"PRETTY_NAME="Bedrock Linux 0.7.19 Poki"HOME_URL="http://personeltest.ru/aways/bedrocklinux.org"$ brl which /bedrock/strata/my-alpine/etc/os-release my-alpine

Если необходимо выполнить внутреннюю команду определенной strata, следует воспользоваться соответствующим префиксом.

$ strat void sh -c 'apk --help'

Обновление Bedrock


Bedrock обновляется незатейливо и просто Как и все дистрибутивы Linux, достаточно запустить brl update из под пользователя root. Это команда обновит лишь stratum Bedrock, остальные strata обновляются своими штатными средствами: например yum update, или dnf update для Redhat и CentOS.

Удаление strata


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

$ sudo brl disable alpine$ sudo brl remove alpine$ sudo remove -d void

Последняя команда совмещает, операции disable и remove.

Для чего действительно нужен Bedrock Linux?


В этот момент многие читатели скорее всего задаются вопросом: для чего нужно скрещивать ежа с ужом и создавать гибридные ОС, ведь не всегда рабочая станция Linux сама по себе бывает достаточно стабильной, особенно с закрытыми драйверами графической карты, или в сессии Wayland. Попробуем перечислить некоторые сценарии использования Bedrock Linux в практике.
  • Вы предпочитаете стабильные дистрибутивы Linux, такие как RedHat и Debian, однако вам также необходима поддержка нового железа: CPU, или недавно приобретенный принтер. Чтобы получить эту поддержку необходимо установить более свежую версия ядра и пакетов cups, hplips. Такая задача может быть решена единожды, но стабильная система с нестабильными пакетами уже не то,
  • Вам нравится дистрибутив, но не его система инициализации. Скажем, systemd вы предпочитаете openrc, или runit, однако хотели бы при этом использовать Ubuntu.
  • У вас есть задача вести разработку, или сопровождать программное обеспечение для Linux, однако ваш дистрибутив отличается от целевого. Например sh скрипты написанные для bash не будут корректно выполнены в Debian, так как в нем /bin/sh не является ссылкой на /bin/bash. Для таких сценариев в Bedrock Linux достаточно добавить stratum для Debian Linux.
  • Вы пытаетесь изменить ваши представления об использовании Linux OS. Впрочем это уже не имеет отношение к практике.


Подробнее..

Linux. Как работает hardening

29.03.2021 16:17:23 | Автор: admin

Статья расскажет о том, как с помощью kconfig hardened check можно проверить настройку механизмов защиты ядра ОС Linux, которые используются для противодействия эксплойтам. На сегодняшний день данный инструмент, пожалуй, является одним из самых опасных инструментов нарушения разграничения доступа и функционирования ОС. Рассмотрим, какие основные параметры компиляции ядра и модули безопасности есть в официальном репозитории, а также попробуем выяснить, какие наборы механизмов применяются в различных дистрибутивах.

Инструменты и источники для проведения исследования

Исследование ОС Linux будем традиционно проводить на базе исходного кода, который доступен в официальном репозитории. В качестве инструментов исследования будем использовать:

  • Visual Studio Code;

  • Python 3;

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

Подсистемы защиты

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

В ОС Linux с точки зрения защиты от различных атак на разграничение доступа и эксплуатацию уязвимостей используют следующие механизмы:

  • LSM фреймворк механизм перехвата системных функций для обработки расширениями ядра Linux;

  • KASLR рандомизация адресного пространства ядра;

  • HW-Vuln митигации и патчи, которые используются против Hardware уязвимостей (Meltdown, Spectre, и т.д.);

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

Большая часть механизмов противодействия атакам на разграничение доступа и эксплуатации уязвимостей находится в разделе linux/security:

Здесь в явном виде представлены модули ядра, которые можно использовать для улучшения механизмов защиты. Есть только маленькая неприятность некоторые модули из этой директории не могут быть совместимы. На сегодняшний день, к сожалению, нет метода использования сразу несколько модулей LSM. Поэтому предполагается, что тот, кто хочет собрать себе ядро для своей ОС, должен самостоятельно решить, что за модуль ему подойдет больше. Всего их 11 штук:

Например, модуль toyomo нельзя использовать с другими модулями.

В директории "security" есть описания для защит от различных техник, которые позволяют проводить эксплуатацию уязвимостей. Например min_addr. Этот механизм защиты, который резервирует адреса в оперативной памяти, которые находятся рядом с нулевым адресом. Сделано это для того, чтобы нельзя было использовать начальные страницы в оперативной памяти для хранения данных эксплойта. Часть остальных противодействий в ядре запускается только с использованием дополнительных опций запуска ядра и компиляции. Обнаружить эти данные можно в hardening конфиге. Вся информация предоставляется только как описание отдельных параметров.

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

Ubuntu и его механизмы защиты

Популярный дистрибутив, который используется и как сервер, и для десктопов. Проверять будем с помощью вот этого инструмента kconfig hardened check. Инструмент проверяет текущую настройку ядра с точки зрения безопасности и демонстрирует, какие параметры были установлены при установке системы. Репозиторий постоянно обновляется, поэтому список подсистем защит и параметров компиляции ядра намного больше того, что мы смогли обнаружить при исследовании исходного кода. Репозиторий предоставляет скрипт на Python для проверки опций в уже собранном дистрибутиве. Стоит отметить, что без использования эталонного конфига, инструмент показывает информацию по дистрибутиву, не указывая, что есть. Он показывает, что желательно бы иметь в качестве установленных параметров. Запускать проверку можно так:

kconfig-hardened-check -p X86_64 -c kspp-recommendations-x86-64.config

Вообще в репозитории есть 2 вида конфигов обычный, который создан для конкретного дистрибутива, и рекомендуемый с точки зрения наибольшего количества безопасных опций. Ресурс kernsec характеризует KSSP конфиг как наиболее параноидальный с точки зрения колиества применяемых параметоров. Результат для Ubuntu Server 20.04:

29 опций, которые не используются или не найдены из 111. Не такой уж плохой результат. Особенно если учесть, что конфиг эталона параноидальный.

Debian и его механизмы защиты

Для исследования Debian был выбран неофициальный дистрибутив Debian, а его модифкация Kali Linux. Этот дистрибутив, который используют для тестирования на проникновение, посмотрим что у него у самого с параметрами безопасности:

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

Таким образом можно выяснять, как настроен тот дистрибутив, которым вы пользуетесь на базе ядра ОС Linux.


Прямо сейчас в OTUS открыт набор на новый поток курса "Administrator Linux. Basic", Приглашаем всех желающих на бесплатный вебинар, в рамках которого наши эксперты подробно расскажут о курсе, процессе обучения, а также карьерных перспективах в данной сфере.

Записаться на вебинар.

Подробнее..

KODI. Как я собирал свой самый удобный и функциональный медиацентр для дома. Часть 1

24.03.2021 02:04:36 | Автор: admin

Содержание:

  1. Лирическое отступление

  2. Мои требования к медиацентру

  3. Аппаратная часть, программная платформа:

    1. Неттоп

    2. Пульт ДУ

  4. Операционная система

    1. Подготовка и установка Kubuntu 20.04 LTS

    2. Первичная настройка, удаление лишнего и установка пакетов для работы с системой

    3. Монтирование основного диска для хранения данных

    4. Сетевые каталоги

    5. Установка и настройка VNC-сервера

    6. Настройка профиля HDMI в PulseAudio

  5. Установка и базовая настройка KODI

  6. IPTV. Как установить и настроить, какой сервис выбрать

  7. Библиотека KODI. Что это такое и как настроить

  8. Elementum и Burst. Настраиваем просмотр контента торрент-онлайн

1. Лирическое отступление

Еще во времена своего первого телевизора со Smart TV часто ловил себя на мысли, что все это не то, неудобно, не всегда красиво А еще когда это все сопровождалось долгим откликом встроенной ОС, вылетами, требующие перезагрузок, начались поиски решения.

DLNA на какое-то время удовлетворял все потребности, хотя неудобств в его использовании хватало. Не устраивали лишние телодвижения для просмотра фильма, а особенно необходимость иметь компьютер, на котором хранится библиотека и просмотр только оффлайн контента.

Поиски продолжались и первым программным решением на базе самого телевизора был популярный тогда Fork Player, для установки которого еще нужно было поиграться с прошивкой самого телевизора, а после еще и с настройкой самого плеера. Здесь уже был получен онлайн-просмотр контента и IPTV. Работало все не очень стабильно, а интерфейс и юзабилити оставляли желать лучшего, и постоянно выводил из себя, живущих во мне эстета и перфекциониста.

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

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

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

2. Мои требования к медиацентру

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

Вот мой список:

  • Просмотр IPTV. Как бы для некоторых это не было странно в 2021 году, но телевизор в первую очередь должен быть телевизором. С хорошим набором каналов с EPG на борту и в хорошем качестве. Архив передач приветствуется, но не обязателен.

  • Торрент-видео. Обязательна интеграция с популярными русскоязычными трекерами, просмотр на лету, скачивание во время просмотра.

  • Приятный интерфейс и юзабилити. Что бы все домочадцы без труда смогли самостоятельно посмотреть очередную серию Маша и Медведь или любимого сериала, а кто-то и новости по ТВ.

  • Встроенная библиотека. С возможностью загружать информацию о фильме/сериале из внешних источников.

  • Торрент-качалка. Обязательно внешнее управление.

  • Аппаратные требования. Платформа x86-64. Работа 24/7/365, бесшумность, управление аэромышью.

  • Требования к ПО. Полноценная ОС, желательно семейства GNU/Linux. Удаленный доступ. Внешнее управление, желательна поддержка android-устройств. Обновления.

3. Аппаратная часть, программная платформа

Все знакомства проводил на виртуальных машинах или мобильном телефоне с Android на борту. Когда поиски были завершены и выбор пал на KODI, нужно было определиться с платформой. На этапе знакомства были испробованы и готовые сборки, с отчасти урезанной ОС, типа LibreELEC и на базе Windows 8/10. Из-за желания использования медиацентра, как полную замену всей начинки телевизора и использования его, лишь как экрана, от Windows пришлось отказаться. Нужна была работа 24/7/365 включил телевизор включился экран, а KODI уже готов к работе, он и не выключался. Из-за надежности, стабильности и небольших навыков в работе, остановился на Ubuntu с окружением рабочего стола KDE Plasma Kubuntu 20.04 LTS.

К слову, вариант с одноплатным компьютером, например Raspberry Pi, не рассматривал. Учитывая ARM-платформу, не высокую производительность и SD-карту под хранилище, с моими задачами не справился бы.

3.1. Неттоп

Был приобретен мини-ПК на AliExpress, благо выбор различных исполнений и комплектующих огромен. Накопители в комплект не входили - из собственных запасов. Меньший по объему отдал под ОС, больший под основное хранилище. Габариты неттопа очень компактные, блок питания внешний. Охлаждение пассивное, корпус выполнен из металла и сам по себе является большим радиатором. Учитывая отсутствие воздушного охлаждения и даже жестких дисков, мой медиацентр не будет издавать ни малейшего шума или щелчков головки HDD. Полная тишина.

Характеристики, внешний вид и внутреннее устройство:

ЦП - Intel Celeron J1900, 4 ядра, 4 потока, 2 ГГц
ОЗУ - 4 Гб DDR3L 1333 МГц
SSD - 500 Гб (SATA III)
SSD - 64 Гб (mSata)
LAN 1 Гбит/с
HDMI 1.4
VGA
2xUSB 2.0
2xUSB 3.0



Забегая немного вперед, с уверенностью могу сказать, что такая конфигурация даже избыточна. В самые пики, максимальное значение LA, которое мне удалось увидеть редко превышало 3. Оперативной памяти 4 Гб также с большим запасом чуть более 3 Гб это максисимум, сколько могла загрузить система. По температурам также все отлично, в простое 36-40 С, при нагрузках 48-52 С.


Покупка на то время обошлась в 110 долларов с доставкой в г. Минск.

3.2. Пульт ДУ

Для управления нужна была аэромышь, и она же пульт вкл/выкл телевизора (ИК), дабы не плодить количество устройств и все управление совместить в одном. Там же, в поднебесной, был заказан пульт G10 со встроенным гироскопом, голосовым вводом и подсветкой кнопок. Адаптер USB в комплекте, с подключением не возникло никаких проблем.

Единственное, что не смог подружить головой ввод и Ubuntu. На Android все работает из коробки. Если к-то смог с этим делом разобраться поделитесь.

Все кнопки управления работали по своему предназначению, конфликтов с Ubuntu и KODI не было. Необходимо было только запрограммировать кнопку вкл/выкл на нужный ключ, чтобы им управлять питанием телевизора Samsung. Для этого удерживая кнопку вкл/выкл на аэромыши поднести пульт от телевизора и также зажать кнопку вкл/выкл. LED-индикатор медленно замигает это будет означать, что пульт закончил обучение.

Уже потом, в ходе эксплуатации, обратил внимание на слишком большие шаги кнопок регулировки громкости. Этот параметр также можно подкорректировать.

Регулировка скорости клавиш управления звуком:

  • От медленной к быстрой: нажмите и удерживайте кнопки "OK" и "Volume+". Скорость регулируется на быструю, пока горит LED-индикатор.

  • От быстрой к медленной: нажмите и удерживайте кнопки " OK " и "Volume-". Скорость регулируется на медленную, пока горит LED-индикатор.

4. Операционная система

Так как с операционной системой я определился в предыдущем разделе, перейдем к ее установке и настройке.

4.1. Подготовка и установка Kubuntu 20.04 LTS

Являясь пользователем Windows на домашнем ПК, готовил загрузочный flash-накопитель с помощью Rufus. Скачать последнюю версию, в том числе и портативную, всегда можно с официального сайта rufus.ie. Сам ISO-образ загружаем по ссылке kubuntu.org, я использовал 64-битную версию системы с длительной поддержкой (20.04.2 LTS).

Не думаю, что стоит подробно описывать ход установки ОС. Инструкция со скриншотами доступна в разделе Wiki на сайте Ubuntu. Для Kubuntu актуальной версии отличия будут лишь незначительные и то косметические в интерфейсе.

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

sudo apt-get update && sudo apt full-upgrade

4.2. Первичная настройка, удаление лишнего и установка пакетов для работы с системой

Устанавливаем минимальный набор программ для работы с системой. Я использую файловый менеджер midnight commander со строенным текстовым редактором mcedit, htop утилита мониторинга, ssh для удаленного управления, net-tools утилита для работы с сетевыми интерфейсами, landscape-common - отображает системную информацию в приветствии, при подключении по SSH

sudo apt-get install mc htop ssh net-tools landscape-common

Изначально, сетевой интерфейс работает по DHCP. Рекомендую сразу же присвоить статический IP-адрес, дабы в какой-то момент времени он не сменился, и вы не потеряли доступ к своему медиацентру.

Определяем все доступные сетевые интерфейсы в системе

ifconfig

Вывод:

kodi@kodi-pc:~$ ifconfigenp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 192.168.0.19  netmask 255.255.255.0  broadcast 192.168        inet6 fe80::8461:dcf8:d2c6:2d48  prefixlen 64  scopeid 0x20        ether 40:62:31:0a:11:a5  txqueuelen 1000  (Ethernet)        RX packets 3417519  bytes 5024924041 (5.0 GB)        RX errors 0  dropped 2  overruns 0  frame 0        TX packets 1059086  bytes 169628765 (169.6 MB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

В моем случае интерфейс enp1s0, ему назначен IP-адрес 192.168.0.19.

Назначим ему статический адрес 192.168.0.50 и будем дальше работать именно с ним, для этого необходимо отредактировать файл конфигурации netplan:

sudo mcedit /etc/netplan/00-installer-config.yaml

Привести к виду:

network: ethernets:  enp0s3:   addresses:    - 192.168.0.50/24   gateway4: 192.168.0.1   nameservers:    addresses: [192.168.0.1, 1.1.1.1]   optional: true version: 2 renderer: networkd

Где:
addresses IP-адрес, который будет назначен нашему сетевому интерфейсу
gateway4 IP-адрес нашего роутера
nameservers DNS сервера. Первый - наш роутер, 1.1.1.1 общедоступный DNS от Cloudflare

Сохраняем изменения и для надежности перезагружаем систему и проверяем (командой ifconfig). IP-адрес должен быть 192.168.0.50.

Для удобства, дальше работу продолжаю с домашнего ПК под управлением Windows 10 с помощью утилиты PuTTY по SSH-протоколу. SSH у нас уже установлен, используем порт 22.

SSH/SFTP-клиент для android-устройств

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

Удаляем ненужные медиацентру приложения

sudo apt remove libreoffice-draw skanlite okular kpat ksudoku kmahjongg kmines kdeconnect konversation krdc ktorrent thunderbird firefox elisa vlc libreoffice-math libreoffice-calc libreoffice-writer usb-creator-kde kwalletmanager

Удаляем неиспользуемые пакеты из кэша, очищаем кэш утилиты apt и ненужные зависимости

sudo apt autoclean && apt clean && apt autoremove

Устанавливаем Google Chrome на замену Firefox

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.debsudo dpkg -i --force-depends google-chrome-stable_current_amd64.deb

В качестве торрент-клиента использую qBittorrent. Устанавливаем

sudo apt install qbittorrent

4.3. Монтирование основного диска для хранения данных

В моем медиацентре используется два SSD-накопителя (64 и 500 Гб). Меньший по объему уже используется и размечен под систему и приложения. Хранить все медиа-данные, торренты буду на накопителе большего объема. Для этого смонтируем его в файловую систему.

В моем случае накопитель sda1 отформатирован и имеет один раздел (ext4). Определяем его UUID

ls -l /dev/disk/by-uuid

Вывод:

lrwxrwxrwx 1 root root 10 мар 14 18:01 40792859-581c-46cb-be9d-ad9d9e6ce843 -> ../../sdb1lrwxrwxrwx 1 root root 10 мар 14 18:01 4f311605-04ff-4e66-8121-187f270a51f4 -> ../../sdb5lrwxrwxrwx 1 root root 10 мар 14 18:01 760198b6-694e-4d6f-b21c-ea0c530398c3 -> ../../sda1lrwxrwxrwx 1 root root 10 мар 14 18:01 c53e5dd8-c36a-48b1-8591-3aeb4bce60a0 -> ../../sdb7lrwxrwxrwx 1 root root 10 мар 14 18:01 f09293e9-209e-4dce-ba4f-56d2e33657e8 -> ../../sdb6

Все устройства на медиацентре буду монтировать в каталог /mnt. Вложенный каталог (например, kodi), куда непосредственно необходимо смонтировать раздел, создаем вручную и назначаем права

sudo mkdir /mnt/kodisudo chmod -R 0777 /mnt/kodi

Открываем для редактирования fstab

sudo mcedit /etc/fstab

и в конец файла добавляем параметры монтирования для нашего накопителя

UUID=760198b6-694e-4d6f-b21c-ea0c530398c3 /mnt/kodi ext4 rw,nosuid,nodev,relatime 0 0

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

4.4. Сетевые каталоги

Так как медиацентр, в моем случае, предполагает работу 24/7, удобно использовать его как общий ресурс для обмена данными между всеми домашними устройствами.

Я использую два каталога:

  • /mnt/smb каталог для обмена между устройствами. Удобно для обмена файловой информации между домашним ПК, ноутбуками и android-устройствами. На ПК с Windows 10 каталог примонтирован в систему, как сетевой диск. На мобильном телефоне использую файловый менеджер X-Plore, в котором также примонтирован этот каталог, всегда быстро и удобно скопировать информацию.

  • /mnt/kodi/qbittorrent каталог для загрузки торрентов с помощью qBittorrent (не забыть настроить сам qBittorrent на использование этого каталога, по умолчанию используется стандартный каталог загрузок). Так как загружать планирую не только видео-контент для просмотра на телевизоре, удобно использовать медиацентр как торрент-качалку, работающую 24/7. А забрать скачанную информацию всегда можно по средствам все того же смонтированного сетевого диска в Windows 10.

Создаем каталоги и назначаем права на чтение и запись

sudo mkdir /mnt/smbsudo mkdir /mnt/qbittorrentsudo chmod -R 0777 /mnt/smbsudo chmod -R 0777 /mnt/qbittorrent

Для расшаривания каталогов необходимо установить samba

sudo apt-get install samba

Конфигурируем samba

sudo mcedit /etc/samba/smb.conf

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

[smb]comment = smbpath = /mnt/smbbrowsable = yeswritable = yesguest ok = yesread only = noforce user = nobodyforce group = nogroupforce create mode = 0777force directory mode = 0777[kodi-qbittorrent]comment = kodi-qbittorrentpath = /mnt/kodi/qbittorrentbrowsable = yeswritable = yesguest ok = yesread only = noforce user = nobodyforce group = nogroupforce create mode = 0777force directory mode = 0777

И перезапускаем сервис samba

sudo /etc/init.d/smbd restart

Можно проверить с других устройств доступность каталогов и наличие прав на чтение и запись.

4.5. Установка и настройка VNC-сервера

Для администрирования и работ в системе медиацентра не планирую использовать собственные клавиатуру и мышь. SSH-протокола не всегда достаточно и иногда хорошо бы иметь доступ к рабочему столу. Этим и займемся.

Решено было использовать VNC-сервер, устанавливаем

sudo apt install x11vnc

Устанавливаем пароль

x11vnc -storepasswd "kodi" /etc/x11vnc.passsudo chmod ugo+r /etc/x11vnc.pass

Запускаем сервер

/usr/bin/x11vnc -noxdamage -shared -dontdisconnect -many -noxfixes -rfbauth /etc/x11vnc.pass -bg

Для подключения я использую Real VNC Viewer для Windows или Android. Порт по умолчанию - 5900.

К сожалению, после перезагрузки системы VNC-сервер автоматически сам не запустится. Добавим в автозагрузку вручную.

Создаем крипт

sudo mcedit /usr/bin/VNCserver-start

Вставляем содержимое

#!/bin/sh/usr/bin/x11vnc -noxdamage -shared -dontdisconnect -many -noxfixes -rfbauth /etc/x11vnc.pass -bg

Делаем скрипт исполняемым

sudo chmod u+x /usr/VNCserver-start

Реализовать автозапуск VNC-сервера с помощью systemd так и не удалось. С автозапуском любого другого скрипта проблем нет, именно с VNC не смог разобраться с авторизацией.

Поэтому сделал не совсем красиво, но вариант рабочий. Параметры системы -> Рабочая среда -> Запуск и завершение -> Автозапуск. Добавить, как сценарий наш скрипт /usr/VNCserver-start.

4.6. Настройка профиля HDMI в PulseAudio

У меня телевизор подключен к мини-ПК через HDMI, а аудио разъем акустической системы подключен к разъему для наушников телевизора, но PulseAudio настаивает на том, что он отключен. Вручную в микшере можно выбрать выходное устройство. Все корректно, но после ближайшей перезагрузки системы профиль снова слетает. Решить проблему можно иначе - отключить модуль switch-on-port-available в конфигурационном файле PulseAudio

sudo mcedit /etc/pulse/default.pa

Закомментировать параметр

#load-module module-switch-on-port-available

После этих изменений с выводом звука не было никаких проблем.

Будем считать, основа нашего медиацентра ОС в лице Kubuntu 20.04 готова. Можно приступать к установке и запуску KODI!

5. Установка и базовая настройка KODI

Переходим непосредственно к KODI. Он есть в официальных репозиториях Ubuntu, но я бы рекомендовал использовать репозиторий стабильных версий сообщества XBMC (так до 2014 года назывался медиацентр). Например, на момент написания этого материала в середине марта 2021 года, в репозиториях Ubuntu версия KODI была 18.7, тогда как в репозитории сообщества уже была версия 19.0 Matrix.

Добавляем репозиторий, обновляем список пакетов и устанавливаем KODI

sudo add-apt-repository ppa:team-xbmc/ppasudo apt updatesudo apt install kodi

KODI установлен, запускаем. Нас приветствует стартовая страница медиацентра и несколько предложений включить неактивные дополнения. Отвечаем Yes только на дополнении PVR IPTV Simple Client, остальные отклоняем. Также будет предложено сразу настроить это дополнение пропускаем, им займемся позже.

Первым делом меняем язык, благо KODI поддерживает различные языки интерфейса, русский/белорусский/украинский не исключение.

Settings/Interface/Regional/RussianSettings/Interface/Regional/Russian

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

В настройках стиля включаем:

  • Использовать скользящую анимацию. Интерфейс будет больнее привлекательно сменять страницы, диалоговые окна и выводить уведомления.

  • Включить автопрокрутку для сюжетов и обзоров. В библиотеке и видеодополнениях информация о фильме/сериале/серии длинное описание будет плавно прокручиваться.

  • Режим касания. Добавит кнопки управления на экран. Необходимо, при использовании мыши/аэромыши.

  • Выбрать рейтинг для показа мультимедийных элементов Рейтинг. В медиатеке и видеодополнениях на эскизе фильма/сериала/серии будет добавлена пиктограмма с рейтингом TVDB (чуть позже установим и его).

Настройки/Интерфейс/Стиль/Настроить стильНастройки/Интерфейс/Стиль/Настроить стиль

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

Установка дополнения GismeteoУстановка дополнения Gismeteo

После установки будет предложено сразу и настроить. Вводим название города, выбираем его из списка. Информация о погоде должна отображаться сверху под часами и на главном экране в разделе Погода. Если сразу этого не произошло перезапустите KODI.

Раздел погода на главном экранеРаздел погода на главном экране

Возвращаемся к настройке стиля и в разделе Элементы главного меню. Отключаем лишнее. Я оставил лишь фильмы, сериалы, ТВ, дополнения, избранное.

Настройки/Интерфейс/Стиль/Настроить стиль/Элементы главного менюНастройки/Интерфейс/Стиль/Настроить стиль/Элементы главного меню

В разделе Картинки можно выбрать и установить набор фанартов из стандартного репозитория. Это фоновые изображения всех страниц медиацентра. Можно установить любой из понравившихся в списке с префиксом Skin Backgrounds - .

Настройки/Интерфейс/Стиль/Настроить стиль/КартинкиНастройки/Интерфейс/Стиль/Настроить стиль/Картинки

Какое-то время у меня был установлен набор Darkwood Design. Со временем, из нескольких официальных наборов репозитория Kodi.tv собрал самые удачные в дополнение, которое можете также установить себе - resource.images.skinbackgrounds.arbuzov.zip.

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

Оставшиеся параметры системы оставляем по умолчанию, кроме Настройки/Система/Дополнения Неизвестные источники. Этот параметр включить обязательно. Потребуется для установки некоторых дополнений из файлов.

Параметры Проигрывателя я также оставлял без изменений.

Переходим в раздел Настройки/Службы. В Управлении разрешаем удаленное управление по HTTP и устанавливаем пароль. Это нам понадобится для управления KODI с других устройств. Чуть позже разберемся, как это сделать.

Настройки/Службы/УправлениеНастройки/Службы/Управление

В разделе Сведения о системе можно наблюдать за состоянием вашего медиацентра. Здесь и общая информация о системе, накопителях, температурах, сети, а также о каналах PVR.

В разделе Сведения есть счетчик общего времени наработки KODI. Любопытная информация. Мой медиацентр уже наработал 284 дня.

Настройки/Сведения о системе/СведенияНастройки/Сведения о системе/Сведения

Раздел с наиболее значимой информацией Оборудование. Из коробки температура ЦП у меня отображалась также, как и сейчас частота ЦП - -1C. Частоту побороть так и не смог, а вот с температурой разобраться удалось.

Настройки/Сведения о системе/ОборудованиеНастройки/Сведения о системе/Оборудование

Необходимо KODI указать, где брать информацию о температуре. Настраивается в конфигурационном файле advancedsettings.xml. В нем вообще много чего интересного, можно прочесть на официальной странице KODI/Wiki.

Если файла нет создаем его самостоятельно

mcedit /home/имя_пользователя/.kodi/userdata/advancedsettings.xml
<advancedsettings><cputempcommand>sed -e 's/\([0-9]*\)[0-9]\{3\}.*/\1 C/' /sys/class/thermal/thermal_zone0/temp</cputempcommand></advancedsettings>

После перезапуска KODI, температура отображается верно. Какой параметр использовать, например, для Raspberry Pi можно прочесть здесь.

6. IPTV. Как установить и настроить, какой сервис выбрать

Для вещания IPTV в KODI потребуется дополнение PVR IPTV Simple Client, которое мы согласились включить при первом запуске.

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

Ошибка при попытке включить дополнение PVR IPTV Simple ClientОшибка при попытке включить дополнение PVR IPTV Simple Client

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

Установку выполнил вручную. Обязательно использовать последнюю версию deb-пакета. Смотрим актуальную версию здесь - pkgs.org/download/kodi-pvr-iptvsimple. Не забыть верно выбрать дистрибутив и архитектуру.

В моем случае последняя версия 7.5.0 скачиваем для Ubuntu 20.04 LTS (Focal Fossa) и устанавливаем

wget http://ppa.launchpad.net/team-xbmc/ppa/ubuntu/pool/main/k/kodi-pvr-iptvsimple/kodi-pvr-iptvsimple_7.5.0-1~focal_amd64.debsudo dpkg -i ./kodi-pvr-iptvsimple_7.5.0-1_focal_amd64.deb

После установки запускаем KODI, проверяем установлен и запущен ли наш PVR IPTV Simple Client.

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

Был найден оптимальный вариант - ILookTV. Сервис платный 1$/месяц. За эту неподъемную сумму я получил просто огромный список каналов, чуть более 100 из которых в HD-качестве. За год использования не было ни одного сбоя в работе. Что касается скорости передачи, то при моем интернете 25 Мбит/с - проблем не возникало ни разу. Каналы открываются мгновенно, без буферизации. Также хочется отметить качественные логотипы каналов. У других сервисов с этим явные проблемы, во всяком случае, у тех которыми пользовался я.

С регистрацией и оплатой, думаю, проблем возникнуть не должно. Описывать подробно это не буду. Первые сутки, кстати, можно попробовать бесплатно.

В личном кабинете в разделе Плейлист рекомендую выбрать только нужные вам группы каналов (много зарубежных, не русскоговорящих). Помимо выбора групп, также рекомендую пройтись и по самим каналам и отключить не нужные. Это сделать можно в разделе Конструктор. Так, например, изначально мой плейлист составлял 1800+ каналов. После выключения лишних осталось 593 канала.

Будем считать плейлист готов, можно подключать в KODI. Переходим в личном кабинете в раздел Плейлист/Скачать. Использовать можно как ссылку, так и m3u8-плейлист. При использовании ссылки возможны проблемы с доступом к сервису из-за блокировок провайдера. Скачиваем плейлист.

IPTV-плейлист готов, скачиваемIPTV-плейлист готов, скачиваем

Переходим к настройкам клиента Дополнения/Мои дополнения/Клиенты PVR/PVR IPTV Simple Client.

В разделе Основные указываем локальное расположение нашего плейлиста

В разделе EPG указываем ссылку на программу передач (ГИД):

http://epg.it999.ru/edem.xml.gz

При некорректном взаимодействии с часовыми поясами и разницей во времени, можно вручную настроить смещение +/- в часах.

В разделе Channel Logos расположение не трогаем, для Channel logos from XMLTV установить Предпочтительно M3U.

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

Раздел "ТВ" на главном экране KODIРаздел "ТВ" на главном экране KODIСписок каналов, справа подробная информацияСписок каналов, справа подробная информацияТВ-программаТВ-программаВ разделе Сведения о системе/Служба PVR также должна появиться общая информация о каналахВ разделе Сведения о системе/Служба PVR также должна появиться общая информация о каналах

7. Библиотека KODI. Что это такое и как настроить

Библиотека KODI великолепна по своему функционалу и автоматизации всех процессов. Для меня это просто находка. Она структурирует по разделам Фильмы/Сериалы/Музыка и т.д. ваши медиа-данные, загружая автоматически со сторонних ресурсов трейлеры, постеры, информацию о сюжете, актерах, рейтинг и прочее, прочее... Лично я не использую офлайн-медиа, так как локально у меня не хранятся ни фильмы, ни сериалы. Но библиотека отлично взаимодействует и с другими видеодополнениями для просмотра онлайн, в частности с Elementum, который установим чуть позже.

Прежде, чем будем настраивать библиотеку, необходимо установить несколько дополнений с источниками сведений. Мой медиацентр работает с TVDB и КиноПоиск.

Дополнения KinoPoisk в официальных репозиториях нет. Необходимо установить сторонний репозиторий Seppius (скачиваем по ссылке). В браузере дополнений выбрать установку из файла ZIP и указать путь к только что скачанному архиву.

По завершении установки репозитория, возвращаемся назад и выбираем Установить из репозитория/Все репозитории/Источники сведений и устанавливаем в разделе Сведения о сериалах TVDB (new), а в разделе Сведения о фильмах - KinoPoisk.

Дополнения установлены, переходим к настройке библиотеки. Создаем два каталога, для раздельного хранения информации о фильмах и сериалах, например:

/mnt/kodi/library/Movies библиотека фильмов
/mnt/kodi/library/Shows библиотека сериалов

Далее переходим в Настройки/Медиа/Медиатека/Видео и нажимаем добавить Видеоисточник. Добавляем каталог с фильмами, даем произвольное название источнику.

В типе содержимого указываем, что этот каталог содержит фильмы, источник сведений KinoPoisk. Параметры сканирования, как на скриншоте.

Аналогично поступаем и с источником для сериалов. Обратите внимание на отличие в настройках и параметрах сканирования, это важно.

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

8. Elementum и Burst. Настраиваем просмотр контента торрент-онлайн

Это, наверное, самый важный функционал всего медиацентра, из-за которого все и затевалось. Elementum видеодополнение, которое у нас будет работать с торрент-трекерами. Дополнение отлично справляется не только с проигрыванием онлайн торрент-контента, но и с поиском, отличным отображением всей информации о фильмах и сериалах с постерами, актерами и их фотографиями. В общем, просто не заменимая вещь. Burst дополнение к Elementum провайдер, который непосредственно взаимодействует с трекерами.

Итак, все по порядку. В официальных репозиториях Elementum нет. Его необходимо скачать с сайта разработчика - elementum.surge.sh, выбрав платформу (у нас Linux x64).

Устанавливаем также из файла ZIP, как устанавливали репозиторий для Кинопоиска, при подготовке библиотеки. По завершении установки KODI сам предложит установить дополнение Burst соглашаемся.

Переходим к настройкам Elementum. Привожу свои настройки на скриншотах. Обязательно указать пути для загрузок, торрентов, включить интеграцию с библиотекой KODI и указать путь к самой библиотеке (ее создавали в предыдущем разделе).

Что касается настроек загрузок, то мой накопитель в 500 Гб совершенно не лимитирует. Я установил параметры в использование файлов, максимальное. Файлы автоматически не удаляются после просмотра. Их периодически удаляю вручную.

Настройки BitTorrent оставил по умолчанию. Торренты загружаются и сидируются без ограничений по скорости. Прокси-сервер не включаем, это важно.

Переходим к настройкам провайдера Burst в Дополнения/Программные дополнения. Прокси также не используем. В разделах Разрешение и Качество выбрал только 1080p/720p и качество выше Screener/SCR, так как телевизор не поддерживает 2K/4K, а экранки не смотрю.

Настройки Elementum BurstНастройки Elementum Burst

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

Открытые:
MegaPeer

Закрытые (нужна регистрация на сайте, в настройках Burst указать логин/пароль):
Rustorka
NNM-Club
RuTracker
Кинозал

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

Применяем настройки и запускаем Elementum.

Главное меню дополнения ElementumГлавное меню дополнения Elementum

Перейдите, например, в раздел Фильмы/Самые просматриваемы и выберите любой фильм.

Если все верно настроено Burst просканирует, указанные вами трекеры, и предложит выбрать стрим.

Список раздачСписок раздач

Выбрав стрим, Elementum буферизирует порядка 20-50 Мб (в зависимости от общего размера фильма) и начинает его воспроизведение.

Если завершить просмотр, согласно нашим настройкам, скачивание продолжится в фоновом режиме, информация о прогрессе будет в верхнем правом углу. Этот параметр можно отключить в настройках Elementum, тогда при остановке просмотра, загрузка будет останавливаться (или останавливаться и удаляться торрент + файл).

Для того, чтобы добавить фильм/сериал из Elementum в библиотеку из контекстного меню выбрать Добавить в библиотеку.

Котекстное меню фильма/сериала в ElementumКотекстное меню фильма/сериала в Elementum

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

"Сериалы" на главном экране"Сериалы" на главном экранеСписок серий в разделе "Сериалы"Список серий в разделе "Сериалы"Раздел "Фильмы" на главном экранеРаздел "Фильмы" на главном экране

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

Все фильмы библиотекиВсе фильмы библиотеки

На данном этапе основные настройки выполнены, медиацентром уже можно пользоваться и получать удовольствие от просмотра.

В следующей публикации поговорим о возможности внешнего управления KODI/Elementum и qBittorrent с помощью веб-интерфейса и Android-устройств. А также внедрим в наш медиацентр функцию учета трафика с возможностью отображения и анализа в веб-интерфейсе. Не забудем и о резервном копировании, как операционной системы, так и самого KODI.

Подробнее..

KODI. Как я собирал свой самый удобный и функциональный медиацентр для дома. Часть 2

24.03.2021 18:04:11 | Автор: admin

Продолжаем "изобретать" свой медиацентр. Начало здесь - KODI. Как я собирал свой самый удобный и функциональный медиацентр для дома. Часть 1.

Содержание:

  1. Просмотр YouTube

  2. Внешнее управление медиацентром и системой

    1. Управление qBittorrent (веб-интерфейс и мобильное приложение для Android)

    2. Управление KODI Android-устройством (Yatse, Kore)

    3. Веб-интерфейс KODI и Elementum

  3. Учет трафика медиацентра (vnStat + веб-интерфейс)

  4. Резервное копирование KODI

1. Просмотр YouTube

Было бы странно иметь современный медиацентр без возможности просмотра роликов на самом популярном видеохостинге - YouTube. Для этого есть одноименное дополнение из официального репозитория. Дополнение отлично взаимодействует и синхронизирует историю, каналы, подписки и прочее. Все как у всех. Что-то особо описывать и обозревать не вижу смысла.

Единственное, с чем могут возникнуть проблемы с авторизацией на сервисе. Для этого необходимо в консоли приложений Google создать API-проект и получить идентификатор клиента, ключ API и cсекретный код клиента. Только имея эти данные вы сможете авторизовать дополнение. На просторах сети достаточное количество пошаговых инструкций. Например, одна из них на overclockers.ru.

Но есть куда более элегантный, удобный и быстрый способ проигрывания YouTube-роликов на медиацентре KODI с помощью мобильного телефона и стандартного приложения YouTube в нем. Никаких дополнений и настроек в самом медиацентре, при этом, не требуется. К этому мы вернемся чуть позже, когда будем рассматривать управление медиацентром с помощью мобильного телефона.

2. Внешнее управление медиацентром и системой

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

Возможность удаленного администрирования Ubuntu по SSH-протоколу реализовали, VNC-подключение есть. Все исправно работает как с Windows, так и c Android-устройств (если пропустили, смотрите разделы 2 и 5 предыдущей публикации).

2.1. Управление qBittorrent (веб-интерфейс и мобильное приложение на Android)

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

Для этого в настройках qBittorrent включить использование веб-интерфейса, задав логин/пароль и порт. Я указываю 8081, если помните порт 8080 мы указывали в настройках KODI, он уже занят.

Теперь можем проверить доступность веб-интерфейса. Он полностью повторяет интерфейс самого приложения, работает без нареканий - рекомендую!

Помимо веб-интерфейса, использую и приложение на android-устройствах - qBittorrent Controller. Настроить подключение к вашему серверу не сложно. Вам понадобиться все тот же порт, логин и пароль.

2.2. Управление KODI Android-устройством (Yatse, Kore)

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

Для Android-платформ на выбор есть два варианта:
Kore официальное бесплатное приложение;
Yatse стороннее платное ($3.56). Большинству будет достаточно и бесплатного функционала.

Оба варианта отлично справляются со своими задачами. Для подключения используется порт 8080 и логин/пароль, заданный при первоначальной настройке KODI. Оба приложения позволяют управлять просмотром IPTV и контента из библиотеки, дополнениями. Библиотека кэшируется и доступна без подключения к медиацентру, просматривать информацию о фильмах и сериалах можно за пределами домашней сети. Хочется отметить, что Yatse с этим справляется немного лучше. Например, моя библиотека, наполненная исключительно онлайн контентом из Elementum, отображается со всеми постерами и изображениями, Kore отображает только локальные. С логотипами каналов из m3u8-плейлиста IPTV не справляется ни одно приложение, если логотипы локальные отобразят оба.

Из отличительного функционала обоих приложений, хотелось бы выделить интеграцию с Android. На любом медиафайле из контекстного меню можно выбрать пункт Воспроизведение на медиацентре KODI. Итого, любую фотографию, видео или аудиофайл, буквально в несколько кликов вы можете отправить на большой экран вашего телевизора. Еще более приятно - из приложения YouTube на своем телефоне/планшете вы можете нажать Поделиться и также выбрать Воспроизведение на медиацентре KODI - видеоролик мгновенно начнет воспроизведение на вашем телевизоре. По этой причине, кстати, я не использую дополнение YouTube, о котором недавно шла речь, хоть оно установлено и подключено к аккаунту. Гораздо удобнее и быстрее проигрывать ролики с телефона, чем из дополнения.

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

Какое выбрать решать вам. Лично я отдаю предпочтение Yatse. Больше возможностей даже в бесплатной версии, гибкие настройки и более привлекательный интерфейс.

Скриншоты Yatse
Таким не хитрым способом можно проиграть любой медиа-файл с вашего телефона на телевизоре. Это же работает и в приложении YouTubeТаким не хитрым способом можно проиграть любой медиа-файл с вашего телефона на телевизоре. Это же работает и в приложении YouTube
Скриншоты Kore

2.3. Веб-интерфейс KODI и Elementum

Также для удаленного управления у медиацентра есть и веб-интерфейс. Для доступа необходим все тот же порт (8080) и логин/пароль. Функционал довольно-таки ограниченный, но его вполне достаточно для просмотра и запуска контента из библиотеки и IPTV. Взаимодействие с дополнениями также поддержано. Внешний вид веб интерфейса можно изменить, доступно несколько вариантов из стандартного официального репозитория KODI.

Свой веб-интерфейс также имеет и дополнение Elementum. Позволяет просматривать текущее состояние торрентов, добавлять новые из файла или magnet-ссылки, а также удалять уже имеющиеся. Из него также можно напрямую запустить воспроизведение торрента на медиацентре.

Скриншоты веб интерфейсов KODI и Elementum

3. Учет трафика медиацентра (vnStat + веб-интерфейс)

Мониторинг объемов входящего/исходящего трафика для медиацентра, конечно, не совсем актуален, но на длинной дистанции - любопытная информация. Для реализации этой задачи существует множество программ, в том числе и для Ubuntu. Если оставить в этом списке лишь те, которые имеют в своем составе графический интерфейс (веб, например) и анализ данных подходящего совсем немного, из-за своей масштабности, так как это будут полноценные приложения администрирования сети с огромным набором возможностей и, как следствие, высокой ресурсоемкостью. Нагружать медиацентр, ненужными в домашних условиях инструментами, не хотелось бы.

Для простого учета и отображения статистики отлично подойдет vnStat - легковесная программа для мониторинга сетевого трафика для операционной системы Linux с использованием интерфейса командной строки. Программа будет следить не за нашим KODI, а за сетевым интерфейсом. Это именно то, что нужно, так как помимо KODI, работает еще и qBittorrent.

Из коробки поставляется без веб-интерфейса, но благодаря энтузиастам, в сети есть несколько вариантов, отлично взаимодействующих с vnStat. Мне понравился вариант jsvnstat. На сайте разработчика также есть раздел Demo, в котором можно пощупать, как это выглядит и работает.

jsvnstat разработан в далеком 2013 году и, к сожалению, с тех пор не обновлялся. В связи с этим, актуальную версию самого vnStat веб-интерфейс не поддерживает. Не проблема нам будет достаточно возможностей и более старых версий.

Методом перебора нашел последнюю поддерживаемую версию vnStat 1.14. В репозиториях Ubuntu ее уже нет. Можно скачать из репозитория моего GitHub.

Скачиваем и устанавливаем нужную версию

wget https://github.com/arboozov/kodi/raw/master/vnstat_1.14-1ubuntu2_amd64.debsudo dpkg -I vnstat_1.14-1ubuntu2_amd64.deb

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

sudo apt-mark hold vnstat

Создаем БД для нашего сетевого интерфейса (в моем случае это enp1s0)

vnstat -i -u enp1s0

Устанавливаем и запускаем веб-сервер

sudo add-apt-repository ppa:ondrej/phpsudo apt-get updatesudo apt-get install apache2 php5.6 php5.6-gd wget libapache2-mod-php5.6sudo service apache2 restart

Теперь необходимо загрузить и разместить сам веб-интерфейс на нашем медиацентре. Можно использовать оригинальный вариант с сайта разработчика, либо немного измененный мой вариант. Глобальных правок я не вносил, но немного подправил внешний вид, цвета, убрал лишнее и скорректировал расчет суммарного объема входящего/исходящего трафика в ТБ.

Загружаем, например, мой вариант

wget https://github.com/arboozov/kodi/raw/master/jsvnstat.zip

Распаковываем архив по пути /var/www/html/stat/

unzip jsvnstat.zip -d /var/www/html/stat/

Задаем параметру $interface наш сетевой интерфейс, с которым будем работать, сохраняем изменения

mcedit /var/www/html/stat/settings.php

Настройка завершена, переходим по адресу http://IP-адрес_вашего_медиацентра/stat/. Если все сделано верно отобразится наш веб-интерфейс с анализом трафика с момента установки пакета. БД по умолчанию будет обновляться автоматически каждые 5 минут.

4. Резервное копирование KODI

Медиацентр с KODI на борту, обросший дополнительными возможностями на базе Kubuntu 20.04, полностью настроен и готов к работе. На этом этапе стоит задуматься над резервным копированием и сохранением всего, что сделано, в этом первоначальном состоянии. Не будем недооценивать стабильность и надежность работы нашей операционной системы, но на случай выхода из строя аппаратной части, того же SSD-накопителя, например, хотелось бы иметь возможность быстро восстановить работу, причем в том же состоянии, с наименьшими усилиями. С нуля производить установку и настройку снова сомнительное удовольствие.

Рекомендую иметь хотя бы одну копию (например, первоначального состояния) всей системы. Я сохранил образ диска с помощью Clonezilla. Имея такую копию, без особого труда, можно сказать в пару кликов, меняем накопитель и поднимаем Kubuntu со всеми настройками. Подробно описывать порядок снятия или установки образа не буду. Кто не сталкивался с работой Clonezilla хорошая инструкция на русском языке со скриншотами на losst.ru.

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

Так как у меня медиацентр работает и подключен к сети круглосуточно, работу планировщика настроил на еженедельное копирование всех данных KODI в понедельник в 4:00 с хранением двух копий в архиве. То есть, условно, на третей неделе, при резервном копировании будет удалена самая старая копия (с первой недели).

Но где же хранить резервные копии? Хранить под собой на том же диске выстрел себе в ногу, на такой бэкап можно даже не тратить время. Сетевой каталог на другом домашнем хосте в моем случае не вариант, ночью все ПК выключены, днем тоже нет постоянного графика. Включать, например, в ночь каждого понедельника (по моему расписанию) домашний компьютер сомнительная автоматизация. Хотелось бы не участвовать в этом процессе от слова совсем.

Dropbox

Дополнение поддерживает интеграцию с этим популярным файловым хостингом. Подключение не сложное. Необходимо через консоль в личном кабинете сервиса создать приложение для работы с API, предоставить ему необходимый доступ (чтение, запись и удаление), а полученные ключи указать дополнению и авторизоваться. Для авторизации Backup сгенерирует ссылку, перейдя по которой Dropbox сгенерирует код валидации для подтверждения. Работает все очень хорошо, за одним исключением. Авторизации хватает на одну сессию. После перезапуска KODI авторизоваться необходимо повторно. Без авторизации, понятное дело, резервная копия не будет загружена на хостинг. Как итог, процесс опять же требует нашего вмешательства вариант нам не подходит.

Яндекс.Диск

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

В разделе Управление аккаунтом Яндекс.Диска создаем пароль приложения по WebDAV API.

Для работы с WebDAV API в Ubuntu, устанавливаем в систему пакет davfs2

sudo apt-get install davfs2

Создаем каталог, куда будем монтировать наш Яндекс.Диск и назначаем права

sudo mkdir /mnt/yandex.disksudo chmod -R 0777 /mnt/yandex.disk

Добавляем аккаунт нашего Яндекса в davfs2, где:
логин имя пользователя в сервисе Яндекс, без @домена
пароль ID, созданный в паролях приложений аккаунта Яндекс.Диск

echo "https://webdav.yandex.ru логин пароль" >> /etc/davfs2/secrets

Монтируем в директорию /mnt/yandex.disk

sudo mount -t davfs https://webdav.yandex.ru /mnt/yandex.disk

Конфигурируем fstab, чтобы монтирование Яндекс.Диска в наш каталог происходило автоматически, при старте системы

sudo mcedit /etc/fstab

Вставить в конец файла

https://webdav.yandex.ru:443 /mnt/yandex.disk davfs user,rw,_netdev 0 0

Осталось лишь указать наш каталог в настройках дополнения Backup.

Не будем дожидаться ближайшей ночи понедельника и запустим создание резервной копии вручную. После года работы KODI, объем данных для резервирования у меня составляет 1.61 Гб, после архивации 1.35 Гб. В верхнем правом углу будет выводиться информация о ходе выполнения резервной копии.

Google Drive

По аналогии можно настроить бэкап KODI и на сервис от Google. Отличие будет лишь в монтировании его в систему. Приступаем.

Нам понадобится пакет google-drive-ocamlfuse. Добавляем в систему репозиторий, обновляем список пакетов и устанавливаем

sudo add-apt-repository ppa:alessandro-strada/ppasudo apt-get updatesudo apt-get install google-drive-ocamlfuse

Создаем директорию, куда будем монтировать и назначаем права

sudo mkdir /mnt/google.drivesudo chmod -R 0777 /mnt/google.drive

Теперь необходимо из-под пользователя (не sudo), авторизованного в системе из консоли выполнить команду

google-drive-ocamlfuse /mnt/google.drive

Вы будете перенаправлены в браузер для авторизации. По ее завершении Google у вас спросит разрешить ли KODI управлять вашим диском подтверждаем.

Готово, можно перейти в директорию /mnt/google.drive и увидеть там свои файлы в облаке.

Как и в случае с Яндекс.Диском, Google Drive после перезапуска системы автоматически не смонтирует ваш диск. Настроим автомонтирование самостоятельно.

Создаем скрипт

mcedit /usr/bin/gdfuse

Вставляем содержимое

#!/bin/bashgoogle-drive-ocamlfuse -label $1 $*exit 0

Назначаем права на выполнение и копируем в root

sudo chmod +x /usr/bin/gdfusesudo cp -r /home/имя_пользователя/.gdfuse /root/

Осталось лишь сконфигурировать fstab

sudo mcedit /etc/fstab

Вставляем в конец файла

gdfuse#default /mnt/google.drive fuse allow_other 0 0

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

В завершении темы о резервном копировании KODI, хочется добавить, что, помимо стандартных данных для резервирования, можно добавить и свой каталог. С единственным ограничением каталог должен быть по пути /home/имя_пользователя/.kodi/. Например, у меня там находится каталог wiki с какими-то моими заметками, скриптами и настройками. Для этого в настройках дополнения Backup в Типы файлов сменить режим с Simple на Advanced и добавить нужный каталог он теперь также будет добавлен в архив резервной копии.


Таким образом, при наличии небольшого количества времени и навыков, получаем мультимедийный комбайн с дополнительными возможностями домашнего сервера и множеством комфортных способов управления, способного работать 24/7/365, аналога которому я пока не нашел, возможно лишь по тому, что и не искал он целиком и полностью устраивает меня и моих домочадцев.

P.S. В планах на втором телевизоре также поднять KODI (вероятно на Raspberry Pi 3/4) и синхронизировать оба устройства с помощью MySQL. Публикация о проделанной работе в этом направлении обязательно будет.

Подробнее..

KODI собираем удобный и функциональный медиацентр для дома. Часть 6. Синхронизация медиатеки. MariaDB

12.04.2021 02:07:50 | Автор: admin

Лирическое отступление

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

Но я все больше погружался в его возможности и постепенно наращивал функционал. Реализовал, казалось бы, простые вещи, но, если сложить все мелкие детали воедино понимаешь, насколько все комфортно, логично и продумано, а главное - функционально. Именно такую оценку я даю всему конечному результату. Для кого-то это будет вовсе не так, конечно, ведь у всех свои фломастеры. Но после первых публикаций я получил массу положительных откликов от аудитории и гостей хабра, и понял, что кому-то пригодился мой опыт. Это приятно. Поэтому, хочется продолжать.

Если вы пропустили предыдущие публикации обязательно загляните в них, возможно и для вас найдется что-то интересное. Если в двух словах установили и настроили с нуля ОС и KODI, настроили просмотр торрент-контента, YouTube, IPTV. Поговорили об управлении с других устройств, резервном копировании, анализе трафика и даже научили KODI запускать ретро-игры.

Все предыдущие публикации:

KODI: собираем удобный и функциональный медиацентр для дома. Часть 1
KODI: собираем удобный и функциональный медиацентр для дома. Часть 2
KODI: собираем удобный и функциональный медиацентр для дома. Часть 3. Ретро-игры
KODI: собираем удобный и функциональный медиацентр для дома. Часть 4. Архив IPTV
KODI: собираем удобный и функциональный медиацентр для дома. Часть 5. Яндекс.Музыка

Зачем это все затевалось?

Среди медиаустройств, в моем домашнем обиходе два телевизора. Основной в гостиной работает с KODI, второй на кухне под управлением Tizen OS. Мысль о том, что последнего также нужно посадить на KODI возникла спустя пару недель после запуска медиацентра на основном телевизоре. Но руки все никак не доходили

Каждый раз, переключая ужасного качества каналы кабельного ТВ на кухне, я вспоминал о своей затее. И вот пришло время воплотить ее в жизнь. Для этой задачи в поднебесной был заказан Raspberry Pi 3 и все та же аэромышь, как и для основного телевизора (подробнее о ней в первой части).

Итого, в гостиной KODI на базе неттопа с Kubuntu 20.04 на борту, на кухне LibreELEC на базе третьей малинки.

Кухонный медиацентр должен выполнять всего две задачи:
просмотр IPTV. Буду использовать все тот же сервис ilook и дополнение PVR IPTV Simple Client. К слову, сервис позволяет использовать плейлист на двух устройствах без дополнительной платы за тариф.
просмотр торрент-видео. Потому как локальной библиотеки фильмов и сериалов у меня нет.

О том, как установить LibreELEC на малинку описывать, думаю, не стоит. А как подключить IPTV и Elementum для просмотра торрентов я рассказывал в другой публикации.

Общее понимание архитектуры есть, причем же здесь MariaDB в заголовке? Представьте, вы смотрите фильм в гостиной, идете обедать на кухню и продолжаете просмотр ровно с того места, на котором остановились. Здорово, не правда ли?

KODI позволяет реализовать синхронизацию медиатеки на разных устройствах. Для этого потребуется MySQL-сервер, на котором и будет храниться эта медиатека. Сервер может быть поднят на совершенно сторонней машине, хоть под управлением Windows. В моем случае, основной медиацентр работает 24/7, аппаратные ресурсы позволяют сервером назначает его, на нем и будем поднимать базу данных.

Надеюсь, суть и прелести такой архитектуры домашних медиацентров понятна.

Подготовка серверной части. MariaDB

Прочитав Wiki на официальном сайте KODI, решил, что все довольно просто и понятно бери и делай. Но на практике оказалось все иначе БД не наполняется моей медиатекой, в логах ошибки не поддаются пониманию или записей нет вообще, от того понять, что сделано не так достаточно трудно. Второе устройство подключать к БД смысла нет синхронизировать нечего.

В комментариях к предыдущей публикации был затронут этот вопрос и @vyacheslavteplyakov дал понять, что Wiki не обновляется и информация, вероятно, устарела. Но и указал на основные подводные камни и как их обойти.

Особенности:

  • Использовать MariaDB;

  • Медиатека должна быть размещена в сетевом каталоге;

  • Все пути к медиатеке на всех устройствах должны быть абсолютные;

  • Сетевые каталоги NFS или SMB, если вынуждены использовать NTFS, то только с авторизацией по учетной записи с паролем;

  • Версии KODI на всех устройствах должны быть одинаковы.

С задачей и подводными камнями разобрались приступаем к работе. Напомню, сервером у нас будет KODI на неттопе с Kubuntu 20.04.

Устанавливаем сервер MariaDB

sudo apt updatesudo apt install mariadb-server

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

Запускаем скрипт безопасности

sudo mysql_secure_installation

Откроется серия диалогов, где можно внести некоторые изменения в параметры безопасности установки MariaDB. Параметры установите, исходя из собственной безопасности. Учитывая, что моя БД будет наполняться лишь медиатекой и находится она в изолированной домашней сети сделал так:

root@kodi-pc:/# sudo mysql_secure_installationNOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!In order to log into MariaDB to secure it, we'll need the currentpassword for the root user.  If you've just installed MariaDB, andyou haven't set the root password yet, the password will be blank,so you should just press enter here.Enter current password for root (enter for none):

Пароль не задаем, нажимаем ENTER.

Setting the root password ensures that nobody can log into the MariaDBroot user without the proper authorisation.Set root password? [Y/n]

Отклоняем (N).

By default, a MariaDB installation has an anonymous user, allowing anyoneto log into MariaDB without having to have a user account created forthem.  This is intended only for testing, and to make the installationgo a bit smoother.  You should remove them before moving into aproduction environment.Remove anonymous users? [Y/n]

Удаляем (Y).

Normally, root should only be allowed to connect from 'localhost'.  Thisensures that someone cannot guess at the root password from the network.Disallow root login remotely? [Y/n]

Отклоняем (N).

By default, MariaDB comes with a database named 'test' that anyone canaccess.  This is also intended only for testing, and should be removedbefore moving into a production environment.Remove test database and access to it? [Y/n]

Удаляем (Y).

Reloading the privilege tables will ensure that all changes made so farwill take effect immediately.Reload privilege tables now? [Y/n]

Соглашаемся (Y).

Теперь создадим пользователя, из-под которого будут работать с БД наши медиацентры. Для создания пользователя kodi с паролем kodi запускаем оболочку MariaDB и выполняем команду

sudo mariadbGRANT ALL ON *.* TO 'kodi'@'localhost' IDENTIFIED BY 'kodi' WITH GRANT OPTION;

Разрешаем доступ с любого хоста ко всем базам данных на сервере для пользователя kodi

GRANT ALL PRIVILEGES ON *.* TO kodi@'%' IDENTIFIED BY 'kodi';

Очищаем привилегии, чтобы они были сохранены и доступны в текущем сеансе

FLUSH PRIVILEGES;

Оболочку MariaDB можно закрывать, выполнив команду

exit

Для организации доступа вне локального хоста, необходимо указать порт 3306 и bind-address 0.0.0.0. Открываем конфигурационный файл MariaDB

sudo mcedit /etc/mysql/mariadb.conf.d/50-server.cnf

Раскомментировать параметр

port = 3306

Для параметра bind-address установить 0.0.0.0 (вместо 127.0.0.1)

bind-address = 0.0.0.0

Для применения изменений перезапускаем MySQL-сервер

sudo service mysql restart

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

Как вариант - MySQL Workbench.

Создаем новое подключение:
Connection Method - Standart (TCP/IP)
Hostname 192.168.0.50 (заменить на адрес вашего сервера)
Port 3306
Username kodi (имя пользователя, если создавали своего)

Нажимаем Test Connection, вводим пароль и в случае, если все корректно получаем соответствующее сообщение:

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

Подготовка серверной части. KODI

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

Библиотеку мы настраивали еще в первой части. Никуда ее не переносим, пути оставляем прежние:
/mnt/kodi/library/Movies библиотека фильмов
/mnt/kodi/library/Shows библиотека сериалов

Необходимо лишь расшарить каталог /mnt/kodi/library. Конфигурируем samba

sudo mcedit /etc/samba/smb.conf

В конец конфигурационного файла вставляем:

[library]comment = librarypath = /mnt/kodi/library/browsable = yeswritable = yesguest ok = yesread only = noforce user = nobodyforce group = nogroupforce create mode = 0777force directory mode = 0777

И перезапускаем сервис samba

sudo /etc/init.d/smbd restart

Теперь наша библиотека будет доступна всем устройствам в домашней сети.

Важно! В источниках медиатеки также необходимо указать абсолютный путь к директории с файлами библиотеки! Хоть она и находится локально на этом устройстве (сервере).

Переходим в Настройки/Медиа/Медиатека/Видео и в существующих источниках Movies и Shows изменяем пути на нужные, выбрав Добавить сетевой адрес. В качестве логина и пароля используйте данные вашей учетной записи в Kubuntu.

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

Теперь дадим понять KODI, что мы хотим работать с базой данных. Для этого в файле advancedsettings.xml (/home/имя_пользователя/.kodi/userdata/) добавить:

<advancedsettings>  <videodatabase>    <type>mysql</type>    <host>192.168.0.50</host>    <port>3306</port>    <user>kodi</user>    <pass>kodi</pass>  </videodatabase>  <videolibrary>    <importwatchedstate>true</importwatchedstate>    <importresumepoint>true</importresumepoint>  </videolibrary></advancedsettings>

Если файл advancedsettings.xml отсутствует создайте его вручную. Параметры изменить в соответствии с вашими настройками, где:
Host IP-адрес вашего MySQL-сервера;
User имя пользователя MariaDB;
Pass пароль пользователя MariaDB.

На стороне сервера всё готово. Можно проверить. Перезапускаем KODI и, в зависимости от объема вашей медиатеки, ждем какое-то время, пока KODI ее обработает.

Информация о моей медиатеке:
Фильмов 322
Сериалов 68

Размер - 380 Кб

Общее количество файлов (nfo и strm) 3826

Моя медиатека обрабатывалась порядка 10 минут. По завершении обновления медиатеки давайте посмотрим на нашу БД. Снова подключаемся к серверу с помощью MySQL Workbench.

Как видим, KODI самостоятельно создал БД MyVideos119 и наполнил ее всеми нашими фильмами и сериалами. Например, в таблице Movie - фильмы. Значит, мы все сделали правильно.

После завершения импорта медиатеки в БД, можно еще оценить и ее ресурсопотребление. Моя медиатека заняла в ОЗУ чуть более 100 Мб. Это дает понять, что, даже значительный рост количества фильмов и сериалов, не скажется на производительности основного моего медиацентра.

Настройка клиентской части

Настройки других устройств, которые необходимо синхронизировать с сервером, очень просты:

  • advancedsettings настраиваем, также как на сервере;

  • добавляем источники в Настройки/Медиа/Медиатека/Видео также, как и на сервере, указывая абсолютные сетевые пути;

  • если вы, как и я используете дополнение Elementum в его настройках также изменить пути на абсолютные до сервера (путь к библиотеке и путь к торрент-файлам). Таким образом, где бы вы не начали смотреть (скачивать) фильм, сохранится он на сервере. Да и в моем случае, не рационально было бы для малинки иметь свое файловое хранилище.

Для упрощения настройки своей малинки я просто перенес конфигурационные файлы с основного медиацентра:

/home/kodi/.kodi/userdata/advancedsettings.xml
/home/kodi/.kodi/userdata/sources.xml
/home/kodi/.kodi/userdata/addon_data/plugin.video.elementum/settings.xml
/home/kodi/.kodi/userdata/addon_data/script.elementum.burst/settings.xml

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

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

Если мой медиацентр обзаведется еще какими-то интересными возможностями - обязательно сделаю отчет в следующих публикациях.

Всем хорошего времяпрепровождения с медиацентром KODI!

Подробнее..

Подключаем дисплей SPI LCD ILI9341 к одноплатному компьютеру Banana Pi BPI-M64 или любому другому на ОС Armbian

15.03.2021 20:13:27 | Автор: admin
LCD SPI ILI9341 Banana Pi BPI-M64

Пост содержит инструкцию как подключить TFT-LCD дисплей на популярном контроллере ILI9341 к одноплатному компьютеру на ОС Armbian с помощью дерева устройств (Device Tree overlays) без танцев с бубном. В сети Интернет много материала как подключать различные LCD экраны к Raspberry Pi. Но что если у вас нет Raspberry Pi, а хочется подключить недорогой LCD экран на SPI интерфейсе? Все что вам необходимо, это любая плата с поддержкой ОС Armbian. В каталог поддерживаемых плат ОС Armbian входят платы: Asus, Pine64, Hardkernel, Orange Pi, Banana Pi, и т.д. На данный момент в каталоге более 114 моделей плат, объявлена поддержка различного оборудования из коробки. Доступны для подключения: 4G/LTE модемы, USB Wi-Fi, USB Bluetooth, USB Ethernet, сканеры DVB-тюнеры и т.д. К всем этим платам можно легко подключить SPI LCD дисплей ILI9341, как это реализовать прошу под кат.

Преамбула


Многие одноплатные компьютеры снабжены HDMI выходом, но подключение полноценного дисплея с поддержкой HDMI входа достаточно дорогое удовольствие для небольшого проекта. В особенности, если необходимо реализовать минимальный функционал взаимодействия с пользователем, терминал распечатки документов, вывод текущего статуса работающего приложения. Для подобных задач можно использовать символьные дисплеи LCD HD44780 на интерфейсе I2C, они достаточно дешевы и удобны. Но в тоже время сильно ограничены в функциональности, на эти экраны невозможно вывести консоль Linux и нативный UI приложения, вдобавок площадь LCD экрана нельзя использовать как панель ввода информации. Для решения этих задач прекрасно подойдут LCD экраны на SPI интерфейсе, дисплей диагональю 3.5 дюйма с резистивным слоем можно приобрести за 9.57$ (включая доставку). На LCD экран можно выводить консоль Linux и подсистему X11. Таким образом, использование SPI LCD является лучшим вариантом по соотношению функциональности к стоимости.

Дисплей ILI9341 2.2 inch 2.2" SPI TFT


Контроллер ILI9341 предназначен для управления TFT панелью. Под контроллер ILI9341 поставляются панели диагональю от 2.2 до 3.2 дюймов, разрешение 240x320, к некоторым LCD добавляют резистивный слой.
К одноплатному компьютеру Banana Pi BPI-M64 будем подключать модуль SPI LCD ILI9341 диагональю 2.4 дюйма без резистивного слоя.

Рассмотрим характеристики и распиновку SPI LCD ILI9341 2.4 inch

  • 2,4-дюймовый цветной экран, поддержка 65K цветов
  • разрешение 320X240
  • интерфейс подключения SPI
  • доступен слот для SD-карты
  • питание модуля 3.3V~5V
  • Напряжение управления логикой 3.3V(TTL)

Контакты подключения LCD
Number Pin Label Description
1 VCC 5V/3.3V power input
2 GND Ground
3 CS LCD chip select signal, low level enable
4 RESET LCD reset signal, low level reset
5 DC/RS LCD register / data selection signal,high level: register, low level: data
6 SDI(MOSI) SPI bus write data signal
7 SCK SPI bus clock signal
8 LED Backlight control, high level lighting,if not controlled, connect 3.3V always bright
9 SDO(MISO) SPI bus read data signal, if you do not need to the read function, you can not connect it

Для управления подсветки используется контакт номер 8 LED. Максимальное напряжение 3.3V соответствует максимальной яркости от общего питания VCC. Если необходимо задать 50% яркости экрана, то на LED необходимо подать напряжение в 1.65V. Для программного управления яркости подсветки необходимо контакт LED подключать к аналоговому выходу GPIO на одноплатном компьютере. В случае наличия только цифровых выходов, доступна лишь возможности включить или полностью выключить подсветку экрана.

Исходя из характеристик LCD экрана предъявляются следующие требования к одноплатному компьютеру:
  • наличие SPI интерфейса
  • напряжение логики на контактах 3.3V (большинство плат)
  • потребуется еще два (RESET, DC/RS) свободных контактов GPIO

Что ты за зверь Armbian и какой одноплатный компьютер необходим


На странице armbian.com/download представлено большое количество разнообразных одноплатных компьютеров. С точки зрения удобства подключения, лучше выбирать плату с 40-контактным разъемом GPIO совместимым с Raspberry Pi 3. Например, если подключать SPI LCD ILI9341 2.4 inch к плате Banana Pi BPI-M64 и Orange Pi PC, то номера физически подключаемых контактов GPIO будут совпадать (не путать с названиями контактов процессора, они будут различны, далее потребуется для конфигурирования). В случае если одноплатный компьютер будет построена не на процессоре Allwinner, то возможно потребуется изменять больше параметров в файле: sun50i-a64-spi-ili9341-led-always-on.dts (будет далее по тексту).

Armbian это самый популярный дистрибутив Linux, предназначенный для одноплатных компьютеров построенных на ARM процессоре, список поддерживаемых плат огромен: Orange Pi, Banana Pi, Odroid, Olimex, Cubieboard, Roseapple Pi, Pine64, NanoPi и др. Дистрибутив Armbain основан на Debian и Ubuntu.

После явления миру Raspberry Pi, китайские производители решили тоже влиться в движение Open Hardware Source, и сделали много разнообразных плат. Но программная поддержка была крайне слабой, для решения данной проблемы зародился проект Armbian. На данный момент Armbian уже исполнилось 7 лет, поддерживается 114 моделей плат, объявлена поддержка различного оборудования из коробки. Доступны для подключения: 4G/LTE модемы, USB Wi-Fi, USB Bluetooth, USB Ethernet, сканеры DVB-тюнеры и т.д.

Для запуска Armbian на одноплатном компьютере необходимо загрузить образ с сайта, затем скопировать его на microSD карту, с которой в последствие нужно будет загрузиться. Если на плате размещена eMMC память достаточного объема, то через утилиту armbian-config, операционная система легко переносится с microSD карты на eMMC память вместе с загрузчиком.

Создание IoT-проекта с использованием Armbian в отличие от Raspberry Pi, позволяет выбирать платы различающие по производительности, и набора периферии. Например, на всех версиях Raspberry Pi размещен только один Ethernet порт. Но если требуется сделать маршрутизатор с несколькими Ethernet портами, то из списка поддерживаемых плат Armbian подойдут модели: Helios64, Espressobin, Bananapi R2, и т.д.

Поддерживаемые SoC
  • Allwinner A10, A20, A31, H2+, H3, H5, H6, A64
  • Amlogic S805 and S905 (Odroid boards), S802/S812, S805, S905, S905X and S912 (fork by @balbes150)
  • Actionsemi S500
  • Freescale / NXP iMx6
  • Marvell Armada A380
  • Rockchip RK3288/RK3328/RK3399
  • Samsung Exynos 5422

Схема подключения SPI LCD ILI9341 2.4 inch к Banana Pi BPI-M64 (порт GPIO Raspberry Pi 3)


SPI интерфейс LCD экрана подключаем к SPI1 на Banana Pi BPI-M64. Контакты CS, RESET, DC/RS можно подключать к любым цифровым выводам.

Таблица контактов подключения:
Номер LCD Метка LCD Номер контакта на Banana Pi BPI-M64 (порт GPIO Raspberry Pi 3)
1 VCC 1 или 2 (если необходима максимальная яркость, то контакт 2 на 5V)
2 GND 39, или любой другой Ground
3 CS 24
4 RESET 18
5 DC/RS 22
6 SDI(MOSI) 19
7 SCK 23
8 LED 1 или любой свободный GPIO на 3.3V
9 SDO(MISO) 21

Если контакт LED подключать к цифровому выводу GPIO, то для включения подсветки вручную потребуется подавать логическую 1 для включения или 0 для выключения экрана.

Схема подключения SPI LCD ILI9341:
LCD SPI ILI9341 Banana Pi BPI-M64

Одноплатный компьютер Banana Pi BPI-M64


Banana Pi BPI-M64 это 64-битный четырехъядерный мини-одноплатный компьютер, поставляемый как решение с открытым исходном кодом. Ядром системы является процессор Allwinner A64 с 4-мя ядрами Cortex-A53 с частотой 1.2 ГГц. На плате размещено 2 ГБ DDR3 SDRAM 733МГц оперативной памяти и 8 ГБ eMMC.

Самое главное для успешного подключения SPI LCD необходимо знать название контактов для SPI интерфейса, их номер и название зависит от модели процессора. Для решения этой задачи необходим Allwinner A64 Datasheet. На Wiki-странице Banana Pi BPI-M64 представлена распиновка 40-контактного разъема GPIO, из которого мы узнаем название контактов: PD2, PD3, и т.д.
40 PIN GPIO of Banana pi BPI-M64
GPIO Pin Name Default Function Function2GPIO Function3
CON2-P18 PD4 PD4
CON2-P19 SPI1-MOSI PD2 UART4-TX
CON2-P21 SPI1-MISO PD3 UART4-RX
CON2-P22 PC0 PC0
CON2-P23 SPI1-CLK PD1 UART3-RX
CON2-P24 SPI1-CS PD0 UART3-TX

Помимо название контакта, необходимо узнать порядковый номер этого контакта на ножке процессора, легко вычисляется по формуле: (позиция буквы в алфавите 1) * 32 + позиция вывода. Рассчитаем номер ножки для контакта PD2. Первая буква не учитывается т.к. P PORT, позиция буквы D в алфавите = 4, получаем (4-1) * 32 + 2 = 98. Контакту с меткой PD2 соответствует 98 ножка на процессоре, далее потребуется для конфигурирования дерева устройств.

Дерево устройств (Device Tree, DT) в Linux


Дерево устройств (Device Tree, DT) это структура данных в системе Linux, состоящая из именованных узлов и свойств, описывающих оборудование, которое невозможно обнаружить путем опроса оборудования. Дерево должно включать имя базового процессора, конфигурацию его памяти и любые периферийные устройства (внутренние и внешние). DT не используется для описания программного обеспечения, хотя перечисление аппаратных модулей вызывает загрузку модулей драйверов.

Сердцем любой отладочной платы или одноплатного компьютера является SoC. SoC имеет множество контактов (ног) для подключения линий электропитания и различных устройств.

Allwinner V3s

Контакты могут быть объедены вместе для формирования интерфейса, например MIPI DSI(MIPI Display Serial Interface). Интерфейс MIPI DSI предназначен для подключения LCD панелей, активно используется в смартфонах и планшетах. Но если к устройству не планируется подключать дисплей по MIPI DSI, то эти линии можно использовать для других целей, путем изменения DT. В отличие от архитектуры x86 в системах построенных на SoC нет возможности произвести полностью опознание всех устройств в режиме Plug and Play. Поэтому необходимо явное декларирование какие контакты используются для интерфейсов и какие именно устройства подключены к этим интерфейсам.

До появления DT информация об устройствах в Linux являлась неотъемлемой частью ядра, и в случае изменения состава периферийных устройств требовалось пересобрать образ системы. Это было крайне неудобно, и поэтому описание периферийных устройств перенесли в конфигурационные файлы, которые собираются на логическом уровне в дерево. Где ветвь устройство с указанием драйвера необходимого для работы этого устройства.

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

Наложения дерева устройств (Device Tree overlays)


Device Tree overlays (наложения дерева устройств) добавление к DT принципа наложения слоев устройств. Если конфигурация описывает интерфейс UART к которому был подключен Bluetooth, и необходимо Bluetooth заменить на GPS модуль, то можно не удалять существующие настройки Bluetooth а добавить дополнительный слой для GPS модуля который переопределит предыдущие настройки.

Для работы с DT используются следующие термины:
DT Дерево устройств
DTB (*.dtb) Бинарный файл дерева устройств
DTBO (*.dtbo) Бинарный файл дерева устройств для наложения
DTC Компилятор дерева устройств
DTO Наложения дерева устройств
DTS (*.dts) Исходный файл для дерева устройств
FDT Flattened Device Tree, двоичный формат, содержащийся в файле .dtb

Аппаратная конфигурация описывается в файлах исходниках DT ( .dts ) затем они компилируется в бинарные файлы DT ( .dtb ) уже для конечного использования в системе. Так же можно выполнить обратную процедуру декомпиляции файлов *. dtb в *. dts, компилятор/декомпилятор присутствует в системе.

Linux device tree bootloader

Реализация DTO включает разделение дерева устройств, построение, разбиение на разделы и исполнение.

Разделение DT


DT разделяются на две части:
  • Main DT (основное дерево устройств). Предоставляет разработчик SoC и является настройкой по умолчанию. В данном случае предоставляет компания Allwinner разработчик процессора Allwinner A64.
  • Overlay DT (Накладываемое дерево устройств). Специфическая конфигурация производителя платы, включает периферийные устройства которые размещены на плате. Для платыBanana Pi BPI-M64 предоставляет компания SinoVoip Co.,

Тема Device Tree overlays в Linux достаточно большая, чтобы не превращать пост в многотомное произведение Ленина, более детально можно почитать в публикации Работа с GPIO на примере Banana Pi BPI-M64. Часть 2. Device Tree overlays.

Формирование DTS для SPI LCD ILI9341 2.4 inch


Тестирование производилось на образе Armbian_20.08.2_Bananapim64_bionic_current_5.8.6_minimal.img.xz, на основе Ubuntu 18.04.5 LTS (Bionic Beaver), ядро Linux 5.8.6. uname: Linux bananapim64 5.8.6-sunxi64 #20.08.2 SMP Fri Sep 4 08:52:31 CEST 2020 aarch64 aarch64 aarch64 GNU/Linux.

В Armbian уже есть драйвер для ILI9341, поэтому все что требуется, это создать файл описания устройства в формате DTS, скомпилировать его в формат DTBO, и перезагрузить одноплатный компьютер. Как говорится Easy!

Для формирования файла DTS необходимо узнать ссылку на gpiochip в котором находится SPI интерфейс, для этого откроем терминал Armbian и выполним команду cat /sys/kernel/debug/gpio:

root@bananapim64:~# cat /sys/kernel/debug/gpiogpiochip1: GPIOs 0-255, parent: platform/1c20800.pinctrl, 1c20800.pinctrl: gpio-120 (                    |bananapi-m64:red:pwr) out hi gpio-142 (                    |bananapi-m64:green:u) out lo gpio-143 (                    |bananapi-m64:blue:us) out lo gpio-166 (                    |cd                  ) in  lo ACTIVE LOW gpio-233 (                    |usb0_id_det         ) in  hi IRQgpiochip0: GPIOs 352-383, parent: platform/1f02c00.pinctrl, 1f02c00.pinctrl: gpio-354 (                    |reset               ) out hi ACTIVE LOW gpio-356 (                    |shutdown            ) out hi gpio-357 (                    |host-wakeup         ) in  lo gpio-358 (                    |device-wakeup       ) out higpiochip2: GPIOs 510-511, parent: platform/axp20x-gpio, axp20x-gpio, can sleep:

Данная команда выведет все доступные устройства gpiochip и номера задействованных контактов в операционной системе. В предыдущем разделе для контакта SPI1-MOSI, название контакта PD2, определили номер ножки процессора 98. Исходя из полученного результата номер 98 приходится на диапазон GPIOs 0-255, который соответствует чипу gpiochip1: GPIOs 0-255, parent: platform/1c20800.pinctrl, 1c20800.pinctrl. Далее для формирования файла DTS потребуется узнать ссылку на 1c20800.pinctrl.

Создадим файл DTS с названием: sun50i-a64-spi-ili9341-led-always-on.dts (в основе dts файл для платы Orange Pi PC):
/dts-v1/;/plugin/;/ {compatible = "allwinner,sun8i-h3";  fragment@0 {    target = <&pio>;    __overlay__ {      ili9341_pins: ili9341_pins {        pins = "PD4", "PC0"; /*RESET, DC_RS*/        function = "gpio_out", "gpio_out" ;      };    };  };    fragment@1 {    target = <&spi1>;    __overlay__ {      status = "okay";            cs-gpios = <&pio 3 0 0>; /* PD0 */      ili9341: ili9341@0 {        compatible = "ilitek,ili9341";        reg = <0>;        pinctrl-names = "default";        pinctrl-0 = <&ili9341_pins>;        spi-max-frequency = <16000000>;        rotate = <90>;        bgr;        fps = <25>;        buswidth = <8>;        reset-gpios = <&pio 3 4 1>; /*RESET=PD4*/        dc-gpios = <&pio 2 0 0>; /*DC_RS=PC0*/        /*led-gpios = <&pio 2 4 0>; LED=PC4*/        debug = <0>;      };    };  };};

Рассмотрим содержимое:

  • fragment@0 является наложением на блок узла /soc/pinctrl@1c20800, ссылка этого узла &pio. Описывает название задействованных контактов GPIO PD4", PC0 и определяет функцию gpio_out для контактов.
  • &pio это ссылка в дереве устройств для контактов GPIO на узел /soc/pinctrl@1c20800, название определяли выше. Ссылка берется из файла в Armbian по пути: /boot/dtb-5.8.6-sunxi64/allwinner/sun50i-a64-bananapi-m64.dtb.Для компиляции в формат DTS, выполнить команду: $ dtc -I dtb -O dts sun50i-a64-bananapi-m64.dtb -o sun50i-a64-bananapi-m64.dts
  • fragment@1 является наложением на блок узла /soc/spi@1c69000, ссылка этого узла &spi1.
  • status = okay задействует SPI1 интерфейс на плате для подключения устройств
  • cs-gpios = <&pio 3 0 0>; /* PD0 */ номер контакта для CS интерфейса SPI1.
  • <&pio 3 0 0> параметры контакта, где &pio ссылка на gpioiochip1 в основном дереве устройств, буква P не учитывается, означает PORT, буква D кодируется в цифру 3 (формула: порядковый номер буквы в алфавите 1), 0 после цифры 3 это позиция вывода, 0 из PD0, и последний 0 означает полярность, по умолчанию всегда 0 (полярность 0 на логический ноль, выдается напряжение 0; полярность 1 на логический ноль, выдается напряжение 1).
  • compatible = ilitek,ili9341 идентификатор драйвера для данного устройства
  • pinctrl-0 = <&ili9341_pins> ссылка на используемые контакты из fragment@0
  • spi-max-frequency = <16000000> частота работы SPI интерфейса
  • rotate = <90> ориентация изображения, поворот на 90 градусов, в зависимости как необходимо расположить дисплей.
  • fps = <25> кадров в секунду
  • reset-gpios = <&pio 3 4 1> контакт RESET=PD4
  • dc-gpios = <&pio 2 0 0> контакт DC_RS=PC0

Разместим файл по пути /boot/dtb/allwinner/overlay. Затем компилирует файл .dts в .dtbo:

$ dtc -O dtb -o sun50i-a64-spi-ili9341-led-always-on.dtbo sun50i-a64-spi-ili9341-led-always-on.dts

Запустим утилиту конфигурирования платы: $ armbian-config. Перейдем по меню: System > Hardware, и включим слой (overlay): spi-ili9341-led-always-on. После перезагрузки платы, консоль Linux будет на SPI LCD экране:

LCD SPI ILI9341 Banana Pi BPI-M64


Midnight Commander и Htop на SPI LCD
Midnight Commander
LCD SPI ILI9341 Banana Pi BPI-M64

Htop
LCD SPI ILI9341 Banana Pi BPI-M64


Название контактов
Для всех процессоров Allwinner формат записи контакта, соответствует виду cs-gpios = <&pio 3 0 0>, для других процессоров формат записи контакта будет отличаться.

Решение проблем


Если изображение не появилось на LCD, выполните команду для проверки: $ dmesg | grep -E 'ili9341'.

В консоли должна быть следующая информация:
root@bananapim64:/boot/dtb-5.8.6-sunxi64/allwinner# dmesg | grep -E 'ili9341'[    5.733989] fb_ili9341: module is from the staging directory, the quality is unknown, you have been warned.[    5.734718] fb_ili9341 spi0.0: fbtft_property_value: buswidth = 8[    5.734731] fb_ili9341 spi0.0: fbtft_property_value: debug = 0[    5.734737] fb_ili9341 spi0.0: fbtft_property_value: rotate = 90[    5.734744] fb_ili9341 spi0.0: fbtft_property_value: fps = 25[    6.119287] graphics fb0: fb_ili9341 frame buffer, 320x240, 150 KiB video memory, 16 KiB buffer memory, fps=25, spi0.0 at 16 MHz


Настройка SPI LCD для графического интерфейса Xfce и подсистемы X11


Для вывода консоли Linux достаточно добавить файл DTS и все, но для вывода графики этого недостаточно.

1) Установим XORG и XFCE:

$ sudo apt-get update$ sudo apt-get install xorg$ sudo apt-get install xfce4

2) Для процессора Allwinner необходимо дополнительно устанавливать GPU драйвер fbdev:

$ sudo apt-get install xserver-xorg-video-fbdev

3) Удалить все конфигурационные файлы по пути /etc/X11/xorg.conf.d (если нет файлов, то отлично)

4) Создать конфигурационный файл по пути /usr/share/X11/xorg.conf.d/99-fbdev.conf и разместить в нем следующий фрагмент:

Section "Device"    Identifier "myfb"  Driver "fbdev"  Option "fbdev" "/dev/fb0"EndSection

Где /dev/fb0 устройство SPI LCD. Если к плате подключена HDMI панель, то может быть два устройства /dev/fb0 и /dev/fb1.

Запускаем графический интерфейс командой: startx или startxfсe4:

LCD SPI ILI9341 Banana Pi BPI-M64


Если необходимо сразу переходить в графический интерфейс, то необходимо дополнительно установить пакеты:
$ sudo apt-get remove tasksel$ sudo apt-get remove xubuntu-desktop

Для возвращения запуска только консоли необходимо отключить автозапуск службы display-manager.service

$ sudo systemctl disable display-manager.service

Решение проблем


Если графический интерфейс не запускается то для решение проблем необходимо посмотреть журнал событий X11, командой:

$ cat /var/log/Xorg.0.log


Итог


Установка и настройка SPI LCD не требует никаких компиляций модулей из исходного текста, что существенно упрощает установку. Главное внимательно выставить контакты и все заработает из коробки. Поставленные цели успешно решены.

RoadMap


  1. Подключение дисплея большего размера 3.5 дюйма на контроллере ILI9488.
  2. Настройка Touch интерфейса для Xfсe.
  3. Вывод на SPI LCD только одного графического приложения используя подсистему X11 из Docker контейнера (решение для публичных терминалов, киосков, POS-терминалов).

Файл sun50i-a64-spi-ili9341-led-always-on.dts и другие файлы наложения дерева доступны в каталоге GitHub Banana-Pi-BPI-M64/dt-overlays/
Подробнее..

KODI собираем удобный и функциональный медиацентр для дома. Часть 3. Ретро-игры

27.03.2021 22:10:41 | Автор: admin

Продолжаем строить домашний медиа-комбайн на Kubuntu с KODI на борту. О том, как разворачивался медиацентр, как его настраивали и какими дополнительными возможностями он оброс, можно прочесть в предыдущих публикациях:

KODI: собираем удобный и функциональный медиацентр для дома. Часть 1
KODI: собираем удобный и функциональный медиацентр для дома. Часть 2

Сегодня добавим нашему медиацентру еще одну обязанность запуск ретро-игр. Причем, играть будем прямо из KODI и из его библиотеки игр. Загружать сами игры будем там же.

Воплотить идею в жизнь нам поможет RetroArch. Он работает на основе LibRetro API и объединяет множество эмуляторов и игровых движков, а также отлично взаимодействует с KODI то, что нам и нужно. Каких-то особых трудностей в реализации этой связки нет, но учитывая платформу Linux, есть некоторые нюансы, зная которые вы легко сможете повторить установку и настройку на своем медиацентре. Приступаем!

Первым делом необходимо установить сам RetroArch. Устанавливать рекомендую с помощью snap-пакета, потому как RetroArch включает в себя некоторые необходимые зависимости, которые не удовлетворяет (но это не точно) установка из deb-пакета. Если вы не хотите столкнуться, как я, с некорректным отображением кодировки, кривого интерфейса и ручными правками конфигурационных файлов RetroArch используйте установку именно из snap-пакета.

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

Так выглядит первый запуск после установки из deb-пакетаТак выглядит первый запуск после установки из deb-пакета

Устанавливаем RetroАrch. Если демон для управления snap-пакетами snapd отсутствует в системе будет установлен автоматически

sudo snap install retroarch

Установка завершена, запускаем RetroArch, выполнив в терминале одноименную команду

retroarch
Так выглядит первый запуск RetroArch, если все установлено корректно. Сравните со скриншотом выше...Так выглядит первый запуск RetroArch, если все установлено корректно. Сравните со скриншотом выше...

Первым делом переходим в раздел Главное меню/Онлайн и обновляем всю конфигурацию:
Обновить информационные файлы ядер;
Обновить ассеты;
Обновить профили контроллеров;
Обновить читы;
Обновить базы данных;
Обновить оверлеи;
Обновить GLSL шейдеры.

Обновляем все доступные конфигурацииОбновляем все доступные конфигурации

В разделе Главное меню/Load Core/Загрузить ядро загрузить необходимые ядра. Под ядром понимаем эмулятор игровой платформы. Для надежности я загрузил все доступные ядра, решив, что хуже точно не будет. Особенно, учитывая большое количество поддерживаемых платформ в KODI, выбирать и искать нужные займет больше времени, чем загрузка и установка всех эмуляторов.

Загружаем все доступные ядраЗагружаем все доступные ядра

Все остальные настройки оставил по умолчанию, кроме Настройки/Драйверы/Оконный режим - Запускать в полноэкранном режиме.

Подготовка RetroArch завершена, можем его закрывать. В дальнейшем KODI будет сам его вызывать при запуске игр, автоматически выбирая нужное ядро (эмулятор).

Переходим к настройке KODI. Для управления играми и их запуска нам потребуется дополнение Internet Archive Game Launcher. Устанавливаем из файла ZIP репозиторий Zach Morris Add-ons, а уже из него нужное нам дополнение.

Если при установке дополнения сталкиваемся с ошибкой Требуемое дополнение vfs.libarchive версии 0.0.0 не найдено - не пугаемся!

Ошибка при установке Internet Archive Game LauncherОшибка при установке Internet Archive Game Launcher

Закрываем KODI и устанавливаем его вручную из терминала Kubuntu

sudo apt-get install kodi-vfs-libarchive

По завершении установки запускаем KODI и он сам спросит, включить ли дополнение соглашаемся и повторно пробуем установить дополнение Internet Archive Game Launcher. Ошибок уже быть не должно.

Дополнение установлено, все успешно, можем перейти к его настройке.

Для начала запускаем мастер настройки Setup Wizard. Сообщаем дополнению, что у нас нет аккаунта archive.org, в качестве лаунчера использовать Kodi Retroplayer и соглашаемся с установкой эмуляторов по умолчанию, а также подтверждаем загрузку всех списков игр.

Далее в настройках указываем размер хранилища для игр, в зависимости от ваших ресурсов (zero кэш выключен, игра будет загружаться каждый раз). Я бы рекомендовал не скупиться и все же использовать кэш, особенно тем, кто решит играть в тяжелые игры от Playstation, например. Размер их исчисляется в ГБ, а скорость загрузки там не самая высокая.

В разделе External Launchers выбираем Linux и указываем пути:
/snap/bin/retroarch/
/home/имя_пользователя/snap/retroarch/423/.config/retroarch/retroarch.cfg

Если у вас не будет возможности указать путь к конфигурационному файлу, расположенному в скрытой директории (.config), то включите эту возможность в системе Настройки/Медиа/Общие/Показывать скрытые файлы и папки.

На этом настройка завершена, запускаем дополнение и проверяем. Сразу хочу оговориться, что запускаются не все типы платформ. Например, при запуске из категории Gameboy, KODI будет жаловаться, что не найден эмулятор. Но проверив несколько десятков игр на других популярных платформах (Dendy, SEGA, SEGA Dreamcast, Nintendo, Playstation, PSP) все успешно запускается, можно ностальгировать.

Как и говорил, загрузка "тяжелых" игр, объемом даже 500-600 Мб, занимает довольно много времени, вне зависимости от вашего канала связи. Вероятно, ограничение сервера на отдачу. При запуске KODI автоматически вызывает нужный эмулятор. С учетом запуска в полноэкранном режиме, кажется, что игра запускается прямо в KODI.

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

Хорошего времяпрепровождения!

Подробнее..

KODI собираем удобный и функциональный медиацентр для дома. Часть 5. Яндекс.Музыка

07.04.2021 12:05:29 | Автор: admin

Продолжаем изобретать домашний медиацентр с помощью Kubuntu и KODI. В предыдущих публикациях рассмотрели, как с чистого листа установить и настроить ОС и сам KODI, подключили отличное IPTV с программой передач, возможностью перемотки и просмотра архива IPTV. Также получили возможность играть в ретро-игры прямо на телевизоре с помощью все того же KODI. Ну и конечно просмотр торрент-контента.

Все это и многие другие плюшки подробно рассмотрели ранее. Если пропустили обязательно загляните в эти публикации:
KODI: собираем удобный и функциональный медиацентр для дома. Часть 1
KODI: собираем удобный и функциональный медиацентр для дома. Часть 2
KODI: собираем удобный и функциональный медиацентр для дома. Часть 3. Ретро-игры
KODI: собираем удобный и функциональный медиацентр для дома. Часть 4. Архив IPTV

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

Речь пойдет о достаточно популярном сервисе Яндекс.Музыка. В особом представлении, думаю он не нуждается. Для интеграции KODI с этим сервисом нам потребуется одноименное дополнение.

Для его установки в KODI версии 19.0 Matrix скачиваем ZIP-файл репозитория Dandy's Kodi Repository (Matrix). Для версии 18.0 Lea - Dandy's Kodi Repository (Lea).

Репозиторий установлен - устанавливаем аудиодополнение Яндекс.Музыка.

Никаких сложных действий далее от нас не требуется. Нужна лишь авторизация. Без авторизации треки играют по 30 секунд (ограничение Яндекса).

В поле логин указать только имя пользователя (без @ и домена).

После авторизации в дополнения становится доступным раздел Моя музыка.

Также доступны:

  • Поиск (только исполнители)

  • Новые плейлисты

  • Новые релизы

  • Чарт

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

Также дополнение поддерживает удаленное управление (Yatse/Kore).

Приятного прослушивания музыки!

Подробнее..

Управляем контактами GPIO из C .NET 5 в Linux на одноплатном компьютере Banana Pi M64 (ARM64) и Cubietruck (ARM32)

10.05.2021 12:10:00 | Автор: admin
dotnet libgpiod

Когда заходит речь про программирование на C# .NET для одноплатных компьютеров, то разговоры крутятся только в основном вокруг Raspberry Pi на Windows IoT. А как же Banana/Orange/Rock/Nano Pi, Odroid, Pine64 и другие китайские одноплатные компьютеры работающие на Linux? Так давайте это исправим, установим .NET 5 на Banana Pi BPI-M64 (ARM64) и Cubietruck (ARM32), и будем управлять контактами GPIO из C# в Linux. В первой части серии постов, подключим светодиод и кнопку для отработки прерываний и рассмотрим библиотеку Libgpiod (спойлер, библиотеку так же можно использовать в C++, Python) для доступа к контактам GPIO.

Предисловие


Управление светодиодом и получение событий от кнопки будет реализовано через библиотеку Libgpiod, которая не является частью платформы .NET. Данная библиотека предоставляет доступ к GPIO из любого языка программирования, требуется лишь написание класса обертки.

Данный пост применим не только к платам Banana Pi BPI-M64 и Cubietruck, но и другим, основанных на процессоре ARM архитектуры armv71(32-bit) и aarch64 (64-bit). На Banana Pi BPI-M64 (ARM64) и Cubietruck (ARM32) установлена ОС Armbian версии 21.02.1, основанная на Ubuntu 18.04.5 LTS (Bionic Beaver), ядро Linux 5.10.12. uname: Linux bananapim64 5.10.12-sunxi64 #21.02.1 SMP Wed Feb 3 20:42:58 CET 2021 aarch64 aarch64 aarch64 GNU/Linux

Armbian это самый популярный дистрибутив Linux, предназначенный для одноплатных компьютеров построенных на ARM процессоре, список поддерживаемых плат огромен: Orange Pi, Banana Pi, Odroid, Olimex, Cubietruck, Roseapple Pi, Pine64, NanoPi и др. Дистрибутив Armbain основан на Debian и Ubuntu. Из большого перечня поддерживаемых одноплатных компьютеров можно выбрать то решение, которое лучше всего походит для вашего IoT проекта, от максимально энергоэффективных до высокопроизводительных плат с NPU. И на базе всех этих одноплатных компьютеров, вы сможете реализовать свое решения на платформе .NET и работать с периферийными устройствами из кода на C#.

Что такое GPIO


GPIO(general-purpose input/output) интерфейс ввода/вывода общего назначения. GPIOподключены напрямую к процессоруSoC (System-on-a-Chip Система на кристалле), и неправильное использование может вывести его из строя. Большинство одноплатных компьютеров, кроме обычных двунаправленных Input/Output портов, имеют один или более интерфейсов: UART,SPI,IC/TWI,PWM (ШИМ), но не имеютADC (АЦП). GPIO- порты обычно могут быть сконфигурированны на ввод или вывод (Input/Output), состояние по умолчанию обычноINPUT.

Некоторые GPIO-порты являются просто питающими портами 3.3V, 5V и GND, они не связаны сSoCи не могут использоваться как либо еще.

Порты сальтернативной функцией- могут быть мультиплексированны с одним изсоответствующих емуинтерфейсов.

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

Работа с контактами GPIOосуществляется через виртуальную файловую систему sysfs. стандартный интерфейс для работы с контактами sysfs впервые появился с версии ядра 2.6.26, в Linux. Работа с GPIO проходит через каталог /sys/class/gpio путём обращения к файлам-устройствам.

К портам GPIO подключаются:

  • светодиоды;
  • кнопки;
  • реле;
  • температурные и другие датчики;
  • различные периферийные устройства.

Для программирования GPIO существует несколько способов обращения:

  • Посредством файл-устройства GPIO;
  • Используя языки программирования:
    • Через прямое обращение к регистрам чипа;
    • Используя уже готовые библиотеки (libgpiod).


Одноплатный компьютер Banana Pi BPI-M64


Banana Pi BPI-M64 это 64-битный четырехъядерный мини-одноплатный компьютер, поставляемый как решение с открытым исходном кодом. Ядром системы является процессор Allwinner A64 с 4-мя ядрами Cortex-A53 с частотой 1.2 ГГц. На плате размещено 2 ГБ DDR3 SDRAM 733МГц оперативной памяти и 8 ГБ eMMC.

На плате размещен 40-контактный совместимый с Raspberry Pi разъем, который содержит: GPIO (x28), Power (+5V, +3.3V and GND), UART, I2C, SPI. И 40-контактный интерфейс MIPI DSI.

dotnet libgpiod
Banana Pi BPI-M64 и 40-контактный разъем типа Raspberry Pi 3

Наличие 40-контактного разъема типа Raspberry Pi 3 GPIO, существенно облегчает подключение датчиков из-за совпадение назначение контактов с Raspberry Pi 3. Не приходится гадать к какому контакту подключать тот или иной датчик. Указанные в посте датчики (светодиод и кнопка) подключенные к Banana Pi BPI-M64, можно подключать на те же самые контакты другого одноплатного компьютера, на котором тоже есть 40-контактный разъем, типа Raspberry Pi 3 (или к самой Raspberry Pi 3, разницы нет никакой). Единственное, необходимо изменить номера контактов (линий, ножка процессора) в программном коде, т.к. они зависят от используемого процессора. Но легко определяются но названию контакта. Плата Cubietruck (ARM32) приведена для проверки совместимости и работы кода на 32-разрядных ARM процессорах.

Banana Pi BPI-M64 GPIO Header Position
Позиция [1] 3V3 power соответствует позиции на плате со стрелочкой

Формула для вычисления номера GPIOXX
Для обращение к контактам из C# кода необходимо знать порядковый номер (линия, порт) физической ножки процессора SoC(для Allwinner). Эти данные в спецификациях отсутствую, т.к. порядковый номер получаем путем простого расчета. Например, из схемы возьмем 32-контакт на разъеме типа Raspberry Pi. Название контакта PB7, для получения номера контакта на процессоре произведем расчет по формуле:
(позиция буквы в алфавите 1) * 32 + позиция вывода.Первая буква не учитывается т.к. P PORT, позиция буквы B в алфавите = 2, получаем (2-1) * 32 + 7 = 39. Физический номер контакта PB7является номер 39. У каждого разработчика SoC может быть свой алгоритм расчета номера контактов, должен быть описан в Datasheet к процессору.

Banana Pi BPI-M64 GPIOXX
Контакт PB7 на процессоре Allwiner A64, номер ножки 39

Библиотеки .NET IoT


До того как напишем первую программу на C# по управления GPIO, необходимо рассмотреть пространство имен входящих в dotnet/iot. Все используемые библиотеки добавляются через Nuget пакеты. Подробно рассмотрим драйвера для получения доступа к контактам GPIO одноплатного компьютера. Код на C# взаимодействует с GPIO через специальный драйвер, который является абстракцией доступа к GPIO и позволяет переносить исходный код от одного одноплатного компьютера к другому, без изменений.

Пространства имен .NET IoT:

  • System.Device.Gpio. Пакет System.Device.Gpio поддерживает множество протоколов для взаимодействия с низкоуровневыми аппаратными интерфейсами:
    • General-purpose I/O (GPIO);
    • Inter-Integrated Circuit (I2C);
    • Serial Peripheral Interface (SPI);
    • Pulse Width Modulation (PWM);
    • Serial port.


  • Iot.Device.Bindings. Пакет Iot.Device.Bindings содержит:
    • Драйвера и обертки над System.Device.Gpio для различных устройств которые упрощают разработку приложений;
    • Дополнительные драйвера поддерживаемые сообществом (community-supported).


dotnet IoT Library
Стек библиотек .NET IoT

Рассмотрим первую программу типа Hello World, мигание светодиода (Blink an LED):

using System;using System.Device.Gpio;using System.Threading;Console.WriteLine("Blinking LED. Press Ctrl+C to end.");int pin = 18;using var controller = new GpioController();controller.OpenPin(pin, PinMode.Output);bool ledOn = true;while (true){    controller.Write(pin, ((ledOn) ? PinValue.High : PinValue.Low));    Thread.Sleep(1000);    ledOn = !ledOn;}

Разбор кода:

  • using System.Device.Gpio пространство имен для использования контроллера GpioController доступа к аппаратным ресурсам;
  • using var controller = new GpioController() создает экземпляр контроллера для управления контактами GPIO;
  • controller.OpenPin(pin, PinMode.Output) инициализирует контакт pin = 18 на вывод, к 18 контакту подключен светодиод;
  • controller.Write(pin, ((ledOn)? PinValue.High: PinValue.Low)) если ledOn принимает значение True, то PinValue.High присваивает высокое значение 18 контакту и светодиод загорается. На 18 контакт подается напряжение в 3.3V. Если ledOn принимает значение False, то PinValue.Low присваивает низкое значение контакту 18 и светодиод гаснет. На 18 контакт подается напряжение в 0V (или минимальное пороговое для значения 0, может быть немного выше 0V).

Далее остается компиляция под ARM архитектуру: dotnet publish -r linux-arm или dotnet publish -r linux-arm64. Но так работает просто только для Raspberry Pi. При использование одноплатных компьютерах отличных от Raspberry Pi необходимо при инициализации GpioController выбирать драйвер доступа к GPIO.

Драйвера доступа к GPIO из .NET


Классы драйверов доступа к GPIO находятся в пространстве имен System.Device.Gpio.Drivers. Доступны следующие драйвера-классы:

  • HummingBoardDriver GPIO драйвер для платы HummingBoard на процессоре NXP i.MX 6 Arm Cortex A9;
  • LibGpiodDriver этот драйвер использует библиотеку Libgpiod для получения доступа к портам GPIO, заменяет драйвер SysFsDriver. Библиотека Libgpiod может быть установлена на Linux и Armbian, не является аппаратно-зависимой, что позволяет ее использовать для различных одноплатных компьютерах ARM32 и ARM64;
  • RaspberryPi3Driver GPIO драйвер для одноплатных компьютеров Raspberry Pi 3 или 4;
  • SysFsDriver GPIO драйвер работающий поверх интерфейса SysFs для Linux и Unux систем, предоставляет существенно меньше возможностей, чем драйвер LibGpiodDriver, но не требует установки библиотеки Libgpiod. Тот случай, когда хочется просто попробовать помигать светодиодом из C# без дополнительных действий;
  • UnixDriver базовый стандартный класс доступа к GPIO для Unix систем;
  • Windows10Driver GPIO драйвер для ОС Windows 10 IoT. Из поддерживаемых плат только Raspberry Pi, весьма ограниченное применение.

В данном посте будет рассматриваться доступ к GPIO через драйвер LibGpiodDriver. Драйвер SysFsDriver базируется на устаревшем методе работы с GPIO через виртуальную файловую систему SysFs. Для решений IoT, SysFs не подходит по трем серьезным причинам:

  • Низкая скорость работы I/O;
  • Есть проблемы с безопасной работой с GPIO при совместном доступе;
  • При контейнеризации приложения на C# в контейнер придется пробрасывать много путей из файловой системы Linux, что создается дополнительные сложности. При использование библиотеки Libgpiod этого не требуется.

Библиотека Libgpiod предназначена для работы с GPIO не только из .NET кода, но и из Python, C++, и т.д. Поэтому ниже изложенная инструкция по установке библиотеки Libgpiod позволит разработчикам на Python реализовывать подобную функциональность, как и на C#. В состав пакета Libgpiod входят утилиты для работы с GPIO. До создание программы на C#, поработаем с датчиками через эти утилиты.

Схема подключения светодиода (LED) и кнопки


Подключать светодиод и кнопку будем на 40-контактный разъем совместимый с Raspberry Pi 3. Светодиод будет подключен на 33 контакт разъема, название контакта PB4, номер линии 36. Кнопка будет подключен на 35 контакт разъема, название контакта PB6, номер линии 38. Необходимо обратить внимание на поддержку прерывания на контакте PB6 для кнопки. Поддержка прерывания необходима для исключения постоянного опроса линии с помощью CPU. На контакте PB6 доступно прерывание PB_EINT6, поэтому кнопку к этому контакту и подключим. Например, соседний контакт PL12 не имеет прерывание, поэтому подключать кнопку к нему кнопку не будем. Если вы подключаете кнопку и резистор напрямую, то не забывайте в цепь добавить резистор для сопротивления для избежания выгорания порта!

libgpiod Armbian
Схема подключения светодиода (LED) и кнопки к 40-контактному разъему совместимый с Raspberry Pi 3

libgpiod Armbian
Схема назначения контактов к которым подключается светодиод (LED) и кнопка

Интерфейс GPIO ядра Linux


GPIO (General-Purpose Input/Output) является одним из наиболее часто используемых периферийных устройств во встраиваемых системах (embedded system) Linux.

Во внутренней архитектуре ядро Linux реализует доступ к GPIO через модель производитель/потребитель. Существуют драйверы, которые предоставляют доступ к линиям GPIO (драйверы контроллеров GPIO) и драйверы, которые используют линии GPIO (клавиатура, сенсорный экран, датчики и т. д.).

В ядре Linux система gpiolib занимается регистрацией и распределением GPIO. Эта структура доступна через API как для драйверов устройств, работающих в пространстве ядра (kernel space), так и для приложений пользовательского пространства (user space).

libgpiod Armbian
Схема работы gpiolib

Старый путь: использование виртуальной файловой системы sysfs для доступа к GPIO


До версии ядра Linux 4.7 для управления GPIO в пользовательском пространстве использовался интерфейс sysfs. Линии GPIO были доступны при экспорте по пути /sys/class/gpio. Так, например, для подачи сигнала 0 или 1 на линию GPIO, необходимо:

  1. Определить номер линии (или номер ножки процессора) GPIO;
  2. Экспортировать номер GPIO, записав его номер в /sys/class/gpio/export;
  3. Конфигурировать линию GPIO как вывод, указав это в /sys/class/gpio/gpioX/direction;
  4. Установить значение 1 или 0 для линии GPIO /sys/class/gpio/gpioX/value;

Для наглядности установим для линии GPIO 36 (подключен светодиод) из пользовательского пространства, значение 1. Для этого необходимо выполнить команды:

# echo 36 > /sys/class/gpio/export# echo out > /sys/class/gpio/gpio36/direction# echo 1 > /sys/class/gpio/gpio36/value

Этот подход очень простой как и интерфейс sysfs, он неплохо работает, но имеет некоторые недостатки:

  1. Экспорт линии GPIO не связан с процессом, поэтому если процесс использующий линию GPIO аварийно завершит свою работу, то эта линия GPIO так и останется экспортированной;
  2. Учитываю первый пункт возможен совместный доступ к одной и той же линии GPIO, что приведет к проблеме совместного доступа. Процесс не может узнать у ОС используется ли та или иная линия GPIO в настоящий момент;
  3. Для каждой линии GPIO приходится выполнять множество операций open()/read()/write()/close(), а так же указывать параметры (export, direction, value, и т.д.) используя методы работы с файлами. Это усложняет программный код;
  4. Невозможно включить/выключить сразу несколько линий GPIO одним вызовом;
  5. Процесс опроса для перехвата событий (прерываний от линий GPIO) ненадежен;
  6. Нет единого интерфейса (API) для конфигурирования линий GPIO;
  7. Номера, присвоенные линиям GPIO непостоянны, их приходится каждый раз экспортировать;
  8. Низкая скорость работы с линиями GPIO;

Новый путь: интерфейс chardev


Начиная с ядра Linux версии 4.8 интерфейс GPIO sysfs объявлен как deprecated и не рекомендуется к использованию. На замену sysfs появился новый API, основанный на символьных устройствах для доступа к линиям GPIO из пользовательского пространства.

Каждый контроллер GPIO (gpiochip) будет иметь символьное устройство в разделе /dev, и мы можем использовать файловые операции (open(), read(), write(), ioctl(), poll(), close()) для управления и взаимодействия с линиями GPIO. контроллеры GPIO доступны по путям /dev/gpiochipN или /sys/bus/gpiochipN, где N порядковый номер чипа. Просмотр доступных контроллеров GPIO (gpiochip) на Banana Pi BPI-M64:

root@bananapim64:~# ls /dev/gpiochip*/dev/gpiochip0  /dev/gpiochip1  /dev/gpiochip2


libgpiod Armbian
Стек работы библиотеки libgpiod

Несмотря на то, что новый API предотвращает управление линиями GPIO с помощью стандартных инструментов командной строки, таких как echo и cat, он обладает весомыми преимуществами по сравнению с интерфейсом sysfs, а именно:

  • Выделение линий GPIO связано с процессом, который он его использует. При завершение процесса, так же в случае аварийного завершения, линии GPIO используемые процессом освобождаются автоматически;
  • Дополнительно, можно всегда определить какой процесс в данное время использует определенную линию GPIO;
  • Можно одновременно читать и писать в несколько линий GPIO одновременно;
  • Контроллеры GPIO и линии GPIO можно найти по названию;
  • Можно настроить состояние вывода контакта (open-source, open-drain и т. д.);
  • Процесс опроса для перехвата событий (прерывания от линий GPIO) надежен.

Библиотека libgpiod и инструменты управления GPIO


Для использования нового интерфейса символьного устройства есть библиотека и набор инструментов, предоставляемых проектом libgpiod.

Libgpiod(LibraryGeneralPurposeInput/Outputdevice) предоставляет набор API для вызова из своих программ и несколько утилит для управления линиями GPIO из пользовательского режима.

В состав libgpiod входят следующие утилиты:

  • gpiodetect выведет список всех чипов GPIO, их метки и количество линий;
  • gpioinfo выведет информацию о линиях GPIO конкретного контроллера GPIO. В таблице вывода по колонкам будет указано: номер линии, название контакта, направление ввода/вывода, текущее состояние;
  • gpioget считает текущее состояние линии GPIO;
  • gpioset установит значение для линии GPIO;
  • gpiofind выполняет поиск контроллера GPIO и линии по имени;
  • gpiomon осуществляет мониторинг состояния линии GPIO и выводит значение при изменение состояния.

Например, следующая программа написанная на C использует libgpiod для чтения строки GPIO:

void main() {struct gpiod_chip *chip;struct gpiod_line *line;int req, value;chip = gpiod_chip_open("/dev/gpiochip0");if (!chip)return -1;line = gpiod_chip_get_line(chip, 3);if (!line) {gpiod_chip_close(chip);return -1;}req = gpiod_line_request_input(line, "gpio_state");if (req) {gpiod_chip_close(chip);return -1;}value = gpiod_line_get_value(line);printf("GPIO value is: %d\n", value);gpiod_chip_close(chip);}

Библиотеку можно вызывать так же и из кода на C++, Python, C#, и т.д.

Для управления линиями GPIO из терминала необходимо использовать инструменты командной строки, предоставляемые libgpiod. Библиотеку libgpiod и инструменты управления GPIO можно установить скомпилировать из исходного текста и установить.

Установка библиотеки libgpiod и инструментов управления GPIO


Репозитарий библиотеки libgpiod доступ по адресу libgpiod/libgpiod.git. В разделе Download опубликованы релизы библиотеки. На 28.04.2021 последний релиз: v1.6.3.

Библиотеку libgpiod можно установить из репозитария дистрибутива, но скорее всего будет доступна старая версия. Установка libgpiod:

$ sudo apt-get update$ sudo apt-get install -y libgpiod-dev gpiod

Для установки последней актуальной версии необходимо выполнить скрипт установки, который возьмет последнюю версию библиотеки из исходного репозитария. В строке вызова скрипта установки setup-libgpiod-arm64.sh, в качестве первого параметра указать номер версии библиотеки (например: 1.6.3), второй параметр (необязательный) папка установки скрипта. По умолчанию библиотека установится по пути: /usr/share/libgpiod.

Скрипт установки из исходного текста библиотеки libgpiod и утилит для ARM32/ARM64:

$ cd ~/$ sudo apt-get update$ sudo apt-get install -y curl $ curl -SL --output setup-libgpiod-armv7-and-arm64.sh https://raw.githubusercontent.com/devdotnetorg/dotnet-libgpiod-linux/master/setup-libgpiod-armv7-and-arm64.sh$ chmod +x setup-libgpiod-armv7-and-arm64.sh$ sudo ./setup-libgpiod-armv7-and-arm64.sh 1.6.3

Для удаления библиотеки выполнить скрипт: remove-libgpiod-armv7-and-arm64.sh

Если по итогу выполнения скрипта появится надпись Successfully, то значит библиотека и утилиты успешно установлены. Дополнительно для проверки, можно вызвать команду с выводом номера версии библиотеки:

root@bananapim64:~# gpiodetect -vgpiodetect (libgpiod) v1.6.3Copyright (C) 2017-2018 Bartosz GolaszewskiLicense: LGPLv2.1This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.

Инструменты библиотеки libgpiod


Команда gpiodetect выведет список всех чипов GPIO, их метки и количество линий. Результат выполнения команды:

root@bananapim64:~# gpiodetectgpiochip0 [1f02c00.pinctrl] (32 lines)gpiochip1 [1c20800.pinctrl] (256 lines)gpiochip2 [axp20x-gpio] (2 lines)

gpiochip0 и gpiochip1, это чипы входящие в состав SoC Allwinner A64. gpiochip1 имеет выход на 40-контактный разъем совместимый с Raspberry Pi. Чип gpiochip2 отдельная микросхема управления электропитанием axp209 подключенная по интерфейсу I2C.

Для вывод справки к вызываемой команде необходимо добавлять параметр "--help". Вызов справки для команды gpiodetect. Результат выполнения команды:

root@bananapim64:~# gpiodetect --helpUsage: gpiodetect [OPTIONS]List all GPIO chips, print their labels and number of GPIO lines.Options:  -h, --help:           display this message and exit  -v, --version:        display the version and exit

Команда gpioinfo выведет информацию о линиях GPIO конкретного контроллера GPIO (или всех контроллеров GPIO, если они не указаны).Результат выполнения команды:

root@bananapim64:~# gpioinfo 1gpiochip1 - 256 lines:        line   0:      unnamed       unused   input  active-high...        line  64:      unnamed         "dc"  output  active-high [used]...        line  68:      unnamed "backlightlcdtft" output active-high [used]...        line  96:      unnamed   "spi0 CS0"  output   active-low [used]        line  97:      unnamed       unused   input  active-high        line  98:      unnamed       unused   input  active-high        line  99:      unnamed       unused   input  active-high        line 100:      unnamed      "reset"  output   active-low [used]...        line 120:      unnamed "bananapi-m64:red:pwr" output active-high [used]...        line 254:      unnamed       unused   input  active-high        line 255:      unnamed       unused   input  active-high

В таблице по колонкам указано: номер линии, название контакта, направление ввода/вывода, текущее состояние. Сейчас к Banana Pi BPI-M64 подключен LCD экран ILI9341 на SPI интерфейсе, для подключения используется вариант с управляемой подсветкой, файл DTS sun50i-a64-spi-ili9341-backlight-on-off.dts. В DTS файле контакт PC4 GPIO68 обозначен для управления подсветкой, название backlightlcdtft. Соответственно в выводе команды, указан номер линии 68, название backlightlcdtft, направление вывод, текущее состояние active-high (включено).

Команда gpioset установит значение для линии GPIO. Например, следующая команда попытается выключить подсветку на LCD ILI9341. Команда: gpioset 1 68=0, где 1 gpiochip1, 68 номер линии(контакта), 0 логическое значение, может быть 0 или 1. Результат выполнения команды:

root@bananapim64:~# gpioset 1 68=0gpioset: error setting the GPIO line values: Device or resource busyroot@bananapim64:~#

В результате мы получим ошибку линия занята, т.к. данная линия занята драйвером gpio-backlight.

Попробуем включить светодиод на линии 36, название PB4, номер контакта на 40-контактном разъеме (совместимый с Raspberry Pi) 33. Результат выполнения команды:

root@bananapim64:~# gpioset 1 36=1

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

Команда gpioget считывает текущее состояние линии GPIO. Результат выполнения команды:

root@bananapim64:~# gpioget 1 361

Получили значение 1, т.к. до этого включили светодиод командой gpioset.

Команда gpiomon будет осуществлять мониторинг состояния линии GPIO и выводить значение при изменение состояния. Будем мониторить состояние кнопки, которая подключена на линию 38, название PB4, номер контакта на 40-контактном разъеме (совместимый с Raspberry Pi) 35. Команда: gpiomon 1 38, где 1 gpiochip1, 38 номер линии (контакта). Результат выполнения команды:

root@bananapim64:~# gpiomon 1 38event:  RISING EDGE offset: 38 timestamp: [     122.943878429]event: FALLING EDGE offset: 38 timestamp: [     132.286218099]event:  RISING EDGE offset: 38 timestamp: [     137.639045559]event: FALLING EDGE offset: 38 timestamp: [     138.917400584]

Кнопка несколько раз нажималась. RISING повышение, изменение напряжения с 0V до 3.3V, кнопка нажата и удерживается состояние. FALLING понижение, изменение напряжения с 3.3V до 0V, происходит отпускание кнопки, и кнопка переходит в состояние не нажата.

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

Установка .NET 5.0 для ARM


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

Определение архитектуры ARM32 и ARM64 для SoC


.NET 5 устанавливается на одноплатный компьютер в соответствие с архитектурой SoC:

  • ARM32, ARMv7, aarch32, armhf 32-разрядная архитектура ARM. Первые процессоры ARM для встраиваемых систем разрабатывались именно на этой архитектуре. По заявлению компании ARM Holding, в 2022 поддержка 32-битных платформ прекратится, и будет поддерживаться только 64-битная архитектура. Это означает, что компания не будет поддерживать разработку ПО для 32-битных систем. Если конечный производитель устройства пожелает установить 32-битную ОС, то ему придется самостоятельно заняться портированием драйверов с 64-битной архитектуры на 32-битную.
  • ARM64, ARMv8, aarch64 64-разрядная архитектура ARM. Ядра Cortex-A53 и Cortex-A57, поддерживающие ARMv8, были представлены компанией ARM Holding 30 октября 2012 года.

Плата Banana Pi BPI-M64 построена на основе процессора Allwinner A64, содержит в себе 64-битные ядра Cortex-A53, поэтому поддерживает 64-разрядные приложения. Для платы Banana Pi BPI-M64 используется 64-разрядный образ ОС Armbian, поэтому на плату будем устанавливать .NET для 64-разрядных систем ARM.

Плата Cubietruck построена на основе процессора Allwinner A20 содержит в себе 32-битные ядра Cortex-A7, поэтому поддерживает только 32-разрядные приложения. Соответственно на плату устанавливается .NET для 32-разрядных систем.

Если вы не знаете какую версию .NET установить на одноплатный компьютер, то необходимо выполнить команду для получения информации об архитектуре системы: uname -m.

Выполним команду на Banana Pi BPI-M64:

root@bananapim64:~# uname -maarch64

Строка aarch64 говорит о 64-разрядной архитектуре ARM64, ARMv8, aarch64, поэтому установка .NET для 64-х разрядных ARM систем.

Выполним команду на Cubietruck:

root@cubietruck:~# uname -marmv7l

Строка armv7l говорит о 32-разрядной архитектуре ARM32, ARMv7, aarch32, armhf, поэтому установка .NET для 32-разрядных ARM систем.

Редакции .NET 5.0 на ARM


.NET 5.0 можно устанавливать в трех редакциях:

  • .NET Runtime содержит только компоненты, необходимые для запуска консольного приложения.
  • ASP.NET Core Runtime предназначен для запуска ASP.NET Core приложений, так же включает в себя .NET Runtime для запуска консольных приложений.
  • SDK включает в себя .NET Runtime, ASP.NET Core Runtime и .NET Desktop Runtime. Позволяет кроме запуска приложений, компилировать исходный код на языках C# 9.0, F# 5.0, Visual Basic 15.9.

Для запуска .NET программ достаточно установки редакции .NET Runtime, т.к. компиляция проекта будет на компьютере x86.

Загрузить .NET с сайта Microsoft можно по ссылке Download .NET 5.0.

Установка .NET Runtime


На странице Download .NET 5.0. можно узнать текущую актуальную версию .NET. В первой колонке Release information будет указана версия: v5.0.5 Released 2021-04-06. Версия номер: 5.0.5. В случае выхода более новый версии .NET, ниже в скрипте в строке export DOTNET_VERSION=5.0.5, нужно будет заменить номер версии на последний. Выполним скрипт установки, в зависимости от разрядности системы ARM32 (Cubietruck) или ARM64(Banana Pi BPI-M64):

ARM64

$ cd ~/$ apt-get update && apt-get install -y curl$ export DOTNET_VERSION=5.0.5$ curl -SL --output dotnet.tar.gz https://dotnetcli.azureedge.net/dotnet/Runtime/$DOTNET_VERSION/dotnet-runtime-$DOTNET_VERSION-linux-arm64.tar.gz \&& mkdir -p /usr/share/dotnet \&& tar -ozxf dotnet.tar.gz -C /usr/share/dotnet \&& rm dotnet.tar.gz$ ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet

ARM32
$ cd ~/$ apt-get update && apt-get install -y curl$ export DOTNET_VERSION=5.0.5$ curl -SL --output dotnet.tar.gz https://dotnetcli.azureedge.net/dotnet/Runtime/$DOTNET_VERSION/dotnet-runtime-$DOTNET_VERSION-linux-arm.tar.gz \&& mkdir -p /usr/share/dotnet \&& tar -ozxf dotnet.tar.gz -C /usr/share/dotnet \&& rm dotnet.tar.gz$ ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet


Проверим запуск .NET, командой (результат одинаков для Banana Pi BPI-M64 и Cubietruck): dotnet --info

root@bananapim64:~# dotnet --infoHost (useful for support):  Version: 5.0.5  Commit:  2f740adc14.NET SDKs installed:  No SDKs were found..NET runtimes installed:  Microsoft.NETCore.App 5.0.5 [/usr/share/dotnet/shared/Microsoft.NETCore.App]To install additional .NET runtimes or SDKs:  https://aka.ms/dotnet-download

.NET установлен в системе, для запуска приложений в Linux необходимо воспользоваться командой: dotnet ConsoleApp1.dll

Обновление .NET 5.0


При выходе новых версий .NET необходимо сделать следующее:

  1. Удалить папку /usr/share/dotnet/
  2. Выполнить скрипт установки, указав новую версию .NET в строке export: DOTNET_VERSION=5.0.5. Номер последней версии .NET можно посмотреть на странице Download .NET 5.0. Строку скрипта создания символической ссылки выполнять не надо: ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet


Удаленная отладка приложения на .NET 5.0 в Visual Studio Code для ARM


Удаленная отладка в Visual Studio Code позволяет в интерактивном режиме видеть ошибки и просматривать состояние переменных, без необходимости постоянного ручного переноса приложения на одноплатный компьютер, что существенно облегчает разработку. Бинарные файлы копируются в автоматическом режиме с помощью утилиты Rsync. Для работы с GPIO, настройка удаленной отладки не является обязательной задачей. Более подробно можно почитать в публикации Удаленная отладка приложения на .NET 5.0 в Visual Studio Code для ARM на примере Banana Pi BPI-M64 и Cubietruck (Armbian, Linux).

Создание первого приложения для управления (вкл/выкл светодиода) GPIO на C#, аналог утилиты gpioset


Поздравляю тебя %habrauser%! Мы уже подходим к финалу, осталось буквально чуть-чуть. Разрабатывать и компилировать приложение будем на x86 компьютере в в Visual Studio Code. Находясь в этой точке, подразумевается, что на одноплатном компьютере уже установлена платформа .NET 5 и библиотека Libgpiod, а на компьютере x86 .NET 5 и Visual Studio Code. Итак приступаем:

Шаг 1 Создание приложения dotnet-gpioset


Действия выполняются на x86 компьютере. В командной строке создаем проект с названием dotnet-gpioset: dotnet new console -o dotnet-gpioset, где dotnet-gpioset название нового проекта. Результат выполнения команды:

D:\Anton\Projects>dotnet new console -o dotnet-gpiosetGetting ready...The template "Console Application" was created successfully.Processing post-creation actions...Running 'dotnet restore' on dotnet-gpioset\dotnet-gpioset.csproj...  Определение проектов для восстановления...  Восстановлен D:\Anton\Projects\dotnet-gpioset\dotnet-gpioset.csproj (за 68 ms).Restore succeeded.

После выполнения команды будет создана папка \Projects\dotnet-gpioset\, в этой папке будет расположен наш проект: папка obj, файл программы Program.cs и файл проекта dotnet-gpioset.csproj.

Шаг 2 Установка расширения C# for Visual Studio Code (powered by OmniSharp) для Visual Studio Code


Запустим Visual Studio Code и установим расширение C# for Visual Studio Code (powered by OmniSharp), для возможности работы с кодом на C#. Для этого нажмем на закладке: 1. Extensions, затем 2. в поле ввода напишем название расширения C# for Visual Studio Code, выберем пункт 3. C# for Visual Studio Code (powered by OmniSharp). 4. Перейдем на страницу описание расширения и нажмем на кнопку Install.

.NET Visual Studio Code ARM
C# for Visual Studio Code (powered by OmniSharp)

После установки можно выполнить настройку расширения.

.NET Visual Studio Code ARM
Настройка расширения C# for Visual Studio Code

После установки расширения, перезапустим Visual Studio Code.

Шаг 3 Открытие проекта в Visual Studio Code и добавление NuGet пакетов


Откроем проект в Visual Studio Code. Меню: File =>Open Folder, и выберем папку с проектом \Projects\dotnet-gpioset\

dotnet libgpiod
Проект в Visual Studio Code

Откроем файл dotnet-gpioset.csproj, убедимся что версия .NET выставлена верно, должно быть следующее содержание:

dotnet libgpiod
Содержание файла dotnet-gpioset.csproj

NuGet пакеты можно добавить через командную строку или расширение NuGet Package Manager. Установим данное расширение, и добавим пакеты: Iot.Device.Bindings и System.Device.Gpio. Для этого нажмем комбинацию Ctrl+Shift+P, затем в поле введем: Nuget, выберем Nuget Packet Managet: Add Package.

dotnet libgpiod
Запуск расширения NuGet Package Manager

В поле ввода укажем название пакета Iot.Device.Bindings, нажмем Enter, затем выберем версию 1.4.0 и нажмем Enter. Так же сделать и для пакета System.Device.Gpio. В результате добавление пакетов, содержимое файла dotnet-gpioset.csproj должно быть следующим:

dotnet libgpiod
Содержание файла dotnet-gpioset.csproj

Шаг 4 Добавление обработки аргументов в код


Утилита dotnet-gpioset как и оригинальная gpioset будет принимать на вход точно такие же аргументы. Вызов: dotnet-gpioset 1 36=1, включит светодиод на gpiochipX 1, номер линии 36, значение 1. В режиме отладки будут заданы значения по умолчанию int_gpiochip=1, int_pin=36, pin_value = PinValue.High. Подключим пространство имен System.Device.Gpio для использование структуры PinValue.

Обработка входящих аргументов:

static void Main(string[] args){  //run: dotnet-gpioset 1 36=1  //-----------------------------------------------                          int? int_gpiochip=null,int_pin=null;  PinValue? pin_value=null;    #if DEBUG    Console.WriteLine("Debug version");    int_gpiochip=1;    int_pin=36;    pin_value = PinValue.High;  #endif  if (args.Length==2)    {      //Read args      if (int.TryParse(args[0], out int output)) int_gpiochip = output;      Regex r = new Regex(@"\d+=\d+");//36=1      if (r.IsMatch(args[1])) //check: 36=1        {          var i = args[1].Split("=");          if (int.TryParse(i[0], out output)) int_pin = output;          if (int.TryParse(i[1], out output))            {              pin_value=(output != 0) ? PinValue.High : PinValue.Low;                                         }        }      }  Console.WriteLine($"Args gpiochip={int_gpiochip}, pin={int_pin}, value={pin_value}");  //next code  Console.WriteLine("Hello World!");}

Запускаем выполнение кода для проверки, меню Run => Start Debugging, все работает отлично!

Загружено "C:\Program Files\dotnet\shared\Microsoft.NETCore.App\5.0.5\System.Text.Encoding.Extensions.dll". Загрузка символов пропущена. Модуль оптимизирован, включен параметр отладчика "Только мой код".Debug versionArgs gpiochip=1, pin=36, value=HighHello World!Программа "[8528] dotnet-gpioset.dll" завершилась с кодом 0 (0x0).

Шаг 5 Добавление контроллера управления GPIO c драйвером LibGpiodDriver


Для управления GPIO необходимо создать объект GpioController и указать драйвер LibGpiodDriver, для этого добавим пространство имен System.Device.Gpio.Drivers.

Добавление контроллера:

//next codeGpioController controller;var drvGpio = new LibGpiodDriver(int_gpiochip.Value);            controller = new GpioController(PinNumberingScheme.Logical, drvGpio);

Описание кода:

  • GpioController класс контроллера для управления контактами GPIO;
  • LibGpiodDriver(int_gpiochip.Value) драйвер обертки библиотеки Libgpiod, в качестве аргумента указываем номер gpiochip;
  • GpioController(PinNumberingScheme.Logical, drvGpio) инициализация контроллера, PinNumberingScheme.Logical формат указания контактов. Есть два варианта, по названию контакта или по его номеру. Но т.к. названия контактов не заданы, то обращение будет только по номеру.

Шаг 6 Управление контактом GPIO


Добавление кода для задания значения контакту:

//set value            if(!controller.IsPinOpen(int_pin.Value))  {    controller.OpenPin(int_pin.Value,PinMode.Output);    controller.Write(int_pin.Value,pin_value.Value);                      } 

Описание кода:

  • controller.IsPinOpen проверка открытия контакта, может быть занят или недоступен;
  • controller.OpenPin открытие контакта и задание ему режима работы, PinMode.Output на вывод;
  • controller.Write(int_pin.Value,pin_value.Value) выставление контакту int_pin значение pin_value.

Шаг 7 Публикация для архитектуры ARM


Открыть командную строку, и перейти в папку \Projects\dotnet-gpioset\.

Для ARM32 выполнить команду:

  • параметр --runtime задает архитектуру выполнения программы (берется из списка Runtime Identifiers (RIDs));
  • параметр --self-contained указывает на необходимость добавление в каталог всех зависимых сборок .NET, при выставление значение в False, копируются только дополнительные сборки не входящие в .NET Runtime (в данном случае будут скопированы сборки из дополнительных NuGet пакетов).

dotnet publish dotnet-gpioset.csproj --configuration Release --runtime linux-arm --self-contained false

Файлы для переноса на одноплатный компьютер будут в папке: \Projects\dotnet-gpioset\bin\Release\net5.0\linux-arm\publish\.

Для ARM64 выполнить команду:

dotnet publish dotnet-gpioset.csproj --configuration Release --runtime linux-arm64 --self-contained false

Файлы для переноса на одноплатный компьютер будут в папке: \Projects\dotnet-gpioset\bin\Release\net5.0\linux-arm64\publish\.

Шаг 8 Перенос папки \publish\


Содержимое папки \publish\ необходимо перенести в домашний каталог Linux пользователя на одноплатном компьютере. Это можно сделать используя терминал MobaXterm.

Шаг 9 Запуск dotnet-gpioset на одноплатном компьютере


Содержимое папки \publish\ было скопировано в папку /root/publish-dotnet-gpioset. Исполняемым файлом будет файл с расширением *.dll. В самом начале, светодиод был подключен на контакт 33, 40-контактного разъема совместимого с Raspberry P, название контакта PB4, номер линии 36. Поэтому в качестве аргумента номера контакта указываем 36. Для запуска программы необходимо выполнить команду:

dotnet dotnet-gpioset.dll 1 36=1

Результат выполнения команды:

root@bananapim64:~# cd /root/publish-dotnet-gpiosetroot@bananapim64:~/publish-dotnet-gpioset# dotnet dotnet-gpioset.dll 1 36=1Args gpiochip=1, pin=36, value=HighOK

Светодиод включился!



Проект доступен на GitHub dotnet-gpioset.

Создание приложения обработки прерывания от кнопки


Теперь реализуем программу обработки прерываний от GPIO. Задача будет заключаться в переключение светодиода по нажатию кнопки. Первое нажатие кнопки включит светодиод, последующее, выключит светодиод, и так до бесконечности. Программа основана на примере Push button.

Светодиод подключен контакту с номером 36. Кнопка подключена на контакт с номером 38. Итак приступаем:

Шаг 1 Создание приложения dotnet-led-button


Действия выполняются на x86 компьютере. В командной строке создаем проект с названием dotnet-led-button: dotnet new console -o dotnet-led-button, где dotnet-led-button название нового проекта.

D:\Anton\Projects>dotnet new console -o dotnet-led-buttonGetting ready...The template "Console Application" was created successfully.Processing post-creation actions...Running 'dotnet restore' on dotnet-led-button\dotnet-led-button.csproj...  Определение проектов для восстановления...  Восстановлен D:\Anton\Projects\dotnet-led-button\dotnet-led-button.csproj (за76 ms).Restore succeeded.

После выполнения команды будет создана папка с файлами проекта \Projects\dotnet-led-button\.

Шаг 2 Открытие проекта в Visual Studio Code и добавление NuGet пакетов


Точно так же, как и в предыдущем проекте добавим Nuget пакеты: Iot.Device.Bindings и System.Device.Gpio.

Шаг 3 Добавление контроллера управления GPIO c драйвером LibGpiodDriver


Добавим контроллер для управления GPIO, и выставим режим работы контактов:

private const int GPIOCHIP = 1;private const int LED_PIN = 36;private const int BUTTON_PIN = 38;       private static PinValue ledPinValue = PinValue.Low;     static void Main(string[] args){                          GpioController controller;  var drvGpio = new LibGpiodDriver(GPIOCHIP);  controller = new GpioController(PinNumberingScheme.Logical, drvGpio);  //set value  if(!controller.IsPinOpen(LED_PIN)&&!controller.IsPinOpen(BUTTON_PIN))    {      controller.OpenPin(LED_PIN,PinMode.Output);      controller.OpenPin(BUTTON_PIN,PinMode.Input);    }  controller.Write(LED_PIN,ledPinValue); //LED OFF

Описание кода:

  • controller.OpenPin(LED_PIN,PinMode.Output) - открывает контакт светодиода, и выставляет режим работы на вывод;
  • controller.OpenPin(BUTTON_PIN,PinMode.Input) - открывает контакт кнопки, и выставляет режим работы на ввод (сигнал поступает от кнопки.

Шаг 4 Добавление обработки прерывания кнопки


Обработка прерывания реализуется путем добавление Callback на изменение состояние контакта. Callback регистрируется в контроллере GPIO:

controller.RegisterCallbackForPinValueChangedEvent(BUTTON_PIN,PinEventTypes.Rising,(o, e) =>  {    ledPinValue=!ledPinValue;    controller.Write(LED_PIN,ledPinValue);    Console.WriteLine($"Press button, LED={ledPinValue}");          });

Описание кода:

  • RegisterCallbackForPinValueChangedEvent регистрация Callback на контакт BUTTON_PIN, будет срабатывать при нажатие на кнопку Rising. Так же доступно срабатывание на событие отпускание кнопки.

Шаг 5 Публикация для архитектуры ARM


Открыть командную строку, и перейти в папку \Projects\dotnet-led-button\.

Для ARM32 выполнить команду:

dotnet publish dotnet-led-button.csproj --configuration Release --runtime linux-arm --self-contained false

Файлы для переноса на одноплатный компьютер будут в папке: \Projects\dotnet-led-button\bin\Release\net5.0\linux-arm\publish\.

Для ARM64 выполнить команду:

dotnet publish dotnet-led-button.csproj --configuration Release --runtime linux-arm64 --self-contained false

Файлы для переноса на одноплатный компьютер будут в папке: \Projects\dotnet-led-button\bin\Release\net5.0\linux-arm64\publish\.

Шаг 6 Перенос папки \publish\


Содержимое папки \publish\ необходимо перенести в домашний каталог Linux пользователя на одноплатном компьютере.

Шаг 7 Запуск dotnet-led-button на одноплатном компьютере


Содержимое папки \publish\ было скопировано в папку /root/publish-dotnet-led-button. Для запуска программы необходимо выполнить команду:

dotnet dotnet-led-button.dll

Результат выполнения команды:

root@bananapim64:~/publish-dotnet-led-button# dotnet dotnet-led-button.dllCTRL+C to interrupt the read operation:Press any key, or 'X' to quit, or CTRL+C to interrupt the read operation:Press button, LED=LowPress button, LED=HighPress button, LED=LowPress button, LED=HighPress button, LED=Low

Кнопка работает!

Проект доступен на GitHub dotnet-led-button.

Теперь поговорим о скорости


Замеры скорости управления GPIO на Banana Pi BPI-M64 не проводились из-за отсутствия осциллографа. Но не так давно, пользователь ZhangGaoxing опубликовал результаты замеров скорости на Orange Pi Zero: ОС Armbian buster, ядро Linux 5.10.16, .NET 5.0.3. Тест заключался в быстром переключение контакта GPIO с 0 на 1 и наоборот, по сути осуществлялась генерация сигнала ШИМ (в Arduino аналог SoftPWM). Чем больше частота, тем быстрее переключатся контакт. Для замера был разработан проект SunxiGpioDriver.GpioSpeed. ZhangGaoxing для доступа к контактам разработал драйвер SunxiDriver, который напрямую обращается к регистрам памяти для управления GPIO. Код этого драйвера так же можно адаптировать к любой плате, путем изменения адресов регистров памяти из datasheet к процессору. Минус такого подхода заключается в отсутствие контроля к GPIO со стороны ОС, можно влезть в контакт используемой ОС и вызвать сбой работы.

Таблица замеров:
Драйвер Язык Версия библиотеки Средняя частота
SunxiDriver C# - 185 KHz
SysFsDriver C# System.Device.Gpio 1.3.0 692 Hz
LibGpiodDriver C# System.Device.Gpio 1.3.0
libgpiod 1.2-3
81 KHz
wiringOP C 35de015 1.10 MHz

Результаты подтвердили, что самым медленным интерфейсом является SysFs, и его не стоит использовать для серьезных проектов. wiringOP является С оберткой доступа к GPIO. Непосредственно управление GPIO из C кода существенно быстрее, чем из приложения на .NET, разница скорости в ~13 раз. Это и есть плата за Runtime.

Итог


Управлять контактами GPIO в C# оказалось не сложнее чем на Arduino. В отличие от Arduino в нашем распоряжение Linux с поддержкой полноценной графики, звуком, и большими возможностями подключения различной периферии. В далеком 2014 году с хабровчанином prostosergik был спор о целесообразности использовании Raspberry Pi в качестве школьного звонка. Мною был реализован подобный функционал на C# .NET Micro Framework, отладочная плата FEZ Domino. С того времени многое что изменилось. Сейчас вариант использования для подобных индивидуальных задач, одноплатных компьютеров на Linux более оправдан, чем использование микроконтроллера. Первое существенное изменение это .NET теперь работает на Linux нативно. Второе появились библиотеки которые упрощают и скрывают под капотом все сложную работу. Третье цена, сейчас одноплатный компьютер с 256 Мб ОЗУ, Ethernet и Wi-Fi в известном китайском магазине можно приобрести за 18$. За такие деньги МК, с поддержкой полноценного Web-интерфейса и шифрования сетевого трафика, вряд ли найдешь. Платформа .NET IoT позволяет работать с GPIO на достаточно высоком уровне абстракции, что существенно снижает порог вхождения. В результате любой разработчик .NET платформы, может с легкостью реализовать свое решение для IoT не вдаваясь в детали как это работает внутри. Установка платформы .NET и библиотеки Libgpiod было приведено для понимания, как это работает, но такой подход не является самым удобным. Гораздо удобнее все разворачивать в Docker контейнере, тем более это mainstream для Linux. В продолжении посмотрим как упаковывать приложение на C# вместе с .NET 5 и Libgpiod в один контейнер, для дальнейшей удобной дистрибьюции нашего решения потенциальному клиенту, задействуем LCD для вывода информации из .NET кода.



На правах рекламы


Прямо сейчас вы можете заказать мощные серверы, которые используют новейшие процессоры AMD Epyc. Гибкие тарифы от 1 ядра CPU до безумных 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe.

Подписывайтесь на наш чат в Telegram.

Подробнее..

GitOps Определение дрейфа вашей инфраструктуры Terraform Terragrunt

18.03.2021 14:16:42 | Автор: admin

Всем привет.

Дисклеймер: сказу скажу, что пишу статью по-ходу дела, "код" в ней рабочий, но не претендует на какие-либо best practices, поэтому не придирайтесь :) Цель статьи: донести до интересующейся русскоязычной части населения общие принципы, возможно разбудить интерес поразбираться самостоятельно и сделать что-то гораздо лучше и интереснее. Итак поехали!

Допустим Вы работаете с Terraform / Terragrunt (второе здесь непринципиально, но лучше изучайте, если ещё не используете) и автоматизируете инфраструктуру, например, в AWS (но совершенно необязательно AWS). Инфраструктура в коде репозитория, разворачивается из него же, казалось бы вот оно GitOps счастье :)

Всё идёт хорошо, пока какой-то пользователь не поменял что-то руками через консоль / UI и конечно забыл об этом кому-либо сказать. А то и сделал что-то нехорошее намеренно. И вот он ваш дрейф: код и инфраструктура больше не совпадают! :(

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

Как обычно, есть много различных путей добиться желаемого. Например, недавно на горизонте появилась неплохо развивающаяся утилита https://github.com/cloudskiff/driftctl , которая может даже больше, чем предложу Вашему вниманию чуть ниже я, но на момент написания статьи driftctl как минимум не поддерживает работу с aws provider v2, а также не умеет в multi region, что делает его использование невозможным в большинстве серьёзных проектов. Но ребята обещают доделать её через месяц-два.

А пока что опишу и приведу пример небольшого количества кода для следующей очень простой схемы:

1) создаём pipeline, который или по расписанию (в Gitlab можно воспользоваться Pipeline schedules) или по кругу будет делать terraform plan

2) при нахождении дрейфа (diff в плане) pipeline будет, например, отправлять сообщение с его содержанием в Slack.

Аналогично можно реализовать и, например, создание issue в любом из используемых вами репозиториев, где поддерживается их создание через api и любое другое действие, например apply, который вернёт инфраструктуру к её эталонному состоянию. Или всё-таки импортировать изменение в state, если оно действительно необходимо.

Допустим есть репозиторий содержащий код для вашей live инфраструктуры, т.е. код, которому она должна соответствовать и откуда она и была развёрнута с такой структурой:

account_1/ eu-central-1  dev   eks    terragrunt.hcl    values.yaml   s3-bucket       terragrunt.hcl       values.yaml  prod   eks    terragrunt.hcl    values.yaml   s3-bucket       terragrunt.hcl       values.yaml  staging      eks       terragrunt.hcl       values.yaml      s3-bucket          terragrunt.hcl          values.yaml us-east-1  dev   eks    terragrunt.hcl    values.yaml   s3-bucket       terragrunt.hcl       values.yaml  prod   eks    terragrunt.hcl    values.yaml   s3-bucket       terragrunt.hcl       values.yaml  staging      eks       terragrunt.hcl       values.yaml      s3-bucket          terragrunt.hcl          values.yaml terragrunt.hcl

В приведённом выше примере в папке account_1 находятся 2 папки: us-east-1 и eu-central-1 , по имени регионов AWS. Иногда удобно организовать структуру именно так и тогда имена папок можно использовать как значение для передачи в модуль с помощью Terragrunt функции/й, например, таких "${basename(get_terragrunt_dir())}"

Аналогичная логика с папками имеющими в названии окружение и далее идут названия самих компонентов, которых в этом примере 2: eks и s3-bucket

Если смотреть от корня репозитория, то путь до каждого из файлов внутри папки компонента

<account_name>/<region>/<environment>/<component>/*

Т.е. "в общих чертах" */*/*/<component>/*

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

Не забудьте подключить Incoming WebHooks в Slack и записать полученный Webhook URL. Делается это так: https://api.slack.com/messaging/webhooks

Тогда вот такой скрипт может выполнять требуемое планирование в pipeline и отправку в Slack diff'а при его нахождении:

#!/bin/bashROOT_DIR=$(pwd)plan () {  echo -e "$(date +'%H-%M-%S %d-%m-%Y') $F"  CURRENT_DIR=$(pwd)  PLAN=$CURRENT_DIR/plan.tfplan  terragrunt run-all plan --terragrunt-non-interactive -lock=false -detailed-exitcode -out=$PLAN 2>/dev/null || ec=$?    case $ec in    0) echo "No Changes Found"; exit 0;;    1) printf '%s\n' "Command exited with non-zero"; exit 1;;    2) echo "Changes Found! Reporting!";          MESSAGE=$(terragrunt show -no-color ${PLAN} | sed "s/\"/'/g");    # let's replace the double quotes from the diff with single as double quotes "break" the payload       curl -X POST --data-urlencode "payload={\"channel\": \"#your-slack-channel-here\", \"username\": \"webhookbot\", \"text\": \"DRIFT DETECTED!!!\n ${MESSAGE}\", \"icon_emoji\": \":ghost:\"}" https://hooks.slack.com/services/YOUR/WEBHOOK/URL_HERE;;  esac}N="$(($(grep -c ^processor /proc/cpuinfo)*4))"    # any number suitable for your situation goes herefor F in */*/*/s3-bucket/*; do  ((i=i%N)); ((i++==0)) && wait    # let's run only N jobs in parallel to speed up the process  cd $ROOT_DIR  cd $F  plan &    # send the job to background to start the new onedone

Меняем что-нибудь руками, запускаем pipeline или ждём его выполнения и радуемся :)

На этом на сегодня всё!

Если Вы решали подобную задачу иначе, есть конкретные замечания/предложения, или просто хочется что-то спросить, то, по мере возможности, готов выслушать либо в комментариях, либо в личке, например, в телеграм @vainkop

P.S. имхо проект https://github.com/cloudskiff/driftctl мне лично кажется действительно полезным и решающим правильную задачу и хороших аналогов ему нет, так что прошу поддержать ребят, а по-возможности внести свою лепту ибо open source.

Всем хорошего настроения!

Подробнее..

Как установить ROS NOETIC на UBUNTU 20.04

12.04.2021 12:21:22 | Автор: admin

Почему я решил написать этот пост?

Вы конечно же можете посмотреть оригинальную инструкцию по установке ROS Noetic на сайте ROS Wiki , однако там все на английском и объясняется весьма туманно, я же постараюсь объяснить вам как можно понятнее. Итак, начнем.

Что такое ROS?

ROS Операционная система для роботов, остов для программирования роботов, предоставляющий функциональность для распределённой работы. ROS был первоначально разработан в 2007 году под названием switchyard в Лаборатории Искусственного Интеллекта Стэнфордского Университета.

Можно ли установить ROS Noetic на другие версии Ubuntu?

Правильного ответа на этот вопрос нет. Отдельные пакеты Noetic вроде как можно установить на другие версии операционной системы, однако стабильность их работы не гарантируется. Поэтому скорее все нет. Итак, давайте все-таки перейдем к самой установке.

Что делать если я использую другую версию Ububntu

ROS разрабатывался в разных версиях, которые устанавливаются на разные версии Ubuntu.

Версия Ubuntu

Версия ROS

Ubuntu 15.04 & 16.04

ROS Kenetic

Ubuntu 18.04

ROS Melodic

Ubuntu 20.04

ROS Noetik

Как установить ROS если вы использует другую версию Ubuntu? Легко! Просто во всех примерах кода заменяйте слово noetic на название той версии, которая удовлетворяет вашем характеристикам например вместо ros-noetic, вы можете написать ros-melodic

Подготовка к установке. Настройка репозиториев

Начнем с того, что существуют четыре основных репозитория:

  • Main- бесплатное программное обеспечение с открытым исходным кодом, поддерживаемое Canonical.

  • Universe- бесплатное программное обеспечение с открытым исходным кодом, поддерживаемое сообществом.

  • Restricted- проприетарные драйверы для устройств.

  • Multiverse- Программное обеспечение, ограниченное авторским правом или юридическими вопросами.

Итак, начинаем настройку. Сначала открываем вкладку "Программное обеспечение Ubuntu" и в настройках "Ubuntu Software" ставим галочки так, как показано на картинке

Далее переходим во вкладку "Other sowtware" и ставим галочки на пунктах Canonical Parthners и Canonical Parthners(source code)

Установка этих параметров поможет корректно установить пакеты ROS

Установка ROS Noetic

Шаг 1

После настройки репозиториев можем приступать к самой установке. Для начала настраиваем систему на прием пакетов программного обеспечения с packages.ros.org . Вставляем в терминал следующую команду:

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $ (lsb_release -sc) main"> /etc/apt/sources.list.d/ros-latest.list'

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

sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

В качестве альтернативы мы можем использовать curl вместо команды apt-key, что может быть полезно, если вы находитесь за прокси-сервером:

curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | sudo apt-key add -

Шаг 2

Во-первых обновляем пакеты с помощью команды

sudo apt-get update

Шаг 3

Начинаем установку. Для этого надо решить, какой ROS вы хотите себе установить:

  1. Desktop Full - та сборка, которую я вам рекомендую ставить. Эта версия устанавливает все, что только можно: 2D/3D симуляторы и программы восприятия. Для того, чтобы установить эту версию пишем в терминале:

sudo apt install ros-noetic-desktop-full

2. Desktop Instal - этот пакет содержит в себе все компоненты на базе ROS, а также и такие элементы как rqtиrviz. Для установки этой версии пишем в терминале следующую команду

sudo apt install ros-noetic-desktop

3. ROS-Base: (Bare Bones) - это просто голые библиотеки и пакеты ROS. Это тот вариант, который подойдет для продвинутых специалистов. Для установки этого варианта пишем в терминале:

sudo apt install ros-noetic-ros-base

Также вы можете установить какой-либо конкретный пакет ROS воспользовавшись командой:

sudo apt install ros-noetic-ИМЯ_ПАКЕТА

Шаг 4

Устанавливаем пакет bash, в котором мы будем использовать ROS. пишем в терминале:

source /opt/ros/noetic/setup.bash

Шаг 5

До сих пор вы устанавливали все, что нужно для запуска основных пакетов ROS.Для создания и управления собственными рабочими пространствами ROS существуют различные инструменты и требования, которые распространяются отдельно.Например,rosinstall- часто используемый инструмент командной строки, который позволяет легко загружать множество исходных кодов для пакетов ROS с помощью одной команды. Для его установки пишем в терминале:

sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential

Шаг 6

Прежде чем вы сможете использовать многие инструменты ROS, вам нужно будет инициализироватьrosdep. Онпозволяет легко устанавливать системные зависимости для исходного кода, который вы хотите скомпилировать, и требуется для запуска некоторых основных компонентов в ROS.Если вы еще не установилиrosdep, то самое время его установить. Для этого пишем в терминале:

sudo apt установить python3-rosdep

Шаг 7

Для инициализации rosdep пишем в терминале:

sudo rosdep init

И потом пишем следующее:

rosdep update

ИТОГ

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

Подробнее..

Работаем с lightsquid или как сделать индивидуальную статистику для пользователей

24.03.2021 18:04:11 | Автор: admin
Итак, появилась у меня задача на работе: дать каждому пользователю возможность смотреть свои логи посещения интернета. Вроде кажется и задача такая должна уже со всех сторон на любом форуме обсудится и как минимум должно быть готовое решение, как максимум пошаговая инструкция. Но ни того ни другого я не смог найти. Поэтому пришлось изобретать собственный велосипед. Ниже приведена почти пошаговая инструкция решения данной проблемы с использованием lightsquid и скриптов. Осторожно много скриптов.

Что нужно


  • Установленная Ubuntu server (лично в моей реализации это версия 13.04)
  • Установленный Apache2
  • Установленный настроенный и уже собирающий статистику squid (в моем случае это 2.7)


Предварительно оговорим условия:


  • Идентификация пользователя производится по его IP адресу
  • Каждый пользователь может смотреть только свою статистику
  • Статистика выводится через WEB интерфейс


Начинаем


Нужен сам lighsquid

Первым делом скачае LightSquid
wget http://downloads.sourceforge.net/project/lightsquid/lightsquid/1.8/lightsquid-1.8.tgz


Разархивируем. Я предпочел разархивировать в корень /var, на самом деле можете и в /www (если нужны графики и прочее)
tar -zxf lightsquid-1.8.tgz /var/lightsquid


Выставляем рекурсивно права 755 пользователю и группе www-data на каталог и его содержимое
chmod -R 755 /var/lightsquid
chown -R www-data:www-data /var/lightsquid


Делаем скрипты программы исполняемыми:
chmod +x *.cgi
chmod +x *.pl


Если вам действительно нужны графики то нужно установить пакет libgd-gd2-perl
sudo apt-get install libgd-gd2-perl


Теперь следует подправить сам конфиг LightSquid
nano /var/lightsquid/lightsquid.cfg


Правим пути в секции GLOBAL VARIABLES
#path to additional `cfg` files
$cfgpath ="/var/lightsquid";
#path to `tpl` folder
$tplpath ="/var/lightsquid/tpl";
#path to `lang` folder
$langpath ="/var/lightsquid/lang";
#path to `report` folder
$reportpath ="/var/lightsquid/report";
#path to access.log
$logpath ="/var/log/squid";
#path to `ip2name` folder
$ip2namepath ="/var/lightsquid/ip2name";


В секции WEB VARIABLES выставляем нужный язык интерфейса. В данном случае русский.
$lang =ru;


Ну все lightsquid должен быть готов к работе. Если у вас есть логи squid можете их про парсить что бы потом можно было увидеть их в отчете:
/var/lightsquid# ./lightparser.pl access.log.59 && ./lightparser.pl access.log.58 && ./lightparser.pl access.log.57 && ./lightparser.pl access.log.56 && ./lightparser.pl access.log.55 && ./lightparser.pl access.log.54 && ./lightparser.pl access.log.53 и т.д.


Сам процесс


Т.к. LightSquid с помощь cgi скриптов формирует html тэгированные файлы, потом выдает их серверу, сервер пользователю, а пользователь в свою очередь видит ВСЮ статистику по ВСЕМ пользователям это не есть хорошо. Поэтому есть задача, перехватить вывод, сделать свой html файли с преферансом и куртизанками и выдать обработанный файл пользователю.

Первый скрипт на PHP

Создаем файл:

nano /var/www/index.php


Первый скрипт он у нас будет на РНР: это будет стартовая страничка которая будет показывать пользователю обработанную первую страницу ligsquid. Заносим данные:

<?php$year = " {$_GET['year']}";$month = " {$_GET['month']}";$day = " {$_GET['day']}";$ip_host = "{$_SERVER['REMOTE_ADDR']}";$str = "sudo /var/lightsquid/my_scr/index.sh ".$ip_host.$year.$month.$day;echo exec($str);include "/var/lightsquid/my_tmp/".$ip_host."log_file.html"?>


Принцип таков. Мы через РНР получаем какие либо параметры, в данном случае год, месяц, день, на стартовой странице эти параметры пусты, но если перейти на другой месяц, или год, то сразу же они будут заполнены.
Далее мы сами узнаем IP хоста, который запросил данную страничку. Этот ip нам нужен чтобы формировать ТОЛЬКО по нему данные, и вообще как то ориентироваться среди создаваемых нами файлов, потому что мы будем привязывать имя файла к его IP адресу.
Далее мы формируем строку. Которая запускает следующий скрипт ( будет ниже описан) и передает в него параметры IP, год, месяц, день.
Вызываем этот скрипт на выполнение.

Показываем html страницу. Заметьте, что имя страницы формируется из IP адреса хоста и приставки log_file.html

Второй скрипт на shell

Данный скрипт будет реализовывать запуск cgi скиптра lightsquid и записывать результат выполнения (cgi скрипта) в отдельный файл. А потом инициализирует запуск другого скрипта с передачей в него параметров (о котором ниже).

Создаем фаил
nano /var/lightsquid/my_scr/index.sh


Делаем его исполняемым
chmod +x index.sh


Важное замечание, т.к. скрипт должен выполнятся из под правами пользователя www-data. То следует добавить в файл /etc/sudoers в блок # User privilege specification, такую вот строку:
www-data ALL=(ALL) NOPASSWD: /var/lightsquid/my_scr/index.sh


Далее записываем в файл сами данные
#!/bin/sh$1 #ip адрес$2 #год$3 #месяц$4 #деньstr="log_file"param="year="$2"&month="$3"&day="$4LOG_FILE=/var/lightsquid/my_tmp/$1$str.html{export REQUEST_METHOD=GETexport QUERY_STRING=$param/var/lightsquid/index.cgi}> $LOG_FILE 2>&1/var/lightsquid/my_scr/index.py $1


Разьясню:
Получаем параметры IP, год, день, месяц
В переменную записываем строку log_file
Формируем запрос и записываем его в переменную
Запускаем cgi скрипт в который передаем параметры, результат работы скрипта сохраняем в файл с именем IP хоста + log_file.html
Вызываем другой скрипт, передаем в него параметры.

Третий скрипт на Python

Т.к. сформированная страница содержим много лишнего и неправильные ссылки (например она ссылается на cgi который мы не можем перехватить), и прочее, надо этот файл подкорректировать. заменить все ссылки на наши и удалить пару строк.

Создаем файл:
nano /var/lightsquid/my_scr/index.py


Делаем файл исполняемым.
chmod +x index.sh


Записываем в него следующие данные:

#!/usr/bin/env python#coding: utf-8import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметрыip_host = sys.argv[1] #считываем передаваемый IP адрес#скрипт удаляет все строчки из файла сгенерированным lightsquidseach_ip = ip_hostpath_file = '/var/lightsquid/my_tmp/'+ ip_host + 'log_file.html' #путь до файла который редактируемcount_line = sum(1 for l in open(path_file, 'r')) #подсчитываем количество строк в файле#len(open(path_file, 'r').readlines())            #второй способ посчитать количество строк в файле маленькомfile = open(path_file, 'r') # открыаем файлlines = file.readlines()    # прочитываем строки в переменнуюfile.close()                #закрыаем файлi = 0for i in range(count_line): #цикл от 0 до количества строк в файлеif "day_detail.cgi" in lines[i]:  #если в строке найдено обращение к файлу cgi        lines[i] = lines[i].replace('day_detail.cgi','day_detail.php') #немножко корректируем строку , чтобы ссылка обращалась к нашему скрипту    if "group_detail.cgi" in lines[i]: #Ищем строку где вхождение этого словосочетания        lines[i] = " <code><TD> </TD></code>"  #и приводим эту всю стоку к такому виду чтобы пользователи не могли смотреть группы    if "index.cgi" in lines[i]:        lines[i] = lines[i].replace('index.cgi','index.php')    if "month_detail.cgi" in lines[i]:        lines[i] = lines[i].replace('month_detail.cgi','month_detail.php')    if "graph.cgi" in lines[i]:        lines[i] = " "    if "topsites.cgi" in lines[i]:        lines[i] = lines[i].replace('topsites.cgi','topsites.php')file = open('/var/lightsquid/my_tmp/' + ip_host + 'log_file.html','w')file.writelines(lines)file.close


Вообще в Python очень важно отступы (четыре пробела) для тех кто не в курсе :)
Поясню немного скрипт.
Получаем IP адрес пользователя который запросил статистику (этот IP адрес передается сюда из предыдущего скрипта).
Далее открываем файл сформированный cgi скриптом lightsquid'а
Узнаем сколько в нем строк
Делаем цикл, в этом цикле проверяем каждую строку на соответствие нашим требованиям. А именно изменяет пути ссылок с cgi на php, так же мне не нужно было чтобы пользователи не видели группы, поэтому я делаю этот столбец вообще пустым ().
Ну и все, записываем обратно уже обработанный файл.

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

Остальные скипты


Все, что относится к bigfiles

bigfiles.php

<?php$year = " {$_GET['year']}";$month = " {$_GET['month']}";$day = " {$_GET['day']}";$ip_host = "{$_SERVER['REMOTE_ADDR']}";$str = "sudo /var/lightsquid/my_scr/my_bigfiles.sh ".$ip_host.$year.$month.$day;echo exec($str);include "/var/lightsquid/my_tmp/".$ip_host."log_file.html"?>


my_bigfiles.sh

#!/bin/sh$1 #ip адрес$2 #год$3 #месяц$4 #деньstr="log_file"param="year="$2"&month="$3"&day="$4"&user="$1LOG_FILE=/var/lightsquid/my_tmp/$1$str.html{export REQUEST_METHOD=GETexport QUERY_STRING=$param/var/lightsquid/bigfiles.cgi}> $LOG_FILE 2>&1/var/lightsquid/my_scr/my_bigfiles.py $1


my_bigfiles.py

#!/usr/bin/env python#coding: utf-8import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметрыip_host = sys.argv[1] #считываем передаваемый IP адресseach_ip = ip_hostpath_file = '/var/lightsquid/my_tmp/'+ ip_host + 'log_file.html' #путь до файла который редактируемcount_line = sum(1 for l in open(path_file, 'r')) #подсчитываем количество строк в файле#len(open(path_file, 'r').readlines())            #второй способ посчитать количество строк в файле маленькомfile = open(path_file, 'r') # открыаем файлlines = file.readlines()    # прочитываем строки в переменнуюfile.close()                #закрыаем файлi = 0for i in range(count_line): #цикл от 0 до количества строк в файле    if "index.cgi" in lines[i]:        lines[i] = lines[i].replace('index.cgi','index.php')    if "user_detail.cgi" in lines[i]:        lines[i] = lines[i].replace('user_detail.cgi','user_detail.php')file = open('/var/lightsquid/my_tmp/' + ip_host + 'log_file.html','w')file.writelines(lines)file.close


Все что относится к day_detail

bigfiles.php

<?php$year = " {$_GET['year']}";$month = " {$_GET['month']}";$day = " {$_GET['day']}";$ip_host = "{$_SERVER['REMOTE_ADDR']}";$str = "sudo /var/lightsquid/my_scr/my_day_detail.sh ".$ip_host.$year.$month.$day;echo exec($str);include "/var/lightsquid/my_tmp/".$ip_host."log_file.html"?>



!/bin/sh$1 #ip адрес$2 #год$3 #месяц$4 #деньstr="log_file"  #просто для описания файлаparam="year="$2"&month="$3"&day="$4  #тут создаем параметр который потом передадим в скриптLOG_FILE=/var/lightsquid/my_tmp/$1$str.html  # место куда будем записывать результат выполнения скрипта{export REQUEST_METHOD=GETexport QUERY_STRING=$param /var/lightsquid/day_detail.cgi}> $LOG_FILE 2>&1/var/lightsquid/my_scr/my_day_detail.py $1  #вызываем наш скрипт , которй обработает файл как надо ;)



#!/usr/bin/env python#coding: utf-8import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметрыip_host = sys.argv[1] #считываем передаваемый IP адрес#скрипт удаляет все строчки из файла сгенерированным lightsquid#кроме строк где содержится ip пользователя который запросил статистикуseach_ip = ip_hostpath_file = '/var/lightsquid/my_tmp/'+ ip_host + 'log_file.html' #путь до файла который редактируемcount_line = sum(1 for l in open(path_file, 'r')) #подсчитываем количество строк в файле    #len(open(path_file, 'r').readlines())            #второй способ посчитать количество строк в файле маленькомfile = open(path_file, 'r') # открыаем файлlines = file.readlines()    # прочитываем строки в переменнуюfile.close()                #закрыаем файлfor i in range(count_line): #цикл от 0 до количества строк в файле    if "tr bgcolor=" + "\42" + "cornsilk" + "\42" in lines[i] or "tr bgcolor=" + "\42" + "beige" + "\42" in lines[i]:  #если в строке найдено вхождение цвета1 или цвета2 , то работаем дальше        if seach_ip in lines[i+3]: continue   #если в строке найден нужнй ip адрес то все ок , если не найден то удаляе все это дело        else:            lines[i] = " "            lines[i+1] = " "            lines[i+2] = " "            lines[i+3] = " "            lines[i+4] = " "            lines[i+5] = " "            lines[i+6] = " "            lines[i+7] = " "            lines[i+8] = " "            lines[i+9] = " "            lines[i+10] = " "            lines[i+11] = " "            lines[i+12] = " "            lines[i+13] = " "            lines[i+14] = " "            lines[i+15] = " "            lines[i+16] = " "    if "user_time.cgi" in lines[i]:        lines[i] = lines[i].replace('user_time.cgi','user_time.php')    if "index.cgi" in lines[i]:        lines[i] = lines[i].replace('index.cgi','index.php')    if "user_detail.cgi" in lines[i]:        lines[i] = lines[i].replace('user_detail.cgi','user_detail.php')    if "topsites.cgi" in lines[i]:        lines[i] = " "    if "bigfiles.cgi" in lines[i]:        lines[i] = " "    if "group_detail.cgi" in lines[i]: #Ищем строку где вхождение этого словосочетания        lines[i] = " <TD> </TD>"  #и приводим эту всю стоку к такому виду чтобы пользователи не могли смотреть группы    if "get.cgi" in lines[i]:        lines[i] = lines[i].replace('get.cgi?png=datetime','datetime.png')file = open('/var/lightsquid/my_tmp/' + ip_host + 'log_file.html','w')file.writelines(lines)file.close

Считаю нужным пояснить этот скрипт.
Скрипт получает IP пользователя который запросил данные.
Т.к. файл который генерирует cgi однотипный, я решил привязать поиск нужной мне строки к цвету строки, там их два "cornsilk" и "beige". Если находится такая строка где есть этот цвет, то мы перемещаемся на три строчки вниз, там есть IP адрес. Сравниваем тот или не тот, и если не тот то мы просто удаляем все 16 строк. (столько именно занимает описание одной строчки в отчете).

Все что относится к month_detail

month_detail.php

<?php$year = " {$_GET['year']}";$month = " {$_GET['month']}";$mode = " {$_GET['mode']}";$ip_host = "{$_SERVER['REMOTE_ADDR']}";$str = "sudo /var/lightsquid/my_scr/my_month_detail.sh ".$ip_host.$year.$month.$mode;echo exec($str);include "/var/lightsquid/my_tmp/".$ip_host."log_file.html"?>


my_month_detail.sh

!/bin/sh$1 #ip адрес$2 #год$3 #месяц$4 #параметрstr="log_file"  #просто для описания файлаparam="year="$2"&month="$3"&mode="$4  #тут создаем параметр который потом передадим в скриптLOG_FILE=/var/lightsquid/my_tmp/$1$str.html  # место куда будем записывать результат выполнения скрипта{export REQUEST_METHOD=GETexport QUERY_STRING=$param /var/lightsquid/month_detail.cgi}> $LOG_FILE 2>&1/var/lightsquid/my_scr/my_month_detail.py $1 $3  #вызываем наш скрипт , которй обработает файл как надо ;)


my_month_detail.py

#!/usr/bin/env python#coding: utf-8import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметрыip_host = sys.argv[1] #считываем передаваемый IP адресmonth = sys.argv[2]#скрипт удаляет все строчки из файла сгенерированным lightsquid#кроме строк где содержится ip пользователя который запросил статистикуseach_ip = ip_hostpath_file = '/var/lightsquid/my_tmp/'+ ip_host + 'log_file.html' #путь до файла который редактируемcount_line = sum(1 for l in open(path_file, 'r')) #подсчитываем количество строк в файле    #len(open(path_file, 'r').readlines())            #второй способ посчитать количество строк в файле маленькомfile = open(path_file, 'r') # открыаем файлlines = file.readlines()    # прочитываем строки в переменнуюfile.close()                #закрыаем файлfor i in range(count_line): #цикл от 0 до количества строк в файле    if "tr bgcolor=" + "\42" + "cornsilk" + "\42" in lines[i] or "tr bgcolor=" + "\42" + "beige" + "\42" in lines[i]:  #если в строке найдено вхождение цвета1 или цвета2 , то работаем дальше        if seach_ip in lines[i+3]: continue   #если в строке найден нужнй ip адрес то все ок , если не найден то удаляе все это дело        else:            if month == "all":  # тут проблема . если передается параметр определенного месяца , то количество стро одно , а если весь год , то количество строк другое                lines[i] = " "                lines[i+1] = " "                lines[i+2] = " "                lines[i+3] = " "                lines[i+4] = " "                lines[i+5] = " "                lines[i+6] = " "                lines[i+7] = " "                lines[i+8] = " "                lines[i+9] = " "                lines[i+10] = " "                lines[i+11] = " "                lines[i+12] = " "                lines[i+13] = " "                lines[i+14] = " "            else:                lines[i] = " "                lines[i+1] = " "                lines[i+2] = " "                lines[i+3] = " "                lines[i+4] = " "                lines[i+5] = " "                lines[i+6] = " "                lines[i+7] = " "                lines[i+8] = " "                lines[i+9] = " "                lines[i+10] = " "                lines[i+11] = " "                lines[i+12] = " "                lines[i+13] = " "                lines[i+14] = " "                lines[i+15] = " "for i in range(count_line): #цикл от 0 до количества строк в файле    if  lines[i]<> " ":        if "index.cgi" in lines[i]:            lines[i] = lines[i].replace('index.cgi','index.php')        if "user_time.cgi" in lines[i]:            lines[i] = lines[i].replace('user_time.cgi','user_time.php')        if "graph.cgi" in lines[i]:            lines[i] = '<TD></TD>'        if "user_month.cgi" in lines[i]:            lines[i] = lines[i].replace('user_month.cgi','user_month.php')        if "user_detail.cgi" in lines[i]:            lines[i] = lines[i].replace('user_detail.cgi','user_detail.php')        if "get.cgi" in lines[i]:            lines[i] = lines[i].replace('get.cgi?png=datetime','datetime.png')        if "get.cgi" in lines[i]:            lines[i] = lines[i].replace('get.cgi?png=graph','graph.png')file = open('/var/lightsquid/my_tmp/' + ip_host + 'log_file.html','w')file.writelines(lines)file.close

В этом скрипте почти тоже самое что и было выше описано, только разница вот в чем, поступают разные параметры (год и месяц), поэтому и количество строк формирующие данные разные. в зависимости от получаемого параметра month = sys.argv[2] мы выбираем действие.

Все что относится к topsites

topsites.php

<?php$year = " {$_GET['year']}";$month = " {$_GET['month']}";$day = " {$_GET['day']}";$mode = " {$_GET['mode']}";$order = " {$_GET['order']}";$ip_host = "{$_SERVER['REMOTE_ADDR']}";$str = "sudo /var/lightsquid/my_scr/my_topsites.sh ".$ip_host.$year.$month.$mode.$order;echo exec($str);include "/var/lightsquid/my_tmp/".$ip_host."log_file.html"?>


my_topsites.sh

#!/bin/sh$1 #ip адрес$2 #год$3 #месяц$4 #день\параметр$5 #параметр\другоще$6 #другоеstr="log_file"  #просто для описания файлаif [ $5 = "hits" -o $4 = "size" ]thenparam="year="$2"&month="$3"&day=&mode="$4"&order="$5elseparam="year="$2"&month="$3"&mode="$4  #тут создаем параметр который потом передадим в скриптfiLOG_FILE=/var/lightsquid/my_tmp/$1$str.html  # место куда будем записывать результат выполнения скрипта{export REQUEST_METHOD=GETexport QUERY_STRING=$param /var/lightsquid/topsites.cgi}> $LOG_FILE 2>&1/var/lightsquid/my_scr/my_topsites.py $1  #вызываем наш скрипт , которй обработает файл как надо ;)

Тут немного посложнее, тоже в скрипт передаются разные параметры, и в зависимости от принимаемых скриптом параметров он формирует запрос к cgi скрипту.

my_topsites.py

!/usr/bin/env python#coding: utf-8import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметрыip_host = sys.argv[1] #считываем передаваемый IP адресseach_ip = ip_hostpath_file = '/var/lightsquid/my_tmp/'+ ip_host + 'log_file.html' #путь до файла который редактируемcount_line = sum(1 for l in open(path_file, 'r')) #подсчитываем количество строк в файле#len(open(path_file, 'r').readlines())            #второй способ посчитать количество строк в файле маленькомfile = open(path_file, 'r') # открыаем файлlines = file.readlines()    # прочитываем строки в переменнуюfile.close()                #закрыаем файлi = 0for i in range(count_line): #цикл от 0 до количества строк в файле    if "whousesite.cgi" in lines[i]: #Ищем строку где вхождение этого словосочетания        lines[i] = " <TD> </TD>"  #и приводим эту всю стоку к такому виду чтобы пользователи не могли смотреть группы    if "index.cgi" in lines[i]:        lines[i] = lines[i].replace('index.cgi','index.php')    if "topsites.cgi" in lines[i]:        lines[i] = lines[i].replace('topsites.cgi','topsites.php')file = open('/var/lightsquid/my_tmp/' + ip_host + 'log_file.html','w')file.writelines(lines)file.close


Все что относится к user_detail

user_detail.php

<?php$year = " {$_GET['year']}";$month = " {$_GET['month']}";$day = " {$_GET['day']}";$mode = " {$_GET['mode']}";$ip_host = "{$_SERVER['REMOTE_ADDR']}";$str = "sudo /var/lightsquid/my_scr/my_user_detail.sh ".$ip_host.$year.$month.$day.$mode;echo exec($str);include "/var/lightsquid/my_tmp/".$ip_host."log_file.html"?>


user_detail.sh

#!/bin/sh$1 #ip адрес$2 #год$3 #месяц$4 #день\параметрstr="log_file"  #просто для описания файлаif [ $4 = "month" -o $4 = "year" ]thenparam="year="$2"&month="$3"&user="$1"&mode="$4  #тут создаем параметр который потом передадим в скриптelseparam="year="$2"&month="$3"&day="$4"&user="$1fiLOG_FILE=/var/lightsquid/my_tmp/$1$str.html  # место куда будем записывать результат выполнения скрипта{export REQUEST_METHOD=GETexport QUERY_STRING=$param /var/lightsquid/user_detail.cgi}> $LOG_FILE 2>&1/var/lightsquid/my_scr/my_user_detail.py $1  #вызываем наш скрипт , которй обработает файл как надо ;)


user_detail.py

#!/usr/bin/env python#coding: utf-8import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметрыip_host = sys.argv[1] #считываем передаваемый IP адресseach_ip = ip_hostpath_file = '/var/lightsquid/my_tmp/'+ ip_host + 'log_file.html' #путь до файла который редактируемcount_line = sum(1 for l in open(path_file, 'r')) #подсчитываем количество строк в файле#len(open(path_file, 'r').readlines())            #второй способ посчитать количество строк в файле маленькомfile = open(path_file, 'r') # открыаем файлlines = file.readlines()    # прочитываем строки в переменнуюfile.close()                #закрываем файлi = 0for i in range(count_line): #цикл от 0 до количества строк в файле    if "index.cgi" in lines[i]:        lines[i] = lines[i].replace('index.cgi','index.php')    if "user_time.cgi" in lines[i]:        lines[i] = lines[i].replace('user_time.cgi','user_time.php')    if "bigfiles.cgi" in lines[i]:        lines[i] = lines[i].replace('bigfiles.cgi','bigfiles.php')    if "get.cgi" in lines[i]:        lines[i] = lines[i].replace('get.cgi?png=datetime','datetime.png')file = open('/var/lightsquid/my_tmp/' + ip_host + 'log_file.html','w')file.writelines(lines)file.close


Все что относится к user_month

user_month.php

<?php$year = " {$_GET['year']}";$month = " {$_GET['month']}";$ip_host = "{$_SERVER['REMOTE_ADDR']}";$str = "sudo /var/lightsquid/my_scr/my_user_month.sh ".$ip_host.$year.$month;echo exec($str);include "/var/lightsquid/my_tmp/".$ip_host."log_file.html"?>


user_month.sh

#!/bin/sh$1 #ip адрес$2 #год$3 #месяцstr="log_file"param="year="$2"&month="$3"&user="$1LOG_FILE=/var/lightsquid/my_tmp/$1$str.html{export REQUEST_METHOD=GETexport QUERY_STRING=$param/var/lightsquid/user_month.cgi}> $LOG_FILE 2>&1/var/lightsquid/my_scr/my_user_month.py $1


user_month.py

#!/usr/bin/env python#coding: utf-8import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметрыip_host = sys.argv[1] #считываем передаваемый IP адрес#скрипт удаляет все строчки из файла сгенерированным lightsquid#кроме строк где содержится ip пользователя который запросил статистикуseach_ip = ip_hostpath_file = '/var/lightsquid/my_tmp/'+ ip_host + 'log_file.html' #путь до файла который редактируемcount_line = sum(1 for l in open(path_file, 'r')) #подсчитываем количество строк в файле#len(open(path_file, 'r').readlines())            #второй способ посчитать количество строк в файле маленькомfile = open(path_file, 'r') # открыаем файлlines = file.readlines()    # прочитываем строки в переменнуюfile.close()                #закрыаем файлi = 0for i in range(count_line): #цикл от 0 до количества строк в файле    if "user_detail.cgi" in lines[i]:  #если в строке найдено обращение к файлу cgi        lines[i] = lines[i].replace('user_detail.cgi','user_detail.php') #немножко корректируем строку , чтобы ссылка обращалась к нашему скрипту    if "index.cgi" in lines[i]:        lines[i] = lines[i].replace('index.cgi','index.php')    if "graph.cgi" in lines[i]:        lines[i] = lines[i].replace('graph.cgi','graph.php')file = open('/var/lightsquid/my_tmp/' + ip_host + 'log_file.html','w')file.writelines(lines)file.close


Все что относится к user_time

user_time.php

<?php$year = " {$_GET['year']}";$month = " {$_GET['month']}";$day = " {$_GET['day']}";$mode = " {$_GET['mode']}";$ip_host = "{$_SERVER['REMOTE_ADDR']}";$str = "sudo /var/lightsquid/my_scr/my_user_time.sh ".$ip_host.$year.$month.$mode;echo exec($str);include "/var/lightsquid/my_tmp/".$ip_host."log_file.html"?>


user_time.sh

#!/bin/sh$1 #ip адрес$2 #год$3 #месяц$4 #день\параметрstr="log_file"  #просто для описания файлаif [ $4 = "month" -o $4 = "year" ]thenparam="year="$2"&month="$3"&user="$1"&mode="$4  #тут создаем параметр который потом передадим в скриптelseparam="year="$2"&month="$3"&day="$4"&user="$1fiLOG_FILE=/var/lightsquid/my_tmp/$1$str.html  # место куда будем записывать результат выполнения скрипта{export REQUEST_METHOD=GETexport QUERY_STRING=$param /var/lightsquid/user_time.cgi}> $LOG_FILE 2>&1/var/lightsquid/my_scr/my_user_time.py $1  #вызываем наш скрипт , которй обработает файл как надо ;)


user_time.py

#!/usr/bin/env python#coding: utf-8import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметрыip_host = sys.argv[1] #считываем передаваемый IP адрес#скрипт удаляет все строчки из файла сгенерированным lightsquid#кроме строк где содержится ip пользователя который запросил статистикуseach_ip = ip_hostpath_file = '/var/lightsquid/my_tmp/'+ ip_host + 'log_file.html' #путь до файла который редактируемcount_line = sum(1 for l in open(path_file, 'r')) #подсчитываем количество строк в файле#len(open(path_file, 'r').readlines())            #второй способ посчитать количество строк в файле маленькомfile = open(path_file, 'r') # открыаем файлlines = file.readlines()    # прочитываем строки в переменнуюfile.close()                #закрыаем файлi = 0for i in range(count_line): #цикл от 0 до количества строк в файле    if "index.cgi" in lines[i]:        lines[i] = lines[i].replace('index.cgi','index.php')file = open('/var/lightsquid/my_tmp/' + ip_host + 'log_file.html','w')file.writelines(lines)file.close


Итог



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

Ubuntu 16.04 Получаем обновления безопасности после окончания основной поддержки

01.05.2021 06:18:27 | Автор: admin

У операционной системы Ubuntu 16.04 закончилась стадия основной поддержки https://wiki.ubuntu.com/Releases

Данный релиз был выпущен в апреле 2016 года и поддерживался до апреля 2021 года.

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

Для этого используется подключение к программе Ubuntu Advantage https://ubuntu.com/advantage и на один аккаунт можно добавить 3 машины (бесплатно для персонального использования) получив ключ. Все что необходимо для этого - это Ubuntu One аккаунт.

Для коммерческого использования предлагается платная подписка, цены варьируют от $25 за desktop, $75 за виртуальный сервер и $225 за физический сервер в год и выше, более дорогие цены подразумевают не только обновления, но и получение технической поддержки через тикеты и по телефону.

В одном из последних обновлений Ubuntu 16.04 в систему устанавливается утилита ua с помощью которой происходит подключение к сервису

Для подключения к программе получения обновлений необходимо войти в свой аккаунт, получить токен и выполнить команду

sudo ua attach ваш_токен

Проверить статус подключения можно командой

sudo ua status

Тем самым вы будете получать обновления еще три года до апреля 2024. Также следует отметить, что если вы являетесь Ubuntu community member https://wiki.ubuntu.com/Membership, то вы сможете подключить к сервису до 50 машин.

Следует отметить, что для релизов, которые еще актуальны (ubuntu 18.04, 20.04) существует сервис livepatch https://ubuntu.com/security/livepatch и с его помощью возможно получение и установка патчей безопасности ядра без перезагрузки системы. Условия использования сервиса такие же - 3 машины бесплатно (и до 50 машин для community members).

Подробнее..

Основы Bash-скриптинга для непрограммистов. Часть 3

16.02.2021 20:15:11 | Автор: admin

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

Функции

Часто используемые, повторяющиеся блоки имеет смысл выделять в отдельные функции, чтобы при необходимости их запускать, передавая параметры.

Определение функции выглядит следующим образом:

<имя_функции>() {  <команды>  return <число>}funciton <имя_функции>() {  <команды>  return <число>}

Первый вариант ближе к синтаксису языка С и считается более переносимым, во втором варианте круглые скобки можно не указывать. Также может отсутствовать оператор return, если функция не возвращает значения.

Самый простой пример скрипта, содержащего объявление и вызов функции будет выглядеть так:

#!/bin/bashf() {  echo Test}f

Мы объявили функцию f, которая выводит слово Test, и затем вызвали её:

test@osboxes:~$ ./script6.shTest

Так же, как и скрипт, функция может принимать параметры и использовать их, ссылаясь по номеру ($1, $2, , $N). Вызов функции с параметрами в скрипте осуществляется так:

<имя функции> <параметр1> <параметр2> <параметрN>

Функция может возвращать результат своего выполнения (код завершения) в виде числового значения в диапазоне от 0 до 255. Принято считать, что если функция возвращает 0, то она выполнилась успешно, во всех остальных случаях значение содержит код ошибки. Чтобы получить код завершения функции в скрипте, необходимо обратиться к переменной $?. Добавив параметры и возвращаемое значение, получим следующий скрипт:

#!/bin/bashsumm() {  re='^[0-9]+$'  if ! [[ $1 =~ $re ]] ; then    return 1  elif ! [[ $2 =~ $re ]] ; then    return 2  else    s=$(($1 + $2))    return 0  fi}summ $1 $2case $? in 0) echo "The sum is: $s" ;; 1) echo "var1 is not a nubmer" ;; 2) echo "var2 is not a nubmer" ;; *) echo "Unknown error" ;;esac

Здесь мы создали функцию summ, которая принимает 2 параметра и с помощью регулярного выражения ^[0-9]+$ проверяет, является ли каждый из переданных параметров числом. В случае, если первый параметр не число, то код завершения функции будет 1, если второй параметр не число, то код завершения функции будет 2. Во всех остальных случаях функция вычисляет сумму переданных параметров, сохраняя результат в глобальной переменной s.

Скрипт вызывает функцию, передавая её на вход параметры, которые были переданы ему самому при вызове. Далее проверяется код завершения функции и выдается соответствующая ошибка, если код не равен 0, иначе выдается сумма, сохраненная в переменной s. Протестируем скрипт:

test@osboxes.org:~$ ./script7.sh abc 123var1 is not a nubmertest@osboxes.org:~$ ./script7.sh 234 defvar2 is not a nubmertest@osboxes.org:~$ ./script7.sh 10 15The sum is: 25

По умолчанию переменные объявляются глобальными, т.е. видны в любом блоке скрипта. Переменные, объявленные как локальные, имеют ограниченную область видимости, и видны только в пределах блока, в котором они были объявлены. В случае с функцией это означает, что локальная переменная "видна" только в теле функции, в которой она была объявлена.

Для того, чтобы объявить переменную локальной, используется слово local, например local loc_var=123. Важно отметить, все что переменные, объявляемые в теле функции, считаются необъявленными до тех пор, пока эта функция не будет вызвана.

Объединим все воедино, создав на основе рассмотренных ранее структур следующий скрипт:

#!/bin/bashclearFiles() {  rm *.dat  if [ $? -eq 0 ]  then    echo Files deleted  fi}genFiles() {  for (( i=1; i<=$1; i++ ))  do    head -c ${i}M </dev/urandom >myfile${i}mb.dat  done  ls -l *.dat}delFiles() {for f in *.dat  do    size=$(( $(stat -c %s $f) /1024/1024 ))    if [ $size -gt $1 ]    then      rm $f      echo Deleted file $f    fi  done  ls -l *.dat}showWeather() {  curl -s "https://weather-broker-cdn.api.bbci.co.uk/en/observation/rss/$1" | grep "<desc" | sed -r 's/<description>//g; s/<\/description>//g'}menu() {  clear  echo 1 - Delete all .dat files  echo 2 - Generate .dat files  echo 3 - Delete big .dat files  echo 4 - List all files  echo 5 - Planet info  echo 6 - Show weather  echo "x/q - Exit"  echo -n "Choose action: "  read -n 1 key  echo}while truedo  case "$key" in    "x" | "q" | "X" | "Q") break ;;    "1")      clearFiles      read -n 1    ;;    "2")      echo -n "File count: "      read count      genFiles $count      read -n 1    ;;    "3")      echo -n "Delete file greater than (mb): "      read maxsize      delFiles $maxsize      read -n 1    ;;    "4")      ls -la      read -n 1    ;;    "5")      ./script4.sh      read -n 1    ;;    "6")      echo -n "Enter city code: " # 524901 498817 5391959      read citycode      showWeather $citycode      read -n 1    ;;  esac  menudone

В данном скрипте мы объявили 5 функций:

  • clearFiles

  • genFiles

  • delFiles

  • showWeather

  • menu

Далее реализован бесконечный цикл с помощью оператора while с условием true, в который вложен оператор выбора в зависимости от нажатой клавиши, а также вызов функции menu для отображения списка доступных действий. Данный скрипт в интерактивном режиме позволяет выполнить следующие действия:

  • Удалить все файлы .dat в текущей директории

  • Создать указанное количество файлов

  • Удалить файлы больше определенного размера

  • Вывести список всех файлов текущей директории

  • Запустить скрипт, выдающий информацию о планетах

  • Отобразить погоду по коду указанного города

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

test@osboxes.org:~$ ./script8.sh1 - Delete all .dat files2 - Generate .dat files3 - Delete big .dat files4 - List all files5 - Planet info6 - Show weatherx/q - ExitChoose action: 4total 40drwxr-xr-x 2 test test 4096 Feb 16 15:56 .drwxr-xr-x 6 root root 4096 Feb 16 15:54 ..-rw------- 1 test test   42 Feb 16 15:55 .bash_history-rw-r--r-- 1 test test  220 Feb 16 15:54 .bash_logout-rw-r--r-- 1 test test 3771 Feb 16 15:54 .bashrc-rw-r--r-- 1 test test  807 Feb 16 15:54 .profile-rw-r--r-- 1 test test 1654 Feb 16 12:40 input.xml-rwxr-xr-x 1 test test  281 Feb 16 14:02 script4.sh-rwxr-xr-x 1 test test  328 Feb 16 13:40 script7.sh-rwxr-xr-x 1 test test 1410 Feb 16 15:24 script8.sh
1 - Delete all .dat files2 - Generate .dat files3 - Delete big .dat files4 - List all files5 - Planet info6 - Show weatherx/q - ExitChoose action: 2File count: 8-rw-rw-r-- 1 test test 1048576 Feb 16 16:00 myfile1mb.dat-rw-rw-r-- 1 test test 2097152 Feb 16 16:00 myfile2mb.dat-rw-rw-r-- 1 test test 3145728 Feb 16 16:00 myfile3mb.dat-rw-rw-r-- 1 test test 4194304 Feb 16 16:00 myfile4mb.dat-rw-rw-r-- 1 test test 5242880 Feb 16 16:00 myfile5mb.dat-rw-rw-r-- 1 test test 6291456 Feb 16 16:00 myfile6mb.dat-rw-rw-r-- 1 test test 7340032 Feb 16 16:00 myfile7mb.dat-rw-rw-r-- 1 test test 8388608 Feb 16 16:00 myfile8mb.dat
1 - Delete all .dat files2 - Generate .dat files3 - Delete big .dat files4 - List all files5 - Planet info6 - Show weatherx/q - ExitChoose action: 3Delete file greater than (mb): 5Deleted file myfile6mb.datDeleted file myfile7mb.datDeleted file myfile8mb.dat-rw-rw-r-- 1 test test 1048576 Feb 16 16:00 myfile1mb.dat-rw-rw-r-- 1 test test 2097152 Feb 16 16:00 myfile2mb.dat-rw-rw-r-- 1 test test 3145728 Feb 16 16:00 myfile3mb.dat-rw-rw-r-- 1 test test 4194304 Feb 16 16:00 myfile4mb.dat-rw-rw-r-- 1 test test 5242880 Feb 16 16:00 myfile5mb.dat
1 - Delete all .dat files2 - Generate .dat files3 - Delete big .dat files4 - List all files5 - Planet info6 - Show weatherx/q - ExitChoose action: 1Files deleted
1 - Delete all .dat files2 - Generate .dat files3 - Delete big .dat files4 - List all files5 - Planet info6 - Show weatherx/q - ExitChoose action: 5Enter the name of planet: MarsThe Mars has two satellite(s).
1 - Delete all .dat files2 - Generate .dat files3 - Delete big .dat files4 - List all files5 - Planet info6 - Show weatherx/q - ExitChoose action: 6Enter city code: 524901    Latest observations for Moscow from BBC Weather, including weather, temperature and wind information      Temperature: -11C (11F), Wind Direction: Northerly, Wind Speed: 0mph, Humidity: 84%, Pressure: 1018mb, , Visibility: Moderate

Примечание: для тестирования работы с данными из Интернет (пункт 6 в меню выбора скрипта) может потребоваться установка curl, это можно сделать командой sudo apt install curl.

Планировщик заданий cron

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

Просмотр заданий пользователя выполняется командой crontab l. Для редактирования и создания новых задания используется команда crontab e. Строки для запуска команд планировщика в файле конфигурации cron имеют следующий формат:

m h dom mon dow command parameters

Где m минута, h час, dom день месяца, mon месяц, dow день недели, command команда, parameters список параметров. Наглядно этот формат можно представить так:

Например, для того, чтобы в 10 и 30 минут каждого часа каждый день месяца весь год по будням запускать команду, нужно указать следующее:

10,30 * * * 1-5 command parameter1 parameter2

Более простой пример, каждые 15 минут выполнять команду:

*/15 * * * * command

Создадим скрипт для резервного копирования домашней директории пользователя, который будет создавать новый файл бэкапа при каждом запуске:

#!/bin/bashUSER=`whoami`BACKUP_DIR=/tmp/backup_${USER}BACKUP_FILE=${USER}_$(date +%Y%m%d%M%H%S).tgzmkdir -p $BACKUP_DIRcd /tar -zcf $BACKUP_DIR/$BACKUP_FILE home/$USER

Поставим скрипт на выполнение каждый день в 22:00, выполнив команду crontab -eи добавив с помощью открывшегося редактора строку:

00 22 * * * ./backup_home.sh

Проверить, что задача добавлена в планировщик, можно командой crontab -l:

test@osboxes.org:~$ crontab -l00 22 * * * ./backup_home.sh

В результате каждый день в 22:00 будет создаваться резервная копия домашней директории пользователя (в приведенном примере для демонстрации запуск скрипта выполняется каждую минуту):

test@osboxes.org:~$ cd /tmp/backup_test/test@osboxes:/tmp/backup_test$ lltotal 80drwxrwxr-x  2 test test 4096 Feb 16 16:38 ./drwxrwxrwt 17 root root 4096 Feb 16 16:30 ../-rw-rw-r--  1 test test 4431 Feb 16 16:30 test_20210216301601.tgz-rw-rw-r--  1 test test 4431 Feb 16 16:31 test_20210216311601.tgz-rw-rw-r--  1 test test 4431 Feb 16 16:32 test_20210216321601.tgz-rw-rw-r--  1 test test 4431 Feb 16 16:33 test_20210216331601.tgz-rw-rw-r--  1 test test 4431 Feb 16 16:34 test_20210216341601.tgztest@osboxes:/tmp/backup_test$

Нужно отметить, что директория /tmp в примере использована исключительно для тестов, т.к. она предназначена для хранения временных файлов, и использовать её для хранения резервных копий нельзя. Правильное место размещения бэкапов может подсказать системный администратор.

Список полезных команд

Список встроенных команд интерпретатора: help
Помощь по команде: <команда> --help
Мануал по команде: man <команда>
Версия команды: <команда> --version
Список доступных оболочек: cat /etc/shells
Список пользователей и их оболочек: cat /etc/passwd
Текущая директория: pwd
Список файлов текущей директории: ls -la
Текущий пользователь: id
Переменные среды: set
Версия ОС: cat /etc/os-release
Версия ядра: uname -a
Получить привилегии суперпользователя: sudo su -
Установка программы в Debian: apt install mc
Посмотреть утилизацию(загрузку): top
Свободное место: df -h
Сколько занимает директория: du -ks /var/log
Конфигурация сетевых интерфейсов: ifconfig -a
Объем оперативной памяти: free -m
Информация о блочных устройствах(дисках): lsblk
Информация о процессорах: cat /proc/cpuinfo
Список установленных пакетов: apt list --installed
Список и статус сервисов: service --status-all
Перезапуск сервиса: service apache2 restart
Скачать файл: wget https://www.gnu.org/graphics/gplv3-with-text-136x68.png
Получить веб-страницу по URL: curl https://www.google.com
Показать задания планировщика: crontab -l
Редактировать задания планировщика: crontab -e
Вывести новые сообщения в системном логе: tail -f /var/log/syslog
Подсчитать количество строк в выводе команды: <команда> | wc -l
Изменить права доступа к файлу (разрешить выполнение всем): chmod a+x <файл>
Список процессов: ps -ef
Проверить, запущен ли процесс: ps -ef | grep <процесс>
Перейти в предыдущий каталог: cd -
Завершить процесс (сигнал kill): kill -9
Удаление файла: rm <имя файла>
Удаление директории: rm -rf <имя директории>
Редактировать файл: nano <имя_файла>
Топ 10 процессов по использованию памяти: ps aux | awk '{print $6/1024 " MB\t\t" $11}' | sort -nr | head

Полезные ссылки

Руководство по bash: GNU Bash manual
Расширенное руководство по Bash: Advanced Bash-Scripting Guide
Статья на Википедии: Bash
Описание команд и утилит оболочки bash: SS64
Часто задаваемые вопросы о Debian GNU/Linux: Debian FAQ

Заключение

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

На этом пока все, надеюсь, было интересно!
Какие другие полезные команды вы знаете и используете в работе?
Какие интересные конструкции приходилось использовать?
Какие задачи решали?
Всем удачного скриптинга, делитесь мнениями в комментариях!

Подробнее..
Категории: *nix , Linux , Unix , Ubuntu , Bash , Bash scripting , Ssh , Virtualbox , Debian , Shells

Ставим Ubuntu из другого LinuxLiveCD

29.03.2021 04:05:11 | Автор: admin

Речь в статье пойдёт об установке Ubuntu из другого Linux без использования ISO-образа. Нужно это прежде всего для создания кастомизированных тестовых окружений. Информации о такой процедуре в интернете достаточно, она легко гуглится, но, как выяснилось, в некоторых моментах существующие инструкции устарели, да, и все они обладают известным фатальным недостатком.

Итак, постановка задачи: есть голая виртуальная машина с выходом в интернет и EFI BIOS, есть некий линукс (в нашем случае это SystemRescue LiveCD), нужно получить установленную Ubuntu. И все действия должны быть легко автоматизированы, что их можно оформить в виде скрипта.

Прежде всего загружаемся в наш SysRCD. Работать мы будем по SSH, и что он заработал, нужно установить пароль root и разрешить SSH в iptables (изначально запрещены любые входящие соединения):

iptables -I INPUT -p tcp --dport 22 -j ACCEPTpasswd

И подключаемся по SSH:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@192.168.56.110

Теперь нужно подготовить разделы на жёстком диске. Так как система у нас EFI, то таблица разделов будет GPT, нужен EFI FAT-раздел, а сама система будет находится на разделе с ext4-разделе. EFI-раздел может очень небольшим - буквально 10 МБ, но для стабильной работы обновлений системы лучше делать его хотя бы 32 МБ. И важное замечание! Во всех инструкциях написано, что раздел должен быть в формате FAT32, но на практике VirtualBox отказывается работать с EFI-разделом в таком формате! Плюс, есть нюансы с размером диска, размером кластера и совместимостью с EFI биосами. Поэтому форматировать будем в FAT16 - только там удаётся добиться стабильной работы с VirtualBox. Разбивать будем при помощи parted.
Для того, чтобы пометить раздел как служебный EFI в parted ему нужно выставить флаг "esp".

partedunit KiBmktable gptmkpart fat16 1024KiB 32MiBname 1 EFI  set 1 esp onmkpart ext4 32MiB -1sПредложит выравнять - соглашаемся.name 2 LINUXquit

Теперь форматируем вновь созданные разделы. Ещё раз обращаю внимание, что EFI-раздел форматируем в FAT-16, иначе будут проблемы с VirtualBox.

mkfs.fat -F 16 -n EFI /dev/sda1FAT32 не работает!mkfs.ext4 -O ^64bit -L LINUX /dev/sda2

Разворачивать систему будем при помощи утилиты debootstrap. В нашем Linux её нет, поэтому просто скачаем deb-пакет и репозитория Debian и развернём содержимое прямо в наш LiveCD.

mkdir /tmp/1cd /tmp/1wget http://ftp.ru.debian.org/debian/pool/main/d/debootstrap/debootstrap_1.0.123_all.debar -p *.deb data.tar.gz | tar -xz -C /

Ставить будем Ubuntu 20.04 "Focal" - имя релиза указывается при вызове deboostrap. там же указывается репозиторий, откуда будут скачаны файлы.
Для разворачивания системы, нам естественно, нужно сначала примонтировать её корень в какую-то папку. Не мудрствуя лукаво используем для этого папку "/tmp/".

mkdir /tmp/newrootcd /tmpmount -o relatime /dev/sda2 newroot/usr/sbin/debootstrap --arch=amd64 --include=wget,nano focal /tmp/newroot https://mirror.linux-ia64.org/ubuntu/

Теперь нам нужно настроить список репозиториев, откуда будут браться устанавливаемые и обновляемые пакеты. Список находится в файле /etc/apt/sources.list

( RELEASE=focal ; echo "deb http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE} main restricted# deb-src http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE} main restricteddeb http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE}-updates main restricted# deb-src http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE}-updates main restricteddeb http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE} universe# deb-src http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE} universedeb http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE}-updates universe# deb-src http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE}-updates universedeb http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE} multiverse# deb-src http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE} multiversedeb http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE}-updates multiverse# deb-src http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE}-updates multiversedeb http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE}-backports main restricted universe multiverse# deb-src http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE}-backports main restricted universe multiversedeb http://archive.canonical.com/ubuntu ${RELEASE} partner# deb-src http://archive.canonical.com/ubuntu ${RELEASE} partnerdeb http://security.ubuntu.com/ubuntu focal-security main restricted# deb-src http://security.ubuntu.com/ubuntu ${RELEASE}-security main restricteddeb http://security.ubuntu.com/ubuntu ${RELEASE}-security universe# deb-src http://security.ubuntu.com/ubuntu ${RELEASE}-security universedeb http://security.ubuntu.com/ubuntu ${RELEASE}-security multiverse# deb-src http://security.ubuntu.com/ubuntu ${RELEASE}-security multiverse" >newroot/etc/apt/sources.list )

Теперь настраиваем chroot-окружение и входим в нашу новую систему:

mount --bind /dev newroot/devmount --bind /dev/pts newroot/dev/pts mount -t sysfs sys newroot/sys mount -t proc proc newroot/procLANG=C.UTF-8 chroot newroot

Первым делом настраиваем поддерживаемые локали. Обратите внимание, что добавляется CP866 (на самом деле она "IBM866"), которая до сих пор бывает актуальной при работе со windows-legacy данными.
Список поддерживаемых кодировок хранится в /etc/locale.gen Ещё раз обращаю внимание, что CP866/IBM866 по-умолчанию там нет. Пос

locale-gen en_US.UTF-8echo "en_GB ISO-8859-1en_GB.UTF-8 UTF-8en_US ISO-8859-1en_US.UTF-8 UTF-8ru_RU.CP1251 CP1251ru_RU.IBM866 IBM866ru_RU.KOI8-R KOI8-Rru_RU.UTF-8 UTF-8" >/etc/locale.gen# Генерируем файлы выбранных кодировок и локалей.locale-gen

Обновляем список пакетов и сразу ставим mc, aptitude и фс, чтобы жить стало легче.

apt-get updateapt-get upgradeapt-get install -y aptitude mc man# Ставим базовый языковой пакет.apt-get install -y language-pack-en

EFI раздел будет примонтирован в /boot/efi. Монтируем и настраиваем /etc/fstab.

echo " <file system>                           <mount point>          <type>  <options>                    <dump> <pass># / was on /dev/sda2 during installationUUID=`blkid -o value -s UUID /dev/sda2`   /                      ext4    errors=remount-ro,relatime      0     2# /boot/efi was on /dev/sda1 during installationUUID=`blkid -o value -s UUID /dev/sda1`   /boot/efi              vfat    umask=0033                      0     1" >/etc/fstab# Монтируем EFI-раздел.mount /boot/efi

Настраиваем локаль.

echo 'LANG="C"LANGUAGE="en_US:C:ru_RU"LC_CTYPE="ru_RU.UTF-8"LC_MESSAGES="en_US.UTF-8"LC_COLLATE="ru_RU.UTF-8"LC_NUMERIC="C.UTF-8"LC_TIME="C.UTF-8"LC_MONETARY="en_US.UTF-8"LC_PAPER="ru_RU.UTF-8"LC_NAME="en_US.UTF-8"LC_ADDRESS="en_US.UTF-8"LC_TELEPHONE="ru_RU.UTF-8"LC_MEASUREMENT="ru_RU.UTF-8"LC_IDENTIFICATION="en_US.UTF-8"' >/etc/default/locale

Настраиваем часовой пояс. То же самое можно выполнить вызовом "dpkg-reconfigure tzdata". Но нам же нужно, чтобы это можно было заскриптовать. Просмотреть спиcок часовых поясов можно вызовом "timedatectl list-timezones".

ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtimeecho "Europe/Moscow" >/etc/timezoneecho "test" >etc/hostname# Но сейчас принято делать так:timedatectl set-timezone "Europe/Moscow" # Просмотреть варианты можно вызовом timedatectl list-timezones

Указываем, что аппаратные часы у нас хранят время в UTC. Обратите внимание, что "0" означает время в UTC.

timedatectl set-local-rtc 0

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

apt-get install -y linux-image-virtual-hwe-20.04-edge linux-image-extra-virtual-hwe-20.04-edge linux-headers-virtual-hwe-20.04-edge

Ставим поддержку консоли, сети, GRUB, SSH и всякие мелкие утилиты:

apt-get install -y console-setup console-common sshapt-get install -y net-tools bind9utils build-essential pixz pigz pv htopapt-get install -y grub-efi-amd64

Настраиваем клавиатуру:

# Consult the keyboard(5) manual page.XKBMODEL="pc105"XKBLAYOUT="us,ru"XKBVARIANT=","XKBOPTIONS="grp:rctrl_toggle,lv3:ralt_switch,grp_led:scroll"BACKSPACE="guess"' >/etc/default/keyboardecho '# CONFIGURATION FILE FOR SETUPCON# Consult the console-setup(5) manual page.ACTIVE_CONSOLES="/dev/tty[1-6]"CHARMAP="UTF-8"CODESET="guess"FONTFACE="Terminus"FONTSIZE="8x16"VIDEOMODE=" >/etc/default/console-setup

Это так же можно сделать в интерактивном режиме выполнив:
dpkg-reconfigure console-common
dpkg-reconfigure console-data
dpkg-reconfigure keyboard-configuration

Ставим GRUB на EFI-раздел:

grub-install --target=x86_64-efi --recheck --efi-directory=/boot/efi /dev/sda

Если нужно, то правим настройки GRUB в файле /etc/default/grub и обновляем конфигурацию GRUB вызовом:

update-grub2

Обновляем образ ядра, чтобы подхватились настройки консоли:

update-initramfs -u

Задаём пароль root и разрешаем авторизацию root в SSH по паролю. Это нужно для того, чтобы можно было подключиться первый раз и залить SSH-ключи. Затем авторизацию root по паролю нужно не забыт запретить.
Для этого в файле настроек SSH-сервера /etc/ssh/sshd_config нужно добавить строку:
PermitRootLogin yes

# Задаём пароль rootpasswdecho "PermitRootLogin" >>/etc/ssh/sshd_config
echo "test1">/etc/hostname

Задаём настройки сетевых подключений. У нас netplan и networkd. Не забываем ставить актуальные значения MAC-адресов адаптеров. На первом адаптере ставим статический адрес, а на второй работает DHCP (это NET-подключение к интернет). Обратите внимание, что IPv6 отключается указанием "link-local: [ ]" в настройках подключения.

echo "network:  version: 2  renderer: networkd  ethernets:    eth0:      match:        macaddress: 08:00:27:2e:69:24      addresses:        - 192.168.56.10/24      gateway4: 192.168.56.1" >/etc/netplan/eth0.yamlecho "network:  version: 2  renderer: networkd  ethernets:    eth1:      match:        macaddress: 08:00:27:e4:46:31      # Let's disable IPV6 for this interface.      link-local: [ ]       dhcp4: yes" >/etc/netplan/eth1.yaml

Создаём пользователя и добавляем его в административные группы:

adduser userusermod -G 'adm,dialout,sudo,cdrom,dip,plugdev,users' user

Чистим кэш apt:

apt-get clean

Всё! Можно перегружаться и при загрузке с жёсткого диска загрузится уже наша свежеустановленная система.

Если это виртуальная машина VirtualBox, то после перезагрузки нужно ещё поставить дополнения, подключаем "Guest Additions CD Image" и выполняем из-под нашей новой системы:

sudo mkdir /cdromsudo mount -o loop,ro /dev/cdrom /cdromsudo /cdrom/VBoxLinuxAdditions.runsudo umount /cdrom

На этом всё. Дальше нужно подключиться по SSH и залить SSH ключи пользователей. После чего удалить настройку "PermitRootLogin yes" из /etc/ssh/sshd_config.

Если кому-то интересно, то вот такой образ Ubuntu 20.04 занимает 2.2 ГБ дискового пространства.

Подробнее..

Включение гибридной графики в Ubuntu на ноутбуках Nvidia Intel (OpenGL, Vulkan)

07.05.2021 00:04:44 | Автор: admin

Введение

Это простая инструкция как включить гибридную графику intel-nvidia на ноутбуке. Чтобы определенные приложения запускались на дискретном чипе, а другие на встроенном. На свое удивление в интернете не нашел простую инструкцию того, как запускать определенные приложения, используя дискретную графику. Так что напишу так просто, на сколько считаю нужным

У меня система KDE Neon 5.21 - по большому счету - Ubuntu LTS с окружением рабочего стола KDE Plasma 5.21, видеочип GeForce MX150

1. Устанавливаем драйвер

a) Если у вас система на Qt (Как правило окружение KDE или LXQt), то с помощью данной команды через терминал загрузим программу для установки драйверов:

sudo apt install software-properties-qt

Если у вас система на GTK то с помощью это команды:

sudo apt install software-properties-gtk

Хотя разницы принципиальной нет

b) Затем запускаем ее с правами root

sudo software-properties-qt
Можно так же добавить ярлык для запуска в меню приложений

Инструкция для KDE

В папке ~/.local/share/applications/ создадим файл software properties qt.desktop с таким содержанием

[Desktop Entry]Categories=System;Settings;Comment[ru_RU]=driversComment=driversExec=konsole -e "~/.local/share/applications/software-properties-qt.sh"GenericName[ru_RU]=Установка драйверов\sGenericName=Установка драйверов\sIcon=systemsettingsMimeType=Name[ru_RU]=software properties qt\nName=software properties qt\nPath=StartupNotify=trueTerminal=falseTerminalOptions=Type=ApplicationX-DBUS-ServiceName=X-DBUS-StartupType=X-KDE-SubstituteUID=falseX-KDE-Username=

И файл software properties qt.sh в той же папке:

#! /bin/bashecho software-properties-qtsudo /usr/bin/software-properties-qt

После перезагрузки ярлык появится в меню

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

c) Переходим на последнюю вкладку Additional drivers и устанавливаем нужный драйвер. Я выбрал самой последней версии, который не tested и не server

d) После установки перезагружаем устройство

2. Настраиваем видеокарту

a) Загружаем следующую программу:

sudo apt install nvidia-settings

И запускаем

b) Переходим в PRIME Profiles Здесь мы видим три пункта:

  1. NVIDIA (Performance Mode) - работать только на дискретной графике. Сильно потребляет батарею в несложных задачах, а так же ноутбук начинает греться. Зато система работает намного быстрее, но это того не стоит. У меня после установки драйвера этот пункт включился автоматически

  2. NVIDIA On-Demand - некоторые приложения будут использовать дискретную графику nvidia, но по-умолчанию встроенная intel. Как запустить конкретное приложение с дискретной графикой напишу дальше

  3. NVIDIA (Power Saving Mode) - отключение дискретной графики

Выбираем второй вариант - NVIDIA On-Demand, и перезагружаем систему

3. Запуск приложения с использованием дискретной графикой

Это то, что сложнее всего гуглилось...

Для запуска приложения с использованием графики nvidia нужно задать для OpenGL две переменные среды:

__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia

для Vulkan только:

__NV_PRIME_RENDER_OFFLOAD=1

Делать это надо перед командой для запуска приложения. Например, нам нужно запустить из терминала приложение program с использованием дискретной графики. Нужно вызвать его так:

__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia program

Соответственно, если у приложения есть ярлык (.desktop) в меню приложений, то надо изменить команду запуска в ярлыке. В KDE Plasma нужно нажать на него ПКМ, открыть свойства (или "изменить приложение..."), перейти во вкладку "приложение" и перед командой приписать данную приставку. В других средах похожего стола примерно так же

Пример: ярлык игры Wolfenstein - Blade of AgonyПример: ярлык игры Wolfenstein - Blade of Agony

Можно сделать это же действие через текстовый редактор. Открываем ярлык, находим Exec=, и приписываем перед коммандой данную приставку __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia

Например, Minecraft
__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia minecraft-launcher __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia minecraft-launcher

Заключение

Данный метод, как я понял, точно работают для програм, использующих библиотеки OpenGL и Vulkan. У меня, к сожалению, не получилось запустить так Windows приложение через Wine, которое использует DirectX, но это уже совсем другая история.

Подробнее..

Быстрый запуск Nextcloud и Onlyoffice на Ubuntu SSL от Letsencrypt

20.06.2021 18:15:44 | Автор: admin

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

Однажды мне понадобилось 1Tb облачного хранилища и выбор пал на Nextcloud, который и было решено развернуть на собственном домашнем сервере

В данной статье я опишу как быстро и безболезненно установить и настроить облако Nextcloud и облачный редактор Onlyoffice

Статья предполагает, что у вас уже установлен и настроен Ubuntu.

Все действия были проверены на Ubuntu Server 20.04

Что будем делать:
1. Установим Nginx, PHP и MariaDB
2. Добавим бесплатный SSL-сертификат Let's Encrypt
3. Развернем NextCloud
4. Произведем тонкие настройки сервера
5. Установим Onlyoffice

Бесплатные доменные имена в домене .tk можно получить на www.freenom.com

Первым делом, устанавливаем вспомогательные утилиты

sudo apt-get install nano mc zip -y

Этот пункт можно пропустить, если настраиваете облако на локальный диск, а не на отдельную машину с доступом по nfs, мне понадобилось сделать это именно на nfs

# Ставим nfs-clientsudo apt install nfs-common -y# -------------------# Монтируем папку nfs# Ставим nginxsudo mkdir -p /nfs/ncsudo mount your_host_ip:/папка_шары_nfs/ /nfs/ncsudo ls -l /nfs/nc/sudo df -hsudo du -sh /nfs/nc/# -------------------# Монтируем nfs при загрузкеsudo nano /etc/fstab# Добавим такую строку в конец файлаyour_host_ip:/папка_шары_nfs/  /nfs/nc  nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0

Ставим nginx

sudo apt install nginx -ysudo nginx -Vsudo systemctl enable nginxsudo systemctl start nginx

Ставим php 7.4

sudo apt install php7.4-fpm php7.4-mysql php7.4 php7.4-curl php7.4-gd php7.4-json php7.4-mbstring php7.4-common php7.4-xml php7.4-zip php7.4-opcache php-apcu php-imagick -y

Настраиваем php 7.4

sudo nano /etc/php/7.4/fpm/pool.d/www.conf

снимаем комментарии со строк

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

# Настраиваем php.ini:

sudo nano /etc/php/7.4/fpm/php.ini

opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1

Разрешаем автозапуск php-fpm и перезапускаем его:

sudo systemctl enable php7.4-fpmsudo systemctl restart php7.4-fpm

Устанавливаем MariaDB:

sudo apt install mariadb-serversudo systemctl enable mariadbsudo systemctl start mariadb

Запуск сценария безопасности (здесь можно поменять пароль рута, убрать ненужные разрешения):

sudo mysql_secure_installation

Создаем базу данных для Nextcloud (в примере указан пароль nextcloud, его лучше заменить на свой) :

sudo mysql -u root -p

Вводим пароль рута для MariaDB

 >CREATE DATABASE nextcloud;CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'nextcloud';GRANT ALL ON nextcloud.* TO 'nextcloud'@'localhost' IDENTIFIED BY 'nextcloud' WITH GRANT OPTION;FLUSH PRIVILEGES;EXIT;

Теперь надо создать файл конфигурации Nginx для Nextcloud

sudo nano /etc/nginx/sites-enable/nextcloud.conf

И вставляем в него следующий текст, естественно, заменив nc.myhost.com на свои сервера

server {    listen 80;    server_name nc.myhost.com;    return 301 https://$server_name$request_uri;}server {    listen 443 ssl;    server_name nc.myhost.com;    ssl_certificate /etc/nginx/ssl/cert.pem;    ssl_certificate_key /etc/nginx/ssl/cert.key;    root /var/www/nextcloud;    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;    client_max_body_size 10G;    fastcgi_buffers 64 4K;    rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;    rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;    rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;    index index.php;    error_page 403 = /core/templates/403.php;    error_page 404 = /core/templates/404.php;    location = /robots.txt {      allow all;      log_not_found off;      access_log off;    }    location ~ ^/(data|config|\.ht|db_structure\.xml|README) {        deny all;    }    location / {        rewrite ^/.well-known/host-meta /public.php?service=host-meta last;        rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;        rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;        rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;        rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;        try_files $uri $uri/ index.php;    }    location ~ ^(.+?\.php)(/.*)?$ {        try_files $1 = 404;        include fastcgi_params;        fastcgi_param SCRIPT_FILENAME $document_root$1;        fastcgi_param PATH_INFO $2;        fastcgi_param HTTPS on;        fastcgi_pass unix:/run/php/php7.4-fpm.sock;    }    location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {        expires modified +30d;        access_log off;    }}

Теперь необходимо получить сертификаты для ssl

Устанавливаем Certbot и его плагин для Nginx:

sudo apt install certbot python3-certbot-nginx

Получаем сертификаты для всего (я получал для всех поддоменов, которые прописал на freenom, в т.ч. для почты, заббикса, и т.п., у вас могут быть и должны быть свои)

Сначала с ключом --dry-run проверяем все ли в порядке

sudo certbot certonly --agree-tos --email you@mail -d nc.myhost.com-d www.myhost.com -d zabbix.myhost.com --nginx --dry-run --d

Если все хорошо, то получаем сертификаты

sudo certbot certonly --agree-tos --email почта@администратора -d myhost.com-d nc.myhost.com-d cloud.myhost.com-d zabbix.myhost.com-d www.myhost.com-d mail.myhost.com sudo certbot certonly --agree-tos --email your@mail -d nc.myhost.com-d www.33rus.com -d zabbix.33rus.com --nginx n 

Сертификаты появятся в папке /etc/letsencrypt/live/myhost.com cert.pem chain.pem fullchain.pem privkey.pem

Подключаем сертификаты к сайту

sudo nano /etc/nginx/sites-available/nextcloud.conf

ssl_certificate /etc/letsencrypt/live/myhost.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/myhost.com/privkey.pem;

Устанавливаем Nextcloud:

Скачиваем последнюю версию с сайте Nextcloud:

cd /tmp/sudo wget https://download.nextcloud.com/server/releases/nextcloud-21.0.0.zipsudo unzip nextcloud-21.0.0.zipsudo cp -R nextcloud /var/www/nextcloud/cd /var/www/sudo chown -R www-data:www-data nextcloud/sudo chown -R www-data:www-data /nfs/nc

Обратите внимание, в данном случае я использую папку на nfs, вам необходимо использовать папку в соответствии с вашими настройками

Почти все. Заходим на https://nc.myhost.com
Создаем пользователя, пароль, прописываем доступ к каталогу /nfs/nc/
Прописываем созданную ранее базу данных и пароль к ней.

Теперь тонкая настройка Nextcloud и установка Onlyoffice

Ставим Redis и APCu

sudo apt install memcached php-memcached -ysudo apt install php-apcu redis-server php-redis -ysudo nano /var/www/nextcloud/config/config.php

И добавляем следующие строки перед закрывающей скобкой )

'memcache.local' => '\OC\Memcache\APCu',
'memcache.distributed' => '\OC\Memcache\Redis',
'redis' =>
array (
'host' => '127.0.0.1',
'port' => 6379,
),
'memcache.locking' => '\OC\Memcache\Redis',

Переиндексация файлов (если вдруг вы скопировали файлы в папку nexcloud не через интерфейсы nextcloud, то их надо переиндексировать)

sudo -u www-data php /var/www/nextcloud/occ files:scan --all

Устанавливаем OnlyOffice DocumentServer

Первым делом устанавливаем версию PostgreSQL, включенную в вашу версию Ubuntu:

sudo apt install postgresql -y

После установки PostgreSQL создайте базу данных и пользователя PostgreSQL:

Пользователем и паролем для созданной базы данных должны быть onlyoffice.

sudo -i -u postgres psql -c "CREATE DATABASE onlyoffice;"sudo -i -u postgres psql -c "CREATE USER onlyoffice WITH password 'onlyoffice';"sudo -i -u postgres psql -c "GRANT ALL privileges ON DATABASE onlyoffice TO onlyoffice;"

Установка rabbitmq и nginx-extras:

sudo apt install rabbitmq-server -ysudo apt install nginx-extras -y

Установка ONLYOFFICE Docs

Добавьте GPG-ключ:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5

Добавьте репозиторий ONLYOFFICE Docs:

sudo echo "deb https://download.onlyoffice.com/repo/debian squeeze main" | sudo tee /etc/apt/sources.list.d/onlyoffice.list sudo apt update

Устанавливаем mariadb-client!

sudo apt install mariadb-client -y

Устанавливаем ONLYOFFICE Docs. Не ошибитесь с вводом пароля. Это должен быть onlyoffice

sudo apt install onlyoffice-documentserver -y

Переводим onlyoffice на https

sudo cp -f /etc/onlyoffice/documentserver/nginx/ds-ssl.conf.tmpl /etc/onlyoffice/documentserver/nginx/ds.confsudo nano /etc/onlyoffice/documentserver/nginx/ds.conf 

Меняем порт ssl не забыв пробросить его в роутере

listen 0.0.0.0:7443 ssl;
listen [::]:7443 ssl default_server;

Перезапускаем nginx

sudo service nginx restart

Настраиваем cron

sudo crontab -u www-data -e

# Добавляем строчку

*/5 * * * * php -f /var/www/nextcloud/cron.php

Ну, вот и все, останется через веб-интерфейс установить плагин ONLYOFFICE в вашем Nextcloud и прописать сервер https://myhost.com:7443

Подробнее..

Пссст, username, Ubuntu 21.04 уже здесь

23.04.2021 00:07:18 | Автор: admin

Сегодня одни хорошие новости на Хабре. Так, марсолет совершил свой второй полет, а мы почти сразу получили шикарное видео этого события. Ну и к вечеру еще новость Canonical вот только что зарелизила Ubuntu 21.04 Hirsute Hippo с нативной интеграцией Microsoft Active Directory, дефолтным Wayland и SDK для Flutter. Кроме того, Canonical и Microsoft объявили об оптимизации производительности Microsoft SQL Server и совместной поддержке продукта.

Интеграция Native Active Directory и сертифицированный Microsoft SQL Server на Ubuntu приоритетные нововведения для корпоративных пользователей. Ну а для разработчиков Ubuntu 21.04 предоставляет Wayland и Flutter, заявил Марк Шаттлворт, СЕО Canonical. Давайте посмотрим, что там еще за сюрпризы нас ожидают.

А их, сюрпризов, немало:

  • В новом дистрибутиве в качестве рабочего стола используется GNOME Shell 3.38, собранного с использованием GTK3. Собственно, так все и было, но теперь приложения GNOME синхронизированы с GNOME 40, поскольку разработчики решили, что переходить на GTK 4 пока еще рано.
  • Как и говорилось выше, по умолчанию используется сеанс на базе протокола Wayland. В случае использования проприетарных драйверов Nvidia пользователю предлагается сеанс на основе X-сервера. А вот для прочих конфигураций этот сеанс переведен в разряд опций. За последние несколько месяцев устранен ряд ограничений сеанса GNOME на базе Wayland. После этого появилась возможность предоставления совместного доступа к рабочему столу посредством мультимедийного сервера Pipewire.
  • Впервые на Wayland Ubuntu попытались перевести в 2017 году, но из-за ряда проблем пришлось вернуть графический стек на основе X.Org Server. К слову, Wayland поддерживается теперь и сборками для малинки, Так, добавлена поддержка GPIO (через libgpiod и liblgpio). Для плат Compute Module 4 реализована поддержка Wi-Fi и Bluetooth.
  • Появились нескучные обои тема оформления Yaru и пиктограммы для типов файлов.


  • Кроме всего прочего, разработчики добавили поддержку мультимедийного сервера Pipewire. Это дает возможность организовать запись содержимого экрана, улучшает поддержку звука в изолированных приложениях, а также открывает возможность профессиональной обработки звука и избавляет от фрагментации.
  • Ядро Linux обновлено до версии 5.11. В нем, кроме поддержки анклавов в Intel SGX, появился новый механизм перехвата системных вызовов, виртуальная шина auxiliary, запрет сборки модулей без MODULE_LICENSE(), режим быстрой фильтрации системных вызовов в seccomp, прекращение сопровождения архитектуры ia64, перенос технологии WiMAX в ветку staging, возможность инкапсуляции SCTP в UDP.
  • Пакетный фильтр nftables задействуется по умолчанию. Но для обеспечения обратной совместимости предусмотрен пакет iptables-nft, который предоставляет утилиты с тем же синтаксисом, что и у iptables, но с трансляцией полученных правил в nf_tables.
  • Появилась поддержка аутентификации с использованием смарт-карт.
  • Добавлена возможность изменения профиля энергопотребления, а на рабочем столе теперь можно перемещать ресурсы из приложений при помощи метода Drag&Drop.
  • Инсталлятор поддерживает создание резервных ключей для восстановления доступа к зашифрованным разделам. Их можно использовать для расшифровки, если пароль утерян.
  • Теперь подробнее про интеграцию с Active Directory. Кроме улучшения интеграции, разработчики добавили возможность аутентификации пользователей в Active Directory с поддержкой GPO (Group Policy Objects) сразу после установки Ubuntu. Таким образом системные администраторы получили возможность размещать настройки непосредственно в контроллере домена Active Directory для рабочих станций Ubuntu (включая настройки рабочего стола и набор пользовательских приложений). Для определения политик обеспечения безопасности клиентов можно использовать GPO, включая задание параметров доступа пользователей и правил оформления паролей.
  • Внесены изменения в модель доступа к домашним каталогам пользователей в системе. Последние создаются с правами 750 (drwxr-x---), предоставляющими доступ к каталогу только владельцу и членам группы. Раньше у пользователей была возможность просматривать содержимое каталогов других пользователей.
  • Поддержка режима UEFI SecureBoot улучшена для систем x86_64 (amd64) и AArch64 (arm64). В прослойке для организации верифицированной загрузки применяется механизм SBAT (UEFI Secure Boot Advanced Targeting). Он решает проблемы с отзывом сертификатов. Поддерживают этот механизм теперь пакеты grub2, shim и fwupd.

  • Обновлен ряд системных компонентов и языков программирования, включая:

GCC 10.3.0,
binutils 2.36.1,
glibc 2.33,
Python 3.9.4,
Perl 5.32.1,.
LLVM 12,
Go 1.16,
Rust 1.50,
OpenJDK 16,
Ruby 2.7.2,
Rails 6.

  • Также обновлены версии приложений и подсистем, таких как:

Mesa 21.0,
PulseAudio 14,
BlueZ 5.56,
NetworkManager 1.30,
Firefox 87,
LibreOffice 7.1.2,
Thunderbird 78.8.1,
Darktable 3.4.1,
Inkscape 1.0.2,
Scribus 1.5.6.1,
OBS 26.1.2,
KDEnlive 20.12.3,
Blender 2.83.5,
Krita 4.4.3,
GIMP 2.10.22.

  • Дополнительно обновлены компоненты для серверных систем:

PostgreSQL 13.2,
Samba 4.13.3,
QEMU 5.2,
SSSD 2.40,
Net-SNMP 5.9,
DPDK 20.11.1,
Strongswan 5.9.1,
Open vSwitch 2.15,
Chrony 4.0,
OpenVPN 2.5.1,
Virt-manager 3.2.0,
Libvirt 7.0,
Rsyslog 8.2102.0,
Docker 20.10.2,
OpenStack Wallaby.

  • Появились сборки для плат HiFive SiFive Unleashed и HiFive SiFive Unmatched на базе архитектуры RISC-V. О RISC-V платах мы писали здесь.
  • Для iSCSI теперь применяется инструментарий targetcli-fb. Ранее использовался tgt.
  • В состав Ubuntu Server включен пакет needrestart. Он запускается в конце каждой транзакции APT, выявляет изменения, требующие перезагрузки, и информирует об этом администратора.
  • Ликвидирована поддержка lua-модуля для nginx, который не совместим с новыми версиями nginx. Разумеется, nginx поддерживается, но вместо отдельного модуля теперь есть специальная редакция Nginx с интегрированной поддержкой LuaJIT.
  • В Kubuntu, Xubuntu, Ubuntu MATE, Ubuntu Studio, Lubuntu внесены изменения в рабочие столы и ПО.


  • Плюс сообщество предложило два неофициальных варианта Ubuntu 21.04: Ubuntu Cinnamon Remix 21.04 с рабочим столом Cinnamon и Ubuntu Unity Remix 21.04 с рабочим столом Unity.

Загрузить Ubuntu 21.04 можно по этой ссылке.

Подробнее..

На каких серверах держится Архив Интернета?

31.03.2021 12:04:48 | Автор: admin

Фото 1. Один из дата-центров Internet Archive в Сан-Франциско

Internet Archive некоммерческая организация, которая с 1996 года сохраняет копии веб-страниц, графические материалы, видео- и аудиозаписи и программное обеспечение. Каждый может зайти в Wayback Machine и посмотреть, как выглядел Хабр в 2006 году или Яндекс в 1998 году, хотя загрузка архивных копий занимает около минуты (это не для реализма 90-х, а по техническим причинам, см. ниже).

Архив быстро растёт. Сейчас объём всех накопителей достиг 200 петабайт. Но Internet Archive принципиально не обращается к стороннему хостингу или облачному сервису вроде AWS. У некоммерческой организации собственные дата-центры, свои серверы и свои инженеры. Это гораздо дешевле, чем услуги AWS.

Архив Интернета против облаков


Технические подробности серверного устройства Internet Archive раскрыл Джона Эдвардс (Jonah Edwards), руководитель инженерной группы Core Infrastructure Team.

По его мнению, понятие облако многих людей вводит в заблуждение как нечто абстрактное. На самом деле это просто чужие компьютеры, то есть серверы посторонней компании. Для Internet Archive это неприемлемо. У организации собственные серверные в собственных зданиях, компьютеры принадлежат им, и персонал тоже свой.


Четыре дата-центра Internet Archive располагаются в Сан-Франциско, Ричмонде и Редвуд-Сити (это пригороды Сан-Франциско)

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

Деньги на обслуживание инфраструктуры и зарплаты сотрудникам собираются преимущественно за счёт пожертвований и грантов, годовой бюджет составляет около $10 млн.

Инфраструктура


Что представляет собой инфраструктура, которой управляет Core Infrastructure Team? На февраль 2021 года цифры такие:

  • 750 серверов, возраст до 9 лет;
  • 1300 виртуальных машин;
  • 30 000 устройств хранения данных;
  • более 20 000 жёстких дисков в парах друг с другом (paired storage), обычно пара разнесена по дата-центрам или странам для надёжности;
  • общий объём накопителей почти 200 петабайт.

Разумеется, техника постепенно обновляется. На смену старым накопителям приходят новые. Например, маленькие диски на 2 и 3 терабайта полностью вышли из обращения в 2017 и 2018 годах, соответственно, а с прошлого года постоянно растёт доля дисков на 16 ТБ.

Как показано на графике ниже, несмотря на увеличение ёмкости накопителей, общее число HDD тоже постепенно растёт: за три года оно выросло с 15 тыс. до 20 тыс.


Количество жёстких дисков разного объёма на серверах Internet Archive

Диски реплицируются по дата-центрам, для производительности контент по запросу выдаётся одновременно со всех копий. Все элементы Архива представляют собой директории на дисках. Веб-страницы Wayback Machine хранятся в файлах WARC (Web ARChive, сжатые файлы Web Archive). При запросе отдельной страницы её нужно извлечь из середины архива WARC, а если страница требует загрузки дополнительных ресурсов, то процесс повторяется. Это одна из причин, почему полная загрузка страниц из Wayback Machine достигает 90 секунд, хотя закэшированные копии и популярный контент загружаются быстрее.



Для надёжности копии Архива хранятся не только в Сан-Франциско, но и ещё в нескольких локациях по всему миру, в том числе в Амстердаме (Нидерланды) и Новой Александрийской библиотеке (Египет).

В 1996 году первые серверы Internet Archive подняли на недорогих компьютерах из стандартных комплектующих: по сути, на обычных десктопах под Linux. Хотя инфраструктура сильно выросла, в качестве операционной системы всегда использовали только Linux. С 2004 года все серверы перешли на Ubuntu, сейчас продолжается миграция на Ubuntu 20.4 LTS (Focal Fossa).

Объём Архива


В последнее время объём Архива возрастает примерно на 25% в год, сейчас это соответствует 56 петабайтам в квартал. С учётом резервных копий нужно добавлять накопителей на 1012 петабайт в квартал.

Одна копия Архива занимает более 45 петабайт, но на дисках и лентах хранится минимум две копии каждого объекта.

Как видно на графике вверху, обновление дискового массива происходит только за счёт моделей максимальной ёмкости. Например, в конце 2021 года планируется переход на диски по 20 ТБ, и тогда в серверы будут устанавливать только их. Остальные HDD постепенно доживают свой век, и их количество медленно снижается.

Internet Archive возлагает большие надежды на новые технологии записи данных, такие как HAMR (heat-assisted magnetic recording), чтобы ёмкость HDD увеличивалась ещё быстрее. Технология HAMR предусматривает предварительное нагревание магнитной поверхности лазером в процессе записи, что позволяет значительно уменьшить размеры магнитной области, хранящей один бит информации и увеличить плотность записи. Нагрев выполняется с помощью лазера, который за 1 пс разогревает область записи до 100 C.

Разработка этой технологии затянулась на 15 лет, но в январе 2021 года были официально представлены первые диски HAMR на 20 ТБ. Пока что они официально поставляются только избранным клиентам в рамках фирменного сервиса Seagate Lyve, но вскоре должны появиться в свободной продаже.

Seagate обещает, что HAMR позволит наращивать ёмкость HDD на 20% в год. Поэтому в ближайшее время можно ожидать модель на 24 ТБ, а в будущем диски на 30 и 50 ТБ. Internet Archive тоже надеется на это и внимательно следит за последними разработками.

На текущем размере дисков понадобится 15 вот таких серверных стоек, чтобы разместить одну копию Архива:


У Internet Archive 750 серверов и 20 000 жёстких дисков

Сейчас в дата-центрах установлено 75 серверных стоек, что обеспечивает некоторый запас и избыточное копирование.

По состоянию на февраль 2021 года на серверах хранились копии 534 млрд веб-страниц, 16 млн аудиозаписей, 8,7 млн видеозаписей фильмов, клипов и телепередач, 3,8 млн изображений, 629 тыс. компьютерных программ, более 29 млн книг и текстов, в том числе 72 771 текст на русском языке.



Любой пользователь может создать аккаунт и добавить в архив медиафайлы.

Internet Archive поддерживает API для внешних сервисов. Например, сторонний сервис может забирать контент из хранилища и показывать его на своём сайте или в приложении. Можно строить собственные каталоги на базе этого хранилища, эксплуатируя IA просто как удалённый бесплатный хостинг файлов с хотлинками. Подобную модель использует книжный каталог Open Library на базе Internet Archive. Хотлинки и модель подобной эксплуатации собственных ресурсов поощряется со стороны Архива. Кстати, аналогичные правила действуют в Wikimedia Commons: холинкинг разрешён и даже поощряется, что недавно вызвало казус с фотографией цветка: по непонятной причине ежедневно в сеть Wikimedia Commons поступало около 90 млн одинаковых запросов на получение одного файла AsterNovi-belgii-flower-1mb.jpg. Будем надеяться, что у Internet Archive таких инцидентов не случится.

Сеть


В 2020 году Internet Archive пережил серьёзный рост количества запросов и объёма внешнего трафика с 40 до 60 Гбит/с. Из-за пандемии коронавируса и самоизоляции ресурсы Архива стали более востребованы. Количество запросов росло так быстро, что в определённый момент маршрутизаторы Internet Archive перестали справляться с нагрузкой, пришлось делать апгрейд сетевой инфраструктуры быстрее, чем планировалось. Сейчас веб-сайт входит в топ-300 крупнейших сайтов интернета.

Работа на собственных серверах имеет и свои недостатки. Основные причины сбоев Internet Archive обрывы оптоволокна из-за строительных работ в городе, сбои энергоснабжения, случайные провалы напряжения в сети. Впрочем, прошлый год сайт завершил с аптаймом 99,9%.



Internet Archive планирует расширять внешний канал. Ожидается, что в ближайшее время внешний трафик вырастет до 80 Гбит/с.

Примерно так выглядит дизайн внутренней сети:



Дата-центры подключены к нескольким провайдерам первого уровня (Tier 1) и соединены между собой по оптоволокну с применением технологии плотного спектрального уплотнения (DWDM). Локальные университетские сети подключаются к этому кольцу напрямую через локальные точки обмена трафиком.

Вместо нынешнего оптоволокна планируется проложить пары 100-гигабитных кабелей по всему кольцу из четырёх дата-центров, так что внешний трафик тоже можно будет увеличить до 100 Гбит/с.

Прокладка новых кабелей по Сан-Франциско весьма хлопотное и дорогое дело. Приходится перекладывать асфальт на автомобильных дорогах и тротуарах. К счастью, Internet Archive удалось получить официальный статус библиотеки, что даёт доступ к государственным субсидиям, в том числе к бюджету Федеральной комиссии по связи США (FCC) на подключение всех библиотек к интернету. Таким образом, львиную долю расходов на прокладку, обслуживание оптоволокна и трафик оплачивает FCC по программе E-Rate Universal Service Program.

С 2005 года Internet Archive начал проект Open Library по сканированию книг. С одной стороны, это действительно важный общественный проект. С другой стороны, он позволил получить государственные льготы и финансирование в качестве публичной библиотеки.

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

Планы на будущее


Инженеры Internet Archive сейчас обдумывают варианты использования SSD и GPU в основных серверах, чтобы увеличить их производительность. Главная проблема здесь в том, что все дата-центры находятся в стеснённых городских условиях Сан-Франциско и пригородов с очень ограниченными возможностями охлаждения (см. фото 1). Так что каждый апгрейд требуется хорошо обдумать: не приведёт ли он к повышению температуры.

Интересно наблюдать за ростом инфраструктуры Internet Archive с увеличением количества серверных стоек. Есть подозрение, что рано или поздно наступит момент, когда сложность поддержания своей инфраструктуры превысит некий порог и библиотека откажется от собственных дата-центров. Но пока что инженеры Core Infrastructure Team успешно справляются с работой.

В зависимости от методологии расчёта, хранение данных в собственных дата-центрах Internet Archive обходятся в 25 раз дешевле, чем в облаке. И это только хранение. Сложно даже посчитать, сколько будет стоить круглосуточный исходящий трафик 60 Гбит/с на AWS. Вероятно, он обойдётся даже дороже, чем хранение 200 петабайт.

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



На правах рекламы


Эпичные серверы это надёжные VDS на Linux или Windows с мощными процессорами семейства AMD EPYC и очень быстрой файловой системой, используем исключительно NVMe диски от Intel. Попробуйте как можно быстрее!

Подробнее..

Как установить Ubuntu на Apple M1 и ничего не сломать

10.03.2021 16:14:14 | Автор: admin

Команда разработчиков Corellium выпустила порт Ubuntu на Mac Mini с процессором Apple M1. Публикации по теме рассказывают только про успех умельцев, но не раскрывают подробности. Я решил на собственном опыте проверить, как установить и использовать. Ubuntu на Mac Mini, и описал все существующие подводные камни.

Авторы порта Ubuntu под Mac, компания Corellium, занимается виртуализацией на ARM64. У них есть опыт и желание, чтобы делать такие смелые вещи.
Corellium ранее работала над проектом Project Sandcastle, который позволяет установить ОС Android на iPhone 7 благодаря уязвимости checkm8. Установкой Android на iPhone не занимались со времени iDroid Project и iPhone 3G. Как и iDroid Project, Project Sandcastle не предоставляет ОС для повседневного использования, это скорее масштабный Proof-of-Concept с открытым исходным кодом.
Подобные проекты очень трудоемки с точки зрения разработки, сложны для эксплуатации обычными пользователями и вряд ли будут использоваться широкой аудиторией. Тем не менее, стоит воспользоваться возможностью посмотреть все своими глазами.

В чем сложность


Наиболее подробно в соответствующей статье в блоге Corellium.

Ни для кого не секрет, что Apple отступается от принятых стандартов и часто использует собственные решения. Для начала отметим, что macOS загружается несколько иначе, чем операционные системы семейств Windows и *nix. В качестве загрузчика в яблочных устройствах используется iBoot. Он загружает ядро в формате Mach-O, которое может быть сжато, подписано и лежать в контейнере IMG4.

Более сложные вещи начинаются, когда появляется необходимость запустить остальные ядра процессора. В обычных ARM64-процессорах это производится через интерфейс Power State Coordination Interface (PSCI). Но в M1 другие ядра запускаются со смещения, которое указано в соответствующем Memory-mapped I/O (MMIO) регистре.

Но даже это еще не все. Apple создали свой собственный контроллер прерываний, который не соответствует ни одному стандарту ARM Generic Interrupt Controller (GIC). Также прерывания, генерируемые таймером, используют специальный тип запросов FIQ (Fast Interrupt Request) вместо IRQ, что пока не поддерживается ядром Linux.

Для взаимодействия процессорных ядер между собой используются специальные прерывания Inter-Processor Interrupt (IPI), которые в M1 формируются также с помощью FIQ. Таким образом, поддержка FIQ один из наиболее важных моментов в этом порте.

Ядро Linux на M1 (источник twitter.com)

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

Впрочем, запуск ядра это только начало. Для успешной эксплуатации необходимо подключить устройства ввода, такие как клавиатура и мышь. Есть три способа: использовать USB-хост в чипе M1 (для ThunderBolt/USB Type-C), использовать xHСI-хост (для USB Type-A) или воспользоваться Bluetooth.

Bluetooth работает на нестандартном PCIe-подобном протоколе, поэтому разработка собственного модуля ядра для неизвестного протокола могла затянуться. В Corellium приняли решение настроить USB, и через пару дней работы им удалось подключить устройства ввода.

На момент написания статьи уже доступен Proof-of-Concept, который можно попробовать самостоятельно. Учтите, что все дальнейшие действия вы можете делать исключительно на свой страх и риск.

Установка Ubuntu


Для начала использования Ubuntu нам потребуется следующее:

  • Mac с процессором Apple M1 (поддерживаются Mac Mini, Macbook Pro и Macbook Air);
  • флешка с разъемом USB Type-C объемом от 16 ГБ;
  • USB-клавиатура и USB-мышь.

В качестве флешки я использовал Kingston DataTraveler microDuo 3C объемом 32 ГБ, поддерживающую USB Type-A и USB Type-C. Инструкция Corellium настаивает на использовании Type-C флешки, так как загрузка с Type-A не поддерживается на момент написания данной статьи. Мышь и клавиатуру я подключал по USB Type-A.

Есть и менее очевидные требования. Во-первых, на Mac Mini должна быть установлена macOS 11.2 или выше. В старых версиях ОС в утилите kmutil отсутствует команда configure-boot, необходимая для корректной подмены ядра.

Также необходимо отвязать Mac от Find My Mac. Наличие привязки не позволяет отключить системы безопасности в полной мере и выполнить все необходимые команды.

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

tar -xjvf ubuntu-20.10-preinstalled-desktop-arm64+raspi.img.bz2

Далее разворачиваем образ на флешку:

sudo dd if=ubuntu-20.10-preinstalled-desktop-arm64+raspi.img of=/dev/rYOURUSBDISK bs=1m

Обратите внимание, что необходимо указать именно флешку, а не раздел на ней. Например, /dev/rdisk6. Далее копируем драйвера на Wi-Fi:

cp -RLav /usr/share/firmware/wifi /Volumes/system-boot

Если вы используете проводное подключение к Интернету, то флешку можно подготовить на компьютере под управлением ОС Linux.
Далее подключаем флешку в USB Type-C порт и перезагружаемся в Recovery OS, известную как 1TR (the One True Recovery), и открываем терминал. На новых Mac это происходит следующим образом:

  1. Выключаем Mac;
  2. Удерживаем кнопку включения до появления текста Загрузка параметров запуска;
  3. Выбираем опцию Параметры и нажимаем Продолжить;
  4. В верхнем меню открываем Утилиты Терминал.

Обратите внимание, что Recovery при запуске не должен просить ввести пароль от ОС или от Apple ID. Если он все же просит, то необходимо отключить Find My Mac в настройках macOS.
Устанавливаем ядро Ubuntu:

bash -c "$(curl -fsSL https://downloads.corellium.info/linuxusbboot.sh)"

Содержимое скрипта
#!/bin/shbputil -d | grep "CustomerKC" | grep -v "absent"KC=$?if [ $KC -eq 1 ]then  bputil -n -k -c -a -s  csrutil disable  csrutil authenticated-root disableficurl https://downloads.corellium.info/linux.macho > linux.machokmutil configure-boot -c linux.macho -v /Volumes/Macintosh\ HD/echo "Kernel installed. Please reboot";


Данный скрипт проверяет политики загрузки (BootPolicy) и отключает системы проверки целостности macOS, если это необходимо. После этого скрипт загружает ядро Linux в формате Mach-O в корень системного диска и настраивает iBoot на ядро Linux.

В процессе выполнения скрипта будет запрос пароля для получения прав суперпользователя macOS. Выполняемые команды также предупредят вас о том, что выполняемые действия значительно снижают безопасность Mac. Но если вы хотите запустить Ubuntu, то придется принять это как должное.

После завершения скрипта можно перезагрузить Mac, далее начнется загрузка Ubuntu 20.04.

Опыт использования


Первый запуск Ubuntu будет не очень быстрым. В логах загрузки упадет четыре-пять сервисов и еще шесть подвиснут. Ubuntu загружается относительно долго: несколько минут. Более того, первое время отзывчивость ОС будет очень низкой. Запуск новых приложений, даже без графической оболочки, может занимать минуты. Эта проблема самоустраняется вскоре после загрузки.


Нетрудно заметить, что образ сделан на основе Ubuntu для Raspberry Pi. Поэтому в системе пользователи root и pi имеют пароль raspberry. К сожалению, сделать красивый и показательный скриншот с выводом screenfetch не получается. ОС не определяет модель процессора, поэтому в выводе лишь безликое Unknown.

Вывод lscpu
Architecture:                    aarch64CPU op-mode(s):                  64-bitByte Order:                      Little EndianCPU(s):                          8On-line CPU(s) list:             0-7Thread(s) per core:              1Core(s) per socket:              8Socket(s):                       1Vendor ID:                       0x61Model:                           1Stepping:                        0x1CPU max MHz:                     3204.0669CPU min MHz:                     600.0030BogoMIPS:                        48.00Vulnerability Itlb multihit:     Not affectedVulnerability L1tf:              Not affectedVulnerability Mds:               Not affectedVulnerability Meltdown:          Not affectedVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctlVulnerability Spectre v1:        Mitigation; __user pointer sanitizationVulnerability Spectre v2:        Not affectedVulnerability Srbds:             Not affectedVulnerability Tsx async abort:   Not affectedFlags:                           fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 asimddp sha512 asimdfhm dit uscat ilrcpc flagm ssbs sb dcpodp flagm2 frint


То, что это образ ОС для RPi, будет заметно при попытке установить ПО из пакетного менеджера. Он попытается установить не только требуемый администратором софт, но и обновление ОС с созданием initramfs для малинки. Подобные действия приведут к появлению ошибок в логах, несмотря на успешность установки запрошенного ПО.

Как и ожидалось, в ОС присутствует минимально необходимый набор драйверов. Звуковая карта, модуль Bluetooth и графический ускоритель не поддерживаются. Большинство системных утилит, таких как lspci, lsusb и lshw, выдают очень скудную информацию о железе.

Несмотря на множество ограничений, я решил провести тест sysbench.
Устройство Количество вычислений в секунду
Mac Mini (Ubuntu 20.10) 838
Lenovo ThinkPad E14 (Ubuntu 20.04) 483
Хотя данный тест нельзя считать идеальным и показательным, восьмиядерный Apple M1 в два раза превосходит восьмиядерный Intel Core i5-1045U. К сожалению, мне не удалось запустить sysbench на macOS.

Заключение


Установка альтернативных операционных систем на Mac это всегда увлекательный с технической точки зрения процесс. Новые процессоры Apple M1 стали отличным вызовом для энтузиастов.

А вам приходилось использовать Windows или Linux на Mac?

Хотите попробовать новый Mac Mini в работе? Дадим его на тест бесплатно!
Просто переходите по ссылке.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru