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