commit -m "better"
3.21K subscribers
1.02K photos
147 videos
3 files
2.36K links
just random thoughts
Download Telegram
https://www.phoronix.com/scan.php?page=news_item&px=Linux-Remove-a.out

Linux убирает поддержку a.out, придется в gcc -o давать какие-то более осмысленные имена, если вы понимаете, о чем я.

———
https://llvm.discourse.group/

#LLVM съезжает с допотопных рассылок. С одной стороны - это хорошо, в почтовых архивах решительно невозможно было ориентироваться. С другой - это какая-то закрытая платформа, я там не нашел кнопки "скачать письма за 2021 год".

———
https://www.opennet.ru/opennews/art.shtml?num=56503
https://github.com/chrisdutz/blog/blob/main/plc4x/free-trial-expired.adoc #money

Еще одно эмоциональное подгорание на фоне отсутствия денег за OSS. Даже не знаю, что и сказать, на фоне того, что уже сказано и написано.

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

———
https://venam.nixers.net/blog/unix/2021/02/07/audio-stack.html

Неплохой текст про состояние аудио стека в Linux.

https://github.com/jackaudio/jack2

The activation system has been changed for a data flow model and lock-free programming techniques for graph access have been used to have a more dynamic and robust system.

Класс. А это пример lock-free технологий из jack2:

    while ((err = snd_pcm_resume(handle)) == -EAGAIN)
