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

★★★★★

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

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

Вроде да. Меня больше беспокоит /etc - не сильно приятно листать в mc список директорий и файлов, если например софта, который впихивает в этот самый /etc свое файло уже нет, а остатки лежат. В deb-based есть шикарная опция purge при сносе пакетов.

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

В пример, в огромном и сыром выхлопе нашел остатки zmap, который когда-то ставил (тут даже тред про него есть)

leg0las ★★★★★
() автор топика

Тяжело то как...

# grep kAwOken /var/log/garbage.log | wc -l
32141

haku ★★★★★
()

вроде megabaks что-то подобное пилил, посмотри в его оверлее.

Deleted
()

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

1. find a/;find b/; find c/ можно заменить на find a/ b/ c/

2. вместо кучи grep -v можно написать find ! -path (в одной find из п1)

3. diff не нужно. Если есть sort, то можно uniq

emulek
()

Есть вроде какая-то программа, не? Bleachbit, кажется, называется, или как-то так. Правда, там ищутся только «общедистрибутивные» места с мусором, поэтому конкретно в генте многие места обходятся.

Твое решение будет подходить далеко не всем, вероятно, а в генте разнообразные depclean и прочие полезные вещи, а также банальный проход по винту с ncdu в каждом индивидуальном случае эффективней будут. Ну, это я так, хочется пилить - пили.

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

Где? В bleachbit пайтон, но его форкать «под генту» не имеет особого смысла. ncdu на С почти весь, но его суть не в этом. Я клоню к тому, что лишние локали и всякие старые логи удаляются и с помощью bleachbit, а вот чисто генто-«мусор»(в кавычках), например dist-файлы или кэш компиляции по сути полезен и нужен, т.е. не является мусором.

Да, кстати, тут выше писали про скрипты Мегабакса - навскидку нашел для локалей и для лишних файлов после сборок ядра. Кстати, сам, пожалуй, воспользуюсь на неделе и звездочки поставлю, ибо полезные скрипты. Делать больше - оверхед. ИМХО, разумеется.

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

в заголовках скриптов #!/usr/bin/perl. Даже если там питон, мне это погоды не делает. Для локалей есть localepurge, использую в дебиане, а исходники ядра проще чистить ручками.

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

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

Lilly
()
find / -type f | egrep -v "^/home" >> /tmp/garbage/system_files

Думаю идея понятна.

ziemin ★★
()

Мусор в системе - понятие очень неоднозначное. ._cfg* - это мусор? Логи? Твои скрипты в /usr/local/bin? Файлы ядра в /boot?

На самом деле, самый неприятный «мусор» - лишние пакеты в /usr/portage/packages . Здесь я нашел рецепт как избавляться от лишнего, нужно будет как-то преобразовать это в скриптик. Еще скопление мусора в домашних каталогах - кеши, временные файлы и т. п. А общесистемный... Ладно давай попробуем...

Немного подмодифицировал твой скриптик...
- Все файлы и каталоги - в переменные. Так наглядней, да и помогает избежать некоторых проблем. Каталог делаем по-настоящему уникальным.
- Файлы в пакетах ищутся очень долго (equery f) . Так ты будешь делать отладку вечность. Вводим DEBUG режим - использование предыдущих наработок и, соответственно, не-удаление этих файлов в конце. Также, если DEBUG режим выключен - создавать уникальный каталог в /tmp . WARNING: Если честно, не тестировал с выключенным DEBUG режимом - лень. Оставлю тебе :)
- Поиск: лучше использовать принцип «Все, что не запрещено - то разрешено». Исключение для поиска - в отдельной переменной $EXCLUDE_PATH .
- Поиск: не понятно, что делать с симлинками, такими как /etc/bash_completion.d/eselect . Пока не добавлял.
- Не вижу ничего плохого в том, что от equery не парсятся каталоги (хотя я нашел рецепт как это сделать).
- Немного оптимизировал алгоритм поиска. Даже с ! -path оно ищет везде, это просто фильтр для вывода; пофиксил это.
- Немного очеловечил вывод diff.
- Пока скрипт создает временные файлы в текущем каталоге - см. переменную TMP_DIR .
- Результат - в garbage.txt.

