Назад | Перейти на главную страницу

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

Моя цель - автоматизировать процедуру резервного копирования на небольшом OpenSolaris NAS (под управлением OmniOS + napp-it на HP Microserver 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. Отображает диски, но мне нужно найти точные серийные номера, потому что он не отображает информацию о портах. Также нужно делать каждые x минут.
  4. С помощью cfgadm с синтаксисом SELECT для фильтрации статуса розетки. Не работает, потому что прошивка ничего не срабатывает (может быть, объединительная плата для этого слишком дешевая).
  5. Распознавание включения / выключения корпуса. Было бы хорошо, но я не мог понять, как этого добиться.
  6. Переназначение кнопки питания или добавление другой кнопки к машине. Могло работать, но я тоже не знаю, как это сделать.

Думаю, мне понадобятся две вещи:

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

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

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

  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 сообщения в системных журналах).

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

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

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

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


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

Используя первый пример из man-страницы и 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 процесс импорта пула - это системная служба / демон. Но периодически запускать его бесплатно. Он обнаружит диск и связанный с ним пул.

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