LINUX.ORG.RU

Избранные сообщения Dr64h

LLVM. Зачем он вообще нужен?

Форум — Development

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

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

 ,

monk
()

trurl 0.14

Новости — Интернет
trurl 0.14
Группа Интернет

30 июля состоялся выпуск 0.14 консольной утилиты trurl (tr for URLs), написанной на языке C с использованием функции curl_url_set библиотеки libcurl. Утилита предназначена для разбора и других манипуляций с URL-адресами.

Список изменений:

  • вместо функции strncasemp используется собственная реализация;
  • добавлена поддержка префикса strict командой --get;
  • добавлена поддержка оператора условного присваивания ?= командой --set;
  • удалён лишний перевод строки при выводе предупреждения;
  • в документацию добавлены коды возврата.

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

 , , , ,

dataman
()

Отключается левый канал звука на pipewire

Форум — Desktop

Через некоторое время после запуска системы (иногда через 10 минут, иногда через час) может отключится левый канал звука. Проблема не в самих колонках. Однако на pulseaudio такой проблемы не замечается. Также это не проблема дистрибутива и рабочего окружения. Перезагрузка pipewire не помогает, помогает лишь перезагрузка пк. Характерно то, что после отключения левого канала слышатся характерные щелчки из левого канала с переодичностью примерно в полминуты. Кому нужно, дистрибутив Manjaro, kde, ядро ~6.6.

 , ,

MihSus
()

Проблема со звуком

Форум — Desktop

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

Начнем с микрофона: у меня Fifine K670, подключен к компьютеру через встроенную в микрофон звуковую карту. В задумке она должна регулировать громкость микрофона самостоятельно, и так происходит на Windows и macOS. Но на Linux (дистрибутив NixOS, хотя это проблема не привязана к дистрибутиву) этот функционал вообще не работает. То есть я всегда для собеседника говорю с перегрузом. Использую PipeWire.

Тут появляется первый вопрос: можно ли это исправить как-то на уровне драйверов, или придётся это исправлять другим путем?

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

Можно ли как-то убрать этот треск звука? Если да, то как?

Помогите, пожалуйста. Буду очень благодарен!

 , , , ,

Bogus_Kladik
()

Сделать стабильный ABI для библиотеки и не повеситься

Форум — Development

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

  1. Шпилить её на чистой сишечке, немного страдать, но получить из коробки

  2. Или написать её на C++, страдая немного по-другому, но пользуясь всеми его благами? Однако реализуя тонкую extern "C" { } обёртку. Много бойлерплейта, но ничего глобально сложного.

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

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

 , ,

witaway
()

Отчего всё так плохо с отношением родитель-ребенок?

Форум — Development

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

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

Ну так как мы люди умные, а есть люди ещё умнее, то мы будем пользовать блага что они сделали. GUI нарисуем сами, а конвертировать будем через ffmpeg. Т.е. пользователь выбирает диск, дорожку, сабы, звук, а мы вызываем под капотом бинарь ffmpeg с нужными параметрами.

И вот казалось бы, все рады, всё работает. Но представим, что по какой-то причине наш GUI упал. Плевать как - кривой программист написал всё на си, нас пристрелил ООМ, нам прислали kill -9. Это всё не важно, нас пристрелили принудительно, не дав нам вызвать нужные деструкторы.

Что тогда происходит по умолчанию? Если мы успели запустить какой-нибудь рендеринг-конверт отдельным процессом - то ВНЕЗАПНО, этот процесс не умрёт. Его усыновит ближайший по проходу по дереву запусков процесс, у которого установлен флаг SUBREAPER. Обычно проверка доходит до init, если мы не запущены в каком-нибудь специфичном контейнере.

Ну нам же такое поведение не нужно. А если там рендеринг на 4 часа? Сидеть ждать пока дочешет? И вот выхожу я такой в интернет с этим вопросом и получаю два ответа, для windows и для linux. Для оффтопика существует специальный механизм, который пошлёт «смерть» дочерним процессам в случае смерти родителя:

JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE (см. подробности на MSDN)

Независимо ни от чего, все запущенные нами побочные процессы (ffmpeg, probe, и так далее) - грохнутся вместе с нами. У виндов, правда, особое отношение к терминации процесса, если у него нет главного окна (чтобы система виртуально нажала там «крестик») или если оно не запущено в терминале (чтобы система виртуально послала там «ctrl+c») - то процесс просто будет убит.

А вот под linux… Под linux все на stackoverflow наперебой орут, что такой механизм есть. И показывают:

    if (prctl(PR_SET_PDEATHSIG, SIGTERM, 0, 0, 0) == -1) {
        // ашипка
    } // там еще проверка ppid, но для контекста это не важно

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

      PR_SET_PDEATHSIG (since Linux 2.1.57)
              Set  the parent-death signal of the calling process to arg2 (ei‐
              ther a signal value in the range  1..maxsig,  or  0  to  clear).
              This  is  the  signal that the calling process will get when its
              parent dies.

              Warning: the "parent" in this  case  is  considered  to  be  the
              thread  that  created  this process.  In other words, the signal
              will be sent when that  thread  terminates  (via,  for  example,
              pthread_exit(3)),  rather  than  after all of the threads in the
              parent process terminate.

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

  • Все процессы, которые мы хотим запустить форкать из main-треда (ЩИТО?)
  • Иметь какой-то отдельный тред, который будет получать какие-то инструкции для запуска и каждый раз запускать новый экземпляр ffmpeg через себя И НЕ УМИРАТЬ! ПОЖАЛУЙСТА, НЕ УМИРАЙ! #ТРЕДЖИВИ
  • Не иметь отдельный тред для всех, но каждый раз для запуска создавать отдельный тред и держать его пока форкнутое приложение 100% не завершило работу.

И вроде бы по логике 3й пункт и ничего так, но он подходит далеко не всегда. Фиг с ним, что если мы запускаем 50 субсервисов - то нам надо будет держать 50 тредов, плевать. Иногда нам нафиг не нужно сидеть и ждать (waitpid), чо там с процессом. Ну для нашей DVD-риделки это еще может быть критично (ну там прогресс-бар нарисовать, постоянно читая ffmpeg или сразу сказать, что процесс сдох), а вот для некоторых других запусков - нет. Ну вот у меня в рабочем проекте я вообще не чекаю статус запущенного сервиса. Я с ним иногда по сокету общаюсь и если он подох туда ему и дорога - то я просто его заново запущу (когда он понадобится) и в логи стрельну, что такое было. Мне вообще плевать на его состояние после транзакции.

А разрабы ядра мне выбора не оставили. Или сиди и смотри на процесс в отдельном треде (и запускай сто тредов если запустил сто приложений. Как пример - какой-нибудь thumbnailer для файлового менеджера) или запускай процессы форкая main.

Горит. Немыслимо горит. Почему в windows сделано нормально, а тут вот такой цирк? (Про который еще и никто из индусов на SO не упоминает)

Выдохнул. Сабж. Какие еще есть варианты умирания без модификации child-программы? С модификацией любой дурак сможет - создал пайп в паренте, передал в child и сиди в child’e пырь в read. Пришёл 0 - делай роскомнадзор.

 ,

PPP328
()

Минималистичные анимированные обои для X (под wayland возможно тоже..не знаю)

Галерея — Скриншоты
Салют

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

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

Если коротко: берем видео, режем на кадры. Берем Feh. Делаем скрипт смены кадров бесконечным циклом. Ставим на автозагрузку.

Background.

Сижу под Линуксом 1.5 года, что, наверное, считается еще новичком. В общем, не судите строго, пожалуйста.

Мотивация

