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

Как я спасал систему, или переносим старую FreeBSD на zfs

Добавлено: 11 апр 2014, 11:48
RomA
О чём статья:
Данный пост рассказывает о опыте миграции давно установленной FreeBSD на современные типы разметок. Так будет рассмотрена следующая цепочка:
1) Есть исходня система на gmirror
2) Уходим от gmirror на один диск
3) Переносим систему на zfs диск
4) Создаём массив и добавляем gpt диск
5) Заменяем диск из пункта 3 gpt диском

Дано:
Как говорится, пока петух не клюнет, ничего не произойдёт... Вот и у меня и смарт показывал всё хорошо, и gmirror на 2х дисках, и так далее... И вот однажды я заметил что у меня работает только оидн диск. Более того, при попытки ввести второй диск в массив - система зависала, а в логах была вот такая ошибка:
Apr 6 00:12:33 stat kernel: (ada0:ahcich0:0:0:0): READ_FPDMA_QUEUED. ACB: 60 20 5f 89 2a 40 01 00 00 00 00 00
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): CAM status: ATA Status Error
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): ATA status: 41 (DRDY ERR), error: 40 (UNC )
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): RES: 41 40 5f 89 2a 40 01 00 00 00 00
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): Retrying command
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): READ_FPDMA_QUEUED. ACB: 60 20 5f 89 2a 40 01 00 00 00 00 00
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): CAM status: ATA Status Error
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): ATA status: 41 (DRDY ERR), error: 40 (UNC )
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): RES: 41 40 5f 89 2a 40 01 00 00 00 00
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): Retrying command
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): READ_FPDMA_QUEUED. ACB: 60 20 5f 89 2a 40 01 00 00 00 00 00
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): CAM status: ATA Status Error
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): ATA status: 41 (DRDY ERR), error: 40 (UNC )
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): RES: 41 40 5f 89 2a 40 01 00 00 00 00
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): Retrying command
Apr 6 00:12:38 stat kernel: (ada0:ahcich0:0:0:0): READ_FPDMA_QUEUED. ACB: 60 20 5f 89 2a 40 01 00 00 00 00 00
Apr 6 00:12:38 stat kernel: (ada0:ahcich0:0:0:0): CAM status: ATA Status Error
Apr 6 00:12:38 stat kernel: (ada0:ahcich0:0:0:0): ATA status: 41 (DRDY ERR), error: 40 (UNC )
Apr 6 00:12:38 stat kernel: (ada0:ahcich0:0:0:0): RES: 41 40 5f 89 2a 40 01 00 00 00 00
Apr 6 00:12:38 stat kernel: (ada0:ahcich0:0:0:0): Retrying command
Apr 6 00:12:40 stat kernel: (ada0:ahcich0:0:0:0): READ_FPDMA_QUEUED. ACB: 60 20 5f 89 2a 40 01 00 00 00 00 00
Apr 6 00:12:40 stat kernel: (ada0:ahcich0:0:0:0): CAM status: ATA Status Error
Apr 6 00:12:40 stat kernel: (ada0:ahcich0:0:0:0): ATA status: 41 (DRDY ERR), error: 40 (UNC )
Apr 6 00:12:40 stat kernel: (ada0:ahcich0:0:0:0): RES: 41 40 5f 89 2a 40 01 00 00 00 00
Apr 6 00:12:40 stat kernel: (ada0:ahcich0:0:0:0): Error 5, Retries exhausted
Apr 6 00:12:40 stat kernel: GEOM_MIRROR: Request failed (error=5). ada0[READ(offset=10017226240, length=16384)]
Apr 6 00:12:40 stat kernel: g_vfs_done():mirror/gm0s1d[READ(offset=353517568, length=16384)]error = 5
Поиск в инете быстро дал ответ на вопрос - такая проблема весьма часто встречается с винтами фирмы WD, который у меня и стоит
<WDC WD5003ABYX-01WERA1 01.01S02> ATA-8 SATA 2.x device
Serial Number WD-WMAYP5387574
300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)
Command Queueing enabled
476940MB (976773168 512 byte sectors: 16H 63S/T 16383C)
Играния с биосом и прочими настройками не дали никаких положительных результатов. Акронисы, dd и прочие утилиты диск копировать не хотели. Развалить и заново собрать рейд тоже не помогло.
Итак вернулись к началу - система работает на одном винте.

