Скрипты установки: Запуск скриптов при установке и/или удалении пакета

Пакетные системы типа ipkg или deb поддерживают пред- и пост- установочные и удаляющие скрипты, запускаемые при установки и/или удалении пакета с целевой системы.

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

Поддерживаются следующие скрипты:

preinst

Скрипт preinst запускается перед установкой пакета. В процессе преинсталляции содержимое пакета не доступно для скрипта. Такие скрипты не часто используются.

postinst

Скрипт postinst запускается после установки пакета. В процессе постинсталляции содержимое пакета может быть использовано. Такие скрипты чаще всего используются для создания директорий изменчивых (volatile) файлов, регистрации и запуска демонов и настройки SUID для исполняемых файлов.

prerm

Скрипт prerm запускается до удаления содержимого пакета. В процессе выполнения prerm содержимое пакета еще доступно. Такие скрипты не часто используются.

postrm

Скрипт postrm запускается после удаления содержимого пакета. При выполнении postrm содержимое пакета уже не существует и соответственно не может быть использовано скриптом. Такие скрипты чаще всего используются для обновления альтернатив (сообщая системе, что этот пакет больше не доступен и другая альтернатива должна быть выбрана).

Скрипты регистрируются определением функции:

Следующий пример из ndisc6 показывает postinst скрипты, регистрируемые для трех пакетов, создаваемых ndisc6:

# Enable SUID bit for applications that need it
pkg_postinst_${PN}-rltraceroute6 () {
    chmod 4555 ${bindir}/rltraceroute6
}
pkg_postinst_${PN}-ndisc6 () {
    chmod 4555 ${bindir}/ndisc6
}
pkg_postinst_${PN}-rdisc6 () {
    chmod 4555 ${bindir}/rdisc6
}

Замечание

Эти скрипты будут запускаться оболочкой /bin/sh на целевом устройстве, которая чаще всего представляет собой busybox sh, но это может быть также bash или какая-либо другая sh совместимая оболочка. Как и в прочих подобных случаях, нужно придерживаться стандартного sh синтаксиса и расширения bash не должны использоваться в ваших скриптах.

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

update-rc.d

Этот класс используется демонами для регистрации их инициализационных скриптов в системе.

Более подробно описывается в разделе initscripts.

module

Этот класс используется модулями ядра linux. Он заботится о своевременном вызове depmod и update-modules в процессе установки и удаления модулей ядра.

kernel

Используется самим ядром linux. При установке и удалении ядра бывает необходимо выполнить достаточно много действий и этот класс занимается генерацией необходимых скриптов.

qpf

Используется при установке и/или удалении gpf шрифтов. Регистрирует скрипты для обновления путей к шрифтам и обновления информации о кэше шрифтов для поддержания данных о шрифтах в корректном состоянии.

update-alternatives

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

Подробности можно посмотреть в разделе alternatives.

gtk-icon-cache

Используется пакетами, добавляющими новые gtk иконки, и занимается обновлением кеша иконок при установке и удалении пакетов.

gconf

package

Базовый класс, используемые классами упаковки для пакетов типа ipkg или deb. Класс package может генерировать скрипты, использующиеся для обновления кэша динамических линкеров ld.

Следующий пример из p3scan показывает postinst скрипт, который проверяет наличие и при необходимости создает нужные записи пользователя и группы, регистрирует необходимость в изменчивых (volatile) файлах (директориях и/или файлах в /var). В дополнение к явному определению postinst скрипта рецепт использует класс update-rc.d, добавляющем дополнительные команды к postinst скрипту, регистрирующие init скрипты и запускающие демон (вызовом update-rc.d, как описано в разделе alternatives).

inherit autotools update-rc.d

...

# Add havp's user and groups
pkg_postinst_${PN} () {
        grep -q mail: /etc/group || addgroup --system havp
        grep -q mail: /etc/passwd || \
            adduser --disabled-password --home=${localstatedir}/mail --system \
                    --ingroup mail --no-create-home -g "Mail" mail
        /etc/init.d/populate-volatile.sh update
}

Некоторые скрипты в существующих рецептах содержат следующие строки:

if [ x"$D" = "x" ]; then
    ...
fi

TODO: перевод This is testing if the installation directory, D, is defined and if it is no actions are performed. The installation directory will not be defined under normal circumstances. The primary use of this test is to permit the application to be installed during root filesystem generation. In that situation the scripts cannot be run since the root filesystem is generated on the host system and not on the target. Any required script actions would need to be performed via an alternative method if the package is to be installed in the initial root filesystem (such as including any required users and groups in the default passwd and group files for example.)