NixTux https://nixtux.ru На этом сайте делимся опытом, скриптами и советами в Linux и Свободных программах Mon, 09 May 2022 21:33:16 +0000 ru-RU hourly 1 https://wordpress.org/?v=6.0.2 Сборка бутылок https://nixtux.ru/1241 https://nixtux.ru/1241#respond Mon, 09 May 2022 21:33:16 +0000 https://nixtux.ru/?p=1241 Вы, говорят, пакеты собираете? А бутылки не пробовали? Больше же платят.

]]>
https://nixtux.ru/1241/feed 0
Упаковка снимка BTRFS в сжатый файл-образ https://nixtux.ru/1236 https://nixtux.ru/1236#respond Sat, 30 Apr 2022 22:06:45 +0000 https://nixtux.ru/?p=1236 Читать далее Упаковка снимка BTRFS в сжатый файл-образ]]> Рассмотрим упаковку подраздела (subvolume) BTRFS в сжатый файл-образ.


Сначала делаем снимок в режиме только чтения:
btrfs subvol snapshot -r orig snapshot

Типовая схема передачи всего подраздела (подтома) BTRFS без сжатия такова:
btrfs send snapshot | ssh ip@host btrfs receive /path
ssh может стоять по любую сторону, также его может вовсе не быть. В результате подобной команды на приемнике будет подраздел в режиме только для чтения /path/snapshot. С него можно снять снимок (снапшот) уже в режиме чтения. Отправлять (send) можно только снимок в режиме только чтения (ключ -r у btrfs subvol snapshot).

Суть нашего трюка в том, что мы отправляем поток данных в программу для сжатия и выводим результат в файл. Пример:
btrfs send snapshot | zstd -16 -T0 -vv -o /path/to/file.img.zst
Или то же самое с сохранением в файл средствами шелла, а не самой zstd:
btrfs send snapshot | zstd -16 -T0 -vv > /path/to/file.img.zst
Вместо zstd можно использовать gzip, xz или любую другую программу для сжатия.

Получается, что весь снимок упаковался в файл, с которым можно сделать, что угодно, например, с помощью split(1) нарезать на куски, записать на DVD-болванки и положить их в шкаф.

Восстановление из снимка будет производиться как-то так:
zstd -d /path/to/file.img.zst | btrfs receive /path

]]>
https://nixtux.ru/1236/feed 0
Установка DragonFlyBSD на SSD через виртуальную машину https://nixtux.ru/1230 https://nixtux.ru/1230#respond Sat, 16 Apr 2022 14:48:43 +0000 https://nixtux.ru/?p=1230 Читать далее Установка DragonFlyBSD на SSD через виртуальную машину]]> В этом видео:
* подключили SSD-диск к переходнику SATA-USB, по USB к компьютеру
* пробросили USB-переходник в виртуальную машину (virt-manager на ROSA Fresh XFCE)
* загрузили LiveCD DragonFlyBSD
* затерли SSD-диск из-под DragonFlyBSD
* разметили диск (HAMMER2), разобрали кратко понятие слайсов и разделов в BSD-разметке
* установили ОС DragonFlyBSD 6.2.1
* запустили только что установленную ОС с SSD в виртуальной машине

Документация по DragonFlyBSD: https://www.dragonflybsd.org/docs/handbook/

Подписывайтесь:
https://nixtux.ru
https://vk.com/nixtux
https://t.me/nixtux

]]>
https://nixtux.ru/1230/feed 0
Несколько действий в dnf подряд и интерактивно в dnf shell https://nixtux.ru/1221 https://nixtux.ru/1221#respond Mon, 11 Apr 2022 18:45:59 +0000 https://nixtux.ru/?p=1221 Читать далее Несколько действий в dnf подряд и интерактивно в dnf shell]]> Пакетный менеджер dnf работает в целом быстро, однако немало времени занимает прогрузка метаданных, которые содержат в т.ч. список всех файлов всех пакетов. Низкая скорость их прогрузки особенно чувствуется на процессорах с частотой одного ядра меньше 2 ГГц. Иногда бывает нужно выполнить несколько действий одновременно, например, сделать запрос repoquery, обновить систему (upgrade), установить какой-то пакет, а ждать прогрузки метаданных по несколько секунд или даже несколько десятков секунд на Intel Atom N450 на каждое действие не хочется. На помощь приходит dnf shell — интерактивная командная оболочка.

Картинка ниже показывает, что мы делаем:

И так, запускаем dnf shell, ключом командной строки подключив дополнительный репозиторий:

localhost ~ # dnf --repofrompath libarchive,http://abf-downloads.rosalinux.ru/rosa2021.1/container/4020183/x86_64/main/release/ shell
Добавлен libarchive репозиторий из http://abf-downloads.rosalinux.ru/rosa2021.1/container/4020183/x86_64/main/release/
Последняя проверка окончания срока действия метаданных: 0:06:48 назад, Пн 11 апр 2022 21:27:10.
>