Разваливаем gmirror
Если уж работать с одним жёским, то делать это проще без прослоек, то есть откатываемся в древнии времени - переходим на один диск. Сделать это не сложно - открываем статью по настройке gmirror, и делаем всё наоборот - выключаем подгрузку модуля ядра и в /etc/fstab прописываем загрузку с диска. Перезагружаемся.

Мигрируем на zfs
Итак, у меня есть система, которая работает, но которую я не могу никак скопировать, судя по всему из-за ошибок на диске (сувать в регенераторы я его боюсь, ибо инфы там куча и с нуля не настроить) - мне надо как-то обмануть систему, желательно теми средствами, о которых она и не подозревает. На ум приходит новомодная и нашумевшая zfs - в её сторону и начнём копать.
За основу взял вот эту статью http://www.lissyara.su/articles/freebsd ... fs_to_zfs/ в качестве подсказок пришлось пользоваться вот этим http://rtfm.co.ua/freebsd-gpart-primer- ... s-diskami/

Проясним:
1) FreeBSD stat.stniva.ru 9.2-STABLE FreeBSD 9.2-STABLE #8 r260583
2) /dev/ada0 - это наш винт, на котором работает фря
3) /dev/ada1 - это наш новый винт - он такого же размера, как и первый. Винты 500
4) rootFS - это наша "виртуальная" система - назвать можете как заходите

Поехали:
Как и написано в статье сначало добавляем в конфиги загрузку zfs
в файл /boot/loader.conf добавляем

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

zfs_load="YES"
vfs.root.mountfrom="zfs:rootFS"
Вторая строка для загрузки уже сразу
и в файл /etc/rc.conf добавляем

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

zfs_enable="YES"
Без этого не загрузится - проверял, но сейчас его нету у меня, почему-то (всё работоает)

Теперь в статье советуют переделать загрузчик - я сделал, но кажется что он мне ничего не поменял (у меня модуль был уже загружен), но делается это быстро - так что лучше перестраховаться - добавляем в /etc/make.conf

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

LOADER_ZFS_SUPPORT=yes
и пересобираем

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

cd /usr/src/sys/boot && make obj depend all install
Теперь надо создать нашу виртуальную файловую систему и привязать её к нашему пустому диску

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

zpool create rootFS /dev/ada1
Проверяем как написано в статье и отключаем

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

zpool export rootFS
что бы добавить загрузчики

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

dd if=/boot/zfsboot of=/dev/ada1 bs=512 count=1
dd if=/boot/zfsboot of=/dev/ada1 bs=512 skip=1 seek=1024
Возвращаем себе контроль над файловой системой

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

zpool import rootFS
и немного шаманим

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

zfs set mountpoint=none rootFS
Примонтируем нашу новую систему к себе

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

mount -t zfs rootFS /mnt/
и начнём переливать на неё нашу работающую систему

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

#dump -0Lf - / | (cd /mnt/; restore -rf -)
#dump -0Lf - /usr | (cd /mnt/usr/; restore -rf -)
#dump -0Lf - /usr/home | (cd /mnt/usr/home/; restore -rf -)
#dump -0Lf - /var | (cd /mnt/var/; restore -rf -)
#dump -0Lf - /tmp | (cd /mnt/tmp/; restore -rf -)
Ну или какие там у вас есть разделы.

После чего мы перегружаемся. Старый винт можно вытащить (он был в первом гнезде), новый переставить (из второго в первое гнездо) и загрузиться. Получается что мы загрузимся с нового винта, а старый целый пока что лежит с копией.
У меня загрузилось без проблем и я увидел вот такую картину:

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

stat# zpool status
  pool: rootFS
 state: ONLINE
  scan: none requested
config:

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

errors: No known data errors
stat#
Немножко поработал, но помятуя предыдущий винт захотелось большего, то есть продолжаем манипуляции

Разметка нового диска в GPT

Итак, в нулевом разъёме стоит винт с zfs а в первый (второй по счёту в сервере) вставлен новый винт. Посмотрим что на нём

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

stat# gpart show 
=>       63  976773105  ada1  MBR  (465G)
         63  976751937     1  freebsd  [active]  (465G)
  976752000      21168        - free -  (10M)

