Задача была проста, из двух стареньких винтов объемом 40 GB собрать зеркало дабы обезопасить себя от выхода из строя одного из них. Поскольку сперва было лениво изобретать велосипед, я начал с гугления. Это меня привело к хендбуку. Прочитав статью я решил испытать описанное в ней руководство на только что развернутом домашнем сервачке… Никогда не делайте это на реальных и нужных серверах :-) Сделав все по руководству я после перезагрузки сервера обнаружил мертвую файловую систему… Облом…

После этого было решено сделать все правильно, то есть с включенным мозгом. Итак, первым делом я попытался выяснить что пошло не так(ну кроме банального копи-паста). После не продолжительного ковыряния было выяснено, что после добавления в зеркало загрузочного диска была повреждена таблица разделов…

Ну это все было лирическое отступления :-) Вот как сделал я, в моей системе было три жестких диска.

root@hsrv:~ # dmesg | grep ^ada | grep -v lun | grep -v Previously
ada0: ATA-5 device ada0: 100.000MB/s transfers (UDMA5, PIO 8192bytes)
ada0: 38166MB (78165360 512 byte sectors: 16H 63S/T 16383C)
ada1: ATA-6 device ada1: 100.000MB/s transfers (UDMA5, PIO 8192bytes)
ada1: 38166MB (78165360 512 byte sectors: 16H 63S/T 16383C)
ada2: ATA-8 SATA 2.x device ada2: 150.000MB/s transfers (SATA, UDMA5, PIO 8192bytes)
ada2: 476940MB (976773168 512 byte sectors: 16H 63S/T 16383C)

Freebsd установлена на первый диск, это ada0, он же является и загрузочным. Что бы не повторить свою ошибку я решил сперва добавить в зеркало второй диск ada1.

Загрузим модуль /boot/kernel/geom_mirror.ko и откроем доступ к устройству.

root@hsrv:/mnt # gmirror load
root@hsrv:/mnt # sysctl kern.geom.debugflags=17

Теперь создаем зеркало и добавляем в него второй жесткий диск.

root@hsrv:/mnt # gmirror label -vb round-robin gm0 /dev/ada1
Metadata value stored on /dev/ada1.
Done.

Проверяем создался ли массив

root@hsrv:/mnt # ls /dev/mirror/gm0
root@hsrv:/mnt # gmirror status
Name Status Components
mirror/gm0 COMPLETE ada1 (ACTIVE)

Да, все отлично. Как видно с листинга, массив создан с именем gm0 и одним компонентом ada1. Теперь нужно воссоздать таблицу разделов аналогичную ada0, посмотрим какие:

root@hsrv:/mnt # gpart show
=> 34 78165293 ada0 GPT (37G)
34 128 1 freebsd-boot (64k)
162 4194176 2 freebsd-ufs (2G)
4194338 4194304 3 freebsd-swap (2.0G)
8388642 4194304 4 freebsd-ufs (2.0G)
12582946 4194304 5 freebsd-ufs (2.0G)
16777250 41943040 6 freebsd-ufs (20G)
58720290 19443712 7 freebsd-ufs (9.3G)
78164002 1325 - free - (662k)

Создаем таблицу разделов GPT

root@hsrv:~ # gpart create -s gpt /dev/mirror/gm0
mirror/gm0 created

Добавляем загрузочный раздел и записываем загрузчик.

root@hsrv:~ # gpart add -t freebsd-boot -s 64K -l boot mirror/gm0
mirror/gm0p1 added
root@hsrv:~ # gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 mirror/gm0
bootcode written to mirror/gm0

Добавляем остальные разделы.

root@hsrv:/mnt # gpart add -t freebsd-ufs -s 2G -l root mirror/gm0
mirror/gm0p2 added
root@hsrv:/mnt # gpart add -t freebsd-swap -s 2G -l swap mirror/gm0
mirror/gm0p3 added
root@hsrv:/mnt # gpart add -t freebsd-ufs -s 2G -l tmp mirror/gm0
mirror/gm0p4 added
root@hsrv:/mnt # gpart add -t freebsd-ufs -s 2G -l var mirror/gm0
mirror/gm0p5 added
root@hsrv:/mnt # gpart add -t freebsd-ufs -s 20G -l usr mirror/gm0
mirror/gm0p6 added
root@hsrv:/mnt # gpart add -t freebsd-ufs -l log mirror/gm0
mirror/gm0p7 added

