Руководство по администрированию файловых систем ZFS Solaris

Глава 11 Поиск и устранение сбоев и восстановление данных в ZFS

В этой главе описывается выявление и восстановление различных типов сбоя ZFS. Здесь также приведена информация по предотвращению сбоев.

В этой главе содержатся следующие разделы:

Типы сбоев ZFS

В файловой системе ZFS, являющейся сочетанием файловой системы и диспетчера томов, могут возникать сбои различных типов. В начале этой главы описываются различные типы сбоя, а затем рассматривается их идентификация в работающей системе. В завершение приводятся инструкции по устранению сбоев. В ZFS могут возникать ошибки трех основных типов:

Следует отметить, что в одном пуле могут возникать все три типа ошибок, поэтому полная процедура восстановления включает в себя поиск и исправление всех ошибок поочередно.

Отсутствие устройств в пуле устройств хранения данных ZFS

Если устройство полностью удалено из системы, ZFS обнаруживает, что открыть устройство невозможно, и переводит его в состояние UNAVAIL. В зависимости от уровня репликации данных пула, в некоторых случаях это может привести к недоступности всего пула. При удалении одного диска в зеркальном устройстве или устройстве RAID-Z пул остается доступным. При удалении всех компонентов зеркала и нескольких устройств в составе RAID-Z или удалении устройства верхнего уровня с одним диском пул переводится в состояние FAULTED. До повторного присоединения устройства доступных данных нет.

Повреждение устройств в пуле устройств хранения данных ZFS

Термин "повреждение" охватывает широкий спектр возможных ошибок. Ниже приведены следующие примеры ошибок:

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

Повреждение данных ZFS

Повреждение данных происходит в том случае, если одна или несколько ошибок устройств (указывающих на отсутствие или повреждение устройств) влияют на виртуальное устройство верхнего уровня. Например, на одной стороне зеркала может возникать большое количество ошибок, но это не приведет к повреждению данных. Однако в случае возникновения ошибки на другой стороне зеркала в том же расположении данные будут повреждены.

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

Проверка целостности данных ZFS

Эквивалентов служебной программы fsck для ZFS не существует. Эта служебная программа традиционно использовалась в двух целях: для восстановления и проверки данных.

Восстановление данных

В традиционных файловых системах сам способ записи данных обуславливал вероятность непредвиденных сбоев, приводящих к противоречивости данных. Поскольку традиционная файловая система не является транзакционной, в ней могут появляться блоки, ссылки на которые отсутствуют, неверные счетчики связей или другие противоречивые структуры данных. Журналирование позволяет решить некоторые из этих проблем, но также приводит к возникновению новых проблем в случае невозможности отката записей в журнале. В системе ZFS эти проблемы отсутствуют. Единственной причиной возникновения на диске несогласованных данных является сбой оборудования (в этом случае пул должен быть избыточным) или ошибка в программном обеспечении ZFS.

Поскольку служебная программа fsck предназначена для устранения известных патологий, характерных для отдельных файловых систем, создать такую служебную программу для файловой системы при отсутствии известных патологий невозможно. Возможно, в будущем некоторые проблемы повреждения данных будут признаны достаточно распространенными и идентифицируемыми для разработки служебной программы устранения сбоев, однако этих проблем всегда можно избежать путем организации пулов с избыточностью.

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

Проверка данных

Помимо восстановления данных служебная программа fsck осуществляет проверку на отсутствие проблем в данных, хранящихся на диске. Традиционно эта задача выполнялась путем размонтирования файловой системы и выполнения служебной программы fsck, возможно, с переводом системы в однопользовательский режим. Этот случай приводит к простою, продолжительность которого пропорциональна размеру проверяемой файловой системы. Вместо явного вызова служебной программы для выполнения необходимой проверки ZFS предоставляет механизм программной проверки всего объема данных. Эта функциональность, называемая очисткой (scrubbing), обычно применяется для памяти и файловых систем в целях обнаружения и предотвращения ошибок до того, как они приведут к сбою оборудования или программного обеспечения.

Управление очисткой данных ZFS

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

Явная очистка данных ZFS

Наиболее простым способом проверки целостности данных является инициирование явной очистки всех данных в пуле. Эта операция позволяет проследить все данные в пуле и проверить возможность чтения блоков на определенный момент времени. Очистка выполняется с той скоростью, с которой это позволяют соответствующие устройства, несмотря на то, что приоритет ввода/вывода остается ниже, чем в нормальном режиме работы. Эта операция может негативно повлиять на производительность, несмотря на то, что файловая система остается доступной и обеспечивает в процессе очистки почти такой же отклик. Для инициирования явной очистки используется команда zpool scrub. Пример:


# zpool scrub tank

Информацию по текущей очистке можно вывести при помощи команды zpool status. Пример:


# zpool status -v tank
  pool: tank
 state: ONLINE
 scrub: scrub completed after 0h7m with 0 errors on Tue Sep  1 09:20:52 2009
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c1t0d0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0

errors: No known data errors

Следует отметить, что в конкретный момент времени может выполняться только одна операция активной очистки в пуле.

Выполняемую очистку можно остановить при помощи параметра -s. Пример:


# zpool scrub -s tank

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

Выполнение программы очистки также гарантирует непрерывный ввод/вывод по всем дискам в системе. Программа очистки обладает побочным эффектом, который заключается в невозможности перевода неактивных дисков в режим пониженного энергопотребления функциями управления питанием. Если система обычно всегда выполняет операции ввода/вывода или объем потребления электроэнергии неважен, эту проблему можно игнорировать.

Для получения дополнительной информации об интерпретации выходных данных команды zpool status см. Запрос состояния пула устройств хранения данных ZFS.

Очистка данных ZFS и перенос актуальных данных

При замене устройства инициируется операция переноса актуальных данных, в рамках которой данные корректных копий переносятся на новое устройство. Это действие представляет собой разновидность очистки диска. Поэтому в пуле одновременно может выполняться только одна такая операция. Если выполняется операция очистки, то операция переноса актуальных данных приостанавливает текущую очистку и перезапускает ее после завершения переноса.

Для получения дополнительной информации о переносе актуальных данных см. Просмотр статуса переноса актуальных данных.

Выявление проблем в ZFS

В следующих разделах описывается процедура выявления проблем в файловых системах или пулах устройств хранения данных ZFS.

Для выявления проблем в конфигурациях ZFS можно воспользоваться следующими функциями:

В большинстве случаев поиск и устранение сбоев ZFS выполняются с помощью команды zpool status. Эта команда используется для анализа различных сбоев, возникающих в системе, и выявления наиболее серьезной проблемы, а также предлагает возможные действия и предоставляет ссылку на соответствующую статью базы знаний для получения дополнительной информации. Следует отметить, что эта команда позволяет выявить только одну проблему в пуле, несмотря на возможное наличие нескольких проблем. Например, ошибки, связанные с повреждением данных, всегда подразумевают сбой одного из устройств. Замена неисправного устройства не позволяет решить проблему повреждения данных.

Кроме того, для диагностики и уведомления о сбоях пулов и устройств доступен механизм диагностики ZFS. Также обеспечивается регистрация ошибок контрольной суммы, ввода/вывода и устройств, связанных со сбоем пула или устройства. Сбои ZFS, выявленные с помощью команды fmd, отображаются на консоли и регистрируются в файле системных сообщений. В большинстве случаев сообщение fmd содержит ссылку на команду zpool status.

Ниже приведено описание базового процесса восстановления.

В этой главе описывается интерпретация выходных данных команды zpool status для диагностики типа сбоя и перехода к одному из следующих разделов, в которых приведены инструкции по устранению проблемы. Поскольку основной объем операций выполняется автоматически с помощью команды, для диагностики типа сбоя необходимо точно понимать, какие проблемы были выявлены.

Выявление проблем в пуле устройств хранения данных ZFS

Наиболее простым способом определения выявленных проблем в системе является выполнение команды zpool status -x. Эта команда выводит список пулов с явными проблемами. При отсутствии в системе неисправных пулов эта команда выводит следующее простое сообщение:


# zpool status -x
all pools are healthy

Без флага -x команда полностью отображает состояние всех пулов (или затребованного пула, если он указан в командной строке), даже если эти пулы в работоспособны.

Для получения дополнительной информации о параметрах командной строки для команды zpool status см. Запрос состояния пула устройств хранения данных ZFS.

Просмотр выходных данных команды zpool status

Полные выходные данные команды zpool status выглядят следующим образом:


# zpool status tank
  pool: tank
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
        Sufficient replicas exist for the pool to continue functioning in a
        degraded state.
action: Online the device using 'zpool online' or replace the device with
        'zpool replace'.
 scrub: none requested
 config:

        NAME         STATE     READ WRITE CKSUM
        tank         DEGRADED     0     0     0
          mirror     DEGRADED     0     0     0
            c1t0d0   ONLINE       0     0     0
            c1t1d0   OFFLINE      0     0     0

