Страница 1 из 1

Статья: Восстановление ZFS-пула с помощью подручных средств

Добавлено: 2010-12-31 5:35:22
BlackCat
На самом деле это не статья, а просто история о том, как была восстановленна работоспособность развалившегося RAID-Z пула.
Текст: http://www.lissyara.su/articles/freebsd ... _recovery/

Вот думаю: стоит это вообще публиковать или лучше снести за бесполезностью? Что скажите?

Re: Статья: Восстановление ZFS-пула с помощью подручных сред

Добавлено: 2010-12-31 6:28:44
f_andrey
Не понял, а почему было не вывести из pool сбойный диск, и не заменить на новый, после этого, в принципе пул должен был востановится, так как raidz

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

 A  raidz group with N disks of size X with P parity disks can hold  approximately  (N-P)*X

Re: Статья: Восстановление ZFS-пула с помощью подручных сред

Добавлено: 2010-12-31 6:53:07
BlackCat
f_andrey писал(а):Не понял, а почему было не вывести из pool сбойный диск, и не заменить на новый, после этого, в принципе пул должен был востановится, так как raidz
Если диск просто сбоит, то пул переходит в состояние DEGRADE и доступ к данным сохраняется. В состоянии FAULT уже никакая терапия с заменой дисков не поможет, как и получилось, когда сбойный диск был заменён на рабочий.

Re: Статья: Восстановление ZFS-пула с помощью подручных сред

Добавлено: 2010-12-31 10:30:31
gloom
очень интересно! спасибо

Re: Статья: Восстановление ZFS-пула с помощью подручных сред

Добавлено: 2011-01-12 16:23:54
BlackCat
Судя по полному отстутствию комментариев или статейка не нашла своего читателя или в ней ничего не понятно.
В течении 24 часов я её переведу в публичный доступ (в разделе "Файловая система"), если не будет серьёзных замечаний.

Re: Статья: Восстановление ZFS-пула с помощью подручных сред

Добавлено: 2011-01-12 16:42:08
FreeBSP
пока читаю полезно или нет - не знаю, но внимания статья заслуживает это однозначно

пока навскидку: arr2int()
{
b=`echo $1 | sed "s/^$r7$/0x\1/" | xargs printf "%d"`
res=$b
b=`echo $1 | sed "s/^$r6$/0x\1/" | xargs printf "%d"`
res=`expr -e $res \* 256 + $b`
b=`echo $1 | sed "s/^$r5$/0x\1/" | xargs printf "%d"`
res=`expr -e $res \* 256 + $b`
b=`echo $1 | sed "s/^$r4$/0x\1/" | xargs printf "%d"`
res=`expr -e $res \* 256 + $b`
b=`echo $1 | sed "s/^$r3$/0x\1/" | xargs printf "%d"`
res=`expr -e $res \* 256 + $b`
b=`echo $1 | sed "s/^$r2$/0x\1/" | xargs printf "%d"`
res=`expr -e $res \* 256 + $b`
b=`echo $1 | sed "s/^$r1$/0x\1/" | xargs printf "%d"`
res=`expr -e $res \* 256 + $b`
b=`echo $1 | sed "s/^$r0$/0x\1/" | xargs printf "%d"`
res=`expr -e $res \* 256 + $b`
echo $res
}
можно реализовать циклом, присвоения переменным $r? - тоже
читаю дальше

Re: Статья: Восстановление ZFS-пула с помощью подручных сред

Добавлено: 2011-01-12 16:48:17
BlackCat
FreeBSP писал(а):можно реализовать циклом, присвоения переменным $r? - тоже
Слона то я и не приметил (с) Куприн.
Сейчас сделаю адекватный вариант.

Re: Статья: Восстановление ZFS-пула с помощью подручных сред

Добавлено: 2011-01-12 17:03:27
FreeBSP
однозначно к прочтению
как минимум - как "легкое чтение на ночь"
как максимум - как боевое руководство =)

Re: Статья: Восстановление ZFS-пула с помощью подручных сред

Добавлено: 2011-01-12 17:40:21
BlackCat
Новая версия скрипта, преобразует массив в число с использованием пары циклов (один - переставляет элементы, второй - рабочий):

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

#!/bin/sh

DISKS="ad2 ad4 ad6"
LABELS="0 1 2 3"

