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!