LINUX.ORG.RU

Сообщения vbr

 

Код ломает маркдаун

Вроде ничего особенного в нём нет, но маркдаун ломает. Использую '''c (для подсветки). Если не указывать C, то всё работает. Судя по разметке там какой-то детект XML срабатывает или что…

Не ломает:

static void enable_usart(void)
{
    uint32_t rcc_base_address = 0x40021000;
    uint32_t rcc_apb2enr_address = rcc_base_address + 0x18;
    uint32_t rcc_apb2enr_iopben = 1 << 3;
    uint32_t rcc_apb1enr_address = rcc_base_address + 0x1c;
    uint32_t rcc_apb1enr_usart3en = 1 << 18;
    uint32_t gpiob_base_address = 0x40010c00;
    uint32_t gpiob_crh_address = gpiob_base_address + 0x04;
    uint32_t gpiox_crh_mode10_0 = 1 << 8;

Ломает:

static void enable_usart(void)
{
    uint32_t rcc_base_address = 0x40021000;
    uint32_t rcc_apb2enr_address = rcc_base_address + 0x18;
    uint32_t rcc_apb2enr_iopben = 1 << 3;
    uint32_t rcc_apb1enr_address = rcc_base_address + 0x1c;
    uint32_t rcc_apb1enr_usart3en = 1 << 18;
    uint32_t gpiob_base_address = 0x40010c00;
    uint32_t gpiob_crh_address = gpiob_base_address + 0x04;
    uint32_t gpiox_crh_mode10_0 = 1 << 8;

 ,

vbr
()

Как правильно прокинуть IP?

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

Хочется запускать этот сервис на другом компьютере и перенаправлять входящие и исходящие подключения соответствующим образом. Также хочется минимизировать настройки iptables и подобного и обойтись userspace-софтом.

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

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

В качестве альтернативы видится поднятие специализированного прокси-сервера на удалённом компьютере, а также http reverse proxy (вроде nginx) на удалённом компьютере. Этот вариант кажется более «продакшн», но несёт с собой уйму дополнительных усилий по управлению всем этим добром, включая безопасность, которая в ssh обеспечивается автоматически.

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

 ,

vbr
()

STM32 с нуля (жж)

Я тут в очередной раз пытаюсь освоить программирование микроконтролеров. Захотелось написать такой полу-ЖЖ, полу-туториал (как говорится - хочешь разобраться в чём-то, объясни это другим). Может кто почерпнёт или подскажет чего полезного.

Если интерес будет, буду продолжать.

Итак осваиваем STM32 не как нормальные люди.

Примерный план:

  1. Подключить его к компьютеру и убедиться, что там что-то происходит. Использовать будем st-util и gdb.

  2. Написать простейшую программу на ассемблере, которая в цикле прибавляет регистр, скомпилировать из неё прошивку, залить на плату и пронаблюдать её работу. Использовать будем binutils и st-flash.

  3. Поморгать диодом (на ассемблере же).

  4. Переписать осмысленный код на С (дальше всё на С).

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

  6. Сказать внешнему миру «Hello world» через UART.

  7. Переписать «Hello world» с помощью CMSIS, уже с пониманием того, что там происходит.

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

Сразу скажу, что в процессе будет использовано достаточно много инструментов вроде make, ld, gdb, as, gcc и тд, по каждому из них можно книги писать (и пишут). Поэтому, конечно, углубляться в них я не буду, а напротив буду использовать в максимально примитивном виде.

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

 , ,

vbr
()

Архитектура системы обработки заказов

Имеется система, аналогия которой это обработка заказов в магазине или обработка запросов в система типа jira. Некоторыми образами в систему попадает сущность, пусть будет «заказ». Объём - тысячи в день. Далее эта сущность проходит через несколько статусов. Сейчас - чуть больше 10, но число их потихоньку растёт. К примеру после того, как сущность создана, делается запрос в другую систему. Если запрос вернул данные, то данные присоединяются к сущности и переходит в следующий статус. Далее идёт запрос в другой сервис и с сущностью работают там. Там свои статусы. Какие-то переходы это просто запрос в сервис, какие-то переходы это ожидание действий пользователя (может быть до месяца). Переходы могут добавлять данные к сущности, как в примере выше. В конце концов сущность либо архивируется с успехом или по таймауту.

Всё, что выше, это абстрактное описание того, как это всё работает.

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

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

Что сейчас плохо:

  1. У всего этого нет никакой формы. По сути система выросла исторически, из простой и понятной в некоего монстра. Алгоритмы перехода между статусами мало кто понимает.

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

  3. Логи. Все логи ведутся ну тупо в лог файлах. Текущее состояние можно посмотреть в базе, истории состояний нет. Проблемы решаются очень долго - надо долго грепать логи (а их очень много, гигабайты в день), копаться в базе, курить сорсы. В общем случае в логах, базах и сорсах нескольких сервисов. От системы хочется, чтобы была возможность найти сущность, посмотреть её историю, в идеале вообще посмотреть - какие запросы делались и какие ответы получались в определённые моменты времени. В общем чтобы суппорт писал «по юзеру иванов не отрабатывается заказ», ты шёл в дашборд, находил «user.name=иванов» его заказ, сразу видел, что он в таком-то статусе, сделал 3 попытки на такой-то сервис, получил такие-то ответы. В общем как-то так.

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

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

Если бы я это делал, я бы сделал как-то так:

  • Есть сущность
  • У неё есть статус
  • К сущности прикрепляются произвольные данные по ключ-значение
  • Частью статуса может служить выражение вида ключ == значение и тд. Ну чтобы не делать комбинаторный взрыв из статусов. Хотя тут спорный момент, может это и не надо.
  • Куча сервисов, которые обрабатывают изменения статусов.
  • Сервис триггерится либо по изменению статуса, либо по внешнему вызову. С внешним вызовом надо подумать, пока чёткого понимания нет.

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

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

У меня давным давно был опыт работы с Java фреймворком, который работал с BPMN. Честно говоря я не смог вспомнить его название, наверное это был jbpm. Кажется, что этот фреймворк решал похожую задачу. Там в эклипсе рисовали workflow эдакой блок-схемой, в каждом узле прописывали логику работы. Честно говоря опыт был крайне отрицательный, система была максимально геморройна для работы с ней. Но допускаю, что это была проблема конкретной реализации или старой версии. Поэтому первый кандидат, который я рассматриваю, это фреймворки с BPMN подходом.

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

Попытавшись поискать информацию по этой теме я часто встреваю упоминание некоего apache airflow и очень похожих на него продуктов. У меня всё же ощущение, что это похожее, но не то.

Также очень интригующий проект это temporal.io. Я его пока не осилил, он кажется очень непростым и нужно найти время, чтобы понять, что это такое. Но буду благодарен, если кто-то уже его использовал и скажет - то ли это?

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

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

 ,

vbr
()

Поставил RHEL на ноутбук, вроде работает

Asus ExpertBook B9400, графика интел. Ранее на нём крутилась федора.

Поставил RHEL 9.2, при установке выбрал workstation. Вифи работает, внешний монитор работает, звук работает, suspend работает. Вроде wayland запускается. В целом мне понравилось. В отличие от федоры кажется нет всякого снап-хлама, шопов и прочей новомодной галиматьи. Пока с отрицательными моментами не столкнулся. Установка прошла гладко, инсталлятор такой же, как в федоре, установил с шифрованием диска. Ещё из приятного - разбивает диск по феншую, со свопом, без всякого zram и подобной галиматьи.

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

Использую developer лицензию. Предполагаю, что можно поставить Oracle Linux и получить то же самое без суеты с лицензиями, но не пробовал.

 

vbr
()

Есть ли рабочий рецепт автообновления дебиана?

Есть сервачок, хочу, чтобы он по ночам ставил апдейты и ребутался при необходимости. Пытался разобраться, но там чёрт ногу сломит, 50 скриптов, один другого вызывает, такое ощущение, что проще засунуть apt-get update && apt-get upgrade && test -e /var/run/reboot-required && reboot в какой-нибудь /etc/cron.daily/ (а ещё лучше в systemd timer).

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

 ,

vbr
()

Postgres в контейнере с ограничением по памяти

Помогите найти внятную информацию, как настроить постгрес для работы в контейнере, чтобы укладывался в целевые показатели по ограничению памяти. К примеру сейчас запустил постгрес, он скушал 90 МБ. Далее в течение нескольких дней, исходя из опыта, его потребление вырастет примерно до 2 GB. При этом он вообще-то и сейчас нормально работает и было бы неплохо его ограничить, скажем, 100 МБ. Но если я просто поставлю лимит, то его грохнет OOM Killer через несколько часов.

В конфиге я вижу следующее (значения не по умолчанию):

listen_addresses = '*'
max_connections = 1000			# (change requires restart)
shared_buffers = 128MB			# min 128kB
dynamic_shared_memory_type = posix	# the default is usually the first option
max_wal_size = 1GB
min_wal_size = 80MB

Число соединений к базе со временем не растёт, с ней работает один сервис через одно соединение.

Насколько я понял, потребляется 128 MB на весь сервер + work_mem (4MB) на каждое соединение + temp_buffers (8 MB) иногда. Ещё может быть maintenance_work_mem (64 MB). Откуда тут гигабайты набегают - непонятно.

 ,

vbr
()

Фич реквест

Добавьте в профиль два поля: CSS URL и Script URL. Если пользователь их заполняет, то ему в страницу добавляется <link rel=stylesheet href="${css_url}"> и <script src="${script_url}"></script>.

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

 ,

vbr
()

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

https://www.securitylab.ru/news/540852.php

В 2022 году обвиняемый, будучи администратором информационной безопасности на предприятии, подключил свой рабочий компьютер к интернету и скачал из открытых источников программное обеспечение FreeRADIUS, которое он установил на сервере системы контроля доступа Cisco Secure ACS. Эта система была использована для организации безопасного доступа к информационным ресурсам предприятия, в том числе к объектам критической информационной инфраструктуры (КИИ).

Обвиняемый утверждает, что он действовал в интересах работодателя, так как система Cisco Secure ACS была устаревшей и дорогостоящей в обслуживании. Он заявляет, что он сэкономил предприятию почти 2,5 миллиона рублей за лицензию и поддержку программного обеспечения. Он также уверяет, что он предпринял все необходимые меры безопасности при подключении к интернету и использовании бесплатного ПО.

Начальник обвиняемого дал ему задание найти замену системе Cisco Secure ACS.

На мой взгляд всем айтишникам, имеющим отношение к госорганам, стоит искать новую работу. Система сошла с ума.

 

vbr
()

Что будет, если сбросить МРТ на врага?

Как я понимаю, МРТ это катушка из сверхпроводника, залитая охладителем, который поддерживает температуру сверхпроводимости. При этом в эту катушку можно «закачать» довольно много энергии (но не бесконечно много, у сверхпроводника есть пределы тока, после которых он потеряет сверхпроводящие свойства).

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

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

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

У NbN максимальная плотность (?) тока 5e7 A/см2. Т.е. если я правильно понял, то в провод площадью в квадратный сантиметр можно накачать ток в 50 млн амперов. Иными словами через сечение провода проходит 50 млн Кл/с. Как отсюда можно посчитать, сколько энергии выделится при переходе этого тока в тепло - я не осилил, буду благодарен, если кто-то подскажет.

В общем интересно - насколько такая бомба бахнет, в сравнение с традиционными вариантами? Понятно, что ядерная мощней, зато тут всё экологично. Хотя про воронки на месте больниц, где выходили из строя МРТ аппараты, я не слыхал, но может там недостаточно сильно накачивали катушки?

 сверхпроводимость,

vbr
()

Теряются пакеты

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

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

Вообще сервер это нода кубернетеса.

Пакеты теряются пачками примерно раз в 30-40 секунд. То работают, то теряются. Вот типичная картина:

64 bytes from 10.160.3.160: icmp_seq=1 ttl=64 time=0.343 ms
64 bytes from 10.160.3.160: icmp_seq=2 ttl=64 time=0.338 ms
64 bytes from 10.160.3.160: icmp_seq=3 ttl=64 time=0.261 ms
64 bytes from 10.160.3.160: icmp_seq=4 ttl=64 time=0.252 ms
64 bytes from 10.160.3.160: icmp_seq=5 ttl=64 time=0.265 ms
64 bytes from 10.160.3.160: icmp_seq=6 ttl=64 time=0.251 ms
...
64 bytes from 10.160.3.160: icmp_seq=24 ttl=64 time=0.241 ms
64 bytes from 10.160.3.160: icmp_seq=25 ttl=64 time=1.76 ms
64 bytes from 10.160.3.160: icmp_seq=26 ttl=64 time=0.252 ms
64 bytes from 10.160.3.160: icmp_seq=30 ttl=64 time=2318 ms
64 bytes from 10.160.3.160: icmp_seq=31 ttl=64 time=1294 ms
64 bytes from 10.160.3.160: icmp_seq=32 ttl=64 time=270 ms
64 bytes from 10.160.3.160: icmp_seq=33 ttl=64 time=0.249 ms
64 bytes from 10.160.3.160: icmp_seq=34 ttl=64 time=0.260 ms
...
64 bytes from 10.160.3.160: icmp_seq=65 ttl=64 time=0.245 ms
64 bytes from 10.160.3.160: icmp_seq=66 ttl=64 time=0.235 ms
64 bytes from 10.160.3.160: icmp_seq=67 ttl=64 time=0.234 ms
64 bytes from 10.160.3.160: icmp_seq=72 ttl=64 time=341 ms
64 bytes from 10.160.3.160: icmp_seq=73 ttl=64 time=6.38 ms
64 bytes from 10.160.3.160: icmp_seq=74 ttl=64 time=11.7 ms
64 bytes from 10.160.3.160: icmp_seq=75 ttl=64 time=12.8 ms
64 bytes from 10.160.3.160: icmp_seq=76 ttl=64 time=13.9 ms
64 bytes from 10.160.3.160: icmp_seq=77 ttl=64 time=12.8 ms
64 bytes from 10.160.3.160: icmp_seq=78 ttl=64 time=10.9 ms
64 bytes from 10.160.3.160: icmp_seq=79 ttl=64 time=0.266 ms
64 bytes from 10.160.3.160: icmp_seq=80 ttl=64 time=0.250 ms
...
64 bytes from 10.160.3.160: icmp_seq=106 ttl=64 time=0.280 ms
64 bytes from 10.160.3.160: icmp_seq=107 ttl=64 time=0.249 ms
64 bytes from 10.160.3.160: icmp_seq=111 ttl=64 time=1600 ms
64 bytes from 10.160.3.160: icmp_seq=112 ttl=64 time=576 ms
64 bytes from 10.160.3.160: icmp_seq=113 ttl=64 time=0.270 ms
64 bytes from 10.160.3.160: icmp_seq=114 ttl=64 time=0.267 ms
...
64 bytes from 10.160.3.160: icmp_seq=142 ttl=64 time=10.9 ms
64 bytes from 10.160.3.160: icmp_seq=146 ttl=64 time=811 ms
64 bytes from 10.160.3.160: icmp_seq=147 ttl=64 time=18.6 ms
64 bytes from 10.160.3.160: icmp_seq=148 ttl=64 time=11.9 ms
...
64 bytes from 10.160.3.160: icmp_seq=187 ttl=64 time=4.23 ms
64 bytes from 10.160.3.160: icmp_seq=188 ttl=64 time=0.250 ms
64 bytes from 10.160.3.160: icmp_seq=192 ttl=64 time=1051 ms
64 bytes from 10.160.3.160: icmp_seq=193 ttl=64 time=27.0 ms
64 bytes from 10.160.3.160: icmp_seq=194 ttl=64 time=13.4 ms

Иногда время отклика повышается до 10 мс. Вроде бы это от скачкообразного роста нагрузки. Периодически запускается около 20 процессов, которые потребляют весь CPU, видимо это и влияет на пинг, с этим понятно и «претензий нет». Но вот потери пакетов - это не понятно.

Через iftop смотрел - скачкообразного роста трафика в этот момент не наблюдается, сетевой интерфейс не перегружен.

Куда можно копать? Хотелось бы разобраться.

 ,

vbr
()

Язык для трансляции на другие языки

Есть ряд алгоритмов над массивами float64 чисел. Эти алгоритмы нужно применять в нескольких проектах на разных языках: JS, Go, Java. Копипастить не очень хочется. Также очень не хочется иметь нетривиальный рантайм.

Пока текущий вариант: написать алгоритмы на С. Для JS скомпилить в wasm, для остального штатными средствами.

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

Нет ли такого в природе? Как искать не придумал.

 transpiler

vbr
()

А расскажите про OpenSUSE

Всегда SUSE проходила мимо меня, а тут мне подсказали, что OpenSUSE Leap это тот же SLES с опциональными доп пакетами.

Выходит, если хочется энтерпрайзной стабильности нахаляву, то это хороший вариант?

 ,

vbr
()

Кто пробовал graphql над базой вместо бэкэнда?

Тут про прикольный протокол узнал, graphql называется. Заменяет REST. Почитал про него, пока всё нравится. Хорош в том числе тем, что есть автоматические бэкэнды, в частности hasura (кстати на хаскеле написана) - натравливаешь её на базу, она сама всё делает.

Бэкэндеров можно увольнять? Пускай фронты на этом graphql запросы свои фигачат прямо в базу и всё. Где подвох?

 , , til

vbr
()

От перфекционизма больше вреда или пользы?

Я вот тут пошёл переименовывать проект frontend на front-end, т.к. это более грамотно с английской точки зрения. И вот думаю - понятно, что оно никому кроме меня не надо, понятно, что на это какое-то время потратится, но с другой стороны если вообще игнорировать всё, скатится же всё в помойку. Или не скатится? Я-то это делаю, чтобы своих тараканов кормить, я иначе не могу, но вообще с объективной точки зрения как считаете - как лучше? Не конкретно по этому вопросу, тут я сам понимаю, что это ерунда, а так, в целом, в комплексе.

 ,

vbr
()

Как правильно выбрать uid для контейнера?

В большинстве образов не прописан uid. Соответственно процесс работает от рута. Для дополнительной безопасности требуется запускать контейнер от непривилегированного пользователя.

В связи с чем у меня вопросы:

  1. К примеру в образе в /etc/passwd нет пользователя с uid=1000. Но я запускаю от этого uid. Что может пойти не так?

  2. Во всех образах (которые я видел) есть пользователь вроде nobody 65534. Кажется, что более безопасно запускать от такого пользователя. Как минимум - у него /home прописан, хоть и прав на этот home нет, но интуитивно кажется, что меньше шансов напороться на неожиданное поведение программы.

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

 

vbr
()

Мои мысли про kubernetes

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

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

Кратко что это вообще такое

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

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

  2. Позволяет создавать и запускать контейнеры. Сильно похоже на docker-compose, но k8s позволяет не указывать конкретный компьютер, на котором будет запущен контейнер, а сам его выбирает.

  3. Обеспечивает виртуальную сеть между всеми контейнерами в пределах кластера, обеспечивает т.н. service discovery, а также обеспечивает балансировку нагрузки междду сервисами внутри этой виртуальной сети. Т.е. я могу во-первых в своей программе по днс-имени postgres-1 узнат IP-адрес первого контейнера с постгресом, а во-вторых по днс-имени postgres-ro получить дважды виртуальный IP-адрес, при соединении на который моё соединение уйдёт на случайный инстанс постгреса.

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

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

На самом деле современный k8s работает не поверх докера, а поверх легковесной абстракции CRI и её реализации обычно в виде containerd, но это частности

Кому это надо и какие альтернативы

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

Альтернативы я знаю следующие:

Hashicorp Nomad. Штука похожая на k8s, но гораздо менее распространённая. По слухам настраивать гораздо проще. Сам не пробовал. Я человек мейнстрима и выбираю то, что выбирает большинство.

Docker Swarm. В принципе очень похоже на следующий шаг после docker compose. Если вам перестало хватать одного сервера, на котором всё было через docker compose, а времени/желания изучать полностью новую платформу у вас нет, наверное это логичный шаг. Его я сам тоже не пробовал.

Проприетарные облачные решения. У всех крупных вендоров они есть. К примеру AWS Fargate. Главный минус: ваше приложение будет прибито гвоздями к этому вендору. Съехать с него малой кровью не получится.

Ценность kubernetes вижу в следующем:

  1. Независимость от вендора. У каждого облака есть managed kubernetes. И хотя детали у них отличаются, но всё же сам kubernetes один и тот же. Переехать с одного облака на другое не намного сложней, чем переехать с Debian на RHEL.

  2. Опция селф-хоста. Если ни одно облако не нравится, всегда есть опция купить ящик с SuperMicro и поставить всё туда.

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

Как это использовать

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

Если своими силами поднимать кластер, надо понимать, что для кластера имеются следующие требования:

  1. Кластеру нужен балансировщик нагрузки. Это когда у вас есть публичный IP-адрес, и N адресов. И соединения, приходящие на этот публичный адрес будут равномерно распределяться на эти N адресов. Балансировщик нагрузки должен мониторить доступность клиентов и вовремя включать/выключать их.

  2. Кластеру нужно сетевое хранилище. Это когда вы можете какой-то сетевой диск подключить к любому (одному) компьютеру и потом в линуксе он должен появиться, как /dev/sdc.

Первый пункт можно сделать самому через haproxy. Но не очень просто, если делать по уму (отказоустойчиво). Ну крутые дядьки, наверное, чем всякие там cisco такое могут делать вообще уровнем ниже, с резервированием на уровне проводов. Впрочем у них и грохается всё круто.

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

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

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

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

Ещё с сетевыми дисками важно, чтобы был CSI-драйвер для них. Для OpenStack такой есть. Т.е. kubernetes должен этому драйверу отдавать команду «подключи мне диск pvc-7672ffed-9ddc-4df4-affd-a717a1c11c79 на сервер 10.160.3.160» а драйвер должен отвечать «смонтировано в /dev/sdg».

Для своего кластера есть следующие подходы:

  1. kubeadm. Это набор софта от разработчиков kubernetes, который устанавливает и обновляет компоненты кластера. Я использую этот подход. Под низом стоит обычный линукс. У меня это debian minimal. Проблем с ним я не испытывал. Вообще народ обычно убунту использует, меня от неё воротит. По идее можно и на центоси, есть и более экзотичные варианты вроде CoreOS, я не вижу смысла тут использовать что-то необычное.

  2. Talos Linux. Это офигенная штука: ядро линукса плюс необходимый набор софта плюс сам кубернетес. Это всё идёт как один ISO и грузится в память. Ему даже диск не нужен. И сразу работает. Короче это по сути kubernetes как ОС. Я слишком поздно про него узнал, вероятно я бы его предпочёл. Надо понимать, что штука относительно новая и экзотичная, но я от него в восторге. По крайней мере в концептуальном восторге, может на практике вылезут нюансы.

  3. kubespray это огромная куча ansible скриптов, которые обещают, что за тебя всё сделают и поставят. Сам не пробовал, меня такая концепция не устраивает. Если я и буду пользоваться кучей ansible скриптов, то только теми, которые пишу сам. Туда же дистрибутив от Flant. Есть, наверное, и менее популярные решения.

  4. Kubernetes the hard way. Это когда ты руками всё настраиваешь сам, ставишь каждый компонент и тд. В целом ничего сверхъестественного тут нет, весь kubernetes это несколько сервеных программ плюс кучка настроек для них вроде своего УЦ с сертификатами и прочим. Но это ненужное усложнение и оправдано только для изучения потрохов. Сам я его не делал и страданий от этого не испытываю. В общем что-то вроде Linux From Scratch.

Управляемые решения я сам не использовал. В целом они решают некоторые проблемы и добавляют свои. Самый главный плюс управляемого решения: хостер будет сам управлять серверами. К примеру при росте нагрузки хостер сам создаст дополнительные серверы, установит туда k8s и добавит их в кластер. При снижении нагрузки он эти серверы выведет из кластера и уничтожит. Это называется node autoscaling. В моём кластере такого нет. В принципе это можно и самому сварганить, если снизу инфраструктура с каким-то API, которая позволяет создавать и удалять серверы. Но это нетривиально и требует программирования.

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

Неочевидные преимущества Kubernetes

Первое преимущество Kubernetes похоже на преимущество докера, которое я не сразу осознал. В докере помимо технологии есть ещё и коммьюнити. Это тысячи людей, которые собирают готовые пакеты. Если мне нужен postgres или wordpress или ещё что угодно, скорей всего это кто-то уже собрал. И даже если я решу собирать свой образ, я как минимум смогу посмотреть на чужие докерфайлы, а скорей всего мне хватит чужих. Это экономит много времени и сил. В кубернетесе похожая тема: для него создано куча софта и деплойментов, которые позволяют в пару строк деплоить в кластер довольно сложные конфигурации. К примеру прометей, собирающий метрики, локи, собирающий логи, ещё кучка вспомогательных агентов и графана, уже настроенная на отображение всего этого, ещё и с кучей готовых дашбордов, которые не стыдно директору показать. Почти для любого софта, который я хочу запустить в своём кластере, есть хельм от производителя, в котором всё уже прописано. И даже если я решу писать дескрипторы сам, я в этот хельм смогу посмотреть.

Второе преимущество Kubernetes на самом деле тоже похоже на преимущество докера, которое я тоже не сразу осознал. Это сближение программистов и админов. В классическом древнем подходе программист пишет код, сборщик собирает из этого кода артефакт, а деплоер устанавливает этот артефакт на сервер. Докер позволяет сблизить программиста и сборщика. Когда программист указывает в машинном виде все инструкции для сборки и все «входные» артефакты. Причём не в виде кучи непонятно каких скриптов, а в относительно стандартизованном виде. Вот Kubernetes с его ямлами делает похожую задачу и сближает программиста и деплоера. Когда ты можешь в своём софте написать в машинно-читаемом виде - какие volume-ы нужны твоему софту, какие конфиги, какие переменные окружения, какие порты твой софт выставляет и тд.

Третье преимущество в том, что есть некоторые уникальные софтины. К примеру я пускаю БД в кластере. БД управляется через оператора. Оператор это такая программа (которая тоже запущена в кластере) которая создаёт контейнеры с БД, настраивает их как надо и как бы следит за ними. К примеру я буквально несколькими строчками настроил запуск постгреса в двух копиях с периодическими бэкапами в S3 и постоянными бэкапами wal-логов туда же. В итоге имею high-available СУБД кластер с бэкапом и возможностью откатиться с гранулярностью в 5 минут. Руками такое настраивать я бы наверное несколько дней минимум потратил. Понятно, что если сломается, то в общем случае для починки придётся разбираться что там как устроено. Ну пока не ломалось. Может и не сломается.

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

Недостатки Kubernetes

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

  1. Требования к железу. Для полноценного высокодоступного кластера требуется три сервера по 4GB RAM и 2 CPU, которые будут использоваться исключительно для Kubernetes (мастера). Также на каждом рабочем сервере нужно зарезервировать примерно 20% оперативной памяти. Также Kubernetes до недавнего времени не работал со свапом, а с недавнего начал работать в экспериментальном виде, но про это никто не пишет и не знает. В общем можно считать, что свопа нет. Для крупных проектов эти требования не очень существенны, если же весь ваш проект это 2GB VPS за $5, то kubernetes вам не подойдёт. Нужно свой бюджет расширять хотя бы до 8GB за $20.

1.1. А ещё желательно иметь два кластера. Один тестовый, а один боевой. И тестировать свои эксперименты на тестовом. Лично у меня такой возможности нет, я работаю в компании, которая экономит на всём, и $300 в месяц на тестовый кластер это дораха. Поэтому я написал нужные terraform скрипты и прочее, что позволяет мне поднимать тестовый кластер за 15 минут, а потом опускать его. Но лучше не экономить на спичках и держать два одинаковых кластера.

  1. Требования к квалификации. Для того, кто с k8s не работал, там всё будет новое. И хотя ничего особенно сложного там нет, но объём знаний всё же существенный. В целом готовьтесь потратить несколько месяцев на изучение и работу с тестовым кластером. Не вздумайте сходу переводить прод на k8s, если он нужен кому-то кроме вашей мамы. Также надо понимать, что kubernetes очень плотно работает с линуксом. cgroups, iptables, ebpf - эти слова не должны вводить вас в ступор (ebpf меня в ступор вводят, в частности поэтому я отказался от cilium).

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

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

  1. В нём «из коробки» нет многого, что можно было бы ожидать от него. К примеру есть ингрессы (это описание входных точек для внешних сервисов), но ингресс-контролера нет, нужно выбирать и ставить, а их, между прочим, штук 15 разных. Да что там ингресс-контролер, там даже этой самой вышеописанной виртуальной сети нет, есть только некие интерфейсы, а реализацию, которая будет эту сеть «настраивать» - надо ставить самому (собственно это первое, что вы будете ставить в только что созданный кластер). Причём этих реализаций опять же штук 10 разных. И муки выбора - flannel, calico, а может модный cilium, а вот тут на реддите ещё про что-то писали, ааа, вот это при некотором складе характера может мучить. Меня мучает. Я боюсь сделать неверное решение. Если что, я выбрал ingress-nginx и calico для вышеописанных пунктов, как наиболее понятные и консервативные решения. Не жалею.

  2. Он провоцирует ставить и настраивать то, что вам в общем-то не особо и надо. Ну вот жили мы с докер-композом, проставляли реплики в конфиге руками и ладно. А тут вроде есть horizontal pod autoscaler, который будет в зависимости от нагрузки запускать больше или меньше реплик, круто же. А для него метрики нужны, надо ещё компонент для метрик поставить. А вот про istio прочитали, он вообще даёт возможность смотреть все запросы между сервисами, а-а-а, это же просто огонь. В общем вроде и не сказать, что это плохо, т.к. это всё даёт лишние возможности, но всё же тут важно не увлекаться. Может оно вам не так уж и надо, раз жили без этого. Каждая софтина это время на изучение документации, это постоянные затраты времени на чтение ченджлогов, обновления, обновления конфигов. А если это ещё и штука вроде istio, которая не сбоку-припёку, а влезает прям между вашими сервисами, то это ещё и потенциальная причина того, что всё сломается и вам придётся ковыряться в ихних кишках в самое неудачное время. Ну и ресурсы тоже каждая софтина требует, ага. Вроде и всё на го написано, вроде и не ресурсоёмко по большому счёту, но потихоньку набегают гигабайты…

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

  4. Кубернетес из коробки адски небезопасен. Легко создать под, в котором будет подмонтирован корень вашего сервера. И удалить там всё, азаза. При этом, конечно же, есть все возможности закручивать гайки сколько угодно, но это надо делать. Когда пишешь helm install, обычно оно ставится от cluster-admin и в общем случае может делать с кластером что угодно. Если у вас отдел девопсов, которые там каждый ямл обнюхают и будут это делать каждую неделю, ставя новую версию, ну классно. А если весь ваш девопёс это я, занимающийся этим, когда других задач нет, и джуниор, который сам всё поломает, только доступ дай, то не классно. Поэтому см. пункт выше про отдельный тестовый кластер.

  5. Гитопс. Гитопс это круто и здорово, но я так и не впечатлился. В общем не рекомендую. С одной стороны - да, весь ваш кластер должен лежать у вас в гите, а не в голове и при необходимости подниматься несколькими командами (или несколькими десятками команд, не принципиальная разница, у меня второй вариант). С другой стороны внедрять прям 100% гитопс, когда вам реально надо коммитить в гит, чтобы там что-то срабоатло, я долго пытался это делать на flux, я его неплохо изучил, но в итоге отказался. Опять же если у вас отдел девопсов, которые будут там друг друга ревьюить и мерджить, то наверное ок. Если вам нужно держать не один кластер, а сто кластеров, развернутых и обновляемых из одного репозитория, то конечно ок (хотя тогда вы сами меня учить будете, а не читать это). А если вас один-два человека, ну я решил, что оно не надо. У меня весь репозиторий это terraform-шняга, которая просто создаёт серверы, на этих серверах через cloud-init при создании ставится containerd, kubelet и прочая ерунда, потом я туда по ssh захожу и вбиваю kubeadm join и всё. Это инфраструктура. Второй репозиторий это во-первых кучка скриптов (в основном helm update, чтобы не запоминать это всё), во-вторых кучка kustomize-ов, которые уже ставят либо то, что в helm не обернули (или я не захотел этим пользоваться), либо, собственно, тот софт, ради которого весь этот кластер вообще существует.

  6. Ямлы-ямлы-ямлы-ямлы. Не, я не особо жалуюсь, но всё же в кубернетесе эти ямлы они как-то совсем уж беспонтовые. И дело не в формате, а в том, что они совсем не добавляют синтаксический сахар. Это не является чем-то адски страшным, но когда пишешь

ports:
  - name: http
    containerPort: 3100

вместо

ports:
  http: 3100

или вся эта копипаста

spec:
  selector:
    matchLabels:
      app: loki
  template:
    metadata:
      labels:
        app: loki
    spec:
      containers:

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

  1. Также из коробки поставленный через kubeadm кластер не стабилен и сервер легко роняется одним подом, который решил сожрать всю память (у меня сервер просто перестал отвечать, где там были все эти ваши оом киллеры, я не знаю). Это меня неприятно удивило. А чтобы сделать его стабильным, мне потребовалось потратить не один час на чтение документации и разного рода настройки (в основном резервирование памяти для кублета, системы и тд). Что мешает kubeadm-у прописывать лимиты самому, я не понимаю.

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

Поэтому high availability это все ваши сервисы, запущенные в двух копиях минимум. Иначе это eventual availability. Что тоже неплохо и лучше, чем unavailability.

Вышеописанные таймауты можно настроить, если что. Но, наверное, не нужно. Я не стал.

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

  1. Будьте готовы читать много кода на go, копаться в исходниках и issues. Ну может мне так повезло или у меня такой стиль решения проблем. Но такого, как в традиционном линуксе - когда почитал man iptables или IPTABLES HOWTO и нашёл ответы на все вопросы - тут часто не получается. Какая-то мелкая, но нужная софтинка. В доке ничего не понятно, приходится лезть в исходники и смотреть - что там на самом деле. Или гуглишь - ничего релевантного. Залазишь в гитхаб issues, ищешь там и, таки, находишь ответ на свой вопрос.

 ,

vbr
()

Как в Kubernetes кластере уменьшить число мастеров с 3 до 1?

Имеется кластер с одним мастером. Хочу пересоздать машину с мастером. Для этого надо добавить ещё 2 мастера, потом можно будет пересоздать. Но как потом уменьшить число мастеров с 3 до 1? Если просто два отключить, оно же подумает, что сеть сломалась и перейдёт в какой-то там аварийный режим. Есть штатная процедура для такой манипуляции?

 

vbr
()

Postfix: принимать почту из интернета на домен, с локалхоста на всё

Сейчас у меня стоит

myhostname = myhost.mydomain.com
mydomain = mydomain.com

mydestination = $myhostname localhost.$mydomain localhost $mydomain

Соответственно postfix принимает из интернета почту на все эти домены. Я хочу, чтобы из интернета он принимал почту только на mydomain.com. Но при этом, когда на локалхосте программы отправляют почту на root или root@myhost.mydomain.com или root@localhost и тд, то эта почта приходила соответствующему пользователю.

Как это настроить?

Или это норма и не надо это настраивать? ChatGPT меня убеждает, что это норма и чтобы я не морочил ему голову, но я сомневаюсь.

 ,

vbr
()

Как бы я сделал идеальный дистрибутив

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

  1. Сборка. Не скажу, что видел всё, но обычно берут исходники софтины с её билд-системой, к ней сверху прикручивают какие-то скрипты, которые вызывают ./configure и тд. Я бы сделал по-другому: берём, собственно, исходники. Выкидываем все билд скрипты и переводим всё на bazel. Считаю его лучшей системой сборки в мире, если есть время на его изучение. Понятно, что надо будет исходные билд-скрипты на самом деле не выкинуть, а изучить, определять нужные дефайны и тд. Сделать процесс перевода не одноразовым, а чем-то вроде скрипта, чтобы следующие версии уже автоматом собирать, а не повторять весь процесс.

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

bazel даст повторяемые сборки. Это важно. Т.е. вася и петя берут одни исходники и получают идентичные бинарники.

  1. Пакетов, как таковых, нет. Весь дистрибутив это что-то вроде debian-minimal. Т.е. ядро + systemd + libc + coreutils + кучка необходимых программ. Всё это идёт единым образом (можно представлять как tar-архив). Образ ОС абсолютно иммутабельный, не просто 644, не просто mount -o ro, а хотелось бы прям на уровне иммутабельной ФС вроде ISO. Чтобы его поменять вообще было бы сложно. Ещё для безопасности было бы неплохо там всё обложить контрольными суммами и подписями, чтобы ядро сразу выпадало в осадок, если на диске что-то поменялось.

  2. Каждая следующая версия выпускается кроме того хорошо оптимизированным бинарным diff-ом, что позволит типовым обновлениям быть крохотными, в районе нескольких десятков килобайтов. Обновления постараться сделать не требующими перезагрузки, но в то же время корректными (перезапускать демоны, если поменялась библиотека, через kexec перезапускать ядро). Кроме того сделать возможность очень легко откатиться на предыдущую версию, тоже без перезагрузки. Понятно, что речь идёт об обновлениях безопасности, когда особо ничего не меняется.

  3. Используются современные продвинутые файловые системы наподобие bcachefs/zfs/btrfs. Смысл в том, чтобы во-первых использовать дедупликацию, и обновления из пункта 3 не занимали кучу места, во-вторых чтобы максимально упростить откаты на предыдущие версии.

  4. Использовать максимально современные и легковесные подходы. Ядро грузить с UEFI, для сервисов systemd, networkd, минимум выбора, максимум интегрированности. Также использовать хорошие подходы к безопасности, ну про иммутабельный root уже упоминал, кроме этого запускать все сервисы по возможности в chroot или вообще отдельных ns, написать хорошие selinux правила. Т.к. базовая система имеет относительно небольшой размер, это не должно быть очень уж сложным.

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

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

 ,

vbr
()

RSS подписка на новые темы