FIELD_OFF=16
FIELD_LEN=8

arr2int()
{
  arr=""
  res=0

  # Invert octet order
  for oct in $1; do
    arr="$oct $arr"
  done

  # Convert
  for oct in $arr; do
    oct=`printf "%d" 0x$oct`
    res=`expr -e $res \* 256 + $oct`
  done

  echo $res
}

fin=`expr 256 \* 1024`
prev=""
for DISK in $DISKS; do
  for L in $LABELS; do
    fdump="$DISK-label$L.dump"
    # First block pos
    off=`expr 128 \* 1024 + $FIELD_OFF`
    n=0
    while [ $off -lt $fin ]; do
      # Get octets array
      str=`od -t xC -A n -v -j $off -N $FIELD_LEN $fdump`
      str=`echo $str | sed 's/^ *\([^ ].*[^ ]\) *$/\1/'`
      # Convert to integer
      txg=`arr2int "$str"`
      printf "txg %10u disk %s label %s n %3u\n" $txg $DISK $L $n
      off=`expr $off + 1024`
      n=`expr $n + 1`
    done
  done
done
В статье уже обновил. Спасибо FreeBSP за найденный недочёт.

Re: Статья: Восстановление ZFS-пула с помощью подручных сред

Добавлено: 2011-01-13 6:41:55
iMoJo
Однозначно - респект!

Re: Статья: Восстановление ZFS-пула с помощью подручных сред

Добавлено: 2011-01-13 19:13:35
BlackCat
Всё - разрешил публичный доступ.

Re: Статья: Восстановление ZFS-пула с помощью подручных сред

Добавлено: 2011-02-05 19:51:57
Ti
решал такую проблему загрузкой пула в саляру

Re: Статья: Восстановление ZFS-пула с помощью подручных сред

Добавлено: 2011-03-11 23:22:07
BlackCat
Ti писал(а):решал такую проблему загрузкой пула в саляру
Что работает по-другому, кроме вообще работающих ключей zdb(8)?

Re: Статья: Восстановление ZFS-пула с помощью подручных сред

Добавлено: 2011-03-11 23:36:08
BlackCat
Метод затирания uberblock'а последней транзакции, т.е., фактически, откат к предыдущей транзакции помог с восстановлением ещё одного пула (уже другого, но так-же с отказавшим диском) в состоянии FAULTED, до состояния DEGRADE. Иногда, этот способ всплывает в списках рассылки.
В свете данных событий возник вопрос: существует ли какой либо штатный способ отката на одну-две транзакции назад? Может быть я что-то упускаю из виду?

Re: Статья: Восстановление ZFS-пула с помощью подручных сред

Добавлено: 2011-03-16 11:30:55
Anon Y Mous
В свете данных событий возник вопрос: существует ли какой либо штатный способ отката на одну-две транзакции назад? Может быть я что-то упускаю из виду?
Существует. Смотреть в сторону zpool import -F. Должен поддерживаться в последней версии (там где поддерживаемая версия пула - 28).

Re: Статья: Восстановление ZFS-пула с помощью подручных сред

Добавлено: 2011-03-16 12:51:25
BlackCat
Anon Y Mous писал(а):
В свете данных событий возник вопрос: существует ли какой либо штатный способ отката на одну-две транзакции назад? Может быть я что-то упускаю из виду?
Существует. Смотреть в сторону zpool import -F. Должен поддерживаться в последней версии (там где поддерживаемая версия пула - 28).
Флаг -F не откатывает транзакции и предназначен для отладки (игнорируются все ошибки импорта), поэтому он не документирован.

Re: Статья: Восстановление ZFS-пула с помощью подручных сред

Добавлено: 2011-03-18 12:11:34
Anon Y Mous
Флаг -F не откатывает транзакции и предназначен для отладки (игнорируются все ошибки импорта), поэтому он не документирован.
Я не зря написал про последнюю версию. В ней старый недокументированный -F переименован в по-прежнему недокументированный -V, а -F документирован и имеет другое предназначение - восстановление поврежденного пула путем отмотки назад (см. также недокументированный -X).

Re: Статья: Восстановление ZFS-пула с помощью подручных сред