errors: No known data errors

Эти выходные данные подразделяются на несколько разделов:

Полная информация о статусе пула

В разделе заголовка выходных данных команды zpool status содержатся следующие поля, некоторые из них отображаются только для неисправных пулов:

pool

Имя пула.

state

Текущая работоспособность пула. Эта информация относится только к способности пула обеспечить необходимый уровень репликации. Пулы, находящиеся в состоянии ONLINE, по-прежнему могут содержать неисправные устройства или поврежденные данные.

status

Описание неисправности пула. При отсутствии выявленных сбоев это поле опускается.

action

Рекомендуемое действие по устранению ошибок. Это поле представляет собой сокращенную форму для направления пользователя к одному из следующих разделов. При отсутствии выявленных сбоев это поле опускается.

see

Ссылка на статью базы знаний, содержащую подробную информацию об устранении сбоя. Статьи в Интернете обновляются чаще, чем настоящее руководство, и поэтому для большинства актуальных процедур устранения сбоев указываются ссылки именно на них. При отсутствии выявленных сбоев это поле опускается.

scrub

Определяет текущее состояние операции очистки, которое может включать дату и время выполнения последней очистки, информацию о выполняемой очистке или указание на то, что запросы на очистку не поступали.

errors

Определяет выявленные ошибки в данных или указывает на отсутствие таковых.

Информация о конфигурации пула

Поле config в выходных данных команды zpool status содержит информацию о конфигурации устройств, составляющих пул, а также их состоянии и любых ошибках, генерируемых этими устройствами. Устройства могут находиться в одном из следующих состояний: ONLINE, FAULTED, DEGRADED, UNAVAILABLE или OFFLINE. Если состояние устройства отлично от состояния ONLINE, это указывает на пониженную отказоустойчивость пула.

Во втором разделе выходных данных конфигурации отображается статистика ошибок. Эти ошибки подразделяются на три категории:

Эти ошибки могут использоваться для определения постоянного характера сбоя. Небольшое количество ошибок ввода/вывода может указывать на временный сбой, тогда как большое количество таких ошибок – на наличие постоянной проблемы, связанной с устройством. Эти ошибки не обязательно свидетельствуют о повреждении данных, интерпретируемом приложениями. Если устройство имеет конфигурацию с избыточностью, то дисковые устройства могут отображать неисправимые ошибки, тогда как на уровне зеркала или устройства RAID-Z ошибки не отображаются. В этом случае ZFS успешно извлекает корректные данные и предпринимает попытку восстановления поврежденных данных на основе существующих реплик.

Для получения дополнительной информации об интерпретации этих ошибок для идентификации сбоя устройства см. Определение типа сбоя устройства.

Наконец, в последнем столбце выходных данных команды zpool status отображается дополнительная информация. Эта информация дополняет данные в поле state и используется для диагностики типов сбоя. Если устройство находится в состоянии FAULTED, в этом поле указывается, является ли устройство доступным и нарушена ли целостность содержащихся в нем данных. Если для устройства выполняется перенос актуальных данных, в этом поле отображается ход выполнения этой операции.

Для получения дополнительной информации о наблюдении за процесса переноса актуальных данных см. Просмотр статуса переноса актуальных данных.

Состояние очистки

В третьем разделе выходных данных команды zpool status описывается текущее состояние всех явных очисток. Эта информация отличается от информации по обнаруженным ошибкам, несмотря на возможность ее использования для определения точности сообщений об ошибках, связанных с повреждением данных. Если последняя очистка была завершена недавно, наиболее вероятно обнаружение всех выявленных повреждений данных.

Для получения дополнительной информации об очистке данных и интерпретации соответствующей информации см. Проверка целостности данных ZFS.

Ошибки, связанные с повреждением данных

Команда zpool status также отражает связь выявленных ошибок с пулом. Эти ошибки могут быть обнаружены при очистке диска или в нормальном режиме работы. ZFS ведет сохраняемый протокол всех ошибок в данных, связанных с пулом. При каждом завершении полной очистки соответствующий журнал очищается.

Ошибки, связанные с повреждением данных, всегда являются фатальными. Их наличие указывает на то, что по крайней мере в одном приложении возникла ошибка ввода/вывода из-за повреждения данных в пуле. Ошибки устройств в резервном пуле не приводят к повреждению данных и не регистрируются в журнале. По умолчанию отображается только количество обнаруженных ошибок. Полный список ошибок с подробной информацией можно просмотреть с помощью параметра zpool status -v. Пример:


# zpool status -v
  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://www.sun.com/msg/ZFS-8000-HC
 scrub: scrub completed after 0h0m with 0 errors on Tue Sep  1 09:51:01 2009
config:

        NAME        STATE     READ WRITE CKSUM
        tank        UNAVAIL      0     0     0  insufficient replicas
          c1t0d0    ONLINE       0     0     0
          c1t1d0    UNAVAIL      4     1     0  cannot open

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

/tank/data/aaa
/tank/data/bbb
/tank/data/ccc

Аналогичное сообщение также отображается с помощью команды fmd на системной консоли и в файле /var/adm/messages. Эти сообщения также можно отслеживать с помощью команды fmdump.

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

Вывод системных сообщений об ошибках ZFS

Помимо сохраняемого отслеживания ошибок в пуле, ZFS также формирует сообщения типа "syslog" в случае представляющих интерес событий. События, требующие уведомления администратора, генерируются в следующих случаях:

При выявлении ZFS ошибки устройства и ее автоматическом исправлении уведомление не создается. Такие ошибки не приводят к сбою, связанному с обеспечением избыточности пула или целостностью данных. Кроме того, такие ошибки обычно являются результатом проблем с драйвером, сопровождаемых рядом собственных сообщений об ошибках.

Восстановление поврежденной конфигурации ZFS

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

Для получения дополнительной информации об импорте и экспорте пулов см. Переход пулов устройств хранения данных ZFS.

Восстановление отсутствующего устройства

Если устройство невозможно открыть, в выходных данных команды zpool status отображается состояние UNAVAILABLE. Это состояние означает, что обращение к устройству при первом доступе к пулу оказалось невозможным или что с тех пор устройство является недоступным. Если из-за проблем с этим устройством виртуальное устройство верхнего уровня недоступно, то также недоступны все элементы пула. В противном случае отказоустойчивость пула может быть снижена. В любом случае для восстановления нормальной работы необходимо заново присоединить устройство к системе.

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


SUNW-MSG-ID: ZFS-8000-FD, TYPE: Fault, VER: 1, SEVERITY: Major
EVENT-TIME: Tue Sep  1 09:36:46 MDT 2009
PLATFORM: SUNW,Sun-Fire-T200, CSN: -, HOSTNAME: neo
SOURCE: zfs-diagnosis, REV: 1.0
EVENT-ID: a1fb66d0-cc51-cd14-a835-961c15696fed
DESC: The number of I/O errors associated with a ZFS device exceeded
acceptable levels.  Refer to http://sun.com/msg/ZFS-8000-FD for more information.
AUTO-RESPONSE: The device has been offlined and marked as faulted.  An attempt
will be made to activate a hot spare if available. 
IMPACT: Fault tolerance of the pool may be compromised.
REC-ACTION: Run 'zpool status -x' and replace the bad device.

Следующий этап заключается в выполнении команды zpool status -x для просмотра подробной информации о проблеме, связанной с устройством, и ее решении. Пример:

Из этих выходных данных следует, что отсутствующее устройство c1t1d0 не функционирует. При выявлении неисправного диска устройство необходимо заменить.

Затем с помощью команды zpool online переведите замененное устройство в оперативный режим. Пример:


# zpool online tank c1t1d0

Проверьте, что пул с замененным устройством является работоспособным.


# zpool status -x tank
pool 'tank' is healthy

Повторное физическое подключение устройства

Процедура повторного подключения отсутствующего устройства зависит от рассматриваемого устройства. Если оно представляет собой подключенный к сети накопитель, необходимо восстановить сетевые подключения. Если устройство представляет собой накопитель для USB или другой сменный носитель, его необходимо повторно подключить к системе. Если устройство представляет собой локальный диск, возможен такой сбой контроллера, при котором устройство перестает быть видимым для системы. В этом случае контроллер необходимо заменить, после чего диски снова становятся доступными. Также возможно наличие других сбоев в зависимости от типа и конфигурации оборудования. Если накопитель неисправен и перестает быть видимым для системы (что маловероятно), устройство необходимо рассматривать как поврежденное. Выполните процедуры, описанные в разделе Замена или восстановление поврежденного устройства.

Уведомление ZFS о доступности устройства