usleep(100); /* wait until the suspend flag is released */
if (err < 0) {
-

Слово usleep в кодовой базе встречается 50 раз.

При этом, jack все еще лучший звуковой сервер под Linux, все, как и 15 лет назад.

———
https://developers.redhat.com/articles/2022/01/12/prevent-trojan-source-attacks-gcc-12

Сначала создаем себе проблемы, потом героически их решаем. Не, так работы нам хватит навсегда.

Хотелось бы, конечно, флаг в компиляторах -fno-porridge -fascii-only-source, я более чем уверен, что есть сильная антикорреляция между тем, что человек использует эмодзи с какахой non-ascii symbols в коде, и тем, что его код может быть мне как-то полезен.
https://world.hey.com/dhh/i-won-t-let-you-pay-me-for-my-open-source-d7cf4568 #money #gnu #charity

Хороший, но странный, текст.

Мне зашла первая часть, где автор аргументирует, что #GPL и MIT(условно) ненужно рассматривать вместе, как EULA vs. (GPL, MIT), а нужно как EULA vs. GPL vs. MIT, потому что у Столлмана и Гейтса(условно) больше общего друг с другом, чем с MIT. И тот, и другой что-то хотят от вас взамен за свой код. Деньги или другой код - неважно.

But it felt like that exactly because there was no sword hanging over my head. Nobody telling me that this is what I ought or had to do. No one expecting me to do it. So it was an act of volition rather than one of duty. A truly authentic choice.

That to me is freedom.

Автор на это сморит с левых, социалистических позиций.

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

———
https://raphlinus.github.io/rust/gui/2019/06/21/smooth-resize-test.html

https://raphlinus.github.io/ui/graphics/2020/09/13/compositor-is-evil.html

https://thume.ca/2020/05/20/making-a-latency-tester/

https://lwn.net/Articles/814587/

Про некоторые проблемы современных графических стеков, с кучей интересных ссылок.

В целом, мне кажется, обсуждаемые проблемы и решения несколько надуманы, с повсеместным переходом на 120hz об этом можно будет забыть.

———
https://mesonbuild.com/Wrap-dependency-system-manual.html

Глубже погружаюсь в Meson, и, местами, оно мне перестает нравиться. Например, то, как там сделан vendoring - это жесть. Как отключить его из cli, я не понял, но зато прекрасно работает хак с удалением всех *.wrap файлов в сборочной директории, оно перестает ходить по http и git почем зря.

———
https://eli.thegreenplace.net/2013/07/09/library-order-in-static-linking

На неделе линкера я обещал написать текст про линкер, но не написал.

Зато нашел вот этот текст, там написано примерно то же самое, что хотел написать я:

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

* описан самый важный хак для разрешения циклических зависимостей

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

Дано: файл с полным логом сборки моей системы.

Надо: написать регулярку длиной до 4 символов, которая отфильтрует наиболее полезные записи(да, до четырех).
"UNIX is simple and coherent..." - Dennis Ritchie
"GNU's Not UNIX" - Richard Stallman

———
https://woodrush.github.io/blog/posts/2022-01-16-neural-networks-in-pure-lisp.html

Статья, конечно, не про нейронные сети, а про то, как сделать float, имея на руках структуру данных в 1 бит.

———
Full disclosure - я очень не люблю gstreamer. Его пилили какие-то сумасшедшие, которые решили, что граф обработки multimedia может свалиться в runtime, а не в момент его конструирования. Графы там сложные, падают почем зря. Ну и 15 лет назад библиотека была настолько нестабильна, что я чуть не поседел, пытаясь ей воспользоваться.

https://gstreamer.freedesktop.org/features/

Graph-based structure allows arbitrary pipeline construction

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

Based on GLib 2.0 object model for object-oriented design and inheritance

Хуже объектной модели #glib не бывает вообще ничего. Магия на препроцессоре, которая приводит к генерации исходников похлеще, чем в С++, шаг влево - вправо - расстрел на месте. Про 10 уровней indirection и про то, что все в куче - я вообще молчу(а потом удивляются, почему программы на GTK жрут памяти больше и работают медленнее, чем QT)

Compact core library of less than 500KB, about 65 K lines of code

pg@fedora:~/mix/store/vVPM7CFLUYaHJm8iL-lib-gstreamer-19/lib du
376 ./pkgconfig
97116 .

100 мегабайт, и сюда не входит mpeg/libav/ogg/etc

Multi-threaded pipelines are trivial and transparent to construct

Нет.

Clean, simple and stable API for both plugin and application developers

Знаете, кому и кобыла - невеста. Возможно, коллеги не видели clean and simple API.

Короче, если есть выбор - берите ffmpeg. К сожалению, WebKit использует gstreamer, поэтому пришлось повозиться.

———
https://www.da.vidbuchanan.co.uk/blog/webos-wampage.html

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

Взлом WebOS через кеш байткода в V8. long story short - имплантируем в кеш байткода проезд по памяти, и, благодаря этому, забираемся в потроха браузера.
commit -m "better"
Так, у нас сегодня задачка по бутстрапу, решения принимаются до завтрашнего вечера, данные в первом комментарии. Дано: файл с полным логом сборки моей системы. Надо: написать регулярку длиной до 4 символов, которая отфильтрует наиболее полезные записи(да…
И первое место занимают 2 регулярки!

* '0m' - 2 символа. Позволяет выгрепать все обозначенные цветом строки. Если автор сборочного скрипта не сумасшедший пользователь https://github.com/Textualize/rich, то это хороший источник информации. Используется знание того, как устроена rst ansi escape code.

* ': ' - 2 символа. Использует знание того, что всю типизированную информацию люди часто выводят в формате key: value. Находит ошибки, предупреждения, несработавшие configure опции, и так далее
https://www.opennet.ru/opennews/art.shtml?num=56518 #law #yeswecan #provider

Опять наезжают на youtube-dl. Надеюсь, Европа с ее continental law, с этими говнюками справится лучше.

Отмечу, что уже хорошо то, что идут в суд, а не в github. И провайдер молодцы - не отключают по первому требованию.

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

"Надо заметить: плеер из веб-интерфейса сильнее греет камень, нежели тот же mpv, получающий видеопоток через сабж (или его форки).
Пользователей у ютуба -- почти целая планета (минус китай).
Это значит, что ютуб серьёзно увеличивает человеческий углеродный след, что сильно влияет на изменение климата и всякое другое.

Поэтому почему ещё не подключены зелёные активисты с гретой тумберг, которые ратовали бы за запрет просмотра ютуба в браузерах или андройд-приложениях и требовали бы принудительного перехода ютуба на youtube-dl?"

———
https://cp4space.hatsya.com/2022/01/14/conway-conjecture-settled/

Тема огонь. И сам факт(что существуют принципиально неизменяемые(и вечные) объекты(то есть, если они есть во время T, то они должны были быть и во время T-1), это автоматически доказывает утверждение, что существуют non-glider-constructible объекты), и то, как он доказан(SAT).

А ведь еще лет 10 - 15 назад математики утверждали, что их-то ну никогда-никогда.

Короче, не текст, а полчаса истинного удовольствия.

———
https://github.com/leandromoreira/ffmpeg-libav-tutorial

Девочка Антон продолжает исследовать мир AV в Linux.

Скажите, а зумеры уже полностью захватили мир, и теперь даже сложные темы будут вот так, в картинках?

———
https://vlang.io/ #vlang

Я тут ищу язык, который:

* быстро собирается
* работает под все unix платформы
* нормально "бутстрепается"

Для того, чтобы писать на нем сборочные утилиты, которые будут выполняться на host системе во время сборки.

Python был бы неплох, но он просто люто, бешено тормозит в последние годы. Если я на нем пишу, скажем, враппер для clang(https://github.com/pg83/mix/blob/main/pkgs/lib/c++/std/mix.sh#L47, для исправления кривых опций от автора какой-нить системы сборки), то время сборки легко увеличивается в 2 раза.

V похож на Go, но более хорошо "бутстрепается".

———
https://www.phoronix.com/scan.php?page=news_item&px=Linux-5.17-Page-Table-Check
https://www.opennet.ru/opennews/art.shtml?num=56523

Все #хорошее в ядро идет из Google.

———
https://tass.ru/politika/13441081

Как вы уже понимаете/помните, "инфраструктурная площадка не может bla-bla-bla", но вот в этом случае даже я не хочу быть адвокатом дьявола.
https://www.opennet.ru/opennews/art.shtml?num=56525
https://nakst.gitlab.io/essence

"Система может работать на устаревшем оборудовании с менее чем 64 МБ ОЗУ и занимает около 30 МБ дискового пространства. Для экономии ресурсов выполняется только активное приложение, а все фоновые программы приостанавливаются."

Класс, а я-то думал, чего у автора шелла нет в поставке. А он там просто работать не может же - потому что две программы должны одновременно выполняться.

———
https://www.phoronix.com/scan.php?page=news_item&px=GCC-12-Enters-Stage-4

"One fundamental change made by GCC developers upon entering stage four development was the decision to rename all .c C source files comprising the GCC compiler to now using a .cc extension."

"Fundamental"

OK.jpg

———
http://matrixmultiplication.xyz/

В продолжении темы зумеров и картинок. Интересно, скоро на мехмате?

———
https://lemire.me/blog/2022/01/17/what-is-the-range-of-a-number-type/

Интерпретация #Lemire, конечно, приятнее.

Что я могу добавить, как человек, закончивший кафедру вычмата мехмата МГУ?

* Придумывать численно устойчивые алгоритмы с матрицами - это какая-то магия, я так и не научился

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

* Авторы работ по deep learning - шарлатаны. По крайней мере, когда они пытаются объяснить, что их алгоритм почему-то работает, апеллируя к тем или иным свойствам результата алгоритма на матрицах. Апеллировать к свойствам этих алгоритмов, особенно на какой-нить там 16-битной арифметике - ну такое. Лучше бы честно писали что-то типа "мы проверили 100500 разных вариантов, вот такие почему-то работают".
https://news.microsoft.com/2022/01/18/microsoft-to-acquire-activision-blizzard-to-bring-the-joy-and-community-of-gaming-to-everyone-across-every-device/

Чо, теперь Diablo только на Xbox будет?

———
https://habr.com/ru/news/t/646145/

50000 ноутов - это немало. Интересно, на какую часть дохода наше уважаемое минцифры решило нагнуть этих товарищей?

———
https://wiki.linuxfoundation.org/realtime/rtl/blog#the_real-time_endgame_is_moving_quickly_now

Оказывается, недавно в ядро вмержили патч про realtime, с 20-летней историей.

Текст про текущее состояние RT в Linux. Я все еще не отчаиваюсь победить лагающий браузер.

А вот что пишут коллеги про тестирование RT в ядре:

https://lwn.net/Articles/830660/

Ideally, each new stable kernel would be downloaded automatically, built, and run through a series of realtime-specific tests.

Все же понимают, в чем тут facepalm? *

———
https://www.phoronix.com/scan.php?page=news_item&px=Qt-Digital-Advertising-1.0

"Qt Launches Digital Advertising Platform To Integrate Ads Into App UIs"

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

———
Одной строкой:

https://github.com/zevlg/telega.el - клиент телеги для emacs. Жалко, что я использую другую OS.

https://krebsonsecurity.com/2022/01/norton-360-now-comes-with-a-cryptominer/comment-page-1/ - а чо, тоже способ монетизации.

https://www.nginx.com/blog/do-svidaniya-igor-thank-you-for-nginx/ - Игорь всё.

* - берем стабильное ядро, и проверяем, есть ли в нем баги. В стабильном ядре. После релиза. Сначала делаем релиз стабильного ядра, потом проверяем, работает ли в нем RT.
https://www.phoronix.com/scan.php?page=news_item&px=LibreOffice-WASM-2022 #wasm #WASI

Писал про WASM в Firefox. Мне кажется, что за WASM, конечно, большое будущее(а все же помнят, что я мастер предсказывать уже произошедшие события, да?):

* Оно достаточно вменяемое в среднем. Без встроенного GC там, например.

* Насколько я понял, WASM bytecode сохраняет более полный граф выполнения программы(условно говоря, не goto label, а if - then - else) в сериализованном виде. Я недавно читал статью(к сожалению не сохранил, если вдруг есть под рукой - скиньте, pls), что такая структура позволяет процессору лучше оптимизировать выполнение кода.

* Ну и самая мякотка - легион JS-разрабов, которые затащут этот WASM везде. И, знаете ли, в какой-то момент может показаться очень заманчивым начать исполнять браузер и Electron на реальном железе.

Короче, вот вам прогноз - на горизонте в 15 лет мы увидим соревнование WASM и RISC-V, в реальном железе(я вот только не очень понял, насколько WASM memory safe по дефолту, поэтому в реальном железе может быть немного другой вариант).

Хотя, конечно, я часто бываю черезчур оптимистичным.

https://medium.com/@losfair/a-comparison-between-webassembly-and-risc-v-e8fb9d37e6cc

То, что WASM заточено на JIT, IMHO, как раз будет только в плюс, потому что процессоры все больше и больше становятся похожи на hi-perf VM.

Почему это не произошло с Java, или на мобильных платформах уже? А все заметили, что сейчас случился ренессанс процессоростроения, и процы в железе под разные задачи не отливает разве что ленивый?

———
Я иногда люблю чем-нить упороться, а теперь у меня для этого есть новая игрушка - мой Mix.

Я его строю не только как пакетный менеджер, но и как (мета) систему сборки, построенную по enterprise лекалам. Например: #ix #gold #dev_shell #ix_run

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

То есть, я могу построить всю программу целиком, включая библиотеки, с такими фичами, как:

* санитайзеры
* debug/release
* разные optimization levels

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

Для всяких bazel/buck/ya/etc это очевидные свойства, но для OSS систем это достаточно свежая вещь.

Короче, мне всегда было интересно, что будет, если там разные программы пособирать с С++ garbage collector в качестве аллокатора.

* Quake работает like a charm, без лагов, памяти жрет раза в полтора больше.
* Браузер не запускается, какие-то проблемы в выделении drm буффера.

Кстати, gc не такая уж и глупость, оно помогает для того, чтобы заставить работать какую-нить бажную программу с use after free, а у меня такие есть(например, M4 некоторых версий).
Дополню тему про кросс-компиляцию и про сборку с разными флагами.

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

Пример: https://github.com/pg83/mix/blob/main/pkgs/bld/compiler/mix.sh#L4

Что тут происходит? Я говорю, что цель bld/compiler(мета-цель для указания зависимости от компилятора c++) собирается с thin lto + icf(== fast), и по стандарту С++14. То есть, я с этими опциями собираю все поддерево библиотек, нужных для bin/clang/13.

Еще пример - https://github.com/pg83/mix/blob/main/pkgs/mix/template/std/stdenv.sh#L10

Собираем мега-оптимизированный распаковщик, так как распаковка архивов с исходниками занимает существенное время.

Библиотеки, собранные с этими флагами для этих целей, не конфликтуют друг с другом и с библиотеками для других целей(без этих флагов).

Еще отмечу, что, если собрать бинарник с -O0 -g -fno-pic(блин, божественный ассемблер без GOT/PLT говна!), и чтобы в fs лежали все исходники, то даже дебажить с gdb становится приятно. Для корпоративных систем сборки это само собой разумеющееся, для OSS это довольно непривычный опыт.

———
Я ненавижу naming problem, и трачу на нее непозволительно много времени.

В Mix я запустил эксперимент - программы раскладывал в какую-то иерархию, а все библиотеки складывал в lib/.

Эксперимент закончен, дерево программ я расформировал, переложил все плоским списком в bin/: https://github.com/pg83/mix/tree/main/pkgs/bin

Больше не надо задумываться, куда положить gcc(lang? gnu?), или wget(net? gnu?), или как там расклассифицировать toybox.

Плохая иерархия - хуже отсутствия иерархии. Плохая иерархия ведет тебя по ложному пути, а потом обманывает тебя(например, говорит, что в lang/ нет gcc, и ты думаешь, что gcc вообще нет в иерархии).

Удобно было бы раскладывать папочки по списку тегов, но fs так не умеет.

Замечу, что список плоский только в среднем, немного ad hoc иерархии там есть, но она не вымученная, и только помогает.

Nix имеет иерархию, brew, например, нет. В brew искать пакеты мне удобнее, хотя их там много тысяч штук.
👍1
Короче, я сделал, можно поздравлять(не, реально!)

Mix, на голом железе, real 3D accel, network, no systemd, no .so, no /lib/.
🎉18🔥16
Хотел бы я написать, что переезд под полное управление моим пакетным менеджером заработало like a charm, но увы.

* у меня нет /lib, /usr, и прочей лабуды. При попытке скомпилировать gcc(для того, чтобы собрать ведро, clang я тут пока не доверяю), gcc на голубом глазу мне заявил, что у меня в системе не хватает папки /usr/include, и он не может запустить свой процесс fixincludes.

Вот хороший текст про это от автора musl, почитайте. https://ewontfix.com/12/

Вот фикс от arch - https://github.com/archlinux/svntogit-packages/blob/packages/gcc/trunk/PKGBUILD#L57

Мне такой не подошел, потому что у меня ломается раньше, так как папки /usr нет вообще. Зато я нашел configure опцию! https://github.com/pg83/mix/blob/main/pkgs/bin/gcc/11/mix.sh#L50

Кстати, давно хотел рассказать про такой fun fact про configure. #autohell позволяет в одном дереве исходников разместить несколько проектов с ./configure скриптами. Тогда верхнеуровневый configure будет проксировать все неизвестные опции вниз, и узнать, какие опции есть, решительно невозможно.

Так вот, fun fact - у проектов gcc, gdb, binutils - общий(ну, почти одинаковый, немного разъезжается) верхнеуровневый configure, c опциями от gcc. Это, конечно, добавляет понимания, как эти проекты собирать.

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

1) Все случаи - когда cmake проект не может найти meson проект.
2) Во всех случаях установка meson проекта была несколько странной - вместо ${out}/include/blah.h было ${out}/include/${ver}/blah.h

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

Тут до меня дошло, что я забыл к cmake проектам дописать зависимость от pkg-config, и ранее использовался системный. После этого все прошло like a charm, герметичная сборка рулит.

Я мог бы все контейнеризовать, но не хочу, потому что под mac это сложно, а я хочу и для него обеспечивать герметичность.
👍8
https://blog.ffwll.ch/2018/08/no-2d-in-drm.html

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

Вот, объяснение, можно сказать, от самих разработчиков dri. Пишут, что 2D сложнее, чем 3D. Интересно, что он этим имеет в виду? Конечно нет, не сложнее. Просто не стандартизировано, в отличие от. Стандартизировать ни у кого желания нет, потому что профит по сравнению с уже существуюшим 3D не то чтобы большой.

———
https://wingolog.org/archives/2021/12/13/webassembly-the-new-kubernetes

Писал про #ebpf + #io_uring, и, буквально, на днях, про #wasm. Короче, идея, что нужна более легкая виртуализация, витает в облаках.

———
https://www.supergoodcode.com/zink-4ever/

Важная для меня тема :) Я в Mix решил строить графический стек в виде #zink + vulkan, чтобы 2 раза не вставать(и чтобы без #LLVM в драйверах*). И оказывается, не прогадал. Уже писал, что zink по перфу догнал классический OpenGL, а теперь просто прекрасное - #zink - самый фичастый из OpenGL в Mesa. Короче, старый стек уже можно закапывать.

