понедельник, 9 ноября 2015 г.

Замена ZFS диска во FreeBSD 10 на массиве RAID-Z

Для проведения этого теста, я использовал самую обычную инсталляцию FreeBSD 10, с разбивкой по умолчанию. В моей системе использовалось 6 дисков, объединённых в RAID-Z.

Установщик по-умолчанию, сделал мне следующий вариант разметки:
[root@zdata ~]# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
zroot                 5,93G  31,0G   153K  /zroot
zroot/ROOT             915M  31,0G   153K  none
zroot/ROOT/default     915M  31,0G   915M  /
zroot/tmp              179K  31,0G   179K  /tmp
zroot/usr             5,03G  31,0G   153K  /usr
zroot/usr/home        2,17G  31,0G   248M  /usr/home
zroot/usr/ports       2,85G  31,0G  2,85G  /usr/ports
zroot/usr/src          153K  31,0G   153K  /usr/src
zroot/var             1,30M  31,0G   153K  /var
zroot/var/audit        153K  31,0G   153K  /var/audit
zroot/var/crash        153K  31,0G   153K  /var/crash
zroot/var/log          524K  31,0G   524K  /var/log
zroot/var/mail         192K  31,0G   192K  /var/mail
zroot/var/tmp          153K  31,0G   153K  /var/tmp
В этой статье я попробую с эмитировать выход из строя самого первого диска, с которого обычно по умолчанию BIOS читает загрузочный сектор и начинает загрузку, т.е. получится, что вставив новый диск в замен вышедшего из строя, система без дополнительных манипуляций у нас грузится не будет.

В нормальном состоянии

Список дисков и разделов:
[root@zdata ~]# ls /dev/ | grep da
da0
da0p1
da0p2
da0p3
da1
da1p1
da1p2
da1p3
da2
da2p1
da2p2
da2p3
da3
da3p1
da3p2
da3p3
da4
da4p1
da4p2
da4p3
da5
da5p1
da5p2
da5p3
Статус пула ZFS:
[root@zdata ~]# zpool status
  pool: zroot
 state: ONLINE
  scan: resilvered 1,24G in 0h2m with 0 errors on Sat Oct 24 15:52:02 2015
config:

        NAME          STATE     READ WRITE CKSUM
        zroot         ONLINE       0     0     0
          raidz1-0    ONLINE       0     0     0
            gpt/zfs0  ONLINE       0     0     0
            gpt/zfs1  ONLINE       0     0     0
            gpt/zfs2  ONLINE       0     0     0
            gpt/zfs3  ONLINE       0     0     0
            gpt/zfs4  ONLINE       0     0     0
            gpt/zfs5  ONLINE       0     0     0

errors: No known data errors

После сбоя

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

Если BIOS настроен на загрузку с этого диска, то меняем приоритет загрузки в BIOS.
 
И запускаем систему
 
Теперь, если посмотреть список дисков и разделов, то чётко видно, что da0 чист:
[root@zdata ~]# ls /dev/ | grep da
da0
da1
da1p1
da1p2
da1p3
da2
da2p1
da2p2
da2p3
da3
da3p1
da3p2
da3p3
da4
da4p1
da4p2
da4p3
da5
da5p1
da5p2
da5p3
Проверяем статус пулов:
[root@zdata ~]# zpool status -v
  pool: zroot
 state: DEGRADED
status: One or more devices could not be opened.  Sufficient replicas exist for
        the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://illumos.org/msg/ZFS-8000-2Q
  scan: resilvered 1,24G in 0h2m with 0 errors on Sat Oct 24 15:52:02 2015
config:

        NAME                     STATE     READ WRITE CKSUM
        zroot                    DEGRADED     0     0     0
          raidz1-0               DEGRADED     0     0     0
            9164267241595705440  UNAVAIL      0     0     0  was /dev/gpt/zfs0
            gpt/zfs1             ONLINE       0     0     0
            gpt/zfs2             ONLINE       0     0     0
            gpt/zfs3             ONLINE       0     0     0
            gpt/zfs4             ONLINE       0     0     0
            gpt/zfs5             ONLINE       0     0     0

errors: No known data errors
Видим, что диск в состоянии UNAVAIL, массив raidz1-0 DEGRADED и пул zroot так же DEGRADED.

Подготовка нового диска

