Вопрос или проблема
Я тестирую ZFSonLinux, и у меня есть экспериментальный пул с именем usbcka
. В нем только тестовые данные. Я симулирую сбой оборудования, чтобы определить поведение в этом сценарии. Я знаю, что эта конфигурация не имеет избыточности, и это принимается как риск (решение не было принято мной). ИСПРАВЛЕНИЕ: дополнительная информация: ОС будет находиться на избыточном хранилище.
root@carbon:~# zpool status -xv
pool: usbcka
состояние: UNAVAIL
статус: Одно или несколько устройств неисправны в ответ на сбои ввода-вывода.
действие: Убедитесь, что затронутые устройства подключены, затем выполните 'zpool clear'.
см.: http://zfsonlinux.org/msg/ZFS-8000-HC
сканирование: не запрашивалось
конфигурация:
ИМЯ СОСТОЯНИЕ ЧТЕНИЕ ЗАПИСЬ CHECKSUM
usbcka UNAVAIL 0 0 0 недостаточно реплик
usb1 ВКЛЮЧЕНО 0 0 0
usb2 НЕИСПРАВНО 0 0 0 слишком много ошибок
ошибки: Список ошибок недоступен (недостаточно привилегий)
Устройства usb1
и usb2
— это устройства LUKS, смонтированные с помощью cryptsetup.
** В рамках теста я намеренно физически отключил подлежащее устройство для usb2
** Предположим, что неисправное устройство было жестким диском, который невозможно отремонтировать, сбой оборудования.
Я пробовал
root@carbon:~# zpool destroy -f usbcka
невозможно открыть 'usbcka': ввод-вывод пула в настоящее время приостановлен
root@carbon:~# zpool set failmode=continue usbcka
невозможно установить свойство для 'usbcka': ввод-вывод пула в настоящее время приостановлен
Также
zpool clear usbcka
ничего не делает, пустой вывод
Также
zpool export usbcka
Зависает
Как уничтожить пул без перезагрузки?
Я хочу использовать еще работающие устройства для создания нового пула
Причина, по которой я не хочу перезагрузки, заключается в том, что я тестирую, как ZFS выходит из строя, когда устройство неисправно, моя цель — использовать ZFS на сервере компании. Этот сервер просто не может быть перезагружен по моему желанию, если один из 10 дисков выходит из строя, и в нем есть лотки для горячей замены.
Я искал решения, но все они в конечном итоге приводят к решению с перезагрузкой.
root@carbon:~# zfs list usbcka
невозможно открыть 'usbcka': ввод-вывод пула в настоящее время приостановлен
root@carbon:~# zpool get all usbcka
ИМЯ СВОЙСТВО ЗНАЧЕНИЕ ИСТОЧНИК
usbcka размер 174G -
usbcka емкость 1% -
usbcka altroot - по умолчанию
usbcka состояние UNAVAIL -
usbcka guid 1317589842010265379 по умолчанию
usbcka версия - по умолчанию
usbcka bootfs - по умолчанию
usbcka делегирование включено по умолчанию
usbcka автоматическая замена отключено по умолчанию
usbcka файл кеша - по умолчанию
usbcka режим сбоя ожидание по умолчанию
usbcka списки снапшотов отключено по умолчанию
usbcka автоматическое расширение отключено по умолчанию
usbcka dedupditto 0 по умолчанию
usbcka dedupratio 1.00x -
usbcka свободно 170G -
usbcka выделено 3.26G -
usbcka только для чтения отключено -
usbcka ashift 13 локально
usbcka комментарий - по умолчанию
usbcka размер_расширения - -
usbcka освобождение 0 по умолчанию
usbcka фрагментация 1% -
usbcka утечка 0 по умолчанию
usbcka feature@async_destroy включено локально
usbcka feature@empty_bpobj включено локально
usbcka feature@lz4_compress активно локально
usbcka feature@spacemap_histogram активно локально
usbcka feature@enabled_txg активно локально
usbcka feature@hole_birth активно локально
usbcka feature@extensible_dataset включено локально
usbcka feature@embedded_data активно локально
usbcka feature@bookmarks включено локально
usbcka feature@filesystem_limits включено локально
usbcka feature@large_blocks включено локально
У меня была такая же проблема на debian testing с ядром 4.14 и модулем zfs 0.7.6. Но я думаю, что такое поведение одинаково на всех Linux-системах.
Чтобы уничтожить пул UNAVAIL
, где статус выглядит так:
user@system: ~ $ sudo zpool status -xv
pool: icy_tank
состояние: UNAVAIL
статус: Одно или несколько устройств неисправны в ответ на сбои ввода-вывода.
действие: Убедитесь, что затронутые устройства подключены, затем выполните 'zpool clear'.
см.: http://zfsonlinux.org/msg/ZFS-8000-HC
сканирование: не запрашивалось
конфигурация:
ИМЯ СОСТОЯНИЕ ЧТЕНИЕ ЗАПИСЬ CHECKSUM
icy_tank UNAVAIL 0 0 0 недостаточно реплик
sdb UNAVAIL 0 0 0
ошибки: Список ошибок недоступен: ввод-вывод пула в настоящее время приостановлен
вам нужно перезапустить zed
, демон событий zfs, сначала перезапустив всю систему zfs-target
.
sudo systemctl restart zfs.target
После этого шага пул можно очистить.
sudo zpool clear icy_tank
Если устройство (например, sdb) доступно в это время и sdb является частью пула, zpool немедленно начнет проверку на этом устройстве.
pool: icy_tank
состояние: ONLINE
статус: Одно или несколько устройств испытали ошибку, что привело к
повреждению данных. Приложения могут быть затронуты.
действие: Восстановите файл, если это возможно. В противном случае восстановите
весь пул из резервной копии.
см.: http://zfsonlinux.org/msg/ZFS-8000-8A
сканирование: проверка в процессе с среды, 7 марта 2018 г., 20:27:55
316M отсканировано из 121G со скоростью 9,89M/s, 3ч28м до завершения
0B отремонтировано, 0,26% завершено
конфигурация:
ИМЯ СОСТОЯНИЕ ЧТЕНИЕ ЗАПИСЬ CHECKSUM
icy_tank ONLINE 0 0 0
sdb ONLINE 0 0 0
ошибки: 4 ошибки данных, используйте '-v' для списка
Ответ или решение
Как уничтожить пул ZFS в состоянии UNAVAIL без перезагрузки
При тестировании файловой системы ZFS на базе Linux вы столкнулись с ситуацией, когда ваш пул данных «usbcka» находится в состоянии UNAVAIL, и вы хотите удалить его без перезагрузки системы. Это важная задача, поскольку системы на ZFS часто требуют высокой доступности, и требуется умение работать с возможными сбоями оборудования, не прерывая работу сервера.
Суть проблемы
Пул «usbcka» стал недоступным из-за сбоя одного из устройств, что видно из результата команды zpool status -xv
. Устройство «usb2» находится в состоянии FAULTED, что привело к тому, что пул больше не может быть доступен:
pool: usbcka
state: UNAVAIL
status: One or more devices are faulted in response to IO failures.
Попытки использовать команды zpool destroy
и другие управляющие команды завершаются ошибками, так как пул не может быть открыт, и ввод/вывод приостановлен.
Варианты решения
-
Перезапуск ZED (ZFS Event Daemon)
Первоначально, ZFS может блокировать дальнейшие действия при недоступности пула. В этом случае можно попробовать перезапустить службу
zfs.target
, которая управляет событиями ZFS. Выполните команду:sudo systemctl restart zfs.target
Этот шаг может разблокировать состояние пула и позволить вам выполнить последующие команды, такие как
zpool clear
или дажеzpool destroy
. -
Очистка пула
После перезапуска
zfs.target
, попробуйте очистить пул с помощью команды:sudo zpool clear usbcka
Это может вернуть пул в состояние, где он может быть доступен для дальнейшей работы, включая уничтожение.
-
Удаление пула
Если вышеуказанная команда сработала, и пул теперь доступен, вы сможете выполнить:
sudo zpool destroy -f usbcka
Это приведет к уничтожению пула и освобождению ресурсов, которые были задействованы в устройстве.
Замечания
- Если команды не сработают, возможно, что ZFS не сможет восстановить доступ к пулу, и потребуется физическое вмешательство (восстановление устройства). Однако, учитывая ваш сценарий тестирования, попытку впредь можно совершать без перезагрузки системы.
- Следует помнить, что эти действия могут повлечь за собой потерю данных, и аналогичные процедуры следует выполнять только для тестовых данных, как в вашем случае.
Заключение
Зная, как управлять состоянием пула в ZFS, вы сможете более эффективно реагировать на.hardware failures в реальных условиях эксплуатации. Используя указанные шаги, вы сможете удалить недоступные пулы, не прибегая к перезагрузке системы. Это значительно повысит уровень доступности вашего сервера, особенно в средах с высокой нагрузкой и потребностью в постоянной работе.