Kilka razy miałem nagłą utratę zasilania, co sprawiło, że pula ZFS była bezużyteczna aż do pełnego ponownego uruchomienia systemu. Planuję uzyskać UPS, aby uniknąć problemów w przyszłości, ale wydaje się, że powinien istnieć sposób na rozwiązanie tak prostego problemu bez pełnego zamknięcia systemu.
Odtworzenie problemu jest bardzo proste: moja pula ZFS działa na dwóch dyskach twardych podłączonych przez USB. Jest to stan, gdy pula działa poprawnie:
$ 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
Jeśli wyłączę zasilanie dysków USB bez zatrzymywania ZFS, a następnie ponownie włączę zasilanie po kilku sekundach, pojawią się następujące problemy: Jeśli spróbuję LS w punkcie montowania ZFS, zawiesi się na czas nieokreślony, wymagając ode mnie zamknij terminal. (Proces ls pozostanie jak zombie). Każdy komputer podłączony do serwera nfs za pośrednictwem samby również się zawiesi, jeśli spróbuje uzyskać dostęp do udostępnionego katalogu.
Status będzie teraz wyglądał następująco:
$ 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
pomimo faktu, że dyski USB zostały ponownie włączone.
Wypróbowałem następujące polecenia, aby rozwiązać problem.
$ 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
Spędziłem kilka godzin czytając podobne posty od ludzi, ale wydaje się, że żaden z nich nie rozwiązał dokładnie tego problemu. Po ponownym uruchomieniu komputera z systemem ZFS wszystkie błędy znikną, martwe procesy zostaną usunięte, a wszystko wróci do normy.
Ale musi być czystszy sposób na rozwiązanie tego problemu. Jakieś sugestie?
EDYCJA: Prawdopodobnie powinienem to wyjaśnić. Serwer, do którego podłączone są dyski, jest przemienionym laptopem, więc ma wewnętrzny zasilacz. Dlatego w przypadku normalnej pracy w przypadku awarii zasilania dyski USB mogą utracić zasilanie, a następnie ponownie pojawić się bez ponownego uruchamiania serwera / laptopa.