Encontre (des) pacotes usados no CentOS / Fedora?

3

Resumindo: De todos os pacotes (rpm) instalados, gostaria de identificar os não utilizados (por exemplo, desde os últimos 6 meses).

Em muito tempo: tenho número de máquinas com um registro de serviço respeitável. Toda vez que eu atualizo de um release para outro, fico surpreso com a eficiência do processo de upgrade.

No entanto, ao longo dos anos muitos pacotes foram instalados (via yum), alguns dos quais eu sei que não são mais usados. Eu quero me livrar deles, pois eles têm um impacto negativo no uso de recursos e na segurança geral do sistema.

Estou procurando o melhor método para encontrar pacotes não utilizados.

Uma maneira seria filtrar manualmente os pacotes instalados? O método funciona e eu aprendo muito, mas é extremamente demorado.

Estou procurando uma maneira automatizada de identificar pacotes não utilizados para que eu possa limpá-los manualmente.

Acho que um caminho a seguir seria monitorar todos os arquivos usados em um servidor, vinculá-los aos pacotes e ver o que resta. Existe alguma coisa disponível para este propósito?

Existem maneiras mais inventivas de conseguir isso?

    
por Zabuzzman 27.12.2014 / 11:05

2 respostas

9

Dada a natureza das bibliotecas compartilhadas e do RPM comuns a vários pacotes, eu tomaria a abordagem de criar uma lista de pacotes que eu realmente uso e diferenciá-los de uma lista de pacotes instalados. Há benefícios em remover pacotes não utilizados, como liberar espaço em disco, reduzir pacotes que facilitariam o escalonamento de privilégios, reduzindo o tamanho de um banco de dados de soma de verificação, por exemplo, OSSEC, aide, tripwire.

Suposição :

  • o atime está ativado. Se você estiver usando uma opção de montagem de noatime, os tempos de acesso dos arquivos não serão atualizados e não poderão ser usados para determinar quais arquivos são acessados. É comum que o noatime seja configurado em um sistema de arquivos para evitar a penalidade de gravação.

Aviso: Este método tem algum risco que você precisará considerar. Por exemplo, se o servidor estiver ativo há alguns anos, pode haver daemons em execução que usem arquivos antigos que você não acessou desde o início do servidor / daemon. Há muitos outros riscos a serem considerados, mas você pediu que isso seja um método com o qual eu poderia começar. Isso ainda requer um humano para determinar o que poderia ser removido com segurança. Você não deve automatizar a remoção de pacotes usando este método. Isto é apenas para uso educacional.

Crie uma lista de todos os RPMs instalados.

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

Crie uma lista de arquivos acessados recentemente e salve uma contagem. Estamos nos aproximando do ano novo, então você pode querer olhar para o ano passado.

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'

Copie nosso banco de dados RPM para o disco RAM, para não abusarmos do servidor. Certifique-se de ter pelo menos 100 MB livres ou mais. por exemplo. df -Ph / dev / shm

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

Encontre os RPMs associados à nossa lista recent.txt. Isso vai demorar um pouco. Aposto que alguém poderia encontrar maneiras mais eficientes, rápidas e inteligentes de fazer esse passo. Eu faria isso em uma sessão de tela.

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

Remova da nossa lista os arquivos que não são de propriedade de um pacote RPM dos resultados.

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

Difira a saída. Mais uma vez, isso não é completamente útil por si só. Você precisará determinar por que os arquivos desses pacotes não foram acessados.

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

Você pode listar o conteúdo de um RPM com rpm -ql package . Aqui está a saída em uma das minhas VMs. Como você pode ver, isso não é totalmente útil no meu caso.

+++ /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

Eu preciso manter o sistema de arquivos e o sistema básico ao redor, apesar do fato de que esses arquivos não foram acessados por um tempo. Nota: em algum momento eu habilitei noatime

Eu removi o dhcp-common e seu pacote associado dhclient, já que nunca precisarei de DHCP no meu caso de uso específico. Percebo que esse método não é totalmente eficiente, mas deve fornecer um ponto de partida para cada função exclusiva de seus servidores. Feliz ano novo!

    
por 31.12.2014 / 23:03
4

Eu não sei se há uma resposta adequada para isso ...

É importante notar que pacotes estranhos são frequentemente instalados em muitas implantações Linux de uso geral.

A maioria dos engenheiros não seleciona manualmente os pacotes de software individuais que são instalados, mas escolhe por grupos lógicos de aplicativos (servidor web, servidor de email, servidor NFS) ou funções do sistema (servidor, estação de trabalho, mínimo) .

Existem também dependências que são instaladas como parte das seleções acima. A noção de determinar quais pacotes são "não utilizados" é preocupante por causa disso.

A segurança não depende apenas do que está instalado ... É mais uma função do que é realmente executado no sistema; ou seja, daemons, serviços de rede, portas expostas, processos, etc.

Em termos de utilização de recursos, você só está perdendo espaço em disco tendo um software não utilizado instalado. Um processo não consumirá recursos de CPU ou RAM até que seja executado. Então, as conseqüências são baixas. Se eu fosse um empregador / gerente, sugeriria que outras coisas recebam sua atenção. Não isso.

Se você quiser melhorar as compilações do sistema, o caminho certo é começar com um conjunto básico de pacotes e adicionar o que for necessário para fornecer a funcionalidade necessária do sistema. Documente as listas de pacotes adicionais e adicione-as a um kickstart ( exemplo abaixo ). Não vá na direção errada removendo o software de um sistema em execução.

snippet de uma das minhas listas de pacotes do kickstart, com grupos de pacotes e vários pacotes extras ...

%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
    
por 30.12.2014 / 17:46