dnf shell запустился, метаданные прогрузились, dnf ждет нашей команды. Скомандуем ему запланировать обновление системы:

> upgrade

Команда и вместе с ней расчет транзакции на обновление были выполнены почти моментально, если процессор слабый, то разница по скорости с выполнением dnf upgrade в обычной консоли хорошо заметна на глаз.
Теперь скомандуем вывести запланированную транзакцию:

> transaction
========================================================
 Пакет    Архитектура
                 Версия   Репозиторий             Размер
========================================================
Обновление:
 bsdtar   x86_64 3.5.3-2  libarchive               56 k
 lib64archive18
          x86_64 3.5.3-2  libarchive              311 k
 lib64python3.8
          x86_64 3.8.11-8 mirror-rosa-x86_64-main 1.0 M
 python3  x86_64 3.8.11-8 mirror-rosa-x86_64-main 9.3 M

Результат транзакции
========================================================
Обновление  4 Пакета

Теперь добавим в запланированную транзакцию установку пакета bsdcpio и вновь выведем запланированную траназакцию, которая будет включать в себя и обновление, и установку пакета:

> transaction
==========================================================
 Пакет      Архитектура
                   Версия   Репозиторий             Размер
==========================================================
Установка:
 bsdcpio    x86_64 3.5.3-2  libarchive               28 k
Обновление:
 bsdtar     x86_64 3.5.3-2  libarchive               56 k
 lib64archive18
            x86_64 3.5.3-2  libarchive              311 k
 lib64python3.8
            x86_64 3.8.11-8 mirror-rosa-x86_64-main 1.0 M
 python3    x86_64 3.8.11-8 mirror-rosa-x86_64-main 9.3 M

Результат транзакции
==========================================================
Установка   1 Пакет
Обновление  4 Пакета

Командой run можно запустить выполнение транзакции.
Вместо transaction можно писать ts, вместо upgrade — up.

У меня есть желание сделать библиотеку и/или утилиту для взаимодействия с dnf shell и использовать ее в скриптах подбора и установки проприетарных драйверов NVidia, чтобы они запускали dnf не кучу раз, а заставили его один раз прогрузить метаданные и потом общались с ним по душам.

]]>
https://nixtux.ru/1221/feed 0
Из Москвы в Холковский монастрырь с пещерами https://nixtux.ru/1163 https://nixtux.ru/1163#respond Sun, 27 Mar 2022 13:46:31 +0000 https://nixtux.ru/?p=1163 Читать далее Из Москвы в Холковский монастрырь с пещерами]]> В Белгородской области есть Холковский монастырь, на территории которого есть уникальные, очень интересные меловые пещеры. Без машины добраться туда не очень просто, опишу, как сам добирался туда и обратно, и покажу фотографии. Процесс поездки туда не менее интересен, чем сами пещеры.

Маршрут: от Москвы до монастыря, без автомобиля.

Ехал так:

  1. Москва-Воронеж поездом. От Москвы до Воронежа на поезде в ночь, вечером в 23 часа выехал, в 7 утра приехал. Хорошо тем, что можно поспать и выспаться в поезде, не теряя время на дорогу.
  2. Воронеж-Старый Оскол автобусом. Свободных в автобус из Воронежа до Чернянки — ближайшего к Холковсковским пещерам крупного населенного пункта — уже не было, а заранее купить билеты я не пытался. Поэтому пришлось купить в кассе автовокзала Воронежа билет на ближайший автобус от Воронежа до Старого Оскола, стоил он около 350 руб.
  3. Старый Оскол-Чернянка автобусом. Заранее нашел на Яндекс Картах автовокзал Старого Оскола и якобы его сайт av4725.ru. Форма поиска билетов открывает сайт avokzaly.ru того же владельца. Сайт написан на PHP, судя по ошибке, которую он мне выдал при попытке купить билет (это ни хорошо, ни плохо, просто заметил), со второго раза ошибки не было. Успешно купил билет на автобус Старый Оскол — Чернянка за примерно 170 руб. Автобус из Воронежа по расписанию должен был прийти в 13:47, а этот уходил в 14:00, однако приехали из Воронежа раньше, времени на пересадку было с запасом, даже успел подзарядить телефон в специальной стойке на Старооскольском автовокзале.
  4. Чернянка-монастырь пешком. Автобус №102/103 от Чернянки до монастыря ходит лишь 2-3 раза в день (смотрите расписание по Яндекс Картам, строя маршрут), как минимум, утром в 8:20 и вечером в 17 с чем-то. Решил дойти пешком, 12 км, шел около трех часов.