Если честно, результаты неоднозначные. Например, многие файлы в /etc/ не принадлежат ни к одному пакету. /usr/lib/perl5/5.18.2/i686-linux/bits/* не принадлежат ни к кому; мне как-то не очень хочется их удалять, скорее всего они просто сгенерированы динамически каким-то perl-cleaner'ом. Аналогично с python'ом. Mime-типы. В исключения их? Очевидного мусора не так уж и много. Все-же в unix хорошо продуманная fhs, мусора практически не появляется. Ну, или это Gentoo такая продуманная, что тоже может быть ;)

Поразмял мозг в воскресенье :) . ИМХО, скрипт полезен скорее с точки зрения изучения строения системы.

Вот:

#!/bin/bash

# Debug mode
DEBUG="yes" # Make it empty to switch off debug mode

# System config
EXCLUDE_PATH="
/boot
/dev
/home
/lib/modules
/media
/mnt
/proc
/run
/sys
/usr/local
/usr/portage
/usr/src
/tmp
/var
"

# Variables
# TMP_DIR="/tmp/garbage"
TMP_DIR="."
TMP_PACKAGES="packages.txt"
TMP_PACKAGE_FILES="package_files.txt"
TMP_PACKAGE_FILES2="package_files2.txt"
TMP_SYSTEM_FILES="system_files.txt"
TMP_RESULT="garbage.txt"

# Implementation
[[ -n "$DEBUG" ]] && echo "Debug mode is ON"
[[ -z "$DEBUG" ]] && TMP_DIR=`mktemp` # Make unique directory

mkdir "${TMP_DIR}" 2> /dev/null # Be silent if the directory already exists

TMP_PACKAGES="$TMP_DIR/$TMP_PACKAGES"
TMP_PACKAGE_FILES="$TMP_DIR/$TMP_PACKAGE_FILES"
TMP_PACKAGE_FILES2="$TMP_DIR/$TMP_PACKAGE_FILES2"
TMP_SYSTEM_FILES="$TMP_DIR/$TMP_SYSTEM_FILES"
TMP_RESULT="./$TMP_RESULT"

if [[ -f "$TMP_PACKAGES" ]] ; then 
	echo "Using existing package list..."
else
	echo "Looking for packages..."
	EIX_LIMIT=0 eix -#I > "$TMP_PACKAGES"
fi

if [[ -f "$TMP_PACKAGE_FILES" ]] ; then 
	echo "Using existing files list..."
else
	echo "Looking for files in packages..."
	rm "$TMP_PACKAGE_FILES" 2> /dev/null
	
	cat "$TMP_PACKAGES" | while read line; do
		echo "Processing '$line'..."
		equery f $line | grep "^/" >> "$TMP_PACKAGE_FILES2"
	done
	cat "$TMP_PACKAGE_FILES2" | grep -v "/usr/src" | sort | uniq > "$TMP_PACKAGE_FILES"
fi

echo "Listing files in the system..."

# Some optimization
FIND_CMD="find / -maxdepth 1 -type d ! -path /"
for E in $EXCLUDE_PATH ; do
	FIND_CMD="$FIND_CMD ! -path $E" 
done
FIND_CMD="$FIND_CMD -printf %p\40"
[[ -n "$DEBUG" ]] && echo "Find command 1: $FIND_CMD"

FIND_DIRS=`$FIND_CMD`
[[ -n "$DEBUG" ]] && echo -e "\n$FIND_DIRS\n"

# Main code
FIND_CMD="find $FIND_DIRS -type f "
for E in $EXCLUDE_PATH ; do
	FIND_CMD="$FIND_CMD ! -path \"$E/*\"" 
done
[[ -n "$DEBUG" ]] && echo "Find command 2: $FIND_CMD"
eval "$FIND_CMD" | sort | uniq > "$TMP_SYSTEM_FILES"

diff "$TMP_SYSTEM_FILES" "$TMP_PACKAGE_FILES" | grep "^<" | sed "s/^< //g" > "$TMP_RESULT"

[[ -z "$DEBUG" ]] && rm -rf "TMP_DIR"

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

и не пиши длинные строки пожалуйста, читать невозможно. Можно ведь так делать:

find \
    -type f \
    -path "*path*" \
    -exec file {} +
emulek
()

да почему ж все такие башисты??

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

практика показала, что многое из баша в zsh реализовано иначе, нежели в bash (хотя сейчас я не наблюдаю несовместимостей, но это сейчас), потому у меня оно не взлетит, а то и чего нехорошего наделает. )=

а портировать каждый полезный скрипт на zsh или sh мне лениво.

funeralismatic ★★★
()
Ответ на: комментарий от kir64

нет. ибо нормальные(!) вещи должны быть кроссплатформенными, в данном случае кроссшелловые.

ты будешь тянуть целое DE из-за одной очень удобной (но имеющей менее удобные альтернативы, DE-независимые)? лично я — нет, ибо зависимость должна быть оправдана, а не «потому, что девелопер пил вчера пиво, а сегодня болеет с похмелья.»

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

...ибо баш мне не нужен, и ставить его...

Достаточно много скриптов работают именно с sh. Он уже у тебя стоит. И его не выпилишь: слишком много в системе завязано на него.

Кроме того:

sh can be thought of as an extended Bourne shell
(C) http://en.wikipedia.org/wiki/Z_shell

т. е. совместим.

ты будешь тянуть целое DE

$ du -hs /bin/bash
705K    /bin/bash

Я бы скорее пистон выпиливал да всякие ruby...

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

Достаточно много скриптов работают именно с sh

и это хорошо, по крайней мере тем, что не на bash.

Он уже у тебя стоит. И его не выпилишь

а я и не собирался.

баш как бы является стандартом

kir64, убей себя, стандарт как раз sh, потому по дефолту пилить надо под него, а не под bash, который может и не стоять у некоторых, а sh стоит на ВСЕХ линуксах.

Zsh can be thought of as an extended Bourne shell

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

705K /bin/bash

дело не в весе, а в лишней сущности. зачем мне третий шелл? из-за пары скриптов? а не проще скрипты писать нормально?

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

kir64, убей себя

Не поддерживаю. Пускай школота пальцы гнёт, а нормальные люди должны спокойно аргументировано общаться.

стандарт как раз sh

Да. Если не ошибаюсь, в том скрипте, заменив [[ на [, получишь sh-совместимый скрипт.

И еще. Какая у тебя ОС/дистр? Дай, пожалуйста, вывод вот такого (чур не махлевать):

$ ls -l /bin/zsh
$ ls -l /bin/sh
$ ls -l /bin/bash

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

я ей пользоваться не хочу

баш мне не нужен, и ставить его из-за ваших с мегабаксов скриптов не желаю

портировать каждый полезный скрипт на zsh или sh мне лениво

ну и свали нахер с треда, чо раскукарекался-то?

anonymous
()

Ужас какой, я всегда юзал qfile для этого.

$ sudo touch /bin/garbage ; find /bin -type f -exec qfile -o {} + ; sudo rm /bin/garbage
/bin/garbage
$

Lavos ★★★★★
()
Ответ на: комментарий от Kroz

Дай, пожалуйста, вывод вот такого:

funeralismatic@gentoo ls -l /bin/zsh
-rwxr-xr-x 2 root root 697000 Jan 15 19:46 /bin/zsh
funeralismatic@gentoo ls -l /bin/sh
lrwxrwxrwx 1 root root 3 Apr  7 14:08 /bin/sh -> zsh
funeralismatic@gentoo ls -l /bin/bash
-rwxr-xr-x 1 root root 733736 Jan 15 02:56 /bin/bash

И еще. Какая у тебя ОС/дистр?

Gentoo

(чур не махлевать)

убрал только RPROMPT, ибо растянет ЛОР.

да, стоит bash, ибо от него зависят:

app-admin/eselect-mesa-0.0.10 requires >=app-shells/bash-4
app-admin/perl-cleaner-2.12 requires app-shells/bash
app-text/xmlto-0.0.25 requires app-shells/bash
games-util/steam-launcher-1.0.0.47 requires app-shells/bash
sys-apps/dkms-gentoo-20 requires app-shells/bash
sys-apps/portage-2.2.10 requires >=app-shells/bash-4.2_p37[readline]
sys-apps/udevil-0.4.3 requires >=app-shells/bash-4.0

даже если выкинуть все, то перл-клинер и портаж не выкинешь, а перепиливать первый на zsh и съезжать на paludis из-за этого крайне лениво.

funeralismatic ★★★
()
Ответ на: комментарий от Kroz

Мусор в системе - понятие очень неоднозначное. ._cfg* - это мусор? Логи? Твои скрипты в /usr/local/bin? Файлы ядра в /boot?

первое - сгенеренное софтиной, нужно смотреть на директорию, в которой они содержатся

второе - исключаем, да, я там держу свои скрипты.

третье тоже не сложно исключить, да и софта, пишущего в бут я особо не видел, разве что сплеши для первого граба.

самый неприятный «мусор» - лишние пакеты в /usr/portage/packages . Здесь я нашел рецепт как избавляться от лишнего, нужно будет как-то преобразовать это в скриптик. Еще скопление мусора в домашних каталогах - кеши, временные файлы и т. п

первое -

# ls -la /usr/portage/packages
ls: невозможно получить доступ к /usr/portage/packages: Нет такого файла или каталога

второе - в хомяке вычистить все намного проще. У тебя 100500 юзерспейсных софтин? хотя да, вычищать конфиги и файлы софтины, которая входит в состав DE - еще то удовольствие.

На счет скриптика - неплохо было бы шерстить на наличие каталогов в /var/lib и наличие учетных записей в /etc/passwd и /etc/group - поставь cups, а потом снеси его - увидишь оставшийся в системе хлам в /var/spool, /var/cache, ну и соответственно в /etc.

Это ладно, на первый раз пока пропустим.

На счет ! -path та же фигня, исчет везде.

На счет «не парсятся каталоги - да, оно упрощает скрипт, но как искать пустые каталоги, которые не принадлежат как какому-либо пакету?

На счет сгенерированных файлов - нужно добавлять в исключения.

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

и да, cast megabaks

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

и awk '{print $2}' с последующим удалением дубликатов. Спасибо.

leg0las ★★★★★
() автор топика
Ответ на: комментарий от Kroz

Скрипт доработать по части работы в /var: искать директории, т.е. если есть директория в списке файлов из пакетов, то не показывать «отличия». Пример - установленный cups - если есть диры, все, не показываем их содержимое.

leg0las ★★★★★
() автор топика
Ответ на: комментарий от Pinkbyte

eclean-pkg, не?

Спасибо, не знал о таком. eclean-pkg почистил мне /usr/portage/packages, хотя там не много было.

А вот eclean-dist работает в 1.5 раза медленнее (real 13m49.288s против real 18m27.350s), да еще и выдает неправильный результат: удалил мне 20 файлов вместо 211. Пожалуй, буду по-старинке.

Kroz ★★★★★
()
Ответ на: комментарий от leg0las

Скрипт доработать ...

Эмм... Я так понял, что это ты себе на заметку, так? ;)

Если нужна помощь/вопросы - спрашивай, всегда рад помочь. Но писать за тебя я не буду.

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

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

Эмм... Я так понял, что это ты себе на заметку, так? ;)

Естественно:) заметки вслух, принимаются замечания.

На счет правки скрипта - на работе потихоньку его пилю, уже заменил equery f на find /var/db/pkg/ -name CONTENTS ... - скорость работы скрипта несравнима, и можно сразу подгрести каталоги, если создаются пустые.

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

и выдает неправильный результат: удалил мне 20 файлов вместо 211.

eclean-dist и eclean-pkg удаляют все пакеты, которых нет в portage и оверлеях. Если пакет обновился, а ебилд старый не удалили - он его и не будет удалять.

Pinkbyte ★★★★★
()
$ sudo du -sh /etc
86M     /etc

Капец как много. Пойду новый винчестер покупать.

Да, 67 мегабайт из этого - это splash-картинки. Чтобы никто не пугался.

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

eclean-dist и eclean-pkg удаляют все пакеты, которых нет в portage и оверлеях.

Так - возможно. Я просто обычно удаляю все пакеты кроме тех, что установлены на данный момент.

Kroz ★★★★★
()
Ответ на: комментарий от BattleCoder

Капец как много. Пойду новый винчестер покупать.

Ты дома пыль тоже не вытираешь? Она ведь весит мало.

Kroz ★★★★★
()
Ответ на: комментарий от kir64

Стандартом является posix shell, наш необразованный друк.

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

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

Ибилды разве не баш? Ты думаешь, разработчиков генты заботит, как портаж будет работать без баша?

iVS ★★★★★
()
Ответ на: комментарий от leg0las

Ебилды — это башекод. Когда компиляешь что-нибудь, открой какой-нибудь диспетчер задач(ты же вроде в кедах, так что он есть) и посмотри дерево процессов от python и далее. Там очень много баша, увы.

Так что funeralismatic никуда не мог деть баш. %)

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

Обратимся к докам:

In order to be able to do package management you have to define what packages are and how they download, unpack, patch, compile, install and merge (copy it from a temporary directory to your live file system) sources and/or binaries, to make it more nice we also add some useful metadata as well as USE flags, patches and more to allow one to manipulate the process the way; this definition is mostly done in an ebuild, which are bash shell scripts.

iVS ★★★★★
()

Новая версия

#!/bin/bash

# System config
EXCLUDE_PATH="
/boot
/dev
/home
/lib/modules
/lib64/modules
/lost+found
/media
/mnt
/proc
/pub
/root
/run
/sys
/tmp
/usr/local
/usr/portage
/usr/src
/var/db/pkg
/var/tmp
/
"

TMP_DIR="/tmp/garbage"
TMP_PACKAGE_FILES="package_files"
TMP_PACKAGE_FILES_SORT="package_files_sort"
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"
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"

FIND_FILES="find / -type f"
for E in $EXCLUDE_PATH ; do
    FIND_FILES="$FIND_FILES -prune -o -path $E"
done

FIND_DIRS="find / -type d"
for E in $EXCLUDE_PATH ; do
    FIND_DIRS="$FIND_DIRS -prune -o -path $E"
done

$FIND_FILES > $TMP_SYSTEM_FILES
$FIND_DIRS >> $TMP_SYSTEM_FILES

cat $TMP_SYSTEM_FILES | sort -u > $TMP_SYSTEM_FILES_SORT
diff "$TMP_SYSTEM_FILES_SORT" "$TMP_PACKAGE_FILES_SORT" | grep "^<" | sed "s/^< //g" > "$TMP_RESULT"
rm -rf "TMP_DIR"

Сейчас буду писать исключения для /var.

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

только сам портаж написан на питоне, все его конфиги на баше, и пользует он все утилитки через баш. к сожалению.

funeralismatic ★★★
()
Ответ на: комментарий от a1batross

открой какой-нибудь диспетчер задач(ты же вроде в кедах, так что он есть)

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

Так что funeralismatic никуда не мог деть баш. %)

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

funeralismatic ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.