После повторного подключения устройства к системе ZFS может автоматически обнаружить или не обнаружить его доступность. Если пул ранее находился в состоянии FAULTED или система была перезагружена в рамках процедуры подключения, то ZFS автоматически повторяет сканирование всех устройств при попытке открытия пула. Если пул находился в состоянии DEGRADED и устройство было заменено во время работы системы, необходимо уведомить ZFS о доступности устройства и возможности его открытия с помощью команды zpool online. Пример:


# zpool online tank c0t1d0

Для получения дополнительной информации о переводе устройств в оперативный режим см. Перевод устройства в оперативный режим.

Замена или восстановление поврежденного устройства

В этом разделе описывается определение типов сбоев устройств, сброс временных ошибок и замена устройства.

Определение типа сбоя устройства

Термин поврежденное устройство является достаточно неопределенным и может обозначать целый ряд возможных ситуаций:

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


# zpool status -v pool

Ошибки подразделяются на ошибки ввода/вывода и ошибки контрольной суммы. Оба типа ошибок могут указывать на возможный тип сбоя. Как правило, в результате этой операции выявляется лишь незначительное количество ошибок (несколько ошибок за длительный период времени). Выявление большого количества ошибок указывает на неизбежный или уже произошедший сбой устройства. Однако ошибка администратора также может приводить к значительному возрастанию показателей счетчиков ошибок. Другим источником информации является системный журнал. Если в журнале отображается большое количество сообщений SCSI или драйвера Fibre Channel, это может указывать на серьезные сбои оборудования. Если сообщения "syslog" не генерируются, то наиболее вероятен временный характер повреждения.

Необходимо ответить на следующий вопрос:

Вероятно ли возникновение в этом устройстве другой ошибки?

Ошибки, возникающие однократно, считаются временными и не указывают на возможный сбой. Повторяющиеся ошибки или ошибки, серьезность которых указывает на возможный сбой оборудования, считаются критическими. Процедура определения типа ошибки выходит за рамки возможностей автоматизированного программного обеспечения, доступного в настоящее время в ZFS, и поэтому должна выполняться администратором вручную. После определения типа ошибки необходимо предпринять соответствующие меры по ее устранению. Устраните временные ошибки или замените устройство в случае фатальных ошибок. Эти процедуры описаны в следующих разделах.

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

Сброс временных ошибок

Если ошибки устройства считаются временными, т.е. могут лишь с небольшой вероятностью оказать влияние на будущую работоспособность устройства, то это позволяет безопасно выполнить их сброс. Это указывает на отсутствие фатальных ошибок. Для сброса счетчиков ошибок RAID-Z или зеркальных устройств используется команда zpool clear. Пример:


# zpool clear tank c1t1d0

Этот синтаксис позволяет сбросить любые ошибки, связанные с устройством, и любые счетчики ошибок данных устройства.

Для сброса всех ошибок, связанных с виртуальными устройствами в пуле, и любых счетчиков ошибок в данных пула используется следующий синтаксис:


# zpool clear tank

Для получения дополнительной информации о сбросе ошибок пула см. Сброс ошибок устройств в пуле устройств хранения данных.

Замена устройства в пуле устройств хранения данных ZFS

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

Определение возможности замены устройства

Для замены устройства пул должен находиться в состоянии ONLINE. Устройство должно входить в конфигурацию с избыточностью или быть работоспособным (находиться в состоянии ONLINE). Если диск входит в конфигурацию с избыточностью, необходимо наличие достаточного количества реплик для восстановления актуальных данных. При сбое двух дисков в четырехстороннем зеркале один диск может быть заменен, поскольку для него доступны работоспособные реплики. Однако при сбое двух дисков в четырехстороннем устройстве RAID-Z замена дисков невозможна, поскольку необходимые реплики для извлечения данных отсутствуют. Если устройство повреждено, но находится в оперативном режиме, заменить его можно только до перевода пула в состояние FAULTED. Однако любые неверные данные будут скопированы с устройства на новое устройство, если нет подходящих реплик с правильными данными.

В следующей конфигурации диск c1t1d0 может быть заменен, и любые данные в пуле могут быть скопированы из правильной реплики c1t0d0.


    mirror            DEGRADED
    c1t0d0             ONLINE
    c1t1d0             FAULTED

Диск c1t0d0 также может быть заменен, однако самовосстановление данных невозможно, поскольку правильные реплики недоступны.

В следующей конфигурации ни один из поврежденных дисков не может быть заменен. Диски, находящиеся в состоянии ONLINE, также не могут быть заменены вследствие неисправности пула.


    raidz              FAULTED
    c1t0d0             ONLINE
    c2t0d0             FAULTED
    c3t0d0             FAULTED
    c3t0d0             ONLINE