Теперь необходимо скопировать разметку с любого из рабочих дисков с помощью gpart, например с диска da1:
[root@zdata ~]# gpart backup da1
GPT 128
1   freebsd-boot       40     1024 gptboot1
2   freebsd-swap     2048  4194304 swap1
3    freebsd-zfs  4196352 16773120 zfs1
Копируем:
[root@zdata ~]# gpart backup da1 | gpart restore -F da0
И проверяем результат:
[root@zdata ~]# ls /dev/ | grep da
da0
da0p1
da0p2
da0p3
da1
da1p1
da1p2
da1p3
da2
da2p1
da2p2
da2p3
da3
da3p1
da3p2
da3p3
da4
da4p1
da4p2
da4p3
da5
da5p1
da5p2
da5p3
Изменяем метку загрузочного тома:
[root@zdata ~]# gpart modify -i 1 -l gptboot0 da0
Изменяем метку основного тома:
[root@zdata ~]# gpart modify -i 3 -l zfs0 da0
Смотрим информацию по дискам:
[root@zdata ~]# gpart list | grep label
   label: gptboot1
   label: swap1
   label: zfs1
   label: gptboot2
   label: swap2
   label: zfs2
   label: gptboot3
   label: swap3
   label: zfs3
   label: gptboot4
   label: swap4
   label: zfs4
   label: gptboot5
   label: swap5
   label: zfs5
   label: gptboot0
   label: swap0
   label: zfs0
Теперь необходимые нам разделы на da0 присутствуют, но к сожалению в /dev/gpt/ метки дисков отсутствуют, т.к. они появляются только при создании дисков или в процессе загрузки системы.
[root@zdata ~]# ls /dev/gpt/
gptboot1        gptboot4        zfs2            zfs5
gptboot2        gptboot5        zfs3
gptboot3        zfs1            zfs4
Заставляем систему перечитать диск:
[root@zdata ~]# true > /dev/da0
Смотрим, что у нас появились gptboot0 и zfs0:
[root@zdata ~]# ls /dev/gpt/
gptboot0        gptboot3        zfs0            zfs3
gptboot1        gptboot4        zfs1            zfs4
gptboot2        gptboot5        zfs2            zfs5

Замена диска в пуле

Смотрим идентификатор выпавшего диска в пуле:
[root@zdata ~]# zpool status
  pool: zroot
 state: DEGRADED
status: One or more devices could not be opened.  Sufficient replicas exist for
        the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://illumos.org/msg/ZFS-8000-2Q
  scan: resilvered 1,24G in 0h2m with 0 errors on Sun Nov  8 21:03:23 2015
config:

        NAME                      STATE     READ WRITE CKSUM
        zroot                     DEGRADED     0     0     0
          raidz1-0                DEGRADED     0     0     0
            10165075366045259399  UNAVAIL      0     0     0  was /dev/gpt/zfs0
            gpt/zfs1              ONLINE       0     0     0
            gpt/zfs2              ONLINE       0     0     0
            gpt/zfs3              ONLINE       0     0     0
            gpt/zfs4              ONLINE       0     0     0
            gpt/zfs5              ONLINE       0     0     0

errors: No known data errors
Он у нас 10165075366045259399.

Заменяем диск в ZFS командой zpool replace:
[root@zdata ~]# zpool replace -f zroot 10165075366045259399 gpt/zfs0
Make sure to wait until resilver is done before rebooting.

If you boot from pool 'zroot', you may need to update
boot code on newly attached disk 'gpt/zfs0'.

Assuming you use GPT partitioning and 'da0' is your new boot disk
you may use the following command:

        gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
Выполняем рекомендованную нам команду по установке загрузчика на диск:
[root@zdata ~]# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
bootcode written to da0
Далее командой zpool status смотрим процесс пересборки массива:
[root@zdata ~]# zpool status
  pool: zroot
 state: DEGRADED
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 Sun Nov  8 21:50:01 2015
        4,11G scanned out of 7,42G at 50,0M/s, 0h1m to go
        701M resilvered, 55,33% done
config:

        NAME                        STATE     READ WRITE CKSUM
        zroot                       DEGRADED     0     0     0
          raidz1-0                  DEGRADED     0     0     0
            replacing-0             UNAVAIL      0     0     0
              10165075366045259399  UNAVAIL      0     0     0  was /dev/gpt/zfs0/old
              gpt/zfs0              ONLINE       0     0     0  (resilvering)
            gpt/zfs1                ONLINE       0     0     0
            gpt/zfs2                ONLINE       0     0     0
            gpt/zfs3                ONLINE       0     0     0
            gpt/zfs4                ONLINE       0     0     0
            gpt/zfs5                ONLINE       0     0     0

errors: No known data errors
По окночанию пересборки эта же команда zpool status, покажет что всё хорошо, все диски и дисковые пулы ONLINE:
[root@zdata ~]# zpool status
  pool: zroot
 state: ONLINE
  scan: resilvered 1,24G in 0h2m with 0 errors on Sun Nov  8 21:52:36 2015
config:

        NAME          STATE     READ WRITE CKSUM
        zroot         ONLINE       0     0     0
          raidz1-0    ONLINE       0     0     0
            gpt/zfs0  ONLINE       0     0     0
            gpt/zfs1  ONLINE       0     0     0
            gpt/zfs2  ONLINE       0     0     0
            gpt/zfs3  ONLINE       0     0     0
            gpt/zfs4  ONLINE       0     0     0
            gpt/zfs5  ONLINE       0     0     0

errors: No known data errors
Перезагружаемся. Возвращаемся в BIOS и выставляем параметры загрузки обратно.

Комментариев нет:

Отправить комментарий