Чувак работает на Valve.

Все #хорошее в OSS делают корпорации, когда это не основной их продукт. Гугл продает рекламу, а не браузер, FB, знаете ли, не продает системы сборки, и так далее. А вот результат у mongo и elastic немного хуже. Вот и Valve продает не OpenGL, а игры.

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

*: кстати, в копилку про "не умеют договариваться" и #fontconfig - в нормальной жизни компилятор шейдеров был бы демоном. Тогда и кеш понятно, как устроить, без вычисления md5 от образа библиотеки, и как не запускать llvm в каждом приложении, и как падения ретраить(sic).

PS: тут про компилятор шейдеров я имел в виду штуку, которая SPIR-V в машинный формат переводит.
Читал тут исходники pulse audio. Осознал, что Поттеринг всю жизнь пишет одну и ту же программу - граф обработки каких-нить событий в realtime, и обязательно чтобы граф связывался в runtime, и без проверок на то, что этот граф может выполниться в реальной жизни. Ну не дает покоя человеку эта идея.

Бывает, чо. Некоторые вот уже 5-ую систему сборки пишут.

———
#gold, #security

Сначала небольшая вводная, для тех, кто с нами недавно.

Mix - это пакетный менеджер для linux/macos, и дистрибутив Linux на основе.

Я очень хочу, чтобы пакетным менеджером пользовалось как можно больше народу(не прямо сейчас, а вообще), потому что 1 человек потянет 500 пакетов(у меня сейчас 300), а больше уже нужно больше людей.

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

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

Поэтому я предполагаю, что у меня будет несколько "пресетов" - наборов пакетов, которые формируюут законченную идею(вид линковки + libc + DE + whatever).

Далее, когда я говорю, что "у меня в Mix вот так-то", я имею в виду вот этот вот пресет - https://github.com/pg83/mix/blob/main/pkgs/set/system/0/mix.sh, или System/0 #system0. Все, что я делаю в нем, может и не относиться к потенциальному Mix на #systemd + gnome.

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

Так, вводная закончилась. Далее про то, как будет устроен System/0(а точнее, про один из аспектов устройства).

Мне очень хочется, чтобы пакетный менеджер не работал от root, и чтобы в нем не было postinstall скриптов. А точнее, я хочу, чтобы пакет можно было установить, распаковав папку с его содержимым, и все. Это здорово облегчает реализацию, и упрощает модель безопасности. Скажем, как в Android.

Я решил почти все проблемы, связанные с этим:

* заведение пользователей/групп
* резолвер
* динамическая настройка сети

Да даже попакетные настройки ядра.

Но вот одна проблема оставалась для меня сложной. Как эскалировать привилегии? Да, sudo. Если пакетный менеджер не работает от root, нет postinstall скриптов, то как получить #suid бинарник в системе?

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

На днях придумал элегантное решение, и спешу им поделиться.

