Пару раз у меня была внезапная потеря питания, которая делала пул 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 ответ1

2

Я не могу воспроизвести ваш сценарий в данный момент, но первое, что я бы попробовал после такого сбоя, - это 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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .