Как правильно восстановить ошибки ZFS после сбоя питания?
Пару раз у меня была внезапная потеря питания, которая делала пул ZFS непригодным до полной перезагрузки системы. Я планирую получить ИБП, чтобы избежать будущих проблем, но, похоже, должен быть способ исправить такую простую проблему без полного отключения системы.
Воспроизвести проблему очень просто: мой пул ZFS работает на двух жестких дисках, подключенных через USB. Это состояние, когда пул работает правильно:
$ sudo zpool status
pool: tank
state: ONLINE
scan: scrub repaired 0 in 1h36m with 0 errors on Sun Dec 11 02:00:22 2016
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
usb-ST4000DM_000-1F2168_000000000000-0:0-part1 ONLINE 0 0 0
usb-ST3000DM_001-1E6166_000000000000-0:1-part1 ONLINE 0 0 0
Если я отключаю питание USB-накопителей, не останавливая сначала ZFS, а затем снова включаю питание через несколько секунд, возникают следующие проблемы: Если я попытаюсь установить LS внутри точки монтирования ZFS, он будет зависать бесконечно, что потребует от меня закройте терминал. (Процесс ls останется зомби). Любые компьютеры, подключенные к серверу nfs через samba, также будут зависать при попытке доступа к общему каталогу.
Статус теперь будет выглядеть так:
$ sudo zpool status
pool: tank
state: UNAVAIL
status: One or more devices are faulted in response to IO failures.
action: Make sure the affected devices are connected, then run 'zpool clear'.
see: http://zfsonlinux.org/msg/ZFS-8000-HC
scan: scrub repaired 0 in 1h36m with 0 errors on Sun Dec 11 02:00:22 2016
config:
NAME STATE READ WRITE CKSUM
tank UNAVAIL 0 0 0 insufficient replicas
mirror-0 UNAVAIL 0 0 0 insufficient replicas
usb-ST4000DM_000-1F2168_000000000000-0:0-part1 UNAVAIL 0 0 0
usb-ST3000DM_001-1E6166_000000000000-0:1-part1 UNAVAIL 0 0 0
несмотря на то, что USB-накопители были снова включены.
Я попытался следующие команды, чтобы исправить проблему.
$ sudo zpool clear tank
cannot clear errors for tank: I/O error
$ sudo zfs unmount tank
cannot open 'tank': pool I/O is currently suspended
# Note: Because other computers were trying to access the zfs share via samba, there are zombie processes, which is why an export won't work.
$ sudo zpool export tank
umount: /tank: target is busy
(In some cases useful info about processes that
use the device is found by lsof(8) or fuser(1).)
cannot unmount '/tank': umount failed
$ sudo zpool export -f tank
umount: /tank: target is busy
(In some cases useful info about processes that
use the device is found by lsof(8) or fuser(1).)
cannot unmount '/tank': umount failed
# Tried this just for kicks, and got the expected result.
$ sudo zpool import -nfF tank
cannot import 'tank': a pool with that name already exists
use the form 'zpool import <pool | id> <newpool>' to give it a new name
Я потратил несколько часов, читая подобные сообщения от людей, но ни один из них, похоже, не решает именно эту проблему. Если я перезагружаю компьютер с ZFS, все ошибки исчезают, мертвые процессы очищаются, и все возвращается в нормальное состояние.
Но должен быть более чистый способ решить эту проблему. Какие-либо предложения?
РЕДАКТИРОВАТЬ: Я, вероятно, должен уточнить. Сервер, к которому подключены диски, представляет собой перенастроенный ноутбук, поэтому он имеет внутренний источник питания. Таким образом, при нормальной работе в случае сбоя питания накопители USB могут потерять питание, а затем снова включиться без перезагрузки сервера / ноутбука.
1 ответ
Я не могу воспроизвести ваш сценарий в данный момент, но первое, что я бы попробовал после такой неудачи, это zpool reopen
бассейн, и, возможно, zpool online
устройство (а) при необходимости. Например, когда у вас есть
$ sudo zpool status
pool: tank
state: UNAVAIL
status: One or more devices are faulted in response to IO failures.
action: Make sure the affected devices are connected, then run 'zpool clear'.
see: http://zfsonlinux.org/msg/ZFS-8000-HC
scan: scrub repaired 0 in 1h36m with 0 errors on Sun Dec 11 02:00:22 2016
config:
NAME STATE READ WRITE CKSUM
tank UNAVAIL 0 0 0 insufficient replicas
mirror-0 UNAVAIL 0 0 0 insufficient replicas
usb-ST4000DM_000-1F2168_000000000000-0:0-part1 UNAVAIL 0 0 0
usb-ST3000DM_001-1E6166_000000000000-0:1-part1 UNAVAIL 0 0 0
ты можешь попытаться
$ sudo zpool reopen tank
и если это не проясняет вещи полностью также
$ sudo zpool online tank 'usb-ST4000DM_000-1F2168_000000000000-0:0-part1'
$ sudo zpool online tank 'usb-ST3000DM_001-1E6166_000000000000-0:1-part1'
Вполне возможно, что просто zpool reopen $POOL
заставит пул работать снова, так как он дает ZFS команду открыть все устройства, связанные с пулом. (Страница man кратко описывает это как "Открыть все vdevs, связанные с пулом". Я не знаю, будет ли он запускать сканирование vdev или просто попытаться открыть его под уже известными именами.) Пока устройства все еще найденные под теми же именами, этого должно быть достаточно, и может быть достаточно, если устройства известны под альтернативными именами (если выполняется сканирование vdev).
Возможно, вам все еще нужно zpool clear
любые ошибки ввода-вывода после этого, но это зависит от того, успела ли ZFS их зарегистрировать. Если оба диска погибли, скорее всего ZFS не успела записать ошибки на диски, поэтому zpool clear
не должно быть нужно.
Кроме того, вы также можете проверить failmode
свойство бассейна (zpool get failmode tank
). Похоже, ваш бассейн в настоящее время failmode=wait
но для вашего случая использования, failmode=continue
может быть более подходящим. Увидеть man 8 zpool
для описания различных значений для failmode
имущество.