На хосте запущен(скажем, через socket activation) ssh демон, от рута. И sudo - это простой скрипт, который делает ssh root@localhost. ssh поднят на unix domain socket, чтобы не светить в сеть. Базово эта схема уже работает.

Чем больше думаю, тем больше мне эта схема нравится.

* Эскалация привилегий в ssh, я думаю, отлажена даже лучше, чем в sudo. Потому что так мы привилегии эскалируем IMHO чаще.

* Вход не по паролю, а по ключу, 1 на пользователя, а не одному на host.

* Парольный/беспарольный вход остается на стороне пользователя(пароль на приватной части ключа), без fragile вмешательства в /etc.

Схема работает очень годно - у меня нет ни одного #suid бинаря.
https://www.opennet.ru/opennews/art.shtml?num=56580

Как я удачно про #suid бинари написал. Напомню, что polkit это хрень с модулями на javascript, которая, по идее, должна быть на любом Linux.

———
https://github.com/swaywm/sway/releases/tag/1.7

Недавно писал, что перешел с GPU accelerated терминала на простой и тупой, как пробка, #foot. А теперь и в sway по умолчанию.

———
https://www.quora.com/What-goes-into-making-an-OS-to-be-Unix-compliant-certified

Текст про то как и зачем Apple стала почти единственным настоящим Unix на рынке. Спойлер - все из-за денег.

