Skip to content

Latest commit

 

History

History
173 lines (120 loc) · 16.9 KB

README.ru.md

File metadata and controls

173 lines (120 loc) · 16.9 KB

pkgsizes

Скрипт выводит таблицу с РЕАЛЬНЫМИ размерами пакетов Arch Linux.

ArchLinux AUR package made-with-python GPL license

Name               Installed_Size  Depends_On  Full_Size  Used_By  Shared_Size  Relative_Size
libreoffice-still  416.7MiB        161         1.4GiB     0        0.0          638.0MiB
chromium           161.1MiB        214         1.1GiB     0        0.0          189.3MiB
.....
glibc              41.4MiB         4           51.1MiB    728      58.2KiB      41.4MiB
icu                35.1MiB         9           202.9MiB   155      231.9KiB     35.4MiB
.....

Скрипт обходит дерево зависимостей для каждого установленного пакета из локальной базы данных и выводит таблицу с полями:

  • Name - имя пакета;
  • Installed_Size - собственный (установленный) размер;
  • Depends_On - количество всех зависимостей;
  • Full_Size - полный размер пакета со всеми зависимостями;
  • Used_By - количество пакетов, которые используют данный пакет;
  • Shared_Size - разделяемый размер, который приходится на каждый пакет, использующий этот пакет;
  • Relative_Size - относительно честный размер, который включает собственный размер и сумму разделяемых размеров всех используемых пакетов.

Таблица отсортирована по полю Relative_Size в порядке убывания.

Особенности

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

Альтернативная реализация

В репозитории представлена версия скрипта 'pkgsizes_pactree.py', которая отличается тем, что добивается полного соответствия результатов с выводом команды 'pactree -r -u'. Хотя ценой этому может стать небольшое расхождение в количестве зависимых и требуемых пакетов. См. раздел 'Проблема нескольких провайдеров одного пакета' в подробном описании.


Установка

Предварительные требования:

  • базовые утилиты Linux: bash, column, sort, less, awk,..
  • Python 3.6

Просто скопировать скрипт в текущую директорию:

curl -LO https://github.com/AndreyBalandin/archlinux-pkgsizes/raw/master/pkgsizes.py

Использование

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

Запустить скрипт и сохранить таблицу в файл:

python3 pkgsizes.py > pkgsizes.txt

В стандартный поток выводится только таблица. В поток ошибок выводятся предупреждения и дополнительная информация.

Посмотреть всю таблицу:
cat pkgsizes.txt | column -t | less

Первые 20 строк - пакеты с самыми большими относительными размерами:
cat pkgsizes.txt | head -20 | column -t | less

Отфильтровать пакеты с Python:
cat pkgsizes.txt | grep python | column -t | less

Сортировка по Installed_Size (2 колонка) по убыванию:
cat pkgsizes.txt | sort -hrk 2 | column -t | less

Показать только колонки Name(1) и Relative_Size(7):
cat pkgsizes.txt | awk '{print $1" "$7}' | column -t | less

Вывести Name(1) и Relative_Size(7) тех строк, у которых поле Used_By(5) равно 0, т.е. пакеты, не используемые другими пакетами:
cat pkgsizes.txt | awk '$5 == 0 { print $1" "$7 }' | column -t | less


Подробное описание

Зачем нужен скрипт

Для ответа на вопрос: "Сколько в реальности занимает установленный пакет?".

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

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

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

Можно по-разному трактовать таблицу. Например, можно сказать, что чем ближе значения Installed_Size и Relative_Size, тем лучше пакет вписан в систему - скорее всего, его зависимости интенсивно используются другими пакетами. А значение Full_Size отвечает на умозрительный вопрос: какого размера была бы пакетная база, если бы в абсолютно пустой системе был установлен этот пакет.

Кому скрипт может пригодиться

  • Тем, кто хочет быстро проверить, нет ли в системе больших ненужных пакетов.

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

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

Как скрипт работает

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