Когда только перешёл с Винды на Убунту, почему-то захотел анимировать фон. А не получилось. Не смог найти легкий способ сделать это без дополнительной мишуры (пакетов, библиотек и т.д.). Расстроился. Сейчас гештальт закрыл и на радостях решил поделиться способом. Вероятно, кого-то он может заинтересовать.

Начнем!

Требования:

  • feh (утилита минималистичная, полагаю, есть на всех дистрах; в общем-то, она нам обойки и рисует;

  • приложение, чтобы разбить видео на отдельные кадры (лично я использовал web, такие приложения гуглятся 10 секунд);

  • в общем то все…

Опционально

  • я лично запускал все из под X и DWM, но лично я не вижу препятствий реализовать это на других DE

Этапы:

  1. Находим видео, режем на короткую, но цикличную версию(в моем случае 7 сек).

  2. Гуглим «Разбивка видео на кадры» у нас получается несколько скриншотов (в моем случае 70; важно и удобно чтоб кадры были пронумерованы по очереди).

  3. открываем VIMVIMwq (любой текстовый редактор) и пишем:

!#/bin/bash
while :
do 
feh --bg-fill(тут параметры фона) /путь/до/картинки1
sleep 0.03
feh --bg-fill(тут параметры фона) /путь/до/картинки2
sleep 0.03
.....
feh --bg-fill(тут параметры фона) /путь/до/последней_картинки
sleep 0.03
done

Сделали бесконечный цикл, который раз в 0.03 секунды меняет кадры (открываем консоль, пробуем)

./путь/до/вашего_скрипта.sh & (& делает исполнение цикла фоновым)

  1. Находим способ сделать скрипт фоновым (данных способов много..очень; один из вариантов – добавить скрипт в ваш .xinitrc);
  • vim ~/.xinitrc
{текс..текс..текс..}
exec dwm & slstatus & nohup /home/$USER/путь/до/вашего_скрипта.sh

В моем случае dwm & slstatus, но у вас может быть другое!

Например, i3 & nohup /home/$USER/путь/до/вашего_скрипта.sh)

В целом, наверное, все. Спасибо за внимание

 ,

Blabado
()

Выпуск консольного текстового редактора Vis 0.9

Новости — Open Source
Группа Open Source

Vis – консольный текстовый редактор, сочетающий в себе модальное редактирование в стиле vi со структурными регулярными выражениями в стиле sam.

( читать дальше... )

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

 , ,

anonymous
()

Удалённый доступ за NAT

Форум — Admin

Привет!

Есть ноутбук (которым пользуется родственник), на нём установлен calculate linux.

Находиться он будет за NAT (модем+маршрутизатор+точка доступа, раздаёт интернет по WiFI), который я не имею возможности администрировать (порт там пробросить или что-то такое). Кстати, не уверен, есть ли там белый IP, не помню.

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

Какой-нибудь демон может установить… который бы устанавливал соединение, по которому я мог бы туда попадать?

Раньше я что-то такое делал на связке ipv6+ddns, но потом что-то оно перестало работать, так и не разобрался, из-за чего.

Может есть ещё какие-то варианты, которые мне в голову не пришли?

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

ОТВЕТ: zerotier именно то, что искал, круто, что есть такой продукт, да ещё и бесплатная версия, шикарно.

P.S. ssh-j.com тоже классная штука, подкупает тем, что можно скинуть человеку в чат «запусти пару команд чтобы я к тебе смог подключиться», не надо демон настраивать.

 , , ,

BattleCoder
()

Примеры GUI программ без фреймворков

Форум — General

Знакомы ли вам полноценные десктопные графические программы, написанные без использования фреймворков QT/GTK и подобного?
На чистой манипуляции X11 или Wayland.
Не просто поделки какие-нибудь, а реальные качественные программы, которыми пользуются люди.

 

vvvv
()

Накидайте книг для продвинутого Си под онтопик

Форум — Development

Сто лет назад прочитал K&R и всегда хватало, а если я хочу углУбить?

