Страница 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
Ну и как обычно - запасной копии нет

zpool import -fFXV -o ro не помогает.