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

Linux

ЭЦП по ГОСТ на GNULinux с помощью OpenSSL

05.04.2021 00:18:36 | Автор: admin

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

Удостоверяющий Центр выдал нам ключ и сертификат в одном PKCS#12 файле auth.p12
Я исхожу из того, что у нас в наличии есть linux и docker. Можно даже не локально - вполне можно закинуть наш документ куда-нибудь на хостинг и подключиться по SSH. Подробности установки docker и работы с докер-образами оставим за пределами этой заметки. Перейдём сразу к делу:

Прямо из папки, где лежит наш документ на подпись (document.pdf) и PKCS#12 файл (auth.p12) запускаем замечательный docker образ OpenSSL с поддержкой ГОСТ и заходим в контейнер:
sudo docker run --rm -i -t -v pwd:pwd -w pwd rnix/openssl-gost bash
Вытаскиваем из PKCS#12 файла приватный ключ и сохраняем его в pem-формате. Может потребоваться ввести ваш пароль от PKCS#12 файла.
openssl pkcs12 -in auth.p12 -out key.pem -engine gost -nodes -clcerts
Аналогично вытаскиваем из PKCS#12 файла и сертификат.
openssl pkcs12 -in auth.p12 -clcerts -nokeys -out pub.crt
Подписываем документ. Подпись будет отсоединенная, в формате PKCS#7 в отдельном файле (document.pdf.sig)
openssl smime -sign -signer pub.crt -inkey key.pem -engine gost -binary -noattr -outform DER -in document.pdf -out document.pdf.sig
Проверить подпись можно много где, как локально так и на сайте госуслуг, например.
Всё. Можно отправлять контрагенту документ и соответствующий sig файл.

Если вдруг у вас сертификат в формате DER (в Windows часто это файл с расширением .cer), то можно конвертировать такой сертификат в pem-формат:
openssl x509 -inform DER -in pub.cer -out pub.crt

Файлы в примерах команд выше:
auth.p12 - бинарный PFX-файл, содержащий сертификат и закрытый ключ
pub.crt - сертификат (содержащий открытый ключ) в текстовом формате PEM
pub.cer - сертификат (содержащий открытый ключ) в бинарном формате DER
key.pem - закрытый ключ
document.pdf - pdf-документ, который необходимо подписать
document.pdf.sig - файл куда будет сохранена отсоединённая подпись к документу

Источники вдохновения:
Работаем с реестром запрещенных ресурсов
Не ждем, а готовимся к переходу на новые стандарты криптографической защиты информации
Docker-образы с поддержкой ГОСТ-сертификатов в openssl, curl, php, nginx
OpenSSL: простое шифрование с открытым ключом
https://stackoverflow.com/questions/52980370/how-to-convert-p12-to-crt-file
https://www.emaro-ssl.ru/blog/convert-ssl-certificate-formats/
https://qna.habr.com/q/213942
http://rodji.net/blog/2013/12/27/openssl-по-гост-подписывание-шифрование-пр/
https://polikarpoff.ru/all/eksport-ecp-v-formate-pkcs-12/

Подробнее..

Hardening на практике

15.04.2021 20:09:13 | Автор: admin

В преддверии старта курса "Administrator Linux. Professional" подготовили статью, автором которой является Александр Колесников. Если вам интересно узнать подробнее об обучении на курсе, приходите на демо-день курса.


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

Hardening

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

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

Но это статья не о том как пройтись по списку формально описанных действий и придумать как их реализовать. Давайте попробуем сделать немного иначе. Что если прибегнуть к помощи не администраторских инструментов, а пентестерских?

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

Для закрытия всех векторов атак разобьем их группы:

  1. Атаки, которые работают в приложениях доступных во внешний мир

  2. Атаки, которые работают внутри ОС и их цель повышение привилегий

Для первого вида атак можно использовать сканеры безопасности. Мы будем использовать набор инструментов машины Kali Linux. Это nmap, Burp Suite и т.д.

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

Уязвимые стенды

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

echo $RANDOM % 5 + 1 | bc

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

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

Эксперимент

Для первого эксперимента будем использовать вот этот box. Проведем эксперимент в 2 этапа.

Этап 1 поиск уязвимых конфигураций и сервисов работающих снаружи сервера. Первые команды для запуска:

nmap -n -A -p- --max-rate=1000 machine.ip.address

В результате вот такой список сервисов, которые видны извне сервера:

У нас есть доступ к пользователю внутри машины, поэтому еще попробуем узнать какие порты открыты:

netstat -tulpn

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

dirb http://machine.ip.address

Итог работы инструмента:

Похоже, что это wordpress. в директориях сервера лежит версия WordPress 5.6 и плагин "contact-form". Для этого набора данных очень хорошо подходит CVE-2020-35489. Тестовый скрипт можно найти тут. Попробуем протестировать сервис. Скрипт так и не захотел работать, но по сути их него функциональна только одна строка, которая отправляет запрос на адрес "/wp-content/plugins/contact-form-7/readme.txt". Если его выполнить, то можно увидеть, что используемый плагин может быть уязвим для атаки.

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

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

Первая конфигурационная уязвимость. Как видно из снимка, нас интересуют те записи, которые выделены красным цветом. На самом деле это единственная уязвимость, не считая наличие пользователя vagrant в системе.

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


Узнать подробнее о курсе "Administrator Linux. Professional"

Подробнее..

Как портировать SDK Flutter на ТВ-приставку для разработки и запуска приложений Android TV

15.04.2021 16:11:54 | Автор: admin

Недавно мы успешно портировали фреймворк Flutter на ТВ-приставку c открытой программной платформой RDK. В этой статье расскажем о трудностях, с которыми пришлось столкнуться, и предложим решения для успешного запуска и повышения производительности.

Учитывая, что программный стек RDK или Reference Design Kit сейчас активно используется для разработки OTT-приложений, голосового управления приставками и других продвинутых функций для видео по запросу (VoD), мы хотели разобраться, сможет ли Flutter работать на ТВ-приставке. Оказалось, что да, но, как это обычно бывает, есть нюансы.

Далее мы по шагам распишем процесс портирования и запуска Flutter на встраиваемых Linux-платформах и разберемся, как этот SDK с открытым исходным кодом от Google чувствует себя на железе с ограниченными ресурсами и ARM-процессорами.

Но прежде чем переходить непосредственно к Flutter и его преимуществам скажем пару слов об исходном решении, которое было задействовано на ТВ-приставке. На плате работала связка набор библиотек EFL + протокол Wayland, а рисование примитивов было реализовано из node.js на основе плагинного нативного модуля. Это решение неплохо себя показало с точки зрения производительности при отображении кадров, однако сам EFL отнюдь не самый новый фреймворк для отрисовки. А в режиме выполнения node.js со своим огромным event-loopом казался уже не самой перспективной идеей. В то же время Flutter мог позволить нам задействовать более производительную связку рендеринга.

Для тех, кто не в теме: первую версию этого SDK с открытым кодом Google представил еще шесть лет назад. Тогда этот набор средств разработки годился только для Android. Сейчас на нем можно писать приложения для веба, iOS, Linux и даже Google Fuchsia. :-) Рабочий язык для разработки приложений на Flutter Dart, в свое время он был предложен в качестве альтернативы JavaScript.

Перед нами стоял вопрос: даст ли переход на Flutter какой-то выигрыш по производительности? Ведь подход там совершенно иной, хоть в конечном счете и имеется та же графическая подсистема Wayland + OpenGL. Ну и как там с поддержкой процессоров с neon-инструкциями? Были и другие вопросы, например, нюансы по переносу UI на dart или то, что поддержка Linux находится в стадии альфы-беты.

Сборка Flutter Engine для ТВ-приставок на базе ARM

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

При сборке Flutter под наши целевые устройства (три ТВ-приставки с RDK), к нашему удивлению, проблемы возникли только на одной. Не будем с ней сражаться, т.к. из-за старой архитектуре intel x86 она для нас не является приоритетной. Лучше сосредоточимся на оставшихся двух ARM-платформах.

Вот, с какими опциями мы собирали Flutter Engine:

./flutter/tools/gn \      --embedder-for-target \      --target-os linux \      --linux-cpu arm \      --target-sysroot DEVICE_SYSROOT      --disable-desktop-embeddings \      --arm-float-abi hard      --target-toolchain /usr      --target-triple arm-linux-gnueabihf      --runtime-mode debugninja -C out/linux_debug_unopt_arm

Большинство опций понятны: собираем под 32-битный ARM-процессор и Linux, выключая при этом все лишнее через --embedder-for-target --disable-desktop-embeddings.

Для сборки в системе должен быть установлен clang версии 9 и выше, т.е. это стандартный сборочный механизм Flutter, инструментарий кросс-компиляции gcc не пойдет. Самое важное подать корректный target-sysroot устройства с RDK.

Честно говоря, мы удивились, что при сборке не возникло вообще никаких нюансов. На выходе получаем заветную библиотеку flutter_engine.so и заголовок с необходимыми функциями для эмбеддера.

Теперь можно собрать целевой проект flutter/dart с нашей библиотекой/движком. Это сделать легко:

flutter --local-engine-src-path PATH_TO_BUILDED_ENGINE_src --local-engine=host_debug_unopt build bundle

Важно! Сборка проекта должна происходить не на устройстве с собранной библиотекой, а на хостовой, т.е. x86_64!

Для этого достаточно еще раз пройти путь сборкой gn и ninja только под x86_64! Именно она указывается в параметре host_debug_unopt.

PATH_TO_BUILDED_ENGINE_src это путь, где находится engine/src/out.

За запуск Flutter Engine под системой обычно отвечает embedder, именно он конфигурирует Flutter под целевую систему и дает основные контексты рендеринга библиотеке Skia и Dart-обработчику. Не так давно в состав Flutter добавили linux-embedder, и, в частности, GTK-embedder, так что можно воспользоваться им из коробки. На нашей платформе на момент портирования это был не вариант, нужно было что-то независимое от GTK.

Рассмотрим некоторые особенности реализации, которые пришлось учесть с кастомным эмбеддером (все, кто любит разбирать не нюансы, а исходники целиком, может сразу перейти к проекту нашего форка с доработками на github.com). К тому же по производительности наш вариант немного выигрывал у версии GTK, что было крайне важно для заказчика, и не тянул за собой весь зоопарк GTK-библиотек.

Так что же вообще нужно от эмбеддера для запуска flutter-приложения? Достаточно, чтобы он просто вызывал из библотеки flutter_engine.so

FlutterEngineRun(FLUTTER_ENGINE_VERSION, &config, &args, display /* userdata */, &engine_);

где в качестве параметров идет передача настроек проекта (директория с собранным flutter bundle) FlutterProjectArgs args и аргументов рендеринга FlutterRendererConfig config.

В первой структуре как раз задается путь bundle-пакета, собранного flutter-утилитой, а во второй используются контексты OpenGL .

// пример использования на github.com/DEgITx/flutter_wayland/blob/master/src/flutter_application.cc

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

Проблемы и их решение

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

1. Краш эмбеддера и замена очередности вызова функций

Первая проблема, с которой мы столкнулись краш эмбеддера под платформой. Казалось бы, инициализация egl-контекста в других приложения происходит нормально, FlutterRendererConfig инициализирован корректно, но нет эмбеддер не заводится. Значит в связке что-то явно не так. Оказалось, eglBindAPI нельзя вызывать перед eglGetDisplay, на котором происходит особая инициализация nexus-драйвера дисплея (у нас платформа базируется на чипе BCM). В обычном Linux это не проблема, но на целевой платформе оказалась иначе.

Корректная инициализация эмбеддера выглядит так:

egl_display_ = eglGetDisplay(display_);if (egl_display_ == EGL_NO_DISPLAY) {  LogLastEGLError();  FL_ERROR("Could not access EGL display.");  return false;}if (eglInitialize(egl_display_, nullptr, nullptr) != EGL_TRUE) {  LogLastEGLError();  FL_ERROR("Could not initialize EGL display.");  return false;}if (eglBindAPI(EGL_OPENGL_ES_API) != EGL_TRUE) {  LogLastEGLError();  FL_ERROR("Could not bind the ES API.");  return false;}

// github.com/DEgITx/flutter_wayland/blob/master/src/wayland_display.cc корректная реализация, т.е. помогла измененная очередность вызова функций.

Теперь, когда нюанс запуска улажен, мы рады увидеть заветное демо-окно приложения на экране :-).

2. Оптимизация производительности

Настало время проверить производительность. И, честно говоря, она нас не сильно порадовала в режиме отладки (debug mode). Что-то работало шустро, что-то наоборот, имело большие просадки по фреймам и тормозило гораздо больше, чем что-то похожее на EFL+Node.js.

Мы немного расстроились и начали копать дальше. В SDK Flutter есть специальный режим компиляции машинного кода AOT, это даже не jit, а именно компиляция в нативный код со всеми сопутствующими оптимизациями, именно это подразумевается под по релиз-версией Flutter. Такой поддержки у нас в эмбеддере пока не было, добавляем.

Необходимы определенные инструкции, поданные аргументами к FlutterEngineRun

// полная реализация github.com/DEgITx/flutter_wayland/blob/master/src/elf.cc

vm_snapshot_instructions_ = dlsym(fd, "_kDartVmSnapshotInstructions");if (vm_snapshot_instructions_ == NULL) {  error_ = strerror(errno);  break;}vm_isolate_snapshot_instructions_ = dlsym(fd, "_kDartIsolateSnapshotInstructions");if (vm_isolate_snapshot_instructions_ == NULL) {  error_ = strerror(errno);  break;}vm_snapshot_data_ = dlsym(fd, "_kDartVmSnapshotData");if (vm_snapshot_data_ == NULL) {  error_ = strerror(errno);  break;}vm_isolate_snapshot_data_ = dlsym(fd, "_kDartIsolateSnapshotData");if (vm_isolate_snapshot_data_ == NULL) {  error_ = strerror(errno);  break;}
if (vm_snapshot_data_ == NULL || vm_snapshot_instructions_ == NULL || vm_isolate_snapshot_data_ == NULL || vm_isolate_snapshot_instructions_ == NULL) {  return false;}*vm_snapshot_data = reinterpret_cast <  const uint8_t * > (vm_snapshot_data_);*vm_snapshot_instructions = reinterpret_cast <  const uint8_t * > (vm_snapshot_instructions_);*vm_isolate_snapshot_data = reinterpret_cast <  const uint8_t * > (vm_isolate_snapshot_data_);*vm_isolate_snapshot_instructions = reinterpret_cast <  const uint8_t * > (vm_isolate_snapshot_instructions_);
FlutterProjectArgs args;// передаем все необходимое в argsargs.vm_snapshot_data = vm_snapshot_data;args.vm_snapshot_instructions = vm_snapshot_instructions;args.isolate_snapshot_data = vm_isolate_snapshot_data;args.isolate_snapshot_instructions = vm_isolate_snapshot_instructions;

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

$HOST_ENGINE/dart-sdk/bin/dart \--disable-dart-dev \$HOST_ENGINE/gen/frontend_server.dart.snapshot \--sdk-root $DEVICE_ENGINE}/flutter_patched_sdk/ \--target=flutter \-Ddart.developer.causal_async_stacks=false \-Ddart.vm.profile=release \-Ddart.vm.product=release \--bytecode-options=source-positions \--aot \--tfa \--packages .packages \--output-dill build/tmp/app.dill \--depfile build/kernel_snapshot.d \package:lib/main.dart$DEVICE_ENGINE/gen_snapshot                               \    --deterministic                                             \    --snapshot_kind=app-aot-elf                                 \    --elf=build/lib/libapp.so                                   \    --no-causal-async-stacks                                    \    --lazy-async-stacks                                         \    build/tmp/app.dill

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

-Ddart.vm.profile=release \
-Ddart.vm.product=release \

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

output-dill нужен для построения нативной библитеки libapp.so.

Самыми важными для нас являются пути $DEVICE_ENGINE и $HOST_ENGINE два собранных движка под целевую (ARM) и хост-системы (x86_64) соответственно. Тут важно ничего не перепутать и убедиться, что libapp.so получается именно 32-битной ARM-версией:

$ file libapp.so libapp.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked

Запускаем и-и-и-и... вуаля! все работает!

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

3. Подключение устройств ввода

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

4. Интерфейс на ТВ-приставке под Linux и Android и как увеличить производительность в 23 раза

Коснемся еще нескольких нюансов производительности, с которыми столкнулись в продуктовом UI-приложении. Нас очень обрадовала идентичность работы UI как на целевом устройстве, так и на Linux и Android. Уже сейчас Flutter может вполне может похвастаться очень гибкой портируемостью.

Еще отметим интересный опыт оптимизации самого dart-приложения под целевую платформу. Нас разочаровала довольно низкая производительность продуктового приложения (в отличии от демок). Мы взяли в руки профайлер и начали копать идовольно быстро обнаружили активное использование функций __brcm_cpu_dcache_flush и khrn_copy_8888_to_tf32 во время анимаций (на платформе используется чип процессора Broadcom/BCM ). Явно происходило какое-то очень жесткое пиксельное программное трансформирование или копирование во время анимаций. В итоге виновник был найден: в одной из панелей был задействован эффект размытия:

//...filter: new ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0),//...

Комментирование одного этого эффекта дало увеличение производительности приложения в дватри раза и вывело приложение на стабильные 50-60 fps. Это хороший пример того, как один специфический эффект может уничтожить производительность во всем приложении на Flutter при том, что он был зайствован всего-лишь в одной панели, которая большую часть времени была скрыта.

Итого

В результате мы получили не просто работающее продуктовое приложение, а работающее приложение с качественным фреймрейтом на Flutter на целевом устройстве. Форк и наша версия эмбеддера под RDK и другие платформы на основе Wayland находится тут: github.com/DEgITx/flutter_wayland

Надеемся, опыт нашей команды в разработке и портировании ПО для ТВ-приставок и Smart TV пригодится вам в своих проектах и послужит отправной точкой для портирования Flutter на других устройствах.

[!?] Вопросы и комментарии приветствуются. На них будет отвечать автор статьи Алексей Касьянчук, наш инженер-программист

Подробнее..

Чини свою Теслу сам, тыжпрограммист

11.04.2021 20:17:45 | Автор: admin

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

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


Для начала следует разобраться с hardware в Вашей Tesla. Нас интересует MCU (Media Control Unit), Бывает MCU1(Tegra) и MCU2(Intel).

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

Если у Вас Tesla model S дорестайлинговая на MCU1. Подключаемся вместо приборной панели в Fakro-Lan и запускаем скрипт перевода в factory. Factory mode отличается от Developer mode тем, что после перезагрузки не слетает.

#!/bin/bash## Put Tesla MCU1 in factory mode## Call over diagnostics port with seceth enabled## Reboot MCU afterwards#VALUE=trueif [ ! -z "$1" ]; then    VALUE=$1fiCID="192.168.90.100"curl "http://${CID}:4070/_data_set_value_request_?name=GUI_factoryMode&value=${VALUE}"

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

Сертификаты живут здесь /var/lib/car_creds/car.{crt,key}.

Каждому автомобилю выдаются уникальные клиентские сертификаты для Hermes/OpenVPN, и они периодически меняются. Это усложняет захват образов прошивки или проверку бэкенда Tesla, так как сначала вам нужно получить root-доступ к автомобилю.

Получение root-прав позволяет Вам загружать любую модифицированную прошивку. Например, превратить Ваш авто в бэтмобиль.

Иногда это вынужденная мера, так как eMMC от Hynix на Тегре не очень хорошего качества и живет около 5 лет, потому что запись в /var очень активная. Для замены чипа памяти на Swissbit eMMC Вам потребуются root-права.

Я уже писал как снять дамп с NAND, здесь процесс абсолютно идентичный. Если память не поменять заблаговременно, то eMMC будет изнашиваться, процессор Tegra не сможет загрузиться, а ваш экран MCU не будет включаться или MCU будет перезагружаться и перезагружаться.

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

MMC/SD на самом деле является стандартом интерфейса, который позволяет различным производителям создавать чипы. Если вы не хотите сейчас заменять чип и просто хотите получить дамп, вы можете припаяться к правым колодкам на задней панели CID, подключить их к выводам ридера и прочитать eMMC таким образом.

Если Вы будете использовать такой способ смотреть инструкцию к Вашему ридеру.

Получение root-доступа

Существуют возможность получение root доступа через уязвимости софта, но они легко закрываются. Есть железный вариант и он надежнее. Это работает на Теграх без автопилота и с автопилотом 1 поколения. CID - центральный дисплей это дочерняя плата к MCU.

CID сделан Nvidia, процессор на MCU так же Nvidia. Поскольку это сделано nVidia, они использовали типичную систему на своих высококлассных видеокартах, то есть обновление прошивки идет попеременно в раздел 1 или 2, в зависимости от того, что в данный момент не активно, новая прошивка проверяется, затем автомобиль перезагружается на новую прошивку и развертывает поэтапные компоненты в остальной части автомобиля.

Загрузочный сопроцессор живет в чипе Tegra 3, отличном от реального процессора T3, и при сбросе этот сопроцессор инициализируется по первому адресу на лицевой стороне CID. Это довольно большой чип для встроенного устройства (512 МБ), и причина в том, что он отслеживает, какой раздел в eMMC является активным, а затем грузит ОС из него в оперативной памяти при каждой загрузке. После завершения работы сопроцессор цепочкой загружается в процессор T3, который загружается в файловую систему в оперативной памяти, и монтирует раздел eMMC 3 как /var и 4 как /home.

Более подробно на английском https://unofficial-tesla-tech.com/index.php?title=Rooting_MCU1

Если у тебя model3, значит ты умеешь отделять зерна от плевел, тебе маркетинговый шит не бьет прямиком в мозги и ты понимаешь, что Tesla model 3 это лучший электромобиль на текущий момент. Это многократно подтверждается владельцами с опытом эксплуатации разных моделей.

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

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

Недавно я получил Tesla Model 3, и так как я обожаю ковыряться в системах и пытаясь выяснить, как устроен мой компьютер (моя машина).

