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

Linux

Перевод Кунг-фу стиля Linux запуск команд

17.01.2021 12:19:01 | Автор: admin
Одна из особенностей Linux- и Unix-подобных операционных систем, возможность мощная, но, в то же время, вызывающая немало путаницы, заключается в том, что в этих системах до одной и той же цели можно добраться разными путями. Возьмём, например, что-то простое, вроде запуска последовательностей команд. Как это сделать? Пожалуй, самый очевидный ответ на этот вопрос заключается в написании shell-скрипта. Это потрясающе гибкий подход к решению подобной задачи. Но что если нужно всего лишь запустить несколько команд, по возможности ничем не усложняя себе жизнь? Выглядит такая задача весьма простой, но существует множество способов решить её от простого ввода этих команд в командной строке, до планирования их запуска. За выполняющимися командами, кроме того, можно наблюдать, организовав мониторинг очереди задач так, как он может быть организован на мейнфрейме.



Поговорим о запуске команд в Linux, рассмотрим несколько способов запуска последовательностей команд из bash (и из многих других оболочек Linux). Здесь мы коснёмся таких вопросов, как использование утилит cron и at, поговорим о системе пакетного выполнения команд с использованием очереди (task spooler). Я, как и в большинстве случаев обсуждения возможностей Linux, не могу сказать, что то, о чём я хочу рассказать, хотя бы близко подходит к полному освещению способов запуска команд в Linux. Но я надеюсь, что мой рассказ даст вам некоторые идеи относительно управления выполнением последовательностей команд.

Запуск команд из командной оболочки


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

date ; df ; free

Этот приём работает в большинстве командных оболочек, которые более или менее похожи на bash. Он хорошо подходит для запуска простого набора команд. Команды просто выполняются последовательно. Но что если надо запустить нечто вроде такой конструкции:


Не запускайте эту последовательность команд в реальной системе!

Нам нужно стереть в папке foo все файлы (но не подпапки для этого нужен ключ -r). А что если не удастся выполнить команду cd? Тогда будут стёрты все файлы в текущей папке. А это очень плохая идея, которая, к тому же, нарушает правило наименьшего удивления.

Защититься от вышеописанной проблемы можно, воспользовавшись оператором &&. Эта последовательность символов, как и в языке C, представляет собой оператор И. Практически все Linux-команды возвращают, успешно отработав, 0, что воспринимается как истинное значение, а все остальные значения, указывающие на ошибки, считаются ложными. Это позволяет программистам возвращать коды ошибок при возникновении в программах каких-то проблем. Вот более удачный вариант вышеописанного примера:

cd /foo && ls  # команда rm тут не используется, поэтому эта конструкция ничего не испортит

Если директория foo существует команда cd вернёт 0, который будет воспринят как истинное значение. Это означает, что результат операции И может быть истинным. Поэтому работа продолжается и выполняется команда ls. А вот если команду cd выполнить не удастся результат будет ложным. Если любое из входных значений функции, реализующей логику оператора И, является ложным, то остальные входные значения роли уже не играют. В результате если хотя бы одна из частей этой конструкции вернёт ложное значение выполнение всей последовательности команд будет остановлено. Получается, что если директории /foo не существует команда ls попросту не выполнится.

С использованием && можно строить и более длинные конструкции.


Более длинная конструкция, в которой используется && (тут тоже есть rm, поэтому будьте очень осторожны, пытаясь запустить нечто подобное в реальной системе)

В ситуациях, подобных вышеописанной, может найти применение ещё один оператор || (ИЛИ). Он позволяет завершить работу после того, как хотя бы одна команда вернёт истинное значение, то есть отработает успешно. Например:

grep "alw" /etc/passwd || echo No such user



Использование ||

Попробуйте, вместо alw, ввести своё имя пользователя, а потом испытайте эту конструкцию с именем пользователя, которого в вашей системе нет (уверен, у вас нет пользователя alw). Если grep отработает успешно, то команда echo выполнена не будет.

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

Планирование запуска команд в определённое время


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

Файл crontab редактируют, пользуясь одноимённой командой (crontab -e). Каждая строка этого файла, не являющаяся комментарием, описывает некую команду, которую нужно выполнить. Первая часть такого описания сообщает о том, когда именно нужно выполнить команду. Вторая часть содержит указание на саму команду. Например, вот запись, позволяющая запустить команду обновления duckdns:

*/5 * * * * ~/duckdns/duck.sh >/dev/null 2>&1

В начале строки находится описание времени запуска команды минуты, час, день месяца, день недели. Конструкция */5 указывает на то, что команду нужно запускать каждые 5 минут. Символы * являются универсальными местозаполнителями, представляющими любой час, день месяца и так далее. Есть множество особых конструкций, которыми можно пользоваться в подобных описаниях. Для того чтобы упростить их составление можете попробовать этот crontab-редактор. Пример работы с ним показан ниже.


Работа с crontab-редактором

Правда, при использовании cron можно столкнуться с одной проблемой. Она заключается в том, что логика утилиты основана на предположении о том, что компьютер работает в режиме 24/7. Так, если запланировать запуск некоей задачи на ночь, а ночью компьютер будет выключен задача выполнена не будет. Есть ещё одна утилита, anacron, которая создана в попытке исправить этот недостаток. Она, учитывая некоторые ограничения, похожа на cron, но она навёрстывает упущенное в том случае, если на момент запланированного запуска некоей задачи компьютер был выключен.

Иногда нужно выполнить некую команду в заданное время лишь один раз. Сделать это можно с помощью команды at:

at now + 10 minutes

В ответ на эту команду будет показано простое приглашение командной строки, с помощью которого можно вводить команды. В данном случае эти команды будут выполнены через 10 минут. Эта команда, конечно, поддерживает и указание абсолютных временных значений. Кроме того, программа вас поймёт, если вы вместо 4PM сообщите ей о teatime (серьёзно). Команда atq позволяет просмотреть список запланированных задач. А команда atrm позволяет отменять запуск запланированных команд. Это пригодится в том случае, если по какой-то причине в выполнении запланированной команды больше нет необходимости. Если воспользоваться пакетной формой команды (batch), система выполнит команды тогда, когда нагрузка на неё будет не слишком высокой.

Если почитать справку по at, то можно узнать о том, что утилита, по умолчанию, использует очередь a для обычных задач, а очередь b для пакетных задач. Для указания очередей можно использовать буквы из диапазонов a-z и A-Z. От имени очереди зависит приоритет помещённых в неё задач.

Тут мне хотелось бы отметить то, что в большинстве систем все задачи, поставленные в очередь, будут выполняться в оболочке, заданной как оболочка, используемая по умолчанию (вроде /bin/sh), и это необязательно будет bash. Может понадобиться использовать именно bash, или протестировать команды в оболочке, используемой по умолчанию. Если просто запустить скрипт, в котором, в качестве интерпретатора указан bash (например #!/usr/bin/bash), то это будет незаметно.

Пакетное выполнение задач


Хотя утилита at имеет вариант, выглядящий как batch, её нельзя назвать полноценной системой, предназначенной для пакетного выполнения задач. Существует несколько подобных систем для Linux, обладающих различными особенностями. Одна из таких систем называется Task Spooler (в репозиториях Ubuntu task-spooler). В некоторых системах соответствующая команда выглядит как ts, но в Debian использование подобного имени команды приводит к конфликту, поэтому там используется команда tsp.

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

alw@enterprise:~$ tsp wget http://www.hackaday.com0alw@enterprise:~$ tspID State Output E-Level Times(r/u/s) Command [run=0/1]0 finished /tmp/ts-out.TpAPIV 0 0.22/0.00/0.00 wget http://www.hackaday.comalw@enterprise:~$ tsp -i 0Exit status: died with exit code 0Command: wget http://www.hackaday.comSlots required: 1Enqueue time: Fri Jun 9 21:07:53 2017Start time: Fri Jun 9 21:07:53 2017End time: Fri Jun 9 21:07:53 2017Time run: 0.223674salw@enterprise:~$ tsp -c 0--2017-06-09 21:07:53-- http://www.hackaday.com/Resolving www.hackaday.com (www.hackaday.com)... 192.0.79.32, 192.0.79.33Connecting to www.hackaday.com (www.hackaday.com)|192.0.79.32|:80... connected.HTTP request sent, awaiting response... 301 Moved PermanentlyLocation: http://hackaday.com/ [following]--2017-06-09 21:07:53-- http://hackaday.com/Resolving hackaday.com (hackaday.com)... 192.0.79.33, 192.0.79.32Reusing existing connection to www.hackaday.com:80.HTTP request sent, awaiting response... 200 OKLength: unspecifiedSaving to: index.html0K .......... .......... .......... .......... .......... 1.12M50K .......... .......... .......... ... 6.17M=0.05s2017-06-09 21:07:53 (1.68 MB/s) - index.html saved [85720]

Первая команда запускает, в виде задачи, утилиту wget (это, на самом деле, задача 0). Выполнение команды tsp позволяет просмотреть список задач, находящихся в очереди (в данном случае это всего одна задача, которая уже завершена). Опция -i позволяет просмотреть сведения об указанных задачах. Опция -c выводит выходные данные задачи. Опцию -c можно воспринимать как нечто вроде команды cat. Ещё одна опция, -t, похожа на опцию -f команды tail. Выходные данные задачи можно, кроме того, отправить по электронной почте, воспользовавшись опцией -m.

Обычно система пакетного выполнения задач выполняет одновременно лишь одну задачу. Это можно изменить, воспользовавшись опцией -S. Можно сделать так, чтобы некая задача ожидала бы, перед запуском, окончания работы предыдущей задачи. Это делается с помощью опции -d. Запуск задачи можно связать и с окончанием произвольно выбранной задачи для этого используется опция -w.

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

Итоги


Как и во многих других ситуациях, возникающих при работе в Linux, вышеописанные способы запуска наборов команд можно комбинировать. Например, можно сделать так, чтобы cron поставил бы задачу в очередь. А сама эта задача может представлять собой скрипт, в котором применяются операторы && и ||, управляющие внутренней логикой выполнения набора команд. Думаете, что это неоправданно сложно? Может быть. Как я уже говорил, можно просто взять и написать обычный скрипт. Но в Linux есть и много других полезных механизмов для решения самых разных задач.

Как вы обычно запускаете наборы команд в Linux?

Подробнее..

Перевод Новый высокопроизводительный одноплатный компьютер BeagleV построенный на открытой архитектуре RISC-V за 119

16.01.2021 02:07:06 | Автор: admin
BeagleV SBC

До недавнего времени платы построенные на процессоре RISC-V такие как Kendryte K210, невозможно было использовать для высоко ресурсоемких задач, т.к. производительность конечных была очень низкой. В частности одноплатный компьютер XuanTie C906 на базе Allwinner RISC-V можно было использовать только для нишевых небольших задач, например в качестве камеры из-за отсутствия аппаратного графического ускорителя и наличия только 256 МБ оперативной памяти. Можно использовать одноплатные компьютеры такие как SiFive HiFive Unmatched или PolarBerry, но стоимость конечной системы составит сотни, а то и более тысячи долларов, что является весьма дороговато.

Таким образом, очевидна необходимость в недорогом одноплатном компьютере на Linux, построенным на высокопроизводительном процессоре RISC-V. И есть отличная новость, фонд BeagleBoard.org, Seeed Studio и китайский фабричный производитель микросхем Starfive объединились для разработки и производства одноплатного компьютера BeagleV (Beagle Five) на базе двухъядерного процессора StarFive JH7100 (ядро SiFive U74 RISC-V) с цифровым сигнальным процессором(DSP) для компьютерного зрения, ускорителем машинного обучения (Deep learning) NVDLA и нейронной сети для искусственного интеллекта (AI).

Технические характеристики BeagleV:
  • Процессор: SoC StarFive JH7100 Vision SoC с:
    • двухядерным ядром RISC-V U74 с 2MB L2 cache @ 1.5 GHz
    • Vision DSP Tensilica-VP6 для компьютерного зрения
    • NVDLAEngine 1 core (configuration 2048 MACs @ 800MHz 3.5 TOPS)
    • Ускоритель нейронной сети (1024MACs @ 500MHz 1 TOPS)
    • VPU H.264/H.265 decoder up to 4Kp60, dual-stream decoding up to 2Kp30
    • JPEG encoder/decoder
    • Цифровым сигнальным процессором(DSP) для обработка аудио потока

  • Оперативная память: 4GB или 8GB LPDDR4
  • Пользовательская память: слот MicroSD
  • Видео:
    • 1x HDMI порт с поддержкой разрешения до 1080p30
    • 1x MIPI DSI интерфейс с поддержкой разрешения до 4Kp30
    • MIPI-CSI TX для вывода видео после обработки модуля искусственного интеллекта (AI)

  • Камера:Двухканнальный процессор обработки изображений (ISP) с поддержкой разрешения до 4K @ 30FPS,2 x MIPI-CSI Rx
  • Звук: аналоговый вывод (3.5 mm TRRS jack)
  • Связь: 1x Gigabit Ethernet, 2.4 GHz 802.11b/g/n WiFi 4, и Bluetooth 4.2
  • USB: 4 порта USB 3.0
  • Expansions Header: 40-контактный разъем совместимый с Raspberry Pi 3, включает GPIO с 28 x GPIO, I2C, I2S, SPI, UART
  • Безопасность: поддержка TRNG и OTP
  • Разное: кнопка питания и сброса
  • Питание: 5V/3A через порт USB Type-C
  • Размер: 9070 (приблизительно) мм.


BeagleV block diagram

Основываясь на сведениях о ядре SiFive U74, производительность должна быть эквивалентна ядру Cortex-A55. Cortex-A55 является приемником Cortex-A53 на котором построен процессор Allwinner A64. По заявлению компании ARM, ядро Cortex-A55 имеет на 18% большую производительность и на 15% большую энергоэффективность. Плата Banana Pi BPI-M64 содержит 4-ядра Cortex-A53 с частотой 1.2 GHz, а BeagleV будет содержать два ядра RISC-V U74 с частотой 1.5 GHz, что говорит о практически идентичной производительности.

Поэтому производительность одноплатного компьютера BeagleV будет не такой высокой по сравнению с платами на процессоре Arm, но за счет наличия модуля ускорителя нейронной сети и цифрового зрения, BeagleV будет конкурентоспособным по сравнению с другими платами с искусственными интеллектом, такими как Coral Dev Board mini.

Первая партия поставок плат запланированная на март будет без графического процессора, но следующая которая должна будет выпущена в сентябре будет с графическим процессором от Imagination Technologies GPU.

Поддержка BeagleV будет в основной ветки mainline Linux, образ ОС будет построен на версии Debian. Так будет поддержка Fedora и FreeRTOS. Одноплатные компьютеры на RISC-V являются открытым аппаратным обеспечением(open-source hardware) как и другие платы организации BeagleBoard.org, это означает что файлы дизайна оборудования(hardware design files), прошивки(firmware) и программное обеспечение будут общедоступными.

Конечная цена BeagleV составит $119 с 4GB RAM и $149 с 8GB RAM, но первая партия будет выпущена только с 8GB RAM. Энтузиасты и гики могут заполнить заявку на получение платы на сайте. Так же можно оформить предзаказ платы в Seeed Studio. Дополнительную информацию можно найти на странице продукта.

Ссылки:


Подробнее..

FOSS News 48 дайджест новостей и других материалов о свободном и открытом ПО за 21-27 декабря 2020 года

27.12.2020 14:05:39 | Автор: admin


Всем привет!

Продолжаем дайджесты новостей и других материалов о свободном и открытом ПО и немного о железе. Всё самое главное про пингвинов и не только, в России и мире. Ростелеком переводит свои серверы на российский Linux дистрибутив Ред ОС; опубликован отчёт о становлении дистрибутива Rocky Linux, идущего на смену CentOS; 10 главных Open Source новостей 2020 г. по версии opensource.com; вышел подкаст Полная история Fediverse и многое другое.

Оглавление


  1. Главное
    1. Ростелеком переводит свои серверы на российский Linux дистрибутив Ред ОС
    2. Опубликован отчёт о становлении дистрибутива Rocky Linux, идущего на смену CentOS
    3. 10 главных Open Source новостей 2020 г. по версии opensource.com
    4. Вышел подкаст Полная история Fediverse
  2. Короткой строкой
    1. Новости
      1. Открытие кода и данных
      2. Новости FOSS организаций
      3. Ядро и дистрибутивы
      4. Специальное
      5. Обучение
      6. Мобильные
      7. Безопасность
      8. Для разработчиков
      9. Пользовательское
      10. Железо
    2. Статьи
      1. Новости FOSS организаций
      2. DIY
      3. Ядро и дистрибутивы
      4. Специальное
      5. Обучение
      6. Базы данных
      7. Мультимедиа
      8. Безопасность
      9. DevOps
      10. AI & Data Science
      11. Web
      12. Для разработчиков
      13. Менеджмент
      14. Пользовательское
      15. Игры
      16. Разное
    3. Релизы
      1. Ядро и дистрибутивы
      2. Специальное
      3. Базы данных
      4. Мультимедиа
      5. Мобильные
      6. Web
      7. Для разработчиков
      8. Пользовательское
      9. Игры

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


Главное



Ростелеком переводит свои серверы на российский Linux дистрибутив Ред ОС



Категория: Новости/Внедрения



CNews сообщает, что Ростелеком планирует перевести свои серверы на российский дистрибутив GNU/Linux Ред ОС. Перевод планируется завершить до конца 2023 г. Также в будущем корпорация собирается перевести на отечественные ОС и рабочие места сотрудников. Ред ОС сертифицирована ФСТЭК России, это подтверждает соответствие требованиям информбезопасности и позволяет применять систему в государственных информационных системах. Ред ОС, как сообщает CNews, будет основной серверной системой Ростелекома. По словам разработчиков, дистрибутив базируется на собственных наработках и свободном ПО, взятом из репозиториев. В Ред ОС используется формат пакетов RPM, как в дистрибутивах семейства Red Hat.

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

Опубликован отчёт о становлении дистрибутива Rocky Linux, идущего на смену CentOS



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



OpenNET сообщает, что проект Rocky Linux, нацеленный на создание новой свободной сборки RHEL, способной занять место классического CentOS, опубликовал первый отчёт. Некоторые интересные момент из него, по версии издания:

  1. Для курирования разработки, взаимодействия со спонсорами и юридического представления проекта в США зарегистрирована некоммерческая организация The Rocky Linux Foundation.
  2. Основное внимание сосредоточено на подготовке инфраструктуры для сопровождения проекта и разработки первого релиза, который ожидается в начале второго квартала 2021 года.
  3. Более 370 человек зарегистрировалось в качестве волонтёров и желающих поддержать проект.
  4. Несколько компаний выразили желание стать спонсорами проекта и готовы предоставить разработчиков, оборудование, финансирование и облачные окружения для инфраструктуры.


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

10 главных Open Source новостей 2020 г. по версии opensource.com



Категория: Статьи/Новости FOSS организаций



Издание opensource.com составило список главных событий (как отдельных новостей так и более общих трендов) уходящего года:

  1. FOSS конференции успешно переехали в онлайн
  2. Open Source проекты активно участвуют в борьбе с COVID-19
  3. Java отметила 25-ю годовщину
  4. GNOME запустил новую программу для участников
  5. CERN использует открытую платформу Ceph для хранения даннных
  6. CNCF взяла под свою ответственность развитие Red Hat Operator Framework
  7. Два региона Германии внедрили открытую платформу мессенджинга Element на 500 000 пользователей
  8. Состоялся публичный релиз системы построения API Strapi после 5 лет разработки
  9. Wireguard включён в ядро Linux
  10. Mozilla Foundation создала дочерний фонд для разработки Thunderbird


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

Вышел подкаст Полная история Fediverse



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



Пользователь ludi_vokrug пишет на linux.org.ru: На сервисе open.tube в рамках нерегулярного любительского подкаста Пересборка администратором одной из нод распределенной (федеративной) социальной сети Mastodon опубликован подкаст, рассказывающий на русском языке наиболее полную историю развития проектов, связанных в федеративные социальные сети. Подкаст является результатом практически годового труда сбора информации, общения с непосредственными создателями отдельных технологий и так далее. В двухчасовом подкасте можно услышать о том, какие технологии непосредственно предшествовали федеративным социальным сетям, как развивались технологии в эпоху протокола oStatus, каким образом федиверсу удалось не кануть в небытие следом за jabber и переродиться вокруг протокола ActivityPub. Отдельно в подкасте рассказывается об основных заметных проектах в Fediverse: Mastodon, Misskey, Pixelfed, PeerTube, Pleroma и остальные. Все ранее выпущенные части подкаста отредактированы и перезаписаны таким образом, чтобы история получилась цельной и оконченной.

Источник []
Подкаст []

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



Новости



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



Опубликован исходный код клиента для Threema []

Новости FOSS организаций



  1. Red Hat объясняет трансформацию CentOS желанием сделать более открытой разработку RHEL []
  2. Fedora отказывается от использовании имени master в репозиториях []
  3. Поиск с помощью pip search в репозитории PyPi отключён в связи с возросшей нагрузкой []
  4. Избран управляющий совет, который будет руководить разработкой Perl []
  5. Завершён переход FreeBSD с системы контроля версий Subversion на Git []
  6. Еженедельник OSM 543 []


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



  1. В ядре версии 5.10 обнаружена регрессия производительности BtrFS []
  2. В Linux 5.11 убран доступ к информации о напряжении и токе процессоров AMD Zen из-за отсутствия документации []


Специальное



  1. Основная команда разработчиков radare2 форкнула его в новый продукт Rizin []
  2. Компания Sony опубликовала Linux-драйвер для игрового контроллера PlayStation 5 DualSense []


Обучение



Анонс, предзаказ и бесплатные уроки видеокурса по Apache Kafka []

Мобильные



  1. KDE Plasma Mobile прекращает поддержку Halium и переключает внимание на телефоны с основной ветвью ядра Linux []
  2. Plasma Mobile завершает 2020 крупными обновлениями []


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



Уязвимость в Apache Airflow, допускающая использование одного сеанса на разных серверах []

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



Microsoft и Azul портируют OpenJDK на новый процессор Apple Silicon M1 []

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



  1. В GNOME 40 ожидаются значительные изменения интерфейса GNOME Shell []
  2. MyGNUHealth, компонент GNU Health для записи и учёта данных о личном здоровье, стал проектом KDE []


Железо



Huawei готовит свой самый неформатный ноутбук с Kirin 990 и Linux []

Статьи



Новости FOSS организаций



Проекту FFmpeg исполнилось 20 лет []

DIY



  1. 10 идей проектов на Raspberry Pi из 2020 [ (en)]
  2. Микшерный пульт из USB-звучки и опенсорса []


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



Дистрибутивы Linux похожие на Windows []

Специальное



  1. HDB++ TANGO Archiving System []
  2. Linux Experiments LAB []


Обучение



  1. .Использование GitHub в обучении студентов []
  2. .Использование GitHub в обучении. Примеры. Часть I []
  3. 4 пути как Open Source преобразовал сферу образования в 2020 [ (en)]


Базы данных



Заряжай Patroni. Тестируем Patroni + Zookeeper кластер (Часть первая) []

Мультимедиа



Стримим и кастим youtube и не только (часть 2) Raspicast, Mps-Youtube и Youtube-viewer []

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



5 лучшие Open Source практик безопасности из 2020 [ (en)]

DevOps



  1. Понимание вертикального автомасштабирования подов в Kubernetes []
  2. 10 уроков от системных администраторов, адаптирующихся к изменениям в 2020 [ (en)]
  3. k0s: Kubernetes в одном бинарном файле []
  4. Headlamp новый GUI для работы с Kubernetes []
  5. Системы мониторинга сервера Linux []
  6. Руководство по использованию Tarantool Cartridge в Kubernetes []
  7. 7 вещей, которые нужно проработать, прежде чем запускать OpenShift в продакшн []
  8. Эксплуатация Ceph: флаги для управления восстановлением и перемещением данных []
  9. Практические истории из наших SRE-будней. Часть 3 []
  10. 3 критически важных DevOps концепций которые показал 2020-й год [ (en)]
  11. Решение проблем связанности микросервисов с помощью сетевых журналов []
  12. Безопасность конфиденциальных данных с Traefik Enterprise и Vault []


AI & Data Science



Проектируем интенты с Apache NlpCraft []

Web



Лучшие мессенджеры Linux []

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



  1. Переоткрываем для себя Algol 68, программируя игру [ (en)]
  2. Анализ зависимости безопасности кода от используемого языка программирования []
  3. Отладка Makefile /часть 1/ []
  4. Сборка и установка Linux пакетов в российских сертифицированных ОС []
  5. Отладка Makefile /часть 2/ []
  6. Учим Rust программируя игру [ (en)]
  7. Особенности портирования сложного модульного ПО написанного на Delphi под ОС Linux []
  8. Об использовании текстового редактора в Eclipse IDE [ (en)]
  9. 5 причин использовать редактор Atom [ (en)]
  10. 10 лучших статей о Rust из 2020-го года [ (en)]
  11. О VRSpace, с помощью которого можно играть в VR игру между разными платформами [ (en)]
  12. История потерянного коммита []
  13. Git, я хочу все отменить! Команды исправления допущенных ошибок []
  14. Что выбрать в качестве библиотеки компонентов для React-проекта []


Менеджмент



  1. 5 историй о том как открытые принципы изменили организации в 2020-м году [ (en)]
  2. 4 причины почему бизнес адоптировал Open Source в 2020-м году [ (en)]


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



  1. 6 показателей того, как Focuswriter позволяет лучше сфокусироваться [ (en)]
  2. Об использовании редактора KWrite [ (en)]
  3. 10 обязательных к прочтению историй успеха пользователей Linux в 2020-м году [ (en)]
  4. Notepadqq текстовый редактор, вдохновлённый Notepad++ [ (en)]
  5. Монтирование сетевой папки в Linux []
  6. Font Manager: простая Open Source программа для GTK+ [ (en)]
  7. Учимся пользоваться средством работы с текстом Sed [ (en)]
  8. Как использовать heredoc для редактироавния текста [ (en)]
  9. Что такое GUI и CLI []
  10. О текстовом редакторе GNU nano, более простой альтернативе Vim [ (en)]


Игры



Универсальный менеджер приложений (игр) []

Разное



  1. Чего музыканты боятся больше: пиратства или монополизации прав на результаты их творчества []
  2. 9 историй о переходе на Open Source альтернативы в 2020-м году [ (en)]


Релизы



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



  1. Релиз дистрибутива Tails 4.14 []
  2. Выпуск дистрибутива Q4OS 3.13 [ 1, 2]
  3. Первый выпуск DentOS, сетевой операционной системы для коммутаторов []
  4. Выпуск Icaros Desktop 2.3, дистрибутива операционной системы AROS []
  5. Представлен порт Linux для игровых приставок Nintendo 64 []
  6. Выпуск операционной системы Redox OS 0.6, написанной на языке Rust []
  7. Релиз дистрибутива 4MLinux 35. Что нового []


Специальное



  1. Релиз QVGE 0.6.2 (визуальный редактор графов) []
  2. Доступна система резервного копирования Bareos 20 []
  3. pcem v17 вышел []
  4. lsFusion 4: сводные таблицы, графики, карты и календари, OAuth-аутентификация, темная тема и многое другое []


Базы данных



Выпуск СУБД TimescaleDB 2.0 []

Мультимедиа



  1. Выпущены аудиоэффекты LSP Plugins 1.1.28 []
  2. Guitarix 0.42.0 []
  3. Релиз видеоредактора Kdenlive 20.12 [ 1, 2, 3]
  4. Выпуск программы для профессиональной обработки фотографий Darktable 3.4 [ 1, 2]


Мобильные



Ubuntu Touch 15. Релиз Ubuntu для смартфонов []

Web



  1. Выпуск браузера Pale Moon 28.17 []
  2. Обновление Firefox 84.0.1 []
  3. Проект KDE представил коммуникационный клиент NeoChat 1.0 [ 1, 2, 3]


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



  1. Выпуск пакетного менеджера NPM 7.3 []
  2. Релиз GTK 4. Что нового []
  3. Релиз PoCL 1.6, независимой реализации стандарта OpenCL []
  4. Выпуск мультимедийной библиотеки SDL 2.0.14 [ 1, 2]
  5. Выпуск среды разработки Tizen Studio 4.1 []
  6. Выпуск языка программирования Ruby 3.0 []


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



  1. Релиз оконного менеджера IceWM 2.0 []
  2. Вышел Camelot v0.2 []
  3. Релиз пользовательского окружения Xfce 4.16 [ 1, 2, 3]


Игры



  1. Выпущен FlightGear 2020.3.5 []
  2. fheroes 0.8.4 []


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



Видео: IT новости #32 Что ждать в GNOME 40, GTK 4, Raspberry Pi 400, Plasma Mobile, новый Bash []



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

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

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

Подписывайтесь на наш Telegram канал, группу ВКонтакте или RSS чтобы не пропустить новые выпуски FOSS News.

[] Предыдущий выпуск
Подробнее..

FOSS News 49 дайджест материалов о свободном и открытом ПО за 28 декабря 2020 года 3 января 2021 года

03.01.2021 18:23:42 | Автор: admin


Всем привет!


Продолжаем дайджесты новостей и других материалов о свободном и открытом ПО и немного о железе. Всё самое главное про пингвинов и не только, в России и мире. 20 лет проекту Sisyphus; компания Mozilla работает над новым оформлением Firefox; оценка предпочтений пользователей Linux в выборе оборудования; 5 вещей, которые мы выучили за 2020 год по версии opensource.com, и многое другое.


P.S.: В ближайшие дни также будет спецвыпуск FOSS News с итогами прошедшего года.


Оглавление


  1. Главное
    1. 20 лет проекту Sisyphus
    2. Компания Mozilla работает над новым оформлением Firefox
    3. Оценка предпочтений пользователей Linux в выборе оборудования
    4. 5 вещей, которые мы выучили за 2020 год по версии opensource.com
  2. Короткой строкой
    1. Новости
      1. Открытие кода и данных
      2. Новости FOSS организаций
      3. Ядро и дистрибутивы
      4. Системное
      5. Web
      6. Пользовательское
    2. Статьи
      1. DIY
      2. Ядро и дистрибутивы
      3. Системное
      4. Специальное
      5. Базы данных
      6. Мобильные
      7. DevOps
      8. AI & Data Science
      9. Web
      10. Для разработчиков
      11. Пользовательское
      12. Разное
    3. Релизы
      1. Ядро и дистрибутивы
      2. Системное
      3. Специальное
      4. Обучение
      5. Мультимедиа
      6. Web
      7. Для разработчиков
      8. Игры
      9. Разное
  3. Что ещё посмотреть
  4. Заключение

Главное


20 лет проекту Sisyphus


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




OpenNET пишет: Непрерывно обновляемому репозиторию свободных программ Sisyphus, используемому для формирования дистрибутивов ALT, исполнилось 20 лет. За прошедшие два десятилетия работа над сизифом привела к существенной доработке базовых rpm и apt-rpm, созданию оригинальной сборочной инфраструктуры (hasher, gear, girar), выработке подходов к формированию стабильных репозиториев и подготовке выпусков на их (и сизифа!) основе. В настоящее время в репозитории присутствует около 18 тыс. пакетов, поддержкой которых занимается более 250 участников проекта. Многие люди пришли принять участие в команде; многие из них уже покинули её по тем или иным причинам, но всё-таки оставили свой след в этом живом памятнике трудам русских хакеров. А когда вдруг понадобились отечественные продукты как минимум один из них уже был готов и способен идти дальше самостоятельно.


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

Компания Mozilla работает над новым оформлением Firefox


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




OpenNET пишет: Компания Mozilla приступила к работе по модернизации интерфейса Firefox. Обновлённое оформление развивается в рамках проекта Proton и охватывает внешний вид таких элементов, как адресная строка, диалоги, панель вкладок, основное и контекстные меню. Новый интерфейс планируется реализовать в выпуске Firefox 89, намеченном на 18 мая. Из находящихся в разработке изменений выделяется новое оформление вкладок и всплывающих подсказок, в которых начнут показываться эскизы сайтов и отформатированный текст. Наборы вкладок (контейнеры) будут сгруппированы и представлены на панели в виде отдельного виджета, выглядящего как одна вкладка. Изменится наименование элементов меню заглавные буквы будут оставлены только для первого слова (например, вместо Other Bookmarks будет Other bookmarks). Кроме того, как минимум, появится компактный режим и будут переработаны модальные диалоги с предупреждениями, подтверждениями и запросами.


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

Оценка предпочтений пользователей Linux в выборе оборудования


Категория: Новости/Железо




OpenNET пишет: Проект Linux-Hardware.org проанализировал какое оборудование выбирали пользователи Linux в 2020 году и как изменились их предпочтения за прошедший год. Отчёт основан на пробах оборудования 47 тысяч компьютеров, отправленных Linux-пользователями в 2020 году. Подробности и отчёты по конкретным дистрибутивам Linux доступны в GitHub-репозитории.


Основные выводы:


  1. Доля пользователей i686 резко сократилась.
  2. Доля пользователей ПК продолжает падать. Доля пользователей ноутбуков продолжает расти.
  3. Только 30% респондентов обновили оборудование в 2020 году. Половина из них купили новое оборудование, а остальные прошлогоднее оборудование произведенное в 2019 году.
  4. Доля компьютеров с включенным SecureBoot продолжает медленно расти.
  5. Доля компьютеров без CD-ROM впервые превысила количество компьютеров с CD-ROM. Компакт-диски уходят в прошлое.
  6. Доля компьютеров только с WiFi (без порта Ethernet) продолжает расти.
  7. ASUSTek сдаёт позиции в пользу HP, Lenovo, Dell, Acer и MSI. Gigabyte стагнирует.
  8. Доля моделей ThinkPad и IdeaPad от Lenovo и Latitude от Dell продолжает расти.
  9. Доля SSD и NVMe по итогам года обогнала HDD.
  10. Самый популярный HDD Seagate показывает медленный рост, остальные стагнируют.
  11. Самый популярный SSD Samsung показывает медленный рост. Crucial и WDC демонстрируют относительно быстрый рост.
  12. Доля мониторов Full HD в этом году резко увеличилась и сейчас занимает половину от общего количества мониторов. Доля 4K-мониторов тоже продолжает расти.
  13. Доля видеокарт Intel и AMD продолжает медленно расти. Доля пользователей NVIDIA продолжает медленно падать.
  14. Доля процессоров AMD начала расти. Доля процессоров Intel начала падать.
  15. Доля WiFi чипов от Intel быстро растет, остальные стагнируют.
  16. Чипы Realtek Ethernet сдают позиции в пользу Intel.
  17. Доля Bluetooth чипов от Intel продолжает быстро расти, остальные стагнируют.

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

5 вещей, которые мы выучили за 2020 год по версии opensource.com


Категория: Статьи/Разное




Джен Уайк Хугер из Red Hat побеседовал с несколькими представителями Open Source сообщества и вот какие есть взгляды на прошедший год:


  1. Спрос на облачные технологии, оборудование и решения с открытым исходным кодом для удаленной работы рос с астрономической скоростью.
  2. Мы все почувствовали боль, которую опытные удалённые сотрудники испытывали годами, и мы нашли способы справляться.
  3. Несмотря на отсутствие тесного контакта, такие инструменты, как Google Meet, Jitsi и Zoom, позволяют нам поддерживать связь с помощью эффективных и гибких способов.
  4. Развитие программных технологий превосходит самые смелые мечты сторонников подхода точно в срок.
  5. Это был трудный год для всех нас, но есть и светлая сторона. Я видел своих друзей и семью чаще в 2020 году, чем в прошлые годы.

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


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


Новости


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


  1. Представлена открытая плата управления ракетой Cygnus-X1 []
  2. Microsoft опубликовал заголовочные файлы DirectX под лицензией MIT []

Новости FOSS организаций


  1. LibreOffice удалил интеграцию с VLC и остается с GStreamer []
  2. Джои Хесс бросает поддерживать github-backup []
  3. Нарушена работа поиска пакетов по Python-репозиторию PIP []
  4. Еженедельник OSM 544 []
  5. В преддверии праздника участники KDE подводят итоги прошедшего года. Что запомнилось им больше всего? []

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


Работа DNF/RPM в Fedora 34 будет ускорена []

Системное


  1. Прозрачное сжатие Btrfs при помощи Zstd по умолчанию в Fedora 34 []
  2. Из Mesa удалён драйвер программной отрисовки swrast []

Web


TabFS FUSE-модуль с файловой системой для работы со вкладками браузера []

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


  1. На этой неделе в KDE: все дела! []
  2. На этой неделе в KDE: kio-fuse и NeoChat []

Статьи


DIY


Безумный дом []

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


  1. Установка Kodachi Linux []
  2. Легкие дистрибутивы Linux для Intel Atom []

Системное


  1. Western Digital разработала новую файловую систему для Linux-систем []
  2. Почему хабражители предпочитают велосипеды, вместо готовых решений? Или о systemd, part 0 []
  3. Systemd для продолжающих. Part 1 Запуск юнитов по временным событиям []

Специальное


Об исследовании космоса с помощью KStars[(en)]


Базы данных


  1. Заряжай Patroni. Тестируем Patroni + Zookeeper кластер (Часть вторая) []
  2. Мониторинг Tarantool: логи, метрики и их обработка []
  3. Аварии как опыт #1. Как сломать два кластера ClickHouse, не уточнив один нюанс []

Мобильные


Let's Encrypt решил проблему с продолжением работы сертификатов на старых Android-устройствах []

DevOps


  1. Практический взгляд на хранение в Kafka []
  2. Выводы Grofers после двух лет Kubernetes в production []
  3. Go-приложение с бессерверной архитектурой на Kubernetes с Knative []
  4. Как подключиться к контейнеру Docker []
  5. Написание Dockerfile. Лучшие практики []
  6. Ускоряем CI/CD-пайплайн с помощью Kubernetes в Docker (KinD) []
  7. 4 соображения для того чтобы начать внедрять CI/CD в 2021 [(en)]

AI & Data Science


DVC vs GIT. Почему GIT'а недостаточно в проектах машинного обучения []

Web


Rocket.Chat: отличная Open Source альтернатива для Slack [(en)]


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


  1. Практика программирования на C++ через написание простой игры [(en)]
  2. Изучение Python через написание простой игры [(en)]
  3. Топ 10 ошибок в проектах Java за 2020 год []
  4. Простое и удобное журналирование ошибок для сайтов на .NET Core []
  5. Отображение прогресса в Python приложениях с tqdm [(en)]
  6. Бранч-стратегии при разработке в Git []
  7. Карантин для динамической памяти ядра Linux []
  8. 10 примеров использования Python в 2020 [(en)]
  9. Изучение Lua через написание игры угадай число [(en)]
  10. Создание собственного текстого редактора на Java [(en)]
  11. 10 вещей за которые стоит любить Git [(en)]
  12. Решение типичной проблемы организации поставок с помощью языка программирования Julia [(en)]

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


  1. О записи своих идей с помощью текстового редактора KJots[(en)]
  2. Как использовать текстовый редактор JOE в Linux [(en)]
  3. Что такое LTS []
  4. Как вернуть старый MacBook к жизни с помощьюLinux [(en)]
  5. Об опыте использования текстового редактора Pe [(en)]
  6. Об использовании редактора Markdown в Nextcloud [(en)]

Разное


  1. 9 инсайтов от переключения на удалённую работу в 2020 [(en)]
  2. Исполняемые PNG: запускаем изображения как программы []

Релизы


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


  1. Redox OS 0.6.0 []
  2. Выпуск дистрибутива Deepin 20.1, развивающего собственное графическое окружение []
  3. Embox v0.5.1 Released []
  4. Выпуск дистрибутива Slackel 7.4 []

Системное


Новая версия утилит для работы со SMART-информацией Smartmontools 7.2 []

Специальное


  1. Stellarium 0.20.4 []
  2. lsFusion 4 []
  3. Релиз минималистичного набора системных утилит BusyBox 1.33 []
  4. Виртуальный планетарий Stellarium 0.20.4. Что нового []

Обучение


Выпуск программы для детского рисования Tux Paint 0.9.25 []

Мультимедиа


  1. Второй предварительный выпуск графического редактора GIMP 3.0 []
  2. Darktable 3.4.0. Большое обновление программы для работы с фотографиями []
  3. Релиз медиа-проигрывателя Parole 4.15.0. Новый плейлист, улучшена поддержка DVD []
  4. mtpaint 3.50 []

Web


  1. Выпуск http-сервера Lighttpd 1.4.58 []
  2. Выпуск web-браузера Otter 1.0.2 с интерфейсом в стиле Opera 12 []
  3. Выпуск GNU Wget 1.21 []

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


  1. Ruby 3.0.0 []
  2. Cosmopolitan стандартная Си-библиотека и формат кроссплатформенных исполняемых файлов []
  3. RESTinio-0.6.13: последний большой релиз RESTinio в 2020 и, вероятно, последний в ветке 0.6 []
  4. Выпуск распределенной системы управления исходными текстами Git 2.30 [ 1, 2]
  5. CIDER 1.0 []
  6. Что есть что в CMake 3.10+ и как это использовать []
  7. Выпуск библиотеки GNU libmicrohttpd 0.9.72 []
  8. Выпуск языка программирования Rust 1.49 [ 1, 2, 3]

Игры


Игра Bubble Chains перевыпущена (ретро пазл-аркада) []

Разное


Buttplug 1.0 []

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


Видео: IT новости #33 Xfce 4.16 что нового. Приставка на Ubuntu. Darktable, Kdenlive, Q4OS []

Заключение


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


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


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


Подписывайтесь на наш Telegram канал, группу ВКонтакте или RSS чтобы не пропустить новые выпуски FOSS News.


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

Подробнее..

Спецвыпуск FOSS News 50 главное за 2020 год

09.01.2021 08:12:32 | Автор: admin

Всех с наступившим!


Новогодняя суета (почти) прошла, самое время подвести итоги года в поле FOSS новостей и других материалов, вышедших за нелёгкий 2020 год.


Кратко:


  1. Сообщества свободных и открытых проектов приняли активное участие в противодействии COVID-19 и пострадали от них тоже как многие другие. Показательно, что принципы, на которых строились международные FOSS сообщества, оказались очень полезны во время пандемии. Ну и навыками удалённой работы смогли поделиться.
  2. В России набирают обороты внедрения отечественных GNU/Linux дистрибутивов. Силовики, РЖД, атомщики, администрации первые в этом деле. Технологии использованы, пингвинов стало больше. Приняты ли принципы FOSS? Вопрос открытый.
  3. В мире местами продолжаются попытки массового внедрения GNU/Linux для десктопов, ну а в прочих приложениях он понятно повсеместен. Прочий FOSS софт тоже весьма популярен. Сложно говорить о динамике, метрик недостаточно. Но многие эксперты говорят о всё большей важности открытых технологии и, более того, об их фундаментальном значении.
  4. Взаимоотношения FOSS и бизнеса сложно назвать благополучными. Всё больше сообществ жалуются на односторонний характер партнёрства и пытаются найти выход из этой ситуации.
  5. Было много примеров открытия кода и данных.
  6. Открытых железных проектов было немало, ещё больше проектов с предустановленным GNU/Linux.
  7. Удалось собрать немаленькую подборку материалов как для начинающих так и для опытных FOSS разработчиков собственно о самом подходе к разработке софта и о связанных с этим вещах.
  8. Ещё есть несколько подборок альтернатив проприетарного софта, в том числе аналогов Zoom и Slack, особо актуальных в последнее время.
  9. Две отдельные категории лучшая серия статей и (не)холивар года. Не пропустите, там интересно ;)
  10. Разные важные материалы, не попавшие в категории выше.