Yes, we had access to all of Apple’s source code, at that point in the game.

And so we submitted high priority bug fixes to the projects, some of which downgraded the priority immediately, and some of which they simply fixed, since we had provided them with the patch already.

And then the VP of engineering, Bertrand Serlet, re-escalated the priority on the ones which had been downgraded.

"If I were asked to do the same thing for Linux, it likely would take five years, and two dozen people.

Linux is pretty balkanize, has a lot of kingdom building, and you have to pee on everything to make it smell like Linux."

Вообще, забавно читать про такие "подвиги", рефакторинги на пару тысяч файлов в монорепе - дело повседневное. Ну, чувак поднял 10^7 денег за эту работу, я явно что-то делаю не так.

———
https://drunkard.com/the-zen-of-drinking-alone/

The next time you get loaded with the gang, gaze into your drink, your secret mirror, and think: “Hey, old friend. Remember our quiet time together? Remember the thoughts we shared? We’ll meet up again down the road. Just you, me, and the bottle.”

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

mix@mix:/bin$ du -h $(find . | while read l;
do realpath $l; done | sort | uniq)
840.0K /mix/store/BxNMUMuUPquoZbWG-bin-iw/bin/iw
1.1M /mix/store/CTeWFHWDCSA3QjRO-bin-dbus-sys/
bin/dbus-daemon
4.0K /mix/store/FzLWUWyAW7xeQM6U-bin-sud/bin/sudo
868.0K /mix/store/IUS1aLEwKRNGUDJG-bin
-dropbear-sys/bin/dbclient
912.0K /mix/store/IUS1aLEwKRNGUDJG
-bin-dropbear-sys/bin/dropbear
452.0K /mix/store/IuLQZHWKACpHHIMb
-bin-mingetty/bin/mingetty
2.1M /mix/store/Lxg7GGmAKFS6JRHF
-bin-busybox-full/bin/busybox
16.0K /mix/store/QCGQYMxNFX7JVPNI/
bin/bin_dhcpcd_sys/dhcpcd-hooks
24.0K /mix/store/QCGQYMxNFX7JVPNI/
bin/bin_dhcpcd_sys
92.0K /mix/store/QCGQYMxNFX7JVPNI/bin
344.0K /mix/store/RDejKYbHOBtsKiXE-bin-runit/bin/chpst
24.0K /mix/store/RDejKYbHOBtsKiXE-bin-runit/bin/runit
12.0K /mix/store/RDejKYbHOBtsKiXE-bin-runit/
bin/runit-init
32.0K /mix/store/RDejKYbHOBtsKiXE-bin-runit/
bin/runsv
16.0K /mix/store/RDejKYbHOBtsKiXE-bin-runit/
bin/runsvchdir
328.0K /mix/store/RDejKYbHOBtsKiXE-bin-runit/
bin/runsvdir
28.0K /mix/store/RDejKYbHOBtsKiXE-bin-runit/bin/sv
352.0K /mix/store/RDejKYbHOBtsKiXE-bin-runit/bin/svlogd
16.0K /mix/store/RDejKYbHOBtsKiXE-bin-runit/
bin/utmpset
464.0K /mix/store/VhhsJUEQVQ6SN9MR-bin-seatd-sys/
bin/seatd
4.0K /mix/store/XjIiXHuLYGOTmHkb-bin-dhcpcd-sys/
bin/bin_dhcpcd_sys/dhcpcd-hooks/01-test
8.0K /mix/store/XjIiXHuLYGOTmHkb-bin-dhcpcd-sys/
bin/bin_dhcpcd_sys/dhcpcd-hooks/20-resolv.conf
4.0K /mix/store/XjIiXHuLYGOTmHkb-bin-dhcpcd-sys/
bin/bin_dhcpcd_sys/dhcpcd-hooks/30-hostname
12.0K /mix/store/XjIiXHuLYGOTmHkb-bin-dhcpcd-sys/
bin/bin_dhcpcd_sys/dhcpcd-run-hooks
796.0K /mix/store/XjIiXHuLYGOTmHkb-bin-dhcpcd-sys/
bin/dhcpcd
1.1M /mix/store/pwC5GgAGQBVEGBEY-bin-iwd/bin/iwctl
1.7M /mix/store/pwC5GgAGQBVEGBEY-bin-iwd/bin/iwd
1.4M /mix/store/pwC5GgAGQBVEGBEY-bin-iwd/bin/iwmon