// друг спрашивает :)

UPD: собрал из темы списочек, особо не редактируя (экстримов и модернов поболее одного, но пусть будет) – думаю, заглянувшим в будущем будет полезно:

  • modern c by jens gustedt
  • Thomas Mailund - Pointers in C Programming (2021)
  • Gustedt - Modern C (2020)
  • Kalin - Modern C Up and Running (2022)
  • King - C Programming. A Modern Approach, 2nd ed. (2008)
  • Хэзфилд «Искусство программировани на C»
  • «Язык C в XXI веке»
  • Экстремальный Си
  • extreme c programming
  • «UNIX. Профессиональное программирование» Уильям Ричард Стивенс, Стивен А. Раго
  • C Interfaces and Implementations: Techniques for Creating Reusable Software
  • Peter van der Linden, Expert C Programming: Deep C Secrets https://progforperf.github.io/Expert_C_Programming.pdf
  • Чан Теренс «Системное программирование на С++ для Unix»

 ,

pihter
()

Лучший генератор речи из текста offline

Форум — General

Ранее пользовался rhvoice, но нашел качественнее - https://github.com/rhasspy/piper

Это лучшее, или есть еще варианты ?

 

x905
()

Как разобраться в формате файла? (было: Как заинструментировать код на Си)

Форум — Development

Пост обновлен, предыдущее название: «Как заинструментировать код на Си и понять что он делает? Реверсинг формата файла»


Вступление

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

Итак, у нас есть какой-то файл формата PNG - что с ним дальше можно сделать? Можно было бы взять готовую библиотеку для чтения данного формата (libpng), но она содержит более 100 000 строк кода, что крайне сложно для понимания.

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

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

К сожалению, не все форматы файлов так хорошо описаны, как описан формат PNG. Далеко не для всех форматов файлов есть такие картинки и тем более шаблоны для hex-редакторов. И я бы хотел делать такие картинки самостоятельно.


Идея

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

Само собой, для тестирования, нужно будет собрать некий тестовый датасет (набор png-файлов с разными разрешениями, режимами компрессии, битые файлы). Для этого было бы неплохо использовать утилиты из набора AFL для уменьшения датасета и уменьшения самих исходных данных: https://youtu.be/0dqL6vfPCek (фаззинг файла вместе с ffmpeg)

Вопрос: как бы заинструментировать имеющийся софт (программу, библиотеки), чтобы понять, что такое оно делает с файлом, что внутри и как его вообще читать? Да и вообще, что можно вытащить из подобной затеи?

Например, очень бы хотелось узнать:

  • Сигнатуру файла (\x89PNG в начале файла)
  • Структуру «чанков», что она представляет собой 4 поля: длинна, тип, данные, CRC32
  • Алгоритм расчета CRC32: какая часть данных считается, с заголовком или без, какой полином
  • Какая часть файла пожата zlib, какие части файла просто являются несжатыми массивами
  • Нарисовать какую-то диаграмму, где какой байт чему соответстует, вроде https://i.imgur.com/eLd44xQ.png или https://i.imgur.com/AwpmSxV.png

Я себе это представляю как-то так:

  1. Читаем кусочек файла и помечаем, что это наш файл (перехватываем read/fread, «отравляем» эти участки памяти)
  2. Ставим брейтпоинт на чтение памяти, логгируем, смотрим по map-файлу где мы это читали, желательно размотать стек
  3. По коду уже можно представить, читаем мы float или int16, находимся ли в структурке или еще где. Если мы внутри функции check_file_signature(), то это вообще очевидно. Можно пометить как ручками, так и чем-то вроде IDA.

Зачем? Это поможет в написании файлов-шаблонов для таких программ как https://ide.kaitai.io/ или 010 Editor. Конечно, в идеале запустить на входе PNG-файл, а на выходе получить KSY (формат описания файлов kaitai) или BT (формат для 010 Editor), но понятно, что идеальной документации не будет. Но я стремлюсь именно к этому.

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