=>        0  976751937  ada1s1  BSD  (465G)
          0    2097152       1  freebsd-ufs  (1.0G)
    2097152   16777216       2  freebsd-swap  (8.0G)
   18874368  419430400       4  freebsd-ufs  (200G)
  438304768   20971520       5  freebsd-ufs  (10G)
  459276288  419430400       6  freebsd-ufs  (200G)
  878706688   98045249       7  freebsd-ufs  (46G)

Сначало надо удалить разделы, а потом очистить винт

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

stat# gpart delete -i 1 ada1
ada1s1 deleted
stat# gpart destroy ada1
ada1 destroyed
Теперь создадим на нём новую разметку

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

stat# gpart create -s gpt ada1
ada1 created
stat# gpart add -b 34 -s 64k -t freebsd-boot ada1
ada1p1 added
stat# gpart add -t freebsd-zfs -l disk0 ada1
ada1p2 added
И пропишем на него загрузчик, пока не забыли

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

stat# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
bootcode written to ada1
stat#
Добавляем новый диск в нашу виртуальную файловую систему
Теперь добавим наш второй винт в массив

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

stat# zpool attach rootFS /dev/ada0 /dev/gpt/disk0
Смотрим что делается

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

stat# zpool status
  pool: rootFS
 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 Thu Apr 10 11:43:30 2014
        103G scanned out of 357G at 65.8M/s, 1h5m to go
        103G resilvered, 28.80% done
config:

	NAME           STATE     READ WRITE CKSUM
	rootFS         ONLINE       0     0     0
	  mirror-0     ONLINE       0     0     0
	    ada0       ONLINE       0     0     0
	    gpt/disk0  ONLINE       0     0     0  (resilvering)

errors: No known data errors
stat#
Ну вот - идёт синхронизация (resilvering) и завершилась она на 28.80%

Через время всё ставновится хорошо

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

stat# zpool status
  pool: rootFS
 state: ONLINE
  scan: resilvered 357G in 1h52m with 0 errors on Thu Apr 10 13:35:35 2014
config:

	NAME           STATE     READ WRITE CKSUM
	rootFS         ONLINE       0     0     0
	  mirror-0     ONLINE       0     0     0
	    ada0       ONLINE       0     0     0
	    gpt/disk0  ONLINE       0     0     0

errors: No known data errors
stat#
Итак, у нас есть 2 винта, которые работают в зеркале. Мы зарезервировались, всё хорошо

Выводим обычный диск из работы
Сейчас у нас в массиве 2 диска, причём один обычный, а второй на gpt разделе. Хочется привести это как-то к общему знаменателю, и наверное предпостение отдадим более прогрессивным технологиям - то есть gpt оставим.
Выводим из работы наш обычный винт

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

zpool detach rootFS ada0
Проверяем

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

stat# zpool status
  pool: rootFS
 state: ONLINE
  scan: resilvered 357G in 1h52m with 0 errors on Thu Apr 10 13:35:35 2014
config:

	NAME         STATE     READ WRITE CKSUM
	rootFS       ONLINE       0     0     0
	  gpt/disk0  ONLINE       0     0     0

errors: No known data errors
stat#
Отлично. Выключаем сервер, вынимаем первый диск и ложим его в закрома родины. на его место переставляем второй винт. Включаем, загружаемся. Всё хорошо.

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

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

Apr 11 12:34:08 stat kernel: ada1 at ahcich1 bus 0 scbus2 target 0 lun 0
Apr 11 12:34:08 stat kernel: ada1: <WDC WD5003ABYX-01WERA1 01.01S02> ATA-8 SATA 2.x device
Apr 11 12:34:08 stat kernel: ada1: Serial Number WD-WMAYP5387574
Apr 11 12:34:08 stat kernel: ada1: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)
Apr 11 12:34:08 stat kernel: ada1: Command Queueing enabled
Apr 11 12:34:08 stat kernel: ada1: 476940MB (976773168 512 byte sectors: 16H 63S/T 16383C)
Apr 11 12:34:08 stat kernel: ada1: Previously was known as ad6
Орудуем уже по известной схеме:
Смотрим что есть (я вам для разнообразия покажу уже размеченый ранее GPT диск)

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

stat# gpart show
=>       34  976773101  ada0  GPT  (465G)
         34        128     1  freebsd-boot  (64k)
        162  976772973     2  freebsd-zfs  (465G)