Существует местное такси в Чернянке, телефон: +7 951 152-21-21. Автопарк состоит из Шкод на газе (метане). Телефон узнал случайно от местных по пути пешком, которые попросили вызвать им такси. Это такси готово приехать и в соседние населенные пункты, в т.ч. Ездочное, Холки и пр. Я на нем потом ехал от монастыря в Новый Оскол, но об этом ниже.

Для экономии заряда на телефоне строил маршрут в Яндекс Картах, потом включал режим энергосбережения (есть такая функция в LineageOS на ею прошитой Motorola G5S), авиарежим и отключал геопозицию, затем иногда включал только геопозицию, ждал определения местоположения, удостоверялся, что иду правильно, и отключал ее.

Чернянка — это довольно большой поселок городского типа, только чтоб дойти от автостанции (ж/д станция рядом с ней) до окраины нужно минут 50. По пути есть магазины и придорожные забегаловки, где можно поесть.

Вид на железнодорожную станцию Чернянка:
Вид на железнодорожную станцию Чернянка
Что-то у жд станции Чернянка

Обращает на себя внимание очень хорошее состояние сел и дорог в Белгородской области.



Даже вот такие декоративные сооружения есть:

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

Вид на монастырь издалека:

Пришел туда поздно, уже после 18-ти часов. На сайте монастыря (holkovskiy-monastyre.ru) написано, что якобы существует гостиница при монастыре, но на самом деле её там нет и вроде бы ее строят. Ночевать там негде. В Чернянке и в центральной гостинице, и у некой Людмилы Викторовны +7 910 366-93-90, которая сдает что-то в районе ж/д станции 652-ой км на окраине Чернянки, к которой отправили из гостиницы, свободных мест не было. Пришлось судорожно соображать, что делать, предположил, что ж/д вокзал в Новом Осколе работает круглосуточно, телефон почти сел, выяснять было некогда.

Позвонил в такси из Чернянки (+7 951 152-21-21), спросил, можно ли доехать от монастыря до ж/д вокзала Нового Оскола, сказали типа без базара, 600 рублей, приехали за 15 минут (быстрее доехать от Чернянки до монастыря чисто физически невозможно). По стоимости — почти как в соседний район Москвы съездить, даже дешевле, чем это иногда стоит.
Оказалось, что в Новом Осколе нет железнодорожного вокзала, там просто станция, которая была уже закрыта (было где-то 20:30).

Нашел на карте единственную в городе гостиницу «Белогорье». Позвонил, оказалось, что свободные места есть, объяснили, как до них дойти, еле нашел вход.

Если в номере живет 2 случайных человека, то стоит 590 рублей в сутки, если один, то 1210 руб. Оплатил 1210 руб., оплата только наличкой, но, если что, рядом есть отделения и, наверное, банкоматы Сбербанка и Московского индустриального банка. Наличка у меня с собой была на всякий случай, еще в Москве в банкомате Промсвязьбанка снял с карты Юмани банкнотами по 50 и 500 руб. Отзывы о гостинице на Яндекс Картах плохие, но мне понравилось. Да, в коридоре местами падает краска со стен, но в номере такой проблемы нет, в номере электроводонагреватель (горячая вода без проблем), раковина, унитаз, душевая, жидкое мыло, туалетная бумага, постельное белье, одеяло, большое и маленькое полотенца, батарея (на которой можно просушить одежду и обувь, но поставить на батарею что-либо не получится, острая вершина), выключенный холодильник (с грязью вокруг обода), маленький телевизор (включать не пробовал), розетки (свободны 2 штуки по 2 разъема, плюс, наверное, есть еще для телевизора и холодильника), электрочайник, почти без накипи, тарелка и стеклянный стакан, окно с занавесками, стол, мягкий стул, ковер на полу. В номере тепло. За такие деньги вообще прекрасно. Гостиница государственная (МУП — муниципальное унитарное предприятие).

Рано утром, проснувшись в 5 утра, покинул эту хорошую гостиницу в Новом Осколе и пешком за 10 минут дошел до местной ж/д станции, в 6 утра с нее уходила электричка, на которой можно доехать до Чернянки. В этом время здание станции еще закрыто, посадка на поезд просто с перрона. На станции садились либо только в один, либо еще кто-то был, не помню, но народу мало, электричка была почти пустой. Автоматика объявила, что поезд прибывает на третий путь, но какой там путь третий, непонятно. Прибыл на путь по середине, который третий с обоих сторон (при объявлении в Чернянке говорят, что путь третий со стороны станции). Просто сел в поезд, подошел кондуктор, банковской картой заплатил 60 рублей за билет.

