LINUX.ORG.RU
ФорумTalks

почистить /boot

 ,


0

1

есть ли в этих ваших гентах чистилка /boot от ненужных ядер?
например от ядер не имеющих модулей в /lib/modules
или опять пилить как отдельную херь?
ах да, гентушнеги, накидайте

file /boot/* | grep version
UPD: больше выхлопов не нать - везде интересно 1-ое и 9-ое поля
UPD2: потестите sys-kernel/kernel-cleaner-9999 из stuff оверлея
да, теперь сабж живёт здесь

★★★★

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

Но зачем?

[pf@spock]:[~][0]% ls /boot
grub                          initramfs-linux.img       kernel35-pf.img  memtest86+  System.map35-pf  vmlinuz-linux
initramfs-linux-fallback.img  kernel35-pf-fallback.img  lost+found       syslinux    vmlinuz35-pf
post-factum ★★★★★
()
#!/bin/bash

SRC="/usr/src/linux"
KERNELS="$(file /boot/* | grep "Linux.*version")"

############################################################################
####### kernel path and real name ##########################################
kernel_version() {
makefile="${SRC}-${1}/Makefile"
  if [ -f "${makefile}" ];then
	VERSION="$(awk '/^VERSION =/ {print $3}' "${makefile}")"
	PATCHLEVEL="$(awk '/^PATCHLEVEL =/ {print $3}' "${makefile}")"
	SUBLEVEL="$(awk '/^SUBLEVEL =/ {print $3}' "${makefile}")"
	EXTRAVERSION="$(awk '/^EXTRAVERSION =/ {print $3}' "${makefile}")"
	FULL_KERNEL="${VERSION}.${PATCHLEVEL}.${SUBLEVEL}${EXTRAVERSION}"
  fi
}

true_kernel() {
  if [ -n "${1}" ];then
	KERNEL="${1##*linux-}"
	KERNEL="${KERNEL%/}"
  fi

  if [ -d "${SRC}-${KERNEL}" ];then
	kernel_version ${KERNEL}
  else
	for kernel in `ls -d --color=never /usr/src/linux-*`;do
	  kernel="${kernel##*/linux-}"
	  kernel_version ${kernel}
	  if [ "${KERNEL}" == "${FULL_KERNEL}" ];then
		KERNEL="${kernel}"
		break
	  fi
	done
  fi
}
############################################################################

while read line;do
  FILE="`awk '{print $1}' <<< "${line}"`"
  FILE="${FILE%:}"
  version="`awk '{print $9}' <<< "${line}"`"
  true_kernel ${version}

  [ -d "/lib/modules/${version}" ] || REMOVE_FILES+="${FILE}\n"

  [ -d "${SRC}-${KERNEL}" ] || REMOVE_FILES+="${FILE}\n"

  if [ -d "${SRC}-${KERNEL}" ];then
	if ! [ -f "${SRC}-${KERNEL}/COPYING" ];then
	  REMOVE_DIRS+="${SRC}-${KERNEL}\n"
	fi
  fi
done <<< "${KERNELS}"

VERSIONS="$(awk '{print $9}' <<< "${KERNELS}")"
for mod_dir in `ls -1 --color=never /lib/modules/ | grep -v "${VERSIONS}"`;do
  REMOVE_MOD_DIRS+="/lib/modules/${mod_dir}\n"
done

for src_dir in `ls -d1 --color=never ${SRC}*`;do
  [ -f "${src_dir}/COPYING" ] || REMOVE_DIRS+="${src_dir}\n"
done

echo -e "\nБудут удалены следующие файлы:\n"
echo -e "${REMOVE_FILES}" | sort -u | sed '/^$/d'

echo -e "\nБудут удалены следующие диры:\n"
echo -e "${REMOVE_DIRS}" | sort -u | sed '/^$/d'
echo -e "${REMOVE_MOD_DIRS}" | sort -u | sed '/^$/d'

так правильней будет - про initrd-то я забыл )

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

если последний EXTRAVERSION = -5gnt0, это не означает, что не было EXTRAVERSION = -1gnt0...

и в результате, все ядра с :
EXTRAVERSION = -1gnt0
EXTRAVERSION = -2gnt0
EXTRAVERSION = -3gnt0
EXTRAVERSION = -4gnt0

он собрался удалять, хотя у этих ядер в /lib/modules всё в порядке

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

предлагай логику
мне вот пока в такой ситуации ничего в голову не приходит
не удалять если есть сорсы или модули?

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

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

я подумал, что в моём случае ничего лучше чем перечисление того, что не надо удалять, не получится - информация, необходимая скрипту для генерации корректного списка вообще может существовать только в голове пользователя