Userspace, достаточный, чтобы загрузить ядро, поднять сеть, запустить графическое приложение(без композитора, разумеется), системная шина для контроля и управления <10MB в несжатом виде. Ну, как Alpine, и было бы странно иначе.

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

* Ядро примерно 30МБ(модули built-in)

* firmware для ядра - одна большая папка размером в 900МБ, пилят ее на части только очень отчаянные люди. Потому что вот, например, драйвер AMD без патчей от Gentoo даже не пишет в консоль, какую фирмварь он загружает, а без фирмвари - просто черный экран. https://wiki.gentoo.org/wiki/AMDGPU#Kernel (реально, почитайте, автору особенно доставил пассаж с рекомендацией вбивать команды вслепую)

* Папка с какими-то дефолтными шрифтами занимает 200МБ
👍5
Я давно откладывал эту тему, но вот вышла эта новость, и, видимо, пора:

https://www.opennet.ru/opennews/art.shtml?num=56587

"Отмечается, что для полноценной работы приложений на базе SDL в Wayland требуется наличие библиотеки #libdecor для декорирования окон на стороне клиента."

libdecor - это леденящий душу пиздец.

Очень хорошо со стеком #glib /gtk я познакомился под НГ, когда собирал себе браузер Epiphany, на основе WebKitGTK(*).

* Он написан на диалекте С от GNU. Это очень странная объектная система, которая позволяет конструировать классы на лету, и несщадно тормозит, потому что минимум 2 уровня косвенности.

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

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

* Он косой и кривой - я заметил, что браузер всегда мерцает(1 кадр - белый фон, второй - реальная картинка(видос записывать лень)). Бугага, зато девелоперы пишут победные статьи - https://blogs.igalia.com/carlosgc/2017/02/10/accelerated-compositing-in-webkitgtk-2-14-4/. Ремарка - плохие девелоперы у Igalia, не у WebKit.

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

* Кто-то с кем-то не договорился. #fontconfig
* Круговые зависимости.

Сегодня про первую проблему :) #GNOME #SSD

Вот такой феерический тред - https://gitlab.gnome.org/GNOME/mutter/-/issues/217. Обязательно его прочитайте! Краткое содержание - все упрашивают разработчиков Gnome добавить поддержку server side decorations, а они отказываются, мотивируя тем:

* Что могут(Wayland не требует поддержки SSD).

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