Утром (26 марта 2022 года) было холодно, идти пешком не хотелось, в помещении автостанции дождался автобус №102/103 в 8:20, заранее купив билет за, кажется, 40 руб. в кассе этой автостанции, работающей с 5 до 20 часов. На автостанции в Чернянке телефон зарядить негде, разве что просить работников. Автобус довез прям до монастыря, пройти от остановки нужно было минут 5.

Вот карта:

1 — автобусная остановка, 3 — надземная церковь, где проходят службы, 4 — надземная церковь на горе (в ней службы проходят очень редко), 5 — вход в пещеры, 2 — туалет, церковная лавка, сувенирная лавка.

Почти каждую субботу службы проходят в подземном храме (в пещере), начало в 9 утра, но в этот раз было в надземном.

В сувенирной лавке можно оплатить экскурсию по пещерам, стоит 200 рублей, работает с 10 утра, я туда пришел ближе к 11, на 11:15 была назначена экскурсия. Оплата только наличными (говорят, что мобильная связь там плохо работает, вполне верю — там низина), крупные купюры пришлось разменять, купив свечи в соседней церковной лавке.

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


Подземная церковь с выточенными на стенах иконами и изображениями:


Видео прохода по пещерному «корридору» (не знаю, как правильно назвать ход между пещерами):

В пещерах держится температура около +10°C круглогодично, воздух приятный, утверждают, что целебный, т.к. содержит много веществ. Чтоб им подышать, как я понял, нужно попасть либо на экскурсию (идет около 20 минут), либо на службу в большинство суббот.

Немного надземных видов:





С утра был слышен гул самолетов, скорее всего, военных.

Интересный памятник на местном кладбище:


Спокойно спи,
Здесь ничего не происходит,
По-прежнему за ночью день приходит.
Пусть оберет покой душа твоя,
Мы помним о тебе.
Семья твоя

Обратно в Москву ехал проще: пешком дошел до Чернянки (можно было бы подождать автобус, прибыть в Чернянку получилось бы чуть раньше, но не хотелось ждать его 2 часа, а погода была хорошей), на электричке в 16:06 за час доехал до Старого Оскола (та же самая электричка, на которой ехал утром, посадка тоже прямо с перрона, оплата кондуктору в поезде), далее на поезде Белгород-Москва доехал до Москвы, билеты на поезд покупал заранее, снова спал в поезде, что очень удобно.

В Старом Осколе полноценный железнодорожный вокзал, в зале ожидания можно зарядить телефон, там, как и в Воронеже, стоят лавки, между которыми розетки с двумя USB-портами и вилкой 220 вольт. В розетку подключал ноутбук с Росой и немного работал. На вокзале пусто, поезда бывают редко, поесть негде. Как понял исходя из надписи на привокзальной площади, эта ветка железной дороги была построена в 1943 году для военных целей.

На карте ниже маршрут поезда, на котором я ехал.

Как видите, есть иной маршрут из Москвы в Белгород — через Орёл и Курск, на нем больше поездов, а на этом вокзал в Старом Осколе безмятежно пустует, дожидаясь редкого гостя.

Хотелось есть, на вокзале заведений не было, вроде были какие-то непонятные заведения недалеко от вокзала, но было 3 с половиной часа свободного времени, на такси доехал до какого-то торгового центра, где можно было поесть. Кстати, в Жар-Пицце «большой» картофель фри больше, чем в Бургер-Кинге.

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

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

Решил почитать про эту икону, вот, что выдал Google:

А вот, что выдал Яндекс:

Выдача Яндекса оказалась намного лучше и ответила на все вопросы, когда как Google в пределах первой страницы результатов поиска (дальше первой не смотрел) не выдал вообще ничего, что я хотел. Редко можно (было?) встретить столь большую разницу в качестве поисков Гугла и Яндекса. Сейчас просто стоит вопрос о замене поисковика по умолчанию в пакете браузера Chromium в Росе, а двое моих коллег утверждали, что стали замечать большую разницу в выдаче Google и Yandex, хотя раньше не замечали ее. Интересно.

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

Если есть вопросы, пишите в комментарии.

]]>
https://nixtux.ru/1163/feed 0
Снятие дампов трафика в Linux со сжатием и ротацией https://nixtux.ru/1159 https://nixtux.ru/1159#respond Sun, 06 Mar 2022 11:50:08 +0000 https://nixtux.ru/?p=1159 Читать далее Снятие дампов трафика в Linux со сжатием и ротацией]]> Задача: для отладки странных проблем в течение нескольких часов снимать дампы всего трафика на сервере.
Однако трафика много, а места на диске не очень много.