Значения вычисляются следующим образом:

  • Installed_Size = установленный размер берется из базы данных;
  • Depends_On = количество всех уникальных пакетов, входящих в дерево зависимостей данного пакета;
  • Full_Size = Installed_Size + сумма размеров всех уникальных пакетов, входящих в дерево зависимостей данного пакета;
  • Used_By = количество пакетов, у которых в дереве зависимостей присутствует данный пакет;
  • Shared_Size = Installed_Size / Used_By: размер, разделяемый между всеми использующими его пакетами;
  • Relative_Size = Installed_Size + сумма Shared_Size всех уникальных пакетов, входящих в дерево зависимостей данного пакета.

Простейший пример дерева зависимостей (в скобках размер пакета):

     A(5)    B(2)
     /  \   /   \
 C(1)   D(10)   E(3)
                 |
                F(4)

Результатом будет таблица:

Name  Installed_Size  Depends_On  Full_Size  Used_By  Shared_Size  Relative_Size
B            2             3         19         0          0            12
A            5             2         16         0          0            11
D           10             0         10         2          5            10
E            3             1          7         1          3             5
F            4             0          4         2          2             4
C            1             0          1         1          1             1

Посмотрим, как считается относительный размер пакета 'B':
собственный установленный размер (2) + разделенные размеры пакетов D, E, F (5 + 3 + 2).
Разделенный размер D равен 5, потому что он делится между A и B.
Разделенный размер F равен 2, потому что он делится между B и E.

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

Проблема нескольких провайдеров одного пакета

При обходе дерева зависимостей может возникнуть следующая коллизия.
У пакета может существовать зависимость, функциональность которой в системе могут обеспечивать несколько пакетов-провайдеров. Например, у пакета 'chromium' есть зависимость 'ttf-font', для которой провайдерами могут выступать пакеты шрифтов: 'ttf-dejavu', 'ttf-droid', 'ttf-liberation',... В данном случае для дерева зависимостей будет выбран первый из них - 'ttf-dejavu'. Так поступает и утилита 'pactree'. Но если запустить 'pactree' с ключом -r, то для всех пакетов шрифтов будет указан пакет 'chromium', как Required_By - требующий. Хотя в дереве 'chromium' фигурировал только один из них, как и было сказано.

В этом есть логическая несостыковка. Но утилита 'pactree' служит для анализа одного пакета, поэтому такие нюансы там не существенны. Но для чистоты анализа и проверки результатов с помощью, в том числе, и 'pactree' была разработана альтернативная версия скрипта - 'pkgsizes_pactree.py'.

В версии 'pkgsizes_pactree.py' проблема решена следующим образом.
Дерево зависимостей для каждого пакета строится не только сверху вниз, но и снизу вверх. При построении "сверху-вниз" в случае нахождения нескольких провайдеров для одного пакета используется первый провайдер - как в основной версии программы и в команде pactree <package>. А для дерева "снизу-вверх" используются все провайдеры, только в этом случае можно учесть полное количество Used_By. И только так можно гарантировать совпадение результатов с командой pactree -r <package>. В итоге, вычисляемые поля - 'Shared_Size' и 'Relative_Size' у двух этих версий программы могут незначительно отличаться.

Из-за дублирования процесса обхода дерева зависимостей версия 'pkgsizes_pactree.py' работает медленнее, чем основная реализация. Поэтому эту версию предлагается использовать для поиска расхождений с 'pactree', если это критично. Для заявленных целей программы полностью подходит основная версия - 'pkgsizes.py'.


Идея скрипта

Необходимость отсортировать пакеты по размерам привела на ветку форума, где Allan McRae выложил скрипт 'bigpkg' для анализа пакетов по их относительному размеру.
Вот эта ветка: https://bbs.archlinux.org/viewtopic.php?id=73098

Из того скрипта и была взята идея об относительно честном размере. Скрипт был написан с нуля с более питонячим подходом. Были скорректированы небольшие неточности подсчета зависимостей. А главное, все вычисляемые значения сейчас не скрываются от пользователя, а показываются в таблице. Это больше соответствует духу Arch Linux.

Благодарности

Основано на идее скрипта:
bigpkg - find packages that require a lot of space on your system
Copyright © 2009-2011 Allan McRae allan@archlinux.org

Лицензия

pkgsizes - print a table with ACTUAL sizes of packages in Arch Linux
Copyright © 2018 Andrey Balandin
Released under the GPL3 License.