Добавлено: 2011-03-18 16:38:33
BlackCat
Anon Y Mous писал(а):Я не зря написал про последнюю версию. В ней старый недокументированный -F переименован в по-прежнему недокументированный -V, а -F документирован и имеет другое предназначение - восстановление поврежденного пула путем отмотки назад (см. также недокументированный -X).
Спасибо за то что поправили. Действительно, пару недель назад в HEAD добавили такую возможность и ещё много чего интересного. Сейчас начал просматривать исходники zpool(8), а там в коментариях к правке:
SVN rev 219089 писал(а):...
- zpool import -F. Allows to rewind corrupted pool to earlier
transaction group.
...
И ещё много чего интересного внутри исходника, только man ещё не подправили, но в справке самого zpool(8) уже есть необходимые коментарии.

Re: Статья: Восстановление ZFS-пула с помощью подручных сред

Добавлено: 2011-11-23 21:57:47
BlackCat
Обновил статью, добавив упоминание о появлении параметра -F.

Re: Статья: Восстановление ZFS-пула с помощью подручных сред

Добавлено: 2011-11-25 16:55:43
nirnroot
Я, конечно, извиняюсь что втиснусь, просто тут специалисты :)
Угробил пул-зеркало. Вылетел один диск, я купил новый 4K, форматнул его в новый пул, перенес все со старого, загрузился с нового, ок.
Форматнул старый диск. Присоединил к новому как зеркало, дождался ресильва. Потом мне показалось, что новый диск некрасиво в пуле по gptid, я его отдеттачил, glabal label, zpool add. Прошел ресильв. Ребут. Ну и хана :)
Поэтому точно не знаю, из-за чего полетел пул.

Листинги, пулы 28 версии, freebsd 9.0rc (сам пул создавал через freebsd X) (из интересного - не совпадающая разметка дисков, ресилвер на втором диске и не совпадающие номера DTL):

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

# gpart show 

 =>        34  2930277101  ada0  GPT  (1.4T)
          34         128     1  freebsd-boot  (64k)
         162        1886        - free -  (943k)
        2048     8388608     2  freebsd-swap  (4.0G)
     8390656  2921886479     3  freebsd-zfs  (1.4T)

=>        34  2930277101  ada1  GPT  (1.4T)
          34           6        - free -  (3.0k)
          40         128     1  freebsd-boot  (64k)
         168        1880        - free -  (940k)
        2048     8388608     2  freebsd-swap  (4.0G)
     8390656  2921886472     3  freebsd-zfs  (1.4T)
  2930277128           7        - free -  (3.5k)

# zdb -eX
Configuration for import:
        vdev_children: 1
        version: 28
        pool_guid: 1487408506722295672
        name: 'tank'
        state: 0
        vdev_tree:
            type: 'root'
            id: 0
            guid: 1487408506722295672
            children[0]:
                type: 'mirror'
                id: 0
                guid: 14949755914536867893
                whole_disk: 0
                metaslab_array: 30
                metaslab_shift: 33
                ashift: 12
                asize: 1496001019904
                is_log: 0
                create_txg: 4
                children[0]:
                    type: 'disk'
                    id: 0
                    guid: 12181262761882874517
                    path: '/dev/gpt/disk0'
                    phys_path: '/dev/gpt/disk0'
                    whole_disk: 1
                    DTL: 209
                    create_txg: 4
                children[1]:
                    type: 'disk'
                    id: 1
                    guid: 10476129156643193055
                    phys_path: '/dev/gpt/disk1'
                    whole_disk: 1
                    DTL: 212
                    create_txg: 4
                    resilvering: 1
                    path: '/dev/dsk/gpt/disk1'

zdb: can't open 'tank': no such directory

# zpool import

  pool: tank
    id: 1487408506722295672
 state: FAULTED
status: One or more devices contains corrupted data.
action: The pool cannot be imported due to damaged devices or data.
	The pool may be active on another system, but can be imported using
	the '-f' flag.
   see: http://www.sun.com/msg/ZFS-8000-5E
config:

	tank                      FAULTED  corrupted data
	  mirror-0                ONLINE
	    12181262761882874517  UNAVAIL  corrupted data
	    10476129156643193055  UNAVAIL  corrupted data
Метки вроде все целые - на каждом диске по 4 штуки. Если что - лежат вот тут - http://pastebin.com/JuMrdczV

Ну и как обычно - запасной копии нет :bn: zpool import -fFXV -o ro не помогает.