А перечислять надо либо в файле, либо в командной строке, наверно с разбивкой по версиям ядер

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

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

megabaks ★★★★
() автор топика
Ответ на: комментарий от argin
#!/bin/bash

SRC="/usr/src/linux"
KERNELS="$(file /boot/* | grep "Linux.*version")"

############################################################################
####### kernel path and real name ##########################################
kernel_version() {
makefile="${SRC}-${1}/Makefile"
  if [ -f "${makefile}" ];then
	VERSION="$(awk '/^VERSION =/ {print $3}' "${makefile}")"
	PATCHLEVEL="$(awk '/^PATCHLEVEL =/ {print $3}' "${makefile}")"
	SUBLEVEL="$(awk '/^SUBLEVEL =/ {print $3}' "${makefile}")"
	EXTRAVERSION="$(awk '/^EXTRAVERSION =/ {print $3}' "${makefile}")"
	FULL_KERNEL="${VERSION}.${PATCHLEVEL}.${SUBLEVEL}${EXTRAVERSION}"
  fi
}

true_kernel() {
  if [ -n "${1}" ];then
	KERNEL="${1##*linux-}"
	KERNEL="${KERNEL%/}"
  fi

  if [ -d "${SRC}-${KERNEL}" ];then
	kernel_version ${KERNEL}
  else
	for kernel in `ls -d --color=never /usr/src/linux-*`;do
	  kernel="${kernel##*/linux-}"
	  kernel_version ${kernel}
	  if [ "${KERNEL}" == "${FULL_KERNEL}" ];then
		KERNEL="${kernel}"
		break
	  fi
	done
  fi
}
############################################################################

while read line;do
  FILE="`awk '{print $1}' <<< "${line}"`"
  FILE="${FILE%:}"
  version="`awk '{print $9}' <<< "${line}"`"
  true_kernel ${version}

  if ! [ -f "${SRC}-${KERNEL}/COPYING" ] && ! [ -d "/lib/modules/${version}" ];then
	REMOVE_FILES+="${FILE}\n"
  fi

done <<< "${KERNELS}"

VERSIONS="$(awk '{print $9}' <<< "${KERNELS}")"
for mod_dir in `ls -1 --color=never /lib/modules/ | grep -v "${VERSIONS}"`;do
  REMOVE_MOD_DIRS+="/lib/modules/${mod_dir}\n"
done

for src_dir in `ls -d1 --color=never ${SRC}*`;do
  [ -f "${src_dir}/COPYING" ] || REMOVE_DIRS+="${src_dir}\n"
done

echo -e "\nБудут удалены следующие файлы:\n"
echo -e "${REMOVE_FILES}" | sort -u | sed '/^$/d'

echo -e "\nБудут удалены следующие диры:\n"
echo -e "${REMOVE_DIRS}" | sort -u | sed '/^$/d'
echo -e "${REMOVE_MOD_DIRS}" | sort -u | sed '/^$/d'

а так что говорит?

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

Вот и настал прекрасный момент, когда линуксу нужна чистилка реестра.

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

хорошо бы контролировать опциями, след вещи:

1). удалять модули где нет ядра

2). удалять ядро без сырцов

3). удалять ядро без сырцов и модулей

годно, в общем

qnikst ★★★★★
()

