четверг, 31 мая 2012 г.

Автоматическое выполнение prelink по расписанию

Как ни странно, начитавшись статей типа Ускорение openSUSE: prelink и Сокращение времени загрузки Fedora 17 c 15 до 3 секунд можно обнаружить, что запускать prelink постоянно вручную довольно "не кошерно". Этак надо у себя прививать новую привычку (можно, например, даже напоминание на мобильнике устанавливать).
Мейнтейнеры некоторых дистрибутивов это осознали и начали добавлять в пакеты специальный скрипт для планировщика задач 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".

13 комментариев:

  1. > запускать prelink постоянно вручную довольно "не кошерно"

    Ага :) Поэтому надо пользоваться zsh'ем: там есть так называемые глобальные псевдонимы.
    Так что можно автоматом запускать prelink после каждой операции up и du - ради единичного in, наверное, смысла нету.
    Кстати, как я понял, похожий механизм реализован в YaST

    PS надо будет таки написать про глобальные псевдонимы подробнее - не тщеславия ради, но к вящей славе Zsh.

    ОтветитьУдалить
  2. Ответы
    1. Нет, обычные алиасы там тоже есть. А глобальные алиасы - это для конструкций -- конвейеров, перенаправлений etc.
      Например, в данном случае это будет нечто вроде:
      alias -g P='|prelink -avfmR'
      Только чего-то с zypper'ом у меня это не хочет работать (с yum'ом работало). Надо будет ещё подумать.

      Удалить
    2. Не поэтому ли - https://bugzilla.novell.com/show_bug.cgi?id=752112 ?

      Удалить
    3. Не именно это, у меня тоже
      Name: zsh
      Version: 4.3.12-6.1.2
      Arch: x86_64
      но такой ошибки нету
      Но похоже какое-то родственное явление
      Главный недостаток zsh - чтобы вылавливать такие штуки, надо прочитать хотя бы треть из его тысячестраничной документации :)

      Удалить
  3. USE_PRELINK в файле /etc/sysconfig/prelink даёт что-то?

    А если даёт автоматический прелинк, то зачем задание cron?

    При обновлении пакетов USE_PRELINK никак себя не проявляет. Во всяком случае, в логах не видно никаких действий.

    ОтветитьУдалить
    Ответы
    1. Да, при использовании 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 уже обнаружит изменения.

      Удалить
  4. Дошли у меня, наконец, руки разобраться со всем этим.

    Вынужден сообщить, что приведённый вами скрипт не будет работать как задумано.

    Дело в том, что в скрипте используются переменные и значения из файла /etc/sysconfig/prelink. А в Fedora и в openSUSE эти файлы значительно отличаются.
    В частности, скрипт производит проверку условия "$PRELINKING" != yes. Но в openSUSE используется USE_PRELINK="yes". Таким образом скрипт делает совершенно противоположенное -- удаляет прелинкинг.
    PRELINK_FULL_TIME_INTERVAL и PRELINK_NONRPM_CHECK_INTERVAL в openSUSE отсутствуют. Т. е. эта часть скрипта просто игнорируется и не работает.

    В общем, не всегда полезно отключать создание логов.

    ОтветитьУдалить
    Ответы
    1. Спасибо за ценное наблюдение. Исправлюсь.

      Удалить
  5. События развиваются интересно.
    В 12.2 на prelink поставили крест, можно сказать.

    https://features.opensuse.org/313545
    https://build.opensuse.org/request/show/125489

    ОтветитьУдалить
    Ответы
    1. Похоже, что придётся ещё более самописными скриптами обходиться. Нам же не привыкать :)

      Удалить