Дальше воспользуемся newfs и создадим на только что добавленных разделах файловую систему.

root@hsrv:/mnt # newfs -U /dev/gpt/root 
/dev/gpt/root: 2048.0MB (4194304 sectors) block size 32768, fragment size 4096
using 4 cylinder groups of 512.03MB, 16385 blks, 65664 inodes.
with soft updatessuper-block backups (for fsck_ffs -b #) at: 192, 1048832, 2097472, 3146112
root@hsrv:/mnt # newfs -U /dev/gpt/usr
/dev/gpt/usr: 20480.0MB (41943040 sectors) block size 32768, fragment size 4096
using 33 cylinder groups of 626.09MB, 20035 blks, 80256 inodes.
with soft updates super-block backups (for fsck_ffs -b #) at: 192, 1282432, 2564672, 3846912,
5129152, 6411392, 7693632, 8975872, 10258112, 11540352, 12822592, 14104832, 15387072, 16669312,
17951552, 19233792, 20516032, 21798272, 23080512, 24362752, 25644992, 26927232, 28209472, 29491712,
30773952, 32056192, 33338432, 34620672, 35902912, 37185152, 38467392, 39749632, 41031872

root@hsrv:/mnt # newfs -U /dev/gpt/var
/dev/gpt/var: 2048.0MB (4194304 sectors) block size 32768, fragment size 4096
using 4 cylinder groups of 512.03MB, 16385 blks, 65664 inodes.
with soft updates super-block backups (for fsck_ffs -b #) at: 192, 1048832, 2097472, 3146112
root@hsrv:/mnt # newfs -U /dev/gpt/log
/dev/gpt/log: 9494.6MB (19444904 sectors) block size 32768, fragment size 4096
using 16 cylinder groups of 626.09MB, 20035 blks, 80256 inodes.
with soft updates super-block backups (for fsck_ffs -b #) at: 192, 1282432, 2564672, 3846912,
5129152, 6411392, 7693632, 8975872, 10258112, 11540352, 12822592, 14104832, 15387072, 16669312,
17951552, 19233792
root@hsrv:/mnt # newfs -U /dev/gpt/tmp
/dev/gpt/tmp: 2048.0MB (4194304 sectors) block size 32768, fragment size 4096
using 4 cylinder groups of 512.03MB, 16385 blks, 65664 inodes.
with soft updates super-block backups (for fsck_ffs -b #) at: 192, 1048832, 2097472, 3146112

Теперь нужно примонтировать наши разделы

root@hsrv:~ # cd /mnt
root@hsrv:/mnt # mkdir root usr var log
root@hsrv:/mnt # mount /dev/gpt/root /mnt/root/
root@hsrv:/mnt # mount /dev/gpt/usr /mnt/usr/
root@hsrv:/mnt # mount /dev/gpt/var /mnt/var/
root@hsrv:/mnt # mount /dev/gpt/log /mnt/log/

Дальше с помощью утилиты pax копируем с диска донора иерархию директорий с каждого раздела на его аналог в зеркале

root@hsrv:/mnt # cd / && pax -p eme -X -rw . /mnt/root/
root@hsrv:/ # cd /var && pax -p eme -X -rw . /mnt/var/
pax: /mnt/var/./run/devd.pipe skipped. Sockets cannot be copied or extracted
pax: /mnt/var/./run/log skipped. Sockets cannot be copied or extracted
pax: /mnt/var/./run/logpriv skipped. Sockets cannot be copied or extracted
root@hsrv:/var # cd /var/log && pax -p eme -X -rw . /mnt/log/
root@hsrv:/var/log # cd /usr && pax -p eme -X -rw . /mnt/usr/

Теперь нам нужно отредактировать /etc/fstab

Последнее изменение:
Опубликовано: