Назад | Перейти на главную страницу

Найти (неиспользуемые пакеты в CentOS / Fedora?

Коротко: Из всех установленных пакетов (rpm) я хотел бы выделить те, которые не использовались (например, за последние 6 месяцев).

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

Однако с годами было установлено множество пакетов (через yum), некоторые из которых, насколько мне известно, больше не используются. Я хочу избавиться от них, поскольку они негативно влияют на использование ресурсов и общую безопасность системы.

Я ищу лучший способ найти неиспользуемые пакеты.

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

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

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

Есть ли более изобретательные способы добиться этого?

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

Предположение:

  • время включено. Если вы используете параметр монтирования noatime, то время доступа к файлам не будет обновляться и не может использоваться для определения того, к каким файлам осуществляется доступ. Обычно noatime устанавливается в файловой системе, чтобы избежать штрафа за запись.

Отказ от ответственности: Этот метод сопряжен с некоторыми рисками, которые вам необходимо учитывать. Например, если ваш сервер работает пару лет, могут быть запущены демоны, использующие старые файлы, к которым вы не обращались с момента запуска сервера / демона. Есть много других рисков, которые следует учитывать, но вы спросили, поэтому вот один метод, с которого я мог бы начать. Это по-прежнему требует от человека определения того, что можно безопасно удалить. Не следует автоматизировать удаление пакетов с помощью этого метода. Это только для образовательных целей.

Составьте список всех установленных RPM.

rpm -qa | sort -n > /dev/shm/all.txt

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

YEAR=`date -d "one year ago" '+%Y'`
# YEAR=2014
OFS="$IFS";IFS=$'\n';stat --printf="%y %n\n" $(ls -tr $(find /bin /boot /etc /lib /lib64 /sbin /usr /var -type f ! -name "*~" ! -name "*.gz" ! -name "*.tar")) | grep ^${YEAR} | awk {'print $NF'} > /dev/shm/recent.txt;IFS="$OFS";
FILECOUNT=`egrep -c ^.+ /dev/shm/recent.txt`

Скопируйте нашу базу данных RPM на RAM-диск, чтобы мы не злоупотребляли сервером. Убедитесь, что у вас есть как минимум 100 МБ свободного места или около того. например df -Ph / dev / shm

mkdir --mode=0700 /dev/shm/rpmdb
rsync -a /var/lib/rpm/. /dev/shm/rpmdb/.

Найдите RPM, связанные с нашим списком latest.txt. Это займет некоторое время. Бьюсь об заклад, кто-то может найти более эффективные, быстрые и умные способы сделать этот шаг. Я бы сделал это во время сеанса экрана.

renice 19 -p $$ > /dev/null 2>&1
printf "${FILECOUNT} files to iterate through."
> /dev/shm/recent_packages.txt
for file in `cat /dev/shm/recent.txt`
do
rpm --dbpath /dev/shm/rpmdb -q --whatprovides ${file} >> /dev/shm/recent_packages.txt 2>/dev/null
# optional status indicator.
printf "."
done

Удалите из нашего списка файлы, не принадлежащие пакету RPM из результатов поиска.

grep -v "not owned by" /dev/shm/recent_packages.txt | sort -n | uniq > /dev/shm/recent_sorted.txt

Различайте вывод. Опять же, это не совсем полезно само по себе. Вам нужно будет определить, почему файлы из этих пакетов не были доступны.

diff -u /dev/shm/recent_sorted.txt /dev/shm/all.txt | grep '^+'

Вы можете перечислить содержимое RPM с помощью rpm -ql пакет. Вот результат на одной из моих виртуальных машин. Как видите, в моем случае это не совсем полезно.

+++ /dev/shm/all.txt    2014-12-31 20:50:06.521227281 +0000
+basesystem-10.0-4.el6.noarch
+dhcp-common-4.1.1-43.P1.el6.centos.x86_64
+filesystem-2.4.30-3.el6.x86_64
+rootfiles-8.1-6.1.el6.noarch

Мне нужно сохранить файловую систему и базовую систему, несмотря на то, что к этим файлам не обращались какое-то время. Примечание: в какой-то момент я включил noatime

Я удалил dhcp-common и связанный с ним пакет dhclient, поскольку мне никогда не понадобится DHCP в моем конкретном случае использования. Я понимаю, что этот метод не совсем эффективен, но он должен дать вам отправную точку для каждой уникальной роли ваших серверов. С Новым Годом!

Не знаю, есть ли на это правильный ответ ...

Важно отметить, что посторонние пакеты часто устанавливаются во многих развертываниях Linux общего назначения.

Большинство инженеров не выбирают вручную отдельные устанавливаемые программные пакеты, а выбирают их по логическим группам приложений. (веб-сервер, почтовый сервер, NFS-сервер) или системные роли (сервер, рабочая станция, минимальная).

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

Безопасность зависит не только от того, что установлено ... Это скорее функция того, что фактически работает в системе; а именно демоны, сетевые службы, открытые порты, процессы и т. д.

Что касается использования ресурсов, вы теряете дисковое пространство только из-за установки неиспользуемого программного обеспечения. Процесс не будет потреблять ресурсы ЦП или ОЗУ, пока не будет выполнен. Так что последствия невелики. Если бы я был работодателем / менеджером, я бы посоветовал обратить ваше внимание на другие вещи. Не этот.

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

фрагмент из одного из моих списков пакетов кикстарта, с группами пакетов и несколькими дополнительными пакетами ...

%packages

@ base
@ core
@ cifs-file-server
@ compat-libraries
@ console-internet
@ development
@ mail-server
@ nfs-file-server
@ network-server
@ network-tools
@ system-management
@ system-admin-tools
@ web-server

yum-fastestmirror
rpm-devel
e2fsprogs
grub
kernel-devel
net-snmp-utils
screen