В следующей конфигурации любой диск верхнего уровня может быть заменен, несмотря на то, что все неправильные данные, присутствующие на диске, копируются на новый диск.


c1t0d0         ONLINE
c1t1d0         ONLINE

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

Устройства, замена которых невозможна

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

Для получения дополнительной информации о восстановлении всего пула см. Устранение повреждений в масштабе всего пула устройств хранения данных ZFS.

Замена устройства в пуле устройств хранения данных ZFS

После определения заменяемого устройства выполните команду zpool replace для замены устройства. Для замены поврежденного устройства другим устройством используется следующая команда:


# zpool replace tank c1t1d0 c2t0d0

Эта команда инициирует переход данных в новое устройство из поврежденного устройства или других устройств пула, если для него используется конфигурация с избыточностью. По завершении выполнения команды поврежденное устройство отключается от конфигурации, после чего может быть удалено из системы. Если устройство уже было удалено и заменено новым устройством в том же местоположении, используется форма команды для одного устройства. Пример:


# zpool replace tank c1t1d0

Эта команда выполняет надлежащее форматирование неформатированного диска и инициирует перенос актуальных данных из оставшейся конфигурации.

Для получения дополнительной информации о команде zpool replace см. Замена устройств в пуле устройств хранения данных.


Пример 11–1 Замена устройства в пуле устройств хранения данных ZFS

В следующем примере показано, как заменить устройство (c1t3d0) в зеркальном пуле устройств хранения данных tank в системе Sun Fire x4500. Если необходимо заменить диск c1t3d0 на новый диск в том же расположении (c1t3d0), необходимо исключить диск из конфигурации перед попыткой его замены. в.


# zpool offline tank c1t3d0
# cfgadm | grep c1t3d0
sata1/3::dsk/c1t3d0            disk         connected    configured   ok
# cfgadm -c unconfigure sata1/3
Unconfigure the device at: /devices/pci@0,0/pci1022,7458@2/pci11ab,11ab@1:3
This operation will suspend activity on the SATA device
Continue (yes/no)? yes
# cfgadm | grep sata1/3
sata1/3                        disk         connected    unconfigured ok
<Replace the physical disk c1t3d0>
# cfgadm -c configure sata1/3
# cfgadm | grep sata3/7
sata3/7::dsk/c5t7d0            disk         connected    configured   ok
# zpool online tank c1t3d0
# zpool replace tank c1t3d0
# zpool status
  pool: tank
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Tue Apr 22 14:44:46 2008
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c0t1d0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c0t2d0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c0t3d0  ONLINE       0     0     0
            c1t3d0  ONLINE       0     0     0

errors: No known data errors

Следует помнить, что предыдущая команда zpool output может показывать как новые, так и старые диски под заголовком replacing. Пример:


replacing     DEGRADED     0     0    0
  c1t3d0s0/o  FAULTED      0     0    0
  c1t3d0      ONLINE       0     0    0

Этот текст означает, что выполняется процесс замены, и актуальные данные переносятся на новый диск.

Если диск c1t3d0) заменяется на другой диск (c4t3d0), то после физической замены диска необходимо только выполнить команду zpool replace. Пример:


# zpool replace tank c1t3d0 c4t3d0
# zpool status
  pool: tank
 state: DEGRADED
 scrub: resilver completed after 0h0m with 0 errors on Tue Apr 22 14:54:50 2008
config:

        NAME           STATE     READ WRITE CKSUM
        tank           DEGRADED     0     0     0
          mirror       ONLINE       0     0     0
            c0t1d0     ONLINE       0     0     0
            c1t1d0     ONLINE       0     0     0
          mirror       ONLINE       0     0     0
            c0t2d0     ONLINE       0     0     0
            c1t2d0     ONLINE       0     0     0
          mirror       DEGRADED     0     0     0
            c0t3d0     ONLINE       0     0     0
            replacing  DEGRADED     0     0     0
              c1t3d0   OFFLINE      0     0     0
              c4t3d0   ONLINE       0     0     0

errors: No known data errors

Для завершения процесса замены диска может потребоваться выполнить команду zpool status несколько раз.


# zpool status tank
  pool: tank
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Tue Apr 22 14:54:50 2008
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c0t1d0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c0t2d0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c0t3d0  ONLINE       0     0     0
            c4t3d0  ONLINE       0     0     0