Под катом приведены полные списки материалов по каждой категории.


Оглавление


  1. Противостояние c COVID-19
  2. Импортозамещение ПО в России
  3. Значимые внедрения FOSS в мире
  4. FOSS и бизнес
  5. Открытие кода и данных
  6. Открытое железо и железо с предустановленным GNU/Linux
  7. Для FOSS разработчиков
  8. Внутренние дела FOSS проектов
  9. Альтернативы
  10. Лучшая серия статей
  11. (Не)холивар года
  12. Разное
  13. Заключение

Противостояние c COVID-19


  1. 10.03.2020 Методы Open Source сообщества для противодействия COVID-19 [ 1(en), 2(en)]
  2. 09.03.2020 Отменённые или перенесённые в онлайн из-за COVID-19 GNU/Linux и Open Source конференции [(en)]
  3. 19.03.2020 Советы разработчиков Linux об удалённой работе [ 1(en), 2(en)]
  4. 17.03.2020 Как Open Source ПО помогает в борьбе с COVID-19 [(en)]
  5. 19.03.2020 Open Source проект аппарата ИВЛ был сделан за одну неделю [ 1(en), 2(en)]
  6. 25.03.2020 Open Source против COVID-19: как разработчики могут помочь в борьбе с вирусом [(en)]
  7. 25.03.2020 SUSE предлагает помощь в борьбе с COVID-19 [(en)]
  8. 26.03.2020 Open Source разработки аппарата ИВЛ [ 1(en), 2(en), 3(en)]
  9. 30.03.2020 Линус Торвальдс рекомендует ставить здоровье выше необходимости релизов [(en)]
  10. 31.03.2020 Mozilla запускает фонд по борьбе с COVID-19 [(en)]
  11. 05.04.2020 Разработчики отвечают на угрозу COVID-19 Open Source проектами и хакатонами []
  12. 09.04.2020 Open Source ИИ для помощи в идентификации коронавируса [(en)]
  13. 13-19.04.2020 Сводки с полей FOSS борьбы с коронавирусом []
  14. 20-26.04.2020 Сводки с полей FOSS борьбы с коронавирусом []
  15. 27.04-03.05.2020 Сводки с полей FOSS борьбы с коронавирусом []
  16. 4-10.05.2020 Сводки с полей FOSS борьбы с коронавирусом []
  17. 15.05.2020 Внезапно на удалёнке: чему Open Source сообщество может научить? [(en)]
  18. 25.09.2020 Rosetta@home: Помощь в борьбе против COVID-19 с помощью вашей Linux системы [(en)]

Импортозамещение ПО в России


  1. 17.01.2020 Российский Alt Linux установили на 12 тыс. ПК в школах и вузах России примерно в 600 российских школах, вузах, профучилищах и учреждения допобразования []
  2. 21.01.2020 РЖД готовятся закупить тысячи ПК с Windows и российским дистрибутивом Linux (3820 компьютеров на 392,9 млн руб.) []
  3. 24.01.2020 МВД провело крупнейшую закупку ОС Astra Linux (31 000 лицензий на 1,4 млрд руб) []
  4. 25.05.2020 Об отношениях реестра отечественного ПО и свободного ПО [ 1, 2]
  5. 11.06.2020 Свободное или отечественное ПО. Стандартное или свободное обучение []
  6. 25.06.2020 В ядро Linux добавлена поддержка российских процессоров Baikal T1 []
  7. 30.06.2020 США запретили продавать Windows и iPhone российским военным и полиции []
  8. 05.08.2020 TAdviser протестировал операционную систему Astra Linux. Экспертный обзор продукта []
  9. 11.08.2020 Большая поставка Эльбрусов и Байкалов с Альтами в РЖД []
  10. 09.09.2020 Группа компаний Astra Linux намерена инвестировать 3 млрд руб. в экосистему Linux []
  11. 05.11.2020 MTC введёт в строй облачную инфраструктуру на базе Ubuntu и OpenStack []
  12. 02.11.2020 Росатом потратит 820 млн руб. на внедрение Astra Linux []
  13. 12.11.2020 Госорганы России начали переход на Astra Linux []
  14. 22.12.2020 Ростелеком переводит свои серверы на российский GNU/Linux дистрибутив Ред ОС []

Значимые внедрения FOSS в мире


  1. 01.02.2020 CERN перешёл с Facebook Workplace на открытые платформы Mattermost и Discourse []
  2. 10.02.2020 Правительство Южной Кореи исследует вопрос перехода с Windows на GNU/Linux [(en)]
  3. 24.02.2020 Еврокомиссия выбрала свободный мессенджер Signal из соображений безопасности [ 1(en), 2(en)]
  4. 25.03.2020 Китай готовится заменить Windows на GNU/Linux [(en)]
  5. 31.03.2020 IEEE запускает платформу совместной работы [(en)]
  6. 01.04.2020 Технологические гиганты объединяют усилия для запуска инструмента управления 5G инфраструктурой с открытым исходным кодом [ 1(en), 2(en)]
  7. 04.04.2020 Завоюют ли Open Source решения рынок беспилотников? [(en)]
  8. 15.05.2020 Мюнхен отказывается от Microsoft и переходит на Open Source. Снова [ 1, 2(en)]
  9. 19.05.2020 Парламент ЕС настоятельно рекомендует разрабатывать и использовать программное обеспечение с открытым исходным кодом [(en)]
  10. 03.06.2020 SpaceX использует Linux и обычные x86-процессоры в Falcon 9 []
  11. 07.06.2020 В Мюнхене и Гамбурге согласован перевод госучреждений с продуктов Microsoft на открытое ПО []
  12. 25.07.2020 Как Европа переходит на открытое ПО для госучреждений []
  13. 31.08.2020 Как правительство одного муниципалитета в Турции переехало на Open Source [(en)]
  14. 03.10.2020 Рочестерский технологический институт создал Open@RIT, университетскую инициативу поддержки, сотрудничества и исследований проектов с открытым исходным кодом [(en)]
  15. 21.11.2020 Переведут ли госсофт на open source технологии возможности для развития этого тренда в США []

FOSS и бизнес


  1. 04.02.2020 Ведущий японский hardware вендор подключается к Open Invention Network [(en)]
  2. 06.02.2020 В чём венчурный капитал видит привлекательность Open Source [ 1(en), 2(en)]
  3. 04.02.2020 CTO IBM Watson заявил о критической необходимости Open Source для динамически растущей области периферийных вычислений [(en)]
  4. 20.02.2020 Исследование RedHat: Open Source вытесняет проприетарное ПО из корпоративного сегмента []
  5. 18.02.2020 О сложных отношениях между Amazon и Open Source [(en)]
  6. 17.02.2020 Какую роль Open Source играет в формировании 5G [(en)]
  7. 19.02.2020 Как Kubernetes стал стандартом в сфере построения вычислительных ресурсов [(en)]
  8. 03.03.2020 3 причины почему системные интеграторы должны использовать Open Source системы [(en)]
  9. 03.03.2020 Проект Zephyr от Linux Foundation открывая новые горизонты в мире IoT [(en)]
  10. 27.03.2020 InnerSource: Как лучшие практики Open Source помогают корпоративным командам разработки [(en)]
  11. 15.04.2020 4 больших инновации, которым мы обязаны Open Source [(en)]
  12. 22.04.2020 Главные барьеры и преимущества для малого бизнеса, использующего Open Source [(en)]
  13. 15.05.2020 Как избежать ошибок выбора лицензии при работе с Open Source и подобным софтом? [(en)]
  14. 12.05.2020 Open Source модели ведения бизнеса на основе подписки станут более популярными по мнению Red Hat [(en)]
  15. 18.05.2020 Microsoft переходит на светлую сторону силы или бойтесь данайцев, дары приносящих? В Microsoft признали, что были неправы относительно open source []
  16. 26.05.2020 Бывший руководитель Windows подразделения: почему Microsoft вела войну с Open Source? [(en)]
  17. 15.07.2020 Больше не user friendly: как интернет-монополии убивают конкуренцию и превращают пользователей в товар []
  18. 08.09.2020 Аналитический материал TODO Group: почему Open Source важен для вашей компании [(en)]
  19. 24.09.2020 Как программное обеспечение с открытым исходным кодом изменило деловой мир? [(en)]
  20. 07.10.2020 Телеком отрасль: от чёрных ящиков к открытому коду [(en)]
  21. 09.10.2020 Open Source вносит определяющий вклад в развитие всего связанного с программным обеспечением [(en)]
  22. 23.10.2020 Почему важно чтобы облачные технологии были открытыми [(en)]

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


  1. 22.01.2020 Открыт исходный код приложений ProtonVPN []
  2. 07.02.2020 Открыт исходный код платформы контроля за промышленным интернетом вещей [(en)]
  3. 10.02.2020 Facebook выпускает Open Source библиотеку для 3D глубокого обучения PyTorch3D [(en)]
  4. 13.02.2020 IVPN открывает исходники клиентских приложений [(en)]
  5. 26.02.2020 Смитсоновский институт перевёл 2.8 миллионов изображений в общественное достояние []
  6. 17.03.2020 Uber открывает код Piranha, инструмента автоматического удаления устаревшего кода [(en)]
  7. 20.03.2020 RBK.money выпустила первый в мире open-source платежный процессинг []
  8. 20.03.2020 ING открывает Lion, библиотеку производительных, доступных и гибких веб-компонентов []
  9. 25.03.2020 Megvii открывает китайскую ИИ платформу [(en)]
  10. 30.03.2020 Huawei открывает ИИ фреймворк MindSpore [(en)]
  11. 11.04.2020 Google опубликовал данные и модель машинного обучения для разделения звуков []
  12. 10.04.2020 Пакет для Windows контейнеризации Sandboxie переведён в разряд свободного ПО и передан сообществу []
  13. 21.05.2020 Electronic Arts откроет код новой редакции игр Command & Conquer: Tiberian Dawn и Red Alert []
  14. 08.12.2020 Google делает Fuchsia более открытой, позволив участвовать в разработке не только сотрудникам но и сообществу []

Открытое железо и железо с предустановленным GNU/Linux


  1. 22.01.2020 Kubuntu начинает распространение ноутбука Kubuntu Focus []
  2. 05.02.2020 Dell анонсировал новую версию топового ультрабука на Ubuntu [(en)]
  3. 19.03.2020 Purism Librem Mini: основанный на Linux Mini PC с особым вниманием к приватности [(en)]
  4. 19.03.2020 Pinebook Pro, ноутбук за 199$, получил обновлённую версию с Manjaro KDE на борту [ 1, 2(en)]
  5. 25.03.2020 System76 выпускает новый ноутбук Lemur Pro [(en)]
  6. 02.04.2020 5G Linux смартфон в форм-факторе миниатюрного ноутбука собрал средства через краудфандинг []
  7. 02.04.2020 Доступен для заказа смартфон PinePhone, поставляемый с UBports []
  8. 27.04.2020 Lenovo переведет три флагманских ноутбука на Linux []
  9. 07.05.2020 Дегуглифицированный смартфон от Fairphone с /e/OS доступен к заказу [(en)]
  10. 24.05.2020 TUXEDO Computers представила первый в мире AMD-ноутбук с предустановленной ОС Linux []
  11. 07.06.2020 Lenovo обеспечит поставку Ubuntu и RHEL на всех моделях ThinkStation и ThinkPad P []
  12. 10.06.2020 Доступен для заказа планшет PineTab, поставляемый с Ubuntu Touch []
  13. 26.06.2020 Начались продажи сверхмощного ноутбука System76 Oryx Pro на Linux Ubuntu []
  14. 23.06.2020 Представлен ноутбук Dell XPS 13 Developer Edition с предустановленным Ubuntu 20.04 []
  15. 16.07.2020 Для недорогого ноутбука Star Lite Mk III доступны на выбор шесть дистрибутивов Linux []
  16. 22.07.2020 Проект KDE представил третье поколение ноутбуков KDE Slimbook []
  17. 21.07.2020 В ноутбуке Tuxedo Pulse 15 соседствуют чип AMD Ryzen и ОС Linux []
  18. 27.08.2020 Инженеры Intel создали открытый проект робота на базе смартфона []
  19. 05.11.2020 Open Book: проект по сборке свободного eReader с паяльником в руках []
  20. 16.11.2020 Представлен cмартфон PinePhone с KDE Plasma Mobile, который можно использовать как десктоп []
  21. 19.11.2020 Смартфон Librem 5 перешёл на стадию массового производства []
  22. 20.11.2020 Кампания по сбору средств для производства Pro1 X, смартфона с выдвижной клавиатурой, совместимого с Ubuntu Touch и Android []
  23. 23.11.2020 DevTerm портативный open-source компьютер с модульным дизайном в стиле ретро и с кучей возможностей []

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


  1. 23.01.2020 Keep calm and make FOSS (о тяжести бремени бескорыстной поддержки проектов) []
  2. 19.02.2020 Инструкция по запуску проекта с открытым исходником []
  3. 19.02.2020 Коммерциализация доработок свободного ПО []
  4. 24.02.2020 FOSS лицензии: какую выбрать и почему [(en)]
  5. 27.02.2020 Каково это, вести 100% Open Source бизнес? [(en)]
  6. 01.03.2020 Наиболее частые проблемы с безопасностью при работе с FOSS [(en)]
  7. 25.02.2020 Фонд СПО планирует запустить новую платформу совместной разработки и хостинга кода []
  8. 12.03.2020 Open Group представляет новую платформу для улучшенной разработки Open Source ПО [(en)]
  9. 20.03.2020 Проект Debian анонсировал сервисы Debian Social []
  10. 25.03.2020 Mozilla тестирует сервис финансирования сайтов, продвигаемый как альтернатива рекламе []
  11. 30.03.2020 Как программному обеспечению с открытым исходным кодом достичь успеха [(en)]
  12. 07.04.2020 Разбор главных FOSS лицензий [ 1(en), 2(en)]
  13. 19.05.2020 Коммитите в опенсорсе, работая разработчиком? Разбираемся с правами (привет, nginx) []
  14. 21.09.2020 Как поучаствовать в Open Source проекте? 8 ответов новичку []
  15. 07.10.2020 8 советов о том, как не надо делать Open Source [(en)]
  16. 22.10.2020 Как популяризовать использование Open Source [(en)]
  17. 16.11.2020 Как монетизируется Open Source []

Внутренние дела FOSS проектов


  1. 28.02.2020 FreeBSD: гораздо лучше GNU/Linux [ 1, 2]
  2. 03.03.2020 Удаление Эрика Рэймонда из списков рассылки OSI и этические вопросы в открытых лицензиях []
  3. 03.03.2020 Open Source становится больше и богаче, заявляет SUSE [(en)]
  4. 03.03.2020 Будущее Open Source лицензий меняется [(en)]
  5. 05.03.2020 Linux Foundation заключил соглашение с OSTIF для проведения аудита безопасности []
  6. 13.03.2020 Ошибки с открытым исходным кодом: количество обнаруженных уязвимостей выросло почти на 50% благодаря людям, которые действительно их ищут [(en)]
  7. 15.03.2020 Фонд СПО объявил обладателей ежегодной премии за вклад в развитие свободного ПО []
  8. 17.03.2020 Micrоsoft покупает NPM и будет развивать его вместе с GitHub []
  9. 02.04.2020 Компания Huawei присоединилась к инициативе по защите Linux от патентных претензий []
  10. 08.04.2020 Конкурс проектов по продвижению FOSS [ 1(en), 2(en)]
  11. 08.04.2020 О всё более развивающемся положении открытого исходного кода в Азиатско-Тихоокеанском регионе [(en)]
  12. 15.04.2020 Open Source зарекомендовал себя как ведущий способ разработки программного обеспечения [(en)]
  13. 30.04.2020 Компания Canonical вышла на самообеспечение [ 1, 2]
  14. 20.05.2020 Многие Open Source сообщества столкнулись с серьёзными проблемами из-за пандемии [ 1(en), 2(en)]
  15. 29.05.2020 Каков ты, русский опен сорс? KaiCode, Open Source инкубатор от Huawei []
  16. 11.06.2020 Мир Open Source: преимущества и недостатки по мнению рядового участника []
  17. 01.07.2020 Baidu присоединился к инициативе по защите Linux от патентных претензий []
  18. 09.07.2020 Google учредил организацию для управления торговыми марками открытых проектов []
  19. 03.08.2020 Учреждён проект OpenSSF, сфокусированный на повышении безопасности открытого ПО []
  20. 11.08.2020 Компания Mozilla объявила об увольнении 250 сотрудников и ищет новые пути развития []
  21. 18.08.2020 Mozilla прекрасная IT-компания, которую мы теряем []
  22. 6.11.2020 История Open Source кратко: от калькулятора до миллиардных сделок []
  23. 08.12.2020 Red Hat прекращает разработку CentOS 8 в пользу тестового CentOS Stream []
  24. 11.12.2020 Google представил рейтинг критически важных открытых проектов []
  25. 14.12.2020 Встречайте Creative Commons Legal Database []
  26. 17.12.20 Результаты демографического опроса разработчиков ПО с FOSS от OpenSSF []

Альтернативы


  1. 14.01.2020 Прекращена поддержка Windows 7, имевшей около четверти доли рынка []
    1. 08.01.2020 Сообщество KDE опубликовало обращение к разработчикам с призывом переходить с Windows 7 на Plasma [ 1(en), 2(en)]
    2. 14.01.2020 Canonical опубликовала список причин для перехода с Windows 7 на Ubuntu [(en)]
    3. 26.01.2020 Фонд СПО предложил Microsoft передать Windows 7 сообществу []
    4. 29.01.2020 Выпуск руководства по переходу с Windows 7 на Ubuntu от Canonical []
  2. 26.02.2020 5 лучших Open Source альтернатив Slack для командного общения [(en)]
  3. 07.03.2020 Избавленный от Google форк Android добился хороших результатов [(en)]
  4. 19.03.2020 Open Source продолжает становиться мэйнстримом. Как традиции безвозмездного обмена формируют будущее музыки [(en)]
  5. 01.04.2020 Сегодня GNU/Linux как никогда открыт для геймеров [(en)]
  6. 31.03.2020 Выпуск Eclipse Theia 1.0, альтернативы редактору кода Visual Studio Code []
  7. 10.04.2020 Альтернативы проприетарной системы видеосвязи Zoom [ 1(en), 2]
  8. 21.05.2020 Взгляд на Jitsi как открытую и безопасную альтернативу Zoom [(en)]
  9. 08.07.2020 5 опенсорсных альтернатив Slack для группового чата []
  10. 25.08.2020 Дивный новый мир: что такое Fediverse и как стать его частью []
  11. 27.09.2020 Как может выглядеть глобальная открытая организация? [(en)]
  12. 21.12.2020 Вышел подкаст Полная история Fediverse []

Лучшая серия статей


  1. 25.02.2020 Полная домашняя автоматизация в новостройке []
  2. 10.03.2020 Полная домашняя автоматизация в новостройке. Продолжение []
  3. 01.06.2020 Умная хрущёвка на максималках []
  4. 15.06.2020 Умная хрущёвка на максималках. Продолжение []

(Не)холивар года


  1. 14.02.2020 Семь причин, почему Линукс []
  2. 8.04.2020 Главная причина, почему не Linux []
  3. 30.04.2020 Главная причина, почему все-таки Linux []
  4. 4.05.2020 Mein Linux []
  5. 14.05.2020 Пользователю все это не нужно! Хватит пропагандировать Линукс []

Разное


  1. 12.10.2020 Ядро Linux 5.9 поддерживает 99% популярного PCI-оборудования на рынке []
  2. 26.02.2020 Программист и музыкант алгоритмически сгенерировали все возможные мелодии и сделали их общественным достоянием [ 1, 2]
  3. 20.04.2020 Завершающий выпуск ветки Python 2 []
  4. 26.04.2020 Усложнение команд консоли, 19792020 []
  5. 18.06.2020 Monolinux однофайловый дистрибутив, загружающийся за 0.37 секунд []
  6. 22.07.2020 Школьный Linux клуб восстанавливает старые компьютеры чтобы помочь нуждающимся обучаться дистанционно [(en)]
  7. 21.10.2020 Как вносить вклад в Open Source просто делая свою работу [(en)]
  8. 28.10.2020 Перевод книги Время UNIX. A History and a Memoir []
  9. 03.11.2020 Ричард Столлман и будущее инноваций в ПО []
  10. 08.11.2020 Открытые окружения это места, где процветают инновационные идеи [(en)]

Заключение


На этом всё, до скорого!


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


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


Подписывайтесь на наш Telegram канал, группу ВКонтакте или RSS чтобы не пропустить новые выпуски FOSS News.


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

Подробнее..

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

10.01.2021 18:10:27 | Автор: admin

Всем привет!


Продолжаем дайджесты новостей и других материалов о свободном и открытом ПО и немного о железе. Всё самое главное про пингвинов и не только, в России и мире. Наиболее важные события 2020 года по версии OpenNET; проект портирования Linux на Mac с M1 обзавёлся названием и сайтом; утраченный потенциал подсистемы Windows для Linux (WSL); open-source ПК Dragonbox Pyra начали отгружать покупателям после четырех лет разработки; lsFusion vis 1С; о взломе игры Ball Sort Puzzle и многое другое.


Оглавление


  1. Главное
    1. Наиболее важные события 2020 года по версии OpenNET
    2. Проект портирования Linux на Mac с M1 обзавёлся названием и сайтом
    3. Утраченный потенциал подсистемы Windows для Linux (WSL)
    4. Open-source ПК Dragonbox Pyra начали отгружать покупателям после четырех лет разработки
    5. lsFusion vis 1С
    6. О взломеигры Ball Sort Puzzle
  2. Короткой строкой
    1. Новости
      1. Новости FOSS организаций
      2. Юридические вопросы
      3. Ядро и дистрибутивы
      4. Безопасность
      5. Web
      6. Для разработчиков
      7. Пользовательское
      8. Железо
      9. Разное
    2. Статьи
      1. Мероприятия
      2. DIY
      3. Системное
      4. Специальное
      5. DevOps
      6. Для разработчиков
      7. История
      8. Менеджмент
      9. Пользовательское
      10. Разное
    3. Релизы
      1. Ядро и дистрибутивы
      2. Системное
      3. Мультимедиа
      4. DevOps
      5. Web
      6. Для разработчиков
      7. Менеджмент
      8. Пользовательское
  3. Заключение

Главное


Наиболее важные события 2020 года по версии OpenNET


Категория: Статьи/Разное

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


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


Наши итоги 2020 []


Проект портирования Linux на Mac с M1 обзавёлся названием и сайтом


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

denis-19 пишет в разделе Новости на Хабре: 5 января 2021 года разработчик Гектор Мартин сообщил о том, что у краудфандингового проекта Linux для Maс на M1 появился свой сайт и название Asahi Linux. Продолжается развиваться сообщество разработчиков проекта. Мартин рассказал, что в конце прошлого года к проекту Asahi Linux присоединилась разработчик Алисса Розенцвейг. Розенцвейг уже опубликовала на GitHub первые наработки по этому проекту. Также она описана первые результаты реверс-инжиниринга драйверов для GPU чипа Apple M1 в своем блоге. Розенцвейг известна тем, что возглавляет разработку свободного драйвера Panfrost, у нее есть большой опыт реверс-инжинирингаоригинальных драйверов от компании ARM


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


Утраченный потенциал подсистемы Windows для Linux (WSL)


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

Компания VDSina публикует в своём блоге на Хабре статью с разбором WSL 1 и WSL 2 и анализирует возможности заявленные изначально и полученные в итоге: Если вы несколько лет вообще не следили за Windows 10 и не знаете, что происходит, то пропустили одну вещь очень горячей темой для разработчиков стала подсистема Windows для Linux, она же WSL. Среди программистов очень часто её обсуждают. Действительно, потрясающе интересная штука. Наконец-то у нас появилась возможность запустить свой инструментарий Linux на Windows наравне с виндовыми программами. А это значит, что больше не нужно изучать странный PowerShell или пользоваться архаичной консолью CMD.EXE. К сожалению, не всё так радужно. WSL по-прежнему является неким инородным элементом, который отделён от родной среды Windows. В частности, не может взаимодействовать с родными инструментами Windows. А ведь изначально всё задумывалось совсем иначе, пишет Джулио Мерино (Julio Merino), автор блога для разработчиков jmmv.dev. Подсистема должна была стать совсем другой, но фактически вышел провал, в каком-то смысле. Чтобы понять причины этого провала, нужно сначала понять различия между WSL 1 и WSL 2 и как переход на WSL 2 закрыл некоторые интересные перспективы.


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


Open-source ПК Dragonbox Pyra начали отгружать покупателям после четырех лет разработки


Категория: Новости/Железо

Компания Selectel пишет в своём блоге на Хабре: DragonBox Pyra карманный (в буквальном смысле слова) компьютер с 5-дюймовым дисплеем, процессором TI OMAP 5 и QWERTY-клавиатурой. В нее же встроены два стика и D-pad. Устройство разрабатывалось в качестве легко модифицируемой открытой платформы. Поставляется гаджет с Debian Linux, но поддерживаются и многие другие ОС, так что ПК можно использовать в качестве десктопного или игрового. О DragonBox Pyra известно уже давно, но только сейчас его начали отгружать покупателям. К слову, предзаказы на девайс стали принимать еще четыре года назад.


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


lsFusion vis 1С


Категория: Статьи/Специальное

1C программист с 20-летним опытом работы fixin опубликовал в блоге на Хабре обзор lsFusion, белорусской разработки на Java, и постарался ответить на вопрос годится ли она на роль убийцы 1С. Рассмотрены архитектура, интерфейс, разработка дополнительного функционала, генерация отчётов, интеграции, лицензия, сообщество и многое другое.


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


О взломеигры Ball Sort Puzzle


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

ErhoSen написал на Хабре о своём опыте взлома игры Ball Sort Puzzle: Ball Sort Puzzle это популярная мобильная игра на IOS/Android. Суть её заключается в перестановке шариков до тех пор, пока в колбах не будут шарики одного цвета. При этом шарик можно перетаскивать либо в пустую колбу, либо на такой же шарик. Так случилось, что я в неё залип. Очнулся примерно через месяц, на 725 уровне. Он мне никак не давался насколько бы глубоко я не пытался продумать свою стратегию. В итоге с этим вопросом я вышел в интернет, и заодно выяснил несколько интересных особенностей головоломки. Во-первых, игра бесконечна почти бесконечна. По крайней мере уже сейчас на YouTube есть прохождения всех уровней вплоть до 5350, а в телеграмме гуляют скриншоты 10к+ уровней. Вторая особенность, и вот это уже некрасиво, не у всех уровней есть решение. Ну это ни в какие ворота против нас играет коварный ИИ. Нужно действовать соответственно!.


В итоге автор сделал:


  1. алгоритм, решающий головоломку (Python);
  2. парсер скриншота игры, чтобы скармливать алгоритму задачки (OpenCV);
  3. Telegram бот, который принимает скриншоты и возвращает решения;
  4. CI/CD через GitHub Actions и бот на Яндекс.Функциях.

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


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


Новости


Новости FOSS организаций


  1. GitHub снял ограничения для разработчиков из Ирана []
  2. Еженедельник OSM 545 []

Юридические вопросы


Лицензия сканера безопасности NMAP признана несовместимой с Fedora []


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


Компания Apple открыла ядро и системные компоненты macOS 11.0 Big Sur []


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


Gentoo прекращает поддержку LibreSSL в пользу OpenSSL и LibreTLS []


Web


  1. В адресной строке Chrome по умолчанию начнёт применяться HTTPS []
  2. Firefox 85 перейдёт на ECH для скрытия домена в HTTPS-трафике []

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


  1. Выход электронной книги: Common Open Source Practices in Developing Cloud Native Applications [(en)]
  2. Компания Qt Company ограничила доступ к исходному коду LTS-ветки Qt 5.15 []
  3. Ограничен доступ к исходникам Qt 5.15 []
  4. Интригующие возможности С++ 20 для разработчиков встраиваемых систем []

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


Дорожная карта KDE на 2021 []


Железо


Крошечный неттоп ECS Liva Q1A использует ОС Ubuntu [(en)]


Разное


Директором по информационным технологиям в Белом доме назначен известный разработчик СПО []


Статьи


Мероприятия


7 интересных выступлений с All Things Open 2020 [(en)]


DIY


  1. Настройка голосового ассистента под себя и использование нестандартного голоса[(en)]
  2. Перчатка Mark gauntlet v4.2 []
  3. Radxa sata hat для raspberry pi 4: домашний сервер с НАС, облаком и торрентокачалкой через впн в докере []
  4. Делаем из старого усилителя многофункциональный медиа сервер с помощью Raspberry pi []

Системное


Как пользоваться dmesg []


Специальное


  1. Установка NTP сервера для включения его в pool.ntp.org []
  2. Homura: основанная на WINE программа для запуска игр на BSD [(en)]
  3. Выбираем self-hosted замену IFTTT []

DevOps


  1. 10 способов использовать Ansible [(en)]
  2. 8 инсайтов о Kubernetes для 2021 [(en)]
  3. 4 строки кода для более эффективного использования Ansible [(en)]
  4. Создание современных процессов CI/CD для бессерверных приложений с Red Hat OpenShift Pipelines и Argo CD. Часть 1 []
  5. Xудшие практики для Ansible. Георгий Шуклин []
  6. Apache Kafka в вопросах и ответах []
  7. Ansible идемпотентный. Алексей Соколов []
  8. Практическое руководство по HashiCorp Consul Часть 2 []

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


  1. ИзучениеFortran через написание игры угадай число [(en)]
  2. Пишем драйвер фреймбуфера для Raspberry Pi с LCD []
  3. Профилирование в облаке и не только []
  4. ИзучениеC через написание простой игры [(en)]
  5. Руководство по использованию gdb [(en)]
  6. Русификация баша []
  7. 10 способов повысить свои знания по JavaScript в 2021 [(en)]

История


История Nokia MeeGo []


Менеджмент


Perfomance-менеджмент через оценки от идеи до бета тестирования []


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


  1. QuiteRSS: свободная десктопная RSS читалка для Linux [(en)]
  2. Лучшие темы для Grub []
  3. 3 лучших приложения для повышения продуктивности [(en)]
  4. Подробное руководство по настройке системного дока в Ubuntu [(en)]
  5. Почему может понравиться консольный редактор FED (работает в Linux, Windows, DOS) [(en)]
  6. Настройка сетевого интерфейса Linux []

Разное


  1. Как принципы открытости влияют на будущее работы[(en)]
  2. Названы победители 27 конкурса по написанию запутанного кода на языке Си []
  3. О томкак опытный разработчик в сфере безопасности присоединился к Open Source сообществу [(en)]
  4. 8 шпаргалок для Open Source софта для работы в 2021 [(en)]
  5. 3 serverless стратегий, которые стоит рассмотреть для работы в 2021 [(en)]
  6. На случай если пропустили записи с 4 важных онлайн событий 2020 [(en)]
  7. Кто такой open source евангелист? [(en)]

Релизы


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


  1. Релиз дистрибутива Deepin 20.1. Много обновлений. Собственный браузер и другие []
  2. Релиз дистрибутива Slacko Puppy 7.0 []
  3. Релиз дистрибутива Linux Mint 20.1 []

Системное


  1. Выпуск OpenZFS 2.0.1, реализации ZFS для Linux и FreeBSD []
  2. Выпуск проприетарного драйвера NVIDIA 460.32 []

Мультимедиа


Рисовалка для детей TuxPaint 0.9.25. Создание анимированных GIF []


DevOps


Выпуск Bastille 0.8, системы управления контейнерами на основе FreeBSD Jail []


Web


  1. Релиз консольной утилиты для загрузки файлов wget 1.21 []
  2. Wasmer 1.0, инструментарий для платформонезависимых приложений на базе WebAssembly [ 1, 2]
  3. Обновление Firefox 84.0.2 с устранением уязвимости []
  4. Обновление Chrome 87.0.4280.141 с исправлением уязвимостей []
  5. Релиз твиттер-клиента Cawbird 1.3. Поддержка загрузки видео []
  6. Выпуск платформы PeerTube 3.0 с поддержкой децентрализованного потокового вещания [ 1, 2]
  7. Изменение модели формирования релизов DNS-сервера BIND. BIND 9.18 отложен на следующий год []

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


  1. Выпуск Tcl/Tk 8.6.11 []
  2. Выпуск стандартной Си-библиотеки PicoLibc 1.5 []
  3. Доступен выпуск KDE Frameworks 5.78 []

Менеджмент


