Как известно, механизм SCSI-резерваций (SCSI-2 Reservations, SCSI-3 Persistent Reservations, Persistent Group Reservations Emulation (PGRE)) используется в Sun/Oracle Cluster 3.X для организации работы кворума и резервированием общих для узлов кластера дисковых устройств или томов ("fencing"). В рамках эксплуатации кластера у администраторов периодически возникает необходимость управления этим механизмом и здесь возникает множество вопросов, ответы на которые не найти в официальной документации. Привожу небольшую "шпаргалку" которая отвечает на основные вопросы администрирования SCSI-резерваций в окружении Sun/Oracle Cluster.
Основные способы определения типа используемых SCSI-резерваций.
Sun/Oracle Cluster 3.2/3.3 :
"Глобальное" значение :
# cluster show|grep global_fencing
выдаваемое значение "pathcount" соответствует SCSI-2 резервациям, а "prefer3"- SCSI-3.
"Индивидуальное" значение для каждого устройства :
# cldev show <did device> |grep default_fencing
где <did device> - DID устройство, например d4 (соответствие DID и логических устройств Solaris можно при помощи команды cldev list -v )
выдаваемое значение "global" соответствует "глобальной" настройке в кластере (см.выше)
"pathcount" соответствует SCSI-2 резервациям, "scsi3" - SCSI-3
Sun Cluster 3.0/3.1
# scconf -pvv |grep access
где значения "scsi2" и "scsi3" говорят сами за себя.
кроме того, тип SCSI-резерваций хранится в конфигурационной "базе" CCR (Cluster Configuration Repository), а именно в файле infrastructure (в случае с Sun/Oracle Cluster 3.2/3.3 файл находится в /etc/cluster/ccr/global/, а для Sun Cluster 3.0/3.1в /etc/cluster/ccr/ ).
Например :
# cat /etc/cluster/ccr/global/infrastructure |grep access_mode
cluster.quorum_devices.1.properties.access_mode scsi2
Просмотр и удаление SCSI-2 и PGRE резерваций.
Для управления любым типом SCSI-резерваций в окружении Sun/Oracle Cluster 3.X предусмотрена утилита /usr/cluster/lib/sc/scsi (пакет SUNWscu).
Для того, чтобы определить разрешен ли доступ какого-либо узла кластера к конкретному дисковому устройству, можно воспользоваться подкомандой status утилиты scsi.
Например :
# /usr/cluster/lib/sc/scsi -c status -d /dev/did/rdsk/d4s2
status...1
Выдаваемое значение "1" означает что данный узел не имеет доступа к устройству, т.е. устройство зарезервировано другим узлом, а "0" - доступ разрешен.
Так как механизм SCSI-2 резерваций не предусматривает хранение ключей на устройстве при помощи SCSI-команд, возможности просмотра значений этих ключей при помощи утилиты scsi невозможно. Как известно, для хранения ключей в данном случае используется программный механизм Persistent Group Reservations Emulation (PGRE)). Просмотр "эмулируемых" резервации и ключей возможно при помощи утилиты /usr/cluster/lib/sc/pgre.
Просмотр PGRE-резерваций (пример) :
# /usr/cluster/lib/sc/pgre -c pgre_inresv -d /dev/did/rdsk/d4s2
resv[0]: key=0x4e03255200000002.
Просмотр PGRE-ключей (пример):
# /usr/cluster/lib/sc/pgre -c pgre_inkeys -d /dev/did/rdsk/d4s2
key[0]=0x4e03255200000001.
key[1]=0x4e03255200000002.
Удаление стандартных SCSI-2 резерваций выполняется при помощи подкоманды "release" утилиты scsi, запущенной на узле, владеющим резервацией. При этом необходимо выполнить команду /usr/cluster/lib/sc/scsi -c disfailfast -d /dev/did/rdsk/<did device>s2 перед удалением каких-либо резервацией, для того, чтобы обезопасить систему от нежелательных паник.
Например :
# /usr/cluster/lib/sc/reserve -c disfailfast -z /dev/did/rdsk/d4s2
# /usr/cluster/lib/sc/reserve -c release -z /dev/did/rdsk/d4s2
Возврат последней команды в виде "do_scsi2_release 0" означает достигнутый успех при удалении резервации.
Удаление PGRE ключей выполняется при помощи подкоманды "pgre_scrub" утилиты /usr/cluster/lib/sc/pgre
Например :
# /usr/cluster/lib/sc/pgre -c pgre_scrub -d /dev/did/rdsk/d4s2
Scrubbing complete. Use '/usr/cluster/lib/sc/pgre -c pgre_inkeys -d /dev/did/rdsk/d4s2'
to verify success.
Просмотр и удаление SCSI-3 резерваций.
Просмотр SCSI-3 резерваций и их ключей выполняется при помощи подкоманд "inresv" и "inkeys" утилиты scsi
Просмотр SCSI-3 резерваций (пример) :
# /usr/cluster/lib/sc/scsi -c inresv -d /dev/did/rdsk/d4s2
Reservations(1):
0x4e03255200000001
type ---> 5
Просмотр ключей SCSI-3 резерваций (пример) :
# /usr/cluster/lib/sc/scsi -c inkeys -d /dev/did/rdsk/d4s2
Reservation keys(3):
0x4e03255200000003
0x4e03255200000001
0x4e03255200000002
При этом вывод команд вида :
"
# /usr/cluster/lib/sc/scsi -c inkeys -d /dev/did/rdsk/d4s2
Reservation keys(0):
# /usr/cluster/lib/sc/scsi -c inresv -d /dev/did/rdsk/d4s2
Reservations(0):
"
или
"
# /usr/cluster/lib/sc/scsi -c inkeys -d /dev/did/rdsk/d4s2
do_scsi3_inkeys failed
Reservation keys(0):
# /usr/cluster/lib/sc/scsi -c inresv -d /dev/did/rdsk/d4s2
do_scsi3_inkeys failed
do_scsi-3_inresv failed
"
означает, что тип резерваций не SCSI-3 а SCSI-2.
Удаление и SCSI-3 резерваций и ключей выполняется при помощи подкоманды "scrub" утилиты scsi. При этом запуск можно выполнять, в отличие от SCSI-2, на любом узле, даже если этот хост не "владеет" резервацией и не входит в данный кластер. Выполнение команды /usr/cluster/lib/sc/scsi -c disfailfast -d /dev/did/rdsk/<did device>s2 перед удалением резервацией требуется также, как в случае с SCSI-2.
Например :
# /usr/cluster/lib/sc/scsi -c scrub -d /dev/did/rdsk/d4s2
Reservation keys currently on disk:
0x4e03255200000003
0x4e03255200000001
0x4e03255200000002
Attempting to remove all keys from the disk...
Scrubbing complete, use '/usr/cluster/lib/sc/scsi -c inkeys -d /dev/did/rdsk/d4s2' to verify success
Проверяем, что ключи действительно удалились :
# /usr/cluster/lib/sc/scsi -c inkeys -d /dev/did/rdsk/d4s2
Reservation keys(0):
Обращаем внимание, что резервация также удаляется :
# /usr/cluster/lib/sc/scsi -c inresv -d /dev/did/rdsk/d4s2
Reservations(0):
Хотелось бы также обратить внимание, что в дополнение к приведенным способам работы с SCSI-резервациями со стороны Sun/Oracle Cluster, существует возможность просмотра и удаления резерваций со стороны контроллеров некоторых массивов.