commit -m "better"
3.21K subscribers
1.01K photos
147 videos
3 files
2.36K links
just random thoughts
Download Telegram
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
Будни бутстрапа.

/usr/share - это жесть. Каждый тулкит, каждая графическая библиотека, содержит в себе те или иные хаки по поиску

* шрифтов
* иконок
* курсоров

Да, да, курсоров. Я был очень удивлен, узнав, что в wayland курсор отрисовывает клиент. Отсюда полная неразбериха в темах и размерах. В какой-то момент у меня получилось сделать так, что у меня были 3 разных размера курсора - в sway, foot, и в waybar.

Хорошее описание проблемы тут - https://gitlab.freedesktop.org/wayland/wayland-protocols/-/issues/58

Некто Simon Ser настойчиво отстаивает право авторов клиентов творить любую дичь. Наверное, потому что он автор одного из таких клиентов - wlroots/sway. Не верите? А пожалуйста!

Вот Simon героически скопировал в wlroots кусок wayland(а тот, в свою очередь, скопировал кусок из XCursor) по локации папочки с курсорами - https://gitlab.freedesktop.org/wlroots/wlroots/-/blob/master/xcursor/xcursor.c#L622 Зачем, я хз.

Конечно, это очень удобно - в одной шапочке писать правила и протоколы wayland, а в другой - разрабатывать sway.

К счастью, это open source, и то, что сломано одним долбоебом, всегда может быть исправлено другим. Я, конечно, у себя этот файлик обнуляю - https://github.com/pg83/mix/blob/main/pkgs/lib/wlroots/14/mix.sh#L52.
👍21
Я думаю, вы уже поняли, что #system0 - это "моя прелллесть" :)

В ней я, по мере сил, намерен исправить разные проблемы, с которыми я сталкивался по мере взаимодействия с Linux/Unix.

Одна из таких проблем - это свойство Unix по наследованию init-ом процессов, у которых умер родитель. Я считаю, что это треш, угар, и содомия(и одна из причин появления cgroups, кстати). Мне приятно видеть completely supervised tree, если вы понимаете, о чем я. Это удобно и для понимания, и для отладки. Долгоживущие процессы надо запускать через команду spawn сессионного супервизора.

Поэтому у меня есть https://github.com/pg83/mix/blob/main/pkgs/bin/killd/cycle.sh - демон, убивающий "залетные" процессы. Если это полетит, то я это, конечно, добавлю в свой init.

Кстати, убиение через SIGINT там исключительно потому, что, если sway убить через SIGKILL, то он регулярно вешает систему намертво. Вот такой классный графический стек в Linux.

К сожалению, тот же sway зачем-то запускает все процессы через double fork. К счастью, исправление - 3 строки кода.

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

Че-то уже третья новость про обновление uutils. Я имею сказать:

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

* Размер busybox-style статического бинаря для busybox - 1.5MB, coreutils - 2.5MB, uutils - 10MB(опять же, на состояние пару месяцев назад, сейчас проверить не могу, потому что Rust у меня уже не запускается). Надо еще понимать, что в busybox в 3 раза больше утилит, там и cron, и dhcp, и util-linux, и так далее. Но они вообще упоротые, читать их код очень интересно.

* Зачем переписывать простой код, который и память-то особо не выделяет, я не понимаю. Какой от этого added value?
👍3
У меня сегодня большой день - я перенес загрузчик на свою партицию, и загрузился с него. Старые FS и линуксы можно стирать, окончательно перерезав пуповину с материнской системой.

Это оказалось сложнее, чем я думал, потому что разработчик efibootmgr сошел с ума.

https://github.com/rhboot/efivar

Там сделано вообще все возможное, чтобы код не собирался ничем, кроме gnu toolchain, хотя никакого особого смысла в этом нет(спойлер - все собралось и заработало с clang), и чтобы не работала статическая сборка.

https://github.com/rhboot/efivar/blob/main/src/include/workarounds.mk
Вот тут автор якобы поддерживает lld, но проваливаемся мы в not supported case.

Автор явно вызывает gcc-ar, вместо ar. Что, зачем...

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

Автор очень широко использует расширения gnu libc(я это называю горе от ума), мне ажно пришлось реализовать функцию qsort_r самому - https://github.com/pg83/mix/blob/main/pkgs/lib/qsort/r/mix.sh#L15. Я, конечно, тот еще кулхацкер и ленивая жопа, но сохранять контекст и реальный коллбек в пертредных переменных - это даже для меня мощно.

Систему переименований символов я заменил на систему регулярок поверх исходного кода.

У чувака есть файлик safemath.h вот такого содержания - https://github.com/rhboot/efivar/blob/main/src/safemath.h

Он пишет эту простую утилиту непрерывно с 12 года, и ему явно стало скучно.

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

Все обошлось.

Сейчас форматирую освободившийся большой раздел под XFS(а вы знали, что старичок - все еще одна из лучших FS для Linux?), и переношу систему на него. #xfs
🔥9👍7🤔1
https://maskray.me/blog/2022-01-16-archives-and-start-lib #maskray

Рассказ про изобретение thin archive.

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

История изобретения:

Однажды вышел clang с поддержкой lto, и я очень захотел собрать с ней базовый поиск. LTO там было сделано на отъебись - компилятор мог родить .o файл с промежуточным представлением, и на этом все.

Эти объектные файлы нельзя было объединить в .a, нельзя было позвать clang для линковки. Единственное, что там было - это команда "opt", которая могла слинковать несколько lto .o файлов в 1, попутно применив оптимизации, была команда, которая делала asm файл из этого .o, а дальше можно было взять этот asm, руками сделать из него настоящий .o, и слинковать все это вместе с системным кодом, для которого нет lto .o файлов.

Короче, я на петончиге соорудил подобие архиватора и линкера из этих примитивов, и оно даже заработало. В тот момент мне стало понятно, что гораздо проще в .a запиклить* пути к lto .o, чем пиклить данные, а потом разпикливать их в fs, для запуска "opt". Так я изобрел thin archives.

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

Почему их не нужно использовать.

* На HDD это приводило к бешеному росту iops, по понятным причинам. На ssd это менее релевантно.
* Даже на ssd остается проблема с readahead - мы читаем с диска существенно больше данных, чем надо.

Ладно, есть 1 случай, когда thin archives немного помогают. Если у вас до жопы памяти, и вы потребляете архивы сразу по мере изготовления(one shot build, например), некое ускорение можно наблюдать.

Но лучше не надо, потому что ускорение эфемерно, а огрести при нехватке памяти все еще можно.

* - literally. pickle.dumps(sys.argv[2:]) - вот примерное устройство моего ar.
👍3
commit -m "better"
https://hardcoresoftware.learningbyshipping.com/p/061-bsod-to-watson-the-reliability Забавно. Товарищ (из Microsoft?) считает, что качество софта улучшилось, когда ввели телеметрию. Плохая статья. На пути к хорошему софту было 3 этапа: 1) Перестали писать…
Я тут обратил внимание, что, после перехода с fedora на мою сборку ядра(и вообще, полностью на свой rootfs), мои configure скрипты стали на вид ощутимо быстрее. Померял,

dash + coreutils: 23s

У меня нет объяснения, кроме замены btrfs на xfs, и своим ядром без всего там лишнего. Наверное, существенное отличие - у меня full rt ядро, но это должно улучшать latency и ухудшать throughput, а мы видим другое.

UPD: подумал еще раз - у меня включены THP, и mimalloc по умолчанию(а он старается использовать THP, если они есть).