Назад | Перейти на главную страницу

Каталог ZFS поврежден, но zpool ничего не обнаруживает

Каталог на моем сервере FreeBSD 10.2 каким-то образом безнадежно испорчен (разве ZFS не должна была предотвратить это?)

ls или любая другая команда против него приводит к зависанию текущего сеанса на уровне ядра (даже SIGKILL ничего не делает).

ZFS scrub не находит проблем.

 # zpool status zroot
  pool: zroot
 state: ONLINE
  scan: scrub repaired 0 in 0h17m with 0 errors on Sun Dec 18 18:25:04 2016
config:

    NAME        STATE     READ WRITE CKSUM
    zroot       ONLINE       0     0     0
      gpt/zfs0  ONLINE       0     0     0

errors: No known data errors

smartctl говорит, что с диском все ок.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000b   100   100   016    Pre-fail  Always       -       0
  2 Throughput_Performance  0x0005   137   137   054    Pre-fail  Offline      -       89
  3 Spin_Up_Time            0x0007   128   128   024    Pre-fail  Always       -       314 (Average 277)
  4 Start_Stop_Count        0x0012   100   100   000    Old_age   Always       -       78
  5 Reallocated_Sector_Ct   0x0033   100   100   005    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000b   100   100   067    Pre-fail  Always       -       0
  8 Seek_Time_Performance   0x0005   142   142   020    Pre-fail  Offline      -       29
  9 Power_On_Hours          0x0012   097   097   000    Old_age   Always       -       24681
 10 Spin_Retry_Count        0x0013   100   100   060    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       78
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       306
193 Load_Cycle_Count        0x0012   100   100   000    Old_age   Always       -       306
194 Temperature_Celsius     0x0002   171   171   000    Old_age   Always       -       35 (Min/Max 20/46)
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0022   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0008   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x000a   200   200   000    Old_age   Always       -       0

Четный zdb не находит ничего плохого.

# zdb -c zroot

Traversing all blocks to verify metadata checksums and verify nothing leaked ...

loading space map for vdev 0 of 1, metaslab 44 of 116 ...
12.2G completed (  60MB/s) estimated time remaining: 0hr 00min 00sec        
    No leaks (block sum matches space maps exactly)

    bp count:          956750
    ganged count:           0
    bp logical:    43512090624      avg:  45479
    bp physical:   11620376064      avg:  12145     compression:   3.74
    bp allocated:  13143715840      avg:  13737     compression:   3.31
    bp deduped:             0    ref>1:      0   deduplication:   1.00
    SPA allocated: 13143715840     used:  1.32%

    additional, non-pointer bps of type 0:     123043
    Dittoed blocks on same vdev: 62618

В каталоге нет важных данных, поэтому было бы хорошо, если бы я мог просто удалить его и перейти в «чистое» состояние.

Одно из решений, которое приходит на ум, - создать новый пул ZFS, скопировать все исправные данные, а затем удалить старый. Но это очень опасно. Что, если система зависнет и мой сервер выйдет из строя?

Можете ли вы придумать, как я могу избавиться от поврежденного каталога без особых сбоев?

Каталог на моем сервере FreeBSD 10.2 каким-то образом безнадежно испорчен (разве ZFS не должна была предотвратить это?)

ZFS обнаруживает ошибки только на дисках, а не в памяти (здесь за это отвечает ECC) или в ваших приложениях (потому что она не знает, хотите ли вы записывать мусор в свои файлы или нет).

Кроме того, если пул поддерживает только однодисковый vdev, их нельзя исправить, даже если обнаружены ошибки. Добавьте второй диск, чтобы включить это, иначе вам придется удалить затронутые файлы и восстановить их из резервной копии.

Одно из решений, которое приходит на ум, - создать новый пул ZFS, скопировать все исправные данные, а затем удалить старый. Но это очень опасно. Что, если система зависнет и мой сервер выйдет из строя?

Тогда ваш сервер, скорее всего, выйдет из строя, перезапустится и либо продолжит работу без ошибок, либо покажет те же ошибки, либо получит новые ошибки. Никто толком не знает, поэтому советую сосредоточиться на том, как удалить ошибку навсегда:

Сделайте резервную копию своих данных (как вы уже должны были это сделать, потому что даже ZFS может убить ваши данные ошибками или ошибками), перезагрузите сервер, проверьте журналы на наличие чего-либо подозрительного. Делайте это в то время, когда вы можете позволить себе простой. Если вы не можете позволить себе простой, вам следует иметь хотя бы еще одну машину, которая сможет заменить вас, поэтому подумайте о своих потребностях и стратегии. Если вы обнаружите что-то похожее на ошибку, попробуйте воспроизвести это на второй машине (используйте zfs send/recv чтобы скопировать пул).

Можете ли вы придумать, как я могу избавиться от поврежденного каталога без особых сбоев?

Использовать zfs send чтобы скопировать файловую систему ZFS, которая содержит этот каталог (худший случай: корневая файловая система или весь пул; лучший случай: только этот каталог) и zfs recv по трубопроводу (или по трубопроводу ssh или netcat), чтобы скопировать текущий моментальный снимок на другую машину или резервный носитель, затем удалить каталог на старой машине, как обычно, и повторно заполнить его из заведомо исправной резервной копии или ваших приложений (в большинстве случаев это означает переустановку).

Если что-то пойдет не так или вы захотите позже изучить, у вас есть скопированный снимок, содержащий все данные, снимки и метаданные с этого момента времени.