Как ни странно, начитавшись статей типа Ускорение openSUSE: prelink и Сокращение времени загрузки Fedora 17 c 15 до 3 секунд можно обнаружить, что запускать prelink постоянно вручную довольно "не кошерно". Этак надо у себя прививать новую привычку (можно, например, даже напоминание на мобильнике устанавливать).
Мейнтейнеры некоторых дистрибутивов это осознали и начали добавлять в пакеты специальный скрипт для планировщика задач cron и для значительного упрощения своей участи пользователи prelink могут этот скрипт коварно позаимствовать. С поисками далеко идти не нужно - достаточно взять файл prelink.cron из prelink-0.4.5-4.fc17.src.rpm и немного исправить.
Пошагово:
Для ежедневного выполнения prelink, данный файл нужно скопировать в /etc/cron.daily/ и дать права на выполнение:
Отредактировать скрипт, чтобы он использовал переменные из файла /etc/sysconfig/prelink специфичные для openSUSE. Содержимое его при этом становится таким:
Убедитесь, что cron запущен, чтобы не было недоразумений:
Согласно данным из /etc/sysconfig/cron, prelink.cron будет выполняться через 15 минут после загрузки системы, а в следующий раз через 24 часа и так далее.
Дополнительно к этому можно выставить параметру USE_PRELINK в файле /etc/sysconfig/prelink значение "yes", чтобы prelink автоматически запускался после каждого выполнения SuSEconfig, который выполняется, например, после обновления многих системных пакетов, да и вообще после операций с пакетами в YaST2. Сделать это можно как с помощью любимого текстового редактора, так и модуля YaST2 "редактор /etc/sysconfig".
Мейнтейнеры некоторых дистрибутивов это осознали и начали добавлять в пакеты специальный скрипт для планировщика задач cron и для значительного упрощения своей участи пользователи prelink могут этот скрипт коварно позаимствовать. С поисками далеко идти не нужно - достаточно взять файл prelink.cron из prelink-0.4.5-4.fc17.src.rpm и немного исправить.
Пошагово:
Для ежедневного выполнения prelink, данный файл нужно скопировать в /etc/cron.daily/ и дать права на выполнение:
chmod +x /etc/cron.daily/prelink.cron
Отредактировать скрипт, чтобы он использовал переменные из файла /etc/sysconfig/prelink специфичные для openSUSE. Содержимое его при этом становится таким:
#!/bin/sh
. /etc/sysconfig/prelink
renice +19 -p $$ >/dev/null 2>&1
if [ "$USE_PRELINK" != yes ]; then
if [ -f /etc/prelink.cache ]; then
/usr/sbin/prelink -ua 2>&1
rm -f /etc/prelink.cache
# Restart init if needed
[ -n "$(find `ldd /sbin/init | awk 'NF == 4 { print $3 }'` /sbin/init -ctime -1 2>/dev/null )" ] && /sbin/telinit u
fi
exit 0
fi
if [ ! -f /etc/prelink.cache -o -f /var/lib/prelink/force ] \
|| grep -q '^prelink-ELF0.[0-2]' /etc/prelink.cache; then
# If cache does not exist or is from older prelink versions or
# if we were asked to explicitely, force full prelinking
rm -f /etc/prelink.cache /var/lib/prelink/force
PRELINK_OPTS="$PRELINK_OPTS -f"
/usr/sbin/prelink -a 2>&1
# Restart init if needed
[ -n "$(find `ldd /sbin/init | awk 'NF == 4 { print $3 }'` /sbin/init -ctime -1 2>/dev/null )" ] && /sbin/telinit u
fi
exit 0
Убедитесь, что cron запущен, чтобы не было недоразумений:
systemctl status cron.service
Согласно данным из /etc/sysconfig/cron, prelink.cron будет выполняться через 15 минут после загрузки системы, а в следующий раз через 24 часа и так далее.
Дополнительно к этому можно выставить параметру USE_PRELINK в файле /etc/sysconfig/prelink значение "yes", чтобы prelink автоматически запускался после каждого выполнения SuSEconfig, который выполняется, например, после обновления многих системных пакетов, да и вообще после операций с пакетами в YaST2. Сделать это можно как с помощью любимого текстового редактора, так и модуля YaST2 "редактор /etc/sysconfig".
> запускать prelink постоянно вручную довольно "не кошерно"
ОтветитьУдалитьАга :) Поэтому надо пользоваться zsh'ем: там есть так называемые глобальные псевдонимы.
Так что можно автоматом запускать prelink после каждой операции up и du - ради единичного in, наверное, смысла нету.
Кстати, как я понял, похожий механизм реализован в YaST
PS надо будет таки написать про глобальные псевдонимы подробнее - не тщеславия ради, но к вящей славе Zsh.
Это не то же самое, что и alias в bash?
ОтветитьУдалитьНет, обычные алиасы там тоже есть. А глобальные алиасы - это для конструкций -- конвейеров, перенаправлений etc.
УдалитьНапример, в данном случае это будет нечто вроде:
alias -g P='|prelink -avfmR'
Только чего-то с zypper'ом у меня это не хочет работать (с yum'ом работало). Надо будет ещё подумать.
Не поэтому ли - https://bugzilla.novell.com/show_bug.cgi?id=752112 ?
УдалитьНе именно это, у меня тоже
УдалитьName: zsh
Version: 4.3.12-6.1.2
Arch: x86_64
но такой ошибки нету
Но похоже какое-то родственное явление
Главный недостаток zsh - чтобы вылавливать такие штуки, надо прочитать хотя бы треть из его тысячестраничной документации :)
USE_PRELINK в файле /etc/sysconfig/prelink даёт что-то?
ОтветитьУдалитьА если даёт автоматический прелинк, то зачем задание cron?
При обновлении пакетов USE_PRELINK никак себя не проявляет. Во всяком случае, в логах не видно никаких действий.
Да, при использовании YaST2 каждый раз после удаления, установки или обновления, запускается prelink, что видно по окну, где отображаются действия типа запуска всяких SuSeconfig. На SuSeconfig.prelink стоит заметное время, по крайней мере у меня секунд сорок, и по активности жёстких дисков в это время заметна его работа.
УдалитьПосмотрел внимательней сейчас: в окне "Запись системной конфигурации" первое действие это "Создание кэша linker'a", далее "Выполнение SuSEconfig.prelink" и в это время можно его в консоли выловить:
> ps -A|grep prelink
26366 pts/2 00:00:00 prelink
Когда окно самозакрывается, то и работы prelink уже нет.
По поводу cron:
SuSEconfig это, конечно, очень хорошо, но он же не запускается, например, когда что-то делается с помощью zypper, поэтому prelink об этом ничего не знает. Так вот cron его хотя бы раз в день запустит и prelink уже обнаружит изменения.
Дошли у меня, наконец, руки разобраться со всем этим.
ОтветитьУдалитьВынужден сообщить, что приведённый вами скрипт не будет работать как задумано.
Дело в том, что в скрипте используются переменные и значения из файла /etc/sysconfig/prelink. А в Fedora и в openSUSE эти файлы значительно отличаются.
В частности, скрипт производит проверку условия "$PRELINKING" != yes. Но в openSUSE используется USE_PRELINK="yes". Таким образом скрипт делает совершенно противоположенное -- удаляет прелинкинг.
PRELINK_FULL_TIME_INTERVAL и PRELINK_NONRPM_CHECK_INTERVAL в openSUSE отсутствуют. Т. е. эта часть скрипта просто игнорируется и не работает.
В общем, не всегда полезно отключать создание логов.
Спасибо за ценное наблюдение. Исправлюсь.
УдалитьСобытия развиваются интересно.
ОтветитьУдалитьВ 12.2 на prelink поставили крест, можно сказать.
https://features.opensuse.org/313545
https://build.opensuse.org/request/show/125489
Похоже, что придётся ещё более самописными скриптами обходиться. Нам же не привыкать :)
УдалитьРезультаты есть?
ОтветитьУдалитьРаботы скрипта?
Удалить