ZFS. <metadata> permanent errors

Проблемы установки, настройки и работы Правильной Операционной Системы

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
mzroot
проходил мимо
Сообщения: 9
Зарегистрирован: 2013-12-04 16:48:21
Откуда: г. Пушкино

ZFS. <metadata> permanent errors

Непрочитанное сообщение mzroot » 2015-01-18 18:30:00

Здравствуйте, уважаемые.

Решился написать эту заметку, надеясь на то, что, возможно, кому-нибудь это позволит сэкономить час другой времени. Итак.

Дано:
  • Сервер в датацентре с двумя SATA дисками (аппаратного RAID-контроллера нет).
  • На сервере установлена ОС:

    Код: Выделить всё

    # uname -a
    FreeBSD server.domain.tld 9.1-RELEASE FreeBSD 9.1-RELEASE #0 r250917
    
  • С geom зеркалом, созданным со следующими параметрами:

    Код: Выделить всё

    # gmirror label -v -b round-robin gm0 ada0 ada1
    
  • Поверх gmirror создан пул ZFS.
Проблема. Несколько раз случилось так, что сервер зависал. На тот момент с проблемой разбираться не стали, а пошли путем наименьшего сопротивления: "делали" серверу hard reset. После n'ого количества таких перезагрузок ОС загружаться отказалась. Сначала мы подумали, что проблема связана с gmirror:

Код: Выделить всё

# gmirror status
      Name    Status  Components
mirror/gm0  DEGRADED  ada1 (ACTIVE)
                      ada0 (SYNCHRONIZING, 3%)
Но после завершения процесса "SYNCHRONIZING" - сервер все равно упорно отказывался загружаться. Проблема на самом деле была в ZFS:

Код: Выделить всё

[root@rescue ~]# zpool status -v
  pool: server-pool
 state: ONLINE
status: One or more devices has experienced an error resulting in data
    corruption.  Applications may be affected.
action: Restore the file in question if possible.  Otherwise restore the
    entire pool from backup.
   see: http://illumos.org/msg/ZFS-8000-8A
  scan: scrub repaired 0 in 3h2m with 2 errors on Tue May 20 19:11:57 2014
config:

    NAME        STATE     READ WRITE CKSUM
    server-pool  ONLINE       0     0     6
      ada0p3    ONLINE       0     0    24  block size: 512B configured, 4096B native

errors: Permanent errors have been detected in the following files:

        <metadata>:<0x1d>
        server-pool:<0x786>
Временное решение, позволившие загрузить ОС (zfs scrub и очистка счетчика ошибок):

Код: Выделить всё

# zfs scrub
# zpool clear server-pool
Googleние вариантов решения проблем с metadata выдавало только один путь - создание нового пула ZFS с последующим переносом всех данных. Далее привожу рабочий алгоритм действий (по крайней мере для моего частного случая).

Решение.
  • "Разбираем" gmirror массив, удалив из массива gm0 диск ada0 - получаем два диска с ОС и данными. Система будет временно работать на одном диске ada1.
  • Очищаем таблицу разделов (на всякий случай) и создаем точную копию таблицы разделов с диска ada1 на диске ada0:

    Код: Выделить всё

    # gpart destroy -F ada0
    # gpart backup ada1 > ada1.gpart 
    # gpart restore ada0 < ada1.gpart 
    
  • Создаем на диске ada0 ZFS пул с другим именем:

    Код: Выделить всё

    # zpool create zpool2 /dev/ada0p3
  • Создаем нужные ZFS в новом пуле.
  • Переходим к процессу переноса данных с одного пула на другой пул - для этого оптимально использовать снапшоты ZFS и отправку/получение снапшотов ZFS. Тестируем:

    Код: Выделить всё

    ## Создаем снапшот:
    # zfs snapshot server-pool@backup
    
    ## Проверяем создался ли снапшот?
    # zfs list -t snapshot
    NAME                   USED  AVAIL  REFER  MOUNTPOINT
    server-pool@backup      0      -  5,66G  -
    
    ## Пробуем передать снапшот:
    # zfs send server-pool@backup | zfs recv zpool2
    cannot receive new filesystem stream: destination 'zpool2' exists
    must specify -F to overwrite it
    warning: cannot send 'server-pool@backup': Broken pipe
    
    ## Следуя рекомендациям, отправляем снапшот ещё раз:
    # zfs send server-pool@backup | zfs recv -F zpool2
    
    Тестовый перенос данных успешно завершен.
  • Так как на сервере используется несколько "разделов" ZFS, для автоматизации написан скрипт:

    Код: Выделить всё

    #!/bin/sh
    
    pool_send="server-pool" 
    pool_receive="zpool2"
    
    for i in `zfs list | grep $pool_send | awk '{print $1};'`
    do
      zfs snapshot $i@backup
      zfs send $i@bacup | zfs receive -F `echo $i | sed 's/server-pool/zpool2/g' | sed 's/@backup//g'`
    done
    
    В датацентре, где находится сервер, имеется возможность запустить rescue-систему (то есть FreeBSD, загружаемую по сети). Я решил воспользоваться ей для того, чтобы избежать изменения данных во время копирования.
  • После того, как скрипт отработал (в моем случае это заняло около 5-ти часов), проверяем статус нового пула (нижеследующие действия производились из rescue-системы):

    Код: Выделить всё

    # zpool status
      pool: zpool2
     state: ONLINE
      scan: none requested
    config:
    
        NAME                 STATE     READ WRITE CKSUM
        zpoo2l    ONLINE       0     0     0
          ada0  ONLINE       0     0     0
    
    errors: No known data errors
    
    Ошибок в новом пуле уже нет. Корректируем загрузку (на диске ada0 в новом пуле):

    Код: Выделить всё

    # cat /boot/loader.conf | grep -i zfs
    zfs_load="YES" 
    vfs.root.mountfrom="zfs:zpool2" 
    
    Исправляем точку монтирования swap'а:

    Код: Выделить всё

    # cat /etc/fstab | grep -i swap
    /dev/ada0p2        none            swap    sw        0 0
    
    С диском ada0 закончили. Приступаем к подготовке диска ada1 и созданию RAID-Z (по моему субъективному мнению, данная технология более надежна по сравнению с gmirror. Хотя не исключено, что я просто не умею "нормально готовить" geom mirror):

    Код: Выделить всё

    ## Удаляем таблицу разделов на диске ada0 и создаем новую (использую ранее сохраненный бэкап таблицы разделов):
    # gpart destroy -F ada1
    # gpart restore ada1 < ada1.gpart 
    
    Подключаем к рабочему ZFS пулу еще один диск (ada1, ada0 уже в пуле присутствует):

    Код: Выделить всё

    # zpool attach zpool2 ada0 ada1
    invalid vdev specification
    use '-f' to override the following errors:
    /dev/ada1 is part of potentially active pool 'server-pool'
    
    ## Учитывая "ругань" команды zpool, выполняем еще раз:
    # zpool attach -f zpool2 ada0 ada1
    
    Make sure to wait until resilver is done before rebooting.
    
    If you boot from pool 'zpool2', you may need to update
    boot code on newly attached disk 'ada1'.
    
    Assuming you use GPT partitioning and 'da0' is your new boot disk
    you may use the following command:
    
        gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
    
    Следуя рекомендациям, записываем код загрузчика на оба диска:

    Код: Выделить всё

    # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
    # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
    
    Проверяем состояние нового пула:

    Код: Выделить всё

    # zpool status -v
      pool: zpool2
     state: ONLINE
    status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
    action: Wait for the resilver to complete.
      scan: resilver in progress since Wed Dec 17 21:24:53 2014
            146M scanned out of 2,16T at 1/s, (scan is slow, no estimated time)
            146M resilvered, 0,01% done
    config:
    
        NAME                   STATE     READ WRITE CKSUM
        zpool2      ONLINE       0     0     0
          mirror-0             ONLINE       0     0     0
            ada0  ONLINE       0     0     0
            ada1  ONLINE       0     0     0  (resilvering)
    
    errors: No known data errors
    
    Размонтируем все ZFS и исправляем точки монтирования ZFS (в моем случае это выглядело так):

    Код: Выделить всё

    # zfs unmount zpool2
    # zfs set mountpoint=/ zpool2
    # zfs set mountpoint=/tmp zpool2/tmp
    # zfs set mountpoint=/usr/home zpool2/usr/home
    # zfs set mountpoint=/usr/ports zpool2/usr/ports
    # zfs set mountpoint=/usr/src zpool2/usr/src
    # zfs set mountpoint=/var zpool2/var
    # zfs set mountpoint=/var/crash zpool2/var/crash
    # zfs set mountpoint=/var/log zpool2/var/log
    # zfs set mountpoint=/var/mail zpool2/var/mail
    # zfs set mountpoint=/var/tmp zpool2/var/tmp
    
  • Перезагружаем сервер, загружаемся с диска: система загружается нормально. Автоматически стартует resilvering ZFS пула (система при этом работает нормально). После завершения процесса имеем работоспособный пул ZFS без ошибок и вполне себе работоспособную ОС:

    Код: Выделить всё

    # zpool status -v
      pool: zpool2
     state: ONLINE
      scan: resilvered 2,16T in 11h13m with 0 errors on Thu Dec 18 08:38:06 2014
    config:
        NAME                   STATE     READ WRITE CKSUM
        zpool2      ONLINE       0     0     0
          mirror-0             ONLINE       0     0     0
            ada0  ONLINE       0     0     0
            ada1  ONLINE       0     0     0
    errors: No known data errors
    
