Пакетный менеджер 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 не кучу раз, а заставили его один раз прогрузить метаданные и потом общались с ним по душам.
Да, «прогрузка» дико бесит, как в dnf, так и в его графическом фронтенде dnfdragora.
В urpmi и rpmdrake (GUI в Mageia) «прогрузка» работает в несколько раз быстрее, хотя там тоже запускается заново при каждом запуске.
Я бы не сказал, что в несколько раз быстрее. Актуальные версии dnfdragora не пытаются обновить метаданные, если включен systemd-таймер dnf-makecache.timer, а дальше формирование древа пакетов там не особо-то медленное, точно не в несколько раз медленнее, чем в rpmdrake, а, может, и быстрее.