Вышла RunaWFE Free 4.4.1 российская система управления бизнес-процессами предприятия []


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


  1. Корректирующий релиз KDE Plasma 5.20.5 []
  2. Релиз GNU tar 1.33 []
  3. Релиз KDE Applications 20.12.1 []
  4. Менеджер заметок CherryTree 0.99.19-29. Что нового []

Заключение


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


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


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


Подписывайтесь на наш Telegram канал, группу ВКонтакте или RSS чтобы не пропустить новые выпуски FOSS News.


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

Подробнее..

Kubernetes или с чего начать чтобы понять что это и зачем нужно

12.01.2021 18:23:11 | Автор: admin

Данная статья рассчитана на новичков. Если вы опытный ниндзя, просто вспомните о том, как когда-то подобная информация могла быть полезной и для вас ;-)


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

Давайте вспомним как работают контейнеры на примере Docker. Основные понятия это namespaces, cgroups, UnionFS, RunC.

Namespaces это про изолирование окружения и про то что каждый контейнер работает со своими namespaceами и namespace закрывается, если PID 1 умер.

  • pid : Изоляция процессов (PID: Process ID)

  • net : Изоляция сетей (NET: Networking)

  • ipc : Изоляция IPC (IPC: InterProcess Communication)

  • mnt : Изоляция файловой системы (MNT: Mount)

  • uts : Изоляция UTS (UTS: Unix Timesharing System)

  • user: Изоляция пользователей

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

Union File Systems дает разделение по слоям и возможность их переиспользования.

А что же такое слои?

Управление образами, например в Docker, происходит с помощью внешнего драйвера хранилища. Есть несколько поддерживаемых драйверов - AUFS, BTRFS и наложения.

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

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


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

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

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

Оркестрация это:

  • управление кластером хостов;

  • планирование и распределение задач;

  • автоматизация.

А теперь от оркестрации плавно перейдем к тому по какой же концепции DevOps будет происходить модель обслуживания.


Одна из основных концепций DevOps - это <Cattle, NOT pets>.

Модель обслуживания Домашние животные(pets) описывает тщательно ухоженные сервера, за которыми с любовью ухаживают и им дают имена, как если бы они были верными домашними животными. Когда с ними что то случается, то вы тщательно восстанавливаете их здоровье, помогаете им вырасти и время от времени делаете блестящими и новыми.

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

Потребность в автоматизации и координации настройки и развертывания привела к появлению таких инструментов, как Salt Stack, Ansible и Terraform. Эти инструменты дали разработчикам и DevOps инженерам возможность программно развертывать инфраструктуру, необходимую для поддержки ваших приложений. Этот процесс теперь известен как Инфраструктура как код.

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

Управление конфигурацией vs оркестрация контейнеров

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

Ansible и Terraform также являются обязательными навыками.

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

Все это и более детальное рассмотрение архитектуры и основных концепций Kubernetes, на равне с такими интересными темами как кластеризация, highload web, администрирование СУБД, виртуализация и контейнеризация, оркестрация вы сможете изучить на курсе Administrator Linux. Advanced.

Также вы сможете получить ответы на такие вопросы как организовано сетевое взаимодействие в Kubernetes, как опубликовать приложение и как работает DNS в Kubernetes.

Ну и как же без такого важного вопроса как хранение данных, мониторинг и Kubernetes secrets Hashicorp Vault.

А прямо сейчас мы приглашаем всех желающих на бесплатный демо-урок по теме "Кластерная файловая система Lustre". В рамках урока рассмотрим архитектуру и компоненты файловой системы Lustre. Разберем области применения файловой системы и ее особенности. Ответим на вопросы как используется file striping и что такое сетевой транспортный уровень LNET. На практической части установим и сконфигурируем файловую систему вручную. Посмотрим пример работы графической пользовательского интерфейса Integrated Manager for Lustre (IML)

Подробнее..

Kubernetes или с чего начать, чтобы понять что это и зачем он нужен

13.01.2021 14:06:06 | Автор: admin

Данная статья рассчитана на новичков. Если вы опытный ниндзя, просто вспомните о том, как когда-то подобная информация могла быть полезной и для вас ;-)





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

Так что же такое Kubernetes и для чего мы в принципе хотим использовать именно его, а не обычные контейнеры, например Docker.

Давайте вспомним что такое контейнеры.

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

Все было бы отлично, но есть одно но - container runtime API (API среды запуска контейнера) хорошо подходит для управления отдельными контейнерами, но совершенно не подходит для управления приложениями на сотне контейнеров и на большом количестве хостов.

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

Вот для такого и нужен Kubernetes.

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

Kubernetes по сути является не просто системой оркестрации. Технически оркестрация это про выполнение определенного рабочего процесса: сначала сделай A, затем B, затем C.

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

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

Сделать это только с помощью контейнеров не получится. А вот в Kubernetes это можно достичь с помощью Pods (подов).

Pod (под) - это группа из одного или более контейнера с общим хранилищем/сетевыми ресурсами и спецификацией как запускать контейнеры. Так же это отдельный инстанс приложения. Размещая контейнеры таким образом, Kubernetes устраняет соблазн втиснуть слишком много функций в один образ контейнера.

Концепция Service (Сервисы) в Kubernetes используется для группирования нескольких подов, которые выполняют те же функции. Сервисы легко настраиваются для таких целей как обнаружение, горизонтальное масштабирование и балансировка нагрузки.

Kubernetes, согласно официальной документации, так же сможет предоставить вам:

  • Используя имя DNS или собственный IP-адрес мониторинг сервисов и распределение нагрузки Kubernetes может обнаружить контейнер. При высоком трафике в нем Kubernetes сбалансирует нагрузку и распределить сетевой трафик так, что развертывание будет стабильным.

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

  • Автоматическое развертывание и откаты.

    Kubernetes через описание желаемого состояния развернутых контейнеров (манифесты, пишутся на yaml) может изменить фактическое состояние на желаемое. То есть создание новых контейнеров для развертывания, удаления существующих контейнеров и распределения всех их ресурсов в новый контейнер в Kubernetes можно автоматизировать.

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

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

  • Самоконтроль.

    Если в работе контейнеров что-то пошло не так, то Kubernetes сам перезапускает, заменяет и завершает работу контейнеров, которые не проходят проверку работоспособности.

  • Управление конфиденциальной информацией и конфигурацией.
    Пароли, OAuth-токены и ключи SSH могут храниться и управляться Kubernetes без изменений образов контейнеров и не раскрывая конфиденциальную информацию в конфигурации стека.

Как видим на рисунке, это наглядная демонстрация того что есть внутри Kubernetes на примере одной мастер ноды (Master node) и одной воркер ноды (Worker node).

На Master node находится Kubernetes Control Plane (kube-scheduler, kube-controller-manager, kube-apiserver, etcd), с помощью которой происходит управление всем кластером Kubernetes.

На Worker node находятся container runtime (среда запуска контейнера), kubelet и kube-proxy.

Сontainer runtime это то на чем будет запущен ваш Под (например Docker, Container D, Rocket и т.д.).

Kubelet это основной агент узла, который работает на каждой ноде. Гарантирует, что контейнеры в Pod(поде)работают и исправны. Не управляет контейнерами, которые не были созданы Kubernetes.

Kube-proxy это демон на каждой ноде, управляет правилами iptable на хосте для достижения балансировки нагрузки службы (одна из реализаций) и следит за изменениями Service и Endpoint.

Более детальное рассмотрение архитектуры, основных концепций Kubernetes в теории и главное на практике, наравне с такими интересными темами как кластеризация, highload web, администрирование СУБД, виртуализация и контейнеризация, оркестрация вы сможете изучить на курсе Administrator Linux. Advanced.

Также вы сможете получить ответы на такие вопросы как организовано сетевое взаимодействие в Kubernetes, как опубликовать приложение и как работает DNS в Kubernetes.

Ну и как же без такого важного вопроса как хранение данных, мониторинг и Kubernetes secrets Hashicorp Vault.

А прямо сейчас мы приглашаем всех желающих на бесплатный демо-урок по теме "Кластерная файловая система Lustre". В рамках урока рассмотрим архитектуру и компоненты файловой системы Lustre. Разберем области применения файловой системы и ее особенности. Ответим на вопросы как используется file striping и что такое сетевой транспортный уровень LNET. На практической части установим и сконфигурируем файловую систему вручную. Посмотрим пример работы графической пользовательского интерфейса Integrated Manager for Lustre (IML)

Подробнее..

Практические истории из наших SRE-будней. Часть 3

25.12.2020 10:05:30 | Автор: admin
Рады продолжить цикл статей с подборками из недавних вызовов, случившихся в нашей повседневной практике эксплуатации. Для этого мы описываем свои мысли и действия, которые привели к их успешному преодолению.



Новый выпуск посвящён опыту с неожиданно затянувшейся миграцией одного Linux-сервера, знакомству с Kubernetes-оператором для ClickHouse, способу ускорить восстановление данных в сломавшейся реплике PostgreSQL и последствиями обновления CockroachDB. Если вы тоже думаете, что это может быть полезно или хотя бы просто интересно, добро пожаловать под кат!

История 1. Затянувшийся перенос сервера в виртуальную машину


План миграции


Казалось, что может пойти не так, если требуется перенести legacy-приложение с железного сервера в виртуальную машину? У приложения и его инфраструктуры привычный, хорошо понятный стек: Linux, PHP, Apache, Gearman, MySQL. Причины для миграции тоже обычны: клиент захотел уменьшить плату за хостинг, отказавшись от реального сервера, на котором остался только вспомогательный сервис (парсер соцсетей).

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

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

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

  1. Произвести очистку сервера, поняв, сколько ресурсов требуется.
  2. Подготовить виртуальный сервер, выделить память, ядра, зарезервировать IP-адреса.
  3. Если требуется минимальный простой организовать внешний балансировщик, который можно переключить на свежесозданный виртуальный сервер, или же запустить копию приложения.
  4. Произвести начальную загрузку с образа выбранной ОС/дистрибутива, содержащего все необходимые драйверы, чтобы скопировать данные в виртуальную машину тем или иным способом.
  5. Создать chroot, чтобы исправить загрузчик системы.
  6. Переключить пользовательские запросы или сервисные задачи на новую систему.

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

Подготовка к миграции


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

Отдельно хочется рассказать про похудение MySQL. Дело в том, что MySQL изначально была версии 5.5 и настроена без innodb_file_per_table. Из-за этого, как многие могут догадаться, файл ibdata1 разросся до 40 Гб. В таких ситуациях нам всегда помогает pt-online-schema-change (входит в состав Percona Toolkit).

Достаточно проверить таблицы, которые находятся в shared innodb tablespace:

SELECT i.name FROM information_schema.INNODB_SYS_TABLES i WHERE i.space = 0;

после чего запустить упомянутую команду pt-online-schema-change, которая позволяет совершать различные действия над таблицами без простоя и поможет нам совершить OPTIMIZE без простоя для всех найденных таблиц:

pt-online-schema-change --alter "ENGINE=InnoDB" D=mydb,t=test --execute

Если файл ibdata1 не слишком велик, то его можно оставить. Чтобы полностью избавиться от мусора в файле ibdata1, потребуется сделать mysqldump со всех баз, оставив только базы mysql и performance_schema. Теперь можно остановить MySQL и удалить ibdata1.

После перезапуска MySQL создаст недостающие файлы системного namespace InnoDB. Загружаем данные в MySQL и готово.

Подготовка дисков и копирование


Казалось бы, теперь можно произвести перенос данных с помощью dd, однако в данном случае это не представлялось возможным. На сервере был созданный с md RAID 1, который не хотелось бы видеть на виртуальной машине, так как её разделы создаются в Volume Group, которая создана на RAID 10. Кроме того, разделы были очень большие, хотя занято было не более 15% места. Поэтому было принято решение переносить виртуальную машину, используя rsync. Такая операция нас не пугает: мы часто мигрировали серверы подобным образом, хотя это и несколько сложнее, чем перенос всех разделов с использованием dd.

Что потребуется сделать? Тут нет особой тайны, так как некоторые шаги полностью соответствуют действиям при копировании диска с dd:

  1. Создаем виртуальную машину нужного размера и загружаемся с systemrescuecd.
  2. Делаем разбивку диска, аналогичную серверу. Обычно нужен root-раздел и boot с этим поможет parted. Допустим, у нас есть диск /dev/vda:

    parted /dev/vdamklabel gptmkpart P1 ext3 1MiB 4MiB t 1 bios_grubmkpart P2 ext3 4MiB 1024MiBmkpart P3 ext3 1024MiB 100%t 3 lvm 
    
  3. Создадим на разделах файловые системы. Обычно мы используем ext3 для boot и ext4 для root.
  4. Монтируем разделы в /mnt, в который будем chroot'иться:

    mount /dev/vda2 /mntmkdir -p /mnt/bootmount /dev/vda1 /mnt/boot
    
  5. Подключим сеть. Актуальные версии systemrescuecd построены на ArchLinux и предполагают настройку системы через nmcli:

    nmcli con add con-name lan1 ifname em1 type ethernet ip4 192.168.100.100/24 gw4 192.168.100.1 ipv4.dns "8.8.8.8 8.8.4.4"nmcli con up lan1
    
  6. Копируем данные: rsync -avz --delete --progress --exclude "dev/*" --exclude "proc/*" --exclude "sys/*" rsync://old_ip/root/ /mnt/
  7. Затем монтируем dev, proc, sys:

    mount -t proc proc /mnt/procmount -t sysfs sys /mnt/sysmount --bind /dev /mnt/dev
    
  8. Зайдем в полученный chroot: chroot /mnt bash
  9. Поправим fstab, изменив адреса точек монтирование на актуальные.
  10. Теперь надо восстановить загрузчик:
    1. Восстановим загрузочный сектор: grub-install /dev/vda
    2. Обновим конфиг grub: update-grub
  11. Обновим initramfs: update-initramfs -k all -u
  12. Перезагрузим виртуалку и загрузим перенесенную систему.

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

Проблема и её решение


Система упорно помнила различные дисковые подразделы, которые были до переноса на сервере. Проблем разобраться с mdadm не было достаточно просто удалить файл /etc/mdadm/mdadm.conf и запустить update-initramfs.



Однако система все равно пыталась найти еще и /dev/mapped/vg0-swap. Оказалось, что initrd пытается подключить swap из-за конфига, который добавляет Debian installer. Удаляем лишний файл, собираем initramfs, перезагружаемся и снова попадаем в консоль busybox.

Поинтересуемся у системы, видит ли она наши диски. lsblk выдает пустоту, да и поиск файлов устройств в /dev/disk/by-uuid/ не даёт результатов. Выяснилось, что ядро Debian Jessie 3.16 скомпилировано без поддержки virtio-устройств (точнее, сама поддержка, конечно, доступна, но для этого нужно загрузить соответствующие модули).

К счастью, модули добавляются в initrd без проблем: нужные модули можно либо прописать в /etc/initramfs-tools/modules, либо изменить политику добавления модулей в /etc/initramfs-tools/initramfs.conf на MODULES=most.



Однако магии и в этот раз не произошло. Даже несмотря на наличие модулей система не видела диски:



Пришлось в настройках виртуальной машины переключить диски с шины Virtio на SCSI такое действие позволило загрузить виртуальную машину.

В загруженной системе отсутствовала сеть. Попытки подключить сетевые драйверы (модуль virtio_net) ни к чему не привели.



Дабы не усложнять задачу и не затягивать переключение, было решено переключить и сетевые адаптеры на эмуляцию реального железа сетевой карты Intel e1000e. Виртуальная машина была остановлена, драйвер изменён, однако при запуске мы получили ошибку: failed to find romfile "efi-e1000.rom".



Поиск дал интересный результат: ROM-файл был потерян в Debian некоторое время назад и возвращать его в пакет коллеги не собирались. Однако этот же файл фигурирует в пакете ipxe-qemu, откуда и был с успехом взят. Оказалось, достаточно распаковать этот пакет (ipxe-qemu) и скопировать /usr/lib/ipxe/qemu/efi-e1000.rom в /usr/share/qemu/efi-e1000e.rom. После этого виртуальная машина с эмулированным адаптером начала стартовать.

Вы думаете, это всё? Конечно же, нет, когда в деле замешан e1000e Данный драйвер известен тем, что может под нагрузкой начать перезапускать сетевой адаптер. Именно это и произошло, когда мы стали загружать базу данных для приложения. Пришлось прибегнуть к старому способу с отключение аппаратного offload:

ethtool -K eth0 gso off gro off tso off

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

История 2. Безопасность для Kubernetes-оператора ClickHouse


Не так давно мы начали использовать ClickHouse operator от Altinity. Данный оператор позволяет гибко разворачивать кластеры ClickHouse в Kubernetes:

  • с репликацией для повышенной надёжности;
  • с шардами для горизонтального масштабирования.

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

[2020-11-25 15:00:20] Code: 516, e.displayText() = DB::Exception: Received from chi-cluster-cluster-0-0:9000. DB::Exception: default: Authentication failed: password is incorrect or there is no user with such name.

К счастью, ClickHouse позволяет сделать whitelist с использованием rDNS, IP, host regexp Так можнодобавить в конфиг кластера следующее:

      users:        default/networks/host_regexp: (chi-cluster-[^.]+\d+-\d+|clickhouse\-cluster)\.clickhouse\.svc\.cluster\.local$

Тогда кластер сможет нормально функционировать. В репозитории оператора есть issue по этому поводу (мы не забыли добавить туда и свой workaround). Однако не похоже, что там будут какие-то движения в ближайшее время из-за того, что потребуется хранить пароли в конфигурации remote_servers.

История 3. Ускоренная перезаливка реплик PostgreSQL


К сожалению, ничто не вечно и любая техника стареет. А это приводит к различным сбоям. Один из таких сбоев произошел на реплике баз данных PostgreSQL: отказал один из дисков и массив перешёл в режим read only.

После замены диска и восстановления работы сервера встал вопрос: как же быстро ввести его в строй, учитывая, что база у проекта довольно объемна (более 2 терабайт)?

Дело осложнялось тем, что репликация была заведена без слотов репликации, а за время, пока сервер приводили в чувство, все необходимые WAL-сегменты были удалены. Архивацией WAL в проекте никто не озаботился и момент для её включения был упущен. К слову, сами слоты репликации представляют угрозу в версиях PostgreSQL ниже 13, т.к. могут занять всё место на диске (а неопытный инженер о них даже не вспомнит). С 13-й версии PgSQL размер слота уже можно ограничить директивой max_slot_wal_keep_size.

Итак, казалось бы, надо вооружаться pg_basebackup и переливать базу с нуля, но по нашим подсчетам такая операция заняла бы 9 дней, и всё это время основной сервер БД работал бы без резерва. Что же делать? У нас же есть почти актуальные файлы, некоторые из которых база вообще не трогает, так как это старые партиции партицированных таблиц Но pg_basebackup требует чистой директории для начала копирования. Вот бы изобрести метод, который бы позволил докачать базу!..

И тут я вспомнил про исходный метод, которым мы снимали бэкапы еще во времена PostgreSQL 9.1. Он описывается в статье документации про Continuous Archiving and Point-in-Time Recovery. Суть его крайне проста и основана на том, что можно копировать файлы PgSQL, если вызвать команду pg_start_backup, а после процедуры копирования pg_stop_backup. В голове созрел следующий план:

  1. Создадим слот репликации для реплики командой на мастере:

    SELECT pg_create_physical_replication_slot('replica', true);
    

    Важно, чтобы при создании второй аргумент функции был именно true тогда база начнёт немедленно собирать сегменты WAL в этот слот, а не будет ждать первого подключения к нему.
  2. Выполним команду на мастере:

    SELECT pg_start_backup('copy', true);
    

    Снова важно, чтобы при создании второй аргумент функции был именно true тогда база немедленно выполнит checkpoint и можно будет начать копирование.
  3. Скопируем базу на реплику. Мы для этой цели использовали rsync:

    rsynс -avz --delete --progress rsync://leader_ip/root/var/lib/postgresql/10/main/ /var/lib/postgresql/10/main/
    

    С такими параметрами запуска rsync заменит изменившиеся файлы.
  4. По окончании копирования на мастере выполним:

    SELECT pg_stop_backup();
    
  5. На реплике положим такой recovery.conf с указанием нашего слота:

    standby_mode = 'on'primary_conninfo = 'user=rep host=master_ip port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres target_session_attrs=any'recovery_target_timeline = 'latest'primary_slot_name = replica
    
  6. Запустим реплику.
  7. Удалим слот репликации на реплике, так как он так же скопируется с мастера:

    SELECT pg_drop_replication_slot('replica');
    
  8. Проверим, что она появилась в системной таблице pg_stat_replication.

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

Мы знаем, что checkpoint_timeout равен 1 часу. Следовательно, надо удалить все файлы старше 1 часа, но от какого момента? Для этого на мастере делаем запрос:

SELECT pg_walfile_name(replay_lsn) from pg_stat_replication;     pg_walfile_name      -------------------------- 0000000200022107000000C8(1 row)

Исходя из него сверяем временную метку файла:

stat /var/lib/postgresql/10/main/pg_wal/0000000200022107000000C8...Access: 2020-12-02 13:11:20.409309421 +0300Modify: 2020-12-02 13:11:20.409309421 +0300Change: 2020-12-02 13:11:20.409309421 +0300

у удаляем все файлы старше. С этим помогут find и bash:

# Вычислим смещениеdeleteBefore=`expr $(date --date='2020-12-02 13:11:20' +%s) - 3600`mins2keep=`expr $(expr $(expr $(date +%s) - $deleteBefore) / 60) + 1`# Удалим файлы размером 16 МБ (стандартный размер сегмента WAL),# которые старше, чем mins2keepfind /var/lib/postgresql/10/main/pg_wal/ -size 16M -type f -mmin +$mins2keep -delete

Вот и всё: реплика была перелита за 12 часов (вместо 9 дней), функционирует и очищена от мусора.

История 4. CockroachDB не тормозит?


После обновления CockroachDB до версии 20.2.x мы столкнулись с проблемами производительности. Они выражались в долгом старте приложения и общем снижении производительности некоторых типов запросов. На CockroachDB 20.1.8 подобного поведения не наблюдалось.

Изначально имелось предположение, что дело в сетевых проблемах в кластере Kubernetes. Однако подтвердить его не удалось: cеть чувствовала себя отлично.



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

SET CLUSTER SETTING sql.log.slow_query.latency_threshold = '100ms';SET CLUSTER SETTING sql.log.slow_query.internal_queries.enabled = 'true';

Благодаря этому стало ясно, что используемый в приложении драйвер PostgreSQL JDBC при старте делает запросы к pg_catalog, а наличие базы Keyсloak сильно влияет на скорость работы этих запросов. Мы пробовали загрузить несколько копий базы и с каждый загруженным экземпляром скорость работы pg_catalog падала всё ниже и ниже:

I201130 10:52:27.993894 5920071 sql/exec_log.go:225  [n3,client=10.111.7.3:38470,hostssl,user=db1] 3 112.396ms exec "PostgreSQL JDBC Driver" {} "SELECT typinput = 'array_in'::REGPROC AS is_array, typtype, typname FROM pg_catalog.pg_type LEFT JOIN (SELECT ns.oid AS nspoid, ns.nspname, r.r FROM pg_namespace AS ns JOIN (SELECT s.r, (current_schemas(false))[s.r] AS nspname FROM ROWS FROM (generate_series(1, array_upper(current_schemas(false), 1))) AS s (r)) AS r USING (nspname)) AS sp ON sp.nspoid = typnamespace WHERE typname = $1 ORDER BY sp.r, pg_type.oid DESC" {$1:"'jsonb'"} 1 "" 0 { LATENCY_THRESHOLD }

Вот тот же запрос, но с загруженной проблемной базой:

I201130 10:36:00.786376 5085793 sql/exec_log.go:225  [n2,client=192.168.114.18:21850,hostssl,user=db1] 67 520.064ms exec "PostgreSQL JDBC Driver" {} "SELECT typinput = 'array_in'::REGPROC AS is_array, typtype, typname FROM pg_catalog.pg_type LEFT JOIN (SELECT ns.oid AS nspoid, ns.nspname, r.r FROM pg_namespace AS ns JOIN (SELECT s.r, (current_schemas(false))[s.r] AS nspname FROM ROWS FROM (generate_series(1, array_upper(current_schemas(false), 1))) AS s (r)) AS r USING (nspname)) AS sp ON sp.nspoid = typnamespace WHERE typname = $1 ORDER BY sp.r, pg_type.oid DESC" {$1:"'jsonb'"} 1 "" 0 { LATENCY_THRESHOLD }

Получается, что тормозили системные таблицы CockroachDB.

После того, как клиент подтвердил проблемы с производительностью уже в облачной инсталляции CockroachDB, источник проблемы стал проясняться: было похоже на улучшенную поддержку SQL, что появилась в релизе 20.2. План запросов к схеме pg_catalog заметно отличался от 20.1.8, и мы стали свидетелями регрессии.

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

ОБНОВЛЕНО (уже после написания статьи): Проблемы были исправлены в релизе CockroachDB 20.2.3 в Pull Request 57574.

Заключение


Как видно, иногда даже очевидные и простые операции могут повлечь за собой головную боль. Но выход всё равно можно найти, не так ли?.. Надеюсь, эти истории помогут и другим инженерам в повседневной работе. Stay tuned!

P.S.


Читайте также в нашем блоге:

Подробнее..

Почему хабражители предпочитают велосипеды, вместо готовых решений? Или о systemd, part 0

01.01.2021 18:11:05 | Автор: admin

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