file /boot/* | grep version: http://bpaste.net/show/45756/

результат kernerl-clean:

http://bpaste.net/show/45757/

что не хочу, чтобы удалялось:

vmlinuz-2.6.32-openvz-044.11-el6-gentoo-slep-1-gcbd8877 vmlinuz-3.2.9-gentoo+ 2.6.39-gentoo-r2

hint для моих юзкейсов: можно ещё не удалять симлинкнутые ядра, т.е. те, на который ведёт какой либо симлинк в boot.

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

это было не про bash vs python :) А к тому, чтобы мантейнеры ядреных пакетов вели где-то реестр соответствий (пакет -> файлы ядер, модулей, исходников-заголовков). Тогда можно было бы легко реализовать команды пакетника типа «удали все модули из пакета kernel35-4». Смысл в том, что мы заранее четко знаем, что и как удалять, а не ищем это руками.

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

это да
пока речь про core
плюшки потом

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

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

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

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

нет. Как угадал? Несколько месяцев не пил, а вчера было плохое настроение, скачал дьяблу-3, затарился водкой и пивом, и понеслось...

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

в чем ересь в желании на этапе описания пакета в точности знать все файлы, которые в него включены? Это желание такого же толка, как на этапе компиляции программы знать типы и пути выполнения (эта та причина, по которой динамические языки не нужны :))

кстати, можно реализовать какой-нибудь API, который мог бы модифицировать БД пакетов. Например, создаешь ты своим приложением/модулем файл, и этот файл тут же добавляется в базу данных пакетника, как «созданный пакетом после установки». Там же можно сразу выбирать «предназначения» файлов, что-то типа тэгов, чтобы делать над ними групповые опреации типа «удалить все файлы с тэгом text-file, созданные любой программой из пакета emacs».

Или даже жестче, пропатчить такой следилкой код файловых вызовов: всё что создано программой даже без использования специального апи будет в обязаловку удалено вместе с пакетом этой программы. Исключая, может быть, /home или другое специально сконфигурированное для «пользовательских данных» место.

И, конечно же, добавить это в systemd.

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

какие файлы есть в пакете, в базе *внезапно* написано
повторяю вопрос - как ты собрался выяснять какие файлы были созданы при компиляции ядра?

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

что не хочу, чтобы удалялось:
vmlinuz-2.6.32-openvz-044.11-el6-gentoo-slep-1-gcbd8877 vmlinuz-3.2.9-gentoo+ 2.6.39-gentoo-r2

#!/bin/bash

SRC="/usr/src/linux"
KERNELS="$(file /boot/* | grep "Linux.*version")"

############################################################################
####### kernel path and real name ##########################################
kernel_version() {
makefile="${SRC}-${1}/Makefile"
  if [ -f "${makefile}" ];then
	VERSION="$(awk '/^VERSION =/ {print $3}' "${makefile}")"
	PATCHLEVEL="$(awk '/^PATCHLEVEL =/ {print $3}' "${makefile}")"
	SUBLEVEL="$(awk '/^SUBLEVEL =/ {print $3}' "${makefile}")"
	EXTRAVERSION="$(awk '/^EXTRAVERSION =/ {print $3}' "${makefile}")"
	FULL_KERNEL="${VERSION}.${PATCHLEVEL}.${SUBLEVEL}${EXTRAVERSION}"
  fi
}

true_kernel() {
  if [ -n "${1}" ];then
	KERNEL="${1##*linux-}"
	KERNEL="${KERNEL%/}"
  fi

  if [ -d "${SRC}-${KERNEL}" ];then
	kernel_version ${KERNEL}
  else
	for kernel in `ls -d --color=never /usr/src/linux-*`;do
	  kernel="${kernel##*/linux-}"
	  kernel_version ${kernel}
	  if [ "${KERNEL}" == "${FULL_KERNEL}" ];then
		KERNEL="${kernel}"
		break
	  fi
	done
  fi
}
############################################################################

while read line;do
  FILE="`awk '{print $1}' <<< "${line}"`"
  FILE="${FILE%:}"
  version="`awk '{print $9}' <<< "${line}"`"
  true_kernel ${version}

  if ! [ -f "${SRC}-${KERNEL}/Makefile" ] && ! [ -d "/lib/modules/${version}" ];then
	REMOVE_FILES+="${FILE}\n"
  fi

done <<< "${KERNELS}"

VERSIONS="$(awk '{print $9}' <<< "${KERNELS}")"
for mod_dir in `ls -1 --color=never /lib/modules/ | grep -v "${VERSIONS}"`;do
  REMOVE_MOD_DIRS+="/lib/modules/${mod_dir}\n"
done

for src_dir in `ls -d1 --color=never ${SRC}*`;do
  [ -f "${src_dir}/Makefile" ] || REMOVE_DIRS+="${src_dir}\n"
done

for ignor in ${IGNOR};do
  echo "Игнорируется: ${ignor}"
  REMOVE_FILES="${REMOVE_FILES//"${ignor}"/}"
  REMOVE_DIRS="${REMOVE_DIRS//"${ignor}"/}"
  REMOVE_MOD_DIRS="${REMOVE_MOD_DIRS//"${ignor}"/}"
done

echo -e "\nБудут удалены следующие файлы:\n"
echo -e "${REMOVE_FILES}" | sort -u | sed '/^$/d'

echo -e "\nБудут удалены следующие диры:\n"
echo -e "${REMOVE_DIRS}" | sort -u | sed '/^$/d'
echo -e "${REMOVE_MOD_DIRS}" | sort -u | sed '/^$/d'
IGNOR="/lib/modules/3.2.1-ololo /boot/3.4.3-pf-uksm /boot/3.2.1-r2-pf" sh kernel-cleaner/kernel-cleaner
Игнорируется: /lib/modules/3.2.1-ololo
Игнорируется: /boot/3.4.3-pf-uksm
Игнорируется: /boot/3.2.1-r2-pf

Будут удалены следующие файлы:

/boot/3.1.5-pf
/boot/3.1.5-pf1
/boot/3.1.6-pf
/boot/3.2.1-pf
/boot/3.2.4-pf
/boot/3.2.7-pf
/boot/3.3.2-pf
/boot/3.3.6-pf
/boot/3.4.3-pf
/boot/3.4.5-pf-uksm

