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

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

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
BlackCat
прапорщик
Сообщения: 469
Зарегистрирован: 2007-10-16 22:40:42

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

Непрочитанное сообщение BlackCat » 2010-12-31 5:35:22

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

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

Хостинговая компания 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/

Аватара пользователя
f_andrey
майор
Сообщения: 2651
Зарегистрирован: 2007-12-26 1:22:58
Откуда: СПб
Контактная информация:

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

Непрочитанное сообщение f_andrey » 2010-12-31 6:28:44

Не понял, а почему было не вывести из pool сбойный диск, и не заменить на новый, после этого, в принципе пул должен был востановится, так как raidz

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

 A  raidz group with N disks of size X with P parity disks can hold  approximately  (N-P)*X
Если ваша тема перенесена, то смотри http://forum.lissyara.su/viewtopic.php?f=1&t=32308

Аватара пользователя
BlackCat
прапорщик
Сообщения: 469
Зарегистрирован: 2007-10-16 22:40:42

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

Непрочитанное сообщение BlackCat » 2010-12-31 6:53:07

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

Аватара пользователя
gloom
лейтенант
Сообщения: 738
Зарегистрирован: 2008-03-13 16:29:12
Откуда: UA

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

Непрочитанное сообщение gloom » 2010-12-31 10:30:31

очень интересно! спасибо

Аватара пользователя
BlackCat
прапорщик
Сообщения: 469
Зарегистрирован: 2007-10-16 22:40:42

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

Непрочитанное сообщение BlackCat » 2011-01-12 16:23:54

Судя по полному отстутствию комментариев или статейка не нашла своего читателя или в ней ничего не понятно.
В течении 24 часов я её переведу в публичный доступ (в разделе "Файловая система"), если не будет серьёзных замечаний.

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

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

Непрочитанное сообщение FreeBSP » 2011-01-12 16:42:08

пока читаю полезно или нет - не знаю, но внимания статья заслуживает это однозначно

пока навскидку: 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? - тоже
читаю дальше
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

Аватара пользователя
BlackCat
прапорщик
Сообщения: 469
Зарегистрирован: 2007-10-16 22:40:42

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

Непрочитанное сообщение BlackCat » 2011-01-12 16:48:17

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

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

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

Непрочитанное сообщение FreeBSP » 2011-01-12 17:03:27

однозначно к прочтению
как минимум - как "легкое чтение на ночь"
как максимум - как боевое руководство =)
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

Аватара пользователя
BlackCat
прапорщик
Сообщения: 469
Зарегистрирован: 2007-10-16 22:40:42

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

Непрочитанное сообщение BlackCat » 2011-01-12 17:40:21

Новая версия скрипта, преобразует массив в число с использованием пары циклов (один - переставляет элементы, второй - рабочий):

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

#!/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 за найденный недочёт.

Аватара пользователя
iMoJo
ефрейтор
Сообщения: 66
Зарегистрирован: 2010-03-23 7:24:48
Откуда: KZ

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

Непрочитанное сообщение iMoJo » 2011-01-13 6:41:55

Однозначно - респект!

Аватара пользователя
BlackCat
прапорщик
Сообщения: 469
Зарегистрирован: 2007-10-16 22:40:42

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

Непрочитанное сообщение BlackCat » 2011-01-13 19:13:35

Всё - разрешил публичный доступ.

Ti
проходил мимо
Сообщения: 2
Зарегистрирован: 2010-01-29 17:56:21

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

Непрочитанное сообщение Ti » 2011-02-05 19:51:57

решал такую проблему загрузкой пула в саляру

Аватара пользователя
BlackCat
прапорщик
Сообщения: 469
Зарегистрирован: 2007-10-16 22:40:42

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

Непрочитанное сообщение BlackCat » 2011-03-11 23:22:07

Ti писал(а):решал такую проблему загрузкой пула в саляру
Что работает по-другому, кроме вообще работающих ключей zdb(8)?

Аватара пользователя
BlackCat
прапорщик
Сообщения: 469
Зарегистрирован: 2007-10-16 22:40:42

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

Непрочитанное сообщение BlackCat » 2011-03-11 23:36:08

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

Anon Y Mous
проходил мимо

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

Непрочитанное сообщение Anon Y Mous » 2011-03-16 11:30:55

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

Аватара пользователя
BlackCat
прапорщик
Сообщения: 469
Зарегистрирован: 2007-10-16 22:40:42

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

Непрочитанное сообщение BlackCat » 2011-03-16 12:51:25

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

Anon Y Mous
проходил мимо

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

Непрочитанное сообщение Anon Y Mous » 2011-03-18 12:11:34

Флаг -F не откатывает транзакции и предназначен для отладки (игнорируются все ошибки импорта), поэтому он не документирован.
Я не зря написал про последнюю версию. В ней старый недокументированный -F переименован в по-прежнему недокументированный -V, а -F документирован и имеет другое предназначение - восстановление поврежденного пула путем отмотки назад (см. также недокументированный -X).

Аватара пользователя
BlackCat
прапорщик
Сообщения: 469
Зарегистрирован: 2007-10-16 22:40:42

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

Непрочитанное сообщение BlackCat » 2011-03-18 16:38:33

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) уже есть необходимые коментарии.

Аватара пользователя
BlackCat
прапорщик
Сообщения: 469
Зарегистрирован: 2007-10-16 22:40:42

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

Непрочитанное сообщение BlackCat » 2011-11-23 21:57:47

Обновил статью, добавив упоминание о появлении параметра -F.

Аватара пользователя
nirnroot
проходил мимо
Сообщения: 6
Зарегистрирован: 2009-03-17 18:38:03
Откуда: Ю-С.

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

Непрочитанное сообщение nirnroot » 2011-11-25 16:55:43

Я, конечно, извиняюсь что втиснусь, просто тут специалисты :)
Угробил пул-зеркало. Вылетел один диск, я купил новый 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 не помогает.