Я работаю над инфраструктурой машинного обучения ( https://golf-robotics.com/, сами понимаете, будущее за роботами), поэтому мне хотелось бы иметь возможность взглянуть на то, как автопилот FSD работает под капотом и что он на самом деле может делать за пределами той ограниченной информации, которую показывает пользовательский интерфейс.

Если Вы хотите повторить мои действия или испытывать что-то новое стоит зарегистрироваться в Tesla bug bounty https://bugcrowd.com/tesla

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

cid/ice - это компьютер, который управляет дисплеем и всеми медиа-системами, такими как звук.192.168.90.100первичный и вторичный компьютеры автопилота.192.168.90.103 - ap/ape192.168.90.105 - ap-b/ape-bШлюз - это в первую очередь UDP-сервер, который управляет коммутатором, конфигурацией автомобиля и прокси-запросами между стороной ethernet (cid/автопилот) и192.168.90.102 CAN-ШИНА к контроллерам и датчикам двигателя.Модем - это LTE-модем192.168.90.60Тюнер - это для AM/FM-радио. Не присутствует на более новых автомобилях модели 3, включая мои. Отсутствие AM/FM-радио действительно кажется проблемой безопасности, поэтому я был удивлен, увидев, что оно было удалено.192.168.90.60

Внутренняя автомобильная сеть использует Marvel 88EA6321 в качестве коммутатора. Это автомобильный гигабитный коммутатор.

Большинство соединений используют 100BASE-T1, который является 2-проводным PHY для Ethernet. Компьютеры автопилота, модем, тюнер, шлюз, CID-все используют 100Base-T1. Есть два стандартных порта Ethernet. Один из них расположен на материнской плате CID и имеет стандартный разъем Ethernet. Другой расположен в пространстве для ног со стороны водителя и имеет специальный разъем.

Tcam

TCAM-это особый тип памяти, который может выполнять очень быстрые поиски/фильтры за один цикл. Это позволяет Шлюзу задавать пакетные фильтры для применения коммутатором. По умолчанию порт ethernet в пространстве для ног со стороны водителя отключен этими правилами. Диагностический разъем на материнской плате CID может получить доступ только к портам 8080 (Odin) и 22 (SSH) на CID.

Дорестовые Model S используют постоянное соединение OpenVPN для связи с материнским кораблем, как называет его Тесла. Все коммуникации с Tesla проходят через это VPN-соединение, так что нет никакой возможности получить файл обновлений.

Вместо использования OpenVPN M3 запускает прокси-сервис под названием Hermes. Hermes-это относительно простая служба, которая может передавать неаутентифицированные запросы по CID на материнский корабль. Предположительно, поддержание постоянных соединений OpenVPN на 500 000+ автомобилях не было масштабируемым, поэтому они переключились на более простое решение.

Бинарники

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

$ ls opt/hermes/hermes_client*     hermes_fileupload*  hermes_historylogs*  hermes_teleforce*hermes_eventlogs*  hermes_grablogs*    hermes_proxy*$ file /opt/hermes/hermes_clientopt/hermes/hermes_client: sticky ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=JRZRLflVY89A6p67rwkt/nb9KmeWMLadrBGvRVujH/aJPtciQz8Xldpa7VcVy_/XzIY9KY7sZI0KdwLYOK5, stripped

Odin

Odin-это сервис python 3, работающий на каждом автомобиле. Он используется для различных действий по техническому обслуживанию автомобиля, таких как калибровка радара и камер. Если вы подключитесь к внутренней карточной сети, то сможете получить к ней доступ по адресу 192.168.90.100:8080.

Если вы попытаетесь выполнить какое-либо из действий на Odin, он просто выдаст ошибку.

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

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

Сети очень близки к JSON, но хранятся в файлах .py.

Вот отрывок из одного:

network = {...    "get_success": {"default": {"datatype": "Bool", "value": False},"position": {"y": 265.22259521484375, "x": 108.96072387695312},"variable": {"value": "success"},"value": {"datatype": "Bool"},"type": "networks.Get",    },    "IfThen": {"position": {"y": 340.1793670654297, "x": 297.02069091796875},"expr": {"datatype": "Bool", "connection": "get_success.value"},"if_true": {"connection": "exit.exit"},"type": "control.IfThen","if_false": {"connection": "capturemetric.capture"},    },...}

Kernel / Secure Boot

Я не очень много знаю об используемом Intel SOC, но он поддерживает некоторую безопасную загрузку. У меня нет возможности проверить, включен ли он, но я не удивлюсь, если это так. Если он не включен, то должна быть возможность изменить kernel, чтобы отключить dm-verity и загрузить неподписанный образ.

Updater

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

CAN Bus

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

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

Сервисы и приложения

Spotify работает под управлением пользователя spotify как сервис. Похоже, нет никакого способа развернуть новые изолированные приложения в системе. Я думал, что будет что-то похожее на Android APKs для чего-то вроде Spotify, но это просто приложение Qt.

Я продолжаю разбираться, если Вы считаете пост интересным - дайте знать и я напишу продолжение.

Большое спасибо ребятам из сервиса Tesla в Москве https://teesla.ru/ за оказанную помощь в попытках собрать воедино возможные варианты самостоятельного обслуживания своего автомобиля.

Просто для справки, перевод в factory в СНГ оценивается где-то в $200, теперь Вы можете это делать бесплатно! За смену памяти на Тегре в сервисах могут попросить до $1000, но Вы во всеоружии!

Подробнее..

Гиперконвергентная система AERODISK vAIR v2. Часть 1. Система виртуализации АИСТ

14.04.2021 06:04:04 | Автор: admin


Всем привет. Этой статьей мы начинаем знакомить вас с новой версией российской гиперконвергентной системы AERODISK vAIR v2, в частности, со встроенным гипервизором АИСТ, который сейчас получил возможность работать автономно от vAIR, используя внешние СХД.


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


  • Управление кластером и гипервизор АИСТ
  • Файловая система ARDFS
  • Аппаратные платформы, лицензирование и поддержка

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


Коротко об архитектуре. Основные отличия между первой и второй версией


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


Описывать полностью архитектуру с нуля мы рамках этой статьи не будем. Коснёмся лишь тех отличий, которые существуют в настоящий момент между первой и второй версией. Для более глубокого знакомства с изначальной архитектурой vAIR v1 рекомендуем ознакомиться с нашими предыдущими статьями на эту тему:



На уровне большой картинки на данный момент архитектура vAIR v2 выглядит следующим образом:



Ну а теперь переходим к деталям.


Косметические изменения


Незаметное внешнему глазу, но при этом важное и трудоемкое событие произошло в распределенной базе конфигураций (ConfigDB), которая отвечает за одновременное хранение конфигураций всех компонентов решения на всех нодах кластера. Мы полностью её переработали и, соответственно, оптимизировали. В итоге ConfigDB стала значительно стабильнее и минимизировала пожирание бесценных аппаратных ресурсов. Если говорить о цифрах, то за счёт переработки полезную производительность решения удалось увеличить примерно на 30%, что, очевидно, хорошо.


Стандартный блок данных, которым оперирует ARDFS, изменился с 4МБ до 64 МБ. Сделано это было также с целью увеличения производительности ввода-вывода.


Ещё одним маленьким, но приятным бонусом, который получился в результате оптимизации ARDFS и ConfigDB, стало снижение минимальных системных требований по количеству нод в кластере. Первая версия vAIR требовала не менее четырех нод, во второй-же версии начинать можно с трёх нод. Мелочь, но тоже приятно.


АИСТ покинул гнездо


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


Для справки: и АИСТ, и vAIR как два отдельных продукта прошли всю необходимую экспертизу регуляторов и, соответственно, добавлены во всех необходимые гос. реестры Минцифры и Роспатента, чтобы по-честному считаться российским ПО.


Чтобы не было путаницы, поясним. По факту АИСТ и vAIR не являются разными продуктами. Гипервизор АИСТ это составная и обязательная часть гиперконвергентной системы vAIR, при этом АИСТ может использоваться в качестве самостоятельного решения, а также АИСТ может всегда быть обновлен до полноценного vAIR-а.


Данное архитектурное изменение не только позволяет импортозаместить зарубежную виртуализацию на российских предприятиях, но и открывает ряд крайне полезных сценариев использования vAIR. Разберем их:


Сценарий 1. Просто гиперконвергент


Тут все просто. АИСТ используется как составная часть vAIR и работает с хранилищем ARDFS. Это то, что было в первой версии, и остается сейчас.



Виртуальные машины, сеть и хранилище работают в рамках одной отказоустойчивой аппаратной платформы (3 ноды+).


Сценарий 2. Просто виртуализация


Классическая серверная виртуализация. На локальные диски физических серверов устанавливается АИСТ, к АИСТу пригоняются сторонние СХД по файловым или блочным протоколам, и на базе этих СХД хранятся виртуальные машины.



При этом в этой схеме всегда остается возможность добавить локальных дисков во все физические серверы, объединить их быстрым (от 10 Гбит/сек) интерконнектом и обновить лицензию АИСТа до vAIR, получив в итоге гибридный сценарий (см. ниже).


Сценарий 3. Гибридный сценарий


Самый интересный сценарий. Мы одновременно с гиперконвергентом используем в качестве хранилища виртуальных машин сторонние СХД (например ENGINE или ВОСТОК :-)). Полезным является то, что к любой виртуалке, которая хранится на ARDFS, мы можем легко прицепить дополнительные виртуальные диски с СХД. И наоборот, к любой виртуалке, которая лежит на СХД, мы можем прицепить виртуальные диски с ARDFS. Это открывает очень много возможностей, начиная с задач постепенной и бесшовной миграции инфраструктуры между разными хранилищами, заканчивая полезным использованием старых СХД и серверов хранения, которые и выкинуть жалко, и подарить некому.



В итоге, когда мы пишем vAIR, мы имеем ввиду большой продукт в целом гиперконвергентную систему, которая включает в себя гипервизор АИСТ и файловую систему ARDFS. А если мы пишем АИСТ, то имеем в виду только компонент, который отвечает за серверную виртуализацию и виртуальную сеть. Чтобы внести ещё больше ясности, приводим ниже таблицу с разбивкой функционала по компонентам.



Обзор функционала. Что нового и для чего


Функции управления


Управление системой осуществляется при помощи web-консоли на русском языке (поддерживаются любые браузеры) или командной строки. Важной и полезной плюшкой является то, что за счёт распределённого хранения конфигураций для осуществления управления всем кластером можно подключиться к любой ноде по IP или DNS-имени. Специальных серверов управления разворачивать не нужно. При этом это не запрещено.


Предусмотрен сценарий развертывания управляющей виртуальной машины (УВМ), которая через RestfulAPI может осуществлять полноценное управление всем кластером.


Кстати RestfulAPI, как понятно выше, есть, он описан и работает (по нему будет отдельная статья). Его спокойно можно использовать для автоматизации операций и интеграции со смежными системами. К примеру, уже сейчас есть интеграция (и, кстати, есть внедрение в продуктив) с российским VDI-решением Термидеск, как раз реализованная на базе нашего API. Плюс ещё несколько продуктов вендоров-партнеров на подходе.


Для управления виртуальными машинами изнутри гостевой ОС используется на выбор два протокола: VNC (по умолчанию) или Spice. На уровне отдельных ВМ администратор может задавать разные варианты подключений.



Сам интерфейс разбит на несколько логических частей.


1) Основная область управления, в которой выполняются почти все операции



2) Основное меню, которое выдвигается наведением курсора



3) Панель действий, на которой отображаются доступные для выбранного объекта действия.



4) Панель задач, которая показывает, какие задачи выполняются или были выполнены над выбранным объектом, вызывается выбором объекта и последующим кликом по кнопке задачи.



5) Ну и, наконец, информационная панель, которая показывает количество актуальных ошибок (красные) и выполняемых в данный момент действий (синие).



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



Лирическое отступление: когда я эту функцию показал моему старому товарищу, который является тру-админом (то есть он админил системы в те славные времена, когда систем ещё не существовало) он воскликнул:
Вы нормальные там??!!! Нельзя админить серьезные системы через мобилу!!!
Хочу отметить, что во втором своём высказывании он, безусловно прав, лазить по серьезным кластерам через мобилку опасно, можно ткнуть не туда и всё как обычно упадёт, но всегда есть НО
Я напомнил ему ситуацию, в которую он попал несколько лет назад, когда потратил примерно 40 минут времени и 10 тонн мата на то, чтобы перезагрузить пару зависших виртуалок на известном гипервизоре, используя свой смартфон. Ноутбука у него с собой не было, а его заказчик с паром из ушей требовал устранить проблему здесь и сейчас.
Вспомнив об этом случае, мой товарищ тру-админ перестал сомневаться в нашей нормальности :-).

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


Гипервизор АИСТ


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


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



Если параметр HAVM активен, то в случае отказа ноды кластера, ВМ автоматически перезапуститься на другой ноде.


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



Для защиты данных на уровне ВМ, а также для большей гибкости администрирования предусмотрены мгновенные снимки и клоны (которые можно превратить в шаблоны ВМ соответственно). Важной доработкой и одновременно крайне большой радостью является то, что снэпшоты делаются на горячую (при работающей ВМ) и полностью поддерживают консистентность файловых систем гостевых ОС (Linux, Solaris, Windows, BSD) и ряда поддерживаемых СУБД (пока только PostgreSQL и MySQL). При этом с помощью RestfulAPI никто не мешает реализовать консистентные снимки для других систем внутри гостевой ОС самостоятельно.


Для внешнего хранения из коробки поддерживается NFS, то есть хранить виртуалки можно на распределенном хранилище ARDFS (доступно в vAIR) или на внешней СХД по протоколу NFS. Опционально предусмотрена поддержка блочных внешних СХД по протоколам iSCSI и FC.


Миграция виртуальных машин со сторонних гипервизоров


Миграция, причем неважно откуда и куда, всегда стоит особняком во всей ИТ-жизни. За время полутора лет эксплуатации нашими заказчиками первой версии vAIR они (и мы автоматически) регулярно сталкивались с проблемами миграции виртуальных машин со сторонних гипервизоров в АИСТ. Штатный конвертер KVM штука хорошая, но крайне капризная. Поэтому в vAIR v2 (и в АИСТе соответственно) мы предусмотрели человеческий конвертер ВМ из VMware/Hyper-V прямо в интерфейсе vAIR/АИСТ.



Для конвертации администратор выбирает шару NFS (пока только NFS), где лежат файлы виртуальных машин VMware или Hyper-V. Далее vAIR сам сканирует шару на наличие нужных ему файлов и формирует доступный список для миграции. Далее выбираем целевой пул ARDFS (или внешнюю СХД), то есть куда будем конвертировать, выбираем нужные файлы ВМ (можно несколько, они будут конвертироваться по очереди) запускаем и идём пить пиво.



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


Мониторинг и логирование


Функции мониторинга реализованы как локально, так и удаленно. Администратор может работать со счетчиками утилизации ресурсов CPU, RAM, сетевых интерфейсов и подсистемой ввода-вывода (IOPS, MB/s, latency), как на уровне отдельных нод, так и на уровне кластера в целом.



Всё то же самое доступно и для удаленной системы мониторинга на базе Grafana.



Для логирования и алертинга предусмотрен журнал событий (ноды, порты, физические диски (SMARTCTL), сенсоры, температура и т.п.) с разбивкой по категориям и возможностью оповещения по электронной почте. Опционально поддерживается SNMP.




Кроме описанных выше возможностей гипервизор АИСТ позволяет выполнять функционал, который мы считаем must have, поэтому сильно его разрисовывать не будем, а просто перечислим:


  • Обновление ПО без остановки и миграции виртуальных машин
  • Живая миграция ВМ, а в ближайшем будущем с возможностью динамичного распределения ресурсов (а-ля DRS)
  • Распределённые виртуальные коммутаторы с поддержкой VLAN-ов
  • Расширение кластера без остановки виртуальных машин
  • Автоподдержка (автоматическое оповещение производителя и заведение тикетов в тех. поддержку, при согласии заказчика, само собой)
  • Метрокластер (отдельная большая функция, которой мы посветим позже отдельную статью)

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


https://aerodisk.ru/upload/Datasheet_AIST_final_11042021.pdf


В завершение первой части


В процессе разработки vAIR и АИСТ собственных решений в области виртуализации многие наши доверенные партнеры (которые допущены к раннему доступу), глядя на это, утверждали, что это плохая идея, потому что ВМварь и Нутаникс не догнать, они слишком крутые и великие, у них тысячи программистов по всей планете, бороды длиннее и свитера в два раза толще.


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


А эти компании сразу появились на свет с тысячей бородатых разрабов в толстых свитерах?

ИЛИ другой вариант


А вы когда родились вам сразу было 35 лет, у вас была машина, семья, дача, работа и образование? Это в комплекте вам врачи в роддоме выдавали?

В продолжении этой мысли позволим себе процитировать нашу же старую статью:


притча на эту тему.


Однажды странник попал в город, где шло грандиозное строительство. Мужчины ворочали большие камни под палящим солнцем. Что ты делаешь? спросил наш герой у одного из рабочих, который медленно тащил булыжник. Ты что, не видишь камни таскаю! зло ответил тот. Тут странник заметил другого рабочего, который волок телегу с большими камнями, и спросил: Что ты делаешь? Я зарабатываю на еду для своей семьи, получил он ответ. Странник подошел к третьему рабочему, который занимался тем же, но работал энергичнее и быстрее. Что делаешь ты? Я строю храм, улыбнулся тот.

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


В жизни это совсем не так. Практически всегда (за редким исключением), новый серьезный продукт создается небольшим коллективом до 10 человек (а обычно 2-3). При этом на этапе создания закладывается 80% всего функционала продукта. Далее продукт силами этого маленького коллектива выходит на рынок (или как-то еще громко заявляет о себе), и там его уже подхватывают инвесторы (фонды, холдинги или крупные производители).


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


На этом мы завершаем первую часть цикла статей про vAIR v2. В следующей статье подробно расскажем о функционале файловой системы ARDFS.


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


Голосование доступно тут, на Хабре, а также в нашем телеграм-чате https://t.me/aerodisk


Всем спасибо за внимание, как обычно ждем конструктивной критики и интересных вопросов.

Подробнее..

Программа для создания desktop-файлов

31.03.2021 16:16:13 | Автор: admin

В дистрибутивах GNU/Linux значки приложений в меню описываются специальными текстовыми файлами. Эти файлы имеют расширение .desktop и при установке приложения создаются автоматически. Но иногда бывают ситуации когда нужно самому создать такой файл. Это может быть когда у вас на руках имеется только исполняемый файл приложения, то есть когда приложение не упаковано должным образом. В некоторых дистрибутивах из коробки имеются программы для создания значков запуска, а в некоторых их нет и нужно искать такие приложения в репозиториях. Я создал свой вариант такой программы и в этом посте расскажу, что она из себя представляет.

Немного о desktop-файлах

Вот пример desktop-файла для консольной игры nsnake:

[Desktop Entry]Version=1.1Type=ApplicationName=nsnakeGenericName=Classic snake game on the terminalNoDisplay=false//отображать в менюIcon=nsnakeExec=nsnakeTerminal=true//запускать в терминалеActions=Categories=ActionGame;Game;Keywords=snake;ncurses;textual;terminal;

Тут и так все понятно, но я все-таки прокомментировал пару позиций. Самое главное, что нужно прописать это название приложения (Name), путь до исполняемого файла (Exec) и путь до иконки (Icon). Если иконки нет и нет желания ее искать или создавать, то некоторые окружения рабочего стола установят иконку по умолчанию.

Краткое описание

Исходники приложения находятся здесь. Программа довольно простая. Выглядит она вот так:

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

В хидербаре находится кнопка, при нажатии на которую в файловом менеджере откроется папка, находящаяся по пути /.local/share/applications. Именно там программасохраняет созданные файлы.

Как работает

