После наложения свежих патчей на мой x86 Solaris 10 и перезагрузки, вяснилась довольно неприятная вещь - зоны на сервере отказались стартовать.
Запуск zoneadm с опцией list показал что все зоны находятся в состоянии installed, хотя
значение autoboot для всех было выставлено в true:
$ zoneadm list -vc
ID NAME STATUS PATH
0 global running /
- z1-t installed /zones/z1-t
- z2-d installed /zones/z2-d
- z3-p installed /zones/z3-p
Сперва я решил, что зоны заняты какой-либо проверкой, но вывод svcs показал обратное:
$ svcs -a | grep zones
online 8:39:22 svc:/system/zones:default
Так как на сервере крутятся несколько важных служб, я решил запустить зоны вручную. Однако после запуска zoneadm с опцией boot и именем зоны сразу вывалилась ошибка:
$ zoneadm -z dns boot
zoneadm: zone 'dns': Failed to initialize privileges: No such file or directory
zoneadm: zone 'dns': call to zoneadmd failed
Ясно. Среди наложенных патчей был номер 122663-06, касающийся библиотеки libezonecfg.
Я решил поднять новую зону, чтобы убедиться что zonecfg работает, и посмотреть, нуждается ли конфигурирование привилегий в каких-либо дополнительных параметрах:
$ zonecfg -z test
test: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:test> create
zonecfg:test> info
zonepath:
autoboot: false
pool:
inherit-pkg-dir:
dir: /lib
inherit-pkg-dir:
dir: /platform
inherit-pkg-dir:
dir: /sbin
inherit-pkg-dir:
dir: /usr
zonecfg:test> set zonepath=/zones/test
zonecfg:test> commit
ld.so.1: zonecfg: fatal: relocation error: file /usr/sbin/zonecfg: symbol zonecfg_add_index: referenced symbol not found
Killed
Вывод не дал никакой информации относительно новых атритбутов, время поджимало и я решил удалить патч 122663-06. Однако patchrm отказался удалять патч, сообщив что он не может стартовать зоны:
$ patchrm 122663-06
Validating patches...
Loading patches installed on the system...
Done!
Checking patches that you specified for removal.
Done!
Approved patches will be removed in this order:
122663-06
Preparing checklist for non-global zone check...
Checking non-global zones...
Booting non-global zone dns for patch check...
ERROR: unable to boot zone: problem running on zone : error 1
zoneadm: zone ‘dns’: Failed to initialize privileges: No such file or directory
zoneadm: zone ‘dns’: call to zoneadmd failed
Can not boot non-global zone dns
Бр-р... Все дело в привилегиях. Придется все делать вручную. Я решил сам найти и вернуть назад библиотеку libzonecfg, которую подменил 122663-06. Чтбы найти предыдущую версию, я использовал find в директории /var/sadm:
$ cd /var/sadm
$ find . -name 122663-06
./pkg/SUNWcsr/save/pspool/SUNWcsr/save/122663-06
./pkg/SUNWcsr/save/122663-06
./pkg/SUNWzoneu/save/pspool/SUNWzoneu/save/122663-06
./pkg/SUNWzoneu/save/122663-06
./patch/122663-06
После того как я нашел директорию с патчем, я стал искать файл undo.Z.
Этот файл содержит бэкап каждого файла, заменяемого патчем, и из него patchrm восстанавливает предыдущее состояние. Я опять запустил find в директории pkg/SUNWzoneu. С помощью ls -li я получил:
$ ls -li ./pkg/SUNWzoneu/save/pspool/SUNWzoneu/save/122663-06/*.Z ./pkg/SUNWzoneu/save/122663-06/*.Z
102041 -rw-r–r– 1 root root 158534 Oct 29 08:56 ./pkg/SUNWzoneu/save/122663-06/undo.Z
101589 -rw-r–r– 1 root root 158534 Oct 29 08:56 ./pkg/SUNWzoneu/save/pspool/SUNWzoneu/save/122663-06/undo.Z
Размер и время обоих файлов было идентично, поэтому я скопировал содержимое в /tmp,
и распаковал файл в /tmp/u:
$ cp undo.Z /tmp
$ cd /tmp
$ uncompress undo.Z
$ pkgadd -s /tmp/u -d undo
The following packages are available:
1 SUNWzoneu Solaris Zones (Usr)
(i386) 11.10.0,REV=2005.01.21.16.34
Select package(s) you wish to process (or 'all' to process
all packages). (default: all) [?,??,q]:
Transferring package instance
Теперь надо было рассмотреть содержимое пакета в /tmp/u:
$ cd /tmp/u/*
$ find .
.
./pkginfo
./pkgmap
./install
./install/checkinstall
./install/postinstall
./reloc
./reloc/usr
./reloc/usr/lib
./reloc/usr/lib/amd64
./reloc/usr/lib/amd64/libzonecfg.so.1
./reloc/usr/lib/libzonecfg.so.1
./reloc/usr/share
./reloc/usr/share/lib
./reloc/usr/share/lib/xml
./reloc/usr/share/lib/xml/dtd
./reloc/usr/share/lib/xml/dtd/zonecfg.dtd.1
Вот она! Зоны надо срочно поднимать, поэтому заменяем libzonecfg.so на старую:
$ cd /usr/lib
$ pwd
/usr/lib
$ cp libzonecfg.so.1 libzonecfg.so.1.orig
$ cp /tmp/u/SUNWzoneu/reloc/usr/lib/libzonecfg.so.1 .
$ cd /usr/lib/amd
$ pwd
/usr/lib/amd
$ cp libzonecfg.so.1 libzonecfg.so.1.orig
$ cp /tmp/u/SUNWzoneu/reloc/usr/lib/amd/libzonecfg.so.1 .
Теперь запускаем зоны:
Этот опыт показал, что патчи надо тестировать тщательнее, чем это делается инженерами Sun. Следующий вопрос, который теперь стоит предо мною - как все-таки наложить несчастную заплатку...
(По материалам блога prefetch.net)