Как правильно восстановить ошибки 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 имущество.

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