LINUX.ORG.RU

garbage collection для Gentoo или как найти накапливающийся в системе мусор.

 ,


2

6

Ни для кого не секрет, что в нашем любимом онтопике имеет место быть (естественно не в таких огромных количествах, как в альтернативных ОС) накапливание мусора - конфиги там в /etc, если пакетный менеджер не удаляет, пустые директории в /var, ну и тому подобный хлам. Так как findcruft умер, а других тулз не нагуглил, решил повелосипедить. Нужна помощь с добавлением исключений.

#!/bin/bash

mkdir '/tmp/garbage/'
echo "finding packages..."
EIX_LIMIT=0 eix -#I > /tmp/garbage/packages
echo "finding files in packages..."
cat /tmp/garbage/packages | while read line; do equery f $line | grep "^/" >> /tmp/garbage/package_files; echo "searching $line"; done
cat /tmp/garbage/package_files | grep -v "/usr/src" | sort > /tmp/garbage/package_files_sort
echo "finding files in system..."
find /bin/ -type f >> /tmp/garbage/system_files
find /boot/ -type f >> /tmp/garbage/system_files
find /etc/ -type f >> /tmp/garbage/system_files
find /lib32/ -type f >> /tmp/garbage/system_files
find /lib64/ -type f >> /tmp/garbage/system_files
find /opt/ -type f >> /tmp/garbage/system_files
find /sbin/ -type f >> /tmp/garbage/system_files
find /usr/ -type f >> /tmp/garbage/system_files
find /var/ -type f >> /tmp/garbage/system_files
echo "Sorting files..."
cat /tmp/garbage/system_files | grep -v "/usr/portage" | grep -v "/usr/src" | grep -v "/var/db/pkg" | grep -v "/lib/modules" | sort > /tmp/garbage/system_files_sort
echo "Writing log file and finishing..."
diff /tmp/garbage/system_files_sort /tmp/garbage/package_files_sort > /var/log/garbage.log
rm -rf '/tmp/garbage'

Замечания по скрипту:

  • Еще не дописал удаление дубликатов, если имеются
  • делая
    equery f $line | grep "^/"
    не отображаются директории, соответственно нужно дописать поиск пустых директорий
  • не все исключения добавлены
  • нужно разобраться, как быть с x86 архитектурой например
  • игнорятся файлы в /usr/src
  • дописать парсер diff`а, чтобы по человечески и красиво.

UPD Новая версия

UPD2 Обновленная версия. Устранена практически мешанина /lib и /lib64 на x86_64

UPD3 v 0.0.1

★★★★★

Ответ на: комментарий от funeralismatic

он есть и в lxde (у меня он стоит), и в Xfce, и htop с top никто не отменял.

Я это говорил Леголасу, а не тебе. К тому, что он как бы есть. И еще там есть наглядный древовидный режим. ^^

я его никуда не девал, но я против него протестую.

Удаляй генту. Bash вообще везде, так что можешь и снести GNU/Linux вообще, поставить венду. Там точно баша нет!

a1batross ★★★★★ ()

Кстати еще есть момент с lib и lib64 на 64-битных системах - часть в пакетном менеджере указано через lib, часть через lib64. Сейчас хочу попробовать написать скрипт без EXCLUDE_PATH, а вернуться к изначальному варианту с перечислением, с внесенными корректировками.

leg0las ★★★★★ ()

Версия какая там по счету

#!/bin/bash

# System config
if [ "$(uname -m)" != "x86_64" ]
then
INCLUDE_PATH="/bin/ /etc/ /lib/ /opt/ /sbin/ /usr/"
else
INCLUDE_PATH="/bin/ /etc/ /lib32/ /lib64/ /opt/ /sbin/ /usr/"
fi

TMP_DIR="/tmp/garbage"
TMP_PACKAGE_FILES="package_files"
TMP_PACKAGE_FILES_SORT="package_files_sort"
if [ "$(uname -m)" = "x86_64" ]
then
TMP_PACKAGE_FILES_SORT_LIB64="package_files_sort_lib64"
TMP_PACKAGE_FILES_SORT_LIB64_USR_LIB64="package_files_sort_lib64_usr_lib64"
fi
TMP_PACKAGE_FILES_RESULT="package_files_result"
TMP_SYSTEM_FILES="system_files"
TMP_SYSTEM_FILES_SORT="system_files_sort"
TMP_RESULT="garbage.log"

mkdir "${TMP_DIR}" 2> /dev/null

TMP_PACKAGE_FILES="$TMP_DIR/$TMP_PACKAGE_FILES"
TMP_PACKAGE_FILES_SORT="$TMP_DIR/$TMP_PACKAGE_FILES_SORT"
if [ "$(uname -m)" = "x86_64" ]
then
TMP_PACKAGE_FILES_SORT_LIB64="$TMP_DIR/$TMP_PACKAGE_FILES_SORT_LIB64"
TMP_PACKAGE_FILES_SORT_LIB64_USR_LIB64="$TMP_DIR/$TMP_PACKAGE_FILES_SORT_LIB64_USR_LIB64"
fi
TMP_PACKAGE_FILES_RESULT="$TMP_DIR/$TMP_PACKAGE_FILES_RESULT"
TMP_SYSTEM_FILES="$TMP_DIR/$TMP_SYSTEM_FILES"
TMP_SYSTEM_FILES_SORT="$TMP_DIR/$TMP_SYSTEM_FILES_SORT"
TMP_RESULT="/var/log/$TMP_RESULT"

find /var/db/pkg/ -name CONTENTS -exec cat {} \; >> "$TMP_PACKAGE_FILES"
cat "$TMP_PACKAGE_FILES" | awk '{print $2}' | grep -v "^/usr/src" | sort -u > "$TMP_PACKAGE_FILES_SORT"
if [ "$(uname -m)" = "x86_64" ]
then
cat "$TMP_PACKAGE_FILES_SORT" | sed "s/^\/lib\//\/lib64\//g" > $TMP_PACKAGE_FILES_SORT_LIB64
cat "$TMP_PACKAGE_FILES_SORT_LIB64" | sed "s/^\/usr\/lib\//\/usr\/lib64\//g" > $TMP_PACKAGE_FILES_SORT_LIB64_USR_LIB64
cp "$TMP_PACKAGE_FILES_SORT_LIB64_USR_LIB64" "$TMP_PACKAGE_FILES_RESULT"
else
cp "$TMP_PACKAGE_FILES_SORT" "$TMP_PACKAGE_FILES_RESULT"
fi

find $INCLUDE_PATH > $TMP_SYSTEM_FILES
cat $TMP_SYSTEM_FILES | grep -v "^/usr/portage/" | grep -v "^/usr/src/" | grep -v "^/usr/lib/" | grep -v "^/lib64/modiles/" | sort -u > $TMP_SYSTEM_FILES_SORT

diff "$TMP_SYSTEM_FILES_SORT" "$TMP_PACKAGE_FILES_RESULT" | grep "^<" | sed "s/^< //g" > "$TMP_RESULT"
rm -rf "TMP_DIR"

Версия 3. В /tmp почему-то не сносится директория, пока не обрабатывается /var, не до конца допилено под x86. Лог на рабочей машине уменьшился в 3 раза, из-за мешанины в пакетном манагере lib и lib64.

leg0las ★★★★★ ()
Последнее исправление: leg0las (всего исправлений: 1)
Ответ на: комментарий от haku

Сейчас дорабатываю исключения, и запилю версию 0.0.1. В версии 0.0.2 буду разгребать содержимое /var.

На работе нашел остатки от нескольких пакетов, дома - мертвый симлинк в /bin и какую-то мелочь в /etc.

leg0las ★★★★★ ()
Последнее исправление: leg0las (всего исправлений: 2)

gentoo-cleaner v 0.0.1

#!/bin/bash

# gentoo-cleaner-0.0.1
# System config
if [ "$(uname -m)" != "x86_64" ]
then
INCLUDE_PATH="/bin/ /etc/ /lib/ /opt/ /sbin/ /usr/"
else
INCLUDE_PATH="/bin/ /etc/ /lib32/ /lib64/ /opt/ /sbin/ /usr/"
fi

if [ "$(uname -m)" != "x86_64" ]
then
EXCLUDE_PATH="
/etc/local.d/
/etc/portage/
/etc/runlevels/
/lib/modules/
/usr/local/
/usr/portage/
/usr/src/
"
else
EXCLUDE_PATH="
/etc/local.d/
/etc/portage/
/etc/runlevels/
/lib64/modules
/usr/local/
/usr/portage/
/usr/src/
"
fi

TMP_DIR="/tmp/garbage"
TMP_PACKAGE_FILES="package_files"
TMP_PACKAGE_FILES_SORT="package_files_sort"
if [ "$(uname -m)" = "x86_64" ]
then
TMP_PACKAGE_FILES_SORT_LIB64="package_files_sort_lib64"
TMP_PACKAGE_FILES_SORT_LIB64_USR_LIB64="package_files_sort_lib64_usr_lib64"
fi
TMP_PACKAGE_FILES_RESULT="package_files_result"
TMP_SYSTEM_FILES="system_files"
TMP_SYSTEM_FILES_SORT="system_files_sort"
TMP_RESULT="garbage.log"

mkdir "${TMP_DIR}" 2> /dev/null

TMP_PACKAGE_FILES="$TMP_DIR/$TMP_PACKAGE_FILES"
TMP_PACKAGE_FILES_SORT="$TMP_DIR/$TMP_PACKAGE_FILES_SORT"
if [ "$(uname -m)" = "x86_64" ]
then
TMP_PACKAGE_FILES_SORT_LIB64="$TMP_DIR/$TMP_PACKAGE_FILES_SORT_LIB64"
TMP_PACKAGE_FILES_SORT_LIB64_USR_LIB64="$TMP_DIR/$TMP_PACKAGE_FILES_SORT_LIB64_USR_LIB64"
fi
TMP_PACKAGE_FILES_RESULT="$TMP_DIR/$TMP_PACKAGE_FILES_RESULT"
TMP_SYSTEM_FILES="$TMP_DIR/$TMP_SYSTEM_FILES"
TMP_SYSTEM_FILES_SORT="$TMP_DIR/$TMP_SYSTEM_FILES_SORT"
TMP_RESULT="/var/log/$TMP_RESULT"

find /var/db/pkg/ -name CONTENTS -exec cat {} \; >> "$TMP_PACKAGE_FILES"
cat "$TMP_PACKAGE_FILES" | awk '{print $2}' | grep -v "^/usr/src" | sort -u > "$TMP_PACKAGE_FILES_SORT"
if [ "$(uname -m)" = "x86_64" ]
then
cat "$TMP_PACKAGE_FILES_SORT" | sed "s/^\/lib\//\/lib64\//g" > $TMP_PACKAGE_FILES_SORT_LIB64
cat "$TMP_PACKAGE_FILES_SORT_LIB64" | sed "s/^\/usr\/lib\//\/usr\/lib64\//g" > $TMP_PACKAGE_FILES_SORT_LIB64_USR_LIB64
cat "$TMP_PACKAGE_FILES_SORT_LIB64_USR_LIB64" | sort -u > "$TMP_PACKAGE_FILES_RESULT"
else
cp "$TMP_PACKAGE_FILES_SORT" "$TMP_PACKAGE_FILES_RESULT"
fi

find $INCLUDE_PATH > $TMP_SYSTEM_FILES

TMP_SORT="cat $TMP_SYSTEM_FILES"
for E in $EXCLUDE_PATH ; do
    TMP_SORT="$TMP_SORT | grep -v \"^$E\""
done

eval "$TMP_SORT" | sort -u > $TMP_SYSTEM_FILES_SORT
diff "$TMP_SYSTEM_FILES_SORT" "$TMP_PACKAGE_FILES_RESULT" | grep "^<" | sed "s/^< //g" > "$TMP_RESULT"

rm -rf "$TMP_DIR"

После sed`а нужен sort, иначе вываливает в лог существующие файлы, про которые знает пакетный менеджер.

После сего штриха лог уменьшился еще втрое до 120 кбайт, а после вычленения (для себя) уже ручками из лога одной сфотины, стоящей в /opt не из портежа получилось и вовсе 65к - чуть более 1,5 к строк, уже вполне прогоняемо и читабельно.

leg0las ★★★★★ ()
Ответ на: gentoo-cleaner v 0.0.1 от leg0las

После теста: как минимум убрать из путей /bin, /usr/*/bin/ и сделать набор исключений на файлы в /etc. Иначе с трудом юзабельно. Добавьте лучше удаление файлов *.~ и/или #*.*#.

Lilly ()
Ответ на: комментарий от Lilly

На счет /bin и /usr/bin - сомнительно, т.к. там я нашел апример мертвый симлинк. Правильней будет обрабатывать все, что в /bin, /sbin, /usr/bin и /usr/sbin дополнительно на предмет «живой» или «мертвый» симлинк, т.к. то, что скрипт там находит - это симлинки.

Сейчас проверил всякие там /usr/bin/gcc - таки файлик, на работу приду, буду доковыривать.

leg0las ★★★★★ ()
Последнее исправление: leg0las (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.