Как автоматически обнаружить вставленный диск SATA в Solaris, если состояние cfgadm отключено?

Моя цель состоит в том, чтобы автоматизировать процедуру резервного копирования на небольшом сетевом хранилище OpenSolaris (на котором запущен OmniOS + napp-it на микросервере HP N54L) в сочетании с дисками SATA.

Фон:

Я установил один из этих лотков для жестких дисков размером 5,25 -> 3,5 дюйма без несущей, которые содержат простую объединительную панель SATA или SAS/SATA с одним портом, кнопкой питания и несколькими светодиодами (питание и активность жесткого диска). Для резервного копирования нескольких жестких дисков (по одному в неделю по очереди, хранящихся вне сайта) я написал скрипт, который использует zfs send/recv выгрузить весь основной пул, включая все снимки (обновляя только новые блоки). Этот скрипт отлично работает, когда я запускаю его вручную.

Я бы хотел еще больше автоматизировать этот процесс, поскольку к NAS не подключена прямая VGA или последовательная консоль, и очень сложно вставить диск, вернуться в настольную систему, войти в веб-интерфейс или SSH и запустить скрипт вручную., Запуск по таймеру через задание cron не возможен, поскольку дни резервного копирования могут незначительно отличаться (забыли диск, праздники и т. Д.). Таким образом, резервное копирование должно начаться сразу после вставки диска.

Проблема:

В скрипте я использую cfgadm подключить + настроить и позже отключить + отключить диски. Если я только вставляю диск, и он раскручивается, я не могу знать, что диск там. Возможные решения, которые я уже рассмотрел:

  1. Поиск нового диска и zpool каждые x минут непрерывно с помощью cfgadm -f -c connect и проверка результатов ошибок. Не очень элегантно
  2. проверка /var/adm/messages каждые x минут и поиск пути к устройству или AHCI. Это невозможно, поскольку сообщения пишутся только в том случае, если устройство подключено вручную.
  3. С помощью iostat -En, Отображает диски, но я должен grep для точных серийных номеров, потому что он не перечисляет информацию о порте. Также должно быть сделано каждые х минут.
  4. С помощью cfgadm с синтаксисом SELECT для фильтрации состояния розеток. Не работает, потому что вставка ничего не вызывает (возможно, объединительная плата слишком дешева для этого).
  5. Распознавание включения / выключения корпуса. Было бы хорошо, но я не мог понять, как это сделать.
  6. Переназначение кнопки питания или добавление еще одной кнопки на машину. Может работать, но я тоже не знаю, как это сделать.

Я думаю, что мне нужно две вещи:

  • надежный способ определения статуса диска и порта в комбинации (таким образом, только правильный диск обнаружен в правильном слоте)
  • способ зарегистрировать это обнаружение и вызвать событие (запустить скрипт оболочки)

Это возможно? Если нет, что бы вы предложили в качестве альтернативы?

Окончательное решение (обновлено 2015-01-26):

Для тех, у кого схожие проблемы в будущем:

  1. Включите горячую замену AHCI в OmniOS, как подробно описано в принятом ответе gea.
  2. использование syseventadm как подробно описано в моем собственном ответе, чтобы запустить сценарий резервного копирования, когда диск подключается к сети.
  3. Убедитесь, что ваши кабели, контроллер и диски исправны и хорошо работают вместе (у меня были проблемы с дисками WD SE 4 ТБ и встроенным контроллером AHCI SATA, что привело к случайному WARNING: ahci0: ahci_port_reset port 5 the device hardware has been initialized and the power-up diagnostics failed сообщения в журналах системы).

3 ответа

Решение

Встроенный Sata/AHCI поддерживает горячее подключение, но по умолчанию это отключено в OmniOS: Чтобы включить, добавьте следующую строку в /etc/system

установить sata:sata_auto_online=1

Я добавлю этот ответ к документу о том, что я узнал о мониторинге событий (также может быть полезным в других случаях):

Пытаясь задать вопрос по unix/linux.SE, я заметил полезную ветку об использовании udev в Linux для мониторинга событий ядра. В качестве эквивалентного инструмента для Solaris я наткнулся на предложение использовать syseventadm который следит за sysevents и запускает определенные действия / сценарии.


Сначала я не нашел ничего, кроме копий справочной страницы и некоторых обсуждений проблемы с Xen Hypervisor, но поддерживаемые события перечислены в /usr/include/sys/sysevent/eventdefs.h (или онлайн на /usr/src/uts/common/sys/sysevent/eventdefs.h в различных репозиториях) и другие файлы в этом каталоге.

Используя первый пример из manpage и syseventadm add -c EC_zfs -s ESC_ZFS_scrub_start /path/to/script.sh \$pool_name Я успешно протестировал пример события, которое срабатывает каждый раз при запуске очистки и возвращает имя пула в качестве первого аргумента.


После некоторых проб и ошибок я нашел правильный способ отслеживать новые добавленные диски:

syseventadm add -c EC_dev_add -s disk /path/to/script.sh \$version \$dev_name \$phys_path \$driver_name \$instance
syseventadm restart

Все после disk является необязательным и напрямую передается сценарию в качестве аргументов $1 в $5,

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

Интересный вопрос... что-то вроде научного эксперимента, так как я, вероятно, просто использую USB или отправляю удаленно или получаю это по расписанию...

Но в вашем случае я бы не стал "искать" диск с cfgadm или способ анализа журнала. Это не масштабируется.

Я бы просто назвал съемный диск с уникальным именем пула ZFS и логикой сценария вокруг периодического zpool import, В ZFS под Linux процесс импорта пула - это системный сервис / демон. Но нет необходимости периодически запускать его. Он обнаружит диск и связанный пул.

Я надеюсь, что вы также экспортируете пул, когда закончите с резервной копией. Это будет охватывать ситуации, когда диск остается на сервере в течение нескольких циклов резервного копирования. Как оставить резервную копию ленты на своем диске.

Другие вопросы по тегам