Пример 11–2 Замена отказавшего устройства протоколирования

В примере ниже представлено восстановление устройства протоколирования c0t5d0 после сбоя в пуле устройств хранения pool. Требуются следующие основные действия.


# zpool status -x
  pool: pool
 state: FAULTED
status: One or more of the intent logs could not be read.
        Waiting for adminstrator intervention to fix the faulted pool.
action: Either restore the affected device(s) and run 'zpool online',
        or ignore the intent log records by running 'zpool clear'.
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        pool        FAULTED      0     0     0 bad intent log
          mirror    ONLINE       0     0     0
            c0t1d0  ONLINE       0     0     0
            c0t4d0  ONLINE       0     0     0
        logs        FAULTED      0     0     0 bad intent log
          c0t5d0    UNAVAIL      0     0     0 cannot open
<Physically replace the failed log device>
# zpool online pool c0t5d0
# zpool clear pool

Просмотр статуса переноса актуальных данных

Процесс замены диска может занять продолжительное время, в зависимости от его емкости и объема данных в пуле. Процесс переноса данных из одного устройства на другое называют переносом актуальных данных; для контроля этого процесса используется команда zpool status.

В традиционных файловых системах перенос актуальных данных выполняется на уровне блоков. Поскольку ZFS исключает искусственные слои диспетчера томов, перенос актуальных данных выполняется более универсальным и контролируемым образом. Эта функция имеет два основных преимущества:

Для контроля процесса переноса актуальных данных используется команда zpool status. Пример:


# zpool status tank
  pool: tank
 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.
 scrub: resilver in progress for 0h2m, 16.43% done, 0h13m to go
config:
        NAME                  STATE     READ WRITE CKSUM 
        tank                  DEGRADED     0     0     0
          mirror              DEGRADED     0     0     0
            replacing         DEGRADED     0     0     0
              c1t0d0          ONLINE       0     0     0
              c2t0d0          ONLINE       0     0     0  
            c1t1d0            ONLINE       0     0     0

В приведенном примере диск c1t0d0 заменяется диском c2t0d0. Это событие отражается в выходных данных запроса состояния как replacing, что означает выполняющуюся замену виртуального устройства в настройке. Это устройство не существует в действительности, и создать пул с использованием этого типа виртуального устройства невозможно. Цель использования этого устройства состоит только в отображении процесса переноса актуальных данных и точном определении заменяемого устройства.

Следует отметить, что любой пул, для которого в настоящее время выполняется перенос актуальных данных, переводится в состояние ONLINE или DEGRADED, так как не может обеспечить необходимый уровень избыточности до завершения процесса переноса. Чтобы свести к минимуму воздействие на систему, перенос актуальных данных выполняется максимально быстро, хотя системные операции ввода-вывода всегда имеют более низкий приоритет, чем ввод-вывод по запросу пользователя. После завершения переноса актуальных данных выполняется переход к новой полной конфигурации. Пример:


# zpool status tank
  pool: tank
 state: ONLINE
scrub: resilver completed after 0h0m with 0 errors on Tue Sep  1 10:55:54 2009
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c2t0d0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0

errors: No known data errors

Пул снова переводится в состояние ONLINE, и исходный неисправный диск (c1t0d0) удаляется из конфигурации.

Восстановление поврежденных данных

В следующих разделах описан процесс определения типа повреждения и восстановления данных, если оно возможно.

Для сведения к минимуму риска повреждения данных в ZFS применяется расчет контрольной суммы, обеспечение избыточности данных и их самовосстановление. Тем не менее, повреждение данных может происходить в том случае, если пул не является избыточным, при повреждении во время нахождения пула в состоянии DEGRADED или в результате ряда маловероятных событий, приводящих к повреждению нескольких копий фрагмента данных. Вне зависимости от причины, результат одинаков: данные повреждены и, следовательно, недоступны. Предпринимаемое действие зависит от типа поврежденных данных и их относительной значимости. Возможно повреждение двух основных типов данных:

Данные проверяются в нормальном режиме работы, а также в процессе очистки. Для получения дополнительной информации о проверке целостности данных пула см. Проверка целостности данных ZFS.

Определение типа повреждения данных

По умолчанию команда zpool status отражает только возникшие повреждения, но не место их возникновения. Пример:


# zpool status
   pool: monkey
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://www.sun.com/msg/ZFS-8000-8A
scrub: none requested
config:

         NAME        STATE     READ WRITE CKSUM
         monkey      ONLINE       0     0     0
           c1t1d0s6  ONLINE       0     0     0
           c1t1d0s7  ONLINE       0     0     0

