null

IDR - временное решение постоянных проблем

Сервисное обслуживание всегда сопряжено с нахождением и исправлением ошибок в операционной системе. Solaris 10 не исключение. Sun Microsystems при разработке исправлений или патчей вводит несколько специальных понятий. К ним относятся IDR и T-patch.

IDR - Interim Diagnostic or Relief. Дословно - временная диагностика или помощь. Предназначена для сбора дополнительной диагностической информации или исправления только что найденой ошибки.  Готовиться инженером центра технической поддержки на основании исходников системы определенного патч-уровня (того, который находится на целевой системе). При этом компилируются новые двоичные файлы, которые устанавливаются у заказчика. Данные исправления в исходниках не являются частью одной из веток разработки Solaris, а поддерживаются инженером самостоятельно.

Если решение проблемы является идеологически правильным, то исправления вносятся в текущий разрабатывемый релиз и/или портируются в предыдущие поддерживаемые версии. После этого появляется так называемый временный патч -
T-patch. Временный патч проходит все стадии тестирования, включая и обязательное у заказчка, и становится обычным обновлением, которое в дальнейшем поглощается каким-нибудь другим, более большим =).

К слову существует еще один вид патча, который называется ISR - Interim Security Relief - который служит для "затычек" дыр в безопасности.

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

Теперь технические детали как собрать:

1) Берем последний патч продукта, который обновляет данный файл(ы). Возьмем например утилиту df. Я дописал к ней дополнытельную опцию -Ы  на основе исходников OpenSolaris (не скажу, для чего =) ). В Solaris 10 она входит в пакет SUNWcsu. Последний патч на данный пакет для архитектуры sparc - 141444-09. Распаковываем, и сразу, каталог переименовываем в имя нашего патча: IDR0T0132-01

2) Идем в патч директорию и удалям все лишнее =) оставляем только директорию с пакетом в котором присутствует данный файл, сами файлы и скрипты в директории патча. Вот как-то так:

IDR0T0132-01/
IDR0T0132-01/patchinfo
IDR0T0132-01/SUNWcsu/
IDR0T0132-01/SUNWcsu/install/
IDR0T0132-01/SUNWcsu/install/checkinstall
IDR0T0132-01/SUNWcsu/install/i.none
IDR0T0132-01/SUNWcsu/install/patch_checkinstall
IDR0T0132-01/SUNWcsu/install/patch_postinstall
IDR0T0132-01/SUNWcsu/install/postinstall
IDR0T0132-01/SUNWcsu/install/preinstall
IDR0T0132-01/SUNWcsu/install/prepatch.template
IDR0T0132-01/SUNWcsu/install/u.none
IDR0T0132-01/SUNWcsu/pkgmap
IDR0T0132-01/SUNWcsu/reloc/
IDR0T0132-01/SUNWcsu/reloc/usr/
IDR0T0132-01/SUNWcsu/reloc/usr/sbin/
IDR0T0132-01/SUNWcsu/reloc/usr/sbin/df
IDR0T0132-01/SUNWcsu/pkginfo
IDR0T0132-01/.diPatch 

3) Редактируем IDR0T0132-01/patchinfo. Особое внимание обращаем на поля PATCH_REQUIRES - содержит имя основного патча, который мы модифицируем и PATCH_INCOMPAT - содержит следующую версию нашего патча, и все следующие версии основного патча. Также, желательно, добавить туда все версии патчей, который требует PATCH_REQUIRES в нашем оригинальном 141444-09, увеличивая версии на 1! Измененные строчки - italic

PATCHINFOVERSION="1.0"
PATCHID=IDR0T0132-01
PATCH_CORRECTS='Automate-1.0'
PATCH_ARCH='sparc'
PATCH_OS='SunOS'
PATCH_OSRELEASE='5.10'
PATCH_PROPERTIES='clientusr clientroot nonstandart'
PATCH_REQUIRES=141444-09
PATCH_INCOMPAT='IDRELC132-02 141444-10'

4) Далее редактируем IDR0T0132-01/SUNWcsu/pkginfo. Изменения почти такие-же:

PKG=SUNWcsu
NAME=Core Solaris, (Usr)
ARCH=sparc
VERSION=11.10.0,REV=2005.01.21.15.53
SUNW_PRODNAME=SunOS
SUNW_PRODVERS=5.10/Generic
SUNW_PKGTYPE=usr
SUNW_OBSOLETES=
MAXINST=1000
CATEGORY=system
DESC=core software for a specific instruction-set architecture
VENDOR=Tune-IT =)
HOTLINE=Please contact your local service provider
EMAIL=
CLASSES=none
BASEDIR=/
SUNW_PKGVERS=1.0
SUNW_PKG_ALLZONES=true
SUNW_PKG_HOLLOW=false
SUNW_REQUIRES=141444-09
SUNW_INCOMPAT=IDRELC132-02 141444-10
SUNW_PATCHID=IDR0T0132-01
SUNW_PATCH_TYPE=interim_relief
SUNW_PATCH_PROPERTIES=nonstandard

PSTAMP=blade20100211051628


5) Можно было пойти правильным путем и воспользоваться стандатными средствами создания пакетов (pkgmk, pkgproto - см. man страницы). Но мы пойдем другим путем. Из файла IDR0T0132-01/SUNWcsu/pkgmap убираем все лишнее =) Вот что оставляем:

: 1 3189
1 i pkginfo 1791 41175 1253047041
1 d none usr/sbin 0755 root sys
1 f none usr/sbin/df 0555 root bin 36784 10089 1253046016
1 i checkinstall 5851 7042 1256844928
1 i i.none 6361 24670 1256844928
1 i patch_checkinstall 1555 54237 1256844928
1 i patch_postinstall 3788 32116 1256844928
1 i postinstall 11588 50722 1256844928
1 i preinstall 7437 28593 1256844928
1 i prepatch.template 3789 33252 1256844928
1 i u.none 3276 58591 1256844928


6) А дальше начинается шаманство. Говорим patchadd IDR0T0132-01. Он ругаеся подобным образом:

ERROR: content verification of <pkginfo> failed
    file size <1791> expected <599> actual
    file cksum <
41175> expected <46331> actual

А потом также на /usr/sbin/df

Правим длины и контрольные суммы (догадайтесь где) и все! Можно ставить и радовать клиента. По правилам. Почти =)