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

5
задан klfwip
источник

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 описывает ее лаконично как снова откройте все vdev, связанные с пулом. я не знаю, вызовет ли он сканирование vdev или просто попытается снова открыть под уже известными именами.) До тех пор, пока устройства все еще находятся под теми же именами, что должны хватит, и это может достаточно, если устройства известны под альтернативными именами (если выполняется сканирование vdev).

вы все еще можете zpool clear любые ошибки ввода/вывода впоследствии, но это зависит от того, было ли у ZFS время для их регистрации. Если оба диска умерли, скорее всего, ZFS не успел записать ошибки на диски, так что zpool clear не требуется.

в стороне, вы также можете проверить failmode свойства бассейн (zpool get failmode tank). Похоже, ваш бассейн в настоящее время имеет failmode=wait но для вашего случая использования, failmode=continue может быть более подходящим. См.man 8 zpool для описания различных значений failmode свойство.

2
отвечен a CVn 2016-12-27 12:20:05
источник

Другие вопросы linux zfs