Как автоматически обнаружить вставленный диск 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
подключить + настроить и позже отключить + отключить диски. Если я только вставляю диск, и он раскручивается, я не могу знать, что диск там. Возможные решения, которые я уже рассмотрел:
- Поиск нового диска и zpool каждые x минут непрерывно с помощью
cfgadm -f -c connect
и проверка результатов ошибок. Не очень элегантно - проверка
/var/adm/messages
каждые x минут и поиск пути к устройству или AHCI. Это невозможно, поскольку сообщения пишутся только в том случае, если устройство подключено вручную. - С помощью
iostat -En
, Отображает диски, но я должен grep для точных серийных номеров, потому что он не перечисляет информацию о порте. Также должно быть сделано каждые х минут. - С помощью
cfgadm
с синтаксисом SELECT для фильтрации состояния розеток. Не работает, потому что вставка ничего не вызывает (возможно, объединительная плата слишком дешева для этого). - Распознавание включения / выключения корпуса. Было бы хорошо, но я не мог понять, как это сделать.
- Переназначение кнопки питания или добавление еще одной кнопки на машину. Может работать, но я тоже не знаю, как это сделать.
Я думаю, что мне нужно две вещи:
- надежный способ определения статуса диска и порта в комбинации (таким образом, только правильный диск обнаружен в правильном слоте)
- способ зарегистрировать это обнаружение и вызвать событие (запустить скрипт оболочки)
Это возможно? Если нет, что бы вы предложили в качестве альтернативы?
Окончательное решение (обновлено 2015-01-26):
Для тех, у кого схожие проблемы в будущем:
- Включите горячую замену AHCI в OmniOS, как подробно описано в принятом ответе gea.
- использование
syseventadm
как подробно описано в моем собственном ответе, чтобы запустить сценарий резервного копирования, когда диск подключается к сети. - Убедитесь, что ваши кабели, контроллер и диски исправны и хорошо работают вместе (у меня были проблемы с дисками 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 процесс импорта пула - это системный сервис / демон. Но нет необходимости периодически запускать его. Он обнаружит диск и связанный пул.
Я надеюсь, что вы также экспортируете пул, когда закончите с резервной копией. Это будет охватывать ситуации, когда диск остается на сервере в течение нескольких циклов резервного копирования. Как оставить резервную копию ленты на своем диске.