При эксплуатации компьютерной техники со временем ко многим приходит понимание, что устройства хранения данных (HDD, SSD и др.) не вечны. А потеря данных при выходе из строя таких устройств бывает критична не только для серверов, но и для пользователей обычных рабочих станций. Есть множество способов защиты от потери данных. Рассмотрим один из них – создание программного зеркального массива. Причем создавать массив будем на уже работающей системе. Для создания такого массива требуется сначала физически подключить дополнительный накопитель, равный по объему с тем накопителем, который необходимо зеркалировать (желательно и того же изготовителя).
Создание RAID 1 для файловой системы UFS2:
Дальнейшие действия применимы к системе Ульяновск.BSD, установленной с помощью инсталлятора (используется таблица разделов GPT), выбранной при установке файловой системе Unix (UFS2) и метки корневого раздела root (по умолчанию). Если при установке для корневого раздела была задана другая метка, то необходимо об этом помнить, выполняя дальнейшие действия.
Необходимо загрузиться с установочного DVD или USB диска и выбрать «Выход в командную строку»:

Просматриваем информацию об имеющихся в системе накопителях и разделах на них:
gpart show

Нас будет интересовать накопитель ada0. Это накопитель, разделы которого надо зеркалировать. Просматриваем список всех доступных в системе накопителей:
sysctl -a | grep kern.disks

Из полученного списка определяем, что новый накопитель имеет имя ada1. Переносим таблицу разделов с накопителя ada0 на накопитель ada1. Также назначаем метки разделам на накопителе ada1 такие же как на накопителе ada0 (необязательно):
gpart backup ada0 | gpart restore -F /dev/ada1
gpart modify -i 1 -l boot ada1
gpart modify -i 2 -l efi ada1
gpart modify -i 3 -l root ada1
gpart modify -i 4 -l swap ada1

Добавляем в раздел загрузки на новый накопитель загрузочную информацию:
gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 ada1

Создаем зеркала каждого из разделов на базе накопителя ada0:
gmirror label -vb round-robin boot /dev/ada0p1
gmirror label -vb round-robin efi /dev/ada0p2
gmirror label -vb round-robin root /dev/ada0p3
gmirror label -vb round-robin swap /dev/ada0p4

Загружаем gmirror и смотрим состояние:
gmirror load
gmirror status

Далее необходимо изменить /etc/fstab. Для этого монтируем корневой раздел, делаем резервную копию /etc/fstab и редактируем оригинал с помощью редактора ee:
mount -rw /dev/mirror/root /mnt
cp /mnt/etc/fstab /mnt/etc/fstab.orig
ee /mnt/etc/fstab

Вместо /dev/gpt/root и /dev/gpt/swap необходимо указать /dev/mirror/root и /dev/mirror/swap соответственно. Файл /etc/fstab должен приобрести следующий вид:

Добавляем загрузку модуля geom_mirror в /boot/loader.conf:
sysrc -f /mnt/boot/loader.conf geom_mirror_load="YES"

Отмонтируем корневую файловую систему и выходим из режима командной строки:
umount /mnt
exit

Перезагружаем машину:

Отключаем загрузку с установочного DVD или USB диска и загружаемся в обычном режиме. В терминале с правами root (Администратора) добавляем в зеркала разделов соответствующие разделы нового накопителя и проверяем состояние синхронизации:
gmirror insert boot /dev/ada1p1
gmirror insert efi /dev/ada1p2
gmirror insert root /dev/ada1p3
gmirror insert swap /dev/ada1p4
gmirror status

Теперь разделы внутри зеркал будут автоматически синхронизироваться. В случае выхода из строя одного из накопителей система будет продолжать работать.
Подробнее о зеркалировании с помощью geom_mirror можно узнать в Handbook п. 18.3.
Создание RAID-Z для файловой системы ZFS:
Дальнейшие действия применимы к системе Ульяновск.BSD, установленной с помощью инсталлятора (используется таблица разделов GPT), выбранной при установке файловой системе Zettabyte (ZFS) и имени пула ZFS root (по умолчанию). Если при установке для пула ZFS было задано другое имя, то необходимо об этом помнить, выполняя дальнейшие действия.
Зеркалирование накопителей с разделами ZFS немного сложнее. Раздел с файловой системой ZFS будем зеркалировать средствами ZFS, создав массив RAID-Z, а остальные разделы будем зеркалировать средствами geom_mirror.
Необходимо загрузиться с установочного DVD или USB диска и выбрать «Выход в командную строку»:

Просматриваем информацию об имеющихся в системе накопителях и разделах на них:
gpart show

Нас будет интересовать накопитель ada0. Это накопитель, разделы которого надо зеркалировать. Просматриваем список всех доступных в системе накопителей:
sysctl -a | grep kern.disks

Из полученного списка определяем, что новый накопитель имеет имя ada1. Переносим таблицу разделов с накопителя ada0 на накопитель ada1. Также назначаем метки разделам на накопителе ada1 такие же как на накопителе ada0 (необязательно):
gpart backup ada0 | gpart restore -F /dev/ada1
gpart modify -i 1 -l boot ada1
gpart modify -i 2 -l efi ada1
gpart modify -i 3 -l root ada1
gpart modify -i 4 -l swap ada1

Добавляем в раздел загрузки на новый накопитель загрузочную информацию:
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1

Создаем зеркала каждого из разделов (кроме раздела с ZFS) на базе накопителя ada0:
gmirror label -vb round-robin boot /dev/ada0p1
gmirror label -vb round-robin efi /dev/ada0p2
gmirror label -vb round-robin swap /dev/ada0p4

Загружаем gmirror и смотрим состояние:
gmirror load
gmirror status

Выходим из режима командной строки и перезагружаем машину:
exit

Отключаем загрузку с установочного DVD или USB диска и загружаемся в обычном режиме. В терминале с правами root (Администратора) делаем резервную копию /etc/fstab и редактируем оригинал с помощью редактора ee:
cp /etc/fstab /etc/fstab.orig
ee /etc/fstab
Вместо /dev/gpt/swap необходимо указать /dev/mirror/swap. Файл /etc/fstab должен приобрести следующий вид:

Добавляем загрузку модуля geom_mirror в /boot/loader.conf и перезагружаем машину:
sysrc -f /boot/loader.conf geom_mirror_load="YES"
После перезагрузки в терминале с правами root (Администратора) добавляем в зеркала разделов (кроме раздела с ZFS) соответствующие разделы нового накопителя и проверяем состояние синхронизации:
gmirror insert boot /dev/ada1p1
gmirror insert efi /dev/ada1p2
gmirror insert swap /dev/ada1p4
gmirror status

И наконец, создаем RAID-Z из разделов с файловой системой ZFS и проверяем состояние синхронизации:
zpool attach root gpt/root ada1p3
zpool status

Теперь разделы внутри зеркал будут автоматически синхронизироваться. В случае выхода из строя одного из накопителей система будет продолжать работать.
Подробнее о зеркалировании с помощью geom_mirror можно узнать в соответствующем разделе Handbook, а о зеркалировании средствами ZFS в другом разделе Handbook.