Буду благодарен на статьи просто по инструментации сишного кода. Или не только сишного.


Референсы и идеи

  • https://github.com/AFLplusplus/AFLplusplus - отличное средство для фаззинга (пример фаззинга libpng: https://youtu.be/LsdDRat4S0U), но я не очень понимаю как это применить именно к описанию файла. А вот тулзы вроде afl-cmin - чистое золото
  • https://www.intel.com/content/www/us/en/developer/articles/tool/pin-a-dynamic-binary-instrumentation-tool.html - Intel PIN
  • Address Sanitizer or ASAN - можно попробовать поиграться с ним и залоггировать доступ к памяти
  • valgrind + lackey - очень многообещающе, но боюсь не осилить
  • Попробовать сделать доступ к страничке PROT_NONE, получить сегфолт, но непонятно как возвращать управление (сделал, но споткнулся на последнем пункте)

 , , , ,

ruzisufaka
()

Быстрые аналоги ImageMagick(convert)

Форум — General

convert отличается исключительным тугодумством. Есть ли что-то побыстрее?

 

hateWin
()

Си. Почему бы не запретить запись в стек?

Форум — Development

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

#include <stdio.h>

register long unsigned rsp asm("rsp");

void print_arg(int arg) {
    ((int*)rsp)[3] = 0xBADC0DE;
    printf("arg = %x\n", arg);
}

int main(int argc, char **argv) {
    print_arg(0xF00D);
    return 0;
}

Этот код отрабатывает и не выводит ошибкок с

-fhardened -fcf-protection=full

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

Почему бы не вставлять проверки на ассемблере при записи в память, на включаемость в регион стека? Если нужно записать что то в аргумент на стеке (int), то проверку можно не вставлять. При записи по указателю, уже обязательно вставлять. Если адрес стека то ошибка. В memset проверять пересечение двух диапазонов.

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

void read_file(const char *name)
{
        char buff[999];
        FILE *f = fopen(name, "rb");
        read_block(f, buff);
}

void read_block(FILE *f, char *buff)
{
        // тут компилятор должен вывести что len(buff) == 999
        fread(buff, 1, 9999, f);
}

Что бы все идеально работало, нужно будет:

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

 

MOPKOBKA
()

Проект на чистом Си

Форум — Development

Камрады, всем доборый день!

Решил тряхнуть стариной, написать кое-что полезное для себя и таких же упоротых личностей. Заодно вспомнить Си (который без «крестов»). Естественно, хочется сделать «красиво, модно, молодёжно» и удобно. Вопрос - как проекты на Си принято начинать в 2024? Ну там пакетные менеджеры (а они вообще есть?), линтеры и прочее счастье. Какой стандарт сейчас считается «правильным» для использования и какую литературку/доку по нему почитать? Буду благодарен, если покидаетесь статьями или книгами.

 , , ,

small-entropy
()

60фпс, но нет плавности

Форум — Games

Добрый день. Может поможете разобраться нубу со следующей проблемой: запускаю игры из-под протоновского Wine и в таких играх, как battlefiled 4,1,5 при стабильных 60фпс периодически появляется какая-то тормознутость. На графике фреймтайма ничего не происходит, фпс держится на 60 (залочено), но фпс как-будто проседает до 40. Какой-то закономерности не заметил. То идёт плавно, то начинается такая фигня при взгляде на забор какой-то левый, то в другой случайной сцене. Вертикалку отключать и включать пробовал. Проц 50%, видеокарта с запасом АМД, дрова от kisak (пробовал и стоковые, и оибаф), ядро xanmod (на стоковом 6.5 тоже самое). Linux mint 21.3. В Интернете не нашел ничего по этому поводу,на протонДБ тишина, значит проблема частная. Пробовал также через лутрис запускать. В других играх более-менее нормально, кроме Rage2 - там при локе на 60фпс фреймтайм идет в виде симметричного забора и картинка по восприятию кадров 20. Может кто сталкивался или знает, куда копать?