=>       34  976773101  ada1  GPT  (465G)
         34        128     1  freebsd-boot  (64k)
        162  976772973     2  freebsd-zfs  (465G)

stat#
Итак, у нас 2 раздела - удаляем

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

stat# gpart delete -i 1 ada1
ada1p1 deleted
stat# gpart delete -i 2 ada1
ada1p2 deleted
stat#
Ну а теперь добавляем как и раньше, только disk1 теперь это назовём, так как /dev/gpt/disk0 у нас уже есть

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

stat# gpart create -s gpt ada1
gpart: geom 'ada1': File exists
stat# gpart add -b 34 -s 64k -t freebsd-boot ada1
ada1p1 added
stat# gpart add -t freebsd-zfs -l disk1 ada1
ada1p2 added
stat# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
bootcode written to ada1
stat#
ну видим что он ругнулся что GPT раздел уже есть. Ну это я привёл что бы не забыть, как говорится лучше перестраховаться )))
Теперь вводим этот новый диск в массив

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

zpool attach rootFS /dev/gpt/disk0 /dev/gpt/disk1
он долго думает и перескакивает на следующую строчку. Давайте посмотрим что у нас получилось

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

stat# zpool status
  pool: rootFS
 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 Fri Apr 11 14:14:37 2014
        6.19G scanned out of 357G at 32.5M/s, 3h3m to go
        6.19G resilvered, 1.74% done
config:

	NAME           STATE     READ WRITE CKSUM
	rootFS         ONLINE       0     0     0
	  mirror-0     ONLINE       0     0     0
	    gpt/disk0  ONLINE       0     0     0
	    gpt/disk1  ONLINE       0     0     0  (resilvering)

errors: No known data errors
stat#
Что мы тут видим?
1) у нас в массиве 2 диска
2) они оба имеют gpt разметку
3) на второй диск синхронизируются данные (resilvering)
4) статус синхранизации 1.74%
Ждум завершения работы, но уже можно начинать радоваться :-)

Итог:
Результатом этой статьи стало:
1) мы переехали на более современную и менее чувствительную к внезапным выключениям файловую систему ZFS
2) мы собрали много разных разделов разделов в один (помните у нас заканчивалось место когда мы ядро обновляли)
3) ма переехали на более современную разметку GPT

Отдельно о разметке

Добавлено: 30 апр 2014, 10:07
RomA
Имей в виду что если состояние райда будет DEGRADE и вы перезагрузитесь - то система больше не загрузится. Как выйти из такой ситуации - описание ниже.


В предыдущей статье мы размечали диски, но это весьма нетривиальная, а главное ответственная часть, потому я отдельно остановлюсь на этом моменте.
Давайте я рассмотрю реальную ситуацию, что бы ничего не упустить. Поехали:
Есть уже рабочая фря. У меня она, как понятно из предыдущего поста уже переведена на zfs.
stat# gpart show
=> 34 976773101 ada0 GPT (465G)
34 128 1 freebsd-boot (64k)
162 976772973 2 freebsd-zfs (465G)

=> 34 976773101 ada1 GPT (465G)
34 128 1 freebsd-boot (64k)
162 976772973 2 freebsd-zfs (465G)
Но у всех нас есть зеркало с бекапом, ну или просто новый винт. Я вставил просто новый винт от компа, что бы пока не губить копию с бекапом - вот он последний

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

stat# gpart show
=>       34  976773101  ada0  GPT  (465G)
         34        128     1  freebsd-boot  (64k)
        162  976772973     2  freebsd-zfs  (465G)

=>       34  976773101  ada1  GPT  (465G)
         34        128     1  freebsd-boot  (64k)
        162  976772973     2  freebsd-zfs  (465G)

=>       63  976773105  ada2  MBR  (465G)
         63  976773105        - free -  (465G)

Итак, первое отличие - это диск не gps, о чём нам говорит надпись MBR и в чём легко убедиться

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

stat# ls /dev/gpt/
disk0	
disk1
То есть система видит 3 диска, но gpt всего 2 из них. Ну что же - разметим наш новый диск так же, как размечали предыдущие.

Переразметка

Но сначало надо его очистить, что ли - приступим

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

stat# gpart destroy ada2
ada2 destroyed
хорошо, теперь создаёт GPT разметку

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

stat# gpart create -s gpt ada2
ada2 created
Иногда, например на FreeNAS, можно увидеть такое сообщение

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