Во всём виноват Хабр!

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

Как создавался новогодний Хабрачат в этом году

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

(пропущен башизм с бесконечным циклом и прочими sleep-ами)

оригинал

Безумный дом

В процессе эксплуатации я заметил, что Domoticz иногда падает с ошибкой. Чтобы поднимать его автоматически, напишу watchdog с помощью cron.

(пропущены башизм, на пару с кронтабом)

Теперь каждые 5 минут будет запускаться скрипт, который проверит, работает ли Domoticz и перезапустит его, если это необходимо

оригинал

Что с этим делать и как дальше жить?

Я совершенно не планировал писать статью освещающую самые основы systemd, у меня в планах, цикл статей из разряда systemd для продолжающих, но жизнь, как видно, вносит свои коррективы, в результате пусть моя сегодняшняя, коротенькая статья будет своеобразным прологом к планируемуму циклу. Но так как про написание сервисных юнитов systemd написано 100500 хаутушек, то мы осветим только параметры относящиеся к автоматическому перезапуску сервисов, на конкретных примерах (и на затравку кое что ещё ;-), в применении к статьям двух уважаемых хабровчан.

Делаем всё по фен-шую

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

Как создавался Хабрачат в этом году

Юнит(/etc/systemd/system/ssh-chat.service):

[Unit]Description=SSH Chat ServiceAfter=network.target network-online.target[Service]# Пользователь и группа с правами которых будет запускаться сервисUser=ssh-chatGroup=ssh-chatType=SimpleExecStart=/usr/local/bin/ssh-chat --admin=/etc/ssh-chat/admins --bind=0.0.0.0:22 --log /var/log/ssh-chat.log --motd=/etc/ssh-chat/motd# В каких случаях сервис будет автоматически перезагружаться.# on-failure  в случае выхода с ненулевым кодом возврата.Restart=on-failure# Таймаут перед загрузкой сервиса, после падения.RestartSec=1# Capablities для сервиса. В данном случае - разрешение сервису# биндиться на привилегированные порты (< 1000)AmbientCapablities=CAP_NET_BIND_SERVICE[Install]WantedBy=multiuser.target

Конфиг для systemd-sysusers.service(/etc/sysusers.d/ssh-chat.conf):

u ssh-chat - "SSH Chat user" /etc/ssh-chat# Поля записи:# u : создаём пользователя# ssh-chat : username# - : или UID[:GID] в данном случае автоматически занять свободные UID/GID < 1000# "SSH Chat user" : Описание, или "-", если не нужно.# /etc/ssh-chat : Home Directory# Может быть ещё одно поле -- login shell. По умолчанию /usr/bin/nologin

Инсталляция и запуск:

sudo systemctl restart systemd-sysusers.service && sudo systemctl enable --now ssh-chat

Безумный дом

Юнит(/etc/systemd/system/domoticz.service):

[Unit]Description=Domoticz DaemonAfter=network.target[Service]User=httpGroup=http# Эта директива позволяет выполнять подготовительные действия перед# запуском сервиса. Модификатор "+" указывает выполнять их от рута.ExecStartPre=+/usr/bin/install -d -m 0700 -o http -g http /var/run/domoticzExecStart=/opt/domoticz/domoticz -www 8080 -pidfile /var/run/domoticz/domoticz.pidPIDFile=/var/run/domoticz/domoticz.pidWorkingDirectory=/opt/domoticz# Всё то же самое, что и в случае "хабрачата", только таймаут 5 секунд.RestartSec=5Restart=on-failure[Install]WantedBy=multi-user.target

Инсталляция и запуск:

sudo systemctl enable --now domoticz

Что дальше?

Возможности systemd, кратко освещённые в этой статье, а так-же многие другие, более подробно будут разобраны в следующих статьях цикла. Триггеры, поддержка бинарных форматов, прозрачные(transient) юниты, встроенная контейнеризация and more, more... Но нетерпеливые могут уже вот прям щаз заняться чтением одной из лучших документаций в мире линукс. Маны которые можно почитать по сегодняшней теме:

man systemd.unitman systemd.serviceman systemctlman sysusers.dman systemd-sysusers

И на закуску маленький секрет. Один из моих любимых манов: man systemd.directives - путеводитель по всем директивам конфигурации которые могут встретиться вам в процессе изучения systemd.

Ещё раз С новым Годом Хабр! И используйте правильные инструменты! ;-)

Подробнее..

Systemd для продолжающих. Part 1 Запуск юнитов по временным событиям

02.01.2021 20:04:09 | Автор: admin

Всем привет! В последнее время я вплотную занимаюсь исследованием возможностей systemd и решил поделиться результатом исследований с сообществом, в виде небольшого (или большого, как пойдёт ;-) цикла статей. Итак первым (уже нет) номером нашей программы будет запуск юнитов по различным событиям происходящим во время работы ОС. В качестве исследовательской платформы будет выступать Manjaro Linux c systemd v247.2. И... да. Некоторые события, вынудили меня написать внеочередную статью, которая взлетела на вершину хит-парада, а опрос показал, что тема актуальна и вызывает интерес, так что погнали!

Пролог

Systemd система инициализации большинства современных систем на основе ядра Linux, обладает просто безграничными возможностями и не ограничивается обычным запуском демонов. Достаточно посмотреть на объёмы штатной документации, описывающей её возможности:

pacman -Ql $(pacman -Qsq systemd|xargs)|egrep '^systemd\s|^systemd-sysvcompat\s'|egrep "man/man[1|5|8]/[[:print:]]*\.gz"|wc -l278

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

pacman -Ql $(pacman -Qsq systemd|xargs)|egrep '^systemd\s|^systemd-sysvcompat\s'|wc -l1852

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

Disclamer: Хоть в официальной документации и манах почти не используется такое понятие как триггеры (хотя и используется triggered by), но все те штуки которые описаны в этой и следующей статье, по сути, именно ими и являются. Это сущности которые срабатывают по каким-либо событиям, поэтому не удивляйтесь, если я, авторским произволом, буду использовать этот термин.

Часть первая, очевидная. Таймеры.

Все мы знаем старый, добрый cron, во всех его проявлениях. Созданный ещё в 80-х, он, в том или ином виде, дожил до нашего времени облачных сервисов. Так-же мы все знаем его ограничения. Например одной строчкой невозможно заставить крон запускать произвольный бинарник/скрипт раз в полтора часа, начная с часа ночи, приходится описывать такое событие двумя строчками. Что-бы обойти ограничения классического крона, в systemd были придуманы такие триггеры как таймеры (юниты с окончанием *.timer) умеющие запускать произвольные сервисы или группы сервисов (*.target) периодически; по наступлении какого-либо времени; по выходу системы из спящего режима; по календарному событию (наподобие того как это делает другой ветеран Unix утилит, команда at), а так-же по другим событиям, не связанными, напрямую, со временем.

Для начала что запускаем. Возьмём, для примера, таймер man-db.timer из комплекта поставки одноимённого пакета:

$ cat /usr/lib/systemd/system/man-db.timer[Unit]Description=Daily man-db regenerationDocumentation=man:mandb(8)[Timer]OnCalendar=dailyAccuracySec=12hPersistent=true[Install]WantedBy=timers.target

Простой, коротенький таймер. Но в чём-же дело, почему не указано что мы запускаем? Всё нормально! По умолчанию, если в секции [Timer] отсутствует параметр Unit=, с указанием запускаемого юнита, systemd будет искать одноимённый *.service юнит. Проверяем!

$ cat /usr/lib/systemd/system/man-db.service[Unit]Description=Daily man-db regenerationDocumentation=man:mandb(8)ConditionACPower=true[Service]Type=oneshot# Recover from deletion, per FHS.ExecStart=+/usr/bin/install -d -o root -g root -m 0755 /var/cache/man# Expunge old catman pages which have not been read in a week.ExecStart=/usr/bin/find /var/cache/man -type f -name *.gz -atime +6 -delete# Regenerate man database.ExecStart=/usr/bin/mandb --quietUser=rootNice=19IOSchedulingClass=idleIOSchedulingPriority=7

Да, вот он сервис который ежедневно пересоздаёт базу данных страниц руководства. Сервис стартует начиная с 00:00 (OnCalendar=daily) , с точностью 12 часов (AccuracySec=12h), то-есть он может сработать в любой момент между полуночью и полднем, в зависимости от загрузки системы:

$ systemctl status man-db.timer  man-db.timer - Daily man-db regeneration     Loaded: loaded (/usr/lib/systemd/system/man-db.timer; disabled; vendor preset: disabled)     Active: active (waiting) since Thu 2020-12-31 23:18:59 MSK; 1 day 19h ago    Trigger: Sun 2021-01-03 00:00:00 MSK; 5h 30min left   Triggers:  man-db.service       Docs: man:mandb(8)дек 31 23:18:59 dell-lnx systemd[1]: Started Daily man-db regeneration.

Минимальная точность у параметра AccuracySec= 1us! Чем больше этот параметр, тем меньше нагрузка на систему. Если параметр отсутствует, то по умолчанию (указано в /etc/systemd/system.conf: DefaultTimerAccuracySec=) он равен одной минуте. Ладно, это всё лирика, давайте быстренько пробежимся по другим возможным параметрам секции [Timer], а на сладкое оставим параметры задания времени в OnCalendar= и других временнх параметрах.

Монотонные таймеры, для периодических событий

  • OnBootSec= Таймер сработает через указанное время после старта системы.

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

  • OnActiveSec= Один из параметров для периодического запуска. Через какое время, после реального времени срабатывания таймера, запускать юнит.

  • OnUnitActiveSec= Триггер будет ориентироваться на время последнего запуска целевого юнита.

  • OnUnitInactiveSec= Триггер будет ориентироваться на последнее время завершения работы целевого юнита. Хорошо для долгоиграющих сервисов. Бэкапы и вот это вот всё. Все эти таймеры можно комбинировать между собой и с таймером OnCalendar=.

Прочие параметры

  • RandomizedDelaySec= Этакий рандомный джиттер. Перед срабатыванием добавляется случайный таймаут от нуля, до заданного значения. По умолчанию -- отключено.

  • OnClockChange=, OnTimezoneChange= Булевые параметры, определяющие будет-ли таймер реагировать на перевод системных часов или смену временной зоны. По умолчанию, оба параметра, false.

  • Persistent= Записывать-ли на диск состояние таймера сразу после запуска юнита. Актуально для параметра OnCalendar=. По умолчанию false.

  • WakeSystem= Ещё один логический параметр. Действует на монотонные таймеры. По умолчанию отключён. Логика следующая. При отключённом параметре все монотонные таймеры запоминают своё состояние, перед уходом системы в спящий режим и встают на паузу. После выхода системы из спящего режима, отсчёт продолжается с того момента с которого система ушла в спячку. Если-же параметр поставить в true, то таймеры продолжают работать и в спящем режиме (должно поддерживаться и железом) и по наступлении события выводят систему из спячки и запускают юнит.

  • RemainAfterElapse= Последняя крутилка, по умолчанию true Смысл этого параметра примерно следующий, После срабатывания таймера он остаётся загруженным, но если поставить false, то после срабатывания таймер выгружается и перестаёт отслеживать время. Хорошо для одноразовых юнитов (Transient Units) о которых мы поговорим в одной из следующих статей. Или для таймеров которые должны сработать один раз, как это делают задания старой, доброй at.

Таймстампы, диапазоны, тестирование, примеры

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

[Unit]Description=Test timer[Timer]OnCalendar=01:00OnActiveSec=1.5h

Ну это слишком просто. Например мы хотим что-б наш юнит запускался каждую пятницу 13-е OnCalendar=Fri *-*-13 12:00:00 Полный формат календарной формы выглядит так: Mon 2025-12-01 00:00:00.000000 Europe/Moscow Поэтому мы можем запускать таймер по времени другого часового пояса (по умолчанию текущий) Например хотим что-б таймер прислал нам уведомление, что Камчатка уже отпраздновала Новый год: OnCalendar=yearly Asia/Kamchatka Нормализованная форма будет выглядеть так(эти строчки указывают на одно и то-же время):
OnCalendar=*-01-01 00:00:00 Asia/Kamchatka Алиасы (и их эквиваленты в нормализованной форме) могут быть такими:

                       minutely  *-*-* *:*:00                         hourly  *-*-* *:00:00                          daily  *-*-* 00:00:00                        monthly  *-*-01 00:00:00                         weekly  Mon *-*-* 00:00:00                         yearly  *-01-01 00:00:00                      quarterly  *-01,04,07,10-01 00:00:00                                                                         semiannually  *-01,07-01 00:00:00

Примеры валидных таймстампов:

таймстамп с @ epoch time
        Fri 2012-11-23 11:12:13  Fri 2012-11-23 11:12:13            2012-11-23 11:12:13  Fri 2012-11-23 11:12:13        2012-11-23 11:12:13 UTC  Fri 2012-11-23 19:12:13                     2012-11-23  Fri 2012-11-23 00:00:00                       12-11-23  Fri 2012-11-23 00:00:00                       11:12:13  Fri 2012-11-23 11:12:13                          11:12  Fri 2012-11-23 11:12:00                            now  Fri 2012-11-23 18:15:22                          today  Fri 2012-11-23 00:00:00                      today UTC  Fri 2012-11-23 16:00:00                      yesterday  Fri 2012-11-22 00:00:00                       tomorrow  Fri 2012-11-24 00:00:00      tomorrow Pacific/Auckland  Thu 2012-11-23 19:00:00                       +3h30min  Fri 2012-11-23 21:45:22                            -5s  Fri 2012-11-23 18:15:17                      11min ago  Fri 2012-11-23 18:04:22                    @1395716396  Tue 2014-03-25 03:59:56

Здесь представлены таймстампы как для OnCalendar=, так и для монотонных таймеров.

Перечисления и диапазоны:

Боольшой список примеров
      Sat,Thu,Mon..Wed,Sat..Sun  Mon..Thu,Sat,Sun *-*-* 00:00:00          Mon,Sun 12-*-* 2,1:23  Mon,Sun 2012-*-* 01,02:23:00                        Wed *-1  Wed *-*-01 00:00:00               Wed..Wed,Wed *-1  Wed *-*-01 00:00:00                     Wed, 17:48  Wed *-*-* 17:48:00    Wed..Sat,Tue 12-10-15 1:2:3  Tue..Sat 2012-10-15 01:02:03                    *-*-7 0:0:0  *-*-07 00:00:00                          10-15  *-10-15 00:00:00            monday *-12-* 17:00  Mon *-12-* 17:00:00      Mon,Fri *-*-3,1,2 *:30:45  Mon,Fri *-*-01,02,03 *:30:45           12,14,13,12:20,10,30  *-*-* 12,13,14:10,20,30:00                12..14:10,20,30  *-*-* 12..14:10,20,30:00      mon,fri *-1/2-1,3 *:30:45  Mon,Fri *-01/2-01,03 *:30:45                 03-05 08:05:40  *-03-05 08:05:40                       08:05:40  *-*-* 08:05:40                          05:40  *-*-* 05:40:00         Sat,Sun 12-05 08:05:40  Sat,Sun *-12-05 08:05:40               Sat,Sun 08:05:40  Sat,Sun *-*-* 08:05:40               2003-03-05 05:40  2003-03-05 05:40:00     05:40:23.4200004/3.1700005  *-*-* 05:40:23.420000/3.170001                 2003-02..04-05  2003-02..04-05 00:00:00           2003-03-05 05:40 UTC  2003-03-05 05:40:00 UTC                     2003-03-05  2003-03-05 00:00:00                          03-05  *-03-05 00:00:00                         hourly  *-*-* *:00:00                          daily  *-*-* 00:00:00                      daily UTC  *-*-* 00:00:00 UTC                        monthly  *-*-01 00:00:00                         weekly  Mon *-*-* 00:00:00        weekly Pacific/Auckland  Mon *-*-* 00:00:00 Pacific/Auckland                         yearly  *-01-01 00:00:00                       annually  *-01-01 00:00:00                          *:2/3  *-*-* *:02/3:00

Да. Микро и наносекунды тоже поддерживаются, а ещё очень удобная функция конца месяца и счётчик:

  • *-*~01 Первый день с конца каждого месяца (он-же последний день месяца).

  • *-05~05 27-e мая каждого года (31-5).

  • Mon *-12~07/1 Последний понедельник декабря.

  • Mon *-12-01/3 Третий понедельник декабря.

Проверять таймстампы на валидность можно при помощи утилиты systemd-analyze:

$ systemd-analyze calendar 'Mon *-12-01/1'  Original form: Mon *-12-01/1              Normalized form: Mon *-12-01/1 00:00:00         Next elapse: Mon 2021-12-06 00:00:00 MSK       (in UTC): Sun 2021-12-05 21:00:00 UTC       From now: 11 months 2 days left$ systemd-analyze timespan 1.5hOriginal: 1.5h            s: 5400000000   Human: 1h 30min$ systemd-analyze timestamp 01:00:30.9999  Original form: 01:00:30.9999              Normalized form: Sat 2021-01-02 01:00:30 MSK       (in UTC): Fri 2021-01-01 22:00:30 UTC   UNIX seconds: @1609538430.999900                From now: 18h ago 

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

man systemd.timerman systemd.timeman systemd-system.confman systemd-analyzeman tzselect

Список статей серии

  1. Почему хабражители предпочитают велосипеды, вместо готовых решений? Или о systemd, part 0

  2. Systemd для продолжающих. Part 1 Запуск юнитов по временным событиям

Подробнее..

Установка NTP сервера для включения его в pool.ntp.org

08.01.2021 08:12:11 | Автор: admin

Большинство дистрибутивов операционных систем на базе Linux и многих сетевых устройств используют для установки часов сервера вида *.pool.ntp.org.

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

Как сказано на сайте https://www.ntppool.org/ru/ - это огромный кластер серверов точного времени, предоставляющий надежный и простой в использовании NTP-сервис для миллионов клиентов и его услугами пользуются десятки миллионов систем по всему миру.

Как же установить свой сервер, что для этого требуется?

Требуется обычный сервер со статическим реальным IP адресом с актуальной операционной системой будь то Linux/BSD или подобное устройство которое в состоянии стабильно работать роли ntp-сервера по протоколу NTP https://ru.wikipedia.org/wiki/NTP который работает через интернет-сети на по порту 123/udp

Из-за небольшого потребления ресурсов и канала (до 10-15 килобит в секунду) подойдет практически любая конфигурация, например, VPS/VDS на базе KVM с минимальными ресурсами.

Цитирую с сайта https://www.ntppool.org/ru/join.html

В настоящее время большинство серверов получают порядка 5-15 NTP-пакетов в секунду. Несколько раз в день могут возникать пики по 60-120 пакетов в секунду. Переводя в килобиты, получаем примерно 10-15Кбит/с в среднем и порядка 50-120Кбит/с на пиках нагрузки. В пул постепенно входит все больше серверов, поэтому резкое возрастание нагрузки в будущем не ожидается. Таким образом, вам вряд ли потребуется полоса больше 384-512Кбит (на прием и отдачу)

Устанавливаем NTP-сервер

В большинстве дистрибутивов Linux он входит в стандартные репозитории операционной системы и достаточно выполнить его установку

apt install ntp для Debian/Ubuntu или yum install ntp для CentOS

Теперь откройте файл конфигурации в вашем /etc/ntp.conf и там в 99% случаев будут сервера из пула:

pool 0.debian.pool.ntp.org iburst

pool 1.debian.pool.ntp.org iburst

pool 2.debian.pool.ntp.org iburst

pool 3.debian.pool.ntp.org iburst

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

После чего перейдите по ссылкам http://support.ntp.org/bin/view/Servers/StratumTwoTimeServers и http://support.ntp.org/bin/view/Servers/StratumOneTimeServers выберете там сервера для синхронизации

Также рекомендуется использовать google по запросу вида ntp server ваша_страна

Рекомендуется использовать не меньше 4 и не больше 6 серверов

Руководствуйтесь правилом 2+2+2 -

2 сервера - StratumOne

2 сервера - StratumTwo

2 сервера - в геолокациях соседними с вашей

Работу сервера следует проверить командой ntpdate -q имя-сервера должен быть ответ вида

root@gw:~# ntpdate -q ntp4.vniiftri.ru

server 89.109.251.24, stratum 1, offset 0.001008, delay 0.08249

8 Jan 03:50:07 ntpdate[1414]: adjust time server 89.109.251.24 offset 0.001008 sec

Что означает что сервер работает, есть ответ и он представляет собой сервер первого яруса (stratum 1)

Подробнее об ярусах (stratum) можно прочитать по ссылке http://personeltest.ru/aways/habr.com/ru/post/79461/

Сервера которые являются эталонными часами (атомными, GPS-спутник) являются сервера так называемого нулевого уровня (stratum 0)

Сервера которые синхронизируются с ними напрямую (например, через GPS-приемник) имеют уровень 1

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

Проверка работоспособости

После добавления новых серверов (предварительно проверенных через ntpdate -q) следует перезапустить ntp-сервер (service ntp restart) и проверить его работу командой ntpq -pn

root@gw:~# ntpq -pn

remote refid st t when poll reach delay offset jitter

==============================================================================

-51.15.74.121 131.176.107.13 2 u 48 64 17 1.009 -0.030 0.246

193.190.230.37 .EXT. 1 u 41 64 17 4.825 -0.263 0.853

+145.238.203.14 .MRS. 1 u 41 64 17 14.549 -0.857 0.127

-89.109.251.24 .MRS. 1 u 44 64 17 46.043 0.501 1.539

+62.231.6.98 .GPS. 1 u 43 64 17 41.770 -1.292 0.647

-80.60.208.118 193.67.79.202 2 u 43 64 17 8.324 -1.364 1.338

Когда есть сервер который начинается с * - значит синхронизирован успешно.

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

Также проверьте работу сервера с внешнего подключения через интернет выполнив ntpdate -q ip-адрес тем самым убедитесь что все работает, udp/123 нигде не фильтруется

Добавлние сервера в пул pool.ntp.org

Дальше следует перейти на сайт https://www.ntppool.org/ru/join.html и добавить сервер - все предельно просто после быстрой регистрации

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

После чего выполняется проверка стабильности работы сервера (так называемый score) и как он станет больше 10 - ваш сервер будет добавлен в пул.

Наблюдать пакеты можно командой tcpdump port 123 - будут видны запросы с различных сетей различных провайдеров, в основном конечно с клиентских устройств (интернет-роутеров)

04:00:50.531801 IP gw.mytimeserver.net.ntp > 82-217-46-231.cable.dynamic.v4.ziggo.nl.59634: NTPv4, Server, length 48

04:00:50.888803 Imytimeserver.netP 51.144.84.29.ntp > gw.mytimeserver.net.ntp: NTPv4, Client, length 48

04:00:50.888998 IP gw.mytimeserver.net.ntp > 51.144.84.29.ntp: NTPv4, Server, length 48

04:00:51.621673 IP 46.11.105.3.54627 > gw.mytimeserver.net.ntp: NTPv4, Client, length 48

04:00:51.621916 IP gw.mytimeserver.net.ntp > 46.11.105.3.54627: NTPv4, Server, length 48

04:00:52.037807 IP 51.136.36.226.ntp > gw.mytimeserver.net.ntp: NTPv4, Client, length 48

04:00:52.052103 IP gw.mytimeserver.net.ntp > 40.68.72.138.ntp: NTPv4, Server, length 48

В связи с этим настоятельно рекомендую провайдерам интернет-услуг установить в своей сети ntp-сервер и включить его в ntp-пул.

Полезные ссылки

https://www.ntppool.org/ru/

http://www.ntp.org/

https://ru.wikipedia.org/wiki/NTP

Подробнее..

Systemd для продолжающих. Part 2 Триггеры на различные события

14.01.2021 10:07:09 | Автор: admin

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

Systemd.path триггер на события в файловой системе

Как известно, linux имеет большое количество системных вызовов, среди которых имеется замечательный вызов inotify() , позволяющий вешать обработчики на события в файловой системе на создание, удаление, изменение etc, файлов и каталогов. Наиболее распространёнными утилитами, использующими inotify() являются утилиты inotifywait и inotifywatch из пакета inotify-tools, которые хорошо использовать в скриптах, а так-же проект incron cron для файловой системы, о котором уже писали на Хабре. Systemd тоже имеет специальные юниты, которые хоть и ограничены по функционалу (я надеюсь пока), по сравнению с incron и тем более с inotify-tools , но зато умеют запускать юниты systemd.

Практическое применение systemd.path

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

$ cat /etc/systemd/system/enable-radeon.path[Unit]Description=Enable radeon path[Path]PathExists=/sys/kernel/debug/vgaswitcheroo/switch[Install]WantedBy=multi-user.target

Всё то-же самое, как и в случае с таймерами. Если в основной секции, в данном случае [Path], не указана директива Unit=, ищем и запускаем одноимённый *.service:

$ cat /etc/systemd/system/enable-radeon.service[Unit]Description=Enable radeon service[Service]Type=oneshotRemainAfterExit=yesExecStart=/usr/bin/sh -c "echo DDIS > /sys/kernel/debug/vgaswitcheroo/switch"[Install]WantedBy=multi-user.target

Итак всё просто. Энейблим *.path sudo systemctl enable enable-radeon.path и, во время загрузки, как только в дереве файловой системы появляется файл (PathExists=) /sys/kernel/debug/vgaswitcheroo/switch, запускаем соответствующий сервис.

Возможные директивы слежения для systemd.path

К сожалению их мало, но базовые потребности для старта каких-либо юнитов они, в принципе, покрывают:

  • PathExists= Триггерится на появление файла или директории, в файловой системе.

  • PathExistsGlob= То же самое что и предыдущая директива, но можно использовать файлы / каталоги по маске.

  • PathChanged= Если в файле или каталоге произошли изменения, при этом он не будет реагировать на каждый вызов write(), а сработает только после первого close()

  • PathModified= Подобно предыдущему, только в этом случае не ждём close(), а сразу реагируем на первый попавшийся write().

  • DirectoryNotEmpty= Как понятно из названия срабатывает только в отношении директорий, когда в директории появляется хотя-бы один файл.

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

Дополнительные параметры

  • Unit= Юнит для запуска. Важное замечание, о котором я забыл в предыдущей статье. В параметре Unit= не обязательно может быть *.service, но и любой другой (кроме *.path) юнит. Например *.mount.

  • MakeDirectory= Булевый параметр. Создавать-ли каталоги слежения. По умолчанию false.

  • DirectoryMode= Связанный с предыдущим параметром параметр раздачи прав на создаваемую директорию. По умолчанию 0755.

Сравнение функционала systemd.path c incron и inotify-tools

В таблице пропущено парочка специфичных для incron параметров.

Функция

systemd.path

inotify-tools

incron

read

access

IN_ACCESS

write

PathModified=

modify

IN_MODIFY

attrib

attrib

IN_ATTRIB

close & write

PathChanged=

close_write

IN_CLOSE_WRITE

close

close_nowrite

IN_CLOSE_NOWRITE

open

open

IN_OPEN

moved to watched

moved_to

IN_MOVED_TO

moved from watched

moved_from

IN_MOVED_FROM

moved self

moved_self

IN_MOVE_SELF

create

PathExist= PathExistGlob= DirectoryNotEmpty=

create

IN_CREATE

delete

delete

IN_DELETE

delete self

delete_self

IN_DELETE_SELF

unmount

unmount

systemd support

yes

И да, чуть не забыл. Все утилиты использующие inotify() работают только и исключительно на локальных файловых системах. То-есть, например, на SMB / NFS они работать не будут, но при этом спокойно будут работать в /run, /sys, /proc!

Systemd.automount триггеры автомонтирования ФС

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

Практика

Сразу два примера. Для автомонтирования локальной и удалённой файловой системы. Два *.automount и два *.mount юнита к ним в пару. В отличие от *.timer и *.path юнитов в случае автомаунта отсутствует директива Unit=, поэтому используется или одноимённый persistent *.mount, что предпочтительнее, либо *.mount автоматически сгенерированный из содержимого /etc/fstab.

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

$ cat /etc/systemd/system/boot.automount[Unit]Description=Automount boot partition when needed.[Automount]Where=/boot## Time to automatic umount of inactivityTimeoutIdleSec=120[Install]WantedBy=multi-user.target

И в пару к нему одноимённый *.mount файл:

$ cat /etc/systemd/system/boot.mount[Unit]Description=Boot partition (running by automount) /dev/sda1Documentation=man:systemd.mount(5)After=blockdev@dev-disk-by\x2duuid-ea65285a\x2d01da\x2d451c\x2da93a\x2d4b155c46aeeb.target[Mount]Where=/bootWhat=/dev/disk/by-uuid/ea65285a-01da-451c-a93a-4b155c46aeebType=ext4Options=rw,relatimeDirectoryMode=0755

Всё практически как в fstab, только раскидано по нескольким строчкам. Что происходит в автомаунте: Когда какой-либо процесс пытается прочитать/записать что-то в каталоге /boot или получить его листинг, автомаунт запускает одноимённый юнит *.mount и начинает мониторить обращения к /boot. Через 2 минуты после последнего обращения (TimeoutIdleSec=), раздел будет автоматически отмонтирован.

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

$ cat /etc/systemd/system/home-oxyd-Clouds-yadisk.automount[Unit]Description=Automount yandex disc when needed.[Automount]Where=/home/oxyd/Clouds/yadiskDirectoryMode=0777## Time to automatic umount of inactivityTimeoutIdleSec=300[Install]WantedBy=multi-user.target

И ответочка к нему:

$ cat /etc/systemd/system/home-oxyd-Clouds-yadisk.mount[Unit]Description=Yandex disk automounted driveDocumentation=man:systemd.mount(8) [Mount]Where=/home/oxyd/Clouds/yadiskWhat=https://webdav.yandex.ru/Type=davfsOptions=noauto,user

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

  • Where= Путь который мониторим.

  • TimeoutIdleSec= Таймаут перед автоотмонтированием, если параметр отсутствует, или равен 0 (по умолчанию) раздел не автоотмонтируется.

  • DirectoryMode= права на создание каталога для мониторинга, по умолчанию 0755.

Вот, вкратце, как-то примерно так. И, как всегда, какие маны почитать:

man systemd.pathman 7 inotifyman inotifywaitman inotifywatchman systemd.automountman systemd.mountman systemd-mountman 5 fstabman systemd.time

Список статей серии

  1. Почему хабражители предпочитают велосипеды, вместо готовых решений? Или о systemd, part 0

  2. Systemd для продолжающих. Part 1 Запуск юнитов по временным событиям

  3. Systemd для продолжающих. Part 2 Триггеры на различные события

Ресурсы

  • systemd.io Статьи по внутренней кухне systemd. Частенько упоминается в манах.

  • systemd @ freedesktop.org Основная страница с манами, документацией, видео, блогами и прочими ссылками на ресурсы.

  • @ru_systemd Русскоязычный чат в Telegram. У нас тепло и лампово.

Подробнее..

Клиент-серверный IPC на Python multiprocessing

11.01.2021 16:10:01 | Автор: admin

Статья отражает личный опыт разработки CLI приложения для Linux.

В ней рассмотрен способ выполнения привилегированных системных вызовов процессом суперпользователя по запросам управляющей программы через строго описанный API.

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

Введение

Межпроцессное взаимодействие (англ. inter-process communication, IPC) обмен данными между потоками одного или разных процессов. Реализуется посредством механизмов, предоставляемых ядром ОС или процессом, использующим механизмы ОС и реализующим новые возможности IPC. Википедия

У процессов, могут быть разные причины для обмена информацией. На мой взгляд все они являются следствием политики безопасности ядра Unix.

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

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

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

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

Предпосылки параллелизма

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

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

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

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

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

При этом вы можете запросить у процесса в руте исполнение системного вызова из пользовательского процесса при помощи одного из методов IPC.


Таблица методов межпроцессного взаимодействия

Метод

Реализуется ОС или процессом

Неименованный канал

Все ОС, совместимые со стандартом POSIX.

Разделяемая память

Все ОС, совместимые со стандартом POSIX.

Очередь сообщений (Message queue)

Большинство ОС.

Сигнал

Большинство ОС; в некоторых ОС, например, в Windows, сигналы доступны только в библиотеках, реализующих стандартную библиотеку языка Си, и не могут использоваться для IPC.

Почтовый ящик

Некоторые ОС.

Сокет

Большинство ОС.

Именованный канал

Все ОС, совместимые со стандартом POSIX.

Проецируемый в память файл (mmap)

Все ОС, совместимые со стандартом POSIX. При использовании временного файла возможно возникновение гонки. ОС Windows также предоставляет этот механизм, но посредством API, отличающегося от API, описанного в стандарте POSIX.

Обмен сообщениями (без разделения)

Используется в парадигме MPI, Java RMI, CORBA и других.

Файл

Все ОС.

Семафор

Все ОС, совместимые со стандартом POSIX.

Канал

Все ОС, совместимые со стандартом POSIX.


Для своего приложения я выбрал сокеты и написал API для коммуникации между процессами.

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

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

Историческая справка

Традиционно процессы, которые запускаются при загрузке системы и остаются активными в фоне, классифицируются как daemon. Имена исполняемых файлов таких программ по соглашению заканчиваются на d. Пример: systemd.

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

Известны и другие примеры: ssh и sshd.

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

Структура проекта

Для сервера и клиента я использую одинаковую структуру.

. core  api.py  __init__.py main.py

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

Реализация API клиента

from multiprocessing.connection import Clientfrom multiprocessing.connection import Listener# адрес сервера (процесса в руте) для исходящих# запросовdaemon = ('localhost', 6000)# адрес клиента (этого процесса) для входящих# ответов от сервераcli = ('localhost', 6001)def send(request: dict) -> bool or dict:    """    Принимает словарь аргументов удалённого метода.    Отправляет запрос, после чего открывет сокет    и ждет на нем ответ от сервера.    """    with Client(daemon) as conn:        conn.send(request)    with Listener(cli) as listener:        with listener.accept() as conn:            try:                return conn.recv()            except EOFError:                return Falsedef hello(name: str) -> send:    """    Формирует уникальный запрос и вызывает функцию    send для его отправки.    """    return send({        "method": "hello",        "name": name    })

В модуле connection пакета multiprocessing есть два класса, реализующих API высокого уровня над низкоуровнивым аналогом стандартной библиотеки socket.

Client класс, который содержит методы отправки дейтаграмм.

Listener принимает дейтаграммы.

Отправляемые запросы содержат название целевого метода сервера.

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

Использование API

В main.py я импортирую модуль api для дальнейшего использования.

from core import apiresponse = api.hello("World!")print(response)

Этот код представлен для демонстрации. В работе я использовал Сlick Framework для создания СLI приложения с опциями, которые вызывают методы API.

Реализация API сервера

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