Перемещено hobbit из general

 , ,

Krapkert
()

litehtml v0.9

Новости — Open Source
Группа Open Source

Состоялся выпуск litehtml, легковесного движка рендеринга HTML/CSS. Основная цель библиотеки litehtml – предоставить разработчикам простой способ отображения HTML-страниц в своих приложениях. Например, он может использоваться программах-словарях вместо WebEngine. Qt Assistant использует эту библиотеку для показа справки.

Библиотека не занимается отрисовкой текста или изображений, поэтому у нее нет привязки к какому-либо тулкиту.

Кроме множества улучшений, выпуск примечателен базовой реализацией CSS Flexbox.

litehtml распространяется на условиях New BSD License и использует gumbo-parser с лицензией Apache v.2.

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

 , , litehtml

NickNotNick
()

Модификация заголовков входящих IPv4 пакетов через iptables

Форум — Development

Сап, лор.

Есть необходимость модифицировать входящие/исходящие пакеты ip по некоторой логике (не NAT и прочее). Интернеты говорят, что для этого можно использовать nf queue или match-модуль для iptables. Для последнего нашлось несколько тестовых/примерных реализаций, напр, https://github.com/vt-alt/tripso. Этот проект оперирует достаточно сложными (в данном случае) вещами - метки безопасности, у них какой-то там формат и прочее, поэтому я сильно упростил код, чтобы просто понять, как оно работает. А оно не работает. Подробнее:

  1. Исходящие пакеты:
  • Правим код, убираем проверки на наличие security options в заголовке ip и просто в ip_hdr->check пишем 0. Добавляем отладочный вывод, чтобы убедиться, что код отрабатывает.
  • Подключаем-запускаем # iptables -t security -I OUTPUT -j TRIPSO --to-astra
  • Сеть не фунциклирует, понятно. # tcpdump -w ~/dump.pcap, видим все исходящие пакеты с checksum == 0

Т.е. для исходящих пакетов все работает.

  1. Входящие пакеты:
  • Ребутим (не получилось корректно выгрузить, неважно), запускаем для входящих # iptables -t security -I INPUT -j TRIPSO --to-cipso
  • Сеть жива. tcpdump показывает, что все КС на месте, никаких нулей. dmesg показывает, что код модуля работает.

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

Вариант # iptables -t raw -A PREROUTING -j TRIPSO --to-astra счастья тоже не принес. Игры с -A и -I тоже.

TL;DR match-модуль для iptables модифицирует исходящие пакеты, но не входящие. Как модифицировать входящие пакеты? Ну или что я не так делаю? nf queue не предлагать.

 ,

leet27
()

Не запускается Steam (бесконечный экран загрузки)

Форум — Games

Ещё пару недель назад стим запускался без проблем. Железо с тех пор не поменялось никак. А сегодня его запустить не получилось - бесконечный экран загрузки: https://i.redd.it/fwhr0ommda6c1.png

Пробовал удалять и переустанавливать, из официальных репозиториев и из flatpak. Не помогло.

Пробовал удалять папку .steam и аналогичные папки в .cache и .local - не помогло.

С помощью Timeshift откатил систему до состояния «только что после установки и настройки» - всё та же бесконечная загрузка. Хотя на момент создания этой контрольной точки всё работало прекрасно.

С видеодровами всё в порядке: Blender на GPU отлично рендерит.

Полный вывод консоли здесь: https://pastebin.com/ZKHjmxFR

Что происходит?

OS - Manjaro

Update: вот здесь описание точно такой же проблемы: https://github.com/ValveSoftware/steam-for-linux/issues/8859

Разница лишь в том, что на https://store.steampowered.com/ я залогинился без проблем.

 ,

Mapper720
()