Приложение написано на языке Vala с помощью среды разработки GNOME Builder. Устанавливал самую свежую версию среды (40.0) из репозитория Flathub. Оказалось, что визуальный дизайнер в этой версии еще багованнее, чем в предыдущей, поэтому интерфейс делал в Glade.

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

        button_open.clicked.connect(on_open_directory);        button_create.clicked.connect(on_create_file);        directory_path = Environment.get_home_dir()+"/.local/share/applications";        GLib.File file = GLib.File.new_for_path(directory_path);         if(!file.query_exists()){//проверяем существует ли директория            alert("Error!\nPath "+directory_path+" is not exists!\nThe program will not be able to perform its functions.");            button_create.set_sensitive(false);//деактивация кнопки CREATE           }

При нажатии на кнопку CREATE вызывается метод on_create_file:

private void on_create_file (){       if(is_empty(entry_name.get_text())){//проверяем введено ли имя файла             alert("Enter the name");             entry_name.grab_focus();//устанавливаем фокус             return;         }         GLib.File file = GLib.File.new_for_path(directory_path+"/"+entry_name.get_text().strip()+".desktop");         if(file.query_exists()){//проверяем есть ли файл с таким именем            alert("A file with the same name already exists");            entry_name.grab_focus();            return;         }         var dialog_create_desktop_file = new Gtk.MessageDialog(this,Gtk.DialogFlags.MODAL,Gtk.MessageType.QUESTION, Gtk.ButtonsType.OK_CANCEL, "Create file "+file.get_basename()+" ?");          dialog_create_desktop_file.set_title("Question");          Gtk.ResponseType result = (Gtk.ResponseType)dialog_create_desktop_file.run ();          dialog_create_desktop_file.destroy();          if(result==Gtk.ResponseType.OK){              create_desktop_file();//создаем файл          }   }

Он предназначен для проверки ввода имени файла и проверки возможных совпадений с именами уже существующих в папке файлов, а также для вывода запроса подтверждения на создание файла. Если все проверки пройдены и пользователь подтвердил создание файла, то вызывается метод create_desktop_file:

private void create_desktop_file(){         string display;         if(checkbutton_no_display.get_active()){//проверяем первый чекбокс             display="true";         }else{             display="false";         }         string terminal;         if(checkbutton_terminal.get_active()){//проверяем второй чекбокс             terminal="true";         }else{             terminal="false";         }         string desktop_file="[Desktop Entry]Encoding=UTF-8Type=ApplicationNoDisplay="+display+"Terminal="+terminal+"Exec="+entry_exec.get_text().strip()+"Icon="+entry_icon.get_text().strip()+"Name="+entry_name.get_text().strip()+"Comment="+entry_comment.get_text().strip()+"Categories="+entry_categories.get_text().strip();//записываем содержимое будущего файла в переменную        string path=directory_path+"/"+entry_name.get_text()+".desktop";        try {            FileUtils.set_contents (path, desktop_file);//создаем файл        } catch (Error e) {            stderr.printf ("Error: %s\n", e.message);        }        GLib.File file = GLib.File.new_for_path(path);         if(file.query_exists()){//проверяем существование файла             alert("File "+file.get_basename()+" is created!\nPath: "+path);         }else{             alert("Error! Could not create file");         }       }

Чтобы просмотреть готовые файлы существует метод on_open_directory. Он срабатывает при нажатии на кнопку в хидербаре.

private void on_open_directory(){            try{                Gtk.show_uri_on_window(this, "file://"+directory_path, Gdk.CURRENT_TIME);            }catch(Error e){                alert("Error!\n"+e.message);            }       }

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

private void on_open_exec(){        var file_chooser = new Gtk.FileChooserDialog ("Choose a file", this, Gtk.FileChooserAction.OPEN, "_Cancel", Gtk.ResponseType.CANCEL, "_Open", Gtk.ResponseType.ACCEPT);        if (file_chooser.run () == Gtk.ResponseType.ACCEPT) {            entry_exec.set_text(file_chooser.get_filename());        }        file_chooser.destroy ();   }

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

private void on_open_icon () {        var file_chooser = new Gtk.FileChooserDialog ("Select image file", this, Gtk.FileChooserAction.OPEN, "_Cancel", Gtk.ResponseType.CANCEL, "_Open", Gtk.ResponseType.ACCEPT);    Gtk.FileFilter filter = new Gtk.FileFilter ();file_chooser.set_filter (filter);//установка фильтра для изображенийfilter.add_mime_type ("image/jpeg");        filter.add_mime_type ("image/png");        Gtk.Image preview_area = new Gtk.Image ();file_chooser.set_preview_widget (preview_area);//установка области предпросмотраfile_chooser.update_preview.connect (() => {string uri = file_chooser.get_preview_uri ();string path = file_chooser.get_preview_filename();if (uri != null && uri.has_prefix ("file://") == true) {try {Gdk.Pixbuf pixbuf = new Gdk.Pixbuf.from_file_at_scale (path, 250, 250, true);preview_area.set_from_pixbuf (pixbuf);//установка изображенияpreview_area.show ();//показываем область предпросмотра} catch (Error e) {preview_area.hide ();//скрываем область предпросмотра}} else {preview_area.hide ();}});        if (file_chooser.run () == Gtk.ResponseType.ACCEPT) {            entry_icon.set_text(file_chooser.get_filename());        }        file_chooser.destroy ();       }

Метод для вывода сообщений пользователю:

private void alert (string str){          var dialog_alert = new Gtk.MessageDialog(this, Gtk.DialogFlags.MODAL, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, str);          dialog_alert.set_title("Message");          dialog_alert.run();          dialog_alert.destroy();       }

Чтобы проверить введено ли какое-либо значение в текстовое поле используется такой метод:

private bool is_empty(string str){          return str.strip().length == 0;        }

На этом все! Надеюсь, что пост был для Вас полезен.

Дополнительная ссылка на SourceForge. До встречи в следующих постах!

Подробнее..

Создание TreeView и ComboBox в Glade

05.04.2021 16:10:13 | Автор: admin

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

TreeView

Итак, допустим, нам нужно получить что-то вроде этого:

Самое первое, что нужно сделать это открыть Glade и создать новое окно GtkWindow из вкладки окон. Далее, из соседней вкладки контейнеров выбираем GtkScrolledWindow и перемещаем на созданное окно. Должно получится вот так:

Далее, из вкладки Display перемещаем на окно так нужный нам TreeView. После перемещения справа от формы нужно найти и заполнить поле "модель TreeView":

Нажимаем на значок карандаша и видим окно:

В этом окне нужно нажать кнопку "Создать". Окно сразу закроется, а в поле модели появится надпись liststore1. После всех манипуляций в левой панели должна отображаться вот такая иерархия:

Выделяем пункт liststore1 и в правой части обращаем внимание на следующую таблицу:

Нам нужно ее заполнить. Для заполнения надо нажать на выделенную строку и выбрать в появившемся выпадающем списке необходимое значение типа столбца и дописать его название. Я сделал так:

Ниже этой таблицы есть еще одна, в которой нужно создать строки:

Я заполнил ее таким образом:

Что дальше? А дальше нам надо вызвать редактор дерева, чтобы связать полученный liststore с элементами списка. Чтобы появился редактор нужно в левой панели кликнуть правой кнопкой мыши на элементе GtkTreeView или сделать то же самое в области формы. В появившемся меню нажимаем "Edit". Должно показаться такое окно:

Нажимаем на плюс в левой части и видим примерно следующее:

Заполняем поле ID (по желанию) и дальше нажимаем правой кнопкой мыши по выделенному элементу в левой части. В появившемся меню выбираем добавление дочернего элемента "Текст" и переходим уже к нему:

Здесь очень важно в разделе параметров и атрибутов выбрать нужный нам элемент из liststore. По умолчанию там выставлено значение "не определено". Нажав на выпадающий список, выбираем "name-gchararray". Таким образом мы создали первый столбец. Для создания второго столбца нажимаем снова на плюс в левой части и повторяем все то же самое, но с другими параметрами. Для второго столбца должно получиться так:

А для третьего вот так:

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

Еще нужно переименовать столбцы, так как по умолчанию они выводятся как "column". Для переименования выделите нужный столбец в левой панели, например, column_name, а в правой части найдите это:

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

ComboBox

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

В параметрах и атрибутах указан name-gchararray из list_store. Вот содержимое list_store:

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

На этом все! Надеюсь, что понятно объяснил и помог новичкам разобраться в данной теме.

Подробнее..

FOSS News 63 спецвыпуск о внутренней кухне дайджестов

31.03.2021 22:18:24 | Автор: admin


Всем привет!

Вот уже больше года я вместе с несколькими товарищами делаю дайджесты FOSS News для Хабра с материалами о свободном и открытом ПО и железе. Недавно меня пригласили на онлайн-конференцию разработчиков программного обеспечения с открытым кодом Админка, где я рассказал о наших дайджестах для тех, кто их не видел, и об их внутренней кухне для тех кто уже читает. Я подумал, что здесь читателям это тоже может быть интересно, поэтому публикую текст доклада, на котором я основывал своё выступление.

Оглавление



  1. Введение
  2. Предыстория
  3. Идея
  4. Формат
  5. Последние главные материалы
  6. Развитие за год+
  7. Схема подготовки
  8. Источники, ключевые слова, фильтрация и прочее
  9. Интерактивный категоризатор
  10. Админка
  11. Команда
  12. Планы
  13. Присоединяйтесь!
  14. Контакты и ссылки


Введение



Сегодня я хочу рассказать о дайджестах новостей и других материалов о свободном и открытом ПО и железе под названием FOSS News. Free and Open Source Software News то есть. Мы с товарищами делаем эти дайджесты с января 2020 г., то есть больше года. В своём выступлении я хочу не только рассказать, что мы делаем, для тех кто не читал, но и показать некоторые детали процесса подготовки, что будет новым для тех кто нас уже и так читает, и остальным может быть интересно. Ещё FOSS News это не просто дайджесты о FOSS, это сам по себе FOSS проект, потому что в нём много автоматизации и её код выложен под свободной лицензией. В PermLUG я занимаюсь организационными вопросами и проектами, по основной же работе в Miro я инженер по нагрузочному тестированию и имею около 12 лет опыта разработки ПО.

Предыстория





Всё началось на встрече Пермской группы пользователей GNU/Linux 23 января 2020 г., а группа сама появилась аж 24 года назад. Я тогда только в школу ходил и ещё не участвовал. Далее было 5-6 волн активности и затишья. Я подключился где-то на 4-й. И последняя волна была инициирована мной, идея дайджестов тоже была моя, это я на верхнем фото справа со странным лицом, просто другого фото не было. Захотелось что-то полезное делать кроме собраний. Я и стал делать. Объединяться хорошо, а объединяться вокруг проекта ещё лучше. И в рекордные сроки, через 3 дня после той линуксовки, был готов выпуск 0. А со временем ещё пара людей подключились.

Идея





Идея дайджестов была простая. Я читал несколько источников о свободном и открытом ПО и железе, но мне мало интересны были релизы, которым уделялось достаточно много внимания. Я просто регулярно делаю sudo apt upgrade и радуюсь если что новое появилось в программах, которыми пользуюсь, ну а если что не заметил надо будет нагуглю. Именно релизы я отслеживаю буквально по нескольким проектам. Мне было интересно, чем ещё живёт сообщество. Что куда внедрили, кто исходники открыл, аналитика разная о достижениях FOSS, привлечение финансирования, отчёты о работе фондов и всё такое. Гипотеза была такая, что не одному мне интересна именно в первую очередь такая приоритизация.

Формат





Формат менялся со временем и чуть меньше года назад или около того стал примерно таким:
  1. Несколько главных материалов. Это могут быть и новости, и статьи, и какие-то особо важные релизы.
  2. Блок короткой строкой. Здесь по указанным трём категориям собрано всё, что попало в ленту из всех источников и не попало в главное, это реально много материалов, но там просто заголовок и ссылка и всё поделено по категориям. В начале дайджеста оглавление. Можно просто перейти в нужный блок, пропустив неинтересное.
  3. Прочее. Тут например ссылки на другие дайджесты или что-то ещё, что не вписалось в основные категории.


Выход каждую неделю в воскресенье вечером.

Последние главные материалы





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

Развитие за год+





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

Выпуск 1 запостили уже на Хабр по совету одного знакомого. Спасибо тимлиду с прошлого места работы за инвайт. И тут труды были вознаграждены просмотров было много, тысяч 7. И на только что созданный канал в Telegram сразу подписалась пара сотен человек.

Далее такого пика просмотров как у выпуска 1 мы не достигали и вообще число просмотров стабилизировалось, зато сформировалась постоянная аудитория и наверное это тоже неплохо. Аудитория примерно 2.5 тысяч человек не знаю много это или мало, мне нормально. Ну а Telegram канал растёт потихоньку но стабильно, это приятно.

Схема подготовки





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

Как делаются дайджесты:

  1. FNGS робот, написанный на Python, крутится на сервере и пробегается по куче RSS и HTML источников, собирает материалы и отфильтровывает по ключевым словам.
  2. С помощью интерактивного консольного клиента-категоризатора fncategorizer.py, тоже на Python (у меня почти всё на Python), я обрабатываю то что насобирал сервер, отбрасываю не по теме или явно неинтересные материалы, раскидываю по категориям с помощью подсказок категоризатора, который тоже работает по базе ключевых слов, всё это отправляется обратно на сервер.
  3. Скрипт remotedatatohtml.py вытаскивает с сервера все заголовки и ссылки для текущего выпуска и метаинформацию и генерирует HTML.
  4. HTML загружаю на Google Drive, кидаю ссылки для ревью товарищам.
  5. После ревью гуглодок выкачиваю и скриптом googledoctohtml.py преобразую в формат Хабра, в том числе строя оглавление. Да, в редакторе Хабра не совсем стандартный HTML.
  6. Заливаю на Хабр, ссылки кидаю в Telegram, RSS и по соцсетям.
  7. Собираю статистику, тоже скриптом естественно.


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

Источники, ключевые слова, фильтрация и прочее





Ещё немного статистики на слайде. Русскоязычные источники я насобирал по памяти, а англоязычные считерил немного, просто некоторое время назад linux.com собирал тематические материалы с других ресурсов и делал ссылки у себя, а я просто посмотрел откуда они собирали и добавил в базу. Ключевые слова набирались в ходе работы с категоризатором, который я написал, и ещё я стащил названия всех проектов, которые ведёт Linux Foundation. Есть на примете ещё источники. Вот тут написано про 500 исходных и 160 итоговых материалов просто не все ленты прям строго тематические, приходится отбирать по ключевым словам, большую работу тут за меня делает робот, я отсеиваю буквально десяток-другой вручную или около того. Ещё десяток-другой это дубликаты, их потом вручную объединять приходится пока что. По категориям раскидывание идёт в полуавтоматическом режиме, скрипт делает мне предложения исходя из ключевых слов, я принимаю или указываю свои варианты.

Интерактивный категоризатор





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

Админка





Поскольку FNGS сервер работает на Python Web фреймворке Django, бонусом шла админка. Через неё удобнее поиск делать и какие-то отдельные записи править и добавлять. Тут особо моей заслуги нет, просто показываю. Сборная солянка такая из консольных и графических инструментов, но мне норм.

Команда





В команде FOSS News из постоянных участников робот, мы вдвоём с Васей из PermLUG и ещё один человек с Хабра. Робот делает очень много рутинной работы, которой если бы мне пришлось заниматься каждую неделю я бы точно с ума сошёл :) А последнего я в жизни никогда не видел, просто он сначала на Хабре замечания к выпускам скидывал в личку, а потом я его пригласил к предрелизной подготовке, и он большой молодец.

Планы





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

Ещё читатели предлагали нам делать видеодайджесты, но это слишком сложно как мне кажется, а вот подкасты возможно, хотя сам я их не слушаю :)

И где-то в далёком светлом будущем я хотел бы сделать из FOSS News профессиональное СМИ, даже домены купил уже.

Присоединяйтесь!





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

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

Мы также открыты к другим вариантам сотрудничества.

И с радостью расскажем о ваших FOSS проектах, скидывайте ссылки!

Контакты и ссылки



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

Ресурсы PermLUG:

  1. Сайт (статичная страничка, просто для ссылок на всё остальное)
  2. Telegram @permlug (канал) и @permlug_chat (чат)
  3. ВКонтакте
  4. Fediverse
  5. Twitter
  6. Facebook


Исходники инструментов:

  1. FOSS News Gathering Server
  2. FOSS News Tools


Мои личные контакты:
  1. gim6626@gmail.com
  2. @gim6626 в Telegram


Спасибо за внимание! Читайте, комментируйте, распространяйте FOSS News и подключайтесь к нашей команде!




Ссылки на материалы по Админке:
  1. Полная программа te-st.ru/events/adminka
  2. Видеозапись первого дня www.youtube.com/watch?v=dvsCYfeo_qc
  3. Видеозапись второго дня www.youtube.com/watch?v=gCukiw4DWuU
Подробнее..

FOSS News 64 дайджест материалов о свободном и открытом ПО за 29 марта 4 апреля 2021 года

04.04.2021 22:19:50 | Автор: admin

Всем привет!


Продолжаем дайджесты новостей и других материалов о свободном и открытом ПО и немного о железе. Всё самое главное про пингвинов и не только, в России и мире. Продолжение конфликта вокруг Ричарда Столлмана и Фонда СПО; Linux Foundation поддержит инициативу AsyncAPI; первый стабильный выпуск AlmaLinux, форка CentOS 8; компания Xinuos, купившая бизнес SCO, начала судебное разбирательство против IBM и Red Hat; суд в Калифорнии оставил без рассмотрения иск Lynwood Investments к основателям Nginx; кормушка с видео в ленте Telegram и многое другое.


Оглавление


  1. Главное
    1. Продолжение конфликта вокруг Ричарда Столлмана и Фонда СПО
    2. Первый стабильный выпуск AlmaLinux, форка CentOS 8
    3. Linux Foundation поддержит инициативу AsyncAPI
    4. В Git-репозитории проекта PHP выявлены вредоносные изменения
    5. Компания Xinuos, купившая бизнес SCO, начала судебное разбирательство против IBM и Red Hat
    6. Суд в Калифорнии оставил без рассмотрения иск Lynwood Investments к основателям Nginx
    7. Кормушка с видео в ленте Telegram
  2. Короткой строкой
    1. Новости
      1. Мероприятия
      2. Внедрения
      3. Открытие кода и данных
      4. Внутренние дела организаций
      5. Ядро и дистрибутивы
      6. Обучение
      7. Мобильные
      8. Безопасность
      9. DevOps
      10. Web
      11. Для разработчиков
      12. Пользовательское
      13. Железо
      14. Разное
    2. Статьи
      1. DIY
      2. Ядро и дистрибутивы
      3. Системное
      4. Специальное
      5. Базы данных
      6. Безопасность
      7. DevOps
      8. AI & Data Science
      9. Web
      10. Для разработчиков
      11. Менеджмент
      12. Пользовательское
      13. Разное
    3. Релизы
      1. Ядро и дистрибутивы
      2. Системное
      3. Специальное
      4. Мультимедиа
      5. Мобильные
      6. Web
      7. Для разработчиков
      8. Пользовательское
      9. Игры
  3. Что ещё посмотреть
  4. Заключение

Главное


Продолжение конфликта вокруг Ричарда Столлмана и Фонда СПО


Категория: Новости/Внутренние дела организаций

Конфликт продолжается. Новые факты и материалы:


  1. Red Hat отказалась финансировать FSF за возврат Столлмана [ 1, 2(en), 3(en)]
  2. Изменения в составе совета директоров Фонда СПО []
  3. Ханна Вулфман-Джонс, соавтор Столлмана по одной из книг, выступила в его поддержку []
  4. Фонд свободного ПО покинул исполнительный директор []
  5. Лидеры и сторонники Фонда свободного программного обеспечения покидают тонущий корабль [(en)]
  6. Кризис в руководстве Фонда свободного программного обеспечения усугубляется [(en)]
  7. Перевод статьи В защиту Ричарда Столлмана []
  8. Проект Fedora разорвал отношения с Фондом СПО и выступил против Столлмана []
  9. Фонд СПО покидают заместитель директора и техдиректор []
  10. Автор Libreboot выступила с защитой Ричарда Столлмана [ 1, 2]

Первый стабильный выпуск AlmaLinux, форка CentOS 8


Категория: Релизы/Ядро и дистрибутивы

OpenNET пишет: Состоялся первый стабильный выпуск дистрибутива AlmaLinux, созданного в ответ на преждевременное сворачивание поддержки CentOS 8 компанией Red Hat (выпуск обновлений для CentOS 8 решено прекратить в конце 2021 года, а не в 2029 году, как предполагали пользователи). Проект основан компанией CloudLinux, которая предоставила ресурсы и разработчиков, и передан под крыло отдельной некоммерческой организации AlmaLinux OS Foundation для разработки на нейтральной площадке с участием сообщества. На развитие проекта выделен миллион долларов в год. Сборки подготовлены для архитектуры x86_64 в форме загрузочного (650 МБ), минимального (1,8 ГБ) и полного образа (9 ГБ). В ближайшее время планируется также опубликовать сборки для архитектуры ARM. Релиз сформирован на основе выпуска Red Hat Enterprise Linux 8.3 и полностью идентичен с ним по функциональности, за исключением изменений, связанных с ребрендингом и удалением специфичных для RHEL пакетов, таких как redhat-*, insights-client и subscription-manager-migration*. Все наработки публикуются под свободными лицензиями.


Подробности [ 1, 2, 3, 4(en), 5(en), 6(en)]


Linux Foundation поддержит инициативу AsyncAPI


Категория: Новости/Внутренние дела организаций

Linux Foundation пишет: Linux Foundation, некоммерческая организация, обеспечивающая массовые инновации через открытый исходный код, объявила сегодня о поддержке инициативы AsyncAPI. AsyncAPI это спецификация и набор инструментов с открытым исходным кодом, которые работают с асинхронными API и архитектурами, управляемыми событиями. Согласно недавнему опросу разработчиков, это самая быстрорастущая спецификация API, использование которой увеличилась в 3 раза с 2019 по 2020 год.


Подробности [ 1(en), 2(en), 3(en)]


В Git-репозитории проекта PHP выявлены вредоносные изменения


Категория: Новости/Безопасность

OpenNET пишет: Разработчики проекта PHP предупредили о компрометации Git-репозитория проекта и обнаружении двух вредоносных коммитов, добавленных 28 марта в репозиторий php-src от имени Расмуса Лердорфа, основателя PHP, и Никиты Попова, одного из ключевых разработчиков PHP. В первом вредоносном коммите под видом исправления опечатки в файле ext/zlib/zlib.c было внесено изменение, запускающее PHP-код, переданный в HTTP-заголовке User Agent, если содержимое начинается со слова zerodium. После того как разработчики заметили вредоносное изменение и отменили его, в репозитории появился второй коммит, который отменял действие разработчиков PHP и возвращал вредоносное изменение. Из-за проведения аудита формирование новых релизов заморожено на две недели.


[ 1, 2, 3(en), 4(en), 5(en)]


Компания Xinuos, купившая бизнес SCO, начала судебное разбирательство против IBM и Red Hat


Категория: Новости/Юридические вопросы

OpenNET пишет: Компания Xinuos инициировала судебное разбирательство против IBM и Red Hat. Xinuos утверждает, что IBM незаконно скопировала принадлежащий Xinuos код для своих серверных операционных систем и сговорилась с Red Hat с целью незаконного разделения рынка. По мнению Xinuos, сговор IBM и Red Hat нанёс ущерб сообществу разработчиков открытого ПО, потребителям и конкурентам, а также способствовал торможению развития инноваций. В том числе действия IBM и Red Hat по разделению рынка, предоставлению взаимных преференций и продвижению продуктов друг друга негативно повлияли на распространение разрабатываемого в Xinuos продукта OpenServer 10, конкурирующего с Red Hat Enterprise Linux. Компания Xinuos (UnXis) в 2011 году выкупила бизнес у обанкротившейся SCO Group и продолжила разработку операционной системы OpenServer. OpenServer является преемником SCO UNIX и UnixWare, но начиная с выпуска OpenServer 10 в качестве основы в данной операционной системе используется FreeBSD.


Подробности [ 1, 2, 3(en), 4(en)]


Суд в Калифорнии оставил без рассмотрения иск Lynwood Investments к основателям Nginx


Категория: Новости/Юридические вопросы

Пользователь denis-19 в своём блоге на Хабре пишет: По информации издания Коммерсантъ, 25 марта 2021 года калифорнийский суд оставил без рассмотрения иск Lynwood Investments к основателям Nginx Игорю Сысоеву и Максиму Коновалову. Судья счёл доводы Lynwood на владение Nginx необоснованными. Эксперты юридических фирм Pen & Paper и Косенков и Суворов пояснили Коммерсанту, что суд отклонил требования Lynwood сразу по нескольким основаниям: из-за несвоевременности, так как события произошли в 2011 году; из-за недостаточно обоснованных обвинений в мошенничестве по стандартам американского права; также Lynwood в иске не указала, кто, что, когда, где и как именно сделал.


Подробности []


Кормушка с видео в ленте Telegram


Категория: Статьи/DIY

Немного позитива. Пользователь xiliu в своём блоге на Хабре рассказал об опыте создания кормушки для птиц с автоподачей корма и автоматической отправкой видео себе в Telegram: Прошлым летом многие мои друзья повесили у себя на окне прозрачные кормушки из оргстекла, которые массово стали появляться на алиекспрессе, да и в обычных магазинах. Глядя на их сториз в инстаче, я тоже захотел смотреть на птичек. Инструкции прилагаются, можете повторить :)


Подробности []


Короткой строкой


Новости


Мероприятия


  1. Анонс онлайн-дня открытых дверей для Java и React разработчиков: особенности работы в команде open source фреймворка []
  2. Образование, цифровизация и импортозамещение практическая конференция Astra Linux []
  3. LF Energy Spring Summit 2021: освещая будущее[(en)]
  4. Базальт СПО приглашает на объединенную конференцию СПО: от обучения до разработки []

Внедрения


  1. ИС и инфраструктура Администрации ЗАТО Северск перешли на Astra Linux []
  2. FanGraphs бейсбольная аналитика переехала на MariaDB [(en)]

Открытие кода и данных


  1. GitLab объявил о выпуске ядра fuzzy тестирования протоколов Peach под названием GitLab Protocol Fuzzer Community Edition с открытым исходным кодом![(en)]
  2. Ученые выяснили код вакцины Moderna COVID-19 и разместили его на Github [(en)]
  3. Kasten открывает код Kubestr для оптимизации параметров хранилища Kubernetes [(en)]
  4. Открыты исходные тексты игрового движка Storm []
  5. Бельгийский стартап CitizenLab открыл код платформы для задач обеспечения цифровой демократии [(en)]

Внутренние дела организаций


  1. Павел Дуров заявил, что инвесторы не могут влиять на политику Telegram []
  2. Linux Foundation реализует проект по децентрализации и ускорению разработки лекарств от редких генетических заболеваний[ 1(en), 2(en)]
  3. LF Networking объявляет о новом участнике Walmart, создавая новую эру корпоративных сетей с открытым исходным кодом [(en)]
  4. Фонд OpenTreatments: демократизация и децентрализация разработки лекарств [(en)]
  5. IBM и Red Hat формируют стратегическое партнёрство со стартапом в области процессной аналитики Celonis [(en)]
  6. Альтернатива Visual Studio Marketplace присоединяется к Eclipse Foundation [(en)]
  7. Еженедельник OSM 557 []

Ядро и дистрибутивы


  1. Линус Торвальдс предупреждает о возможных задержках с выпуском Linux 5.12[(en)]
  2. Innovium добавляет поддержку сетевой ОС SONiC с открытым исходным кодом [(en)]
  3. Red Hat запускает RHEL Stream, чтобы конкурировать с растущей популярностью CentOS Stream [(en)]
  4. Тестовый выпуск дистрибутива Rocky Linux, идущего на смену CentOS, отложен до конца апреля []
  5. В установочные образы Arch Linux добавлен инсталлятор []

Обучение


Продвинутый курс по Apache Kafka: 11 апреля старт группы с куратором []


Мобильные


  1. Cosmo Communicator возможно еще один Linux телефон []
  2. Samsung начала загружать обновление для Android с частично не удаляемыми российскими приложениями []
  3. Исследование: Android отправляет в Google в 20 раз больше данных, чем iOS в Apple [ 1, 2(en), 3(en)]
  4. Google развивает новый Bluetooth-стек для Android, написанный на Rust []
  5. Google вносит важные изменения в работу приложений Android [(en)]

Безопасность


  1. Уязвимость в NPM-пакете node-netmask, применяемом в 270 тысячах проектах[ 1, 2]
  2. Вредоносные контейнеры Docker Hub заразили 20 миллионов пользователей вредоносными программами для майнинга криптовалют[(en)]
  3. Mozilla заявляет, что ее новый Firefox VPN обеспечивает большую безопасность, чем когда-либо [(en)]
  4. Linux исправляет ошибки, открывающие возможность обойти защиту от Spectre [(en)]
  5. В проект GitHub по хранению кода в Арктике случайно попала утечка медицинских данных []

DevOps


  1. Kasten от Veeam запускает Kubestr для улучшения конфигураций хранилищ Kubernetes[(en)]
  2. Теперь к Red Hat OpenShift можно получить доступ через AWS. Что это означает? [(en)]

Web


  1. В Chrome скоро появятся видеозвонки картинка в картинке[(en)]
  2. Google начала тестировать в Chrome технологию Federated Learning of Cohorts альтернативу cookies [ 1, 2(en), 3(en)]
  3. DNS-over-HTTPS заработает в Google Chrome для Linux [ 1, 2(en)]
  4. В режиме инкогнито в Chrome улучшается тёмный режим[(en)]

Для разработчиков


  1. GitHub повышает продуктивность разработчиков с помощью новых элементов управления мобильными уведомлениями[(en)]
  2. Python скоро будет поддерживать switch-операторы[(en)]
  3. Что нового в Java 16 (мнение Чада Аримуры из Oracle) [(en)]

Пользовательское


  1. На этой неделе в KDE: много всего []
  2. Приложения на Electron будут использовать файловые диалоги KDE []

Железо


Ноутбуки Toughbook с ОС Astra Linux двойная защита в экстремальных условиях []


Разное


Канал Linux.org.ru в Telegram []


Статьи


DIY


  1. Сборка эмулятора Dolphin в Ubuntu на Nintendo Switch[(en)]
  2. Программа для создания desktop-файлов []

Ядро и дистрибутивы


  1. Последний LinDoz: идеальный кроссовер Windows-Linux[(en)]
  2. Linux: посмотрим на бета-версию Fedora 34 [(en)]
  3. Сравнение Debian vs Arch Linux []

Системное


  1. Глубокое погружение в Linux namespaces, часть 3 []
  2. Глубокое погружение в Linux namespaces, часть 4 []
  3. FreeBSD. Условная маршрутизация средствами PF []

Специальное


  1. Ставим Ubuntu из другого Linux/LiveCD []
  2. Linux Sandbox []
  3. Как и зачем разворачивать приложение на Apache Spark в Kubernetes []
  4. Об одном примере использования FreeCAD [(en)]
  5. Команды FreeDOS, которые стоит знать[(en)]

Базы данных


  1. Apache Ignite в облаке AWS базовый пример []
  2. Эксплуатационный чек-лист для Redis в Kubernetes []

Безопасность


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


DevOps


  1. Как ускорить миграцию Zabbix на TimescaleDB []
  2. Автогенерация кода и стейта для существующих ресурсов в Terraform. Terraformer []
  3. Лучшие практики для деплоя высокодоступных приложений в Kubernetes. Часть 2 []
  4. Введение в непрерывную поставку (CD) при помощи GitLab []
  5. Организация сбора и парсинга логов при помощи Filebeat []

AI & Data Science


  1. Руководство по PyOD: набор инструментов Python для обнаружения выбросов[(en)]
  2. Руководство по Lux, инструменту для визуального анализа данных [(en)]
  3. Руководство по PM4Py, фреймворку Python для алгоритмов интеллектуальной процессной аналитики [(en)]
  4. 10 лучших инструментов Python для анализа временных рядов [(en)]
  5. Руководство по TensorForce: фреймворк для обучения с подкреплением на основе TensorFlow [(en)]
  6. Практическое руководство по BigGAN на Python [(en)]
  7. Руководство по Mayavi: инструмент Python для визуализации и построения 2D / 3D научных данных [(en)]
  8. Руководство по асимметричным нелокальным нейронным сетям с использованием PaddleSeg [(en)]
  9. Руководство Python по HiSD реализации трансляции изображений [(en)]
  10. Руководство по Open3D современной библиотеке с открытым исходным кодом для обработки трёхмерных данных [(en)]
  11. Что такое NeX? Руководство по созданию изображений, зависящих от угла зрения, в реальном времени на Python [(en)]

Web


  1. Nitter Twitter GUI без javascript []
  2. Администратор узла сети I2P. Полный курс []
  3. Свой мессенджер Matrix-synapse в связке с Jitsi-meet. Часть 3 []

Для разработчиков


  1. QGit, улучшения []
  2. Избавляемся от постоянного написания конструкторов для инжекта зависимостей с помощью C# Source Generators []
  3. Почему стоит использовать оболочку IPython и Jupyter Notebooks[(en)]
  4. Ядро macOS, есть ли червячки в этом яблоке? []
  5. Доступ к JSON API индекса пакетов Python с помощью библиотеки requests[(en)]
  6. 3 причины, по которым стоит использовать команду Git cherry-pick [(en)]
  7. Инструмент с открытым исходным кодом для трассировки значений переменных в Python для отладки [(en)]
  8. Создание Python Telegram бота и его deploy на виртуальную машину []
  9. Как узнать, что изменилось в коммите git [(en)]
  10. Практическое руководство по использованию команды git stash [(en)]

Менеджмент


  1. 6 действенныхшагов к тому, чтобы стать лидером, работающим по принципам открытости[(en)]
  2. Это не работает (о ведении Open Source проектов) []

Пользовательское


  1. NewsFlash: современная читалка RSS с поддержкой Feedly[(en)]
  2. Как воспроизводить DVD в Fedora Linux [(en)]
  3. GNOME 40. Новый интерфейс. Горизонтальная раскладка (+Видео) []
  4. Неправильное время при двойной загрузке Windows-Linux? Вот как это исправить[(en)]
  5. Разметка диска в Linux с помощью GNU Parted (cheat sheet) [(en)]
  6. Использование awk для подсчёта частотности букв [(en)]
  7. Об использованииexa вместо привычной консольной утилиты ls[]
  8. Компьютеры, какими я их любил []
  9. Заметки о Unix: одновременное редактирование нескольких файлов в Vim []

Разное


Подборка первоапрельских шуток 2021 года []


Релизы


Ядро и дистрибутивы


  1. Релиз дистрибутива Debian 10.9 []
  2. Выпуск дистрибутива 4MLinux 36.0 [ 1, 2]
  3. Выпуск дистрибутива Parrot 4.11 с подборкой программ для проверки безопасности []
  4. Релиз дистрибутива Nitrux 1.3.9 с рабочим столом NX Desktop []
  5. Анонс Unbreakable Enterprise Kernel Release 6 Update 2 для Oracle Linux[(en)]
  6. Релиз дистрибутива Linux Kodachi 8. Анонимность и безопасность []
  7. Выпуск дистрибутива Deepin 20.2, развивающего собственное графическое окружение []
  8. Бета-выпуск Ubuntu 21.04 []
  9. Embox v0.5.2 Released []
  10. Бета-версия Kubuntu 21.04 Hirsute Hippo доступна для загрузки []

Системное


  1. Выпуск системного менеджера systemd 248 [ 1, 2]

Специальное


  1. Stellarium 0.21.0 [ 1, 2]
  2. Новая версия Cygwin 3.2.0, GNU-окружения для Windows [ 1, 2]

Мультимедиа


  1. Выпуск программы для управления фотографиями digiKam 7.2 [ 1, 2, 3]
  2. GIMP 2.10.24 [ 1, 2]
  3. Выпущены аудиоэффекты LSP Plugins 1.1.30 []

Мобильные


Выпуск мобильной платформы LineageOS 18 на основе Android 11 [ 1, 2(en)]


Web


  1. Выпуск интегрированного набора интернет-приложений SeaMonkey 2.53.7 []
  2. Выпуск децентрализованной видеовещательной платформы PeerTube 3.1[ 1, 2]
  3. Proxmox Mail Gateway 6.4: защищает организации от спама, вирусов, троянов и фишинговых писем[(en)]

Для разработчиков


  1. Релиз браузерного движка WebKitGTK 2.32.0 []
  2. grex 1.2.0 генератор регулярных выражений []
  3. Выпуск графического тулкита GTK 4.2 [ 1, 2]
  4. Выпуск редактора CudaText 1.130.0 []

Пользовательское


moe v0.2.5.1 []


Игры


Компания Valve выпустила Proton 6.3, пакет для запуска Windows-игр в Linux [ 1, 2]


Что ещё посмотреть


  1. Дайджест от opensource.com: достижения в области программного обеспечения САПР с открытым исходным кодом; новый проект с открытым исходным кодом, направленный на внедрение Linux в Apple, и многое другое[(en)]
  2. Open-Source проект недели по версии SD Times: GitLab Protocol Fuzzer Community Edition [(en)]

Заключение


На этом всё, до следующего воскресенья!


Высказываю большое спасибо редакции и авторам OpenNET [], много новостных материалов и сообщений о новых релизах взято у них.


Если кто интересуется составлением дайджестов и имеет время и возможность помочь буду рад, пишите по контактам, указанным в моём профиле, или в личные сообщения.


Подписывайтесь на наш Telegram канал наш Telegram канал или RSS чтобы не пропустить новые выпуски FOSS News. Также мы есть во всех основных соцсетях:


  1. Fediverse []
  2. ВКонтакте []
  3. Facebook []
  4. Twitter []

[] Предыдущий выпуск

Подробнее..

FOSS News 65 дайджест материалов о свободном и открытом ПО за 511 апреля 2021 года

11.04.2021 22:06:33 | Автор: admin


Всем привет!


Продолжаем дайджесты новостей и других материалов о свободном и открытом ПО и немного о железе. Всё самое главное про пингвинов и не только, в России и мире. ИСП РАН займётся повышением защиты Linux и поддержанием отечественной ветки ядра Linux; Google одержал победу в разбирательстве с Oracle, связанном с Java и Android; KDE взял на себя продолжение сопровождения общедоступной ветки Qt 5.15; Signal добавит функцию платежей криптовалютой; Rust включён в число основных языков для разработки платформы Android; обзор и финальное мнение о дистрибутиве Deepin 20.2 и многое другое.


Оглавление


  1. Главное
    1. ИСП РАН займётся повышением защиты Linux и поддержанием отечественной ветки ядра Linux
    2. Google одержал победу в разбирательстве с Oracle, связанном с Java и Android
    3. KDE взял на себя продолжениесопровождения общедоступной ветки Qt 5.15
    4. Signal добавит функцию платежей криптовалютой
    5. Rust включили в список основных языков для разработки платформы Android
    6. Обзор и финальное мнение о дистрибутиве Deepin 20.2
  2. Короткой строкой
    1. Новости
      1. Мероприятия
      2. Внедрения
      3. Внутренние дела организаций
      4. Ядро и дистрибутивы
      5. Системное
      6. Специальное
      7. Обучение
      8. Мультимедиа
      9. Мобильные
      10. Безопасность
      11. DevOps
      12. AI & Data Science
      13. Web
      14. Для разработчиков
      15. Пользовательское
      16. Железо
      17. Разное
    2. Статьи
      1. Внедрения
      2. Внутренние дела организаций
      3. Ядро и дистрибутивы
      4. Системное
      5. Специальное
      6. Мультимедиа
      7. Безопасность
      8. DevOps
      9. AI & Data Science
      10. Web
      11. Для разработчиков
      12. Менеджмент
      13. Пользовательское
      14. Железо
      15. Разное
    3. Релизы
      1. Ядро и дистрибутивы
      2. Системное
      3. Специальное
      4. Базы данных
      5. Мультимедиа
      6. Безопасность
      7. DevOps
      8. Для разработчиков
      9. Пользовательское
      10. Игры
  3. Что ещё посмотреть
  4. Заключение

Главное


ИСП РАН займётся повышением защиты Linux и поддержанием отечественной ветки ядра Linux


Категория: Новости/Ядро и дистрибутивы



OpenNET пишет: Федеральная служба по техническому и экспортному контролю заключила с Институтом системного программирования Российской академии наук (ИСП РАН) контракт на выполнение работ по созданию технологического центра исследования безопасности операционных систем, созданных на базе ядра Linux. Контракт также подразумевает создание программно-аппаратного комплекса для центра исследования безопасности операционных систем. Сумма контракта 300 млн рублей. Дата завершения работ 25 декабря 2023 года.


Подробности [ 1, 2, 3]


Google одержал победу в разбирательстве с Oracle, связанном с Java и Android


Категория: Новости/Юридические вопросы



OpenNET пишет: Верховный суд США вынес решение, касающееся рассмотрения тянущегося с 2010 года судебного разбирательства Oracle против Google, связанного с использованием Java API в платформе Android. Суд высшей инстанции встал на сторону Google и признал, что использование Java API носит характер добросовестного использования (fair use). Суд согласился, что целью Google было создание другой системы, ориентированной на решение задач для иного вычислительного окружения (смартфонов), а разработка платформы Android помогла реализовать и популяризировать данную цель. История показывает, что существуют различные пути, в которых повторная реализация интерфейса может способствовать дальнейшему развитию компьютерных программ. Намерения Google были нацелены на достижение подобного творческого прогресса, поддержание которого является основной задачей авторского права.


Подробности [ 1, 2, 3(en), 4(en)]


KDE взял на себя продолжениесопровождения общедоступной ветки Qt 5.15


Категория: Новости/Для разработчиков



OpenNET пишет: В связи с ограничением компанией Qt Company доступа к репозиторию с исходными текстами LTS-ветки Qt 5.15 проект KDE приступил к поставке собственной коллекции патчей Qt5PatchCollection, нацеленной на поддержание на плаву ветки Qt 5 до завершения миграции сообщества на Qt6. KDE взял на себя сопровождение патчей к Qt 5.15, включающих исправления функциональных дефектов, крахов и уязвимостей. Патчи доступны в Git-репозиториях, соответствующих модулям Qt. В настоящее время коллекция включает только патчи, рецензированные и одобренные проектом Qt, но, в будущем могут быть приняты и патчи, по каким-то причинам не утверждённые в upstream.


Подробности [ 1, 2, 3]


Signal добавит функцию платежей криптовалютой


Категория: Новости/Web



Пользователь maybe_elf пишет в новостях на Хабре: Криптомессенджер Signal интегрирует поддержку ориентированной на конфиденциальность криптовалюты MobileCoin.

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


Подробности [ 1, 2, 3(en), 4(en)]


Rust включили в список основных языков для разработки платформы Android


Категория: Новости/Для разработчиков



Andrey_ib пишет в блоге компании Selectel на Хабре: На днях компания Google сделала важный шаг, объявив о включении языка программирования Rust в число языков, которые допускаются для разработки платформы Android. Да, еще в 2019 году компилятор Rust включили в дерево исходных текстов Android, но это была экспериментальная поддержка. Сейчас в Android планируется добавить первые компоненты на Rust, это будут новые реализации механизма межпроцессного взаимодействия Binder и Bluetooth-стека. Все это хорошо, но зачем весь этот сыр-бор с включением Rust? По словам представителей Google, Rust добавили в список языков разработки Android для усиления защищенности последнего, плюс для продвижения приемов безопасного программирования и повышения выявления проблем при работе с памятью в Android. Около 70% из всех опасных уязвимостей, которые выявлены в Android, вызваны ошибками при работе с памятью. Использование Rust дает возможность снизить риск появления уязвимостей, которые вызваны ошибками при работе с памятью, включая обращение к области памяти после ее освобождения и выход за границы буфера.


Подробности [ 1, 2(en), 3(en), 4(en)]


Обзор и финальное мнение о дистрибутиве Deepin 20.2


Категория: Статьи/Ядро и дистрибутивы



Популярный блогер Алексей Самойлов выпустил новое видео, на этот раз про Deepin: Некоторое время назад я делал большой обзор дистрибутива Deepin Linux, основанного на пакетной базе Debian и развиваемого китайской компанией Wuhan Deepin Technology, которая также развивает одноимённый рабочий стол. Я описал все детали дистрибутива, его историю, компоненты и так далее Сегодня я хотел бы немного уделить внимание его последней версии, в которой произошли существенные внешние изменения, да и внутренние тоже. Да и пожалуй пришло время сложить окончательное мнение о Deepin Linux.


Подробности []


Короткой строкой


Новости


Мероприятия


  1. Базальт СПО приглашает на конференцию Российское ПО драйвер развития цифровой образовательной среды []
  2. PHP-митапы этой весны: Казань, Нижний, Калининград, Ростов, другие города (и ссылки на трансляции) []
  3. На соревновании Pwn2Own 2021 совершены взломы Ubuntu, Chrome, Safari, Parallels и продуктов Microsoft []

Внедрения


Открытый исходный код ускоряет цифровую трансформацию в энергетическом секторе[(en)]


Внутренние дела организаций


  1. Проект Fedora официально выступил против Столлмана и прекратил все отношения с FSF []
  2. Проект Debian начинает голосование по позиции относительно Столлмана [ 1, 2]
  3. Google Cloud присоединяется к FinOps Foundation [(en)]
  4. WhiteSource получил финансирование в 75 миллионов долларов для повышения уровня и дополнительных проверок безопасности open-source проектов [(en)]
  5. GitHub завёл однократные донаты в Sponsors []
  6. Gitpod получил 13 миллионов долларов на развитие облачной платформы разработки программного обеспечения с открытым исходным кодом[(en)]
  7. Telegram начал возвращать долги инвесторам TON, не забравшим деньги сразу []
  8. Еженедельник OSM 558 []

Ядро и дистрибутивы


  1. В образы Arch Linux вернулся инсталлятор []
  2. KDE neon объявил о сворачивании LTS-сборок [ 1, 2]
  3. Проект FreeBSD перевёл порт ARM64 в число первичных и исправил три уязвимости []
  4. В ядре Linux 5.13 появится начальная поддержка CPU Apple M1 [ 1, 2(en), 3(en)]

Системное


  1. Новый sd-bus API от systemd []
  2. В Xwayland добавлена поддержка аппаратного ускорения на системах с GPU NVIDIA [ 1, 2]

Специальное


DolphinScheduler стал топ-проектом Apache фонда [(en)]


Обучение


SUSE объявляет о программе Cloud Native Nanodegree и спонсирует 300 стипендий[(en)]


Мультимедиа


Google опубликовал аудиокодек Lyra для передачи речи при плохом качестве связи []


Мобильные


Android 11 выйдет на Хромбуках [(en)]


Безопасность


  1. GitHub расследует, как инфраструктуру функции Actions использовали для майнинга [ 1, 2, 3(en)]
  2. Согласно новой жалобе, Google незаконно отслеживает пользователей Android[(en)]
  3. CyberArk запускает инструмент с открытым исходным кодом Kubesploit для тестирования контейнерных сред [(en)]
  4. Уязвимости в подсистеме eBPF ядра Linux []
  5. Устройства Windows и Linux подвергаются атаке нового червя-криптомайнера[(en)]

DevOps


  1. Tinkerbell, проект с открытым исходным кодом Equinix, представляет расширенные возможности[ 1(en), 2(en)]
  2. Apache сворачивает разработку кластерной платформы Mesos []

AI & Data Science


Google представляет TensorFlow Quantum 0.5.0: ожидаемые функции и обновления[(en)]


Web


  1. Chrome получает удобную возможность восстановления группы вкладок[(en)]
  2. В Google Chrome делиться страницами стало намного проще [(en)]
  3. В Firefox решено не удалять компактный режим и активировать WebRender для всех Linux-окружений []

Для разработчиков


  1. Все важные фичи и изменения в Python 3.10 []
  2. Microsoft представила превью Microsoft Build of OpenJDK [ 1, 2(en), 3]

Пользовательское


В KDE Neon реализованы офлайн-обновления []


Железо


  1. Открытое оборудование на замену Chromecast Audio[(en)]
  2. Open-source зарядка электромобилей [(en)]

Разное


Марк Цукерберг использует Signal, согласно телефонному номеру, просочившемуся в результате взлома Facebook[(en)]


Статьи


Внедрения


  1. В Ивановской медицинской академии 15 лет работают с ОС Альт Образование и полностью довольны результатом []
  2. 4 причины, по которым будущее облачного программного обеспечения, в открытом исходном коде[(en)]

Внутренние дела организаций


Как мы избежали рисков и собрали миллионы для нашего стартапа с открытым кодом [(en)]


Ядро и дистрибутивы


OS GNOME от GNOME не является дистрибутивом Linux для всех [Обзор][(en)]


Системное


Администрирование сервера. Настройка производительности с помощью команд управления процессом в Linux []


Специальное


  1. Продолжаем интернационализацию поиска по адресам с помощью Sphinx или Manticore. Теперь Metaphone []
  2. Азбука libp2p от Textile (или за что мы её любим) []
  3. Настройка сетевого стека Linux для высоконагруженных систем []
  4. Введение в работу со скриптами воFreeDOS [(en)]
  5. Руководство по библиотеке дифференциальной цифровой обработки сигналов (DDSP) с кодом Python [(en)]
  6. Настройка роутера с прошивкой DD-WRT на работу с L2TP на примере Билайна []
  7. Потоковая передача данных о событиях с помощью Ruddedstack[(en)]
  8. 5 признаков что вы пользуетесь groff [(en)]

Мультимедиа


  1. Лучшие программы интернет-радио в Linux []
  2. KODI: собираем удобный и функциональный медиацентр для дома. Часть 5. Яндекс.Музыка []

Безопасность


  1. ЭЦП по ГОСТ на GNU/Linux с помощью OpenSSL []
  2. Настройка уязвимых машин через Vagrant []
  3. Kleopatra: GnuPG в графической оболочке []
  4. Отчёт о компрометации git-репозитория и базы пользователей проекта PHP []
  5. О большом интересе Google к безопасности Linux[(en)]
  6. О защите внешних хранилищ с помощью LUKS системы шифрования в Linux [(en)]
  7. Отключаем прямой доступ к терминалу на арендованном сервере []

DevOps


  1. Миграция с Docker на containerd в среде Kubernetes []
  2. Худшие из так называемых лучших практик для Docker []
  3. Apache Kafka: основы технологии []
  4. Деплоим проект на Kubernetes в Mail.ru Cloud Solutions. Часть 1: архитектура приложения, запуск Kubernetes и RabbitMQ []
  5. Деплоим проект на Kubernetes в Mail.ru Cloud Solutions. Часть 2: настройка и запуск приложения для транскрибации видео []
  6. Как создать инфраструктуру в разных окружениях с помощью Terraform []
  7. Вы неправильно используете docker-compose []
  8. Изучаем внутренние компоненты Docker Объединённая файловая система []

AI & Data Science


  1. GPT-Neo: open-source замена GPT-3 [(en)]
  2. Полное руководство по нейросетевому нежесткому отслеживанию [(en)]
  3. Руководство по Giotto-TDA: высокопроизводительный набор инструментов для топологического машинного обучения [(en)]
  4. Введение в Featuretools: платформа Python для автоматизированного feature engineering [(en)]
  5. Используйте Apache Superset для создания отчетов бизнес-аналитики с открытым исходным кодом [(en)]
  6. PyTorch Profiler: основные функции и обновления [(en)]
  7. Руководство по Pykg2vec: библиотека Python для встраивания графов знаний [(en)]

Web


  1. Персональный интернет-архив без боли []
  2. Speedtest on premise []

Для разработчиков


  1. Определение состояния Memory Pressure в Linux []
  2. Создание TreeView и ComboBox в Glade []
  3. Nix: Что это и с чем это употреблять? []
  4. Перевод на русский язык документации по CPython 3.8.8 []
  5. Свободно экспериментируйте со своим кодом с Git worktree[(en)]
  6. Что такое cherry-pick в Git? [(en)]
  7. 5 команд для повышения уровня вашей работы с Git [(en)]
  8. Как и зачем хранить домашние каталоги пользователей в Git-репозиториях [ 1, оригинал 2(en)]
  9. Desktop. Не популярный, но все еще живой. Eclipse Rich Client Platform (RCP e4) []
  10. Linux Fu: встраивание файлов в сценарии оболочки[(en)]
  11. Объектно-ориентированное программирование с помощью Python [(en)]

Менеджмент


Чтобы быть открытым лидером, прислушивайтесь к своему сердцу[(en)]


Пользовательское


  1. Преобразование нескольких файлов Markdown в HTML или другие форматы в Linux[(en)]
  2. Красивое отображение сведений о процессоре в терминале Linux с помощью CPUFetch [(en)]
  3. Как дать разрешение Sudo пользователям в Ubuntu Linux [Совет для начинающих] [(en)]
  4. Почему мне нравится использовать bspwm в качестве своего оконного менеджера в Linux [(en)]

Железо


Умные часы с открытым исходным кодом[(en)]


Разное


  1. Что мотивирует разработчиков ПО с открытым исходным кодом?[(en)]
  2. 4 конкурентных преимущества, которые даёт открытый исходный код[(en)]
  3. Войны лоббистов и развитие BIM. Часть 5: BlackRock хозяин всех технологий. Как корпорации контролируют Open-source []

Релизы


Ядро и дистрибутивы


Выпуск платформы webOS Open-source Edition 2.10 []


Системное


  1. Выпуск репозитория пакетов pkgsrc 2021Q1 []
  2. Sway 1.6 (и wlroots 0.13.0) композитор для Wayland, совместимый с i3 []

Специальное


  1. Выпуск TeX-дистрибутива TeX Live 2021 [ 1, 2]
  2. Выпуск Wine 6.6 []
  3. Вышла библиотека YAFL []

Базы данных


Обновлены Docker-образы с clickhouse-exporter и clickhouse_fdw []


Мультимедиа


  1. Доступен видеопроигрыватель Haruna 0.6.0 []
  2. Выпуск мультимедиа-пакета FFmpeg 4.4 []
  3. Выпуск OpenToonz 1.5, открытого пакета для создания 2D-анимации []

Безопасность


  1. Обновление свободного антивирусного пакета ClamAV 0.103.2 с устранением уязвимостей []
  2. Выпуск GnuPG 2.3.0 [ 1, 2]

DevOps


  1. OpenNebula 6.0 Mutara: создание основы для интегрированного и автоматизированного корпоративного edge-облака[(en)]
  2. shell-operator v1.0.0: долгожданный релиз нашего проекта для Kubernetes-операторов []
  3. Выпущен Kubernetes 1.21: CronJobs наконец-то перешел в стабильную версию[(en)]

Для разработчиков


  1. Обновление Ruby 3.0.1 с устранением уязвимостей []
  2. Новый выпуск фреймворка для создания сетевых приложений Ergo 1.2 []
  3. Вышел релиз GitLab 13.10 с улучшениями для администраторов и управлением уязвимостями [ 1, 2]
  4. NativeScript 8.0 запускает новое руководство с лучшими практиками[(en)]
  5. Chipmunk: обновления []
  6. Проект LLVM представил HPVM 1.0, компилятор для CPU, GPU, FPGA и ускорителей []
  7. Доступен выпуск KDE Frameworks 5.81 []

Пользовательское


  1. Релиз оконного менеджера IceWM 2.3 [ 1, 2]
  2. Релиз программы для ведения списков дел Getting Things GNOME 0.5 []
  3. Релизы файлового менеджера Worker 4.4.0-4.80 []

Игры


  1. Выпуск игры Free Heroes of Might and Magic II 0.9.2 [ 1, 2]
  2. Релиз стратегической игры Warzone 2100 4.0 []

Что ещё посмотреть


  1. Видео: Ричард Столлман подробности. Manjaro 21, Установщик ArchLinux, Vivaldi 3.7 []
  2. Пишем 'Hello World' на WebAssembly, шпаргалка по Linux-команде sed, а также 15 самых востребованных ИТ-сертификатов года []
  3. Open-source проект недели по версии SD Times: C# standardization [(en)]

Заключение


На этом всё, до следующего воскресенья!


Высказываю большое спасибо редакции и авторам OpenNET [], много новостных материалов и сообщений о новых релизах взято у них.


Если кто интересуется составлением дайджестов и имеет время и возможность помочь буду рад, пишите по контактам, указанным в моём профиле, или в личные сообщения.


Подписывайтесь на наш Telegram канал наш Telegram канал или RSS чтобы не пропустить новые выпуски FOSS News. Также мы есть во всех основных соцсетях:


  1. Fediverse []
  2. ВКонтакте []
  3. Facebook []
  4. Twitter []

[] Предыдущий выпуск

Подробнее..

FOSS News 66 дайджест материалов о свободном и открытом ПО за 1218 апреля 2021 года

18.04.2021 22:17:02 | Автор: admin


Всем привет!


Продолжаем дайджесты новостей и других материалов о свободном и открытом ПО и немного о железе. Всё самое главное про пингвинов и не только, в России и мире.


Главные темы выпуска:


  1. Столлман признал ошибки и пояснил причины непонимания, Фонд СПО объяснил решение о возвращении RMS в совет директоров;
  2. создана некоммерческая организация Open-Source FPGA Foundation (OSFPGA) для продвижения ПЛИС с открытым исходным кодом;
  3. Amazon представил OpenSearch, форк платформы Elasticsearch;
  4. Linux Foundation запускает исследовательское подразделение для изучения экосистем с открытым исходным кодом и их воздействия;
  5. проблемы безопасности программ с открытым исходным кодом, соответствия лицензий и обслуживания распространены во всех отраслях;
  6. поддержка Rust для ядра Linux столкнулась с критикой Торвальдса;
  7. Inspur, крупнейший в Китае поставщик облачного оборудования, присоединяется к консорциуму по защите патентов с открытым исходным кодом;
  8. что означает решение API Верховного суда для открытого исходного кода и облачных технологий

И многое другое...



Оглавление


  1. Главное
    1. Столлман признал ошибки и пояснил причины непонимания, Фонд СПО объяснил решение о возвращении RMS в совет директоров
    2. Создана некоммерческая организация Open-Source FPGA Foundation (OSFPGA) для продвижения ПЛИС с открытым исходным кодом
    3. Amazon представил OpenSearch, форк платформы Elasticsearch
    4. Linux Foundation запускает исследовательское подразделение для изучения экосистем с открытым исходным кодом и их воздействия
    5. Проблемы безопасности программ с открытым исходным кодом, соответствия лицензий и обслуживания распространены во всех отраслях
    6. Поддержка Rust для ядра Linux столкнулась с критикой Торвальдса
    7. Inspur, крупнейший в Китае поставщик облачного оборудования, присоединяется к консорциуму по защите патентов с открытым исходным кодом
    8. Что означает решение API Верховного суда для открытого исходного кода и облачных технологий
  2. Короткой строкой
    1. Новости
      1. Мероприятия
      2. Открытие кода и данных
      3. Дела организаций
      4. Ядро и дистрибутивы
      5. Мобильные
      6. Безопасность
      7. DevOps
      8. AI & Data Science
      9. Web
      10. Для разработчиков
      11. Пользовательское
    2. Статьи
      1. Внедрения
      2. Дела организаций
      3. Ядро и дистрибутивы
      4. Системное
      5. Специальное
      6. Базы данных
      7. Мультимедиа
      8. Безопасность
      9. DevOps
      10. AI & Data Science
      11. Web
      12. Для разработчиков
      13. Менеджмент
      14. Пользовательское
    3. Релизы
      1. Ядро и дистрибутивы
      2. Системное
      3. Специальное
      4. Мультимедиа
      5. AI & Data Science
      6. Web
      7. Для разработчиков
      8. Пользовательское
  3. Что ещё посмотреть
  4. Заключение

Главное


Столлман признал ошибки и пояснил причины непонимания, Фонд СПО объяснил решение о возвращении RMS в совет директоров


Категория: Новости/Дела организаций



OpenNET пишет: Ричард Столлман признал, что совершал ошибки, о которых сожалеет, призвал не перекладывать недовольство его действиями на Фонд СПО и попытался пояснить причины своего поведения. По его словам, он с детства не умел улавливать тонкие намёки, на которые реагировали другие люди. Столлман признаётся, что не сразу осознал то, что его стремление быть прямолинейным и честным в своих высказываниях, приводит к негативной реакции некоторых людей, доставляет неудобство и даже может оскорбить кого-то. Но это было лишь неведение, а не намеренное желанием оскорбить других. Столлман также пояснил своё отношение к Мински и Эпштейну, неверно истолкованные некоторыми. Он считает Эпштейна преступником, который должен быть наказан, и был удивлён, когда узнал, что его действия по защите Марвина Мински воспринимаются как оправдание действий Эпштейна. Столлман попытался защитить Мински, которого он мало знал, после того, как кто-то посчитал, что он виновен, как и Эпштейн. Несправедливое обвинение разозлило и возмутило Столлмана, и он бросился на защиту Мински, что сделал бы и в отношении любого другого. Столлман считает, что, говоря о несправедливом обвинении Мински, поступил правильно, но его ошибкой было то, что он не учёл, что обсуждение могло восприниматься в контексте несправедливости к женщинам, которую учинил Эпштейн. Одновременно Фонд СПО пояснил мотивы, по которым было принято возвращение Столлмана в совет директоров. Утверждается, что члены совета директоров и участники с правом голоса одобрили возвращение Столлмана после нескольких месяцев тщательных обсуждений. Решение было обусловлено огромной технической, юридической и исторической проницательностью Столлмана в вопросах свободного ПО. Фонду СПО не хватало мудрости Столлмана и его чувствительности к тому, как технологии могут влиять на укрепление и ущемление основных прав человека. Упоминаются также обширные связи Столлмана, его красноречие, философский подход и убеждённость в правильности идей СПО.


И ещё важная новость в тему, тоже от OpenNET Завершилось общее голосование относительно возможной поддержки проектом Debian петиции с требованием отставки совета директоров FSF и отстранения Столлмана. Судя по рассчитанным автоматически предварительным итогам голосования, победил седьмой пункт бюллетеня: проект не будет делать каких-либо публичных заявлений относительно FSF и Столлмана, участники проекта вольны поддержать любую петицию по этому поводу.


Подробности:


  1. Столлман признал ошибки и пояснил причины непонимания []
  2. Richard M. Stallman обратился с объяснениями своего неподобающего поведения []
  3. Проект Debian выбрал нейтральную позицию относительно петиции против Столлмана []

Создана некоммерческая организация Open-Source FPGA Foundation (OSFPGA) для продвижения ПЛИС с открытым исходным кодом


Категория: Новости/Дела организаций



Пользователь denis-19 пишет в новостях на Хабре: 8 апреля 2021 года независимые разработчики сообщили о создании некоммерческой организации Open Source FPGA Foundation (OSFPGA) для продвижения и повсеместного внедрения программируемых логических интегральных схем (ПЛИС) с открытым исходным кодом. Проект OSFPGA создан для демократизации и продвижения технологии FPGA путем предоставления открытой и ориентированной на пользователей и разработчиков среды для совместной работы. Инициаторы проекта пообещали в скором времени агрегацию и создание набора бесплатных инструментов для работы с FPGA, которые будут соответствовать отраслевым стандартам и иметь открытый исходный код, например, под лицензией MIT, а также обеспечивать быстрое создание прототипов для микросхем FPGA и автоматизированную поддержку EDA (Electronic Design Automation, автоматизация проектирования электроники). В рамках проекта будет представлены бесплатные образовательные курсы для развития технологий FPGA среди продвинутых пользователей и разработчиков.


Подробности:


  1. Создана некоммерческая организация Open-Source FPGA Foundation (OSFPGA) для продвижения ПЛИС с открытым исходным кодом []
  2. Инициатива по развитию открытых проектов для FPGA []

Amazon представил OpenSearch, форк платформы Elasticsearch


Категория: Новости/DevOps


OpenNET пишет: Компания Amazon объявила о создании проекта OpenSearch, в рамках которого создан форк платформы поиска, анализа и хранения данных Elasticsearch, а также связанного с платформой web-интерфейса Kibana. Код распространяется под лицензией Apache 2.0. В будущем планируется переименовать службу Amazon Elasticsearch Service в Amazon OpenSearch Service. OpenSearch ответвлён от кодовой базы Elasticsearch 7.10.2. Официально работа над форком началась ещё 21 января, после чего была проведена чистка ответвлённого кода от компонентов, распространяемых не под лицензией Apache 2.0, и замена элементов бренда Elasticsearch на OpenSearch. В текущем виде код пока находится на стадии альфа-тестирования, а через несколько недель ожидается первый бета-выпуск. Стабилизировать кодовую базу и сделать OpenSearch готовым для применения в рабочих системах планируется к середине 2021 года. OpenSearch будет развиваться как совместный проект, разрабатываемый при участии сообщества. Отмечается, что куратором проекта в настоящее время выступает компания Amazon, но в дальнейшем совместно с сообществом будет выработана оптимальная стратегия управления, принятия решений и взаимодействия участников, вовлечённых в разработку Поводом для создания форка стал перевод исходного проекта Elasticsearch на несвободную лицензию SSPL (Server Side Public License).


Подробности:


  1. Amazon представил OpenSearch, форк платформы Elasticsearch []
  2. AWS forks Elasticsearch into an open source project once again [(en)]
  3. Amazon announces OpenSearch, an open-source fork of Elasticsearch and Kibana [(en)]
  4. Logz.io announces support for OpenSearch project, an open source fork of Elasticsearch and Kibana [(en)]

Linux Foundation запускает исследовательское подразделение для изучения экосистем с открытым исходным кодом и их воздействия


Категория: Новости/Дела организаций



Linux Foundation пишет: Linux Foundation, некоммерческая организация, обеспечивающая массовые инновации через открытый исходный код, сегодня объявила о новом подразделении Linux Foundation Research, которое расширит понимание проектов с открытым исходным кодом, динамики экосистемы и воздействия, с невиданной ранее информацией об эффективности открытого исходного кода как средства решения многих насущных мировых проблем. Посредством серии исследовательских проектов и связанного с ними контента Linux Foundation Research будет использовать обширный репозиторий Linux Foundation с данными, инструментами и сообществами по отраслям и технологиям. В методологии будут применяться количественные и качественные методы для создания беспрецедентной сети знаний, которая принесёт пользу глобальному сообществу открытого исходного кода, академическим кругам и промышленности.


Подробности:


  1. The Linux Foundation launches research division to explore open source ecosystems and impact [(en)]
  2. Linux Foundation creates research division to study open source impact [(en)]
  3. Linux Foundation launches R&D division to investigate open source opportunities [(en)]
  4. New Linux research division launches to explore open source ecosystems [(en)]
  5. Linux Foundation Research to broaden understanding of open source ecosystem and impact [(en)]

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


Категория: Новости/Безопасность



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


Подробности:


  1. Synopsys: 84% of codebases contain an open source vulnerability [(en)]
  2. Open source security, license compliance, and maintenance issues are pervasive in every industry [(en)]

Поддержка Rust для ядра Linux столкнулась с критикой Торвальдса


Категория: Новости/Ядро и дистрибутивы



OpenNET пишет: Линус Торвальдс провёл рецензирование патчей c реализацией возможности создания драйверов на языке Rust для ядра Linux, и высказал некоторые критические замечания. Наибольшие претензии вызвала потенциальная возможность ухода в panic в ошибочных ситуациях, например, в ситуации нехватки памяти, когда операции динамического распределения памяти, в том числе и внутри ядра, могут завершиться ошибкой. Торвальдс заявил, что подобный подход в ядре принципиально недопустим и при непонимании этого момента он может полностью отвернуть (entirely NAK'ed) любой код, который попытается использовать подобный подход. С другой стороны, разработчик, занимающийся патчами, согласился с данной проблемой и считает её решаемой. Ещё одной проблемой стали попытки использования вычислений с плавающей запятой или 128-битными типами, что не является допустимым для таких окружений, как ядро Linux. Это оказалось более серьёзной проблемой, так как в данный момент базовая (core) библиотека Rust неделима и представляет собой один большой blob в ней нет возможности запросить только некоторые из возможностей, предотвратив использование той или иной проблемной функциональности. Решение проблемы может потребовать внесения изменений в компиляторе rust и библиотеки, при том, что на данный момент у команды ещё нет стратегии, как реализовать модульность библиотек языка.


Подробности:


  1. Поддержка Rust для ядра Linux столкнулась с критикой Торвальдса []
  2. Линус Торвальдс раскритиковал Rust в ядре. []
  3. Линус Торвальдс остался недоволен рядом моментов в использовании Rust для Linux []

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


Категория: Новости/Дела организаций


ZDNet пишет: Open Invention Network (OIN) защищает права интеллектуальной собственности (IP) разработчиков Linux и программного обеспечения с открытым исходным кодом от патентных троллей и тому подобного. Это глобальная борьба, и теперь у OIN появился новый влиятельный союзник в Китае: Inspur. Inspur ведущий мировой поставщик и ведущий поставщик инфраструктуры центров обработки данных, облачных вычислений и серверов искусственного интеллекта в Китае. Хотя Inspur не так широко известен, как Lenovo, он входит в тройку мировых производителей серверов. Будучи ведущей серверной компанией, почти вся её работа связана с Linux и программным обеспечением с открытым исходным кодом. Что касается серверов, облаков и искусственного интеллекта, сегодня действительно нет работы, которая работала бы без Linux. Таким образом, Inspur имеет все основания взять на себя обязательство по правовой защите программного обеспечения с открытым исходным кодом (OSS).


Подробности [(en)]


Что означает решение API Верховного суда для открытого исходного кода и облачных технологий


Категория: Статьи/Юридические вопросы



TFiR выпустил новое видео в серии Insights, в котором Роб Хиршфельд, генеральный директор RackN, вместе со Свапнилом Бхартия подробно изучают недавнее постановление Верховного Суда США по иску Oracle против Google о том, могут ли API быть защищены авторским правом или нет.


Подробности [(en)]


Наша недавняя новость об этом решении суда []


Короткой строкой


Новости


Мероприятия


29 апреля состоится Online Monitoring Meetup, Kubernetes: мониторинг c помощью Prometheus []


Открытие кода и данных


Google опубликовал язык логического программирования Logica []


Дела организаций


  1. 'Сообщество разработчиков Perl покинул один из лидеров проекта[ 1, 2]
  2. Mozilla сворачивает разработку DeepSpeech и объявляет о программе грантов [ 1(en), 2]
  3. Red Hat и NEC Corporation совместно работают над созданием решений 5G на платформе Red Hat OpenShift[ 1(en), 2(en)]
  4. Почему Crate.io вернулся к своим корням с открытым исходным кодом [(en)]
  5. Telegram может выйти на IPO в течение двух лет []
  6. Linux Foundation поддерживает сотрудничество между крупнейшими страховыми компаниями мира[(en)]
  7. NVIDIA инвестирует 1.5 млн долларов в проект Mozilla Common Voice []
  8. Rackspace использует возможности веб-браузера машинного обучения в рамках партнерства с Brave[(en)]
  9. IBM присоединяется к рабочей группе Eclipse Adoptium [(en)]
  10. Инициатива GNU Assembly, продвигающая новую модель управления проектом GNU []
  11. Vapor IO и VMware объявляют об альянсе Open Grid Alliance для ускорения развития Интернета[ 1(en), 2(en)]
  12. Компания Qt укрепляет свои позиции лидера на рынке с приобретением froglogic GmbH [(en)]
  13. Еженедельник OSM 559 []

Ядро и дистрибутивы


  1. Дата выпуска Linux 5.12 может быть отложена[(en)]
  2. Компания Google представила патчи многоуровневого LRU для Linux []
  3. Представлены патчи для рандомизации адресов стека ядра Linux при системных вызовах []
  4. Google поддерживает внедрение Rust в ядро Linux[(en)]

Мобильные


  1. Функции Android 10, дата выпуска, пасхалки и все, что вам нужно знать[(en)]
  2. Android 12 может значительно упростить работу с многозадачностью [(en)]
  3. В Android появится функция, которая напоминает не забываться в смартфоне при ходьбе []

Безопасность


  1. Уязвимость нулевого дня Google Chrome и Microsoft Edge опубликовали в Twitter [ 1, 2(en)]
  2. Уязвимости во FreeBSD, IPnet и Nucleus NET, связанные с ошибками при реализации сжатия в DNS []
  3. Даже лучший антивирус не смог бы защитить вас от этого вредоносного ПО для Linux и macOS[(en)]
  4. Множественные недостатки безопасности ставят под угрозу 3,5 миллиона веб-сайтов WordPress [(en)]
  5. Infection Monkey: инструмент с открытым исходным кодом, позволяющий оценивать безопасность рабочих окружений на основе AWS [(en)]
  6. Google пытается исправить очередной раунд уязвимостей Chrome [(en)]

DevOps


  1. Docker получил поддержку Apple M1 [ 1(en), 2]
  2. Canonical объявляет об обновлениях для оптимизации MicroK8s[(en)]

AI & Data Science


Tecton объединяется с основателем магазина функций машинного обучения Feast с открытым исходным кодом[(en)]


Web


  1. В Firefox 90 будет удалён код, обеспечивающий поддержку FTP [ 1, 2, 3(en)]
  2. Расширение DuckDuckGo для Chrome блокирует новую технику отслеживания FLoC от Google []
  3. Что нового в Drupal в 2021 году?[(en)]
  4. Brave объяснила, почему отключает FLoC от Google в своем браузере []
  5. Google упрощает восстановление закрытых вкладок в Chrome[(en)]
  6. Firefox 88 активирует аппаратное ускорение отрисовки страниц в Plasma []

Для разработчиков


  1. Оазис для разработчика: Базальт СПО и БАРС Груп создали российскую среду сборки прикладного ПО []
  2. Eclipse Adoptium разрабатывает Temurin для поддержки выпусков сборок OpenJDK[(en)]
  3. IBM, Red Hat и Cobuilder создают платформу OpenBuilt [(en)]

Пользовательское


  1. Компания System76 объявила о разработке пользовательского окружения COSMIC [ 1, 2]
  2. На этой неделе в KDE: комнаты в Wayland []
  3. На этой неделе в KDE: HamburgerMenu и приятные исправления []

Статьи


Внедрения


Как открытый код улучшает процессы управления электроэнергетикой[(en)]


Дела организаций


  1. Интервью с Хилари Картер, вице-президентом по исследованиям Linux Foundation[(en)]
  2. Прекратите рассматривать открытый исходный код как бизнес-модель. Это ломает его [(en)]

Ядро и дистрибутивы


  1. Установка Garuda Linux []
  2. Классификация Linux-дистрибутивов[(en)]
  3. Лучшие дистрибутивы Linux для обеспечения конфиденциальности и безопасности в 2021 году [(en)]

Системное


5 причин, по которым сисадминам нравится systemd[(en)]


Специальное


  1. Создавайте и редактируйте файлы EPUB в Linux с помощью Sigil[(en)]
  2. Сделайте ваши данные более удобными с помощью EDA [(en)]
  3. 10 лучших онлайн-ресурсов для изучения NumPy [(en)]

Базы данных


Взгляд со стороны: OLAP + OLTP = PostgreSQL? [(en)]


Мультимедиа


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


Безопасность


  1. 6 инструментов с открытым исходным кодом и советы по защите Linux-сервера для начинающих[(en)]
  2. Зашифруйте свои файлы с помощью VeraCrypt [(en)]
  3. Создание зашифрованного хранилища файлов в Linux с помощью LUKS [(en)]
  4. Linux Unified Key Setup: как защитить флэшки и внешние диски от взлома []
  5. Hardening на практике []
  6. SSH, пользовательский режим, TCP/IP и WireGuard []

DevOps


  1. Traefik, docker и docker registry []
  2. Приключения с Ansible: уроки, извлеченные из практики []
  3. Установка полноценного кластера Kubernetes на основе k3s []
  4. Используем Terraformer для адаптации действующей инфраструктуры в AWS для деплоев с Terraform []
  5. Устранение сбоев службы имен в systemd с помощью Ansible [(en)]
  6. 20 лучших практик по работе с Docker-файлами []
  7. Рекомендации по запуску приложений в OpenShift Service Mesh []
  8. Apache Kafka скоро без ZooKeeper []
  9. Деплоим проект на Kubernetes в Mail.ru Cloud Solutions. Часть 3: мониторинг приложения, CI/CD и собственный Helm-чарт []
  10. Об упрощении использования Kubernetes[(en)]

AI & Data Science


  1. Начало работы с OpenCV в Python[(en)]
  2. Взаимодействие с графическим интерфейсом пользователя в реальном времени с OpenCV в Python [(en)]

Web


  1. Как использовать диспетчер вкладок Chrome, чтобы привести в порядок ваш браузер[(en)]
  2. Пользователи Chrome, проверьте, отслеживает ли Google вас с помощью новой целевой рекламы [(en)]
  3. Общее введение в I2P []
  4. Brave последний крупный интернет-игрок, отказавшийся от альтернативы cookie от Google[(en)]

Для разработчиков


  1. Чему программисты на Java должны научиться в 2021 году[(en)]
  2. Обсуждение того, как повысить эффективность управления памятью Linux [(en)]
  3. Сделайте игру Жизнь Конвея в WebAssembly [(en)]
  4. Повышаем качество кода с Dart Code Metrics []
  5. Коммиты это снимки, а не различия []
  6. 4 совета по переключению контекста в Git[(en)]
  7. Пошаговое введение в декораторы Python [(en)]
  8. Как портировать SDK Flutter на ТВ-приставку для разработки и запуска приложений Android TV []
  9. В чем именно был смысл [ x$var = xval ]? []

Менеджмент


3 вещи, которые делают великие лидеры в области открытого исходного кода[(en)]


Пользовательское


  1. Об отправке отсканированных изображений на компьютер с Linux по вашей сети[(en)]
  2. 3 важных шпаргалки по Linux для повышения производительности [(en)]
  3. Почему в Vim для навигации используются клавиши hjkl []
  4. Играйте в забавную математическую игру с командами Linux[(en)]

Релизы


Ядро и дистрибутивы


  1. Slackware 15 перешёл на стадию бета-тестирования [ 1, 2]
  2. Релиз FreeBSD 13.0 [ 1, 2]
  3. Выпуск модуля LKRG 0.9.0 для защиты от эксплуатации уязвимостей в ядре Linux []

Системное


Обновление X.Org Server 1.20.11 с устранением уязвимости []


Специальное


Выпуск гипервизора Xen 4.15 []


Мультимедиа


Релиз мультимедиа фреймворка FFmpeg 4.4 []


AI & Data Science


Релиз Julia 1.6: основные обновления и новейшие функции[(en)]


Web


  1. Выпуск nginx 1.19.10 [ 1, 2]
  2. Релиз Chrome 90 [ 1, 2, 3(en)]
  3. Обновление Chrome 89.0.4389.128 с устранением 0-day уязвимости. Chrome 90 задерживается []

Для разработчиков


  1. Релиз nim 1.4.6 []
  2. Релиз набора компиляторов LLVM 12.0 []

Пользовательское


Выпуск графического окружения LXQt 0.17 [ 1, 2]


Что ещё посмотреть


  1. Видео: Deepin 20.2, Kodachi 8, закрытие KDE neon LTS, Audacity 3 []
  2. SD Times Open-Source Project of the Week: Qiskit [(en)]

Заключение


На этом всё, до следующего воскресенья!


Высказываю большое спасибо редакции и авторам OpenNET [], много новостных материалов и сообщений о новых релизах взято у них.


Если кто интересуется составлением дайджестов и имеет время и возможность помочь буду рад, пишите по контактам, указанным в моём профиле, или в личные сообщения.


Подписывайтесь на наш Telegram канал наш Telegram канал или RSS чтобы не пропустить новые выпуски FOSS News. Также мы есть во всех основных соцсетях:


  1. Fediverse []
  2. ВКонтакте []
  3. Facebook []
  4. Twitter []

[] Предыдущий выпуск

Подробнее..

Новый sd-bus API от systemd

09.04.2021 00:16:01 | Автор: admin

В новом выпуске systemd v221 мы представляем API sd-bus, поставляемый со стабильной версией systemd. sd-bus - это наша минимальная библиотека D-Bus IPC на языке программирования Си, поддерживающая в качестве бэкэндов как классическую D-Bus на основе сокетов, так и kdbus. Библиотека была частью systemd в течение некоторого времени, но использовалась только внутри проекта, поскольку мы хотели свободно вносить изменения в API, не затрагивая внешних пользователей. Однако теперь, начиная с v221, мы уверены, что сделали стабильный API.

В этом посте я предоставляю обзор библиотеки sd-bus, краткое повторение основ D-Bus и его концепций, а также несколько простых примеров того, как писать клиенты и сервисы D-Bus с её помощью.

Что такое D-Bus?

Давайте начнем с быстрого напоминания, что на самом деле представляет собой D-Bus. Это мощная универсальная система IPC для Linux и других операционных систем. Он определяет такие понятия, как шины, объекты, интерфейсы, методы, сигналы, свойства. Она предоставляет вам детальный контроль доступа, богатую систему типов, лёгкое обнаружение, самодиагностику, мониторинг, надежную многоадресную рассылку, запуск служб, передачу файловых дескрипторов и многое другое. Есть привязки для многих языков программирования, которые используются в Linux.

D-Bus является основным компонентом систем Linux более 10 лет. Это, безусловно, наиболее широко распространенная локальная система IPC высокого уровня в Linux. С момента создания systemd - это была система IPC, в которой она предоставляла свои интерфейсы. И даже до systemd это была система IPC, которую Upstart использовал для своих интерфейсов. Она используется GNOME, KDE и множеством системных компонентов.

К D-Bus относится как спецификация, так и эталонной реализация. Эталонная реализация предоставляет как компонент сервера шины, так и клиентскую библиотеку. Хотя существует множество других популярных последующих реализаций клиентской библиотеки, как для Си, так и для других языков программирования, единственная широко используемая серверная сторона - это та, которая указана в эталонной реализации. (Однако проект kdbus работает над предоставлением альтернативы этой реализации сервера в качестве компонента ядра.)

D-Bus в основном используется как локальный IPC поверх сокетов AF_UNIX. Однако протокол также можно использовать поверх TCP/IP. Он изначально не поддерживает шифрование, поэтому использование D-Bus напрямую через TCP обычно не является хорошей идеей. Можно объединить D-Bus с транспортом, таким как ssh, чтобы защитить его. systemd использует это, чтобы сделать многие из своих API доступными удаленно.

Часто задаваемый вопрос о D-Bus: почему он вообще существует, учитывая, что сокеты AF_UNIX и FIFO уже есть в UNIX и долгое время успешно используются. Чтобы ответить на этот вопрос, давайте сравним D-Bus с популярными сегодня веб-технологиями: AF_UNIX/FIFO для D-Bus тоже самое, что TCP для HTTP/REST. В то время, как сокеты AF_UNIX/FIFO только перекладывают необработанные байты между процессами, D-Bus определяет фактическую кодировку сообщений и добавляет такие концепции, как транзакция вызова методов, система объектов, механизмы безопасности, многоадресная передача сообщений и многое другое.

Из нашего более чем 10-летнего опыта работы с D-Bus сегодня мы знаем, что, хотя есть некоторые области, в которых мы можем что-то улучшить (и мы работаем над этим, как с kdbus, так и с sd-bus), в целом это очень хорошо спроектированная система, которая выдержала испытание временем, выдержала хорошо и получила широкое признание. Если бы сегодня мы сели и разработали совершенно новую систему IPC, включающую весь опыт и знания, полученные с помощью D-Bus, я уверен, что результат был бы очень близок к тому, что уже есть в D-Bus.

Короче говоря: D-Bus великолепен. Если вы разрабатываете проект для Linux и вам нужен локальный IPC, то он должен быть вашим первым выбором. Не только потому, что D-Bus хорошо спроектирован, но и потому, что есть не так много альтернатив, которые могли бы покрыть аналогичную функциональность.

Для чего подходит sd-bus?

Давайте обсудим, для чего написана библиотека sd-bus, как она соотносится с другими библиотеками D-Bus и почему она может стать библиотекой для вашего проекта.

Для языка программирования Си существуют две популярные библиотеки D-Bus: libdbus, поставляемая в эталонной реализации D-Bus, а также GDBus, компонент GLib, низкоуровневой инструментальной библиотеки GNOME.

Из этих двух библиотек libdbus намного старше, так как она была написана во время составления спецификации. Она была написана с упором на то, чтобы быть переносимой и полезной в качестве серверной части для привязок языков более высокого уровня. Обе эти цели требовали, чтобы API был очень универсальным, в результате чего получился относительно сложный в использовании API в котором отсутствуют элементы, которые делают его легким и интересным для использования из Си. Он предоставляет строительные блоки, но в нём мало инструментов, чтобы упростить строительство дома из них. С другой стороны, библиотека подходит для большинства случаев использования (например, она OOM безопасна, что делает ее подходящей для написания системного программного обеспечения самого низкого уровня) и переносима в операционные системы, такие как Windows или более экзотические UNIX.

GDBus - это гораздо более новая реализация. Она была написана после значительного опыта использования оболочки GLib/GObject вокруг libdbus. GDBus реализована с нуля, не имеет общего кода с libdbus. Её дизайн существенно отличается от libdbus, он содержит генераторы кода, чтобы упростить размещение объектов GObject на шине или взаимодействие с объектами D-Bus как с объектами GObject. Она переводит типы данных D-Bus в GVariant, который является мощным форматом сериализации данных GLib. Если вы привыкли к программированию в стиле GLib, тогда вы почувствуете себя как дома, использовать сервисы и клиенты D-Bus с её помощью намного проще, чем с libdbus.

С sd-bus мы теперь предоставляем третью реализацию, не разделяющую кода ни с libdbus, ни с GDBus. Для нас основное внимание было уделено обеспечению своего рода промежуточного звена между libdbus и GDBus: низкоуровневой библиотекой Си, с которой действительно интересно работать, которая имеет достаточно синтаксического сахара, чтобы упростить создание клиентов и сервисов, но, с другой стороны, более низкоуровневой, чем GDBus/GLib/GObject/GVariant. Чтобы использовать её в различных компонентах системного уровня systemd, она должен быть компактной и безопасной для OOM. Еще одним важным моментом, на котором мы хотели сосредоточиться, была поддержка бэкэнда kdbus с самого начала в дополнение к транспорту сокетов исходной спецификации D-Bus (dbus1). Фактически, мы хотели спроектировать библиотеку ближе к семантике kdbus, чем к dbus1, где-то были бы отличия, но при этом чтобы хорошо охватывались оба транспорта. В отличие от libdbus или GDBus, переносимость не является приоритетом для sd-bus, вместо этого мы стараемся максимально использовать платформу Linux и раскрывать конкретные концепции Linux везде, где это выгодно. Наконец, производительность также была проблемой (хотя и второстепенной): ни libdbus, ни GDBus не побьют рекорды скорости. Мы хотели улучшить производительность (пропускную способность и задержку), но для нас важнее простота и правильность. Мы считаем, что результат нашей работы вполне соответствует нашим целям: библиотеку приятно использовать, она поддерживает kdbus и сокеты в качестве серверной части, относительно минимальна, а производительность существенно выше, чем у libdbus и GDBus.

Вот краткие рекомендации, чтобы решить, какой из трех API использовать для вашего проекта на Си:

  • Если вы разрабатываете проект GLib/GObject, GDBus определенно будет вашим лучшим выбором.

  • Если для вас важна переносимость на ядра, отличные от Linux, включая Windows, Mac OS и другие UNIX, используйте либо GDBus (что более или менее означает использование GLib/GObject), либо libdbus (что требует большого количества ручной работы).

  • В противном случае я бы рекомендовал использовать sd-bus.

(Я не рассматриваю здесь C++, речь идет только о простом Си. Но обратите внимание: если вы используете Qt, то QtDBus является предпочтительным API D-Bus, являясь оболочкой для libdbus.)

Введение в концепции D-Bus

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

  • Шина - это то место, где вы ищете услуги IPC. Обычно существует два типа шин: системная шина, одна на систему, на которой располагаются системные службы; и пользовательская шина, одна на каждого пользователя, на которой располагаются пользовательские службы, такие как адресная книга или почтовый клиент. (Первоначально пользовательская шина была на самом деле сеансовой это значит, что вы получаете несколько шин, если входите в систему много раз как один и тот же пользователь, и в большинстве настроек так и остается, но мы работаем над истинной пользовательской шиной, которая существует в единственном экземпляре для каждого пользователя в системе, независимо от того, сколько раз этот пользователь входит в систему.)

  • Сервис - это программа, которая предлагает некоторый IPC API на шине. Служба идентифицируется именем в обратной нотации доменного имени. Таким образом, служба org.freedesktop.NetworkManager на системной шине - это то место, где доступны API-интерфейсы NetworkManager, а org.freedesktop.login1 на системной шине - это место, где доступны API-интерфейсы systemd-logind.

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

  • Путь к объекту - это идентификатор объекта в определенной службе. В некотором смысле это сравнимо с указателем Си, поскольку именно так вы обычно ссылаетесь на объект Си, если пишите объектно-ориентированные программы на Си. Однако указатели Си - это просто адреса памяти, и передача адресов памяти другим процессам не имеет смысла, поскольку они относятся к адресному пространству сервиса и клиент не может получить достап к ним. Таким образом, разработчики D-Bus придумали концепцию пути к объекту, который представляет собой просто строку, которая выглядит как путь в файловой системе. Пример: /org/freedesktop/login1 - это путь к объекту менеджер сервиса org.freedesktop.login1 (который, как мы помним из вышеизложенного, является сервисом systemd-logind). Поскольку пути к объектам структурированы как пути файловой системы, их можно аккуратно упорядочить в виде дерева и получить полное дерево объектов. Например, вы найдете все пользовательские сеансы, которыми управляет systemd-logind в ветке /org/freedesktop/login1/session, к примеру: /org/freedesktop/login1/session/_7, /org/freedesktop/login1/session./_55 и так далее. Как сервисы именуют свои объекты и размещают их в дереве, полностью зависит от их разработчиков.

  • Каждый объект, который определяется путем, имеет один или несколько интерфейсов. Интерфейс - это набор сигналов, методов и свойств (вместе называемых членами), которые связаны друг с другом. Концепция интерфейсов D-Bus на самом деле в значительной степени идентична тому, что вы знаете из языков программирования, таких как Java, которые её поддерживают. Какие интерфейсы реализует объект, определяют разработчики сервиса. Имена интерфейсов имеют обратную нотацию доменных имен, как и имена сервисов. (Да, это, по общему признанию, сбивает с толку, поскольку для простых сервисов довольно часто встречается использование строки имени сервиса также в качестве имени интерфейса.) Тем не менее, несколько интерфейсов стандартизированы, и вы найдете их доступными для многих объектов, реализуемых различными сервисами. В частности, это org.freedesktop.DBus.Introspectable, org.freedesktop.DBus.Peer и org.freedesktop.DBus.Properties.

  • Интерфейс может содержать методы. Слово метод более или менее просто причудливое определение для функции, и этот термин используется почти так же в объектно-ориентированных языках, таких как Java. Наиболее распространенное взаимодействие между узлами D-Bus заключается в том, что один узел вызывает метод на другом узле и получает ответ. Метод D-Bus принимает и возвращает несколько параметров. Параметры передаются безопасным для типов способом, а информация о типе включается в данные интроспекции, которые вы можете запросить у каждого объекта. Обычно имена методов (и других типов членов) следуют синтаксису CamelCase. Например, systemd-logind предоставляет метод ActivateSession в интерфейсе org.freedesktop.login1.Manager, который доступен в объекте /org/freedesktop/login1 сервиса org.freedesktop.login1.

  • Сигнатура описывает набор параметров, которые принимает или возвращает функция (или сигнал, свойство, см. ниже). Это последовательность символов, каждый из которых определяет тип соответствующего параметра. Набор доступных типов довольно мощный. Например, есть более простые типы, такие как s для строки или u для 32-битного целого числа, но также и сложные типы, такие как as для массива строк или a(sb) для массива структур, состоящих из одной строки и одного логического значения. См. Спецификацию D-Bus, где приводится полное описание системы типов. Упомянутый выше метод ActivateSession принимает одну строку в качестве параметра (сигнатура параметра, следовательно, равна s) и ничего не возвращает (сигнатура возврата, следовательно, является пустой строкой). Конечно, сигнатура может быть намного сложнее, другие примеры см. ниже.

  • Сигнал - это еще один тип элемента, определяемый в объектной системе D-Bus. Как и у метода, у него есть сигнатура. Однако они служат разным целям. В то время как в вызове метода один клиент отправляет запрос к одному сервису, и этот сервис возвращает ответ клиенту, сигналы предназначены для общего уведомления узлов. Сервисы отправляют их, когда хотят сообщить одному или нескольким узлам на шине, что что-то произошло или изменилось. В отличие от вызовов методов и их ответов, они обычно транслируются по всей шине. В то время как вызовы/ответы методов используются для дуплексной связи один-к-одному, сигналы обычно используются для симплексной связи один-ко-многим (обратите внимание, что это не является обязательным требованием, их также можно использовать один-к-одному). Пример: systemd-logind передает сигнал SessionNew от своего объекта-менеджера каждый раз, когда пользователь входит в систему, и сигнал SessionRemoved каждый раз, когда пользователь выходит из системы.

  • Свойство - это третий тип элементов, определяемый в объектной системе D-Bus. Это похоже на концепцию свойств, известную в таких языках, как C#. Свойства также имеют сигнатуру. Они представляют собой переменные, предоставляемые объектом, которые могут быть прочитаны или изменены клиентами. Пример: systemd-logind предоставляет свойство Docked с сигнатурой b (логическое значение). Оно отражает, считает ли systemd-logind, что система в настоящее время находится в док-станции (применимо только к ноутбукам).

D-Bus определяет много различных концепций. Конечно, все эти новые концепции могут быть непонятными. Давайте посмотрим на них с другой точки зрения. Я предполагаю, что многие из читателей имеют представление о сегодняшних веб-технологиях, в частности о HTTP и REST. Попробуем сравнить концепцию HTTP-запроса с концепцией вызова метода D-Bus:

  • HTTP-запрос, который вы отправляете в определенной сети. Это может быть Интернет, ваша локальная сеть или корпоративный VPN. В зависимости от того, в какой сети вы отправляете запрос, вы сможете общаться с определённым набором серверов. Это мало чем отличается от шинной концепции D-Bus.

  • Затем в сети вы выбираете конкретный HTTP-сервер для общения. Это примерно сопоставимо с выбором сервиса на конкретной шине.

  • Затем на HTTP-сервере вы запрашиваете конкретный URL-адрес. Часть URL-адреса, определяющая путь (под которой я подразумеваю все после имени хоста сервера, вплоть до последнего /) очень похожа на путь к объекту D-Bus.

  • Файловая часть URL-адреса (под которой я подразумеваю все, что находится после последней косой черты, следующее за путём, который описан выше), определяет фактический вызов, который нужно сделать. В D-Bus это может быть сопоставлено с именем интерфейса и метода.

  • Наконец, параметры HTTP-вызова следуют в пути после знака ?, Они отображаются на сигнатуру вызова D-Bus.

Конечно, сравнение HTTP-запроса с вызовом метода D-Bus похоже на сравнение яблок и апельсинов. Тем не менее, я думаю, что полезно получить представление о том, что чему соответствует.

Из оболочки

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

Некоторое время назад в systemd был включен инструмент busctl, который полезен для изучения и взаимодействия с объектной системой D-Bus. При вызове без параметров он покажет вам список всех узлов, подключенных к системной шине. (Вместо этого используйте --user, чтобы увидеть узлы вашей пользовательской шины):

$ busctlNAME                                       PID PROCESS         USER             CONNECTION    UNIT                      SESSION    DESCRIPTION:1.1                                         1 systemd         root             :1.1          -                         -          -:1.11                                      705 NetworkManager  root             :1.11         NetworkManager.service    -          -:1.14                                      744 gdm             root             :1.14         gdm.service               -          -:1.4                                       708 systemd-logind  root             :1.4          systemd-logind.service    -          -:1.7200                                  17563 busctl          lennart          :1.7200       session-1.scope           1          -[]org.freedesktop.NetworkManager             705 NetworkManager  root             :1.11         NetworkManager.service    -          -org.freedesktop.login1                     708 systemd-logind  root             :1.4          systemd-logind.service    -          -org.freedesktop.systemd1                     1 systemd         root             :1.1          -                         -          -org.gnome.DisplayManager                   744 gdm             root             :1.14         gdm.service               -          -[]

(Я немного сократил вывод, чтобы быть кратким).

Список начинается с узлов, подключенных в данный момент к шине. Они идентифицируются по именам, например ":1.11". В номенклатуре D-Bus они называются уникальными именами. По сути, каждый узел имеет уникальное имя, и они назначаются автоматически, когда узел подключается к шине. Если хотите, они очень похожи на IP-адрес. Вы заметите, что несколько узлов уже подключены, включая сам наш небольшой инструмент busctl, а также ряд системных сервисов. Затем в списке отображаются все текущие сервисы на шине, идентифицируемые по именам сервисов (как обсуждалось выше; чтобы отличить их от уникальных имен, они также называются хорошо известными именами). Во многих отношениях хорошо известные имена похожи на имена хостов DNS, то есть они являются более удобным способом ссылки на узел, но на нижнем уровне они просто сопоставляются с IP-адресом или, в этом сравнении, с уникальным именем. Подобно тому, как вы можете подключиться к хосту в Интернете либо по его имени, либо по его IP-адресу, вы также можете подключиться к узлу шины либо по его уникальному, либо по его общеизвестному имени. (Обратите внимание, что каждый узел может иметь сколько угодно хорошо известных имен, подобно тому, как IP-адрес может иметь несколько имен хостов, ссылающихся на него).

Ладно, это уже круто. Попробуйте сами, на своем локальном компьютере (все, что вам нужно, это современный дистрибутив на основе systemd).

Теперь перейдем к следующему шагу. Посмотрим, какие объекты на самом деле предлагает сервис org.freedesktop.login1:

$ busctl tree org.freedesktop.login1/org/freedesktop/login1  /org/freedesktop/login1/seat   /org/freedesktop/login1/seat/seat0   /org/freedesktop/login1/seat/self  /org/freedesktop/login1/session   /org/freedesktop/login1/session/_31   /org/freedesktop/login1/session/self  /org/freedesktop/login1/user    /org/freedesktop/login1/user/_1000    /org/freedesktop/login1/user/self

Красиво, не правда ли? Что на самом деле еще приятнее и чего не видно в выводе, так это то, что доступно полное автозавершение слов из командной строки: когда вы нажимаете TAB, оболочка автоматически заполняет имена служб за вас. Это замечательный инструмент для исследования объектов D-Bus!

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

$ busctl introspect org.freedesktop.login1 /org/freedesktop/login1/session/_31NAME                                TYPE      SIGNATURE RESULT/VALUE                             FLAGSorg.freedesktop.DBus.Introspectable interface -         -                                        -.Introspect                         method    -         s                                        -org.freedesktop.DBus.Peer           interface -         -                                        -.GetMachineId                       method    -         s                                        -.Ping                               method    -         -                                        -org.freedesktop.DBus.Properties     interface -         -                                        -.Get                                method    ss        v                                        -.GetAll                             method    s         a{sv}                                    -.Set                                method    ssv       -                                        -.PropertiesChanged                  signal    sa{sv}as  -                                        -org.freedesktop.login1.Session      interface -         -                                        -.Activate                           method    -         -                                        -.Kill                               method    si        -                                        -.Lock                               method    -         -                                        -.PauseDeviceComplete                method    uu        -                                        -.ReleaseControl                     method    -         -                                        -.ReleaseDevice                      method    uu        -                                        -.SetIdleHint                        method    b         -                                        -.TakeControl                        method    b         -                                        -.TakeDevice                         method    uu        hb                                       -.Terminate                          method    -         -                                        -.Unlock                             method    -         -                                        -.Active                             property  b         true                                     emits-change.Audit                              property  u         1                                        const.Class                              property  s         "user"                                   const.Desktop                            property  s         ""                                       const.Display                            property  s         ""                                       const.Id                                 property  s         "1"                                      const.IdleHint                           property  b         true                                     emits-change.IdleSinceHint                      property  t         1434494624206001                         emits-change.IdleSinceHintMonotonic             property  t         0                                        emits-change.Leader                             property  u         762                                      const.Name                               property  s         "lennart"                                const.Remote                             property  b         false                                    const.RemoteHost                         property  s         ""                                       const.RemoteUser                         property  s         ""                                       const.Scope                              property  s         "session-1.scope"                        const.Seat                               property  (so)      "seat0" "/org/freedesktop/login1/seat... const.Service                            property  s         "gdm-autologin"                          const.State                              property  s         "active"                                 -.TTY                                property  s         "/dev/tty1"                              const.Timestamp                          property  t         1434494630344367                         const.TimestampMonotonic                 property  t         34814579                                 const.Type                               property  s         "x11"                                    const.User                               property  (uo)      1000 "/org/freedesktop/login1/user/_1... const.VTNr                               property  u         1                                        const.Lock                               signal    -         -                                        -.PauseDevice                        signal    uus       -                                        -.ResumeDevice                       signal    uuh       -                                        -.Unlock                             signal    -         -                                        -

Как и раньше, команда busctl поддерживает автозавершение командной строки, поэтому и имя службы, и путь к объекту легко объединяются в оболочке простым нажатием TAB. Вывод показывает методы, свойства, сигналы одного из объектов сеанса, который в настоящее время доступен через systemd-logind. Есть раздел для каждого интерфейса, который известен объекту. Во втором столбце указывается тип члена. В третьем столбце отображается сигнатура члена. В случае методов, она описывает входные параметры. Четвертый столбец показывает возвращаемые параметры. Для свойств четвертый столбец кодирует их текущее значение.

Пока что мы только исследовали. Теперь сделаем следующий шаг: станем активными - вызовем метод:

# busctl call org.freedesktop.login1 /org/freedesktop/login1/session/_31 org.freedesktop.login1.Session Lock

Я не думаю, что мне нужно больше об этом упоминать, но в любом случае: снова доступно полное автозавершение командной строки. Третий аргумент - это имя интерфейса, четвертый - имя метода, оба могут быть легко заполнены нажатием TAB. В этом случае мы выбрали метод Lock, который активирует блокировку экрана для определенного сеанса. И оп, в тот момент, когда я нажал Enter в этой строке, у меня включилась блокировка экрана (это работает только на оконных менеджерах, которые правильно подключаются к systemd-logind. GNOME работает нормально, и KDE тоже должен работать).

Выбранный нами вызов метода Lock очень прост, поскольку он не принимает никаких параметров и не возвращает их. Конечно, для некоторых вызовов всё может быть сложнее. Вот еще один пример, на этот раз с использованием одного из вызовов на собственной шине systemd для запуска произвольного системного модуля:

# busctl call org.freedesktop.systemd1 /org/freedesktop/systemd1 org.freedesktop.systemd1.Manager StartUnit ss "cups.service" "replace"o "/org/freedesktop/systemd1/job/42684"

Этот вызов принимает две строки в качестве входных параметров, как описано в сигнатуре, которая следует за именем метода (как обычно, автозавершение командной строки помогает вам понять, как ввести параметры правильно). Следующие за сигнатурой два параметра - это просто две передаваемые строки. Таким образом, сигнатура указывает, какие параметры будут дальше. Вызов метода StartUnit systemd принимает имя модуля для запуска в качестве первого параметра и режим, в котором он запускается, в качестве второго. Вызов возвращает значение пути к объекту. Он кодируется так же, как входной параметр: сигнатура (только o для пути к объекту), за которой следует фактическое значение.

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

busctl поддерживает ряд других операций. Например, вы можете использовать его для мониторинга трафика D-Bus по мере его возникновения (включая создание файла .cap для использования с Wireshark!) Или вы можете установить или получить определенные свойства. Тем не менее, этот пост должен быть о sd-bus, а не busctl, поэтому давайте кратко остановимся здесь и позвольте мне направить вас на страницу руководства на случай, если вы хотите узнать больше об этом инструменте.

busctl (как и остальная часть системы) реализован с использованием API sd-bus. Таким образом, он раскрывает многие особенности самой sd-bus. Например, вы можете использовать его для подключения к удаленным или контейнерным шинам. Он поддерживает как kdbus, так и классический D-Bus, и многое другое!

sd-bus

Но хватит! Вернемся к теме, поговорим о самой sd-bus.

Набор API sd-bus в основном содержится в заголовочном файле sd-bus.h.

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

  • Поддерживает как kdbus, так и dbus1 в качестве серверной части.

  • Имеет высокоуровневую поддержку подключения к удаленным шинам по ssh и шинам локальных контейнеров ОС.

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

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

  • Клиент строит эффективное дерево решений, чтобы определить, каким обработчикам доставить входящее сообщение шины.

  • Автоматически переводит ошибки D-Bus в ошибки стиля UNIX и обратно (хотя с потерями), чтобы обеспечить лучшую интеграцию D-Bus в низкоуровневые программы Linux.

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

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

Вызов метода из Си с помощью sd-bus

Так много о библиотеке в целом. Вот пример подключения к шине и выполнения вызова метода:

#include <stdio.h>#include <stdlib.h>#include <systemd/sd-bus.h>int main(int argc, char *argv[]) {  sd_bus_error error = SD_BUS_ERROR_NULL;  sd_bus_message *m = NULL;  sd_bus *bus = NULL;  const char *path;  int r;  /* Connect to the system bus */  r = sd_bus_open_system(&bus);  if (r < 0) {    fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-r));    goto finish;  }  /* Issue the method call and store the respons message in m */  r = sd_bus_call_method(bus,                         "org.freedesktop.systemd1",           /* service to contact */                         "/org/freedesktop/systemd1",          /* object path */                         "org.freedesktop.systemd1.Manager",   /* interface name */                         "StartUnit",                          /* method name */                         &error,                               /* object to return error in */                         &m,                                   /* return message on success */                         "ss",                                 /* input signature */                         "cups.service",                       /* first argument */                         "replace");                           /* second argument */  if (r < 0) {    fprintf(stderr, "Failed to issue method call: %s\n", error.message);    goto finish;  }  /* Parse the response message */  r = sd_bus_message_read(m, "o", &path);  if (r < 0) {    fprintf(stderr, "Failed to parse response message: %s\n", strerror(-r));    goto finish;  }  printf("Queued service job as %s.\n", path);finish:  sd_bus_error_free(&error);  sd_bus_message_unref(m);  sd_bus_unref(bus);  return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;}

Сохраните этот пример как bus-client.c, а затем соберите его с помощью:

$ gcc bus-client.c -o bus-client `pkg-config --cflags --libs libsystemd`

Будет сгенерирован исполняемый файл bus-client, который вы теперь можете запустить. Обязательно запускайте его как root, поскольку доступ к методу StartUnit является привилегированным:

# ./bus-clientQueued service job as /org/freedesktop/systemd1/job/3586.

И это уже наш первый пример. Он показал, как мы вызывали метод на шине. Фактически вызов метода очень близок к инструменту командной строки busctl, который мы использовали ранее. Я надеюсь, что отрывок из кода не требует дополнительных пояснений. Он должен дать вам представление о том, как писать клиентов D-Bus с помощью sd-bus. Для получения дополнительной информации, пожалуйста, просмотрите заголовочный файл, страницу руководства или даже исходники sd-bus.

Реализация сервиса на Си с помощью sd-bus

Конечно, простой вызов одного метода - довольно упрощенный пример. Давайте посмотрим, как написать сервис шины. Мы напишем небольшой сервис калькулятора. Он предоставляет объект реализующий интерфейс, который предоставляет два метода: один для умножения двух 64-битных целых чисел со знаком, а другой для деления одного 64-битного целого числа со знаком на другое.

#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <systemd/sd-bus.h>static int method_multiply(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {  int64_t x, y;  int r;  /* Read the parameters */  r = sd_bus_message_read(m, "xx", &x, &y);  if (r < 0) {    fprintf(stderr, "Failed to parse parameters: %s\n", strerror(-r));    return r;  }  /* Reply with the response */  return sd_bus_reply_method_return(m, "x", x * y);}static int method_divide(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {  int64_t x, y;  int r;  /* Read the parameters */  r = sd_bus_message_read(m, "xx", &x, &y);  if (r < 0) {    fprintf(stderr, "Failed to parse parameters: %s\n", strerror(-r));    return r;  }  /* Return an error on division by zero */  if (y == 0) {    sd_bus_error_set_const(ret_error, "net.poettering.DivisionByZero", "Sorry, can't allow division by zero.");    return -EINVAL;  }  return sd_bus_reply_method_return(m, "x", x / y);}/* The vtable of our little object, implements the net.poettering.Calculator interface */static const sd_bus_vtable calculator_vtable[] = {  SD_BUS_VTABLE_START(0),  SD_BUS_METHOD("Multiply", "xx", "x", method_multiply, SD_BUS_VTABLE_UNPRIVILEGED),  SD_BUS_METHOD("Divide",   "xx", "x", method_divide,   SD_BUS_VTABLE_UNPRIVILEGED),  SD_BUS_VTABLE_END};int main(int argc, char *argv[]) {  sd_bus_slot *slot = NULL;  sd_bus *bus = NULL;  int r;  /* Connect to the user bus this time */  r = sd_bus_open_user(&bus);  if (r < 0) {    fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-r));    goto finish;  }  /* Install the object */  r = sd_bus_add_object_vtable(bus,                               &slot,                               "/net/poettering/Calculator",  /* object path */                               "net.poettering.Calculator",   /* interface name */                               calculator_vtable,                               NULL);  if (r < 0) {    fprintf(stderr, "Failed to issue method call: %s\n", strerror(-r));    goto finish;  }  /* Take a well-known service name so that clients can find us */  r = sd_bus_request_name(bus, "net.poettering.Calculator", 0);  if (r < 0) {    fprintf(stderr, "Failed to acquire service name: %s\n", strerror(-r));    goto finish;  }  for (;;) {    /* Process requests */    r = sd_bus_process(bus, NULL);    if (r < 0) {      fprintf(stderr, "Failed to process bus: %s\n", strerror(-r));      goto finish;    }    if (r > 0) /* we processed a request, try to process another one, right-away */      continue;    /* Wait for the next request to process */    r = sd_bus_wait(bus, (uint64_t) -1);    if (r < 0) {      fprintf(stderr, "Failed to wait on bus: %s\n", strerror(-r));      goto finish;    }  }finish:  sd_bus_slot_unref(slot);  sd_bus_unref(bus);  return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;}

Сохраните этот пример как bus-service.c, а затем соберите его с помощью:

$ gcc bus-service.c -o bus-service `pkg-config --cflags --libs libsystemd`

А теперь запустим:

$ ./bus-service

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

$ busctl --user tree net.poettering.Calculator/net/poettering/Calculator

Как мы видим, в сервисе есть только один объект, что неудивительно, учитывая, что наш код выше зарегистрировал только один. Давайте посмотрим интерфейсы и члены, которые предоставляет этот объект:

$ busctl --user introspect net.poettering.Calculator /net/poettering/CalculatorNAME                                TYPE      SIGNATURE RESULT/VALUE FLAGSnet.poettering.Calculator           interface -         -            -.Divide                             method    xx        x            -.Multiply                           method    xx        x            -org.freedesktop.DBus.Introspectable interface -         -            -.Introspect                         method    -         s            -org.freedesktop.DBus.Peer           interface -         -            -.GetMachineId                       method    -         s            -.Ping                               method    -         -            -org.freedesktop.DBus.Properties     interface -         -            -.Get                                method    ss        v            -.GetAll                             method    s         a{sv}        -.Set                                method    ssv       -            -.PropertiesChanged                  signal    sa{sv}as  -            -

Как упоминалось выше, библиотека sd-bus автоматически добавила пару универсальных интерфейсов. Но первый интерфейс, который мы видим, на самом деле тот, который мы добавили! Он показывает наши два метода, и оба принимают xx (два 64-битных целых числа со знаком) в качестве входных параметров и возвращают один x. Отлично! Но правильно ли это работает?

$ busctl --user call net.poettering.Calculator /net/poettering/Calculator net.poettering.Calculator Multiply xx 5 7x 35

Вау! Мы передали два целых числа 5 и 7, и служба фактически умножила их для нас и вернула одно целое число 35! Попробуем другой метод:

$ busctl --user call net.poettering.Calculator /net/poettering/Calculator net.poettering.Calculator Divide xx 99 17x 5

Ух ты! Он может даже делать целочисленное деление! Фантастика! Но давайте обманем его делением на ноль:

$ busctl --user call net.poettering.Calculator /net/poettering/Calculator net.poettering.Calculator Divide xx 43 0Sorry, can't allow division by zero.

Отлично! Он прекрасно это обнаружил и вернул чистую ошибку. Если вы посмотрите на приведенный выше пример исходного кода, вы увидите, насколько точно мы сгенерировали ошибку.

И это действительно всё, что у меня есть на сегодня. Конечно, примеры, которые я показал, короткие, и я не буду вдаваться в подробности того, что именно делает каждая строка. Однако этот пост должен быть кратким введением в D-Bus и sd-bus, и это уже слишком много для него...

Надеюсь, этот пост был вам полезен. Если вы заинтересованы в использовании sd-bus для своих собственных программ, я надеюсь, он поможет вам. Если у вас есть дополнительные вопросы, посмотрите (неполные) страницы руководства и спросите нас в IRC или в списке рассылки systemd. Если вам нужно больше примеров, взгляните на дерево исходных текстов systemd, все многочисленные шинные сервисы systemd широко используют sd-bus.

Подробнее..

Пишем Hello World на WebAssembly, шпаргалка по Linux-команде sed, а также 15 самых востребованных ИТ-сертификатов года

08.04.2021 18:23:51 | Автор: admin

И вновь мы приготовили для вас много инсайтов, мероприятий, книжек и шпаргалок. Оставайтесь с нами станьте частью DevNation!

Узнать новое:

Скачать:

  • Шпаргалка по Linux-команде sed
    SED (Stream EDitor) это потоковый текстовый редактор, который построчно обрабатывает входной поток (файл).

  • Бесплатный Developer Sandbox for OpenShift
    Это ваш личный OpenShift в облаке, всего за пару минут и без какой бы то ни было инсталляции. Среда создана специально для разработчиков и включает в себя Helm-диаграммы, builder-образы Red Hat, инструменты сборки s2i, также CodeReady Workspaces, облачную IDE с веб-интерфейсом.

Почитать на досуге:

Мероприятия:

  • Виртуальный Red Hat Summit 2021, 27-28 апреля
    Бесплатная онлайн-конференция Red Hat Summit это отличный способ узнать последние новости ИТ-индустрии, задать свои вопросы техническим экспертам, услышать истории успеха непосредственно от заказчиков Red Hat и увидеть, как открытый код генерирует инновации в корпоративном секторе

Подробнее..

Полезные консольные Linux утилиты

18.04.2021 10:08:54 | Автор: admin

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


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



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



Fd это простой, быстрый и удобный инструмент, предназначенный для более простой и быстрой работы по сравнению с командой find.



Procs это современная замена ps, программы командной строки по умолчанию в Unix / Linux для получения информации о процессах. По умолчанию он обеспечивает удобный, понятный для человека (и цветной) формат вывода.



Sd это интуитивно понятный инструмент командной строки для поиска и замены, он является альтернативой sed. sd имеет более простой синтаксис для замены всех вхождений и использует удобный синтаксис регулярных выражений, который вы уже знаете из JavaScript и Python. Sd также в 2-11 раз быстрее, чем sed.



Dust опрятная версия дефолтного du, c удобной записью памяти, цветом и отступами.



Starship очень приятный prompt который легко накатывается поверх zsh, fish, bash и прочего.
Легкая настройка через Toml файл (https://github.com/toml-lang/toml) с кучей уже поддерживаемых форматов и конфигов (https://starship.rs/config/#prompt).



Ripgrep быстрый поиск с возможностью замены по содержимому в файлах, аналог GREP, ASK, написан на RUST, понимает регулярные выражения, игнорирует ресурсы указанные в .gitignore, автоматически пропускает бинарные, скрытые файлы.



Ripgrep-all Инструмент поиска, ориентированный на строки, который позволяет вам искать по регулярному выражению во множестве типов файлов. Ripgrep-all является оберткой над ripgrep и позволяет ему искать в pdf, docx, sqlite, jpg, субтитрах фильмов (mkv, mp4) и т. д.



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



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



Jq это легкий и гибкий JSON-процессор командной строки.



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



HTTPie HTTP клиент для командной строки, с поддержкой json, понятным интерфейсом, подсветкой синтаксиса и прочим.



Rebound это инструмент командной строки, который мгновенно извлекает результаты Stack Overflow при возникновении исключения. Просто используйте команду rebound для запуска вашего исполняемого файла.



HTTP Prompt это интерактивный HTTP-клиент командной строки, созданный на основе prompt_toolkit и HTTPie с более чем 20 темами. Его основные функции включают в себя автоматическое заполнение, подсветку синтаксиса, автоматические куки, Unix-подобные конвейеры, совместимость с HTTpie, http-подсказка, которая сохраняется между сеансами и интеграцию OpenAPI / Swagger.



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


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



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


Clog-cli утилита для создания changelogs из истории коммитов Git.


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



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


ngrok Безопасные интроспективные туннели к localhost.


teleconsole поделитесь своим терминалом UNIX.


tmate Мгновенный доступ к терминалу (tmux).


P.S. Пишите утилиты, которые стоит добавить в список.

Подробнее..
Категории: *nix , Linux , Утилиты

Перевод Глубокое погружение в Linux namespaces, часть 3

31.03.2021 04:09:55 | Автор: admin

Mount namespaces изолируют ресурсы файловых систем. Это по большей части включает всё, что имеет отношение к файлам в системе. Среди охватываемых ресурсов есть файл, содержащий список точек монтирования, которые видны процессу, и, как мы намекали во вступительном посте, изолирование может обеспечить такое поведение, что изменение списка (или любого другого файла) в пределах некоторого mount namespace инстанса M не будет влиять на этот список в другом инстансе (так что только процессы в M увидят изменения)


Точки монтирования


Вам может быть интересно, почему мы так сфокусировались на кажущимся произвольно выбранном файле, содержащим в себе список точек монтрирования. Что в нём такого особенного? Список точек монтирования даёт процессу полное описание доступных файловых систем в системе и, поскольку мы пребываем на территории Linux с мантрой всё есть файл, видимость почти каждого ресурса диктуется этим описанием: от фактических файлов и устройств до информации о том, какие другие процессы также запущены в системе. Таким образом, это даёт огромный выигрыш в безопасности для isolate, позволяющий точно указывать о каких именно частях системы будут в курсе команды, которые мы хотим выполнить. Пространства имён mount в сочетании с точками монтирования являются очень мощным инструментом, который позволит нам этого достичь.


Мы можем видеть точки монтирования, видимые для процесса с id $pid посредством файла /proc/$pid/mounts его содержимое одинаково для всех процессов, принадлежащих к тому же mount namespace, что и $pid:


$ cat /proc/$$/mounts.../dev/sda1 / ext4 rw,relatime,errors=remount-ro,data=ordered 0 0...

В списке, полученном на моей системе, видно устройство /dev/sda1, смонтированное в / (ваше может быть другим). Это дисковое устройство, на котором размещена корневая файловая система, которая содержит всё что нужно для запуска и правильной работы системы, поэтому было бы здорово, если бы isolate запускала команды без ведома о таких файловых системах.


Давайте начнём с запуска терминала в его собственном mount namespace:


Строго говоря, нам не понадобится доступ уровня суперпользователя для работы с новыми пространствами имён mount, поскольку мы добавим процедуры настройки user namespace из предыдущего поста. В результате в этом посте мы предполагаем, что только команды unshare в терминале выполняются от суперпользователя. Для isolate в таком предположении необходимости нет.

# Флаг -m создаёт новый mount namespace.$ unshare -m bash$ cat /proc/$$/mounts.../dev/sda1 / ext4 rw,relatime,errors=remount-ro,data=ordered 0 0...

Хммм, мы всё еще можем видеть тот же самый список, что и в корневом mount namespace. Особенно после того, как в предыдущем посте стало ясно, что новый user namepace начинается с чистого листа, может показаться, что флаг -m, который мы передали unshare, не дал никакого эффекта.
Процесс шелла фактически выполняется в другом mount namespace (мы можем убедиться в этом, сравнив файл симлинка ls -l /proc/$$/mnt с файлом другой копии шелла, работающей в корневом mount namespace). Причина, по которой мы все еще видим тот же список, заключается в том, что всякий раз, когда мы создаем новый mount namespace (дочерний), в качестве дочернего списка используется копия точек монтирования mount namespace, в котором происходило создание (родительского). Теперь любые изменения, которые мы вносим в этот файл (например, путём монтирования файловой системы), будут невидимы для всех других процессов.
Однако изменение практически любого другого файла на этом этапе будет влиять на другие процессы, поскольку мы всё ещё ссылаемся на те же самые файлы (Linux только делает копии особых файлов, таких как список точек монтирования). Это означает, что сейчас у нас минимальная изолированность. Если мы хотим ограничить то, что будет видеть наш командный процесс, мы должны сами обновить этот список.


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


Лучшее решение предоставить программе собственную копию зависимостей и системных файлов, которые требуются для запуска целиком в "песочнице", чтобы она могла вносить в них какие-либо изменения, не влияя на другие программы в системе. По лучшему сценарию мы можем поместить эти файлы в файловую систему и смонтировать её как корневую файловую систему (в корневой каталог /) до выполнения ничего не подозревающей программы. Идея заключается в том, что поскольку всё, что доступно процессу, должно достигаться через корневую файловую систему, и поскольку мы будем точно знать, какие файлы мы туда помещаем для командного процесса, мы будем спокойны, зная, что он должным образом изолирован от остальной системы.


Хорошо, в теории это звучит хорошо и для реализации этого мы сделаем следующее:


  1. Создадим копию зависимостей и системных файлов, необходимых команде.
  2. Создадим новый mount namespace.
  3. Заменим корневую файловую систему в новом mount namespace на ту, которая содержит копии наших системных файлов.
  4. Выполним программу в новом mount namespace.

Корневые файловые системы


Уже на шаге 1 возникает вопрос: какие системные файлы нужны команде, которую мы хотим запустить? Мы могли бы порыться в нашей собственной корневой файловой системе и, задаваясь этим вопросом по каждому файлу, с которым мы столкнемся, брать только те, на которые ответ положительный, но это выглядит больно и излишне. Кроме того, какую команду будет выполнять isolate, мы изначально не знаем.


Вот если бы только у людей уже была такая же проблема и они собрали набор системных файлов, в целом достаточный, чтобы служить базой прямо из коробки для большинства программ? К счастью, есть много проектов, что реализовали это! Одним из них является проект Alpine Linux (его основное предназначение, это когда вы начинаете свой Dockerfile с FROM alpine:xxx). Alpine предоставляет корневые файловые системы, которые мы можем использовать для наших целей. Если вы последуете инструкциями, то сможете получить копию их минимальной корневой файловой системы (MINI ROOT FILESYSTEM) для x86_64 здесь. Последней версией на момент написания поста и которую мы будем использовать, является v3.10.1.


$ wget http://dl-cdn.alpinelinux.org/alpine/v3.10/releases/x86_64/alpine-minirootfs-3.10.1-x86_64.tar.gz$ mkdir rootfs$ tar -xzf alpine-minirootfs-3.10.1-x86_64.tar.gz -C rootfs$ ls rootfsbin  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

В каталоге rootfs есть знакомые файлы, прям как в нашей собственной корневой файловой системе в /, но убедитесь, насколько он минимален многие из этих каталогов пусты:


$ ls rootfs/{mnt,dev,proc,home,sys}# пусто

Отлично! Мы можем дать команду, которая запустится в копии этого окружения, и она может быть даже sudo rm -rf /, но нас это не будет волновать, а никто другой не пострадает.


Pivot root


Имея наш новый mount namespace и копию системных файлов, мы хотели бы смонтировать эти файлы в корневом каталоге нового mount namespace не выбивая землю из под наших ног. Linux предлагает нам системный вызов pivot_root (есть соответствующая команда), который позволяет нам контролировать то, что именно процессы видят как корневую файловую систему.
Команда принимает два аргумента: pivot_root new_root put_old, где new_root это путь к файловой системе, будущей вскоре корневой файловой системой, а put_old путь к каталогу. Это работает так:


  1. Монтирование корневой файловой системы вызывающего процесса в put_old.
  2. Монтирование new_root в качестве корневой файловой системы в /.

Давайте посмотрим на это в действии. В нашем новом mount namespace мы начинаем с создания файловой системы из наших файлов alpine:


$ unshare -m bash$ mount --bind rootfs rootfs

Затем мы делаем pivot root:


$ cd rootfs$ mkdir put_old$ pivot_root . put_old$ cd /# Теперь у нас должен быть новый корневой каталог. Например, если мы сделаем:$ ls proc# proc пуст# И старый корневой каталог теперь в put_old$ ls put_oldbin   dev  home        lib    lost+found  mnt  proc  run   srv  tmp  varboot  etc  initrd.img  lib64  media       opt  root  sbin  sys  usr  vmlinuz

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


$ umount -l put_old

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


Реализация


Исходный код к этому посту можно найти здесь.

Мы можем повторить в коде то, что делали выше, заменив команду pivot_root соответствующим системным вызовом. Сначала мы создаем наш команды процесс в новом mount namespace, добавляя флаг CLONE_NEWNS для clone.


int clone_flags = SIGCHLD | CLONE_NEWUTS | CLONE_NEWUSER | CLONE_NEWNS;

Затем мы создаём функцию prepare_mntns которая, получив путь до каталога, содержащего системные файлы (rootfs), настраивает текущий mount namespace посредством pivoting'а корневого каталога текущего процесса на rootfs, что мы создали ранее.


static void prepare_mntns(char *rootfs){    const char *mnt = rootfs;    if (mount(rootfs, mnt, "ext4", MS_BIND, ""))        die("Failed to mount %s at %s: %m\n", rootfs, mnt);    if (chdir(mnt))        die("Failed to chdir to rootfs mounted at %s: %m\n", mnt);    const char *put_old = ".put_old";    if (mkdir(put_old, 0777) && errno != EEXIST)        die("Failed to mkdir put_old %s: %m\n", put_old);    if (syscall(SYS_pivot_root, ".", put_old))        die("Failed to pivot_root from %s to %s: %m\n", rootfs, put_old);    if (chdir("/"))        die("Failed to chdir to new root: %m\n");    if (umount2(put_old, MNT_DETACH))        die("Failed to umount put_old %s: %m\n", put_old);}

Нам нужно вызвать эту функцию из нашего кода и это должно быть выполнено нашим командным процессом в cmd_exec (поскольку он работает в новом mount namespace) до фактического начала выполнения команды.


    ...    // Ожидание сигнала 'настройка завершена' от основного процесса.    await_setup(params->fd[0]);    prepare_mntns("rootfs");    ...

Давайте попробуем это:


$ ./isolate sh===========sh============$ ls put_old# put_old пуст. Ура!# Как выглядит наш новый список монтирования?$ cat /proc/$$/mountscat: cant open '/proc/1431/mounts': No such file or directory# Хммм, а какие ещё процессы запущены?$ ps auxPID   USER     TIME  COMMAND# Пусто! А?

Этот вывод показывает что-то странное: мы не можем проверить список монтирования, за который так тяжело боролись, и ps говорит нам, что нет процессов, запущенных в системе (нет даже текущего процесса или самого ps?). Более вероятно, что мы что-то сломали при настройке mount namespace.


PID Namespaces


Мы уже несколько раз упоминали каталог /proc в этой серии постов, и если вы были знакомы с ним, то, вероятно, не будете удивлены тому, что вывод ps оказался пустым, поскольку мы видели ранее, что каталог был пуст в этом mount namespace (когда мы получили его из корневой файловой системы alpine).


Каталог /proc в Linux обычно используется для доступа к специальной файловой системе (называемой файловой системой proc), которой управляет сам Linux. Linux использует его для предоставления информации обо всех процессах, запущенных в системе, а также другой системной информации, касающейся устройств, прерываний и так далее. Всякий раз, когда мы запускаем такую команду, как ps, выдающую сведения о процессах в системе, она обращается к этой файловой системе для получения информации.
Другими словами, нам нужно завести файловую систему proc. К счастью, в основном для это потребуется лишь сообщить Linux, что она нам нужна, причем желательно смонтированная в /proc. Но пока мы не можем этого сделать, поскольку наш командный процесс всё ещё зависит от той же файловой системы proc, что и isolate и любой другой обычный процесс в системе. Чтобы избавиться от этой зависимости, нам нужно запустить его внутри собственного PID namespace.


PID namespace изолирует ID процессов в системе. Одним из следствий тут является то, что выполняющиеся в разных пространствах имён PID процессы могут иметь одинаковые идентификаторы процесса, не конфликтуя друг с другом. Допусти, мы изолируем это пространство имён потому, что мы хотим обеспечить как можно большую изолированность нашей запущенной команде. Однако более интересная причина, по которой мы рассматриваем это здесь, заключается в том, что монтирование файловой системы proc требует привилегий пользователя root, а текущий PID namespace принадлежит пользователю root, где у нас нет достаточных привилегий (если вы помните из предыдущего поста, root у командного процесса на самом деле не root). Итак, мы должны работать в PID namespace, владельцем которого является пользователь пространства имён, которое считает наш командный процесс запущенным от root.


Мы можем создать новый PID namespace, передав CLONE_NEWPID для clone:


int clone_flags = SIGCHLD | CLONE_NEWUTS | CLONE_NEWUSER | CLONE_NEWNS | CLONE_NEWPID;

Затем мы добавляем функцию prepare_procfs, которая настраивает файловую систему proc, монтируя её в текущих пространствах имён mount и pid.


static void prepare_procfs(){    if (mkdir("/proc", 0555) && errno != EEXIST)        die("Failed to mkdir /proc: %m\n");    if (mount("proc", "/proc", "proc", 0, ""))        die("Failed to mount proc: %m\n");}

Наконец, мы вызываем функцию прямо перед размонтированием put_old в нашей функции prepare_mntns, после того, как мы настроили mount namespace и перешли в корневой каталог.


static void prepare_mntns(char *rootfs){  ...    prepare_procfs();    if (umount2(put_old, MNT_DETACH))        die("Failed to umount put_old %s: %m\n", put_old);  ...}

Мы можем воспользоваться isolate для очередного запуска:


$ ./isolate sh===========sh============$ psPID   USER     TIME  COMMAND    1 root      0:00 sh    2 root      0:00 ps

Это выглядит намного лучше! Шелл считает себя единственным процессом, запущенным в системе и работающем с PID 1(поскольку это был первый процесс, запущенный в этом новом PID namespace)


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

Подробнее..

На каких серверах держится Архив Интернета?

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. Попробуйте как можно быстрее!

Подробнее..

Файловая система BtrFS. Как восстановить данные с BtrFS RAID

05.04.2021 00:18:36 | Автор: admin
В нашей статье вы узнаете, как восстановить данные с программного btrfs RAID ОС Linux. Как его создать, заменить нерабочий диск и восстановить утерянную информацию с поврежденного массива.

image



Обычно для создания RAID массива в ОС Linux используют mdadm и lvm, подробнее об этих системах можно посмотреть в одном из наших видео уроков.



Помимо этих инструментов, о которых рассказано в видео, еще встроенная поддержка RAID есть в файловой системе Btrfs. Она обходится собственными средствами для построения и работы с дисковыми массивами, далее давайте более детально рассмотрим все ее возможности.

Файловая система btrfs


Btrfs это новая файловая система с поддержкой функции копирования при записи (Copy on Write) со встроенной поддержкой RAID. Суть этой замечательной функции состоит в отсутствии перезаписи старых данных при копировании. Это огромный плюс, она значительно упрощает восстановление удаленных файлов после сбоев. Так как любой сбой или ошибка в процессе переписывания никак не повлияют на предыдущее состояние файлов.

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

Перед началом использования btrfs, нам понадобиться доустановить необходимые инструменты управления ФС, выполнив следующую команду:

sudo apt install btrfs-tools

image

Создание точки монтирования


И прежде чем собрать RAID необходимо создать каталог точки монтирования.

Создаем каталог:

Sudo mkdir v /data

Где data это его название.

image

Теперь приступаем к созданию массива.

Как создать RAID5


Создавая массив, не нужно в обязательном порядке размечать носители на разделы, ФС не требует этого. Объединять накопители в массив, можно как целые, так и отдельные разделы, даже объединять носители с имеющимися разделами. Для примера я покажу как создать RAID5 из пяти накопителей.

Чтобы постоянно не вводить пароль root выполните команду sudo -i, после чего все команды будут выполняться от администратора.

image

Для построения массива введите в терминале такую команду:

sudo mkfs.btrfs -L data -m raid5 -d raid5 -f /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf

где: L метка или имя файловой системы,

Параметр:

  • d устанавливаем тип RAID5 для данных.
  • m устанавливаем тип RAID5 для метаданных.
  • f служит для принудительного создания btrfs, даже если какой-либо из накопителей отформатирован в другой ФС.


image

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

Как смонтировать RAID диск


Я использовал 5 накопителей для создания RAID: sdb, sdc, sdd, sde и sdf. Поэтому я могу смонтировать данные ФС в каталоге data с помощью диска sdb. Открываем управление дисками и монтируем наш носитель, после чего он станет доступным.

image

Или же можно смонтировать диск через терминал.

sudo mount /dev/sdb1 /data

Чтобы проверить введите sudo df -h

Как видите, наш массив смонтирован в каталог /data

image

А чтобы посмотреть информацию о занятом и свободном пространстве массива, вводим:

sudo btrfs filesystem usage /data

image

А для размонтирования массива достаточно ввести:

sudo umount /data

image

Как заменить или добавить накопитель
Для замены накопителя нужно в терминале ввести btrfs replace. Она запускается асинхронно, то есть выполняется постепенно:

  • start для запуска,
  • cancel для остановки,
  • status а для просмотра состояния.

Прежде нужно определить номер поврежденного накопителя:

sudo btrfs filesystem show

image

Затем заменить его на новый:

btrfs replace start <удаляемое устройство или его ID> <добавляемое устройство> <путь, куда смонтирована btrfs>

В моем случае вводим:

btrfs replace start 3 /dev/sdg

где: 3 это номер отсутствующего диска, а sdg код нового накопителя.

image

Как восстановить поврежденный том


Для восстановления Btrfs массива, нужно использовать встроенную опцию монтирования recovery:

sudo mount -o recovery /dev/sdb /mnt

image

Далее начнется процесс восстановления.

Восстанавливаем данные с btrfs RAID5


Даже самая надежная и отказоустойчивая система мажет выйти из строя. Сбой системы, выход из строя накопителя, аппаратной части, повреждение метаданных, случайное удаление, неправильная настройка все это может повлечь за собой поломку RAID и утерю важных данных. Если вы столкнулись с этим воспользуйтесь программой Hetman RAID Recovery. Она способна восстановить любую информацию с нерабочих массивов или носителей, которые входили в массив. Утилита воссоздаст разрушенный RAID, пошагово вычитывая всю известную информацию, далее вы сможете скопировать все найденные данные.

Подключите носители к ПК с установленной Windows, воспользуйтесь виртуальной машиной, или установите ее второй системой.

Программа автоматически просканирует дисковое пространство, и отобразит всю возможную информацию о массиве.

image

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

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

image

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

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

image

Отметьте файлы, которые нужно вернуть и нажмите Восстановить, укажите путь куда их сохранить и еще раз Восстановить. По завершении все файлы будут лежать в указанной папке.

image

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

image

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

image

Особенности файловой системы btrfs



Btrfs поддерживает сжатие данных. То есть, вся имеющаяся информация на носителях будет автоматически сжиматься. А при обращении к данным, каждый конкретный файл будет автоматически распакован.

Эта функция позволяет значительно экономить пространство на накопителях, а также время на поиски стороннего ПО для сжатия данных. ФС поддерживает 3 основных метода сжатия файлов это zlib, lzo и zstd. Их основное отличие заключается в степени, а также скорости сжатия.

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

image

Еще одним из главных преимуществ является создание подтомов (subvolum-ов). Простыми словами на одном накопителе можно создать к примеру 3 разных диска (subvolum-а). Эти подтома способны расширяться самостоятельно, за счет свободного пространства другого тома. Такая возможность при необходимости позволяет расширить один диск за счет другого без сжатия и переноса данных. Эти подтома отображаются в программе следующим образом, это диски внутри основного накопителя.

image

Таким же образом в программе отображены и папки со snap-shot-ами.

Для создания подтомов используйте команду:

btrfs subvolume create /mnt/btrfs/my-subvolume

image

А для просмотра списка подтомов на этом накопителе выполните:

btrfs subvolume list /mnt/btrfs

image

Для монтирования подтома:

mount -o subvol=my-subvolume /dev/sdd2 /mnt/btrfs2

где sdb1 это код диска.

image

Заключение


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

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

Перевод Настройка сетевого стека Linux для высоконагруженных систем

05.04.2021 18:06:45 | Автор: admin

Максимизируем количество входящих соединений

В рамках набора учащихся на курс "Administrator Linux. Professional" подготовили перевод полезного материала.

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

О том как изменять параметры ядра, описываемые здесь, можно прочитать в статье Linux Kernel Tuning for High Performance Networking: Configuring Kernel Settings.

Очередь приема и netdev_max_backlog

Каждое ядро процессора перед обработкой пакетов сетевым стеком может хранить их в кольцевом буфере. Если буфер заполняется быстрее, чем TCP-стек обрабатывает пакеты, то пакеты отбрасываются и увеличивается счетчик отброшенных пакетов (dropped packet counter). Для увеличения размера очереди следует использовать параметр net.core.netdev_max_backlog.

net.core.netdev_max_backlog параметр задается на ядро процессора.

Очередь ожидающих запросов на соединение и tcp_max_syn_backlog

Соединения создаются для SYN-пакетов из очереди приема и перемещаются в очередь ожидания (SYN Backlog Queue). Также соединение помечается как "SYN_RECV" и клиенту отправляется "SYN+ACK". Эти соединения не перемещаются в очередь установленных соединений ожидающих обработки accept() (accept queue) до тех пор, пока не будет получен и обработан соответствующий ACK. Максимальное количество соединений в этой очереди устанавливается параметром net.ipv4.tcp_max_syn_backlog.

Для просмотра очереди приема используйте команду netstat. На правильно настроенном сервере при нормальной нагрузке значение не должно быть больше 1. При большой нагрузке значение должно быть меньше размера очереди ожидания (SYN Backlog):

# netstat -an | grep SYN_RECV | wc -l

Если в состоянии "SYN_RECV" находятся много соединений, то можно также подстроить продолжительность нахождения SYN-пакета в этой очереди.

SYN Cookie

Если SYN cookie отключены, то клиент просто повторяет отправку SYN-пакета. Если включены (net.ipv4.tcp_syncookies), то соединение не создается и не помещается в SYN backlog, но клиенту отправляется SYN+ACK, так как если бы это было сделано на самом деле. SYN cookie могут быть полезны при нормальной нагрузке, но при всплесках трафика некоторая информация о соединении может быть потеряна и клиент столкнется с проблемами, когда соединение будет установлено. Подробнее о SYN cookie можно прочитать в статье Грэма Коула (Graeme Cole) SYN cookies ate my dog (SYN cookie съели мою собаку), в которой подробно объясняется, почему включение SYN cookie на высоконагруженных серверах может привести к проблемам.

Повторы SYN+ACK

Что происходит, если SYN+ACK отправлен, но ответа ACK нет? В этом случае сетевой стек сервера повторит отправку SYN+ACK. Задержка между попытками вычисляется таким образом, чтобы обеспечить восстановление сервера. Если сервер получает SYN и отправляет SYN+ACK, но не получает ACK, то тайм-аут повторной передачи вычисляется по экспоненте (Exponental Backoff) и, следовательно, зависит от количества повторных попыток. Количество повторных попыток отправки SYN+ACK задается параметром ядра net.ipv4.tcp_synack_retries (по умолчанию равно 5). Повторные попытки будут через следующие интервалы: 1с, 3с, 7с, 15с, 31с. При шести попытках последняя будет примерно через 63 секунды после первой. Это позволяет удержать SYN-пакет в очереди ожидания более 60 секунд до истечения времени ожидания пакета. Если очередь SYN backlog мала, то не требуется большого количества соединений, чтобы возникла ситуация, когда полуоткрытые соединения никогда не завершатся и тогда никакие соединения не смогут быть установлены. Установите количество повторных попыток SYN+ACK равным 0 или 1, чтобы избежать такого поведения на высоконагруженных серверах.

Повторы SYN

Несмотря на то что повторные SYN-пакеты отправляются клиентом во время ожидания SYN+ACK, они могут влиять и на высоконагруженные сервера, работающие с прокси-соединениями. Например, сервер nginx, устанавливающий несколько десятков прокси-соединений к бэкенд-серверу, из-за всплесков трафика может на некоторое время перегрузить сетевой стек, а повторные попытки создадут дополнительную нагрузку на бэкэнд как в очереди приема, так и в очереди ожидания (SYN backlog). Это, в свою очередь, может повлиять на клиентские соединения. Повторные попытки SYN контролируются параметром net.ipv4.tcp_syn_retries (по умолчанию 5 или 6 в зависимости от дистрибутива). Ограничьте количество повторных попыток SYN до 0 или 1, чтобы не было долгих повторных попыток отправки в течение 63130 с.

Более подробно о проблемах с клиентскими соединениями при обратном прокси-сервере читайте в статье Linux Kernel Tuning for High Performance Networking: Ephemeral Ports.

Очередь установленных соединений ожидающих принятия (accept queue) и somaxconn

Очередь запросов на соединение создает приложение, используя listen() и указывая размер очереди в параметре "backlog". Начиная с ядра 2.2 поведение этого параметра изменилось с максимального количества неоконченных запросов на соединение, которое может удерживать сокет, на максимальное количество полностью установленных соединений, ожидающих, пока они будут приняты. Как описано выше, максимальное количество неоконченных запросов на соединение теперь задается с помощью параметра ядра net.ipv4.tcp_max_syn_backlog.

somaxconn и параметр backlog в listen()

Хотя за размер очереди для каждого слушателя отвечает приложение, есть ограничение на количество соединений, которые могут находиться в очереди. Размером очереди управляют два параметра: 1) параметр backlog в функции listen() и 2) параметр ядра net.core.somaxconn, задающий максимальный размер очереди.

Значения по умолчанию для очереди

Значение по умолчанию для net.core.somaxconn берется из константы SOMAXCONN, которая в ядрах Linux вплоть до версии 5.3 имеет значение 128, но в 5.4 она была увеличена до 4096. Однако, на момент написания этой статьи, ядро 5.4 еще не очень распространено, поэтому в большинстве систем значение будет 128, если вы не модифицировали net.core.somaxconn.

Часто приложения для размера очереди по умолчанию используют константу SOMAXCONN, если этот размер не задается в конфигурации приложения. Хотя некоторые приложения устанавливают и свои значения по умолчанию. Например, в nginx размер очереди равен 511, который автоматически усекается до 128 в ядрах Linux до версии 5.3.

Изменение размера очереди

Многие приложения позволяют указывать размер очереди в конфигурации, указывая значение параметра backlog для listen(). Если приложение вызывает listen() со значением backlog, превышающим net.core.somaxconn, то размер очереди будет автоматически усечен до значения SOMAXCONN.

Потоки

Если очередь большая, то подумайте также об увеличении количества потоков, которые обрабатывают запросы в приложении. Например, установка для nginx очереди ожидания в 20480 для HTTP-listener без достаточного количества worker_connections для управления очередью приведет к тому, что сервер будет отказываться отвечать на запросы на установку соединения.

Соединения и файловые дескрипторы

Системные ограничения

Любое сокетное соединение использует файловый дескриптор. Максимальное количество дескрипторов, которые могут быть созданы в системе, задается параметром ядра fs.file-max. Посмотреть количество используемых дескрипторов можно следующим образом:

# cat /proc/sys/fs/file-nr1976      12       2048

Вывод показывает, что используется 1976 файловых дескрипторов. Выделено, но не используется 12 (для ядер 2.6+), а максимальное количество 2048. В высоконагруженной системе значение должно быть достаточно большим, чтобы справиться как с большим количеством соединений, так и с потребностями в файловых дескрипторах других процессов.

Пользовательские ограничения

Помимо системного ограничения количества файловых дескрипторов, у каждого пользователя есть свои лимиты. Они настраиваются в системном файле limits.conf (nofile) или, при запуске процесса под управлением systemd, в unit-файле systemd (LimitNOFILE). Чтобы увидеть значение по умолчанию запустите:

$ ulimit -n1024

Для systemd (на примере nginx):

$ systemctl show nginx | grep LimitNOFILE4096

Настройка

Для настройки системных ограничений установите параметр ядра fs.max-file в максимальное количество файловых дескрипторов, которое может быть в системе (с учетом некоторого буфера). Например:

fs.file-max = 3261780

Для настройки пользовательского лимита установите достаточно большое значение, чтобы хватило сокетам и файловым дескрипторам рабочих процессов (также с некоторым буфером). Пользовательские ограничения устанавливаются в /etc/security/limits.conf, в conf-файле в /etc/security/limits.d/ или в unit-файле systemd. Например:

# cat /etc/security/limits.d/nginx.confnginx soft nofile 64000nginx hard nofile 64000# cat /lib/systemd/system/nginx.service [Unit]Description=OpenResty Nginx - high performance web serverDocumentation=https://www.nginx.org/en/docs/After=network-online.target remote-fs.target nss-lookup.targetWants=network-online.target[Service]Type=forkingLimitNOFILE=64000PIDFile=/var/run/nginx.pidExecStart=/usr/local/openresty/nginx/sbin/nginx -c /usr/local/openresty/nginx/conf/nginx.confExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s TERM $MAINPID[Install]WantedBy=multi-user.target

Количество worker'ов

Аналогично файловым дескрипторам, количество worker'ов или потоков, которые может создать процесс, ограничено как на уровне ядра, так и на уровне пользователя.

Системные ограничения

Процессы могут создавать рабочие потоки. Максимальное количество потоков, которые могут быть созданы, задается параметром ядра kernel.threads-max. Для просмотра максимального и текущего количества потоков, выполняющихся в системе, запустите следующее:

# cat /proc/sys/kernel/threads-max 257083# ps -eo nlwp | tail -n +2 | \    awk '{ num_threads += $1 } END { print num_threads }'576

Пользовательские ограничения

Есть свои ограничения и у каждого пользовательского процесса. Это также настраивается с помощью файла limits.conf (nproc) или unit-файла systemd (LimitNPROC). Для просмотра максимального количества потоков, которое может создать пользователь запустите:

$ ulimit -u4096

Для systemd (на примере nginx):

$ systemctl show nginx | grep LimitNPROC4096

Настройка

В большинстве случаев системные ограничения достаточно большие, чтобы справиться с высокой нагрузкой. Однако их его можно настроить через параметр ядра kernel.threads-max. Установите его значение в максимальное количество потоков, необходимых системе, плюс некоторый буфер. Например:

kernel.threads-max = 3261780

Как и в случае с nofile, ограничения для пользователей (nproc) устанавливаются в /etc/security/limits.conf, в conf-файле в /etc/security/limits.d/ или в unit-файле systemd. Пример с nproc и nofile:

# cat /etc/security/limits.d/nginx.confnginx soft nofile 64000nginx hard nofile 64000nginx soft nproc 64000nginx hard nproc 64000# cat /lib/systemd/system/nginx.service [Unit]Description=OpenResty Nginx - high performance web serverDocumentation=https://www.nginx.org/en/docs/After=network-online.target remote-fs.target nss-lookup.targetWants=network-online.target[Service]Type=forkingLimitNOFILE=64000LimitNPROC=64000PIDFile=/var/run/nginx.pidExecStart=/usr/local/openresty/nginx/sbin/nginx -c /usr/local/openresty/nginx/conf/nginx.confExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s TERM $MAINPID[Install]WantedBy=multi-user.target

Обратный прокси и TIME_WAIT

При большом всплеске трафика прокси-соединения, застрявшие в "TIME_WAIT", суммарно могут потреблять много ресурсов при закрытии соединения. Это состояние говорит, что клиент получил последний FIN-пакет от сервера (или вышестоящего worker'а) и находится в ожидании для корректной обработки пакетов. Время нахождения соединения в состоянии "TIME_WAIT" по умолчанию составляет 2 x MSL (Maximum Segment Length максимальная длина сегмента), что составляет 2 x 60 с. В большинстве случаев случаях это нормальное и ожидаемое поведение, и значение по умолчанию в 120 с вполне приемлемо. Однако много соединений в состоянии "TIME_WAIT" может привести к тому, что приложение исчерпает эфемерные порты для соединений к клиентскому сокету. В этом случае следует уменьшить FIN тайм-аут.

Управляет этим тайм-аутом параметр net.ipv4.tcp_fin_timeout. Рекомендуемое значение для высоконагруженных систем составляет от 5 до 7 секунд.

Собираем все вместе

Очередь приема (receive queue) должна быть рассчитана на обработку всех пакетов, полученных через сетевой интерфейс, не вызывая отбрасывания пакетов. Также необходимо учесть небольшой буфер на случай, если всплески будут немного выше, чем ожидалось. Для определения правильного значения следует отслеживать файл softnet_stat на предмет отброшенных пакетов. Эмпирическое правило использовать значение tcp_max_syn_backlog, чтобы разрешить как минимум столько же SYN-пакетов, сколько может быть обработано для создания полуоткрытых соединений. Помните, что этот параметр задает количество пакетов, которое каждый процессор может иметь в своем буфере, поэтому разделите значение на количество процессоров.

Размер SYN очереди ожидания (SYN backlog queue) на высоконагруженном сервере должен быть рассчитан на большое количество полуоткрытых соединений для обработки редких всплесков трафика. Здесь эмпирическое правило заключается в том, чтобы установить это значение, по крайней мере, на максимальное количество установленных соединений, которое слушатель может иметь в очереди приема, но не выше, чем удвоенное количество установленных соединений. Также рекомендуется отключить SYN cookie, чтобы избежать потери данных при больших всплесках соединений от легитимных клиентов.

Очередь установленных соединений, ожидающих принятия (accept queue) должна быть рассчитана таким образом, чтобы в периоды сильного всплеска трафика ее можно было использовать в качестве временного буфера для установленных соединений. Эмпирическое правило устанавливать это значение в пределах 2025% от числа рабочих потоков.

Параметры

В этой статье были рассмотрены следующие параметры ядра:

# /etc/sysctl.d/00-network.conf# Receive Queue Size per CPU Core, number of packets# Example server: 8 coresnet.core.netdev_max_backlog = 4096# SYN Backlog Queue, number of half-open connectionsnet.ipv4.tcp_max_syn_backlog = 32768# Accept Queue Limit, maximum number of established# connections waiting for accept() per listener.net.core.somaxconn = 65535# Maximum number of SYN and SYN+ACK retries before# packet expires.net.ipv4.tcp_syn_retries = 1net.ipv4.tcp_synack_retries = 1# Timeout in seconds to close client connections in# TIME_WAIT after receiving FIN packet.net.ipv4.tcp_fin_timeout = 5# Disable SYN cookie flood protectionnet.ipv4.tcp_syncookies = 0# Maximum number of threads system can have, total.# Commented, may not be needed. See user limits.#kernel.threads-max = 3261780# Maximum number of file descriptors system can have, total.# Commented, may not be needed. See user limits.#fs.file-max = 3261780

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

# /etc/security/limits.d/nginx.confnginx soft nofile 64000nginx hard nofile 64000nginx soft nproc 64000nginx hard nproc 64000

Заключение

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


Узнать подробнее о курсе "Administrator Linux. Professional".

Смотреть вебинар Практикум по написанию Ansible роли.

Подробнее..

Как создать субдомен на том же ip, что и основной сайт? Используем apache web server

07.04.2021 10:06:45 | Автор: admin

В прошлой статье я писал, как добавить на сервер мониторинг. Вот только доступ до него не очень удобный, через порт: домен.com:8080/monitorix

Решил переделать, чтобы можно было достучаться по адресу monitorix.домен.com

И тут столкнулся с проблемой:

  • если я хочу делать субдомен только через А-запись DNS - то мне нужен будет отдельный ip адрес, а аренда отдельного ip стоит лишних денег

  • если я делаю через redirect - то в названии не будет monitorix.домен.com - будет просто при вводе адреса субдомен перенаправлять в домен.com:8080/monitorix - а это не то, что мне нужно

Как же быть? Самый простой рабочий вариант, который я нашёл - сделать распределение по субдоменам на уровне веб-сервера, на котором работает мой сайт.

Как это делается (считаем, что apache web server уже установлен):

Добавление A-записи сервера

Необходимо будет добавить А-запись.

А-запись должна вести на ваш основной сайт - на тот ip адрес, по которому работает apache web server:

Активация модулей apache web server

Для активации модулей нужно запустить последовательно следующий код,

2enmod proxy   --у меня сработало без этой строкиa2enmod proxy_httpa2enmod proxy_balancera2enmod lbmethod_byrequests

После чего необходимо перезапустить службу,

systemctl restart apache2

Добавление конфига для субдомена

Нужно перейти в папку etc/apache2/sites-available/ после чего создать в ней файл с конфигом вашего субдомена:

Файл субдомен.домен.com.conf

<VirtualHost *:80>

ServerAdmin admin@домен.com

ServerName субдомен.домен.com

ServerAlias субдомен.доменcom

ProxyRequests Off


#ProxyPass / http://localhost:8080/

<Location />

ProxyPreserveHost On

ProxyPass http://домен.com:8080/monitorix/

ProxyPassReverse http://домен.com:8080/monitorix/

</Location>

# Uncomment the line below if your site uses SSL.

#SSLProxyEngine On

</VirtualHost>

После чего добавить этот конфиг в apache web server:

a2ensite субдомен.домен.com.conf

Ещё раз перезапускаем web сервер:

systemctl restart apache2

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

Подробнее..

Программа для создания deb-пакетов

10.04.2021 08:21:14 | Автор: admin

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

Первый запуск и приветствие

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

И далее видим следующее:

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

Пример создания пакета

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

Рекомендуется указать короткое и длинное описание приложения. Остальное на ваше усмотрение. Дальше переходим на страницу указания зависимостей. Здесь я ничего не указывал.

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

Следующая страница скрипты. Здесь можно создать нужные скрипты, а можно и пропустить данный этап. Идем дальше!

После скриптов нужно указать изменения. Так как у нас первая версия приложения, то прописываем в соответствующем поле "Initial release". Нажимаем на плюс и получаем:

Далее указываем лицензию:

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

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

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

И далее:

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

На этом все! Надеюсь, что пост был для вас полезен.

Подробнее..

Категории

Последние комментарии

© 2006-2021, personeltest.ru