И, тем самым, не-GTK приложения должны в себя влинковывать GTK, чтобы не выглядеть в Gnome чужеродно. Чувствуете логику, да? То есть, не 1 гномовский композитор должен зависеть от их платформенной библиотеки, а каждое приложение на QT должно зависеть от чужой платформенной библиотеки.

Короче, TL;DR - они не договорились, и появилась библиотека libdecor, которая должна в runtime загрузить в себя плагин, который загрузит GTK в QT приложение, запустит в отдельном event loop GTK, и будет отрисовывать клиенсткие декорации.

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

И вот, теперь безвинные приложения на SDL будут загружать это УГ, и рисовать им декорации.

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

* Почему WebKIT? Мне показалось, что его проще всего собрать, потому что меньше мудохаться с вендорингом. Я ошибался, но это уже другая история.
Уважаемые, а продайте OSS process supervisor?

Не статический, по типу s6/runit/shepherd, а динамический. В идеале, хочу команду spawn, которая по UDS сходит в демон, и демон запустит процесс, за которым будет следить:

* ротейтить stdout/stderr в файлы
* очищать ошметки после смерти
* перезапускать при падении

Все известные мне решения смотрят или на папочку с сервисами, или на конфиг с сервисами. Хочется динамики.
Я тут себе собирал свое личное ядро для System/0 #system0. Это оказалось очень сложно, и заняло 4 бессонных ночи(+ целиком прошлое воскресенье).

Ну, то есть, собрать-то легко, а вот сделать так, чтобы оно заработало, очень сложно.

* Первое ядро ничего не писало на экран, и просто мигало капсом(это типа такой kernel panic). https://en.wikipedia.org/wiki/Kernel_panic#Linux. К счастью, от Gentoo я знал историю про то, что ядро себя так ведет с amdgpu, если не может загрузить firmware. Незачет номер раз - в такой ситуации нормальные люди откатывались бы на efi framebuffer, и показывали хотя бы сообщение об ошибке. Видимо, реализовать приоритет драйверов - это очень сложно.

* Загрузка firmware. Ядро напрочь отказалось загружать firmware с файловой системы, а до firmwared дело просто не доходило. Я так понимаю, некоторые штуки надо загружать или только из initrd,или прямо вкомпилять внутрь ядра. Я пока вкомпилял внутрь, причем вообще всю фирмварь для amdgpu, так как я уже писал, что нормального способа узнать, что загружено - не существует. - несколько часов.

* Для интелевых карточек в репе лежит примерно 20 разных фирмварей. Если дать ядру возможность выбора, то драйвер загружает НЕ ТУ фирмварь(оно при попытке поднять интерфейс срет в dmesg). То есть, фирмварь пришлось заблеклистить. На минуточку, драйвер от Intel, загружает фирмварь от Intel, подписанный Intel, для интеловой же карты, и ошибается. - несколько часов.

* Дальше началось самое интересное. Не работал мой тачпад в Sway. Последовательный bisect проблем показал, что ядро не видит тачпад, и не создает для него /dev/input/чегототам. Суммарно на решение этой проблемы ушло часов 20, за которые я успел по настоящему подебажить ядро. Я узнал, что такое шина i2c, hid, как они сопрягаются, и кучу прочего бесполезного барахла. А теперь придется и вам.

Итак, мое текущее понимание устройства ядра(это все довольно поверхностно, физически устроено еще сложнее *):

* Ядро - это такой большой std::map<void*, void*> M, как Spring :))
* Все подсистемы могут туда что-то положить, и зарегистрировать.
* Все подсистемы там могут что-то поискать, и что-то дернуть.

Какие отсюда интересные следствия?

* Если ты забыл что-то вкомпилять в ядро, то посреди цепочки регистрации что-то потеряется, и твое устройство не будет найдено.
* В модулях ядра стоят неполные зависимости. Что это значит? Это значит, что загрузятся не все нужные подсистемы, и мы возвращаемся в пункт 1.
* Зависимость от порядка регистрации. Если его не соблюсти, то в момент регистрации драйвера могут быть зареганы не все нужные подсистемы(пункт 2), и возвращаемся в пункт 1.

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

Поэтому шина i2c видела мое устройство, но сигнал не доходил до HID драйвера, и устройство не могло зарегаться.

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

В конце-концов я нашел модуль про gpio pins, увидел, что его нет в зависимостях ни у i2c, ни у hid, и все стало понятно.

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

Почему нельзя вкомпилять в ядро на правах модуля(типа, звать probe только тогда, когда явно попросили init этого драйвера) - непонятно.

Короче, ядро у меня уже свое, но пока не до конца пригодно для всех.
👍4