Утилита для снятия дампов ­— tcpdump — умеет автоматически ротировать и сжимать дампы. Для сжатия она вызывает программу или скрипт, указанный в ключе -z, с путем к файлу первым аргументом. Пример команды:
tcpdump -G 3600 -w 'tcpdump_%Y-%m-%d_%H:%M:%S.pcap' -z xz
Будут писаться файлы-дампа с именами вида tcpdump_2022-03-06_14:26:50.pcap, затем раз в 3600 секунд (раз в час) будет начинаться запись в новый файл и будет вызываться сжатие:
xz tcpdump_2022-03-06_14:26:50.pcap
Утилита xz(1) по умолчанию удаляет исходный файл после сжатия, tcpdump_2022-03-06_14:26:50.pcap превратится в tcpdump_2022-03-06_14:26:50.pcap.xz.

Однако я хочу сжимать с помощью zstd (потому что могу:)), а утилита zstd(1) исходный файл по умолчанию не удаляет, чтобы удаляли, нужно добавить ключ --rm. Сделаем скрипт-прослойку `zstd.sh:

#!/bin/sh
zstd --rm -10 "$1"

Указали уровень сжатия 10 и включили удаление исходного файла после сжатия. Имя сжатого файла будет таким: tcpdump_2022-03-06_14:26:50.pcap.zst.
Делаем скрипт исполняемым:
chmod +x zstd.sh
Теперь запустим tcpdump с указанием либо полного, либо относительного пути к скрипту:
tcpdump -G 3600 -w 'tcpdump_%Y-%m-%d_%H:%M:%S.pcap' -z ./zstd.sh
tcpdump -G 3600 -w 'tcpdump_%Y-%m-%d_%H:%M:%S.pcap' -z /root/zstd.sh
Обратите внимание, что если написать «zstd.sh» вместо «./zstd.sh», то будет выполнен поиск zstd.sh в $PATH, а его там нет.

Распаковать сжатый дамп можно так:
zstd -d tcpdump_2022-03-06_14:26:50.pcap.zst
xz -d tcpdump_2022-03-06_14:26:50.pcap.zst
Файл-дамп можно просмотреть в, например, Wireshark.

Если бы я дампил трафик в промышленных масштабах, то попробовал бы создать словарь для zstd (ищите по слову train в man zstd).

]]>
https://nixtux.ru/1159/feed 0
Синхронизирование аудио и видео в Kdenlive (Linux) https://nixtux.ru/1134 https://nixtux.ru/1134#respond Wed, 02 Feb 2022 18:12:38 +0000 https://nixtux.ru/?p=1134 Видео и аудио в рассинхроне, что делать, как их свести?
В этом видео показано, как подвинуть аудио относительно видео в свободном и бесплатном видеоредакторе Kdenlive.


(ссылка на YouTube: https://www.youtube.com/watch?v=4sfdSxmGQjA)

]]>
https://nixtux.ru/1134/feed 0
Зависимости в RPM. Автоматически и вручную проставляемые Requires и Provides. Общая концепция https://nixtux.ru/1124 https://nixtux.ru/1124#respond Mon, 17 Jan 2022 06:28:27 +0000 https://nixtux.ru/?p=1124 Читать далее Зависимости в RPM. Автоматически и вручную проставляемые Requires и Provides. Общая концепция]]> В системе зависимостей RPM-пакетов есть 2 основные сущности:

  • Provides — предоставляемые пакетом «возможности»,
  • Requires — зависимости пакета — какие «возможности» нужны для работы этого пакета.


В этой статье рассмотрим их общую концепцию. Это актуально и для пользователей, и для сборщиков пакетов. Рассматривать будем на примере дистрибутива ROSA 12 (rosa2021.1).

В Provides всегда есть «имя_пакета = эпоха:версия-релиз», дополнительно могут быть произвольные провайды, как версионированные (foo = X), так и нет (foo).
Requires тоже могут быть как версионированными, так и нет.

Существует система автоматизации генерации провайдов (Provides) и зависимостей (Requires), которая позволяет там, где есть таковая техническая возможность, автоматизировать расставление зависимостей между пакетами: один пакет предоставляет «возможность» (Provides), а другой ее требует (Requires).

Provides и Requires могут быть проставлены как автоматически, так и вручную. Команда вида dnf install foo поставит пакет, имеющий foo в Provides, не обязательно называющийся foo.

Рассмотрим пример.
Посмотрим зависимости установленного пакета patchelf:

$ rpm -q --requires patchelf
libm.so.6()(64bit)
libm.so.6(Glibm_2.14)(64bit)
libm.so.6(Glibm_2.2.5)(64bit)
libm.so.6(Glibm_2.3.4)(64bit)
libm.so.6(Glibm_2.32)(64bit)
libm.so.6(Glibm_2.33)(64bit)
libm.so.6(Glibm_2.4)(64bit)
libgcc_s.so.1()(64bit)
libgcc_s.so.1(GCC_3.0)(64bit)
libm.so.6()(64bit)
libstdc++.so.6()(64bit)
libstdc++.so.6(CXXABI_1.3)(64bit)
libstdc++.so.6(GlibmXX_3.4)(64bit)
libstdc++.so.6(GlibmXX_3.4.9)(64bit)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsXz) <= 5.2-1
rtld(GNU_HASH)

То же самое для любого пакета из репозитория, в т.ч. не установленного, можно посмотреть через пакетный менеджер dnf:
sudo dnf repoquery --requires patchelf

Выше перечислено по одной зависимости на строку. Давайте узнаем, какой же пакет предоставляет libm.so.6()(64bit):

$ rpm -q --whatprovides 'libm.so.6()(64bit)'
glibc-2.33-4.x86_64

Если хочется узнать только имя пакета, без версии и пр.:

$ rpm -q --qf '%{name}\n' --whatprovides 'libm.so.6()(64bit)'
glibc

Сделать то же самое для всех пакетов в репозитории, а не только уже установленных, можно так:
sudo dnf repoquery --whatrequires 'libm.so.6()(64bit)'
sudo dnf repoquery --qf '%{name}' --whatrequires 'libm.so.6()(64bit)'

Посмотрим все провайды пакета glibc:

$ rpm -q --provides glibc
/sbin/ldconfig
config(glibc) = 6:2.33-4
glibc = 6:2.33-4
glibc(x86-64) = 6:2.33-4
ld-linux-x86-64.so.2()(64bit)
ld-linux-x86-64.so.2(GLIBC_2.2.5)(64bit)
ld-linux-x86-64.so.2(GLIBC_2.3)(64bit)
ld-linux-x86-64.so.2(GLIBC_2.4)(64bit)
ld.so = 6:2.33-4
ldconfig = 6:2.33-4
lib64nss_files2 = 6:2.33-4
libBrokenLocale.so.1()(64bit)
libBrokenLocale.so.1(GLIBC_2.2.5)(64bit)
libCNS.so()(64bit)
libGB.so()(64bit)
libISOIR165.so()(64bit)
libJIS.so()(64bit)
libJISX0213.so()(64bit)
libKSC.so()(64bit)
libSegFault.so()(64bit)
libanl.so.1()(64bit)
libanl.so.1(GLIBC_2.2.5)(64bit)
libc.so.6()(64bit)
libc.so.6(GLIBC_2.10)(64bit)
libc.so.6(GLIBC_2.11)(64bit)
libc.so.6(GLIBC_2.12)(64bit)
libc.so.6(GLIBC_2.13)(64bit)
libc.so.6(GLIBC_2.14)(64bit)
libc.so.6(GLIBC_2.15)(64bit)
libc.so.6(GLIBC_2.16)(64bit)
libc.so.6(GLIBC_2.17)(64bit)
libc.so.6(GLIBC_2.18)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.2.6)(64bit)
libc.so.6(GLIBC_2.22)(64bit)
libc.so.6(GLIBC_2.23)(64bit)
libc.so.6(GLIBC_2.24)(64bit)
libc.so.6(GLIBC_2.25)(64bit)
libc.so.6(GLIBC_2.26)(64bit)
libc.so.6(GLIBC_2.27)(64bit)
libc.so.6(GLIBC_2.28)(64bit)
libc.so.6(GLIBC_2.29)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
libc.so.6(GLIBC_2.3.2)(64bit)
libc.so.6(GLIBC_2.3.3)(64bit)
libc.so.6(GLIBC_2.3.4)(64bit)
libc.so.6(GLIBC_2.30)(64bit)
libc.so.6(GLIBC_2.32)(64bit)
libc.so.6(GLIBC_2.33)(64bit)
libc.so.6(GLIBC_2.4)(64bit)
libc.so.6(GLIBC_2.5)(64bit)
libc.so.6(GLIBC_2.6)(64bit)
libc.so.6(GLIBC_2.7)(64bit)
libc.so.6(GLIBC_2.8)(64bit)
libc.so.6(GLIBC_2.9)(64bit)
libdl.so.2()(64bit)
libdl.so.2(GLIBC_2.2.5)(64bit)
libdl.so.2(GLIBC_2.3.3)(64bit)
libdl.so.2(GLIBC_2.3.4)(64bit)
libm.so.6()(64bit)
libm.so.6(GLIBC_2.15)(64bit)
libm.so.6(GLIBC_2.18)(64bit)
libm.so.6(GLIBC_2.2.5)(64bit)
libm.so.6(GLIBC_2.23)(64bit)
libm.so.6(GLIBC_2.24)(64bit)
libm.so.6(GLIBC_2.25)(64bit)
libm.so.6(GLIBC_2.26)(64bit)
libm.so.6(GLIBC_2.27)(64bit)
libm.so.6(GLIBC_2.28)(64bit)
libm.so.6(GLIBC_2.29)(64bit)
libm.so.6(GLIBC_2.31)(64bit)
libm.so.6(GLIBC_2.32)(64bit)
libm.so.6(GLIBC_2.4)(64bit)
libmvec.so.1()(64bit)
libmvec.so.1(GLIBC_2.22)(64bit)
libnsl.so.1()(64bit)
libnsl.so.1(GLIBC_2.2.5)(64bit)
libnss_compat.so.2()(64bit)
libnss_db.so.2()(64bit)
libnss_dns.so.2()(64bit)
libnss_files.so.2()(64bit)
libnss_hesiod.so.2()(64bit)
libpthread.so.0()(64bit)
libpthread.so.0(GLIBC_2.11)(64bit)
libpthread.so.0(GLIBC_2.12)(64bit)
libpthread.so.0(GLIBC_2.18)(64bit)
libpthread.so.0(GLIBC_2.2.5)(64bit)
libpthread.so.0(GLIBC_2.2.6)(64bit)
libpthread.so.0(GLIBC_2.28)(64bit)
libpthread.so.0(GLIBC_2.3.2)(64bit)
libpthread.so.0(GLIBC_2.3.3)(64bit)
libpthread.so.0(GLIBC_2.3.4)(64bit)
libpthread.so.0(GLIBC_2.30)(64bit)
libpthread.so.0(GLIBC_2.31)(64bit)
libpthread.so.0(GLIBC_2.4)(64bit)
libresolv.so.2()(64bit)
libresolv.so.2(GLIBC_2.2.5)(64bit)
libresolv.so.2(GLIBC_2.3.2)(64bit)
libresolv.so.2(GLIBC_2.9)(64bit)
librt.so.1()(64bit)
librt.so.1(GLIBC_2.2.5)(64bit)
librt.so.1(GLIBC_2.3.3)(64bit)
librt.so.1(GLIBC_2.3.4)(64bit)
librt.so.1(GLIBC_2.4)(64bit)
librt.so.1(GLIBC_2.7)(64bit)
libthread_db.so.1()(64bit)
libthread_db.so.1(GLIBC_2.2.5)(64bit)
libthread_db.so.1(GLIBC_2.3)(64bit)
libthread_db.so.1(GLIBC_2.3.3)(64bit)
libutil.so.1()(64bit)
libutil.so.1(GLIBC_2.2.5)(64bit)
rtld(GNU_HASH)
should-restart = system

Сделать то же самое для не установленного пакета можно так:
sudo dnf repoquery --provides glibc

Кстати, dnf repoquery можно сокращать до dnf rq:
sudo dnf rq --provides glibc

Откуда же в пакете glibc появился провайд libm.so.6()(64bit)? Найдем эту библиотеку среди файлов этого пакета:

$ rpm -ql glibc | grep libm.so.6
/lib64/libm.so.6

Убедимся, что это 64-разрядная библиотека:

$ file $(realpath /lib64/libm.so.6)
/lib64/libm-2.33.so: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=2416a17b6d6afdf08c8bc3fd2f4e78c2353a4f88, for GNU/Linux 4.14.0, not stripped

Для пакета, в котором лежит разделяемая библиотека, RPM автоматически формирует провайд по имени библиотеки: libfoo.so.N()(64bit), где libfoo.so.N ­— это soname библиотеки, далее идет значение макроса %_arch_tag_suffix, которое пустое для 32-битных ELF-файлов и имеет значение ()(64bit) для 64-битных.

Проверим soname библиотеки:

$ patchelf --print-soname /lib64/libm-2.33.so
libm.so.6

Обратите внимание, что soname "вшит" в сам ELF-файл и чисто технически не обязан совпадать с именем файла.

Посмотрим на значение макроса %_arch_tag_suffix в 64 и 32-битных случаях:

[user@notb1 ~]$ rpm -E "%_arch_tag_suffix"
()(64bit)
[user@notb1 ~]$ setarch i386 rpm -E "%_arch_tag_suffix"

[user@notb1 ~]$

Этого макроса не было в старых версиях RPM и нет в, например, rpm-build 4.0 в ALT Linux, однако фактические провайды такие же, просто этот "суффикс" не вынесен в макрос.

Мы рассмотрели, почему у RPM-пакета glibc появился провайд (Provides) libm.so.6()(64bit). Теперь рассмотрим, почему у пакета patchelf автоматически появилась зависимость (Requires) libm.so.6()(64bit).

Здесь все просто: в исполняемом ELF-файле /usr/bin/patchelf прописана зависимость от библиотеки libm.so.6, а сам файл является 64-битным, а значит и библиотека нужна 64-битная; соединяем "libm.so.6" и "()(64bit)" и получаем "libm.so.6()(64bit)", что добавляется в зависимости пакета, в котором лежит файл /usr/bin/patchelf.

Посмотрим на список библиотек, необходимых для запуска patchelf:

$ patchelf --print-needed /usr/bin/patchelf
libstdc++.so.6
libm.so.6
libgcc_s.so.1
libc.so.6

Видите среди них libm.so.6? Это оно!

RPM также поддерживает версионирование символов в библиотеках. Среди зависимостей пакета patchelf выше была такая: libc.so.6(GLIBC_2.33)(64bit). Откуда же взялось (GLIBC_2.33)?

Посмотрим на символы, требуемые ELF-файлом:

$ readelf -a /usr/bin/patchelf | grep @GLIBC_2.33
0000004251e8  004900000007 R_X86_64_JUMP_SLO 0000000000000000 stat64@GLIBC_2.33 + 0
    73: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND [...]@GLIBC_2.33 (10)

Видим, что используется функция stat64, которая появилась в библиотеке glibc версии 2.33. Это было выяснено и записано в ELF-файл на этапе его сборки (компиляции, линковки и пр.).

Посмотрим, из какой библиотеки на самом деле подгружается символ stat64 при запуске patchelf, т.е. какая библиотека предоставляем функцию stat64:

$ LD_DEBUG=symbols /lib64/ld-linux-x86-64.so.2 /usr/bin/patchelf --help
<...>
1968:	symbol=stat64;  lookup in file=/usr/bin/patchelf [0]
1968:	symbol=stat64;  lookup in file=/lib64/libstdc++.so.6 [0]
1968:	symbol=stat64;  lookup in file=/lib64/libm.so.6 [0]
1968:	symbol=stat64;  lookup in file=/lib64/libgcc_s.so.1 [0]
1968:	symbol=stat64;  lookup in file=/lib64/libc.so.6 [0]
<...>

Последней в списке идет libc.so.6, а значит символ взят из нее. Если вы с удивлением прочитали команду выше, то рекомендую почитать man ld-linux (аналог для FreeBSD — man rtld).

Как видите, если предоставляемые библиотекой символы версионированы, то RPM определит зависимость не только от библиотеки, но и от ее минимально необходимой версии.

]]>
https://nixtux.ru/1124/feed 0
Как быстро скачать видео с GetCourse на Linux скриптом https://nixtux.ru/1118 https://nixtux.ru/1118#comments Mon, 03 Jan 2022 17:35:30 +0000 https://nixtux.ru/?p=1118 Читать далее Как быстро скачать видео с GetCourse на Linux скриптом]]> Написал простой скрипт для скачивания видео с GetCourse без перекодирования: https://github.com/mikhailnov/getcourse-video-downloader

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

Этот скрипт скачивает видео-уроки с Геткурса без перекодирования. Работает на Linux, BSD, macOS и в др. UNIX-подобных окружениях.

Для работы необходимы bash и curl.

    Сначала найдите ссылку на видео:

  1. Откройте страницу с видео в браузере Chromium / Google Chrome
  2. Нажмите правой правой кнопкой мыши на видео, выберите «Просмотреть код»
  3. В открывшемся коде найдите: <video id="vgc-player_html5_api" data-master="ДЛИННАЯ_ССЫЛКА"
  4. Скопируйте эту ссылку (ДЛИННАЯ_ССЫЛКА)

Откройте терминал и выполните команду скачивания этого скрипта:
curl -L --output /tmp/getcourse-video-downloader.sh https://github.com/mikhailnov/getcourse-video-downloader/raw/master/getcourse-video-downloader.sh

Затем запустите скрипт:
bash /tmp/getcourse-video-downloader.sh "ДЛИННАЯ_ССЫЛКА" "Имя файла.ts"

Первым аргументом идет ссылка, вторым — имя файла, куда сохранить скачанное, рекомендуемое расширение — ts.

]]>
https://nixtux.ru/1118/feed 2
Лечим ШГ в Thunderbird 91 https://nixtux.ru/1115 https://nixtux.ru/1115#respond Tue, 28 Dec 2021 07:56:10 +0000 https://nixtux.ru/?p=1115 Читать далее Лечим ШГ в Thunderbird 91]]> В Thunderbird 91 по сравнению с 78 испортилась отрисовка шрифтов. Стало ШГ. Список писем стало тяжело читать, текст писем тоже. Буквы стали как бы расплывчатыми. Вот здесь VladikSS наглядно показал проблему скриншотами: https://bugzilla.mozilla.org/show_bug.cgi?id=1732583. Как же это исправить, как сделать отрисовку букв нормальной в Thunderbird 91?

Открываем редактор расширенных настроек:

Далее нужно в поиск вставить: «gfx.webrender.force-disabled», нажать на появившийся результат поиска, чтобы он стал жирным — включенным.

Перезапустить Thunderbird. Текст снова станет легко и приятно читать.

]]>
https://nixtux.ru/1115/feed 0