Oracle 12c и PRIF-15: invalid format for subnet

Date December 23rd, 2014 Author Vitaly Agapov

– Скажи мне, Шамон, тебя никогда не удивляло, что в мире столько зла?
– Нет. Если удивляться каждой несправедливости, придётся весь век ходить с разинутым ртом.

Святослав Логинов «Колодезь»

oracle-godzillaМежду блогами системных администраторов и блогами всяческих DBA я приметил одну забавную разницу. Системные администраторы чаще всего пишут статьи в стиле "вот такую крутую штуку я сделал", "вот такая крутая фича есть", "а ещё вот так вот можно круто и удобно сделать". DBA же (оракловые в основном, про других не скажу) чаще всего пишут про "вот такая проблема вылезла и так вот я её героически заборол", "наткнулся-де на такой вот баг" и всё в таком духе. Это не парадигма, но определённый перекос несомненно есть.

Так вот, что касается баз данных, то тут я не настоящий сварщик, но пишу-таки этот пост и он отлично укладывается в DBA-шаблон.  Есть такой вот баг…

Дело в том, что, если на сетевом интерфейсе в адресе подсети есть байт 255, то скрипт root.sh, запуская oifcfg setif для настройки сети, будет отваливаться с ошибкой, указанной в названии статьи. Не получится и добавить такой интерфейс вручную:

# <grid-path>/12.1.0.2/bin/oifcfg setif -global eth0/192.168.255.0:public -force
PRIF-15: invalid format for subnet

Это баг, и о нём в Оракле знают:

root.sh fails with CLSRSC-287 due to: PRIF-15: invalid format for subnet (Doc ID 1933472.1)

Но багфикса нет, а есть описанный в документе workaround, который заключается в "to change subnet so it won't include 255 in subnet ID". Рассуждать и придумывать эпитеты некогда, поэтому вот вариант решения.

Если отбросить ход мыслей и неудачные попытки, то верный метод такой: открыть файл <grid-path>/12.1.0.2/bin/oifcfg.bin в hex-редакторе. Я использовал bvi (можно, наверное, использовать и обычный vim в режиме :%!xxd). Там на смещении 00010C7E нужно заменить 5 на 6 (или 0x35 на 0x36). Суть в том, что нам повезло, и oifcfg.bin использует для валидации и сравнения строковые ресурсы, которые в бинарнике найти и поменять можно довольно легко. В противном случае задача бы сильно усложнилась.

Если сформулировать решение в более общем виде, то надо найти в бинарнике три байта 0x323535 (то есть строку "255") и заменить её на строку, например, 0x323536.

Волшебство, но работает, как говорят наши западные соседи, like a charm.

Tags:
Category: Oracle | No comments »

Comments

Leave a comment

 Comment Form