Будут удалены следующие диры:

/usr/src/linux-2.2.2-ololo
/usr/src/linux-3.3.6-pf
/lib/modules/3.2.1-trololo

попробуй на всякий случай

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

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

а если по-хорошему, то хотя бы вот: 1) API, который регистрирует все значимые файлы.
2) Патч на файловые системные вызовы, который регистрирует все значимые файлы.

Запускаем следилку, собираем ядро, останавливаем следилку и смотрим ее выхлоп. Фильтруем на предмет ереси (изменения в /tmp, например - выкинуть). Оставшееся записываем в БД пакетника.

может быть, можно как-то извратиться с inotify?

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

ты предлагаешь демон?
можно просто после сборки ядра все найденные диры/линки/файлы писать в базу
но база вырастет охренеть как - представь кол-во одних *.o

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

При всем уважении - ужасть.
Все-таки deb рулит. apt-file search
apt-get remove
Никаких проблем.
(gentoo трогал (ставил) на серверах)

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

NTFS:
Maximum disk size: 256 terabytes
Maximum file size: 256 terabytes
Maximum number of files on disk: 4,294,967,295
Maximum number of files in a single folder: 4,294,967,295

100(в среднем символов в пути до файла)*16(бит)*4294967295(максимум файлов)=6871947672000(бит)=858993459000(байт)=~900Гб

Около 900Гб будет весить несжатый индекс максимального количества файлов

Что бы это значило...

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

не, алкогольное опьянение стало спадать, надо пойти упороться (и прочитать букварь :)

скажем, сесть на велик и доехать до города (в 35км от него). Там как раз дождь, здорово прочистит моск

или наоборот, приобрести еще водки, расчехлить VirtualBox и выложить на LetItBit индекс максимального количества файлов генты, установленной на NTFS...

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

развивай мысль...
как ты собрался выяснять своим аптом дир с модулями ядра, если при сборке был изменён EXTRAVERSION?
а если ты руками пересобрал ядро с другим конфигом?

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

пара подсказок:
ты этим говном пробовал пользоваться?
Remove old kernel versions, keeping either N newest kernels (with -n) or only
those which are referenced by a bootloader (with -a).
это херня!
ах да - фокус

[ root@desktop ] megabaks # eclean-kernel -d
Traceback (most recent call last):
  File "/usr/bin/eclean-kernel", line 26, in <module>
    sys.exit(main(sys.argv))
  File "/usr/lib/python2.7/site-packages/ecleankernel/cli.py", line 142, in main
    debug = debug)
  File "/usr/lib/python2.7/site-packages/ecleankernel/process.py", line 33, in get_removal_list
    raise SystemError('No vmlinuz found. This seems ridiculous, aborting.')
SystemError: No vmlinuz found. This seems ridiculous, aborting.
[ root@desktop ] megabaks #
ЛОЛШТО? о_О

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

не пробовал. просто есть eclean distfiles и packages. подумал по инерции что должно быть что-то для ядра. если запилишь свой кузявый скрипт - будет круто

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

dkms есть
а чистилка пока неготова

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

hint для моих юзкейсов: можно ещё не удалять симлинкнутые ядра, т.е. те, на который ведёт какой либо симлинк в boot.

объясни мне такой юзкейс
я вот не догоняю:
допустим есть ссылка на ядро без модулей и сорсов, зачем оставлять такое ядро, если оно всё равно негодное?

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

2ой файлик отработал.

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

Т.е. или имя ядра или ещё что неправильно понимает, я завтра смогу найти время подробно разобраться, что там не так.

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

что за мода скрывать всё подряд!?
конкретный пример давай:
файл ядра, file файл_ядра
наличие диры с модулями
наличие диры с сорсами ( если нет мэйкфайла можешь считать, что сорсов нет - портаж их унёс с собой при удалении пакета)
жду

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

ну и что не так? о_О
сорс диры - там у тебя только треш от сборки, самих исходников нет
мод диры - у тебя в /boot тупо нет ядер ниже 32 версии (речь про 2.6, естессно)

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

он мне предложил удалить:

/boot/vmlinuz-2.6.32-openvz-044.11-el6-gentoo-slep-1-gcbd8877 -> /usr/src/linux-2.6.32-openvz-044.11

/boot/vmlinuz-3.2.9-gentoo+ -> /usr/src/linux-3.2.9-gentoo

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

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

если что пинай а jabber, на лор я сегодня уже точно заходить не буду, а в jabber ещё наверное буду заглядывать.

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

потому что в первом нет «есть сорсы или модули? не удалять»

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