gpart: geom 'ada2': Operation not permitted
Решением будет

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

sysctl kern.geom.debugflags=16

Создание разделов

Выделим загрузочную область

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

stat# gpart add -b 34 -s 64k -t freebsd-boot ada2
ada2p1 added
Теперь определим область под данные

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

stat# gpart add -t freebsd-zfs -l disk2 ada2
ada2p2 added
Проверка

Посмотрим что же получилось
stat# gpart show
=> 34 976773101 ada0 GPT (465G)
34 128 1 freebsd-boot (64k)
162 976772973 2 freebsd-zfs (465G)

=> 34 976773101 ada1 GPT (465G)
34 128 1 freebsd-boot (64k)
162 976772973 2 freebsd-zfs (465G)

=> 34 976773101 ada2 GPT (465G)
34 128 1 freebsd-boot (64k)
162 976772973 2 freebsd-zfs (465G)
Записываем данные на диск

Итак, РАЗМЕЧЕН наш диск точно так же как и остальные, но помним, что он всё ещё пустой.
Подёйм по порядку - сначало запишем загрузчик, ибо забыть не сложно, а проблем будет много

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

stat# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada2
bootcode written to ada2
Вот! Теперь наш диск полностью готов заменить собой любой вышедшей из строя диск в том массиве, который сейчас работает.

Сейчас у нас это выглядит вот так:
stat# zpool status
pool: rootFS
state: ONLINE
scan: resilvered 357G in 4h6m with 0 errors on Fri Apr 11 18:21:23 2014
config:

NAME STATE READ WRITE CKSUM
rootFS ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
gpt/disk0 ONLINE 0 0 0
gpt/disk1 ONLINE 0 0 0

errors: No known data errors
Наверное мне этого достаточно, но хочется больше резервирования, а главное меньше ручной работы. Итак, у меня есть работающее зеркало, у меня есть третий диск и у меня есть несколько вариантов:
1) тягать руками - скучно - мы это уже делали
2) изменить массив на другой тип райда - нет смысла - много не выиграю, а диск у меня не серверный - просто с компа - быстро убьётся
3) Оставить его как запасной - а что, хорошая идея

Итак, я остановился на третьем варианте - будет делать диск горяей замены для нашего массива

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

stat# zpool add rootFS spare /dev/gpt/disk2
Посмотрим как это выглядит
stat# zpool status rootFS
pool: rootFS
state: ONLINE
scan: resilvered 357G in 4h6m with 0 errors on Fri Apr 11 18:21:23 2014
config:

NAME STATE READ WRITE CKSUM
rootFS ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
gpt/disk0 ONLINE 0 0 0
gpt/disk1 ONLINE 0 0 0
spares
gpt/disk2 AVAIL

errors: No known data errors
stat#
Ух ты, прикольно

Эксперементы:

Начнём с самого простого - подойдём к серверу и дёргним один винт - вот просто так, без предварительной подготовки
May 6 10:03:50 stat kernel: ada1 at ahcich1 bus 0 scbus2 target 0 lun 0
May 6 10:03:50 stat kernel: ada1: <WDC WD5003ABYX-01WERA1 01.01S02> s/n WD-WMAYP5387574 detached
May 6 10:03:50 stat kernel: (ada1:ahcich1:0:0:0): Periph destroyed
Посмотрим что показывает наш статус

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

stat# zpool status
  pool: rootFS
 state: DEGRADED
status: One or more devices has been removed 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'.
  scan: resilvered 357G in 4h6m with 0 errors on Fri Apr 11 18:21:23 2014
config:

	NAME                      STATE     READ WRITE CKSUM
	rootFS                    DEGRADED     0     0     0
	  mirror-0                DEGRADED     0     0     0
	    gpt/disk0             ONLINE       0     0     0
	    16896363125158605720  REMOVED      0     0     0  was /dev/gpt/disk1
	spares
	  gpt/disk2               AVAIL   

errors: No known data errors
Диск пропал, мы видим какой именно но всё продолжает работать и это очень хорошо, потому что раньше система более трепетно относилась к выдиранию дисков на живую.