def hello(request: dict) -> str:    """    Привилегированный системный вызов.    """    return " ".join(["Hello", request["name"])

Использование API

from core import apifrom multiprocessing.connection import Listenerfrom multiprocessing.connection import Client# адрес сервера (этого процесса) для входящих запросовdaemon = ('localhost', 6000)# адрес клиента для исходящих ответовcli = ('localhost', 6001)while True:    with Listener(daemon) as listener:        with listener.accept() as conn:            request = conn.recv()            if request["method"] == "hello":                response = api.hello(request)            with Client(cli) as conn:                conn.send(response)

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

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

Дополнительно

Советую снабдить свой сервер пакетом systemd, который позволяет программам на Python писать лог в journald.

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

Спасибо за внимание!

Подробнее..

Давайте напишем Linux терминал

13.01.2021 14:06:06 | Автор: admin

Приветствие

Всем привет! Хочу поделиться своим опытом написания собственного терминала Linux используя Posix API, усаживайтесь поудобнее.

Итоговый результатИтоговый результат

Что должен уметь наш терминал

  1. Запуск процессов в foreground и background режиме

  2. Завершение background процессов из терминала

  3. Поддержка перемещения по директориям

Как устроена работа терминала

  1. Считывание строки из стандартного потока ввода

  2. Разбиение строки на токены

  3. Создание дочернего процесса с помощью системного вызова fork

  4. Замена дочернего процесса на необходимый с помощью системного вызова exec

  5. Ожидание завершения дочернего процесса (в случае foreground процесса)

Немного про системный вызов fork()

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

Рассмотрим пример:

#include <stdio.h>#include <unistd.h>#include <wait.h>int main() {    pid_t pid = fork();        if (pid == 0) {        printf("I'm child process!\n");        } else {        printf("I'm parent process!\n");        wait(NULL);    }        return 0;}
Что выведет данная программа:

I'mparentprocess!
I'mchildprocess!

Что же произошло? Системный вызов fork создал клон процесса, т. е. теперь мы имеем родительский и дочерний процесс.

Чтобы отличить дочерний процесс от родительского в коде достаточно сделать проверку. Если результат функции fork равен 0 - мы имеем дело с дочерним процессом, если нет - с родительским. Это не означает, что в операционной системе id дочернего процесса равен 0.

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

Подробнее про exec()

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

Системный вызов exec заменяет текущий процесс сторонним. Естественно, сторонний процесс задается через параметры функции.

Рассмотрим пример:

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <wait.h>int main() {    pid_t pid = fork();        if (pid == 0) {        execlp("ls", "ls", "-l", NULL);        exit(1);    } else {        waitpid(pid, NULL, 0);    }        return 0;}
Что выведет данная программа

total 16
-rwxr-xr-x 1 runner runner 8456 Jan 13 07:33 main
-rw-r--r-- 1 runner runner 267 Jan 13 07:33 main.c

Что произошло?

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

Можно сказать мы реализовали простой терминал, вся логика заключается именно в этом.

Перейдем к полноценной реализации

Часть 1. Чтение строки с консоли.

Изначально нам надо уметь считывать строку из командной строки. Думаю, с этим не возникнет сложностей.

char* readline() {    char*   line = NULL;    size_t  size = 0;    ssize_t str_len;    // Reading line from stdin    if ((str_len = getline(&line, &size, stdin)) == -1) {        // Logging all errors except Ctrl-D - terminal shutdown        if (errno != 0) {            printf("[ERROR] Couldn't read from stdin\n");        }        free(line);        printf("\n");        return NULL;    }    // Remove useless \n symbol if exists    if (line[str_len - 1] == '\n') {        line[str_len - 1] = '\0';    }    return line;}

В данной функции происходит чтение строки с применением функции getline. После чего, если в конце строки имеется символ переноса строки, удаляем его.

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

Часть 2. Разбиение строки на токены.

В данной части будет представлена реализация разбиения строки на массив токенов.

#define DEFAULT_BUFF_SIZE 16#define TOKENS_DELIMITERS " \t"

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

char** split(char* line) {    size_t position  = 0;    size_t buff_size = DEFAULT_BUFF_SIZE;    char* token;    // Allocate memory for tokens array    char** tokens = (char**)malloc(sizeof(char*) * buff_size);    if (tokens == NULL) {        printf("[ERROR] Couldn't allocate buffer for splitting!\n");        return NULL;    }    // Tokenize process    token = strtok(line, TOKENS_DELIMITERS);    while (token != NULL) {        // Emplace token to array        tokens[position++] = token;        // If array free space ended - increase array        if (position >= buff_size) {            buff_size *= 2;            tokens = (char**)realloc(tokens, buff_size * sizeof(char*));            if (tokens == NULL) {                printf("[ERROR] Couldn't reallocate buffer for tokens!\n");                return NULL;            }        }        // Getting next token        token = strtok(NULL, TOKENS_DELIMITERS);    }    // Place NULL to the end of tokens array    tokens[position] = NULL;    return tokens;}

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

Очередной токен получается с использованием функции strtok. После чего данный токен копируется в массив токенов. Если в массиве токенов не достаточно места, массив увеличивается в 2 раза.

Завершается всё добавлением завершающего токена равного NULL, т. к. функция exec() ожидает наличие данного завершающего токена.

Часть 3. Выполнение процессов.

Структура хранения списка запущенных процессов.

Напишем определения структур для foreground и background процессов, fg_task и bg_task. А также определение структуры для хранения всех процессов tasks.

// Struct of background taskstruct bg_task_t {    pid_t  pid;           // Process id    bool   finished;      // Process state    char*  timestamp;     // Process state    char*  cmd;           // Command cmd};typedef struct bg_task_t bg_task;// Struct of foreground taskstruct fg_task_t {    pid_t pid;     // Process id    bool finished; // Process state};typedef struct fg_task_t fg_task;// Struct of all tasksstruct tasks_t {    fg_task  foreground; // Process id of foreground bg_task    bg_task* background; // Background task list    size_t   cursor;     // Cursor of background tasks    size_t   capacity;   // Background array capacity};typedef struct tasks_t tasks;

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

// Global variable for storing active taskstasks t = {    .foreground = {        .pid = -1,        .finished = true    },    .background = NULL,    .cursor = 0,    .capacity = 0};

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

Установка foreground процесса выглядит банально и не нуждается в комментировании.

void set_foreground(pid_t pid) {    t.foreground.pid = pid;    t.foreground.finished = 0;}

Добавление background процесса выглядит посложнее.

int add_background(pid_t pid, char* name) {    // Temp background task variable    bg_task* bt;    // If end of free space in background array - increase size    if (t.cursor >= t.capacity) {        t.capacity = t.capacity * 2 + 1;        t.background = (bg_task*)realloc(t.background, sizeof(bg_task) * t.capacity);        if (t.background == NULL) {            printf("[ERROR] Couldn't reallocate buffer for background tasks!\n");            return -1;        }    }    // Print info about process start    printf("[%zu] started.\n", t.cursor);    // Save task in temp variable    bt = &t.background[t.cursor];    // Save process info in array    bt->pid = pid;    bt->finished = false;    time_t timestamp = time(NULL);    bt->timestamp = ctime(&timestamp);    bt->cmd = strdup(name);    // Move cursor right    t.cursor += 1;    return 0;}

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

Данная функция возвращает -1 в случае неудачи.

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

Добавим функцию экстренного завершения foreground процесса. Данная функция с помощью системного вызова kill с параметром SIGTERM завершает процесс по id процесса.

void kill_foreground() {    if (t.foreground.pid != -1) {        // Kill process        kill(t.foreground.pid, SIGTERM);        // Set finished flag        t.foreground.finished = true;        printf("\n");    }}

Также добавим функцию для завершения background процесса.

int term(char** args) {    char* idx_str;      // Cursor in index arg    int   proc_idx = 0; // Converted to int index arg    if (args[1] == NULL) {        printf("[ERROR] No process index to stop!\n");    } else {        // Set cursor in index arg        idx_str = args[1];        // Convert string index arg to int        while (*idx_str >= '0' && *idx_str <= '9') {            proc_idx = (proc_idx * 10) + ((*idx_str) - '0');            // Move cursor to right            idx_str += 1;        }        // Kill process if process index not bad        // and target process not finished        if (*idx_str != '\0' || proc_idx >= t.cursor) {            printf("[ERROR] Incorrect background process index!\n");        } else if (!t.background[proc_idx].finished) {            kill(t.background[proc_idx].pid, SIGTERM);        }    }    return CONTINUE;}

Данная функция принимает в себя массив токенов вида {"term", "<bg task index>", NULL}. После чего преобразует токен индекса background задачи в число. Убивает background задачу посредством системного вызова kill.

Непосредственно запуск процессов.

Для удобства введем функцию is_background, определяющую является ли задача фоновым процессом. Данная функция просто проверяет наличие & в конце.

int is_background(char** args) {    // Current position in array    int last_arg = 0;    // Finding last arg in array    while (args[last_arg + 1] != NULL) {        last_arg += 1;    }    // Checking if task is background`    if (strcmp(args[last_arg], "&") == 0) {        // Remove '&' token for future executing        args[last_arg] = NULL;        // Return true        return 1;    }    // Return false if: '&' wasn't founded    return 0;}

Введем функцию launch которая будет запускать background процесс если в конце присутствует токен &, иначе будет запускаться foreground процесс.

int launch(char** args) {    pid_t pid;        // Fork process id    int   background; // Is background task    // Checking if task is background    background = is_background(args);    // Create child process    pid = fork();    // If created failure log error    if (pid < 0) {        printf("[ERROR] Couldn't create child process!\n");    }    // Child process    else if (pid == 0) {        // Try launch task        if (execvp(args[0], args) == -1) {            printf("[ERROR] Couldn't execute unknown command!\n");        }        exit(1);    }    // Parent process    else {        if (background) {            // Try add background task to array            if (add_background(pid, args[0]) == -1) {                // Kill all processes and free                // memory before exit                quit();            }        } else {            // Set foreground task to store            set_foreground(pid);            // Wait while process not ended            if (waitpid(pid, NULL, 0) == -1) {                // Logging error if process tracked with error                // Except when interrupted by a signal                if (errno != EINTR) {                    printf("[ERROR] Couldn't track the completion of the process!\n");                }            }        }    }    return CONTINUE;}

То, что происходит в этой функции уже должно быть все понятно.

  1. Создается дубликат процесса с помощью системного вызова fork

  2. Заменяем дочерний процесс на требуемый с помощью системного вызова exec

  3. Определяем является ли процесс фоновым

  4. Если процесс фоновый - просто добавляем его в список bacground задач

  5. Если процесс не фоновый - дожидаемся окончания выполнения процесса

В функции присутствует неизвестная функция quit. Ее мы разберем в следующем блоке.

Вспомогательные функции для терминала.

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

int execute(char** args) {    if (args[0] == NULL) {        return CONTINUE;    } else if (strcmp(args[0], "cd") == 0) {        return cd(args);    } else if (strcmp(args[0], "help") == 0) {        return help();    } else if (strcmp(args[0], "quit") == 0) {        return quit();    } else if (strcmp(args[0], "bg") == 0) {        return bg();    } else if (strcmp(args[0], "term") == 0) {        return term(args);    } else {       return launch(args);    }}

Данная функция пропускает действие, если первый токен NULL. Переходит в директорию, если первый токен cd. Выводит справку о пользовании, если первый токен help. Завершает работу терминала, если первый токен quit. Выводит список background задач, если первый токен bg. Убивает процесс по индексу, если первый токен term.

Во всех других случаях запускается процесс.

Реализация вспомогательных функций.

#define CONTINUE 1#define EXIT     0

Значение CONTINUEозначает дальнейшее исполнение главного цикла терминала. Значение EXITпрерывает выполнение главного цикла программы.

int cd(char** args) {    if (args[1] == NULL) {        printf("[ERROR] Expected argument for \"cd\" command!\n");    } else if (chdir(args[1]) != 0) {        printf("[ERROR] Couldn't change directory to \"%s\"!\n", args[1]);    }    return CONTINUE;}
int help() {    printf(        "Simple shell by Denis Glazkov.                               \n\n"        "Just type program names and arguments, and hit enter.          \n"        "Run tasks in background using '&' in the end of command.     \n\n"        "Built in functions:                                           \n"        "  cd   <path>        - Changes current working directory      \n"        "  term <bg_task_idx> - Prints list of background tasks        \n"        "  help               - Prints info about shell                \n"        "  bg                 - Prints list of background tasks        \n"        "  quit               - Terminates shell and all active tasks\n\n"        "Use the man command for information on other programs.         \n"    );    return CONTINUE;}
int quit() {    // Temp background task variable    bg_task* bt;    // Disable logging on child killed    signal(SIGCHLD, SIG_IGN);    // Kill foreground process    if (!t.foreground.finished) {        kill_foreground();    }    // Kill all active background tasks    for (size_t i = 0; i < t.cursor; i++) {        // Place background task to temp variable        bt = &t.background[i];        // Kill process if active        if (!bt->finished) {            kill(bt->pid, SIGTERM);        }        // Free memory for command name        free(bt->cmd);    }    return EXIT;}

Функция quit отключает все callback функции по событию SIGCHLD - т. е. функции, выполняющиеся когда дочерний элемент был завершен. После этого завершает все активные процессы.

#define PRIMARY_COLOR   "\033[92m"#define SECONDARY_COLOR "\033[90m"#define RESET_COLOR     "\033[0m"

Основные цвета терминала.

int bg() {    // Temp background task variable    bg_task* bt;    for (size_t i = 0; i < t.cursor; i++) {        // Store background task in temp variable        bt = &t.background[i];        // Print info about task        printf(            "[%zu]%s cmd: %s%s;%s pid: %s%d; %s"            "state: %s%s;%s timestamp: %s%s", i,            SECONDARY_COLOR, RESET_COLOR, bt->cmd,            SECONDARY_COLOR, RESET_COLOR, bt->pid,            SECONDARY_COLOR, RESET_COLOR, bt->finished ? "finished" : "active",            SECONDARY_COLOR, RESET_COLOR, bt->timestamp        );    }    return CONTINUE;}

Часть 4. Главный цикл терминала.

#include <stdlib.h>#include <signal.h>#include "include/shell.h"int main() {    char*  line;   // User input    char** args;   // Tokens in user input    int    status; // Status of execution    // Add signal for killing foreground child on ctrl-c    signal(SIGINT, kill_foreground);    // Add signal for handling end of child processes    signal(SIGCHLD, mark_ended_task);    // Shell is running while    // status == CONTINUE    do {        // Printing left shell info        display();        // Reading user input        line = readline();        if (line == NULL) {            exit(1);        }        // Parse line to tokens        args = split(line);        if (args == NULL) {            free(line);            exit(2);        }        // Try execute command        status = execute(args);        // Free allocated memory        free(line);        free(args);    } while (status);    return 0;}

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

// Add signal for killing foreground child on ctrl-csignal(SIGINT, kill_foreground);// Add signal for handling end of child processessignal(SIGCHLD, mark_ended_task);

Событие SIGINT- срабатывает при нажатии комбинации ctrl-C, которое в дефолтном поведении завершает работу программы. В нашем же случае мы переназначаем его на завершение foreground процесса.

Событие SIGCHLD - срабатывает при завершении дочернего процесса созданyого с помощью системного вызова fork. В нашем случае мы переопределяем его на пометку фоновой задачи как выполненной с помощью функции mark_ended_task.

void mark_ended_task() {    // Temp background task variable    bg_task* bt;    // Get process id of ended process    pid_t pid = waitpid(-1, NULL, 0);    // Handle foreground process    if (pid == t.foreground.pid) {        t.foreground.finished = true;    }    // Handle background process    else {        // Search and remove process form background tasks array        for (size_t i = 0; i < t.cursor; i++) {            // Place task to temp variable            bt = &t.background[i];            if (bt->pid == pid) {                // Print info about process end                printf("[%zu] finished.\n", i);                // Set new state for background process                bt->finished = 1;                break;            }        }    }}

Все что описано в главном цикле терминала можно описать словами:

  1. Вывод информации о пользователе и текущей директории с помощью функции display

  2. Чтение строки из стандартного потока ввода

  3. Разбиение строки на токены

  4. Выполнение ранее описанной функции execute, которая в зависимости от массива токенов выполняет нужное нам действие.

Нам осталось реализовать одну оставшуюся функцию display. Которая получает информацию о текущей директории с помощью функции getcwd и имя пользователя с помощью функции getpwuid.

void display() {    // Try get and print username with color    uid_t uid = geteuid();    struct passwd *pw = getpwuid(uid);    if (pw != NULL) {        printf("%s%s%s:", PRIMARY_COLOR, pw->pw_name, RESET_COLOR);    }    // Try get and print current directory with color    char cwd[MAX_DIRECTORY_PATH];    if (getcwd(cwd, MAX_DIRECTORY_PATH) != NULL) {        printf("%s%s%s", SECONDARY_COLOR, cwd, RESET_COLOR);    }    // Print end of shell info    printf("# ");}

Часть 5. Итоговый результат.

Итоговый результатИтоговый результат

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

С исходным кодом проекта вы можете ознакомиться по данной ссылке.

Подробнее..

Alma, но не Mater встречайте AlmaLinux, наследника CentOS 8

14.01.2021 16:09:15 | Автор: admin
Источник

CloudLinux заявила, что в продолжение дистрибутива CentOS 8 будет создан новый под названием AlmaLinux. Компания заменила первоначальное придуманное название, чтобы уйти от несколько каламбурного Lenix: Lenix Linux выглядело не очень читаемо.

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


Основатель компании CloudLinux предприниматель и выходец из Украины Игорь Селецкий. Штаб-квартира компании находится в Пало-Альто в Калифорнии. Среди клиентов компании крупнейшие корпорации и их дочки, включая Dell и IBM Softlayer.

Что известно о новом дистрибутиве AlmaLinux


  • Основа пакетная база Red Hat Enterprise.
  • Полная бинарная совместимость с RHEL.
  • Простая и прозрачная миграция с CentOS 8.
  • Поддерживаемые обновления до 2029 года.
  • Free-модель для пользователей.
  • Функции принятия решений делегируют сообществу по аналогии с платформой Fedora.


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

Зачем нужен новый дистрибутив? У ветки CentOS 8 есть одно узкое место: прекращение поддержки с конца этого года. Ее убрали преждевременно, многие пользователи CentOS 8, включая компании, рассчитывали на сопровождение со стороны разработчиков до 2029 года. Пользователей могла бы спасти миграция на CentOS Stream, но пока нет ясности в ее совместимости с RHEL.

В целом, не все так плохо и с оригинальным CentOS например, Facebook и Twitter продолжают верить в дистрибутив. Компании создали рабочую группу Hyperscale. Цель создание решений для больших инфраструктур на базе CentOS Stream и EPEL. Также группа проведет глобальное тестирование функциональных изменений в дистрибутиве, чтобы упростить процессы интеграции с другими системами. Так, планируется упростить внедрение режима COW (Copy-On-Write) в DNF и RPM.

Какие еще есть альтернативы для CentOS?



Во-первых, существует Oracle Linux. Компания Oracle 14 лет разрабатывает собственный клон RHEL. Его преимущества:

  • 100% совместим с RHEL на бинарном уровне;
  • разработан для гибридного облака;
  • автоматическое обновление Linux без перезагрузки;
  • оптимизирован для работы программного обеспечения Oracle.

Второй альтернативой можно рассмотреть Rocky Linux.

Система полностью управляется сообществом. Сейчас зарегистрировано 370 человек в качестве волонтеров. Создание Rocky Linux обусловлено также трансформацией CentOS. Наработки проекта планируют публиковать под лицензией BSD. Релиз запланирован на второй квартал 2021 года. Для сборочных процессов планируют использовать Koji, Mock и MBS из Fedora Linux.

Подробнее..

Веселые уроки WinCC OA. Установка WinCC OA под Debian и перенос прикладного проекта

30.12.2020 08:08:41 | Автор: admin

Скачивая недавно с сайта winccoa.com установщик последнего патча версии 3.17, с некоторым удивлением, постепенно перешедшим в ликование, обнаружил, что список поддерживаемых дистрибутивов Linux расширился и до Debian. Дело в том, что посмотреть на работу системы в ОС, отличной от Windows, мне хотелось давно, но из всех дистрибутивов Linux я более-менее понимаю только Debian, а привыкать к новому ради баловства откровенно не хотелось. Собственно, и под Debian установка проходит не сильно гладко.

Итак, по порядку. Считаем, что дистрибутив уже скачен с сайта. Лицензия у меня установлена на виндовую машину, да она особо и не нужна. В домашней директории пользователя (он должен находится в группе sudoers'ов) создаю директорию winccoadist, куда распаковываю содержимое скаченного архива.

Запускаю терминал (как обычно, нажатием CTRL+ALT+T) и перехожу в свою директорию с дистрибутивами. Смотрю список файлов.

В связи с тем, что никаких репозиториев тут нет, пакеты являются файлами, необходимо провести установку в правильной последовательности. Вначале установить пакет системы лицензирования codemeter, потом базовый пакет WinCC OA, а далее опциональные пакеты, среди которых мне интересны демо-проекты (Applications), справка на русском и английском (Help) и драйвер S7Plus. Как это частенько бывает в чудесном мире бесплатного линукса некоторые вещи сделаны через такое место, которое в приличном обществе все или почти все называют задницей. Касается это как самих дистрибутивов, так и поставщиков ПО под них. Предвижу ворчание со стороны опытных *nix'оидов, однако с обывательской точки зрения вот так... а я простой обыватель, поймите правильно Для установки пакетов в Debian обычно применяются команда apt, которая сама умеет проверять зависимости пакетов. Поэтому первые два ставим через apt. Для этого в терминале вводим команду

sudo apt install ./codemeter_7.10.4196.501_amd64.deb

и ждем ее завершения.

Далее устанавливаем базовый пакет WinCC OA, который содержит основную инсталляцию все менеджеры, ядро и т.д.

sudo apt install ./WinCC_OA_3.17.9-Base-debian.x86_64.deb

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

Пока что все неплохо, тот же Project Administrator успешно запустился.

А вот с дополнительными пакетами все сложнее. Команда apt по непонятным мне причинам находит неразрешенную зависимость и отказывается ее устанавливать. Причем, ругается на, якобы, неустановленный базовый пакет WinCC OA. Складывается ощущение, что apt проверяет зависимости с учетом регистра. А вот команда dpkg не учитывает регистр при проверке. Поэтому далее нужные мне опции я устанавливаю командой dpkg

sudo dpkg -i ./WinCC_OA_3.17.9-Applications-debian.x86_64.deb

Аналогично устанавливаю справку и драйвер S7plus

sudo dpkg -i ./WinCC_OA_3.17.9-Help_EN-debian.x86_64.deb

sudo dpkg -i ./WinCC_OA_3.17.9-Help_RU-debian.x86_64.deb

sudo dpkg -i ./WinCC_OA_3.17.9-S7Plus-debian.x86_64.deb

Вся система и демо-проекты установились успешно в директорию /opt/WinCC_OA/3.17

Теперь я хочу перенести сюда прикладной проект, получившийся в результате моего базового учебного курса (https://vk.com/wall183956096_8006) и запустить его.

Копирую всю папку с проектом Workshop в свою домашнюю директорию в Debian. Убеждаюсь в том, что я являюсь владельцем (owner) директории Workshop и всех вложенных файлов и директорий. Теперь необходимо скорректировать вручную конфиг-файл проекта. Открываю файл /home/earl/Workshop/config/config

Необходимо скорректировать пути pvss_path (путь к установке WinCC OA) и proj_path (путь к самому проекту WinCC OA). Изменяем эти пути.

Запустим Project Administrator и зарегистрируем в системе мой проект.

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

Если начнутся проблемы с запуском менеджеров архивов в Linux, то способ решения приведен по ссылке:https://www.winccoa.com/knowledge-base/detail/can-a-wincc-oa-project-be-copied-from-windows-to-linux.html

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

Подробнее..

Пишем драйвер фреймбуфера для Raspberry Pi с LCD

05.01.2021 00:04:18 | Автор: admin

Прочитав монументальную серию статей о подключении LCD экрана к роутеру мне захотелось сделать то же самое. Однако многообразие используемого стека (openwrt, stm32, usb) в сочетании с отсутствием полных исходников кода но может плохо искал несколько затруднило задачу. Я решил начать с малого написать свою реализацию framebuffer для raspberry и вывести графическую среду raspberry на LCD. Что из этого получилось, описываю далее.


Вообще-то имеются готовые драйверы для LCD (проект tbtft), но мы напишем свой, чтобы лучше понять как все устроено.


LCD


LCD 320x240 с контроллером ILI9341. Передача данных по 8 битной шине.


Запись данных в LCD осуществляется следующим образом (стр.28):


1 на RD и 1 на RESET после старта LCD держим все время. Перед передачей данных подаем 0 на CS, выставляем 8 бит данных на шине, устанавливаем 1 или 0 на RS (D/CX на графике) в зависимости от типа передачи данные / команда, сбрасываем WR в 0, затем устанавливаем в 1. После окончания передачи данных выставляем CS в 1.


Код передачи данных / команд
/* файл lcd.c */void LCD_write(u8 VAL){    LCD_CS_CLR;    DATAOUT(VAL);    LCD_WR_CLR;    LCD_WR_SET;    LCD_CS_SET;}/* передача команды */void LCD_WR_REG(u8 data){    LCD_RS_CLR;    LCD_write(data);}/* передача данных */void LCD_WR_DATA(u8 data){    LCD_RS_SET;    LCD_write(data);}/* запись значения в регистр */void LCD_WriteReg(u8 LCD_Reg, u8 LCD_RegValue){    LCD_WR_REG(LCD_Reg);    LCD_WR_DATA(LCD_RegValue);}/* передача 16 бит данных */void Lcd_WriteData_16Bit(u16 Data){    LCD_RS_SET;    LCD_CS_CLR;    DATAOUT((u8)(Data>>8));    LCD_WR_CLR;    LCD_WR_SET;    DATAOUT((u8)Data);    LCD_WR_CLR;    LCD_WR_SET;    LCD_CS_SET;}

Основной код управления LCD (для STM32), в основном взят отсюда и адаптирован для raspberry. Цвет каждого пикселя на LCD задается 16 битами в формате RGB565 (5 бит на красный цвет, 6 на зеленый, 5 на синий).


Код управления LCD
/* файл lcd.h */#define LCD_W 320#define LCD_H 240/* файл lcd.c *//* индикация того, что далее передаются данные для видеобуфера */void LCD_WriteRAM_Prepare(void){    LCD_WR_REG(0x2C);}/* задаем прямоугольник на экране, который будем отрисовывать */void LCD_SetWindows(u16 xStart, u16 yStart,u16 xEnd,u16 yEnd){    LCD_WR_REG(0x2A);    LCD_WR_DATA(xStart>>8);    LCD_WR_DATA(0x00FF&xStart);    LCD_WR_DATA(xEnd>>8);    LCD_WR_DATA(0x00FF&xEnd);    LCD_WR_REG(0x2B);    LCD_WR_DATA(yStart>>8);    LCD_WR_DATA(0x00FF&yStart);    LCD_WR_DATA(yEnd>>8);    LCD_WR_DATA(0x00FF&yEnd);    LCD_WriteRAM_Prepare();}/* ресет экрана */void LCD_RESET(void){    LCD_RST_CLR;    delay(100);    LCD_RST_SET;    delay(50);}/* инициализация экрана */void LCD_Init(void){    LCD_RESET();    LCD_WR_REG(0xCF);    LCD_WR_DATA(0x00);    LCD_WR_DATA(0xC9);    LCD_WR_DATA(0X30);    LCD_WR_REG(0xED);    LCD_WR_DATA(0x64);    LCD_WR_DATA(0x03);    LCD_WR_DATA(0X12);    LCD_WR_DATA(0X81);    LCD_WR_REG(0xE8);    LCD_WR_DATA(0x85);    LCD_WR_DATA(0x10);    LCD_WR_DATA(0x7A);    LCD_WR_REG(0xCB);    LCD_WR_DATA(0x39);    LCD_WR_DATA(0x2C);    LCD_WR_DATA(0x00);    LCD_WR_DATA(0x34);    LCD_WR_DATA(0x02);    LCD_WR_REG(0xF7);    LCD_WR_DATA(0x20);    LCD_WR_REG(0xEA);    LCD_WR_DATA(0x00);    LCD_WR_DATA(0x00);    LCD_WR_REG(0xC0);        LCD_WR_DATA(0x1B);       LCD_WR_REG(0xC1);        LCD_WR_DATA(0x00);       LCD_WR_REG(0xC5);        LCD_WR_DATA(0x30);       LCD_WR_DATA(0x30);       LCD_WR_REG(0xC7);       LCD_WR_DATA(0XB7);    LCD_WR_REG(0x36);        LCD_WR_DATA(0x08);    LCD_WR_REG(0x3A);    LCD_WR_DATA(0x55);    LCD_WR_REG(0xB1);    LCD_WR_DATA(0x00);    LCD_WR_DATA(0x1A);    LCD_WR_REG(0xB6);        LCD_WR_DATA(0x0A);    LCD_WR_DATA(0xA2);    LCD_WR_REG(0xF2);        LCD_WR_DATA(0x00);    LCD_WR_REG(0x26);        LCD_WR_DATA(0x01);    LCD_WR_REG(0xE0);        LCD_WR_DATA(0x0F);    LCD_WR_DATA(0x2A);    LCD_WR_DATA(0x28);    LCD_WR_DATA(0x08);    LCD_WR_DATA(0x0E);    LCD_WR_DATA(0x08);    LCD_WR_DATA(0x54);    LCD_WR_DATA(0XA9);    LCD_WR_DATA(0x43);    LCD_WR_DATA(0x0A);    LCD_WR_DATA(0x0F);    LCD_WR_DATA(0x00);    LCD_WR_DATA(0x00);    LCD_WR_DATA(0x00);    LCD_WR_DATA(0x00);    LCD_WR_REG(0XE1);        LCD_WR_DATA(0x00);    LCD_WR_DATA(0x15);    LCD_WR_DATA(0x17);    LCD_WR_DATA(0x07);    LCD_WR_DATA(0x11);    LCD_WR_DATA(0x06);    LCD_WR_DATA(0x2B);    LCD_WR_DATA(0x56);    LCD_WR_DATA(0x3C);    LCD_WR_DATA(0x05);    LCD_WR_DATA(0x10);    LCD_WR_DATA(0x0F);    LCD_WR_DATA(0x3F);    LCD_WR_DATA(0x3F);    LCD_WR_DATA(0x0F);    LCD_WR_REG(0x2B);    LCD_WR_DATA(0x00);    LCD_WR_DATA(0x00);    LCD_WR_DATA(0x01);    LCD_WR_DATA(0x3f);    LCD_WR_REG(0x2A);    LCD_WR_DATA(0x00);    LCD_WR_DATA(0x00);    LCD_WR_DATA(0x00);    LCD_WR_DATA(0xef);    LCD_WR_REG(0x11);     delay(120);    LCD_WR_REG(0x29);     LCD_WriteReg(0x36,(1<<3)|(1<<5)|(1<<6)); }/* заполняем экран одним цветом */void LCD_Clear(u16 Color){    unsigned int i;    LCD_SetWindows(0,0,LCD_W-1,LCD_H-1);    for(i=0;i<LCD_H*LCD_W;i++)    {        Lcd_WriteData_16Bit(Color);    }}/* рисуем картинку из raw файла (в нем подряд идут цвета пикселей в формате RGB565) */void LCD_draw_image(char *file){    int fd = open(file, O_RDWR);    if(fd < 0){        perror("Open file");        exit(1);    }    u16 buffer[128];    LCD_SetWindows(0,0,LCD_W-1,LCD_H-1);    while(1){        int nread = read(fd, buffer, 256);        if(nread == 0 || nread < 0)            break;        /* buffer[i] - 2 байта, поэтому пишем nread/2 раз */        for(int i=0; i < nread/2; i++){            Lcd_WriteData_16Bit(buffer[i]);        }    }    close(fd);}

Raspberry


Я использую raspberry pi 3 с установленным raspbian lite (версия ядра 4.14). GUI добавлено установкой пакетов lxde и xinit.


sudo apt-get install lxde xinit

Расположение GPIO



Подключение LCD к raspberry


  • LCD Data 0 -> GPIO 12
  • LCD Data 1 -> GPIO 13
  • ...
  • LCD Data 7 -> GPIO 19
  • LCD CS -> GPIO 20
  • LCD RS -> GPIO 21
  • LCD RST -> GPIO 22
  • LCD WR -> GPIO 23
  • LCD RD -> GRPIO 24
  • LCD 5V -> 5V
  • LCD GND -> Ground

Управление GPIO


В raspberry GPIO можно управлять через прямое обращение к памяти. Из мануала к BCM 2837 32 битные регистры GPFSEL0-5 используются для установки режима GPIO. На каждый GPIO пин отводится 3 бита. Пину 0 соответствуют биты 2-0 в GPFSEL0, пину 1 биты 5-3 и т.д. Каждый регистр управляет 10 GPIO. Биты 000 соответствуют режиму input, биты 001 режиму output. Установку режима можно описать следующим образом:


/* файл rpi_gpio.h *//* установка input режима */#define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3))/* установка output режима */#define OUT_GPIO(g) *(gpio+((g)/10)) |=  (1<<(((g)%10)*3))

Для пинов 0 31 в режиме output установка 1 делается через регистр GPSET0. Чтобы установить GPIO n в 1, в регистр нужно записать число, n-ый бит в котором равен 1. Например, для установки 1 в GPIO 10 и 11 в регистр GPSET0 необходимо записать число 0b11 << 10.


Аналогично, установка 0 осуществляется через регистр GPCLR0.


/* устанавливаем 1 на GPIO, например, 1 на GPIO 10 - GPIO_SET = 1<<10 */#define GPIO_SET *(gpio+7)/*  устанавливаем 0 на GPIO, например, 0 на GPIO 10 - GPIO_CLR = 1<<10 */#define GPIO_CLR *(gpio+10)

gpio содержит виртуальный адрес физического адреса 0x3F200000 (отображенного посредством mmap в виртуальную память процесса). *gpio позволяет обратиться к GPFSEL0. *(gpio+7) к GPSET0. *(gpio+10) к GPCLR0.


Код установки gpio
/* файл rpi_gpio.c */int setup_rpi_gpio(){    unsigned int gpio_base_addr = 0x3F200000;   /* open /dev/mem */   if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) {      printf("can't open /dev/mem \n");      return -1;   }   /* mmap GPIO */   gpio_map = mmap(      NULL,             //Any adddress in our space will do      BLOCK_SIZE,       //Map length      PROT_READ|PROT_WRITE,// Enable reading & writting to mapped memory      MAP_SHARED,       //Shared with other processes      mem_fd,           //File to map      gpio_base_addr    //Offset to GPIO peripheral   );   close(mem_fd); //No need to keep mem_fd open after mmap   if (gpio_map == MAP_FAILED) {      printf("mmap error %d\n", (int)gpio_map);//errno also set!      return -1;   }   // Always use volatile pointer!   gpio = (volatile uint32_t *)gpio_map;   return 0;}

Управление LCD c raspberry


Пинами LCD управляем следующим образом:
/* файл lcd.h */#define BIT_BASE 12#define CS   20#define RS   21#define RST  22#define WR   23#define RD   24#define LCD_CS_SET  GPIO_SET=(1<<CS)#define LCD_RS_SET  GPIO_SET=(1<<RS)#define LCD_RST_SET GPIO_SET=(1<<RST)#define LCD_WR_SET  GPIO_SET=(1<<WR)#define LCD_RD_SET  GPIO_SET=(1<<RD)#define LCD_CS_CLR  GPIO_CLR=(1<<CS)#define LCD_RS_CLR  GPIO_CLR=(1<<RS)#define LCD_RST_CLR GPIO_CLR=(1<<RST)#define LCD_WR_CLR  GPIO_CLR=(1<<WR)#define LCD_RD_CLR  GPIO_CLR=(1<<RD)#define DATAOUT(x) GPIO_SET=(x<<BIT_BASE);GPIO_CLR=(x<<BIT_BASE)^(0xFF<<BIT_BASE)

Проверка работы с LCD в user space


Перед тем как бросаться в пучину kernel, проверим работу с LCD в user space. Подготовим картинку image.jpg в формате raw 320x240. В output.raw содержатся подряд идущие 16 битные значения цвета каждого пикселя (RGB565):


mogrify -format bmp -resize 320 -crop 320x240 image.jpgffmpeg -vcodec bmp -i image.bmp -vcodec rawvideo -f rawvideo -pix_fmt rgb565 output.raw

Выведем output.raw на LCD:


/* файл main.c */int main(int argc , char *argv[]){    if( setup_rpi_gpio() ) {        printf("Cannot map GPIO memory, probably use <sudo>\n");        return -1;    }    for(int i = BIT_BASE; i <= RD; i++){        INP_GPIO(i);        OUT_GPIO(i);    }    //set BITS_BASE - RD to 1    GPIO_SET = 0xFFF<<12;    GPIO_SET = 1 << RD;    LCD_Init();    if(argc >= 2){        LCD_draw_image(argv[1]);    }}

gcc main.c rpi_gpio.c lcd.c -o mainsudo ./main output.raw


Подготовка окружения


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


Заголовки ядра со скриптами сборки для текущей версии ядра в raspbian так просто не поставить, поэтому скачаем исходный код linux, скомпилируем и установим ядро, и будем использовать эти заголовки со скриптами для компиляции драйвера. Основной reference по этому процессу здесь. Версия сорцов ядра подобрана под мою версию raspbian.


git clone --depth=1 -b rpi-4.14.y https://github.com/raspberrypi/linux.gitcd linuxKERNEL=kernel7make bcm2709_defconfigmake -j4 zImage modules dtbssudo make modules_installsudo cp arch/arm/boot/dts/*.dtb /boot/sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/sudo cp arch/arm/boot/zImage /boot/$KERNEL.img

Компиляцию драйвера в дальнейшем выполняем командой make, поместив в директорию с драйвером вот такой Makefile:


Makefile
ifeq ($(KERNELRELEASE),)    KERNELDIR ?= /lib/modules/$(shell uname -r)/build        PWD := $(shell pwd)modules:    $(MAKE) -C $(KERNELDIR) M=$(PWD) modulesmodules_install:    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_installclean:    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions.PHONY: modules modules_install cleanelse    # имя драйвера, если компилируем vfb.c, заменим на vfb.o        obj-m := lcd_drv_simple.oendif

Драйвер фреймбуфера


Теория фреймбуферов хорошо расписана здесь и здесь, поэтому повторяться не буду.


Начнем с виртуального фреймбуфера (vfb.c). Он выделяет область памяти, в которую пишет изображение, направленное в /dev/fbX (X номер устройства). Это изображение потом можно легко прочитать через cat /dev/fbX. Этот драйвер удобен для тестирования (в нашем случае того, что компиляция и установка драйвера проходит успешно).


Код берем отсюда. Далее


makesudo cp vfb.ko /lib/modules/$(uname -r)/extra/# просим систему обновить зависимостиsudo depmod# загружаем драйверsudo modprobe vfb_enable=1# устанавливаем размер экрана и глубину цвета (16 бит, режим RGB565)fbset -fb /dev/fb1 -g 320 240 320 240 16

Должно появиться новое framebuffer устройство (/dev/fb1). Запишем в него какое-нибудь изображение,


sudo apt-get install fbi# fbi требует запуска из полноценной консоли, если запускаем под ssh используем sudo и -T 1 для указания первой консоли sudo fbi -a -d /dev/fb1 -T 1 image.jpg

считаем его


cat /dev/fb1 > scrn.raw

и откроем в gimp как файл raw rgb565. Убедимся, что изображение есть.


Простой драйвер


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


Установку режима и уровня (1/0) пинов модифицируем следующим образом (просто прямой доступ к I/O памяти в ядре не работает):


/* файл lcd_drv_simple.c */static void inp_gpio(u32 g){    u32 *addr = gpio+g/10;    u32 val = readl(addr);    u32 tmp =  ~(7<<((g%10)*3));    val &= tmp;    writel(val,addr);}static void out_gpio(u32 g){    u32 *addr = gpio+g/10;    u32 val = readl(addr);    u32 tmp =  (1<<(((g)%10)*3));    val |= tmp;    writel(val,addr);}static void GPIO_SET(u32 val){    writel(val,gpio+7);}static void GPIO_CLR(u32 val){    writel(val,gpio+10);}

Адрес gpio получаем вызовом ioremap:


gpio = ioremap(PORT, RANGE);

Параметры драйвера описываются в структурах:
u32 *gpio;static unsigned PORT = 0x3F200000;static unsigned RANGE =  0x40;#define W 320#define H 240static struct fb_fix_screeninfo ili9341_fix  = {        .type        = FB_TYPE_PACKED_PIXELS,        .visual      = FB_VISUAL_TRUECOLOR,        .accel       = FB_ACCEL_NONE,        .line_length = W * 2,};static struct fb_var_screeninfo ili9341_var  = {        .xres        = W,        .yres        = H,        .xres_virtual    = W,        .yres_virtual    = H,        .width        = W,        .height        = H,        .bits_per_pixel = 16,        .red         = {11, 5, 0}, /* смещение 11 бит, 5 битов на красный цвет */        .green         = {5, 6, 0}, /* смещение 5 бит, 6 битов на зеленый цвет */        .blue         = {0, 5, 0}, /* смещение 0 бит, 5 битов на синий цвет */        .activate     = FB_ACTIVATE_NOW,        .vmode     = FB_VMODE_NONINTERLACED,};/* используем готовую реализацию операций с фреймбуфером */static struct fb_ops ili9341_fbops = {        .owner        = THIS_MODULE,        .fb_write     = fb_sys_write,        .fb_fillrect  = sys_fillrect,        .fb_copyarea  = sys_copyarea,        .fb_imageblit = sys_imageblit,        .fb_setcolreg   = ili9341_setcolreg,};/* ссылки на функции probe и remove */struct platform_driver ili9341_driver = {        .probe = ili9341_probe,        .remove = ili9341_remove,        .driver = { .name = "my_fb_driver" }};/* задаем функцию ili9341_update, обновляющую экран (частота обновления задается в параметре delay) */static struct fb_deferred_io ili9341_defio = {        .delay          = HZ / 25,        .deferred_io    = &ili9341_update,};

Основные функции:
static int  ili9341_probe(struct platform_device *dev){    int ret = 0;    struct ili9341 *item;    struct fb_info *info;    unsigned char  *videomemory;    printk("ili9341_probe\n");    /*выделяем память под вспомогательную структуру для хранения указателей */    item = kzalloc(sizeof(struct ili9341), GFP_KERNEL);    if (!item) {        printk(KERN_ALERT "unable to kzalloc for ili9341\n");        ret = -ENOMEM;        goto out;    }    /* заполняем ее */    item->dev = &dev->dev;    dev_set_drvdata(&dev->dev, item);    /* получаем ссылку на минимально инициализированный fb_info */    info = framebuffer_alloc(0, &dev->dev);    if (!info) {        ret = -ENOMEM;        printk(KERN_ALERT "unable to framebuffer_alloc\n");        goto out_item;    }    item->info = info;    /* заполняем структуру fb_info нашими данными */    info->par = item;    info->dev = &dev->dev;    info->fbops = &ili9341_fbops;    info->flags = FBINFO_FLAG_DEFAULT;    info->fix = ili9341_fix;    info->var = ili9341_var;    info->fix.smem_len = VIDEOMEM_SIZE; // размер буфера видеопамяти    info->pseudo_palette = &pseudo_palette;    /* выделяем память под видеобуфер, в который пишут приложения, использующие /dev/fbX */    videomemory=vmalloc(info->fix.smem_len);    if (!videomemory)    {        printk(KERN_ALERT "Can not allocate memory for framebuffer\n");        ret = -ENOMEM;        goto out_info;    }    /* прописываем его в структуре fb_info и сохраняем в нашей структуре ili9341 для дальнейшего использования */    info->fix.smem_start =(unsigned long)(videomemory);    info->screen_base = (char __iomem *)info->fix.smem_start;    item->videomem = videomemory;    /* заполняем информацию об отложенном обновлении экрана */    info->fbdefio = &ili9341_defio;    fb_deferred_io_init(info);    /* передаем заполненную структуру fb_info ядру */    ret = register_framebuffer(info);    if (ret < 0) {        printk(KERN_ALERT "unable to register_frambuffer\n");        goto out_pages;    }    if (ili9341_setup(item)) goto out_pages;    return ret;    out_pages:    kfree(videomemory);    out_info:    framebuffer_release(info);    out_item:    kfree(item);    out:    return ret;}int ili9341_setup(struct ili9341 *item){    int i;    /* отображаем адрес для работы с портами GPIO в gpio */    gpio = ioremap(PORT, RANGE);    if(gpio == NULL){        printk(KERN_ALERT "ioremap error\n");        return 1;    }    /* инициализируем LCD */    for(i = BIT_BASE; i <= RD; i++){        inp_gpio(i);        out_gpio(i);    }    GPIO_SET(0xFFF<<12);    GPIO_SET(1 << RD);    LCD_Init();    printk("ili9341_setup\n");    return 0;}static void ili9341_update(struct fb_info *info, struct list_head *pagelist){    /* получаем ссылку на нашу структуру с указателями */    struct ili9341 *item = (struct ili9341 *)info->par;    /* адрес видеопамяти */    u16 *videomemory = (u16 *)item->videomem;    int i, j, k;    /* заполняем весь экран */    LCD_SetWindows(0,0,LCD_W-1,LCD_H-1);        for(i = 0; i < LCD_W * LCD_H; i++){        /* читаем данные из видеопамяти попиксельно и записываем их в LCD */        Lcd_WriteData_16Bit(readw(videomemory));        videomemory++;    }}

Запускаем графическую оболочку на LCD


Проверим работу драйвера. Скомпилируем, установим и загрузим его


makesudo cp lcd_drv_simple.ko /lib/modules/$(uname -r)/extra/sudo depmodsudo modprobe lcd_drv_simple

Выведем случайное изображение:


cat /dev/urandom > /dev/fb1

Выведем на соответствующий /dev/fbX картинку или видео:


sudo fbi -a -d /dev/fb1 -T 1 image.jpgmplayer -vo fbdev:/dev/fb1 video.mp4

Запустим графическую оболочку на LCD. Если Desktop environment (DE) еще не установлено (например, серверный вариант raspbian), его можно поставить:


sudo apt-get install lxde

Создадим файл /etc/X11/xorg.conf:


Section "Device"    Identifier "FBDEV"    Driver "fbdev"    Option "fbdev" "/dev/fb1"EndSection

и добавим в /etc/rc.local:


/sbin/modprobe lcd_drv_simple

После перезагрузки на LCD должна появиться графическая оболочка.


Ускоряем работу драйвера


Предыдущий вариант драйвера прост, но не очень быстр. Полная перерисовка экрана заметна. Deferred_io хорошо тем, что ядро передает в функцию ili9341_update список измененных страниц видеопамяти, которые и нужно перерисовать на экране. Т.е. необходимо понять, какая область экрана соответствует заданным 4096 байтам (размер страницы памяти).


  • Первые 4096 байтов соответствуют полным 6 линиям и 128 пикселям 7ой линии, т.к. 4096 = 320*2*6 + 128*2 (2 байта на каждый пиксель)
  • Вторые 4096 байтов начинаются с 129 пикселя 7ой линии, требуют 384 байта для завершения линии (128*2 + 384 = 640), затем идут 5 полных линий и 256 пикселей в 6 линии (4096 = 384 + 640*5 + 512).

Аналогично продолжаем рассуждения дальше, получается, что каждые 5 страниц ситуация повторяется. Поэтому достаточно прописать 5 вариантов отрисовки страницы памяти на экране. Отдельно прописываем работу с последней страницей номер 37, т.к. она занимает 2048 байтов:


Код драйвера
/* файл lcd_drv_fast.c *//* далее используем атомарные операции, которые по факту не очень нужны, т.к. метод ili9341_touch на raspberry ни разу не вызывался (т.е. нет ситуации нескольких потоков выполнения, изменяющих toUpdate одновременно */ static void ili9341_update(struct fb_info *info, struct list_head *pagelist){    struct ili9341 *item = (struct ili9341 *)info->par;    struct page *page;    int i;        /* для измененных страниц вычитаем 1 из toUpdate атомарно, toUpdate для этих страниц принимает значение -2 */     list_for_each_entry(page, pagelist, lru)    {        atomic_dec(&item->videopages[page->index].toUpdate);    }    for (i=0; i<FP_PAGE_COUNT; i++)    {        /* для всех страниц увеличиваем toUpdate на 1. Если страница не измененена, то вычтем 1 обратно и получим -1. Если изменена, то также получим -1 после инкремента, но в этом случае еще и выполним отрисовку измененной страницы */        if(atomic_inc_and_test(&item->videopages[i].toUpdate)){            atomic_dec(&item->videopages[i].toUpdate);        }        else        {            draw(item, i);                  }    }}static void draw(struct ili9341 *item, int page){    int xs,ys,i;    /* рассчитываем адрес страницы в видеопамяти */    u16 *videomemory = (u16*)(item->videomem + PAGE_SIZE*page);    /* строка LCD, с которой начинается страница */    ys = (((unsigned long)(PAGE_SIZE*page)>>1)/W);    /* короткая страница памяти, обрабатываем отдельно */    if (page == 37){        // write PAGE_SIZE / 2;        //write 128 bytes        LCD_SetWindows(256, ys, LCD_W-1, ys);        for(i = 0; i < 128 / 2; i++){            Lcd_WriteData_16Bit(readw(videomemory));            videomemory++;        }        //write 3 lines        LCD_SetWindows(0, ys+1, LCD_W-1, ys+6);        for(i = 0; i < 640 * 3 / 2; i++){            Lcd_WriteData_16Bit(readw(videomemory));            videomemory++;        }    }    else{        switch (page % 5){        //xs = 0. write full six lines and 256 bytes        //640 * 6 + 256        case 0:            //write 6 lines            LCD_SetWindows(0,ys,LCD_W-1,ys + 5);            for(i = 0; i < 640 * 6 / 2; i++){                Lcd_WriteData_16Bit(readw(videomemory));                videomemory++;            }            //write 256 bytes            LCD_SetWindows(0, ys+6, 256/2-1, ys + 6); //7th line from x = 0 to x = 256/2            for(i = 0; i < 256 / 2; i++){                Lcd_WriteData_16Bit(readw(videomemory));                videomemory++;            }            break;        //xs = 128 (256 bytes). write 384 bytes, 5 full lines and 512 bytes        //384 + 640 * 5 + 512        case 1:            //write 384 bytes            LCD_SetWindows(256/2, ys, LCD_W-1, ys);            for(i = 0; i < 384 / 2; i++){                Lcd_WriteData_16Bit(readw(videomemory));                videomemory++;            }            //write 5 lines            LCD_SetWindows(0, ys+1, LCD_W-1, ys+5);            for(i = 0; i < 640 * 5 / 2; i++){                Lcd_WriteData_16Bit(readw(videomemory));                videomemory++;            }            //write 512 bytes            LCD_SetWindows(0, ys+6, 512/2-1, ys+6);            for(i = 0; i < 512 / 2; i++){                Lcd_WriteData_16Bit(readw(videomemory));                videomemory++;            }            break;        //xs = 256 (512 bytes). write 128 bytes, then 6 full lines and 128 bytes        //128 + 640*6 + 128        case 2:            //write 128 bytes            LCD_SetWindows(256, ys, LCD_W-1, ys);            for(i = 0; i < 128 / 2; i++){                Lcd_WriteData_16Bit(readw(videomemory));                videomemory++;            }            //write 6 lines            LCD_SetWindows(0, ys+1, LCD_W-1, ys+6);            for(i = 0; i < 640 * 6 / 2; i++){                Lcd_WriteData_16Bit(readw(videomemory));                videomemory++;            }            //write 128 bytes            LCD_SetWindows(0, ys+7, 128/2-1, ys+7);            for(i = 0; i < 128 / 2; i++){                Lcd_WriteData_16Bit(readw(videomemory));                videomemory++;            }            break;        //xs = 64 (128 /2). write 512 bytes, then 5 lines and 384 bytes        //512 + 640*5 + 384        case 3:            //write 512 bytes            LCD_SetWindows(64, ys, LCD_W-1, ys);            for(i = 0; i < 512 / 2; i++){                Lcd_WriteData_16Bit(readw(videomemory));                videomemory++;            }            //write 5 lines            LCD_SetWindows(0, ys+1, LCD_W-1, ys+5);            for(i = 0; i < 640 * 5 / 2; i++){                Lcd_WriteData_16Bit(readw(videomemory));                videomemory++;            }            //write 384 bytes            LCD_SetWindows(0, ys+6, 384/2-1, ys+6);            for(i = 0; i < 384 / 2; i++){                Lcd_WriteData_16Bit(readw(videomemory));                videomemory++;            }            break;        //xs = 384/2. write 256 bytes, then 6 full lines        //256 + 640*6        case 4:            //write 256 bytes            LCD_SetWindows(384/2, ys, LCD_W-1, ys);            for(i = 0; i < 256 / 2; i++){                Lcd_WriteData_16Bit(readw(videomemory));                videomemory++;            }            LCD_SetWindows(0, ys+1, LCD_W-1, ys+6);            for(i = 0; i < 640 * 6 / 2; i++){                Lcd_WriteData_16Bit(readw(videomemory));                videomemory++;            }            break;        default: break;        }    }}

Также небольшие изменения в структуре ili9341 и функции ili9341_probe:


struct videopage{    atomic_t                toUpdate;};struct ili9341 {    struct device *dev;    struct fb_info *info;    unsigned char *videomem;    /* здесь отмечаем изменения в страницах памяти */    struct videopage videopages[FP_PAGE_COUNT];};static int  ili9341_probe(struct platform_device *dev){    ...    /* инициализируем массив для отслеживания изменений страниц памяти */    for(i=0;i<FP_PAGE_COUNT;i++)    {        atomic_set(&item->videopages[i].toUpdate, -1);          }}

В структуре ili9341_fbops используем свои функции, которые работают как обертка над стандартными, при этом помечая измененные страницы с помощью функции ili9341_touch. Дело в том, что если ядро использует функции отрисовки, заданные структурой ili9341_fbops, измененные страницы памяти в ili9341_update не поступают и их нужно отдельно помечать. Фактически же, графическая система raspbian эти функции не использует.


Код
static struct fb_ops ili9341_fbops = {        .owner        = THIS_MODULE,        .fb_write     = ili9341_write,        .fb_fillrect  = ili9341_fillrect,        .fb_copyarea  = ili9341_copyarea,        .fb_imageblit = ili9341_imageblit,        .fb_setcolreg   = ili9341_setcolreg,};static ssize_t ili9341_write(struct fb_info *p, const char __user *buf, size_t count, loff_t *ppos){    ssize_t retval;    printk("ili9341_write\n");    retval=fb_sys_write(p, buf, count, ppos);    ili9341_touch(p, 0, 0, p->var.xres, p->var.yres);    return retval;}static void ili9341_fillrect(struct fb_info *p, const struct fb_fillrect *rect){    printk("ili9341_fillrect\n");    sys_fillrect(p, rect);    ili9341_touch(p, rect->dx, rect->dy, rect->width, rect->height);}static void ili9341_imageblit(struct fb_info *p, const struct fb_image *image){    printk("ili9341_imageblit\n");    sys_imageblit(p, image);    ili9341_touch(p, image->dx, image->dy, image->width, image->height);}static void ili9341_copyarea(struct fb_info *p, const struct fb_copyarea *area){    printk("ili9341_copyarea\n");    sys_copyarea(p, area);    ili9341_touch(p, area->dx, area->dy, area->width, area->height);}static void ili9341_touch(struct fb_info *info, int x, int y, int w, int h){    struct ili9341 *item = (struct ili9341 *)info->par;    int firstPage;    int lastPage;    int i;    printk("touch x %d, y %d, w %d, h %d",x,y,w,h);    firstPage=((y*W)+x)*BYTE_DEPTH/PAGE_SIZE-1;    lastPage=(((y+h)*W)+x+w)*BYTE_DEPTH/PAGE_SIZE+1;    if(firstPage<0)        firstPage=0;    if(lastPage>FP_PAGE_COUNT)        lastPage=FP_PAGE_COUNT;    for(i=firstPage;i<lastPage;i++)        atomic_dec(&item->videopages[i].toUpdate);    schedule_delayed_work(&info->deferred_work, info->fbdefio->delay);}

Система с двумя экранами


Немного поэксперементируем. Подключим к raspberry два экрана. В качестве основного экрана используем экран / телевизор, подключенный к HDMI. В качестве второго экрана используем LCD.


Чтобы перетаскивание окошек между экранами было лучше видно, я "увеличил" размер экрана LCD, которые видит linux до 640x480. В ядре я регистрирую экран 640x480, однако на сам LCD пишу каждый второй пиксель в строке и пропускаю каждую вторую строку. Измененный код ili9341_update:


/* файл lcd_drv_simple_640_480.c */#define W 320*2#define H 240*2/* изменения в ili9341_update на примере простого драйвера */for(j = 0; j < H; j++){    if (j % 2 == 1){ //skip        videomemory += W;    }    else{        for(i = 0; i < W; i += 2){            Lcd_WriteData_16Bit(readw(videomemory));            videomemory += 2;                       }    }}

Для работы с двумя экранами глубина цвета на них должна быть одинаковой. Для этого добавляем в /boot/config.txt:


[all]framebuffer_depth=16

Ставим xinerama для перетаскивания окон между экранами:


sudo apt-get install libxinerama-dev

Заменяем конфигурационный файл /etc/X11/xorg.conf


xorg.conf
Section "Device"        Identifier      "LCD"        Driver          "fbdev"        Option          "fbdev" "/dev/fb1"        Option          "ShadowFB" "off"        Option          "SwapbuffersWait" "true"EndSectionSection "Device"        Identifier      "HDMI"        Driver          "fbdev"        Option          "fbdev" "/dev/fb0"        Option          "ShadowFB" "off"        Option          "SwapbuffersWait" "true"EndSectionSection "Monitor"        Identifier      "LCD-monitor"        Option          "RightOf" "HDMI-monitor"EndSectionSection "Monitor"        Identifier      "HDMI-monitor"        Option          "Primary" "true"        EndSectionSection "Screen"        Identifier      "screen0"        Device          "LCD"        Monitor         "LCD-monitor"EndSectionSection "Screen"        Identifier      "screen1"        Device          "HDMI"         Monitor         "HDMI-monitor"EndSectionSection "ServerLayout"        Identifier      "default"        Option          "Xinerama" "on"        Option          "Clone" "off"        Screen 0        "screen0" RightOf "screen1"        Screen 1        "screen1" EndSection

Результат:


Заключение


Надеюсь было интересно. Код на github.

Подробнее..

Обход ограничений терминала

11.01.2021 16:10:01 | Автор: admin

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

Как уменьшить количество команд?

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

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

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

К первой категории можно отнести следующие шеллы:

rbash

rzsh

rksh

Ко второй категории относятся:

lshell

rssh

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

Попробуем протестировать приложения для ограничения доступных команд. В качестве базовой системы возьмем Kali Linux на базе ОС Debian 5.9. Первым инструментом для исследования возьмем rbash, найти базовую информацию касательно его работы можно вот здесь. Запускается rbash достаточно просто:

  1. Создадим директорию для тестирования и перейдем в нее: mkdir test; cd test

  2. Запустим команду rbash в директории test. Для нее будут применены все стандартные ограничения, описанные в документации, в том числе и на выполнение команды cd. Проверим:

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

Попробуем использовать другое приложение rzsh. Его настройка такая же, как и у предыдущего подопытного. Любопытный факт запускать rzsh или устанавливать его дополнительно не нужно, если есть zsh: достаточно указать при запуске флаг -r. Список ограничений можно найти здесь.

Запустим ограничение на той же директории, которую создали в прошлом эксперименте и так же постараемся выйти в другую директорию:

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

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

Какие существуют методы обхода ограничений?

При использовании описанных выше приложений или их аналогов можно задаться резонным вопросом: насколько безопасно так ограничивать терминал? Может ли злоумышленник обойти выставленные ограничения? Для ответа на эти вопросы можно попробовать применить стандартные этапы исследования систем или приложений на безопасность, то есть провести самостоятельный пентест (мысли, как преступник):

  1. Сбор информации (Enumiration)

  2. Создание сценариев атаки

  3. Реализация атаки

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

  1. Какой именно шелл используется для настройки ограничений?

  2. Какие команды поддерживает шелл?

  3. Какое наименование имеет операционная система?

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

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

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

В нашем случае сам терминал при попытке ввода команды рассказал, что для ограничений запущен rbash:

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

2. Сценарий атаки. Как следует поступить для выполнения команды перехода cd? Любая система или механизм сдается, если попытаться протестировать функции, объединяющие несколько подсистем или отдельных блоков ОС, поскольку не всегда возможно программно обеспечить корректное взаимодействие между ними. В нашем случае выполнение команды cd это запуск процесса в операционной системе. Попробуем это сделать за счет дополнительных утилит. Даже при наличии ограничений от rbash у юзера есть возможность пользоваться безобидными приложениями, например vim:

3. Реализация атаки. Для проведения атаки можно попытаться использовать функционал vim, который может передавать команды в ОС: !.

В открытом файле vim вводим последовательность команд: :!bash.

В итоге получаем доступ к терминалу без ограничений:

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

Вывод

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


Статья подготовлена экспертом OTUS - Александром Колесниковым в преддверии старта курса Administrator Linux. Professional.

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

Подробнее..

Oracle cloud превращаем ubuntu 20.04 в gentoo

15.01.2021 10:11:34 | Автор: admin
Oracle cloud предлагает некоторые ресурсы совершенно бесплатно. В частности на халяву можно получить 2 виртуальные машины. При создании машины у вас есть выбор из centos, Ubuntu или oracle linux. С учетом ограниченности ресурсов витруальной машины мне стало интересно нельзя ли использовать на этой машине gentoo?

В документации gentoo описано как можно на лету превратить любой линукс в gentoo. К сожалению инструкция последний раз обновлялась в 2014 и если ее применять в лоб скорее всего у вас возникнут проблемы. Однако на гитхабе можно найти скрипт, который по утверждению автора может в автоматическом режиме превратить любой линукс в gentoo. Скрипт давно не обновлялся, но после небольших изменений отработал как надо. Автор исходного скрипта решил не применять мой пулл реквест, но модифицировал свой скрипт базируясь на моих предложениях. Мой вариант скрипта можно найти тут.

Итак, давайте осуществим превращение ubuntu 20.04 в gentoo. Для этого создаем виртуальную машину используя образ ubuntu 20.04 minimal и логинимся на него как пользователь ubuntu. После этого переключаемся на юзера root
sudo -i

Переходим в режим single user
systemctl rescue

В нормальных условиях при этом отваливается сеть. В oracle cloud этого не происходит, однако завершается процесс systemd-resolved и как следствие перестает работать dns. Давайте это исправим
rm /etc/resolv.conf && echo 'nameserver 8.8.8.8' >/etc/resolv.conf

Теперь можно запустить скрипт миграции и пойти выпить чаю, это займет какое-то время
wget -qO- https://raw.githubusercontent.com/kt97679/to-gentoo/master/to-gentoo|bash

Когда выполнения скрипта закончится он предложит вам перезагрузиться. Прежде чем это делать надо убедиться, что вы не потеряете root доступ после перезагрузки. Для этого надо разрешить доступ root по ssh
sed -i -e '/^PermitRootLogin.*/d' /etc/ssh/sshd_config && echo -e "\nPermitRootLogin without-password" >>/etc/ssh/sshd_config

И поправить файл /root/.ssh/authorized_keys
sed -i -e 's/.*\(ssh-rsa.*\)/\1/' /root/.ssh/authorized_keys

Теперь можно перезагружаться, но команда reboot не поможет, так что давайте привлечем тяжелую артиллерию
sync && echo 1 > /proc/sys/kernel/sysrq && echo b > /proc/sysrq-trigger

Машина уходит в перезагрузку и через пару минут вы сможете залогиниться на нее по ssh как root. Вы находитесь в gentoo окружении, но по прежнему используете старые ядро и initrd. Давайте это исправим.

Включим swap, без этого вам не хватит памяти скомпилировать новое ядро.
fallocate -l2G /var/tmp/swap && chmod 0600 /var/tmp/swap && mkswap /var/tmp/swap && swapon /var/tmp/swap

Я не планирую использовать на этой машине systemd, так что маскирую его и udev
echo -e 'sys-apps/systemd\nsys-fs/udev'> /etc/portage/package.mask/systemd

После этого можно установить пакеты необходимые для компиляции ядра
emerge gentoo-sources app-arch/lz4

Теперь можно перейти в директорию с исходниками ядра,
cd /usr/src/linux

сгенерировать конфиг нового ядра используя конфиг загруженного ядра,
yes ""|make oldconfig

и оставить в конфиге только те модули, которые используются в настоящий момент.
yes ""|make localmodconfig

Я планирую не использовать на этой машине initrd, так что все модули будут вкомпилированы в ядро
yes ""|make localyesconfig

Запускаем компиляцию и установку ядра
make && make INSTALL_MOD_STRIP=1 modules_install && make install

Наша машина весьма маломощна, так что этот процесс займет много времени. Когда компиляция закончится надо обновить конфигурацию загрузчика. Я добавил параметры ядра, которые применялись в исходной ubuntu.
cat >/boot/grub/grub.cfg <<EOFset timeout=1menuentry 'gentoo' {  linux $(ls -t /boot/vmlinuz-*|head -n1) root=/dev/sda1 console=tty1 console=ttyS0 nvme.shutdown_timeout=10 libiscsi.debug_libiscsi_eh=1}EOF

Имеет смысл разрешить логин на последовательной консоли если будут проблемы с сетью
sed -i -e 's/^#\(.*ttyS0.*\)/\1/' /etc/inittab

Осталось немного. После перезагрузки сетевой интерфейс будет называться не ens3, а eth0. Надо удалить скрипт инициализации старого интерфейса и добавить инициализацию нового
cd /etc/init.d && rm net.ens3 && ln -s net.lo net.eth0

На случай необходимости залогиниться через последовательную консоль надо задать пароль для пользователя root
passwd

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

Если после перезагрузки вам не удасться залогиниться на машину по ssh создайте консольное подключение и используйте его для отладки.

Теперь у вас есть базовая установка gentoo которую можно модифицировать под ваши нужды. В системе остались артефакты от исходной ubuntu. Они больше не нужны и их можно удалить. Скрипты с командами миграции можно найти тут.
Подробнее..
Категории: Linux , Настройка linux , Gentoo

Категории

Последние комментарии

© 2006-2021, personeltest.ru