FreeBSD: zfs замена диска в zpool raidz
FreeBSD: zfs замена диска в zpool raidz
Дано FreeBSD с raidz1-0 и 5 дисков в пуле
ada0 — тупо системный диск
Имитируем сбой и замену, выполнял на виртуалбоксе
Диски в виртуалбоксе приняли имена ada4
Имя пула дал — zroot
# zpool status
pool: zroot
state: ONLINE
scan: resilvered 48K in 0 days 00:00:00 with 0 errors on Tue Dec 10 16:37:18 2019
config:
NAME STATE READ WRITE CKSUM
zroot ONLINE 0 0 0
ada0p2 ONLINE 0 0 0
raidz1-1 ONLINE 0 0 0
ada1 ONLINE 0 0 0
ada2 ONLINE 0 0 0
ada3 ONLINE 0 0 0
ada4 ONLINE 0 0 0
ada5 ONLINE 0 0 0
Далее «выключаем один диск на горячую» — ada3 (удалили устройство в virtualbox):
# zpool status
pool: zroot
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 48K in 0 days 00:00:00 with 0 errors on Tue Dec 10 16:37:18 2019
config:
NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
ada0p2 ONLINE 0 0 0
raidz1-1 DEGRADED 0 0 0
ada1 ONLINE 0 0 0
ada2 ONLINE 0 0 0
16473938204542825896 REMOVED 0 0 0 was /dev/ada3
ada4 ONLINE 0 0 0
ada5 ONLINE 0 0 0
errors: No known data errors
# ls /dev/ad*
/dev/ada0 /dev/ada0p2 /dev/ada2 /dev/ada4
/dev/ada0p1 /dev/ada1 /dev/ada5
Поключили диск обратно (добавили существующий в virtualbox) Он автоматом определился:
# ls /dev/ad*
/dev/ada0 /dev/ada0p2 /dev/ada2 /dev/ada4
/dev/ada0p1 /dev/ada1 /dev/ada3 /dev/ada5
Момент по поводу разметки, проще всего ее создать на новом диске по аналогии с каким-либо:
# gpart backup ada2
# gpart backup ada2 | gpart restore -F ada3
Перезагрузимся, диск автоматом станет на место:
# shutdown -r now
# zpool status
pool: zroot
state: ONLINE
status: One or more devices has experienced an unrecoverable error. An
attempt was made to correct the error. Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
using ‘zpool clear’ or replace the device with ‘zpool replace’.
see: http://illumos.org/msg/ZFS-8000-9P
scan: resilvered 8K in 0 days 00:00:00 with 0 errors on Tue Dec 10 16:48:40 2019
config:
NAME STATE READ WRITE CKSUM
zroot ONLINE 0 0 0
ada0p2 ONLINE 0 0 0
raidz1-1 ONLINE 0 0 0
ada1 ONLINE 0 0 0
ada2 ONLINE 0 0 0
ada3 ONLINE 0 0 4
ada4 ONLINE 0 0 0
ada5 ONLINE 0 0 0
errors: No known data errors
Теперь некоторые команды, которые могут пригодиться при замене
Допустим диск умер, в корзине есть место, мы вставляем туда новый диск
В виртуалбосе убрали один диск, добавили новый
# zpool status
pool: zroot
state: DEGRADED
status: One or more devices has experienced an unrecoverable error. An
attempt was made to correct the error. Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
using ‘zpool clear’ or replace the device with ‘zpool replace’.
see: http://illumos.org/msg/ZFS-8000-9P
scan: resilvered 8K in 0 days 00:00:00 with 0 errors on Tue Dec 10 16:48:40 2019
config:
NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
ada0p2 ONLINE 0 0 0
raidz1-1 DEGRADED 0 0 0
ada1 ONLINE 0 0 0
7951700637655260405 REMOVED 0 0 0 was /dev/ada2
ada3 ONLINE 0 0 4
ada4 ONLINE 0 0 0
ada5 ONLINE 0 0 0
errors: No known data errors
Если диск умер, можно попробовать перевести его в offline:
# zpool offline zroot ada2
# zpool status
pool: zroot
state: DEGRADED
status: One or more devices has experienced an unrecoverable error. An
attempt was made to correct the error. Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
using ‘zpool clear’ or replace the device with ‘zpool replace’.
see: http://illumos.org/msg/ZFS-8000-9P
scan: resilvered 8K in 0 days 00:00:00 with 0 errors on Tue Dec 10 16:48:40 2019
config:
NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
ada0p2 ONLINE 0 0 0
raidz1-1 DEGRADED 0 0 0
ada1 ONLINE 0 0 0
7951700637655260405 OFFLINE 0 0 0 was /dev/ada2
ada3 ONLINE 0 0 4
ada4 ONLINE 0 0 0
ada5 ONLINE 0 0 0
errors: No known data errors
Делаем так, если заменяемый диск в автономном режиме:
# zpool replace zroot 7951700637655260405 ada2
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 ‘ada2’.
Assuming you use GPT partitioning and ‘ada0’ is your new boot disk
you may use the following command:
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
Последняя рекомендательная команда для установки загрузчика метки
Дополнительно могут понадобиться команды
Если не грузится система, загружаемся с LiveCD и делаем:
# zpool import -fa -R /mnt
Еще случай замены в RAID-Z с перезагрузкой, найденный на просторах интернета
Сжато и отформатировано
Список дисков и разделов:
# ls /dev/ad*
ada0 ada0p1 ada0p2 ada0p3
ada1 ada1p1 ada1p2 ada1p3
ada2 ada2p1 ada2p2 ada2p3
ada3 ada3p1 ada3p2 ada3p3
ada4 ada4p1 ada4p2 ada4p3
ada5 ada5p1 ada5p2 ada5p3
Статус пула ZFS:
# 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
После выхода из строя диска ada0, массив переходит в состояние DEGRADED, система перестаёт загружаться
1. Выключаем машину, вынимаем сбойный диск, заменяем его на новый
2. Если BIOS настроен на загрузку с этого диска, то меняем приоритет загрузки в BIOS
3. И запускаем систему
Теперь, если посмотреть список дисков и разделов, то чётко видно, что ada0 чист:
# ls /dev/ad*
ada0
ada1 ada1p1 ada1p2 ada1p3
ada2 ada2p1 ada2p2 ada2p3
ada3 ada3p1 ada3p2 ada3p3
ada4 ada4p1 ada4p2 ada4p3
ada5 ada5p1 ada5p2 ada5p3
# 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, например с диска ada1
# gpart backup ada1
GPT 128
1 freebsd-boot 40 1024 gptboot1
2 freebsd-swap 2048 4194304 swap1
3 freebsd-zfs 4196352 16773120 zfs1
Копируем:
# gpart backup ada1 | gpart restore -F ada0
И проверяем результат:
# ls /dev/ad*
ada0 ada0p1 ada0p2 ada0p3
ada1 ada1p1 ada1p2 ada1p3
ada2 ada2p1 ada2p2 ada2p3
ada3 ada3p1 ada3p2 ada3p3
ada4 ada4p1 ada4p2 ada4p3
ada5 ada5p1 ada5p2 ada5p3
Изменяем метку загрузочного тома:
# gpart modify -i 1 -l gptboot0 ada0
Изменяем метку основного тома:
# gpart modify -i 3 -l zfs0 ada0
Смотрим информацию по дискам:
# 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
Теперь необходимые нам разделы на ada0 присутствуют
В /dev/gpt/ метки дисков отсутствуют, т.к. они появляются:
1) при создании дисков
2) в процессе загрузки ос
# ls /dev/gpt/
gptboot1 gptboot4 zfs2 zfs5
gptboot2 gptboot5 zfs3
gptboot3 zfs1 zfs4
Заставляем систему перечитать диск:
# true > /dev/ada0
Смотрим, что у нас появились gptboot0 и zfs0:
# ls /dev/gpt/
gptboot0 gptboot3 zfs0 zfs3
gptboot1 gptboot4 zfs1 zfs4
gptboot2 gptboot5 zfs2 zfs5
Замена диска в пуле
Смотрим идентификатор выпавшего диска в пуле:
# 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:
# 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 ‘ada0’ is your new boot disk
you may use the following command:
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
Выполняем рекомендованную нам команду по установке загрузчика на диск:
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
bootcode written to da0
Далее командой zpool status смотрим процесс пересборки массива:
# 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:
# 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 и выставляем параметры загрузки обратно
Источник
/4te.me
ZFS — это файловая система на стероидах. С помощью ZFS можно собрать подобие RAID-массивов, но с дополнительными функциями, которые могут быть полезны в хозяйстве. Здесь покажу как установить zfs и собрать аналог RAID-10 массива на примере Ubuntu 18.04
Установка zfs
Изначально ZFS была доступна только в Solaris, но с помощью модулей ядра можно установить и в Linux.
На последних версиях Ubuntu установка абсолютно элементарная:
Автоматически устанавливаются модули ядра, а также тулзы для создания разделов.
В терминах zfs — сначала создается pool из разделов или дисков, потом на этот pool накатывается файловая система. Все как и в случае с raid-ами.
Создание pool-а
Пока никаких пулов не создано:
Создаем пул из сырых дисков. Пул можно также создавать из разделов диска (/dev/sdb1, /dev/sdc2 etc.):
Смотрим созданные в системе пулы:
После создания пула, просиходит его автомаунт в /
Аналог RAID1 и RAID10
Выше мы создавали пул, аналогичный RAID0(stripe), без какого-либо резервирования данных. Если умрет хотя бы один диск из пула, то развалится весь пул. Чтобы повысить отказоустойчивость — создадим зеркалированный пул.
Вот так можно создать RAID1(mirror) с помощью zfs:
Создание RAID10 из шести (sdb, sdc, sdd, sde, sdf, sdg) дисков выглядит так:
Проверяем состояние пула
Проверить состояние всех пулов можно так:
Вот так выглядит zpool status когда умер один диск:
Как заменить диск в zfs пуле
Если случилась беда и умер один диск в пуле с резервированием, то его можно легко заменить. Процедура аналогична замене диска в RAID-массиве.
Вот пример из жизни когда в zfs-RAID10 массиве сломался один диск:
Здесь видим, что sdf приказал долго жить и требует замены. В данном случае — это железный сервер и пул построен на целых дисках. Находим нужный диск в железном сервере, и “на горячую” меняем старый диск на новый, такого же размера. В dmesg можно увидеть как определяется новый диск. В моем примере, я вынул /dev/sdf из сервера, вставил новый диск, и он определился в системе с таким же именем.
Теперь меняем диск в пуле. Мы говорим заменить диск, который именовался в пуле как sdf на диск, который в системе именуется /dev/sdf (так же как и старый):
Источник