Вставим винт обратно
May 6 10:05:42 stat kernel: ada1 at ahcich1 bus 0 scbus2 target 0 lun 0
May 6 10:05:42 stat kernel: ada1: <WDC WD5003ABYX-01WERA1 01.01S02> ATA-8 SATA 2.x device
May 6 10:05:42 stat kernel: ada1: Serial Number WD-WMAYP5387574
May 6 10:05:42 stat kernel: ada1: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)
May 6 10:05:42 stat kernel: ada1: Command Queueing enabled
May 6 10:05:42 stat kernel: ada1: 476940MB (976773168 512 byte sectors: 16H 63S/T 16383C)
May 6 10:05:42 stat kernel: ada1: Previously was known as ad6
Посмотрим статус

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

stat# zpool status
  pool: rootFS
 state: DEGRADED
status: One or more devices has been removed 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'.
  scan: resilvered 357G in 4h6m with 0 errors on Fri Apr 11 18:21:23 2014
config:

	NAME                      STATE     READ WRITE CKSUM
	rootFS                    DEGRADED     0     0     0
	  mirror-0                DEGRADED     0     0     0
	    gpt/disk0             ONLINE       0     0     0
	    16896363125158605720  REMOVED      0     0     0  was /dev/gpt/disk1
	spares
	  gpt/disk2               AVAIL   

errors: No known data errors

Всё ещё ждём волшебного пинка ) Пнём )

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

stat# zpool online rootFS /dev/gpt/disk1
Посмотрим что получилось
stat# zpool status
pool: rootFS
state: ONLINE
scan: resilvered 54.1M in 0h0m with 0 errors on Tue May 6 17:45:12 2014
config:

NAME STATE READ WRITE CKSUM
rootFS ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
gpt/disk0 ONLINE 0 0 0
gpt/disk1 ONLINE 0 0 0
spares
gpt/disk2 AVAIL

errors: No known data errors
Гм.. даже синхрить не начал. наверное всё хорошо ))) Хотя не верится
Ну ладно. В жизни такое наврятли пригодится, давайте решать более насущные задачи.
Раньше мы переодически вынимали диски, что бы менять их - вот эту ситуацию и отработаем - заменим второй диск на третий

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

stat# zpool replace rootFS /dev/gpt/disk1 /dev/gpt/disk2
посмотрим
stat# zpool status
pool: rootFS
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 May 7 10:09:04 2014
109M scanned out of 341G at 15.6M/s, 6h12m to go
108M resilvered, 0.03% done
config:

NAME STATE READ WRITE CKSUM
rootFS ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
gpt/disk0 ONLINE 0 0 0
spare-1 ONLINE 0 0 0
gpt/disk1 ONLINE 0 0 0
gpt/disk2 ONLINE 0 0 0 (resilvering)
spares
7367913673766876007 INUSE was /dev/gpt/disk2

errors: No known data errors
через время
stat# zpool status
pool: rootFS
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 May 7 10:09:04 2014
58.1G scanned out of 341G at 91.2M/s, 0h52m to go
58.1G resilvered, 17.03% done
config:

NAME STATE READ WRITE CKSUM
rootFS ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
gpt/disk0 ONLINE 0 0 0
spare-1 ONLINE 0 0 0
gpt/disk1 ONLINE 0 0 0
gpt/disk2 ONLINE 0 0 0 (resilvering)
spares
7367913673766876007 INUSE was /dev/gpt/disk2

errors: No known data errors
Ну что же - синхроназиция идёт - вроде как всё хорошо )))
И вот синхронизация закончилась
stat# zpool status
pool: rootFS
state: ONLINE
scan: resilvered 341G in 1h11m with 0 errors on Wed May 7 11:20:05 2014
config:

NAME STATE READ WRITE CKSUM
rootFS ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
gpt/disk0 ONLINE 0 0 0
spare-1 ONLINE 0 0 0
gpt/disk1 ONLINE 0 0 0
gpt/disk2 ONLINE 0 0 0
spares
7367913673766876007 INUSE was /dev/gpt/disk2