errors: 8 data errors, use '-v' for a list 

Каждая запись о выявленной ошибке указывает только на то, что эта ошибка произошла в определенный момент времени. Это не означает, что ошибка по-прежнему присутствует в системе. Это утверждение справедливо для нормального режима работы. Некоторые временные сбои могут привести к повреждению данных, которое автоматически устраняется после исправления. Полная очистка пула обеспечивает проверку всех активных блоков в пуле, поэтому журнал ошибок сбрасывается по завершении каждой очистки. Если ошибки уже были устранены и завершение очистки не требуется, выполните сброс всех ошибок в пуле при помощи команды zpool online.

Если повреждение касается метаданных всего пула, выходные данные команды будут несколько другими. Пример:


# zpool status -v morpheus
  pool: morpheus
    id: 1422736890544688191
 state: FAULTED
status: The pool metadata is corrupted.
action: The pool cannot be imported due to damaged devices or data.
   see: http://www.sun.com/msg/ZFS-8000-72
config:

        morpheus    FAULTED   corrupted data
          c1t10d0   ONLINE

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

Восстановление поврежденного файла или каталога

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

При возникновении повреждения в блоке данных файла этот файл можно безопасно удалить, что позволит устранить ошибку. Для отображения списка имен файлов с повторяющимися ошибками используется команда zpool status -v. Пример:


# zpool status -v
   pool: monkey
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://www.sun.com/msg/ZFS-8000-8A
scrub: none requested
config:

         NAME        STATE     READ WRITE CKSUM
         monkey      ONLINE       0     0     0
           c1t1d0s6  ONLINE       0     0     0
           c1t1d0s7  ONLINE       0     0     0

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

/monkey/a.txt
/monkey/bananas/b.txt
/monkey/sub/dir/d.txt
/monkey/ghost/e.txt
/monkey/ghost/boo/f.txt

Предшествующие выходные данные выглядят следующим образом:

При повреждении в каталоге или метаданных файла единственным решением является перемещение файла в какое-либо другое местоположение. Любой файл или каталог можно безопасно переместить в менее удобное местоположение, что обеспечивает восстановление исходного объекта.

Устранение повреждений в масштабе всего пула устройств хранения данных ZFS

При повреждении метаданных, препятствующем открытию пула, необходимо восстановить пул и все соответствующие данные из резервной копии. Используемый для этого механизм полностью зависит от конфигурации пула и стратегии резервирования. Сначала необходимо сохранить конфигурацию в соответствии с выходными данными команды zpool status, что позволит воссоздать ее после уничтожения пула. Затем выполните команду zpool destroy -f для уничтожения пула. Кроме того, сохраните файл, содержащий описание структуры наборов данных и различных указанных на локальном уровне свойств в безопасном местоположении, поскольку при недоступности пула эта информация также становится недоступной. На основе конфигурации пула и схемы набора данных после разрушения пула его конфигурацию можно восстановить в полном объеме. После этого можно заполнить данные с помощью любой используемой стратегии резервного копирования и восстановления.

Восстановление незагружаемой системы

ZFS была разработана как надежная и устойчивая к ошибкам система. Тем не менее, ошибки в программном обеспечении или определенные непредвиденные отказы могут вызвать фатальную ошибку системы при обращении к пулу. В рамках процесса начальной загрузки осуществляется открытие каждого пула. Это означает, что в результате подобных сбоев система оказывается в бесконечном цикле фатальной ошибки и перезагрузки. Для восстановления в такой ситуации необходимо информировать ZFS, что при запуске не следует искать никакие пулы.

В ZFS имеется внутренний кэш доступных пулов и их конфигураций в /etc/zfs/zpool.cache. Расположение и содержимое этого файла представляют собой закрытые атрибуты и могут изменяться. Если система становится незагружаемой, выполните начальную загрузку до этапа none с использованием загрузочного параметра -m milestone=none. После перехода системы в рабочий режим перемонтируйте корневую файловую систему как доступную для записи, а затем удалите или переместите файл /etc/zfs/zpool.cache в другое расположение. В результате этих действий ZFS не обнаруживает существующие в системе пулы, что позволяет предотвратить обращение к неисправному пулу, вызвавшему проблему. Затем систему можно перевести в нормальное состояние с помощью команды svcadm milestone all. При загрузке с альтернативного корня для восстановления используется аналогичный процесс.

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