Спасибо за внимание.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

snorlov
подполковник
Сообщения: 3927
Зарегистрирован: 2008-09-04 11:51:25
Откуда: Санкт-Петербург

Re: ZFS. <metadata> permanent errors

Непрочитанное сообщение snorlov » 2015-01-18 22:18:38

Я примерно также делал, но поскольку зеркало было zfs-ное и имелся еще один пул, то снапшот всей системы я упаковывал в файл, расположенном на этом пуле через gzip, после чего на месте старого создавал новый пул и сливал снапшот туда.
Потом только мне пришла в голову идея, если эти метаданные лежат на какой-то zfs системе, у меня они лежали в zboot/Data, то можно их было вылечить, удалив и заново создав эту систему...

c0x
проходил мимо

ZFS. <metadata> permanent errors

Непрочитанное сообщение c0x » 2016-11-24 9:27:38

Странно, зачем делать такие финты ушами, если фря умеет zfs-on-root и тем более, все рекомендации лучших заводчиков собаководов (zfs best practices) дружно протестуют против всяких прослоек между zfs и блочным устройством? Некоторые даже контроллеры перешивают, чтобы избавится от raid и получить просто тупой hba.

snorlov
подполковник
Сообщения: 3927
Зарегистрирован: 2008-09-04 11:51:25
Откуда: Санкт-Петербург

ZFS. <metadata> permanent errors

Непрочитанное сообщение snorlov » 2016-11-24 9:33:37

А где вы тут увидели прослойку...

Аватара пользователя
Neus
капитан
Сообщения: 1977
Зарегистрирован: 2008-09-08 21:59:56

ZFS. <metadata> permanent errors

Непрочитанное сообщение Neus » 2016-11-24 9:53:37

mzroot писал(а): # zpool status
  pool: zpool2
 state: ONLINE
  scan: none requested
config:

    NAME                 STATE     READ WRITE CKSUM
    zpoo2l    ONLINE       0     0     0
      ada0  ONLINE       0     0     0

errors: No known data errors
mzroot писал(а): # cat /etc/fstab | grep -i swap
/dev/ada0p2        none            swap    sw        0 0
и как такое чудо работает?
Physics is mathematics with the constraint of reality.
Engineering is physics with the constraint of money.

LOR захватили ситхи.
Добро пожаловать на светлую сторону!

snorlov
подполковник
Сообщения: 3927
Зарегистрирован: 2008-09-04 11:51:25
Откуда: Санкт-Петербург

ZFS. <metadata> permanent errors

Непрочитанное сообщение snorlov » 2016-11-24 10:02:01

Neus писал(а):
mzroot писал(а): # zpool status
  pool: zpool2
 state: ONLINE
  scan: none requested
config:

    NAME                 STATE     READ WRITE CKSUM
    zpoo2l    ONLINE       0     0     0
      ada0  ONLINE       0     0     0

errors: No known data errors
и как такое чудо работает?
Ну ошибся человек при написании, у него там должно стоять ada0p3, а не ada0, с кем не бывает, на то нам и даны извилины, чтобы ими шевелить и замечать такие ляпы...