errors: No known data errors
Хорошо, теперь давайте посмотрим какие параметры (пока ещё по умолчанию) у нас установлены
stat# zpool get all rootFS
NAME PROPERTY VALUE SOURCE
rootFS size 464G -
rootFS capacity 73% -
rootFS altroot - default
rootFS health DEGRADED -
rootFS guid 4084258006322548582 default
rootFS version - default
rootFS bootfs - default
rootFS delegation on default
rootFS autoreplace off default
rootFS cachefile - default
rootFS failmode wait default
rootFS listsnapshots off default
rootFS autoexpand off default
rootFS dedupditto 0 default
rootFS dedupratio 1.00x -
rootFS free 123G -
rootFS allocated 341G -
rootFS readonly off -
rootFS comment - default
rootFS expandsize 0 -
rootFS freeing 0 default
rootFS feature@async_destroy enabled local
rootFS feature@empty_bpobj enabled local
rootFS feature@lz4_compress enabled local
В глаза бросается autoreplace - теперь понятно почему диск ждал пинка:
Управляет автоматической заменой устройств. Если свойство отключено, замена устройства должна инициироваться администратором с помощью команды zpool replace. Если свойство включено, все новые устройства, обнаруженные в том же физическом расположении, что и устройство, ранее принадлежавшее пулу, автоматически форматируются и заменяются. Настройка по умолчанию – off. На это свойство можно также ссылаться с помощью сокращенного имени столбца replace.

Включим

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

stat# zpool set autoreplace=on rootFS
и проверим
stat# zpool get all rootFS
NAME PROPERTY VALUE SOURCE
rootFS size 464G -
rootFS capacity 73% -
rootFS altroot - default
rootFS health DEGRADED -
rootFS guid 4084258006322548582 default
rootFS version - default
rootFS bootfs - default
rootFS delegation on default
rootFS autoreplace on local
rootFS cachefile - default
rootFS failmode wait default
rootFS listsnapshots off default
rootFS autoexpand off default
rootFS dedupditto 0 default
rootFS dedupratio 1.00x -
rootFS free 123G -
rootFS allocated 341G -
rootFS readonly off -
rootFS comment - default
rootFS expandsize 0 -
rootFS freeing 0 default
rootFS feature@async_destroy enabled local
rootFS feature@empty_bpobj enabled local
rootFS feature@lz4_compress enabled local
Получилось! ну что - подёргаем опять винты? )))

Если наша система не загрузилась...

Добавлено: 12 май 2014, 11:36
RomA
В ходе практических эксперементов на устойчивость своей новой файловой системы я столкнулся с рядом неприятностей, о решении которых расскажу под этим заголовком.

Система не загружается
Однажды я перезагрузил сервер, предварительно выдергнув один жёский диск, который решил отложить про запас. Выдергнул я его физически, корректно не извлекал, естественно состояние райда у меня было DEGRADE - с таким состояние сервер и был перезагружен.
Я очень удивился, что сервер не загрузился. Консоль меня радовала вот таким сообщением:
IMG_1806.jpg
IMG_1806.jpg (1.07 МБ) 10054 просмотра
Как выяснилось это означает что всё хорошо, просто сервер не хочет загружаться с развалившегося райд. Давайте его починим:
1) Cкачиваем загрузочный диск FreeBSD (я использовал 10 версию) и записываем его
2) Загружаем сервер с этого диска. Ничегно не трогаем
3) Когда всё загрузится - у вас появится меню из 3х пунктов - первый Install последний Live CD - выбираем последний
4) Появится приглашение ввести логин - вводи root пароль не требует
5) Подключаем наш сломаный пул

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

zpool import -f rootFS

Тут могут быть вариации - например если в пуле указана точка монтирования - то он сам туда примонтируется. С одной стороны пофиг, но если точка монтирования будет / (корень) то дальше команды работать не будут, что грустно для нас, потому такой пул следует монтировать с явным указание куда, например так

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

zpool import -f -R /mnt rootFS
а ещё иногда система может не видеть пул (правда это уже совсем плохо) тогда можно указать где именно находится интересующая нас файловая система

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

zpool import -f -R /mnt -d /dev/gpt/disk0 rootFS
В любом случае для перехода к следующему действию следует имортировать пул
6) Теперь надо сделать так, что бы пул сменил статус с DEGRADE на ONLINE - самый простой способ - удалить лищнии диски, если это позволяет выбранный райд. Как помним у нас зеркало, потому я просто удалил из зеркала второй и запасной винты

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

zpool delete rootFS /dev/gpt/disk1
zpool delete rootFS /dev/gpt/disk1
После чего zpool status показал состояние ONLINE
7) Ну теперь осталось только перезагрузиться. После перезагрузки у меня загрузилась фря и я опять, уже известными способами, добавил диски в массив